Files
wnmj/Servers/服务器组件/游戏服务/AndroidUserManager.cpp

1278 lines
32 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "AndroidUserManager.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANDROID_LOGON_COUNT 32 //<2F><>¼<EFBFBD><C2BC>Ŀ
#define ADNDROID_PLAY_DRAW 10 //<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
#define ANDROID_UNLOAD_TIME 30*60 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define ANDROID_UNIN_TIME 10*60 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//ʱ<><CAB1><EFBFBD><EFBFBD>ʶ
#define IDI_ANDROID_IN (IDI_REBOT_MODULE_START+0) //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define IDI_ANDROID_OUT (IDI_REBOT_MODULE_START+MAX_BATCH) //<2F>˳<EFBFBD>ʱ<EFBFBD><CAB1>
#define IDI_ANDROID_PULSE (IDI_REBOT_MODULE_START+2*MAX_BATCH)//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define TIME_ANDROID_INOUT 15L //<2F><>¼ʱ<C2BC><CAB1>
#define TIME_ANDROID_PULSE 1L //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define TIME_LOAD_ANDROID_INFO 900L //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
#define TIME_ANDROID_REPOSE_TIME 1800L //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CAndroidUserManager::CAndroidUserManager()
{
//ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
m_pGameParameter=NULL;
m_pGameServiceAttrib=NULL;
m_pGameServiceOption=NULL;
m_pGameMatchOption=NULL;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
m_pITimerEngine=NULL;
m_pIServerUserManager=NULL;
m_pIGameServiceManager=NULL;
m_pIGameServiceSustomTime=NULL;
m_pITCPNetworkEngineEvent=NULL;
m_pIMainServiceFrame=NULL;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwMinSitInterval=0;
m_dwMaxSitInterval=0;
m_bServiceContinue=false;
m_wAutoAndroidCount=ANDROID_LOGON_COUNT;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wStockCount=0;
ZeroMemory(&m_AndroidItemConfig,sizeof(m_AndroidItemConfig));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AndroidUserItemMap.InitHashTable(PRIME_ANDROID_USER);
m_AndroidUserItemMap.RemoveAll();
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserManager::~CAndroidUserManager()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_AndroidUserItemMap.GetCount()==0L);
ASSERT(m_AndroidParameterArray.GetCount()==0L);
ASSERT(m_AndroidUserItemArray.GetCount()==0L);
ASSERT(m_AndroidUserItemBuffer.GetCount()==0L);
return;
}
//<2F>ӿڲ<D3BF>ѯ
VOID * CAndroidUserManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IAndroidUserManager,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IAndroidUserManager,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::StartService()
{
//ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwTimeCell=TIME_CELL;
DWORD dwElapse=TIME_ANDROID_PULSE*1000L;
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (m_pIGameServiceSustomTime!=NULL)
{
dwTimeCell=m_pIGameServiceSustomTime->GetTimerEngineTimeCell();
if (dwTimeCell>TIME_CELL) dwTimeCell=TIME_CELL;
dwElapse=m_pIGameServiceSustomTime->GetAndroidTimerPulse();
if (dwElapse<dwTimeCell) dwElapse=dwTimeCell;
}
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(IDI_ANDROID_PULSE,dwElapse,TIMES_INFINITY,0);
return true;
}
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
bool CAndroidUserManager::ConcludeService()
{
//ɾ<><C9BE><EFBFBD>
for (INT_PTR i=0;i<m_AndroidUserItemArray.GetCount();i++)
{
SafeRelease(m_AndroidUserItemArray[i]);
}
//ɾ<><C9BE><EFBFBD>
for (INT_PTR i=0;i<m_AndroidParameterArray.GetCount();i++)
{
SafeDelete(m_AndroidParameterArray[i]);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AndroidUserItemMap.RemoveAll();
m_AndroidParameterArray.RemoveAll();
m_AndroidUserItemArray.RemoveAll();
m_AndroidUserItemBuffer.RemoveAll();
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
m_wStockCount=0;
ZeroMemory(&m_AndroidItemConfig,sizeof(m_AndroidItemConfig));
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::InitAndroidUser(tagAndroidUserParameter & AndroidUserParameter)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bServiceContinue=AndroidUserParameter.bServiceContinue;
m_dwMinSitInterval=AndroidUserParameter.dwMinSitInterval;
m_dwMaxSitInterval=AndroidUserParameter.dwMaxSitInterval;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_pGameParameter=AndroidUserParameter.pGameParameter;
m_pGameServiceAttrib=AndroidUserParameter.pGameServiceAttrib;
m_pGameServiceOption=AndroidUserParameter.pGameServiceOption;
m_pGameMatchOption=AndroidUserParameter.pGameMatchOption;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
m_pITimerEngine=AndroidUserParameter.pITimerEngine;
m_pIServerUserManager=AndroidUserParameter.pIServerUserManager;
m_pIGameServiceManager=AndroidUserParameter.pIGameServiceManager;
m_pIGameServiceSustomTime=AndroidUserParameter.pIGameServiceSustomTime;
m_pITCPNetworkEngineEvent=AndroidUserParameter.pITCPNetworkEngineEvent;
return true;
}
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::RemoveAndroidParameter(DWORD dwBatchID)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
tagAndroidParameterEx * pAndroidParameter = GetAndroidParameter(dwBatchID);
if(pAndroidParameter==NULL) return false;
//<2F><>ȡʱ<C8A1><CAB1>
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
DWORD dwTodayTickCount= GetTodayTickCount(SystemTime);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pAndroidParameter->bIsValided=false;
pAndroidParameter->AndroidParameter.dwLeaveTime=dwTodayTickCount;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wParameterIndex=GetAndroidParameterIndex(pAndroidParameter);
if(wParameterIndex==INVALID_WORD) return true;
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(IDI_ANDROID_IN+wParameterIndex);
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i=m_wStockCount-1;i>=0;i--)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(m_AndroidItemConfig[i].pAndroidParameter!=&pAndroidParameter->AndroidParameter) continue;
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wStockCount--;
m_AndroidItemConfig[i]=m_AndroidItemConfig[m_wStockCount];
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(pAndroidParameter->bIsLoadAndroid==false)
{
//<2F>ͷ<EFBFBD><CDB7><EFBFBD>Դ
SafeDelete(pAndroidParameter);
m_AndroidParameterArray[wParameterIndex]=NULL;
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(IDI_ANDROID_OUT+wParameterIndex,TIME_ANDROID_INOUT*1000L,TIMES_INFINITY,(WPARAM)pAndroidParameter);
return true;
}
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
bool CAndroidUserManager::AddAndroidParameter(tagAndroidParameter AndroidParameter[], WORD wParameterCount)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagAndroidParameterEx * pAndroidParameter=NULL;
for(WORD wIndex=0;wIndex<wParameterCount;wIndex++)
{
//<2F><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
if(m_AndroidParameterArray.GetCount()>=MAX_BATCH) break;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
pAndroidParameter = GetAndroidParameter(AndroidParameter[wIndex].dwBatchID);
if(pAndroidParameter==NULL)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
pAndroidParameter = new tagAndroidParameterEx();
if(pAndroidParameter==NULL) return false;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
pAndroidParameter->bIsValided=true;
pAndroidParameter->bIsLoadAndroid=false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bVacancyExist=false;
//<2F><><EFBFBD>ҿ<EFBFBD>ȱ
for(INT_PTR nIndex=0;nIndex<m_AndroidParameterArray.GetCount();nIndex++)
{
if(m_AndroidParameterArray[nIndex]==NULL)
{
bVacancyExist=true;
m_AndroidParameterArray[nIndex]=pAndroidParameter;
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD>ȱ
if(bVacancyExist==false)
{
m_AndroidParameterArray.Add(pAndroidParameter);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CopyMemory(pAndroidParameter,&AndroidParameter[wIndex],sizeof(tagAndroidParameter));
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::InsertAndroidInfo(tagAndroidAccountsInfo AndroidAccountsInfo[],WORD wAndroidCount,DWORD dwBatchID)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
tagAndroidParameterEx * pAndroidParameter = GetAndroidParameter(dwBatchID);
if(pAndroidParameter==NULL) return false;
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=NULL;
WORD wStockCount=m_wStockCount;
bool bAndroidExist=false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB><EFBFBD>
for(WORD wIndex=0;wIndex<wAndroidCount;wIndex++)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
bAndroidExist=false;
//<2F>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
for(WORD wItem=0;wItem<wStockCount;wItem++)
{
if(m_AndroidItemConfig[wItem].AndroidAccountsInfo.dwUserID==AndroidAccountsInfo[wIndex].dwUserID)
{
bAndroidExist=true;
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(bAndroidExist==true) continue;
//<2F><>ӳ<EFBFBD><D3B3><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
if(m_AndroidUserItemMap.Lookup(AndroidAccountsInfo[wIndex].dwUserID,pAndroidUserItem)==TRUE)
{
continue;
}
//<2F><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>
m_AndroidItemConfig[m_wStockCount].AndroidAccountsInfo=AndroidAccountsInfo[wIndex];
m_AndroidItemConfig[m_wStockCount].pAndroidParameter=&pAndroidParameter->AndroidParameter;
//<2F><><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>
m_wStockCount++;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wParameterIndex=GetAndroidParameterIndex(pAndroidParameter);
if(wParameterIndex==INVALID_WORD) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(IDI_ANDROID_IN+wParameterIndex);
m_pITimerEngine->SetTimer(IDI_ANDROID_IN+wParameterIndex,TIME_ANDROID_INOUT*1000L,TIMES_INFINITY,(WPARAM)pAndroidParameter);
return true;
}
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::DeleteAndroidUserItem(DWORD dwAndroidID,bool bStockRetrieve)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wIndex=LOWORD(dwAndroidID);
CAndroidUserItem * pAndroidUserItem=GetAndroidUserItem(wIndex);
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
//ASSERT((pAndroidUserItem!=NULL)&&(pAndroidUserItem->m_wRoundID==HIWORD(dwAndroidID)));
if ((pAndroidUserItem==NULL)||(pAndroidUserItem->m_wRoundID!=HIWORD(dwAndroidID))) return false;
//<2F>ر<EFBFBD><D8B1>¼<EFBFBD>
try
{
m_pITCPNetworkEngineEvent->OnEventTCPNetworkShut(dwAndroidID,0,0L);
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagAndroidItemConfig AndroidItemConfig = pAndroidUserItem->m_AndroidItemConfig;
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FreeAndroidUserItem(pAndroidUserItem->GetUserID());
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//if(bStockRetrieve==true)
//{
// InsertAndroidInfo(&AndroidItemConfig.AndroidAccountsInfo,1,AndroidItemConfig.pAndroidParameter->dwBatchID);
//}
return true;
}
//<2F><><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>
IAndroidUserItem * CAndroidUserManager::SearchAndroidUserItem(DWORD dwUserID, DWORD dwContextID)
{
//<2F><><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>
CAndroidUserItem * pAndroidUserItem=NULL;
m_AndroidUserItemMap.Lookup(dwUserID,pAndroidUserItem);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (pAndroidUserItem!=NULL)
{
WORD wRoundID=pAndroidUserItem->m_wRoundID;
WORD wAndroidIndex=pAndroidUserItem->m_wAndroidIndex;
if (MAKELONG(wAndroidIndex,wRoundID)==dwContextID) return pAndroidUserItem;
}
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IAndroidUserItem * CAndroidUserManager::CreateAndroidUserItem(tagAndroidItemConfig & AndroidItemConfig)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(AndroidItemConfig.AndroidAccountsInfo.dwUserID!=0L);
if (AndroidItemConfig.AndroidAccountsInfo.dwUserID==0L) return NULL;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=ActiveAndroidUserItem(AndroidItemConfig);
if (pAndroidUserItem==NULL) return NULL;
//<2F><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>
WORD wRoundID=pAndroidUserItem->m_wRoundID;
WORD wAndroidIndex=pAndroidUserItem->m_wAndroidIndex;
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
try
{
if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkBind(MAKELONG(wAndroidIndex,wRoundID),0L)==false)
{
throw 0;
}
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F>ͷ<EFBFBD><CDB7>û<EFBFBD>
FreeAndroidUserItem(AndroidItemConfig.AndroidAccountsInfo.dwUserID);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_LogonUserID LogonUserID;
ZeroMemory(&LogonUserID,sizeof(LogonUserID));
//<2F><EFBFBD><E6B1BE>Ϣ
LogonUserID.dwPlazaVersion=VERSION_PLAZA;
LogonUserID.dwFrameVersion=VERSION_FRAME;
LogonUserID.dwProcessVersion=m_pGameServiceAttrib->dwClientVersion;
//<2F>û<EFBFBD><C3BB><EFBFBD>Ϣ
LogonUserID.dwUserID=AndroidItemConfig.AndroidAccountsInfo.dwUserID;
lstrcpyn(LogonUserID.szPassword,AndroidItemConfig.AndroidAccountsInfo.szPassword,CountArray(LogonUserID.szPassword));
LogonUserID.wKindID=m_pGameServiceOption->wKindID;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TCP_Command Command;
Command.wMainCmdID=MDM_GR_LOGON;
Command.wSubCmdID=SUB_GR_LOGON_USERID;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkRead(MAKELONG(wAndroidIndex,wRoundID),Command,&LogonUserID,sizeof(LogonUserID))==false)
{
throw 0;
}
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DeleteAndroidUserItem(MAKELONG(wAndroidIndex,wRoundID),false);
return NULL;
}
return pAndroidUserItem;
}
//<2F><><EFBFBD>ýӿ<C3BD>
VOID CAndroidUserManager::SetMainServiceFrame(IMainServiceFrame *pIMainServiceFrame)
{
m_pIMainServiceFrame=pIMainServiceFrame;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool CAndroidUserManager::OnEventTimerPulse(DWORD dwTimerID, WPARAM dwBindParameter)
{
//<2F><><EFBFBD><EFBFBD><EBB4A6>
if(dwTimerID>=IDI_ANDROID_IN && dwTimerID<IDI_ANDROID_IN+MAX_BATCH)
{
//<2F><>ȡʱ<C8A1><CAB1>
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
DWORD dwTodayTickCount= GetTodayTickCount(SystemTime);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
tagAndroidParameter * pAndroidParameter=(tagAndroidParameter *)dwBindParameter;
if(pAndroidParameter==NULL)
{
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(dwTimerID);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bAllowAndroidAttend=CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule);
bool bAllowAndroidSimulate=CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule);
//<2F>ɹ<EFBFBD><C9B9><EFBFBD>ʶ
bool bLogonSuccessed=false;
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
if ((bAllowAndroidAttend==true)||(bAllowAndroidSimulate==true))
{
//Ѱ<>һ<EFBFBD><D2BB><EFBFBD>
for (WORD i=0;i<m_wStockCount;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(m_AndroidItemConfig[i].pAndroidParameter!=pAndroidParameter) continue;
//ģ<><C4A3><EFBFBD>ж<EFBFBD>
if((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)
&& (pAndroidParameter->dwServiceMode&ANDROID_SIMULATE)!=0
&& (pAndroidParameter->dwServiceMode&ANDROID_PASSIVITY)==0
&& (pAndroidParameter->dwServiceMode&ANDROID_INITIATIVE)==0)
{
continue;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (CreateAndroidUserItem(m_AndroidItemConfig[i])!=NULL)
{
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wStockCount--;
bLogonSuccessed=true;
m_AndroidItemConfig[i]=m_AndroidItemConfig[m_wStockCount];
break;
}
}
}
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(dwTimerID);
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(bLogonSuccessed==true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD dwElapse = pAndroidParameter->dwEnterMinInterval+rand()%(pAndroidParameter->dwEnterMaxInterval-pAndroidParameter->dwEnterMinInterval+1);
if(dwElapse==0) dwElapse=TIME_ANDROID_INOUT;
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(dwTimerID,dwElapse*1000L,TIMES_INFINITY,dwBindParameter);
}
else
{
//ʣ<><CAA3>ʱ<EFBFBD><CAB1>
DWORD dwRemaindTime = BatchServiceRemaindTime(pAndroidParameter,dwTodayTickCount);
if(dwRemaindTime<=ANDROID_UNIN_TIME)
{
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(IDI_ANDROID_OUT+(dwTimerID-IDI_ANDROID_IN),TIME_ANDROID_INOUT*1000L,TIMES_INFINITY,dwBindParameter);
CString str;
str.Format(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>ʼ<EFBFBD>˳<EFBFBD>, <20><><EFBFBD><EFBFBD>ID=%d"),pAndroidParameter->dwBatchID);
CTraceService::TraceString(str,TraceLevel_Info);
}
else
{
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(dwTimerID,TIME_ANDROID_INOUT*1000L,TIMES_INFINITY,dwBindParameter);
}
}
return true;
}
//<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
if(dwTimerID>=IDI_ANDROID_OUT && dwTimerID<IDI_ANDROID_OUT+MAX_BATCH)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwUserID=0L;
INT_PTR nActiveCount=m_AndroidUserItemMap.GetCount();
POSITION Position=m_AndroidUserItemMap.GetStartPosition();
//<2F><>ȡʱ<C8A1><CAB1>
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
DWORD dwTodayTickCount= GetTodayTickCount(SystemTime);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
tagAndroidParameterEx * pAndroidParameter=(tagAndroidParameterEx *)dwBindParameter;
if(pAndroidParameter==NULL)
{
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(dwTimerID);
return true;
}
//ʱ<><CAB1><EFBFBD>ж<EFBFBD>
if (BatchServiceRemaindTime(&pAndroidParameter->AndroidParameter,dwTodayTickCount)>0)
{
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bLogoutMarked=false;
bool bLogoutFinished=true;
//<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
while (Position!=NULL)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=NULL;
m_AndroidUserItemMap.GetNextAssoc(Position,dwUserID,pAndroidUserItem);
//<2F>˳<EFBFBD><CBB3>ж<EFBFBD>
if (pAndroidUserItem->GetAndroidParameter()==&pAndroidParameter->AndroidParameter)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
bLogoutFinished=false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IServerUserItem * pIServerUserItem=pAndroidUserItem->m_pIServerUserItem;
if(pIServerUserItem!=NULL)
{
//<2F><><EFBFBD><EFBFBD>״̬
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
BYTE cbSignUpStatus=pIServerUserItem->GetUserMatchStatus();
if ((cbUserStatus!=US_FREE)&&(cbUserStatus!=US_SIT))
{
if (m_pGameServiceOption->wServerType==GAME_GENRE_MATCH && m_pGameMatchOption->cbMatchType==MATCH_TYPE_IMMEDIATE)
{
//<2F><>ֹ<EFBFBD><D6B9>;<EFBFBD><CDBE><EFBFBD><EFBFBD>ʱUserStatus<75><73>ΪUS_FREE<45><45><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʹ<CAB1><CAB9>SignUpStatus<75>жϿɷ<CFBF><C9B7><EFBFBD><EFBFBD>߳<EFBFBD>
if(cbSignUpStatus!=MUS_NULL && pAndroidUserItem->m_bWaitLeave==false)
{
pAndroidUserItem->m_bWaitLeave=true;
}
}
else
{
//<2F><><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD>
if(bLogoutMarked==false && pAndroidUserItem->m_wAndroidAction==0)
{
bLogoutMarked=true;
pAndroidUserItem->m_wAndroidAction|=ANDROID_WAITLEAVE;
}
}
continue;
}
else
{
if (m_pGameServiceOption->wServerType==GAME_GENRE_MATCH && m_pGameMatchOption->cbMatchType==MATCH_TYPE_IMMEDIATE)
{
WORD wTableID = pIServerUserItem->GetTableID();
if((cbSignUpStatus!=MUS_NULL || pAndroidUserItem->m_bWaitLeave==false) && wTableID != INVALID_TABLE)
{
pAndroidUserItem->m_bWaitLeave=true;
continue;
}
}
}
}
//ɾ<><C9BE><EFBFBD>û<EFBFBD>
WORD wRoundID=pAndroidUserItem->m_wRoundID;
WORD wAndroidIndex=pAndroidUserItem->m_wAndroidIndex;
DeleteAndroidUserItem(MAKELONG(wAndroidIndex,wRoundID),false);
//<2F><><EFBFBD>ñ<EFBFBD>ʶ
if(pIServerUserItem!=NULL) break;
}
}
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
m_pITimerEngine->KillTimer(dwTimerID);
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(bLogoutFinished==false)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD dwElapse = pAndroidParameter->AndroidParameter.dwLeaveMinInterval+rand()%(pAndroidParameter->AndroidParameter.dwLeaveMaxInterval-pAndroidParameter->AndroidParameter.dwLeaveMinInterval+1);
if(dwElapse==0) dwElapse=TIME_ANDROID_INOUT;
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
m_pITimerEngine->SetTimer(dwTimerID,dwElapse*1000L,TIMES_INFINITY,dwBindParameter);
}
else
{
if(pAndroidParameter->bIsValided==false)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wParameterIndex=(WORD)(dwTimerID-IDI_ANDROID_OUT);
if(wParameterIndex==GetAndroidParameterIndex(pAndroidParameter))
{
//<2F>ͷ<EFBFBD><CDB7><EFBFBD>Դ
SafeDelete(m_AndroidParameterArray[wParameterIndex]);
m_AndroidParameterArray[wParameterIndex]=NULL;
CString str;
str.Format(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>ɾ<EFBFBD><C9BE>, <20><><EFBFBD><EFBFBD>ID=%d"),pAndroidParameter->AndroidParameter.dwBatchID);
CTraceService::TraceString(str,TraceLevel_Info);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pIMainServiceFrame!=NULL)
{
m_pIMainServiceFrame->UnLockAndroidUser(m_pGameServiceOption->wServerID,pAndroidParameter->AndroidParameter.dwBatchID);
}
}
}
else
{
//<2F>ָ<EFBFBD><D6B8><EFBFBD>ʶ
pAndroidParameter->bIsLoadAndroid=false;
CString str;
str.Format(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>, <20><><EFBFBD><EFBFBD>ID=%d"),pAndroidParameter->AndroidParameter.dwBatchID);
CTraceService::TraceString(str,TraceLevel_Info);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pIMainServiceFrame!=NULL)
{
m_pIMainServiceFrame->UnLockAndroidUser(m_pGameServiceOption->wServerID,pAndroidParameter->AndroidParameter.dwBatchID);
}
}
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
if(dwTimerID==IDI_ANDROID_PULSE)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwUserID=0L;
CAndroidUserItem * pAndroidUserItem=NULL;
POSITION Position=m_AndroidUserItemMap.GetStartPosition();
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
while (Position!=NULL)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
m_AndroidUserItemMap.GetNextAssoc(Position,dwUserID,pAndroidUserItem);
//ʱ<><EFBFBD><E4B4A6>
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;
}
//<2F><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>
bool CAndroidUserManager::GetAndroidLoadInfo(DWORD & dwBatchID,DWORD & dwLoadCount)
{
//<2F><>Ŀ<EFBFBD>ж<EFBFBD>
if(m_AndroidParameterArray.GetCount()==0) return false;
//<2F><>ȡʱ<C8A1><CAB1>
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
DWORD dwTodayTickCount= GetTodayTickCount(SystemTime);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagAndroidParameterEx * pAndroidParameter=NULL;
DWORD dwRemaindTime;
//<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
for(INT_PTR nIndex=0;nIndex<m_AndroidParameterArray.GetCount();nIndex++)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
pAndroidParameter = m_AndroidParameterArray[nIndex];
if(pAndroidParameter==NULL) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(pAndroidParameter->bIsLoadAndroid==true) continue;
//ʣ<><CAA3>ʱ<EFBFBD><CAB1>
dwRemaindTime=BatchServiceRemaindTime(&pAndroidParameter->AndroidParameter,dwTodayTickCount);
//<2F><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>
if(dwRemaindTime>ANDROID_UNLOAD_TIME)
{
//<2F><><EFBFBD>ñ<EFBFBD>ʶ
pAndroidParameter->bIsLoadAndroid=true;
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
dwBatchID = pAndroidParameter->AndroidParameter.dwBatchID;
dwLoadCount = __min(pAndroidParameter->AndroidParameter.dwAndroidCount,dwRemaindTime/pAndroidParameter->AndroidParameter.dwEnterMaxInterval);
if (dwLoadCount==0) continue;
return true;
}
}
return false;
}
//<2F>û<EFBFBD>״<EFBFBD><D7B4>
WORD CAndroidUserManager::GetAndroidUserInfo(tagAndroidUserInfo & AndroidUserInfo, DWORD dwServiceMode)
{
//<2F><>ȡʱ<C8A1><CAB1>
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
DWORD dwTodayTickCount= GetTodayTickCount(SystemTime);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ZeroMemory(&AndroidUserInfo,sizeof(AndroidUserInfo));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwTimeMask=(1L<<SystemTime.wHour);
POSITION Position=m_AndroidUserItemMap.GetStartPosition();
//ö<>ٶ<EFBFBD><D9B6><EFBFBD>
while (Position!=NULL)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
DWORD dwUserID=0L;
CAndroidUserItem * pAndroidUserItem=NULL;
m_AndroidUserItemMap.GetNextAssoc(Position,dwUserID,pAndroidUserItem);
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT((dwUserID!=0L)&&(pAndroidUserItem!=NULL));
if ((dwUserID==0L)||(pAndroidUserItem==NULL)) break;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(pAndroidUserItem->m_pIServerUserItem==NULL) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IServerUserItem * pIServerUserItem=pAndroidUserItem->m_pIServerUserItem;
tagAndroidParameter * pAndroidParameter=pAndroidUserItem->GetAndroidParameter();
//<2F><EFBFBD>ж<EFBFBD>
if (pAndroidUserItem->m_bWaitLeave==true) continue;
//ģʽ<C4A3>ж<EFBFBD>
if ((pAndroidParameter->dwServiceMode&dwServiceMode)==0L) continue;
//<2F><EFBFBD>ж<EFBFBD>
if (!m_bServiceContinue && BatchServiceRemaindTime(pAndroidParameter,dwTodayTickCount)==0) continue;
//<2F><>Ϣʱ<CFA2><CAB1>
DWORD dwCurrTime=(DWORD)time(NULL);
if((pAndroidUserItem->m_dwStandupTickCount+pAndroidUserItem->m_dwReposeTickCount)>dwCurrTime) continue;
//״̬<D7B4>ж<EFBFBD>
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;
}
case US_WAITDISTRIBUTE:
{
ASSERT(AndroidUserInfo.wWaitUserCount < CountArray(AndroidUserInfo.pIAndroidUserWait));
AndroidUserInfo.pIAndroidUserWait[AndroidUserInfo.wWaitUserCount++] = pAndroidUserItem;
break;
}
}
};
return AndroidUserInfo.wFreeUserCount + AndroidUserInfo.wPlayUserCount + AndroidUserInfo.wSitdownUserCount + AndroidUserInfo.wWaitUserCount;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::SendDataToClient(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (INT_PTR i=0;i<m_AndroidUserItemArray.GetCount();i++)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=m_AndroidUserItemArray[i];
//״̬<D7B4>ж<EFBFBD>
if (pAndroidUserItem->m_pIServerUserItem==NULL) continue;
if (pAndroidUserItem->m_AndroidItemConfig.AndroidAccountsInfo.dwUserID==0L) continue;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
try
{
if (pAndroidUserItem->OnSocketRead(wMainCmdID,wSubCmdID,pData,wDataSize)==false)
{
throw 0;
}
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F>Ͽ<EFBFBD><CFBF>û<EFBFBD>
WORD wRoundID=pAndroidUserItem->m_wRoundID;
WORD wAndroidIndex=pAndroidUserItem->m_wAndroidIndex;
DeleteAndroidUserItem(MAKELONG(wAndroidIndex,wRoundID),true);
}
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::SendDataToClient(DWORD dwAndroidID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wIndex=LOWORD(dwAndroidID);
CAndroidUserItem * pAndroidUserItem=GetAndroidUserItem(wIndex);
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
//ASSERT((pAndroidUserItem!=NULL)&&(pAndroidUserItem->m_wRoundID==HIWORD(dwAndroidID)));
if ((pAndroidUserItem==NULL)||(pAndroidUserItem->m_wRoundID!=HIWORD(dwAndroidID))) return false;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
try
{
if (pAndroidUserItem->OnSocketRead(wMainCmdID,wSubCmdID,pData,wDataSize)==false)
{
ASSERT(FALSE);
throw 0;
}
}
catch (...)
{
ASSERT(FALSE);
DeleteAndroidUserItem(dwAndroidID,true);
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserManager::SendDataToServer(DWORD dwAndroidID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TCP_Command Command;
Command.wSubCmdID=wSubCmdID;
Command.wMainCmdID=wMainCmdID;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
try
{
if (m_pITCPNetworkEngineEvent->OnEventTCPNetworkRead(dwAndroidID,Command,pData,wDataSize)==false)
{
throw 0;
}
}
catch (...)
{
CString str;
str.Format(TEXT("SendDataToServer: MainID=%d,SubID=%d"),Command.wMainCmdID,Command.wSubCmdID);
CTraceService::TraceString(str,TraceLevel_Exception);
ASSERT(FALSE);
DeleteAndroidUserItem(dwAndroidID,true);
}
return true;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CAndroidUserItem * CAndroidUserManager::GetAndroidUserItem(WORD wIndex)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wIndex>=INDEX_ANDROID);
if (wIndex<INDEX_ANDROID) return NULL;
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT((wIndex-INDEX_ANDROID)<m_AndroidUserItemArray.GetCount());
if (((wIndex-INDEX_ANDROID)>=m_AndroidUserItemArray.GetCount())) return NULL;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wBufferIndex=wIndex-INDEX_ANDROID;
CAndroidUserItem * pAndroidUserItem=m_AndroidUserItemArray[wBufferIndex];
return pAndroidUserItem;
}
//<2F>ͷŶ<CDB7><C5B6><EFBFBD>
VOID CAndroidUserManager::FreeAndroidUserItem(DWORD dwUserID)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(dwUserID!=0);
if (dwUserID==0) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=NULL;
m_AndroidUserItemMap.Lookup(dwUserID,pAndroidUserItem);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (pAndroidUserItem==NULL)
{
ASSERT(FALSE);
return;
}
//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
pAndroidUserItem->RepositUserItem();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AndroidUserItemMap.RemoveKey(dwUserID);
m_AndroidUserItemBuffer.Add(pAndroidUserItem);
return;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
tagAndroidParameterEx * CAndroidUserManager::GetAndroidParameter(DWORD dwBatchID)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD CAndroidUserManager::GetAndroidParameterIndex(tagAndroidParameterEx * pAndroidParameter)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
if(pAndroidParameter==NULL) return INVALID_WORD;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(INT_PTR nIndex=0;nIndex<m_AndroidParameterArray.GetCount();nIndex++)
{
if(m_AndroidParameterArray[nIndex]==pAndroidParameter)
{
return (WORD)nIndex;
}
}
return INVALID_WORD;
}
//ת<><D7AA>ʱ<EFBFBD><CAB1>
DWORD CAndroidUserManager::GetTodayTickCount(SYSTEMTIME & SystemTime)
{
return SystemTime.wHour*3600+SystemTime.wMinute*60+SystemTime.wSecond;
}
//ʣ<><CAA3>ʱ<EFBFBD><CAB1>
DWORD CAndroidUserManager::BatchServiceRemaindTime(tagAndroidParameter * pAndroidParameter,DWORD dwTodayTickCount)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
ASSERT(pAndroidParameter!=NULL);
if(pAndroidParameter==NULL) return 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwEnterTime,dwLeaveTime;
DWORD dwRemaindTime=0;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
dwEnterTime=pAndroidParameter->dwEnterTime;
dwLeaveTime=pAndroidParameter->dwLeaveTime;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>뿪ʱ<EBBFAA><CAB1><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB>
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>뿪ʱ<EBBFAA><EFBFBD><E4B6BC>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD> 00:00:00 ~ 23:59:59 (0~86399)
if(dwLeaveTime>dwEnterTime)
{
if(dwTodayTickCount>=dwEnterTime && dwTodayTickCount<=dwLeaveTime)
{
dwRemaindTime=dwLeaveTime-dwTodayTickCount;
}
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>뿪ʱ<EBBFAA><EFBFBD><E4B2BB>ͬһ<CDAC><D2BB>
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB>12:00:01 ~ 23:59:59 (43201~86399)
// <20>뿪ʱ<EBBFAA><CAB1><EFBFBD>ڵڶ<DAB5><DAB6><EFBFBD> 00:00:00 ~ 12:00:00 (0~43200)
else if(dwLeaveTime<dwEnterTime)
{
//<2F><>һ<EFBFBD><D2BB>
if(dwTodayTickCount>=dwEnterTime)
{
dwRemaindTime = dwLeaveTime+24*3600-dwTodayTickCount;
}
//<2F>ڶ<EFBFBD><DAB6><EFBFBD>
if(dwTodayTickCount< dwLeaveTime)
{
dwRemaindTime = dwLeaveTime-dwTodayTickCount;
}
}
return dwRemaindTime;
}
//<2F>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
DWORD CAndroidUserManager::BatchServiceAwaitTime(tagAndroidParameter * pAndroidParameter,DWORD dwTodayTickCount)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
ASSERT(pAndroidParameter!=NULL);
if(pAndroidParameter==NULL) return 0;
if(((tagAndroidParameterEx *)pAndroidParameter)->bIsLoadAndroid==false) return -1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwEnterTime,dwLeaveTime;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
dwEnterTime=pAndroidParameter->dwEnterTime;
dwLeaveTime=pAndroidParameter->dwLeaveTime;
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if(dwEnterTime<dwLeaveTime)
{
if(dwTodayTickCount<dwEnterTime)
{
return dwEnterTime-dwTodayTickCount;
}
}
else
{
if(dwTodayTickCount<dwEnterTime && dwTodayTickCount>dwLeaveTime)
{
return dwEnterTime-dwTodayTickCount;
}
}
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserItem * CAndroidUserManager::ActiveAndroidUserItem(tagAndroidItemConfig & AndroidItemConfig)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserItem * pAndroidUserItem=NULL;
INT_PTR nFreeItemCount=m_AndroidUserItemBuffer.GetCount();
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if (nFreeItemCount>0)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
INT_PTR nItemPostion=nFreeItemCount-1;
pAndroidUserItem=m_AndroidUserItemBuffer[nItemPostion];
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AndroidUserItemBuffer.RemoveAt(nItemPostion);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pAndroidUserItem==NULL)
{
//<2F><>Ŀ<EFBFBD>ж<EFBFBD>
if (m_AndroidUserItemArray.GetCount()>=MAX_ANDROID)
{
ASSERT(FALSE);
return NULL;
}
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IAndroidUserItemSink * pIAndroidUserItemSink=NULL;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule)==true)
{
pIAndroidUserItemSink=(IAndroidUserItemSink *)m_pIGameServiceManager->CreateAndroidUserItemSink(IID_IAndroidUserItemSink,VER_IAndroidUserItemSink);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
try
{
pAndroidUserItem=new CAndroidUserItem;
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F><>ʾ<EFBFBD><CABE>Ϣ;
CTraceService::TraceString(TEXT("release pIAndroidUserItemSink 1."), TraceLevel_Warning);
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeRelease(pIAndroidUserItemSink);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (pAndroidUserItem==NULL)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F><>ʾ<EFBFBD><CABE>Ϣ;
CTraceService::TraceString(TEXT("release pIAndroidUserItemSink 2."), TraceLevel_Warning);
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeRelease(pIAndroidUserItemSink);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
if ((pIAndroidUserItemSink!=NULL)&&(pIAndroidUserItemSink->Initialization(pAndroidUserItem)==false))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F><>ʾ<EFBFBD><CABE>Ϣ;
CTraceService::TraceString(TEXT("release pIAndroidUserItemSink 3."), TraceLevel_Warning);
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeRelease(pAndroidUserItem);
SafeRelease(pIAndroidUserItemSink);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wCurrentIndex=(WORD)m_AndroidUserItemArray.Add(pAndroidUserItem);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
pAndroidUserItem->m_dwMinSitInterval=m_dwMinSitInterval;
pAndroidUserItem->m_dwMaxSitInterval=m_dwMaxSitInterval;
//<2F><><EFBFBD>ýӿ<C3BD>
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;
}
}
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
if((AndroidItemConfig.pAndroidParameter->dwSwitchMinInnings!=0L)&&(AndroidItemConfig.pAndroidParameter->dwSwitchMaxInnings!=0L))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwSwitchMinInnings=AndroidItemConfig.pAndroidParameter->dwSwitchMinInnings;
DWORD dwSwitchMaxInnings=AndroidItemConfig.pAndroidParameter->dwSwitchMaxInnings;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((dwSwitchMaxInnings-dwSwitchMinInnings)>0L)
pAndroidUserItem->m_AndroidService.dwSwitchTableInnings=dwSwitchMinInnings+rand()%(dwSwitchMaxInnings-dwSwitchMinInnings);
else
pAndroidUserItem->m_AndroidService.dwSwitchTableInnings=dwSwitchMinInnings;
}
else
pAndroidUserItem->m_AndroidService.dwSwitchTableInnings=0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pAndroidUserItem->m_pIAndroidUserItemSink==NULL && (AndroidItemConfig.pAndroidParameter->dwServiceMode&ANDROID_SIMULATE)!=0)
AndroidItemConfig.pAndroidParameter->dwServiceMode=ANDROID_SIMULATE;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
pAndroidUserItem->m_AndroidItemConfig=AndroidItemConfig;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AndroidUserItemMap[AndroidItemConfig.AndroidAccountsInfo.dwUserID]=pAndroidUserItem;
return pAndroidUserItem;
}
//ǿ<><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID CAndroidUserManager::ForceAndroidUserItemStandup(CAndroidUserItem * pAndroidUserItem)
{
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pAndroidUserItem!=NULL);
if(pAndroidUserItem==NULL) return;
//<2F><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>
WORD wRoundID=pAndroidUserItem->m_wRoundID;
WORD wAndroidIndex=pAndroidUserItem->m_wAndroidIndex;
//<2F><><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_UserStandUp UserStandUp;
UserStandUp.cbForceLeave=true;
UserStandUp.wTableID=pAndroidUserItem->m_pIServerUserItem->GetTableID();
UserStandUp.wChairID=pAndroidUserItem->m_pIServerUserItem->GetChairID();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendDataToServer(MAKELONG(wAndroidIndex,wRoundID),MDM_GR_USER,SUB_GR_USER_STANDUP,&UserStandUp,sizeof(UserStandUp));
return;
}
//////////////////////////////////////////////////////////////////////////////////