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