|
- #include "StdAfx.h"
- #include "AndroidUserManager.h"
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //常量定义
- #define ANDROID_LOGON_COUNT 32 //登录数目
- #define ADNDROID_PLAY_DRAW 10 //游戏局数
- #define ANDROID_UNLOAD_TIME 30*60 //不加载时间
- #define ANDROID_UNIN_TIME 10*60 //不进入时间
-
- //时间标识
- #define IDI_ANDROID_IN (IDI_REBOT_MODULE_START+0) //进入时间
- #define IDI_ANDROID_OUT (IDI_REBOT_MODULE_START+MAX_BATCH) //退出时间
- #define IDI_ANDROID_PULSE (IDI_REBOT_MODULE_START+2*MAX_BATCH)//脉冲时间
-
- //机器时间
- #define TIME_ANDROID_INOUT 15L //登录时间
- #define TIME_ANDROID_PULSE 1L //脉冲时间
- #define TIME_LOAD_ANDROID_INFO 900L //加载用户
- #define TIME_ANDROID_REPOSE_TIME 1800L //服务时间
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CAndroidUserManager::CAndroidUserManager()
- {
- //系统参数
- m_pGameParameter = NULL;
- m_pGameServiceAttrib = NULL;
- m_pGameServiceOption = NULL;
-
- //组件接口
- m_pITimerEngine = NULL;
- m_pIServerUserManager = NULL;
- m_pIGameServiceManager = NULL;
- m_pITCPNetworkEngineEvent = NULL;
-
- //配置变量
- m_dwMinSitInterval = 0;
- m_dwMaxSitInterval = 0;
- m_bServiceContinue = false;
- m_wAutoAndroidCount = ANDROID_LOGON_COUNT;
-
- //库存变量
- m_wStockCount = 0;
- ZeroMemory(&m_AndroidItemConfig, sizeof(m_AndroidItemConfig));
-
- //设置索引
- m_AndroidUserItemMap.InitHashTable(PRIME_ANDROID_USER);
- m_AndroidUserItemMap.RemoveAll();
-
- return;
- }
-
- //析构函数
- CAndroidUserManager::~CAndroidUserManager()
- {
- //清理断言
- ASSERT(m_AndroidUserItemMap.GetCount() == 0L);
- ASSERT(m_AndroidParameterArray.GetCount() == 0L);
- ASSERT(m_AndroidUserItemArray.GetCount() == 0L);
- ASSERT(m_AndroidUserItemBuffer.GetCount() == 0L);
-
- return;
- }
-
- //接口查询
- VOID * CAndroidUserManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
- {
- QUERYINTERFACE(IAndroidUserManager, Guid, dwQueryVer);
- QUERYINTERFACE_IUNKNOWNEX(IAndroidUserManager, Guid, dwQueryVer);
- return NULL;
- }
-
- //启动服务
- bool CAndroidUserManager::StartService()
- {
- //启动时间
- m_pITimerEngine->SetTimer(IDI_ANDROID_PULSE, TIME_ANDROID_PULSE * 1000L, TIMES_INFINITY, 0);
-
- return true;
- }
-
- //停止服务
- bool CAndroidUserManager::ConcludeService()
- {
- //删除存储
- for (INT_PTR i = 0; i < m_AndroidUserItemArray.GetCount(); i++)
- {
- SafeRelease(m_AndroidUserItemArray[i]);
- }
-
- //删除存储
- for (INT_PTR i = 0; i < m_AndroidParameterArray.GetCount(); i++)
- {
- SafeDelete(m_AndroidParameterArray[i]);
- }
-
- //清理数组
- m_AndroidUserItemMap.RemoveAll();
- m_AndroidParameterArray.RemoveAll();
- m_AndroidUserItemArray.RemoveAll();
- m_AndroidUserItemBuffer.RemoveAll();
-
- //库存用户
- m_wStockCount = 0;
- ZeroMemory(&m_AndroidItemConfig, sizeof(m_AndroidItemConfig));
-
- return true;
- }
-
- //配置组件
- bool CAndroidUserManager::InitAndroidUser(tagAndroidUserParameter & AndroidUserParameter)
- {
- //服务配置
- m_bServiceContinue = AndroidUserParameter.bServiceContinue;
- m_dwMinSitInterval = AndroidUserParameter.dwMinSitInterval;
- m_dwMaxSitInterval = AndroidUserParameter.dwMaxSitInterval;
-
- //设置变量
- m_pGameParameter = AndroidUserParameter.pGameParameter;
- m_pGameServiceAttrib = AndroidUserParameter.pGameServiceAttrib;
- m_pGameServiceOption = AndroidUserParameter.pGameServiceOption;
-
- //组件接口
- m_pITimerEngine = AndroidUserParameter.pITimerEngine;
- m_pIServerUserManager = AndroidUserParameter.pIServerUserManager;
- m_pIGameServiceManager = AndroidUserParameter.pIGameServiceManager;
- m_pITCPNetworkEngineEvent = AndroidUserParameter.pITCPNetworkEngineEvent;
-
- return true;
- }
-
- //移除参数
- bool CAndroidUserManager::RemoveAndroidParameter(DWORD dwBatchID)
- {
- //获取参数
- tagAndroidParameterEx * pAndroidParameter = GetAndroidParameter(dwBatchID);
- if (pAndroidParameter == NULL) return false;
-
- //获取时间
- SYSTEMTIME SystemTime;
- GetLocalTime(&SystemTime);
- DWORD dwTodayTickCount = GetTodayTickCount(SystemTime);
-
- //调整参数
- pAndroidParameter->bIsValided = false;
- pAndroidParameter->AndroidParameter.dwLeaveTime = dwTodayTickCount;
-
- //获取索引
- WORD wParameterIndex = GetAndroidParameterIndex(pAndroidParameter);
- if (wParameterIndex == INVALID_WORD) return true;
-
- //关闭定时器
- m_pITimerEngine->KillTimer(IDI_ANDROID_IN + wParameterIndex);
-
- //删掉库存
- for (int i = m_wStockCount - 1; i >= 0; i--)
- {
- //批次判断
- if (m_AndroidItemConfig[i].pAndroidParameter != &pAndroidParameter->AndroidParameter) continue;
-
- //删除存存
- m_wStockCount--;
- m_AndroidItemConfig[i] = m_AndroidItemConfig[m_wStockCount];
- }
-
- //加载判断
- if (pAndroidParameter->bIsLoadAndroid == false)
- {
- //释放资源
- SafeDelete(pAndroidParameter);
- m_AndroidParameterArray[wParameterIndex] = NULL;
-
- return true;
- }
-
- //开启定时器
- m_pITimerEngine->SetTimer(IDI_ANDROID_OUT + wParameterIndex, TIME_ANDROID_INOUT * 1000L, TIMES_INFINITY, (WPARAM)pAndroidParameter);
-
- return true;
- }
-
- //设置参数
- bool CAndroidUserManager::AddAndroidParameter(tagAndroidParameter AndroidParameter[], WORD wParameterCount)
- {
- //变量定义
- tagAndroidParameterEx * pAndroidParameter = NULL;
-
- for (WORD wIndex = 0; wIndex < wParameterCount; wIndex++)
- {
- //数目限制
- if (m_AndroidParameterArray.GetCount() >= MAX_BATCH) break;
-
- //设置资源
- pAndroidParameter = GetAndroidParameter(AndroidParameter[wIndex].dwBatchID);
- if (pAndroidParameter == NULL)
- {
- //申请资源
- pAndroidParameter = new tagAndroidParameterEx();
- if (pAndroidParameter == NULL) return false;
-
- //设置变量
- pAndroidParameter->bIsValided = true;
- pAndroidParameter->bIsLoadAndroid = false;
-
- //变量定义
- bool bVacancyExist = false;
-
- //查找空缺
- for (INT_PTR nIndex = 0; nIndex < m_AndroidParameterArray.GetCount(); nIndex++)
- {
- if (m_AndroidParameterArray[nIndex] == NULL)
- {
- bVacancyExist = true;
- m_AndroidParameterArray[nIndex] = pAndroidParameter;
- break;
- }
- }
-
- //不存在空缺
- if (bVacancyExist == false)
- {
- m_AndroidParameterArray.Add(pAndroidParameter);
- }
- }
-
- //拷贝数据
- CopyMemory(pAndroidParameter, &AndroidParameter[wIndex], sizeof(tagAndroidParameter));
- }
-
- return true;
- }
-
- //插入机器
- bool CAndroidUserManager::InsertAndroidInfo(tagAndroidAccountsInfo AndroidAccountsInfo[], WORD wAndroidCount, DWORD dwBatchID)
- {
- //获取参数
- tagAndroidParameterEx * pAndroidParameter = GetAndroidParameter(dwBatchID);
- if (pAndroidParameter == NULL) return false;
-
- //记录库存
- CAndroidUserItem * pAndroidUserItem = NULL;
- WORD wStockCount = m_wStockCount;
- bool bAndroidExist = false;
-
- //添加新机器
- for (WORD wIndex = 0; wIndex < wAndroidCount; wIndex++)
- {
- //设置变量
- bAndroidExist = false;
-
- //从库存中查找
- for (WORD wItem = 0; wItem < wStockCount; wItem++)
- {
- if (m_AndroidItemConfig[wIndex].AndroidAccountsInfo.dwUserID == AndroidAccountsInfo[wIndex].dwUserID)
- {
- bAndroidExist = true;
- break;
- }
- }
-
- //存在判断
- if (bAndroidExist == true) continue;
-
- //从映射中查找
- if (m_AndroidUserItemMap.Lookup(AndroidAccountsInfo[wIndex].dwUserID, pAndroidUserItem) == TRUE)
- {
- continue;
- }
-
- //添加机器
- m_AndroidItemConfig[m_wStockCount].AndroidAccountsInfo = AndroidAccountsInfo[wIndex];
- m_AndroidItemConfig[m_wStockCount].pAndroidParameter = &pAndroidParameter->AndroidParameter;
-
- //增加库存
- m_wStockCount++;
- }
-
- //获取索引
- WORD wParameterIndex = GetAndroidParameterIndex(pAndroidParameter);
- if (wParameterIndex == INVALID_WORD) return true;
-
- //开启定时器
- m_pITimerEngine->KillTimer(IDI_ANDROID_IN + wParameterIndex);
- m_pITimerEngine->SetTimer(IDI_ANDROID_IN + wParameterIndex, TIME_ANDROID_INOUT * 1000L, TIMES_INFINITY, (WPARAM)pAndroidParameter);
-
- return true;
- }
-
- //删除机器
- bool CAndroidUserManager::DeleteAndroidUserItem(DWORD dwAndroidID, bool bStockRetrieve)
- {
- //获取对象
- WORD wIndex = LOWORD(dwAndroidID);
- CAndroidUserItem * pAndroidUserItem = GetAndroidUserItem(wIndex);
-
- //对象效验
- //ASSERT((pAndroidUserItem!=NULL)&&(pAndroidUserItem->m_wRoundID==HIWORD(dwAndroidID)));
- if ((pAndroidUserItem == NULL) || (pAndroidUserItem->m_wRoundID != HIWORD(dwAndroidID))) return false;
-
- //关闭事件
- try
- {
- m_pITCPNetworkEngineEvent->OnEventTCPNetworkShut(dwAndroidID, 0, 0L);
- }
- catch (...)
- {
- //错误断言
- ASSERT(FALSE);
- }
-
- //机器配置
- tagAndroidItemConfig AndroidItemConfig = pAndroidUserItem->m_AndroidItemConfig;
-
- //删除对象
- FreeAndroidUserItem(pAndroidUserItem->GetUserID());
-
- //库存回收
- if (bStockRetrieve == true)
- {
- InsertAndroidInfo(&AndroidItemConfig.AndroidAccountsInfo, 1, AndroidItemConfig.pAndroidParameter->dwBatchID);
- }
-
- return true;
- }
-
- //查找机器
- IAndroidUserItem * CAndroidUserManager::SearchAndroidUserItem(DWORD dwUserID, DWORD dwContextID)
- {
- //查找机器
- CAndroidUserItem * pAndroidUserItem = NULL;
- m_AndroidUserItemMap.Lookup(dwUserID, pAndroidUserItem);
-
- //机器判断
- if (pAndroidUserItem != NULL)
- {
- WORD wRoundID = pAndroidUserItem->m_wRoundID;
- WORD wAndroidIndex = pAndroidUserItem->m_wAndroidIndex;
- if (MAKELONG(wAndroidIndex, wRoundID) == dwContextID) return pAndroidUserItem;
- }
-
- return NULL;
- }
-
- //创建机器
- IAndroidUserItem * CAndroidUserManager::CreateAndroidUserItem(tagAndroidItemConfig & AndroidItemConfig)
- {
- //效验参数
- ASSERT(AndroidItemConfig.AndroidAccountsInfo.dwUserID != 0L);
- if (AndroidItemConfig.AndroidAccountsInfo.dwUserID == 0L) return NULL;
-
- //创建对象
- CAndroidUserItem * pAndroidUserItem = ActiveAndroidUserItem(AndroidItemConfig);
- if (pAndroidUserItem == NULL) return NULL;
-
- //属性变量
- WORD wRoundID = pAndroidUserItem->m_wRoundID;
- WORD wAndroidIndex = pAndroidUserItem->m_wAndroidIndex;
-
- //连接模拟
- try
- {
- if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkBind(MAKELONG(wAndroidIndex, wRoundID), 0L) == false)
- {
- throw 0;
- }
- }
- catch (...)
- {
- //错误断言
- ASSERT(FALSE);
-
- //释放用户
- FreeAndroidUserItem(AndroidItemConfig.AndroidAccountsInfo.dwUserID);
-
- return NULL;
- }
-
- //变量定义
- CMD_GR_LogonUserID LogonUserID;
- ZeroMemory(&LogonUserID, sizeof(LogonUserID));
-
- //版本信息
- LogonUserID.dwPlazaVersion = VERSION_PLAZA;
- LogonUserID.dwFrameVersion = VERSION_FRAME;
- LogonUserID.dwProcessVersion = m_pGameServiceAttrib->dwClientVersion;
-
- //用户信息
- LogonUserID.dwUserID = AndroidItemConfig.AndroidAccountsInfo.dwUserID;
- lstrcpyn(LogonUserID.szPassword, AndroidItemConfig.AndroidAccountsInfo.szPassword, CountArray(LogonUserID.szPassword));
- LogonUserID.wKindID = m_pGameServiceOption->wKindID;
-
- //构造数据
- TCP_Command Command;
- Command.wMainCmdID = MDM_GR_LOGON;
- Command.wSubCmdID = SUB_GR_LOGON_USERID;
-
- //消息处理
- try
- {
- //发送数据
- if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkRead(MAKELONG(wAndroidIndex, wRoundID), Command, &LogonUserID, sizeof(LogonUserID)) == false)
- {
- throw 0;
- }
- }
- catch (...)
- {
- //错误断言
- ASSERT(FALSE);
-
- //删除机器
- DeleteAndroidUserItem(MAKELONG(wAndroidIndex, wRoundID), false);
-
- return NULL;
- }
-
- return pAndroidUserItem;
- }
-
- //脉冲事件
- bool CAndroidUserManager::OnEventTimerPulse(DWORD dwTimerID, WPARAM dwBindParameter)
- {
- //进入处理
- if (dwTimerID >= IDI_ANDROID_IN && dwTimerID < IDI_ANDROID_IN + MAX_BATCH)
- {
- //获取时间
- SYSTEMTIME SystemTime;
- GetLocalTime(&SystemTime);
- DWORD dwTodayTickCount = GetTodayTickCount(SystemTime);
-
- //获取参数
- tagAndroidParameter * pAndroidParameter = (tagAndroidParameter *)dwBindParameter;
- if (pAndroidParameter == NULL)
- {
- //关闭定时器
- m_pITimerEngine->KillTimer(dwTimerID);
-
- return true;
- }
-
- //变量定义
- bool bAllowAndroidAttend = CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule);
- bool bAllowAndroidSimulate = CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule);
-
- //成功标识
- bool bLogonSuccessed = false;
-
- //登录处理
- if ((bAllowAndroidAttend == true) || (bAllowAndroidSimulate == true))
- {
- //寻找机器
- for (WORD i = 0; i < m_wStockCount; i++)
- {
- //批次判断
- if (m_AndroidItemConfig[i].pAndroidParameter != pAndroidParameter) continue;
-
- //模拟判断
- if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)
- && (pAndroidParameter->dwServiceMode&ANDROID_SIMULATE) != 0
- && (pAndroidParameter->dwServiceMode&ANDROID_PASSIVITY) == 0
- && (pAndroidParameter->dwServiceMode&ANDROID_INITIATIVE) == 0)
- {
- continue;
- }
-
- //创建机器
- if (CreateAndroidUserItem(m_AndroidItemConfig[i]) != NULL)
- {
- //删除存存
- m_wStockCount--;
- bLogonSuccessed = true;
- m_AndroidItemConfig[i] = m_AndroidItemConfig[m_wStockCount];
-
- break;
- }
- }
- }
-
- //关闭定时器
- m_pITimerEngine->KillTimer(dwTimerID);
-
- //定时器处理
- if (bLogonSuccessed == true)
- {
- //计算流逝时间
- DWORD dwElapse = pAndroidParameter->dwEnterMinInterval + rand() % (pAndroidParameter->dwEnterMaxInterval - pAndroidParameter->dwEnterMinInterval + 1);
- if (dwElapse == 0) dwElapse = TIME_ANDROID_INOUT;
-
- //设置定时器
- m_pITimerEngine->SetTimer(dwTimerID, dwElapse * 1000L, TIMES_INFINITY, dwBindParameter);
- }
- else
- {
- //剩余时间
- DWORD dwRemaindTime = BatchServiceRemaindTime(pAndroidParameter, dwTodayTickCount);
- if (dwRemaindTime <= ANDROID_UNIN_TIME)
- {
- //设置定时器
- m_pITimerEngine->SetTimer(IDI_ANDROID_OUT + (dwTimerID - IDI_ANDROID_IN), TIME_ANDROID_INOUT * 1000L, TIMES_INFINITY, dwBindParameter);
-
- CString str;
- str.Format(TEXT("本批次机器人开始退出, 批次ID=%d"), pAndroidParameter->dwBatchID);
- CTraceService::TraceString(str, TraceLevel_Info);
- }
- else
- {
- //设置定时器
- m_pITimerEngine->SetTimer(dwTimerID, TIME_ANDROID_INOUT * 1000L, TIMES_INFINITY, dwBindParameter);
- }
- }
-
- return true;
- }
-
- //退出处理
- if (dwTimerID >= IDI_ANDROID_OUT && dwTimerID < IDI_ANDROID_OUT + MAX_BATCH)
- {
- //变量定义
- DWORD dwUserID = 0L;
- INT_PTR nActiveCount = m_AndroidUserItemMap.GetCount();
- POSITION Position = m_AndroidUserItemMap.GetStartPosition();
-
- //获取时间
- SYSTEMTIME SystemTime;
- GetLocalTime(&SystemTime);
- DWORD dwTodayTickCount = GetTodayTickCount(SystemTime);
-
- //获取参数
- tagAndroidParameterEx * pAndroidParameter = (tagAndroidParameterEx *)dwBindParameter;
- if (pAndroidParameter == NULL)
- {
- //关闭定时器
- m_pITimerEngine->KillTimer(dwTimerID);
-
- return true;
- }
-
- //时间判断
- if (BatchServiceRemaindTime(&pAndroidParameter->AndroidParameter, dwTodayTickCount) > 0)
- {
- return true;
- }
-
- //变量定义
- bool bLogoutSuccessed = false;
-
- //退出处理
- while (Position != NULL)
- {
- //获取对象
- CAndroidUserItem * pAndroidUserItem = NULL;
- m_AndroidUserItemMap.GetNextAssoc(Position, dwUserID, pAndroidUserItem);
-
- //退出判断
- if (pAndroidUserItem->m_pIServerUserItem != NULL &&
- pAndroidUserItem->GetAndroidParameter() == &pAndroidParameter->AndroidParameter)
- {
- //变量定义
- IServerUserItem * pIServerUserItem = pAndroidUserItem->m_pIServerUserItem;
-
- //服务状态
- BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
- if ((cbUserStatus != US_FREE) && (cbUserStatus != US_SIT))
- {
- if (bLogoutSuccessed == false)
- {
- bLogoutSuccessed = true;
- pAndroidUserItem->m_wAndroidAction |= ANDROID_WAITLEAVE;
- }
- continue;
- }
-
- //删除用户
- WORD wRoundID = pAndroidUserItem->m_wRoundID;
- WORD wAndroidIndex = pAndroidUserItem->m_wAndroidIndex;
- DeleteAndroidUserItem(MAKELONG(wAndroidIndex, wRoundID), false);
-
- //设置变量
- bLogoutSuccessed = true;
-
- break;
- }
- }
-
- //关闭定时器
- m_pITimerEngine->KillTimer(dwTimerID);
-
- //定时器处理
- if (bLogoutSuccessed == true)
- {
- //计算流逝时间
- DWORD dwElapse = pAndroidParameter->AndroidParameter.dwLeaveMinInterval + rand() % (pAndroidParameter->AndroidParameter.dwLeaveMaxInterval - pAndroidParameter->AndroidParameter.dwLeaveMinInterval + 1);
- if (dwElapse == 0) dwElapse = TIME_ANDROID_INOUT;
-
- //设置定时器
- m_pITimerEngine->SetTimer(dwTimerID, dwElapse * 1000L, TIMES_INFINITY, dwBindParameter);
- }
- else
- {
- if (pAndroidParameter->bIsValided == false)
- {
- //计算索引
- WORD wParameterIndex = (WORD)(dwTimerID - IDI_ANDROID_OUT);
- if (wParameterIndex == GetAndroidParameterIndex(pAndroidParameter))
- {
- //释放资源
- SafeDelete(m_AndroidParameterArray[wParameterIndex]);
- m_AndroidParameterArray[wParameterIndex] = NULL;
-
- CString str;
- str.Format(TEXT("本批次机器人全部退出,该批次将被删除, 批次ID=%d"), pAndroidParameter->AndroidParameter.dwBatchID);
- CTraceService::TraceString(str, TraceLevel_Info);
- }
- }
- else
- {
- //恢复标识
- pAndroidParameter->bIsLoadAndroid = false;
-
- CString str;
- str.Format(TEXT("本批次机器人全部退出, 批次ID=%d"), pAndroidParameter->AndroidParameter.dwBatchID);
- CTraceService::TraceString(str, TraceLevel_Info);
- }
- }
-
- return true;
- }
-
- //用户脉冲
- if (dwTimerID == IDI_ANDROID_PULSE)
- {
- //变量定义
- DWORD dwUserID = 0L;
- CAndroidUserItem * pAndroidUserItem = NULL;
- POSITION Position = m_AndroidUserItemMap.GetStartPosition();
-
- //用户处理
- while (Position != NULL)
- {
- //获取对象
- m_AndroidUserItemMap.GetNextAssoc(Position, dwUserID, pAndroidUserItem);
-
- //时间处理
- try
- {
- //ASSERT(pAndroidUserItem!=NULL);
- if (pAndroidUserItem->m_pIServerUserItem != NULL) pAndroidUserItem->OnTimerPulse(dwTimerID, dwBindParameter);
- }
- catch (...)
- {
- ASSERT(FALSE);
- DeleteAndroidUserItem(MAKELONG(pAndroidUserItem->m_wAndroidIndex, pAndroidUserItem->m_wRoundID), true);
- }
- }
-
- return true;
- }
-
- return false;
- }
-
- //加载机器
- bool CAndroidUserManager::GetAndroidLoadInfo(DWORD & dwBatchID, DWORD & dwLoadCount)
- {
- //数目判断
- if (m_AndroidParameterArray.GetCount() == 0) return false;
-
- //获取时间
- SYSTEMTIME SystemTime;
- GetLocalTime(&SystemTime);
- DWORD dwTodayTickCount = GetTodayTickCount(SystemTime);
-
- //变量定义
- tagAndroidParameterEx * pAndroidParameter = NULL;
- DWORD dwRemaindTime;
-
- //退出处理
- for (INT_PTR nIndex = 0; nIndex < m_AndroidParameterArray.GetCount(); nIndex++)
- {
- //获取对象
- pAndroidParameter = m_AndroidParameterArray[nIndex];
- if (pAndroidParameter == NULL) continue;
-
- //加载判断
- if (pAndroidParameter->bIsLoadAndroid == true) continue;
-
- //剩余时间
- dwRemaindTime = BatchServiceRemaindTime(&pAndroidParameter->AndroidParameter, dwTodayTickCount);
-
- //加载机器
- if (dwRemaindTime > ANDROID_UNLOAD_TIME)
- {
- //设置标识
- pAndroidParameter->bIsLoadAndroid = true;
-
- //设置参数
- dwBatchID = pAndroidParameter->AndroidParameter.dwBatchID;
- dwLoadCount = __min(pAndroidParameter->AndroidParameter.dwAndroidCount, dwRemaindTime / pAndroidParameter->AndroidParameter.dwEnterMaxInterval);
-
- return true;
- }
- }
-
- return false;
- }
-
- //用户状况
- WORD CAndroidUserManager::GetAndroidUserInfo(tagAndroidUserInfo & AndroidUserInfo, DWORD dwServiceMode)
- {
- //获取时间
- SYSTEMTIME SystemTime;
- GetLocalTime(&SystemTime);
- DWORD dwTodayTickCount = GetTodayTickCount(SystemTime);
-
- //设置变量
- ZeroMemory(&AndroidUserInfo, sizeof(AndroidUserInfo));
-
- //变量定义
- DWORD dwTimeMask = (1L << SystemTime.wHour);
- POSITION Position = m_AndroidUserItemMap.GetStartPosition();
-
- //枚举对象
- while (Position != NULL)
- {
- //获取对象
- DWORD dwUserID = 0L;
- CAndroidUserItem * pAndroidUserItem = NULL;
- m_AndroidUserItemMap.GetNextAssoc(Position, dwUserID, pAndroidUserItem);
-
- //效验参数
- ASSERT((dwUserID != 0L) && (pAndroidUserItem != NULL));
- if ((dwUserID == 0L) || (pAndroidUserItem == NULL)) break;
-
- //绑定判断
- if (pAndroidUserItem->m_pIServerUserItem == NULL) continue;
-
- //变量定义
- IServerUserItem * pIServerUserItem = pAndroidUserItem->m_pIServerUserItem;
- tagAndroidParameter * pAndroidParameter = pAndroidUserItem->GetAndroidParameter();
-
- //离开判断
- if (pAndroidUserItem->m_bWaitLeave == true) continue;
-
- //模式判断
- if ((pAndroidParameter->dwServiceMode&dwServiceMode) == 0L) continue;
-
- //离开判断
- if (!m_bServiceContinue && BatchServiceRemaindTime(pAndroidParameter, dwTodayTickCount) == 0) continue;
-
- //休息时间
- DWORD dwCurrTime = (DWORD)time(NULL);
- if ((pAndroidUserItem->m_dwStandupTickCount + pAndroidUserItem->m_dwReposeTickCount) > dwCurrTime) continue;
-
- //状态判断
- switch (pIServerUserItem->GetUserStatus())
- {
- case US_FREE:
- {
- ASSERT(AndroidUserInfo.wFreeUserCount < CountArray(AndroidUserInfo.pIAndroidUserFree));
- AndroidUserInfo.pIAndroidUserFree[AndroidUserInfo.wFreeUserCount++] = pAndroidUserItem;
- break;
- }
- case US_SIT:
- case US_READY:
- {
- ASSERT(AndroidUserInfo.wSitdownUserCount < CountArray(AndroidUserInfo.pIAndroidUserSitdown));
- AndroidUserInfo.pIAndroidUserSitdown[AndroidUserInfo.wSitdownUserCount++] = pAndroidUserItem;
- break;
- }
- case US_PLAYING:
- case US_OFFLINE:
- {
- ASSERT(AndroidUserInfo.wPlayUserCount < CountArray(AndroidUserInfo.pIAndroidUserPlay));
- AndroidUserInfo.pIAndroidUserPlay[AndroidUserInfo.wPlayUserCount++] = pAndroidUserItem;
- break;
- }
- }
- };
-
- return AndroidUserInfo.wFreeUserCount + AndroidUserInfo.wPlayUserCount + AndroidUserInfo.wSitdownUserCount;
- }
-
- //发送数据
- bool CAndroidUserManager::SendDataToClient(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //发送数据
- for (INT_PTR i = 0; i < m_AndroidUserItemArray.GetCount(); i++)
- {
- //获取对象
- CAndroidUserItem * pAndroidUserItem = m_AndroidUserItemArray[i];
-
- //状态判断
- if (pAndroidUserItem->m_pIServerUserItem == NULL) continue;
- if (pAndroidUserItem->m_AndroidItemConfig.AndroidAccountsInfo.dwUserID == 0L) continue;
-
- //消息处理
- try
- {
- if (pAndroidUserItem->OnSocketRead(wMainCmdID, wSubCmdID, pData, wDataSize) == false)
- {
- throw 0;
- }
- }
- catch (...)
- {
- //错误断言
- ASSERT(FALSE);
-
- //断开用户
- WORD wRoundID = pAndroidUserItem->m_wRoundID;
- WORD wAndroidIndex = pAndroidUserItem->m_wAndroidIndex;
- DeleteAndroidUserItem(MAKELONG(wAndroidIndex, wRoundID), true);
- }
- }
-
- return true;
- }
-
- //发送数据
- bool CAndroidUserManager::SendDataToClient(DWORD dwAndroidID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //获取对象
- WORD wIndex = LOWORD(dwAndroidID);
- CAndroidUserItem * pAndroidUserItem = GetAndroidUserItem(wIndex);
-
- //对象效验
- //ASSERT((pAndroidUserItem!=NULL)&&(pAndroidUserItem->m_wRoundID==HIWORD(dwAndroidID)));
- if ((pAndroidUserItem == NULL) || (pAndroidUserItem->m_wRoundID != HIWORD(dwAndroidID))) return false;
-
- //消息处理
- try
- {
- if (pAndroidUserItem->OnSocketRead(wMainCmdID, wSubCmdID, pData, wDataSize) == false)
- {
- ASSERT(FALSE);
- throw 0;
- }
- }
- catch (...)
- {
- ASSERT(FALSE);
- DeleteAndroidUserItem(dwAndroidID, true);
- }
-
- return true;
- }
-
- //发送数据
- bool CAndroidUserManager::SendDataToServer(DWORD dwAndroidID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //构造数据
- TCP_Command Command;
- Command.wSubCmdID = wSubCmdID;
- Command.wMainCmdID = wMainCmdID;
-
- //消息处理
- try
- {
- if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkRead(dwAndroidID, Command, pData, wDataSize) == false)
- {
- throw 0;
- }
- }
- catch (...)
- {
- ASSERT(FALSE);
- DeleteAndroidUserItem(dwAndroidID, true);
- }
-
- return true;
- }
-
- //获取对象
- CAndroidUserItem * CAndroidUserManager::GetAndroidUserItem(WORD wIndex)
- {
- //效验索引
- ASSERT(wIndex >= INDEX_ANDROID);
- if (wIndex < INDEX_ANDROID) return NULL;
-
- //效验索引
- ASSERT((wIndex - INDEX_ANDROID) < m_AndroidUserItemArray.GetCount());
- if (((wIndex - INDEX_ANDROID) >= m_AndroidUserItemArray.GetCount())) return NULL;
-
- //获取对象
- WORD wBufferIndex = wIndex - INDEX_ANDROID;
- CAndroidUserItem * pAndroidUserItem = m_AndroidUserItemArray[wBufferIndex];
-
- return pAndroidUserItem;
- }
-
- //释放对象
- VOID CAndroidUserManager::FreeAndroidUserItem(DWORD dwUserID)
- {
- //效验参数
- ASSERT(dwUserID != 0);
- if (dwUserID == 0) return;
-
- //变量定义
- CAndroidUserItem * pAndroidUserItem = NULL;
- m_AndroidUserItemMap.Lookup(dwUserID, pAndroidUserItem);
-
- //对象判断
- if (pAndroidUserItem == NULL)
- {
- ASSERT(FALSE);
- return;
- }
-
- //复位对象
- pAndroidUserItem->RepositUserItem();
-
- //设置索引
- m_AndroidUserItemMap.RemoveKey(dwUserID);
- m_AndroidUserItemBuffer.Add(pAndroidUserItem);
-
- return;
- }
-
- //获取参数
- tagAndroidParameterEx * CAndroidUserManager::GetAndroidParameter(DWORD dwBatchID)
- {
- //查找数组
- for (INT_PTR nIndex = 0; nIndex < m_AndroidParameterArray.GetCount(); nIndex++)
- {
- if (m_AndroidParameterArray[nIndex] == NULL) continue;
- if (m_AndroidParameterArray[nIndex]->AndroidParameter.dwBatchID == dwBatchID)
- {
- return m_AndroidParameterArray[nIndex];
- }
- }
-
- return NULL;
- }
-
- //获取索引
- WORD CAndroidUserManager::GetAndroidParameterIndex(tagAndroidParameterEx * pAndroidParameter)
- {
- //参数校验
- if (pAndroidParameter == NULL) return INVALID_WORD;
-
- //查找数组
- for (INT_PTR nIndex = 0; nIndex < m_AndroidParameterArray.GetCount(); nIndex++)
- {
- if (m_AndroidParameterArray[nIndex] == pAndroidParameter)
- {
- return (WORD)nIndex;
- }
- }
-
- return INVALID_WORD;
- }
-
- //转换时间
- DWORD CAndroidUserManager::GetTodayTickCount(SYSTEMTIME & SystemTime)
- {
- return SystemTime.wHour * 3600 + SystemTime.wMinute * 60 + SystemTime.wSecond;
- }
-
- //剩余时间
- DWORD CAndroidUserManager::BatchServiceRemaindTime(tagAndroidParameter * pAndroidParameter, DWORD dwTodayTickCount)
- {
- //参数校验
- ASSERT(pAndroidParameter != NULL);
- if (pAndroidParameter == NULL) return 0;
-
- //变量定义
- DWORD dwEnterTime, dwLeaveTime;
- DWORD dwRemaindTime = 0;
-
- //设置变量
- dwEnterTime = pAndroidParameter->dwEnterTime;
- dwLeaveTime = pAndroidParameter->dwLeaveTime;
-
- //计算时间
- if (dwLeaveTime > dwEnterTime)
- {
- if (dwTodayTickCount >= dwEnterTime && dwTodayTickCount < dwLeaveTime)
- {
- dwRemaindTime = dwLeaveTime - dwTodayTickCount;
- }
- }
- else if (dwLeaveTime < dwEnterTime)
- {
- //第一天
- if (dwTodayTickCount >= dwEnterTime)
- {
- dwRemaindTime = dwLeaveTime + 24 * 3600 - dwTodayTickCount;
- }
-
- //第二天
- if (dwTodayTickCount < dwLeaveTime)
- {
- dwRemaindTime = dwLeaveTime - dwTodayTickCount;
- }
- }
-
- return dwRemaindTime;
- }
-
- //等待时间
- DWORD CAndroidUserManager::BatchServiceAwaitTime(tagAndroidParameter * pAndroidParameter, DWORD dwTodayTickCount)
- {
- //参数校验
- ASSERT(pAndroidParameter != NULL);
- if (pAndroidParameter == NULL) return 0;
- if (((tagAndroidParameterEx *)pAndroidParameter)->bIsLoadAndroid == false) return -1;
-
- //变量定义
- DWORD dwEnterTime, dwLeaveTime;
-
- //设置变量
- dwEnterTime = pAndroidParameter->dwEnterTime;
- dwLeaveTime = pAndroidParameter->dwLeaveTime;
-
- //计算时间
- if (dwEnterTime < dwLeaveTime)
- {
- if (dwTodayTickCount < dwEnterTime)
- {
- return dwEnterTime - dwTodayTickCount;
- }
- }
- else
- {
- if (dwTodayTickCount<dwEnterTime && dwTodayTickCount>dwLeaveTime)
- {
- return dwEnterTime - dwTodayTickCount;
- }
- }
-
- return 0;
- }
-
- //激活对象
- CAndroidUserItem * CAndroidUserManager::ActiveAndroidUserItem(tagAndroidItemConfig & AndroidItemConfig)
- {
- //变量定义
- CAndroidUserItem * pAndroidUserItem = NULL;
- INT_PTR nFreeItemCount = m_AndroidUserItemBuffer.GetCount();
-
- //获取对象
- if (nFreeItemCount > 0)
- {
- //获取对象
- INT_PTR nItemPostion = nFreeItemCount - 1;
- pAndroidUserItem = m_AndroidUserItemBuffer[nItemPostion];
-
- //删除数组
- m_AndroidUserItemBuffer.RemoveAt(nItemPostion);
- }
-
- //创建对象
- if (pAndroidUserItem == NULL)
- {
- //数目判断
- if (m_AndroidUserItemArray.GetCount() >= MAX_ANDROID)
- {
- ASSERT(FALSE);
- return NULL;
- }
-
- try
- {
- //变量定义
- IAndroidUserItemSink * pIAndroidUserItemSink = NULL;
-
- //创建陪玩
- if (CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule) == true)
- {
- pIAndroidUserItemSink = (IAndroidUserItemSink *)m_pIGameServiceManager->CreateAndroidUserItemSink(IID_IAndroidUserItemSink, VER_IAndroidUserItemSink);
- }
-
- //创建对象
- try
- {
- pAndroidUserItem = new CAndroidUserItem;
- }
- catch (...)
- {
- //错误断言
- ASSERT(FALSE);
-
- //删除对象
- SafeRelease(pIAndroidUserItemSink);
- }
-
- //错误判断
- if (pAndroidUserItem == NULL)
- {
- //错误断言
- ASSERT(FALSE);
-
- //删除对象
- SafeRelease(pIAndroidUserItemSink);
-
- return NULL;
- }
-
- //设置用户
- if ((pIAndroidUserItemSink != NULL) && (pIAndroidUserItemSink->Initialization(pAndroidUserItem) == false))
- {
- //错误断言
- ASSERT(FALSE);
-
- //删除对象
- SafeRelease(pAndroidUserItem);
- SafeRelease(pIAndroidUserItemSink);
-
- return NULL;
- }
-
- //设置数组
- WORD wCurrentIndex = (WORD)m_AndroidUserItemArray.Add(pAndroidUserItem);
-
- //配置变量
- pAndroidUserItem->m_dwMinSitInterval = m_dwMinSitInterval;
- pAndroidUserItem->m_dwMaxSitInterval = m_dwMaxSitInterval;
-
- //设置接口
- pAndroidUserItem->m_wAndroidIndex = wCurrentIndex + INDEX_ANDROID;
- pAndroidUserItem->m_pIServerUserManager = m_pIServerUserManager;
- pAndroidUserItem->m_pIAndroidUserItemSink = pIAndroidUserItemSink;
- pAndroidUserItem->m_pIAndroidUserManager = QUERY_ME_INTERFACE(IAndroidUserManager);
- }
- catch (...)
- {
- ASSERT(FALSE);
- return NULL;
- }
- }
-
- //游戏局数
- if ((AndroidItemConfig.pAndroidParameter->dwSwitchMinInnings != 0L) && (AndroidItemConfig.pAndroidParameter->dwSwitchMaxInnings != 0L))
- {
- //变量定义
- DWORD dwSwitchMinInnings = AndroidItemConfig.pAndroidParameter->dwSwitchMinInnings;
- DWORD dwSwitchMaxInnings = AndroidItemConfig.pAndroidParameter->dwSwitchMaxInnings;
-
- //调整局数
- if ((dwSwitchMaxInnings - dwSwitchMinInnings) > 0L)
- pAndroidUserItem->m_AndroidService.dwSwitchTableInnings = dwSwitchMinInnings + rand() % (dwSwitchMaxInnings - dwSwitchMinInnings);
- else
- pAndroidUserItem->m_AndroidService.dwSwitchTableInnings = dwSwitchMinInnings;
- }
- else
- pAndroidUserItem->m_AndroidService.dwSwitchTableInnings = 0;
-
- //服务类型
- if (pAndroidUserItem->m_pIAndroidUserItemSink == NULL && (AndroidItemConfig.pAndroidParameter->dwServiceMode&ANDROID_SIMULATE) != 0)
- AndroidItemConfig.pAndroidParameter->dwServiceMode = ANDROID_SIMULATE;
-
- //设置变量
- pAndroidUserItem->m_AndroidItemConfig = AndroidItemConfig;
-
- //设置索引
- m_AndroidUserItemMap[AndroidItemConfig.AndroidAccountsInfo.dwUserID] = pAndroidUserItem;
-
- return pAndroidUserItem;
- }
-
- //强制起立
- VOID CAndroidUserManager::ForceAndroidUserItemStandup(CAndroidUserItem * pAndroidUserItem)
- {
- //校验参数
- ASSERT(pAndroidUserItem != NULL);
- if (pAndroidUserItem == NULL) return;
-
- //属性变量
- WORD wRoundID = pAndroidUserItem->m_wRoundID;
- WORD wAndroidIndex = pAndroidUserItem->m_wAndroidIndex;
-
- //构造结构
- CMD_GR_UserStandUp UserStandUp;
- UserStandUp.cbForceLeave = true;
- UserStandUp.wTableID = pAndroidUserItem->m_pIServerUserItem->GetTableID();
- UserStandUp.wChairID = pAndroidUserItem->m_pIServerUserItem->GetChairID();
-
- //发送数据
- SendDataToServer(MAKELONG(wAndroidIndex, wRoundID), MDM_GR_USER, SUB_GR_USER_STANDUP, &UserStandUp, sizeof(UserStandUp));
-
- return;
- }
-
-
- //////////////////////////////////////////////////////////////////////////////////
|