1278 lines
32 KiB
C++
1278 lines
32 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|