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

724 lines
16 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "AndroidUserItem.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
CTimerItemArray CAndroidUserItem::m_TimerItemBuffer; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CAndroidUserItem::CAndroidUserItem()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wRoundID=1;
m_wAndroidIndex=INVALID_WORD;
//<2F>ӿڱ<D3BF><DAB1><EFBFBD>
m_pIServerUserManager=NULL;
m_pIAndroidUserManager=NULL;
m_pIAndroidUserItemSink=NULL;
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
m_bWaitLeave=false;
m_bStartClient=false;
m_wAndroidAction=0;
m_dwPlayInnings=0;
m_cbGameStatus=GAME_STATUS_FREE;
//<2F>û<EFBFBD>״̬
m_CurrentUserStatus.cbUserStatus=US_NULL;
m_CurrentUserStatus.wChairID=INVALID_CHAIR;
m_CurrentUserStatus.wTableID=INVALID_TABLE;
//<2F>󶨱<EFBFBD><F3B6A8B1><EFBFBD>
m_pIServerUserItem=NULL;
//ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwMinSitInterval=0;
m_dwMaxSitInterval=0;
m_dwStandupTickCount=0;
m_dwReposeTickCount=0;
//״̬<D7B4><CCAC>Ϣ
ZeroMemory(&m_AndroidService,sizeof(m_AndroidService));
ZeroMemory(&m_AndroidItemConfig,sizeof(m_AndroidItemConfig));
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAndroidUserItem::~CAndroidUserItem()
{
//ɾ<><C9BE>ʱ<EFBFBD><CAB1>
KillGameTimer(0);
//<2F>ͷŶ<CDB7><C5B6><EFBFBD>
SafeRelease(m_pIAndroidUserItemSink);
return;
}
//<2F>ӿڲ<D3BF>ѯ
VOID * CAndroidUserItem::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IAndroidUserItem,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IAndroidUserItem,Guid,dwQueryVer);
return NULL;
}
//<2F><>ȡ I D
DWORD CAndroidUserItem::GetUserID()
{
return m_AndroidItemConfig.AndroidAccountsInfo.dwUserID;
}
//<2F><><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>
WORD CAndroidUserItem::GetTableID()
{
//Ч<><D0A7>״̬
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return INVALID_TABLE;
return m_pIServerUserItem->GetTableID();
}
//<2F><><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>
WORD CAndroidUserItem::GetChairID()
{
//Ч<><D0A7>״̬
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return INVALID_CHAIR;
return m_pIServerUserItem->GetChairID();
}
//<2F><>ȡ<EFBFBD>Լ<EFBFBD>
IServerUserItem * CAndroidUserItem::GetMeUserItem()
{
return m_pIServerUserItem;
}
//<2F><>Ϸ<EFBFBD>û<EFBFBD>
IServerUserItem * CAndroidUserItem::GetTableUserItem(WORD wChariID)
{
return NULL;
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool CAndroidUserItem::SendSocketData(WORD wSubCmdID)
{
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GF_GAME,wSubCmdID,NULL,0);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>
bool CAndroidUserItem::PerformSaveScore(SCORE lScore)
{
ASSERT(m_pIAndroidUserManager!=NULL);
if (m_pIAndroidUserManager->GetGameServiceOption()->wServerType==GAME_GENRE_MATCH)
return true;
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//Ч<><D0A7><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>
ASSERT(m_pIServerUserItem->GetUserScore()>=lScore);
if (m_pIServerUserItem->GetUserScore()<lScore) return false;
//<2F>޸<EFBFBD><DEB8><EFBFBD>Ϸ<EFBFBD><CFB7>
m_pIServerUserItem->ModifyUserInsure(-lScore,0L,0L);
return true;
}
//<2F><>ȡ<EFBFBD><C8A1>Ϸ<EFBFBD><CFB7>
bool CAndroidUserItem::PerformTakeScore(SCORE lScore)
{
ASSERT(m_pIAndroidUserManager!=NULL);
if (m_pIAndroidUserManager->GetGameServiceOption()->wServerType==GAME_GENRE_MATCH)
return true;
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//<2F>޸<EFBFBD><DEB8><EFBFBD>Ϸ<EFBFBD><CFB7>
m_pIServerUserItem->ModifyUserInsure(lScore,0L,0L);
return true;
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool CAndroidUserItem::SendSocketData(WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GF_GAME,wSubCmdID,pData,wDataSize);
return true;
}
bool CAndroidUserItem::SendSocketData(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem != NULL);
if (m_pIServerUserItem == NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID, wMainCmdID, wSubCmdID, pData, wDataSize);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserItem::JudgeAndroidActionAndRemove(WORD wAction)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bResult = (m_wAndroidAction&wAction)!=0;
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
if(bResult==true)
{
m_wAndroidAction &= ~wAction;
//<2F><EFBFBD><EBBFAA>ʶ
if(wAction==ANDROID_WAITLEAVE) m_bWaitLeave=true;
}
return bResult;
}
//ɾ<><C9BE>ʱ<EFBFBD><CAB1>
bool CAndroidUserItem::KillGameTimer(UINT nTimerID)
{
//ɾ<><C9BE>ʱ<EFBFBD><CAB1>
if (nTimerID!=0)
{
//Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (INT_PTR i=0;i<m_TimerItemActive.GetCount();i++)
{
//<2F><>ȡʱ<C8A1><CAB1>
tagTimerItem * pTimerItem=m_TimerItemActive[i];
//ɾ<><C9BE><EFBFBD>ж<EFBFBD>
if (pTimerItem->nTimerID==nTimerID)
{
m_TimerItemActive.RemoveAt(i);
m_TimerItemBuffer.Add(pTimerItem);
return true;
}
}
}
else
{
m_TimerItemBuffer.Append(m_TimerItemActive);
m_TimerItemActive.RemoveAll();
}
return false;
}
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
bool CAndroidUserItem::SetGameTimer(UINT nTimerID, UINT nElapse)
{
//Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (INT_PTR i=0;i<m_TimerItemActive.GetCount();i++)
{
//<2F><>ȡʱ<C8A1><CAB1>
tagTimerItem * pTimerItem=m_TimerItemActive[i];
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (pTimerItem->nTimerID==nTimerID)
{
pTimerItem->nTimeLeave=nElapse;
return true;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTimerItem * pTimerItem=NULL;
WORD wStorageCount=(WORD)m_TimerItemBuffer.GetCount();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (wStorageCount>0)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
pTimerItem=m_TimerItemBuffer[wStorageCount-1];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_TimerItemActive.Add(pTimerItem);
m_TimerItemBuffer.RemoveAt(wStorageCount-1);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pTimerItem==NULL)
{
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pTimerItem=new tagTimerItem;
if (pTimerItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_TimerItemActive.Add(pTimerItem);
}
catch (...)
{
ASSERT(FALSE);
return false;
}
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
pTimerItem->nTimerID=nTimerID;
pTimerItem->nTimeLeave=nElapse;
return true;
}
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
bool CAndroidUserItem::SendUserReady(VOID * pData, WORD wDataSize)
{
//״̬Ч<CCAC><D0A7>
// ASSERT((m_pIServerUserItem!=NULL)&&(m_pIServerUserItem->GetUserStatus()==US_SIT));
if ((m_pIServerUserItem==NULL)||(m_pIServerUserItem->GetUserStatus()!=US_SIT)) return false;
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GF_FRAME,SUB_GF_USER_READY,pData,wDataSize);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CAndroidUserItem::SendChatMessage(DWORD dwTargetUserID, LPCTSTR pszChatString, COLORREF crColor)
{
//Ч<><D0A7><EFBFBD>û<EFBFBD>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
CMD_GF_C_UserChat UserChat;
lstrcpyn(UserChat.szChatString,pszChatString,CountArray(UserChat.szChatString));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UserChat.dwChatColor=crColor;
UserChat.dwTargetUserID=dwTargetUserID;
UserChat.wChatLength=CountStringBuffer(UserChat.szChatString);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
WORD wSendSize=sizeof(UserChat)-sizeof(UserChat.szChatString)+UserChat.wChatLength*sizeof(TCHAR);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GF_FRAME,SUB_GF_USER_CHAT,&UserChat,wSendSize);
return true;
}
//ʱ<><CAB1><EFBFBD>¼<EFBFBD>
bool CAndroidUserItem::OnTimerPulse(DWORD dwTimerID, WPARAM dwBindParameter)
{
//Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (INT_PTR i=m_TimerItemActive.GetCount()-1;i>=0;i--)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTimerItem * pTimerItem=m_TimerItemActive[i];
//ʱ<><EFBFBD><E4B4A6>
if (pTimerItem->nTimeLeave<=1L)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_TimerItemActive.RemoveAt(i);
m_TimerItemBuffer.Add(pTimerItem);
try
{
//ʱ<><CAB1>֪ͨ
if (m_pIAndroidUserItemSink!=NULL)
{
m_pIAndroidUserItemSink->OnEventTimer(pTimerItem->nTimerID);
}
}
catch(...)
{
CString strMessage;
strMessage.Format(TEXT("OnTimerPulse: TimerID=%d"),pTimerItem->nTimerID);
CTraceService::TraceString(strMessage,TraceLevel_Exception);
}
}
else
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
pTimerItem->nTimeLeave--;
}
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool CAndroidUserItem::OnSocketRead(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//<2F><>¼ʧ<C2BC><CAA7>
if ((wMainCmdID==MDM_GR_LOGON)&&(wSubCmdID==SUB_GR_LOGON_FAILURE))
{
return OnSocketSubLogonFailure(pData,wDataSize);
}
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
if ((wMainCmdID==MDM_GR_LOGON)&&(wSubCmdID==SUB_GR_LOGON_FINISH))
{
return OnSocketSubLogonFinish(pData,wDataSize);
}
//<2F>û<EFBFBD>״̬
if ((wMainCmdID==MDM_GR_USER)&&(wSubCmdID==SUB_GR_USER_STATUS))
{
return OnSocketSubUserStatus(pData,wDataSize);
}
//<2F><>Ϸ<EFBFBD><CFB7>Ϣ
if ((wMainCmdID==MDM_GF_GAME)||(wMainCmdID==MDM_GF_FRAME))
{
return OnSocketGameMessage(wMainCmdID,wSubCmdID,pData,wDataSize);
}
//ϵͳ<CFB5><CDB3>Ϣ
if ((wMainCmdID==MDM_CM_SYSTEM)&&(wSubCmdID==SUB_CM_SYSTEM_MESSAGE))
{
return OnSocketSubSystemMessage(pData,wDataSize);
}
return true;
}
//<2F><>Ϸ<EFBFBD><CFB7>Ϣ
bool CAndroidUserItem::OnSocketGameMessage(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
try
{
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
if ((wMainCmdID==MDM_GF_GAME)&&(m_pIAndroidUserItemSink!=NULL))
{
return m_pIAndroidUserItemSink->OnEventGameMessage(wSubCmdID,pData,wDataSize);
}
//<2F><><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>
if (wMainCmdID==MDM_GF_FRAME)
{
//Ĭ<>ϴ<EFBFBD><CFB4><EFBFBD>
switch (wSubCmdID)
{
case SUB_GF_GAME_STATUS: //<2F><>Ϸ״̬
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wDataSize==sizeof(CMD_GF_GameStatus));
if (wDataSize!=sizeof(CMD_GF_GameStatus)) return false;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
CMD_GF_GameStatus * pGameStatus=(CMD_GF_GameStatus *)pData;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_cbGameStatus=pGameStatus->cbGameStatus;
return true;
}
case SUB_GF_GAME_SCENE: //<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
{
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
if (m_pIAndroidUserItemSink!=NULL)
{
bool bLookonUser=(m_pIServerUserItem->GetUserStatus()==US_LOOKON);
return m_pIAndroidUserItemSink->OnEventSceneMessage(m_cbGameStatus,bLookonUser,pData,wDataSize);
}
else
{
//<2F><><EFBFBD>Ϳ<EFBFBD>ʼ
IServerUserItem * pIServerUserItem=GetMeUserItem();
if (pIServerUserItem->GetUserStatus()!=US_READY) SendUserReady(NULL,0);
}
return true;
}
case SUB_GF_USER_READY: //<2F>û<EFBFBD>׼<EFBFBD><D7BC>
{
if(m_pIServerUserItem->GetUserStatus()>=US_READY)
return true;
//<2F><><EFBFBD>Ϳ<EFBFBD>ʼ
SendUserReady(NULL,0);
return true;
}
default:
{
if (m_pIAndroidUserItemSink!=NULL)
return m_pIAndroidUserItemSink->OnEventFrameMessage(wSubCmdID,pData,wDataSize);
break;
}
}
}
}
catch(...)
{
CString strMessage;
strMessage.Format(TEXT("OnSocketGameMessage: MainID=%d\tSubID=%d"),wMainCmdID,wSubCmdID);
CTraceService::TraceString(strMessage,TraceLevel_Exception);
}
return true;
}
//<2F><>¼ʧ<C2BC><CAA7>
bool CAndroidUserItem::OnSocketSubLogonFailure(VOID * pData, WORD wDataSize)
{
return true;
}
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
bool CAndroidUserItem::OnSocketSubLogonFinish(VOID * pData, WORD wDataSize)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_cbGameStatus=GAME_STATUS_FREE;
m_pIServerUserItem=m_pIServerUserManager->SearchUserItem(m_AndroidItemConfig.AndroidAccountsInfo.dwUserID);
//״̬Ч<CCAC><D0A7>
ASSERT(m_pIServerUserItem!=NULL);
if (m_pIServerUserItem==NULL) return false;
//<2F>û<EFBFBD>״̬
m_CurrentUserStatus.wChairID=m_pIServerUserItem->GetChairID();
m_CurrentUserStatus.wTableID=m_pIServerUserItem->GetTableID();
m_CurrentUserStatus.cbUserStatus=m_pIServerUserItem->GetUserStatus();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_UserRule UserRule;
ZeroMemory(&UserRule,sizeof(UserRule));
//<2F><><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GR_USER,SUB_GR_USER_RULE,&UserRule,sizeof(UserRule));
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_dwStandupTickCount=(DWORD)time(NULL);
m_dwReposeTickCount=m_dwMinSitInterval+rand()%(__max(m_dwMaxSitInterval-m_dwMinSitInterval,1));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
StartGameClient();
}
return true;
}
//<2F>û<EFBFBD>״̬
bool CAndroidUserItem::OnSocketSubUserStatus(VOID * pData, WORD wDataSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wDataSize==sizeof(CMD_GR_UserStatus));
if (wDataSize<sizeof(CMD_GR_UserStatus)) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_UserStatus * pUserStatus=(CMD_GR_UserStatus *)pData;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (pUserStatus->dwUserID!=m_AndroidItemConfig.AndroidAccountsInfo.dwUserID)
{
return true;
}
//<2F>û<EFBFBD>״̬
tagUserStatus LastUserStatus;
CopyMemory(&LastUserStatus,&m_CurrentUserStatus,sizeof(LastUserStatus));
CopyMemory(&m_CurrentUserStatus,&pUserStatus->UserStatus,sizeof(m_CurrentUserStatus));
//<2F><>ʼ<EFBFBD>л<EFBFBD>
if ((LastUserStatus.cbUserStatus!=US_READY)&&(m_CurrentUserStatus.cbUserStatus==US_READY))
{
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(m_CurrentUserStatus.cbUserStatus==US_FREE)
{
//<2F><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD>
m_dwPlayInnings=0;
m_wAndroidAction=0;
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_dwStandupTickCount=(DWORD)time(NULL);
m_dwReposeTickCount=m_dwMinSitInterval+rand()%(__max(m_dwMaxSitInterval-m_dwMinSitInterval,1));
}
//<2F><>Ϸ<EFBFBD><CFB7>ʼ
if(m_CurrentUserStatus.cbUserStatus==US_PLAYING)
{
m_dwPlayInnings++;
}
//<2F><><EFBFBD><EFBFBD>״̬
if(m_CurrentUserStatus.cbUserStatus==US_SIT)
{
if(m_AndroidService.dwSwitchTableInnings > 0 &&
m_AndroidService.dwSwitchTableInnings<=m_dwPlayInnings)
{
//<2F><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>
m_dwPlayInnings=0;
m_wAndroidAction|=ANDROID_WAITSTANDUP;
}
}
//<2F>ر<EFBFBD><D8B1>ж<EFBFBD>
if ((m_bStartClient==true)&&(m_CurrentUserStatus.wTableID==INVALID_TABLE))
{
//<2F>ر<EFBFBD><D8B1><EFBFBD>Ϸ
CloseGameClient();
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((m_bStartClient==false)&&(m_CurrentUserStatus.wTableID!=INVALID_TABLE))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
StartGameClient();
return true;
}
return true;
}
//ϵͳ<CFB5><CDB3>Ϣ
bool CAndroidUserItem::OnSocketSubSystemMessage(VOID * pData, WORD wDataSize)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_CM_SystemMessage * pSystemMessage=(CMD_CM_SystemMessage *)pData;
WORD wHeadSize=sizeof(CMD_CM_SystemMessage)-sizeof(pSystemMessage->szString);
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT((wDataSize>wHeadSize)&&(wDataSize==(wHeadSize+pSystemMessage->wLength*sizeof(TCHAR))));
if ((wDataSize<=wHeadSize)||(wDataSize!=(wHeadSize+pSystemMessage->wLength*sizeof(TCHAR)))) return false;
//<2F>رմ<D8B1><D5B4><EFBFBD>
if ((pSystemMessage->wType&(SMT_CLOSE_ROOM|SMT_CLOSE_LINK))!=0)
{
//<2F>رմ<D8B1><D5B4><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->DeleteAndroidUserItem(dwAndroidID,true);
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
VOID CAndroidUserItem::StartGameClient()
{
//״̬<D7B4>ж<EFBFBD>
ASSERT((m_bStartClient==false)&&(m_pIServerUserItem!=NULL));
ASSERT((m_pIServerUserItem->GetTableID()!=INVALID_TABLE)&&(m_pIServerUserItem->GetChairID()!=INVALID_CHAIR));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bStartClient=true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GF_GameOption GameOption;
ZeroMemory(&GameOption,sizeof(GameOption));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GameOption.cbAllowLookon=FALSE;
GameOption.dwFrameVersion=INVALID_DWORD;
GameOption.dwClientVersion=INVALID_DWORD;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwAndroidID=MAKELONG(m_wAndroidIndex,m_wRoundID);
m_pIAndroidUserManager->SendDataToServer(dwAndroidID,MDM_GF_FRAME,SUB_GF_GAME_OPTION,&GameOption,sizeof(GameOption));
return;
}
//<2F>ر<EFBFBD><D8B1><EFBFBD>Ϸ
VOID CAndroidUserItem::CloseGameClient()
{
//״̬<D7B4>ж<EFBFBD>
ASSERT((m_bStartClient==true)&&(m_pIServerUserItem!=NULL));
ASSERT((m_pIServerUserItem->GetTableID()==INVALID_TABLE)&&(m_pIServerUserItem->GetChairID()==INVALID_CHAIR));
//ɾ<><C9BE>ʱ<EFBFBD><CAB1>
KillGameTimer(0);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bStartClient=false;
m_cbGameStatus=GAME_STATUS_FREE;
//<2F><>Ϸ<EFBFBD><CFB7>λ
if (m_pIAndroidUserItemSink!=NULL)
{
m_pIAndroidUserItemSink->RepositionSink();
}
return;
}
//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
VOID CAndroidUserItem::RepositUserItem()
{
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
m_bWaitLeave=false;
m_bStartClient=false;
m_wAndroidAction=0;
m_dwPlayInnings=0;
m_cbGameStatus=GAME_STATUS_FREE;
//<2F>û<EFBFBD>״̬
m_CurrentUserStatus.cbUserStatus=US_NULL;
m_CurrentUserStatus.wChairID=INVALID_CHAIR;
m_CurrentUserStatus.wTableID=INVALID_TABLE;
//<2F>󶨱<EFBFBD><F3B6A8B1><EFBFBD>
m_pIServerUserItem=NULL;
//ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwMinSitInterval=0;
m_dwMaxSitInterval=0;
m_dwStandupTickCount=0;
m_dwReposeTickCount=0;
//״̬<D7B4><CCAC>Ϣ
ZeroMemory(&m_AndroidService,sizeof(m_AndroidService));
ZeroMemory(&m_AndroidItemConfig,sizeof(m_AndroidItemConfig));
//ɾ<><C9BE>ʱ<EFBFBD><CAB1>
m_TimerItemBuffer.Append(m_TimerItemActive);
m_TimerItemActive.RemoveAll();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wRoundID=__max(1,m_wRoundID+1);
//<2F><>λ<EFBFBD><CEBB>Ϸ
if (m_pIAndroidUserItemSink!=NULL)
{
m_pIAndroidUserItemSink->RepositionSink();
}
return;
}
//////////////////////////////////////////////////////////////////////////////////