//框架事件处理 bool __cdecl CTableFrame::OnEventSocketFrame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { CString strFile,strTemp; CTime tmCur = CTime::GetCurrentTime(); CString strTime = tmCur.Format("%m%d"); strFile.Format("log\\%s游戏服务.log",strTime); strTemp.Format("into OnEventSocketFrame"); WriteLog(strFile, strTemp); //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(m_pITableFrameSink!=NULL); //消息处理 bool bSuccess=m_pITableFrameSink->OnFrameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem); if (bSuccess==false) { switch (wSubCmdID) { case SUB_GF_INFO: //游戏信息 { //效验参数 ASSERT(wDataSize==sizeof(CMD_GF_Info)); if (wDataSize<sizeof(CMD_GF_Info)) return false; //变量定义 CMD_GF_Info * pInfo=(CMD_GF_Info *)pDataBuffer; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //效验状态 ASSERT(pUserData->wChairID<m_wChairCount); if (pUserData->wChairID>=m_wChairCount) return false; //设置变量 if (bLookonUser==false) m_bAllowLookon[pUserData->wChairID]=pInfo->bAllowLookon?true:false; //发送配置 CMD_GF_Option Option; Option.bGameStatus=m_bGameStatus; Option.bAllowLookon=m_bAllowLookon[pUserData->wChairID]?TRUE:FALSE; m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_OPTION,&Option,sizeof(Option)); //发送场景 bool bSendSecret=((bLookonUser==false)||(m_bAllowLookon[pUserData->wChairID]==true)); return m_pITableFrameSink->SendGameScene(pUserData->wChairID,pIServerUserItem,m_bGameStatus,bSendSecret); } case SUB_GF_USER_READY: //用户同意 { //变量定义 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //状态效验 ASSERT(bLookonUser==false); ASSERT(m_pIUserItem[pUserData->wChairID]==pIServerUserItem); if (bLookonUser==true) return false; if (pUserData->cbUserStatus>=US_PLAY) return true; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReqReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //事件处理 if ((m_pITableFrameEvent!=NULL)&&(m_pITableFrameEvent->OnEventUserReqReady( pUserData->wChairID,pIServerUserItem)==false)) return true; //设置变量 pUserData->cbUserStatus=US_READY; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //变量定义 bool bMatchServer=((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0); bool bControlStart=((bMatchServer==true)&&m_pGameServiceOption->cbControlStart==TRUE); strTemp.Format("into GAME_GENRE_MATCH"); WriteLog(strFile, strTemp); //开始判断 if ((bControlStart==false)&&(StartVerdict()==true)) { StartGame(); return true; }//End if //发送状态 m_pIGameServiceFrame->SendUserStatus(pIServerUserItem); return true; } case SUB_GF_USER_CHAT: //用户聊天 { //效验参数 CMD_GF_UserChat * pUserChat=(CMD_GF_UserChat *)pDataBuffer; ASSERT(wDataSize>=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))); ASSERT(wDataSize==(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)); if (wDataSize<(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))) return false; if (wDataSize!=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)) return false; //变量定义 bool bMatchServer=((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0); bool bControlStart=((bMatchServer==true)&&m_pGameServiceOption->cbControlStart==TRUE); strTemp.Format("into GAME_GENRE_MATCH 2"); WriteLog(strFile, strTemp); //命令过虑 const tagServerUserData * pUserData=pIServerUserItem->GetUserData(); //防作弊房间 // if ( m_pIGameServiceFrame->IsFZBRoom() || m_pGameServiceOption->cbFZB ) if ( CanNoChat(m_pGameServiceOption->cbFZB ) ) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间为防作弊房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; }//End if if (pUserData->dwMasterRight!=0L) { //比赛开始 if ((bMatchServer==true)&&(bControlStart=true)&&(lstrcmp(pUserChat->szChatMessage,TEXT("/:StartGame"))==0)) { if (StartVerdict()==true) StartGame(); return true; } //游戏解散 if (lstrcmp(pUserChat->szChatMessage,TEXT("/:DismissGame"))==0) { DismissGame(); return true; } }//End if //比赛旁观 if (pUserData->dwMasterRight==0L) { if ((bMatchServer==true)&&(pIServerUserItem->GetUserStatus()==US_LOOKON)) { LPCTSTR pszMessage=TEXT("为了不影响比赛选手比赛,旁观的用户禁止发言!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } } //权限判断 if (CUserRight::CanGameChat(pIServerUserItem->GetUserData()->dwUserRight)==false) { LPCTSTR pszMessage=TEXT("你暂时没有发送房间消息的权限,只能与管理员私聊!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //状态查询 if ((pUserData->dwMasterRight==0L)&&(m_pIGameServiceFrame->IsAllowGameChat()==false)) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //游戏玩家 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) m_pIGameServiceFrame->SendData(m_pIUserItem[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } //旁观玩家 for (INT_PTR i=0;i<m_LookonUserItemPtr.GetCount();i++) { m_pIGameServiceFrame->SendData(m_LookonUserItemPtr[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } return true; } } } return bSuccess; }
//框架事件处理 bool __cdecl CTableFrame::OnEventSocketFrame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem) { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(m_pITableFrameSink!=NULL); //消息处理 bool bSuccess=m_pITableFrameSink->OnFrameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem); if (bSuccess==false) { switch (wSubCmdID) { case SUB_GF_INFO: //游戏信息 { //效验参数 ASSERT(wDataSize==sizeof(CMD_GF_Info)); if (wDataSize<sizeof(CMD_GF_Info)) return false; //变量定义 CMD_GF_Info * pInfo=(CMD_GF_Info *)pDataBuffer; tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //效验状态 ASSERT(pUserData->wChairID<m_wChairCount); if (pUserData->wChairID>=m_wChairCount) return false; //设置变量 if (bLookonUser==false) m_bAllowLookon[pUserData->wChairID]=pInfo->bAllowLookon?true:false; //发送配置 CMD_GF_Option Option; Option.bGameStatus=m_bGameStatus; Option.bAllowLookon=m_bAllowLookon[pUserData->wChairID]?TRUE:FALSE; m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_OPTION,&Option,sizeof(Option)); //发送场景 bool bSendSecret=((bLookonUser==false)||(m_bAllowLookon[pUserData->wChairID]==true)); return m_pITableFrameSink->SendGameScene(pUserData->wChairID,pIServerUserItem,m_bGameStatus,bSendSecret); } case SUB_GF_USER_READY: //用户同意 { //变量定义 tagServerUserData * pUserData=pIServerUserItem->GetUserData(); bool bLookonUser=(pUserData->cbUserStatus==US_LOOKON); //状态效验 ASSERT(bLookonUser==false); ASSERT(m_pIUserItem[pUserData->wChairID]==pIServerUserItem); if (bLookonUser==true) return false; if (pUserData->cbUserStatus>=US_PLAY) return true; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReqReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //事件处理 if ((m_pITableFrameEvent!=NULL)&&(m_pITableFrameEvent->OnEventUserReqReady( pUserData->wChairID,pIServerUserItem)==false)) return true; //设置变量 pUserData->cbUserStatus=US_READY; //同意处理 if (m_pITableFrameEvent!=NULL) m_pITableFrameEvent->OnEventUserReady(pUserData->wChairID,m_pIUserItem[pUserData->wChairID]); //发送状态 m_pIGameServiceFrame->SendUserStatus(pIServerUserItem); return true; } case SUB_GF_USER_CHAT: //用户聊天 { //效验参数 CMD_GF_UserChat * pUserChat=(CMD_GF_UserChat *)pDataBuffer; ASSERT(wDataSize>=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))); ASSERT(wDataSize==(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)); if (wDataSize<(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))) return false; if (wDataSize!=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)) return false; //命令过虑 const tagServerUserData * pUserData=pIServerUserItem->GetUserData(); if (pUserData->dwMasterRight!=0L) { //游戏解散 if (lstrcmp(pUserChat->szChatMessage,TEXT("/:DismissGame"))==0) { DismissGame(); return true; } } //权限判断 if (CUserRight::CanGameChat(pIServerUserItem->GetUserData()->dwUserRight)==false) { LPCTSTR pszMessage=TEXT("你暂时没有发送房间消息的权限,只能与管理员私聊!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //状态查询 if ((pUserData->dwMasterRight==0L)&&(m_pIGameServiceFrame->IsAllowGameChat()==false)) { LPCTSTR pszMessage=TEXT("抱歉,本游戏房间不允许发送聊天信息!"); SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_INFO); return true; } //游戏玩家 for (WORD i=0;i<m_wChairCount;i++) { if (m_pIUserItem[i]!=NULL) m_pIGameServiceFrame->SendData(m_pIUserItem[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } //旁观玩家 for (INT_PTR i=0;i<m_LookonUserItemPtr.GetCount();i++) { m_pIGameServiceFrame->SendData(m_LookonUserItemPtr[i],MDM_GF_FRAME,SUB_GF_USER_CHAT,pUserChat,wDataSize); } return true; } } } return bSuccess; }