#include "StdAfx.h" #include "PrivateGame.h" #include "..\游戏服务器\DataBasePacket.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////// //构造函数 PriaveteGame::PriaveteGame() { m_pGameServiceOption=NULL; m_pGameServiceAttrib=NULL; //内核接口 m_pTableInfo=NULL; m_pITimerEngine=NULL; m_pIDataBaseEngine=NULL; m_pITCPNetworkEngineEvent=NULL; //服务接口 m_pIGameServiceFrame=NULL; m_pIServerUserManager=NULL; m_pAndroidUserManager=NULL; ZeroMemory(&m_kPrivateInfo, sizeof(CMD_GR_Private_Info)); } PriaveteGame::~PriaveteGame(void) { //释放资源 SafeDeleteArray(m_pTableInfo); //关闭定时器 m_pITimerEngine->KillTimer(IDI_DISMISS_WAITE_END); } //接口查询 VOID* PriaveteGame::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IGamePrivateItem,Guid,dwQueryVer); QUERYINTERFACE(IPrivateEventSink,Guid,dwQueryVer); QUERYINTERFACE(IServerUserItemSink,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IGamePrivateItem,Guid,dwQueryVer); return NULL; } //绑定桌子 bool PriaveteGame::BindTableFrame(ITableFrame * pTableFrame,WORD wTableID) { if(pTableFrame==NULL || wTableID>m_pGameServiceOption->wTableCount) { ASSERT(false); return false; } //创建钩子 CTableFramePrivate * pTableFrameHook=new CTableFramePrivate(); pTableFrameHook->InitTableFramePrivate(QUERY_OBJECT_PTR_INTERFACE(pTableFrame,IUnknownEx)); pTableFrameHook->SetPrivateEventSink(QUERY_OBJECT_PTR_INTERFACE(this,IUnknownEx)); //设置接口 pTableFrame->SetTableFramePrivate(QUERY_OBJECT_PTR_INTERFACE(pTableFrameHook,IUnknownEx)); m_pTableInfo[wTableID].pITableFrame=pTableFrame; m_pTableInfo[wTableID].restValue(); return true; } //初始化接口 bool PriaveteGame::InitPrivateInterface(tagPrivateManagerParameter & MatchManagerParameter) { m_pGameServiceOption=MatchManagerParameter.pGameServiceOption; m_pGameServiceAttrib=MatchManagerParameter.pGameServiceAttrib; //内核组件 m_pITimerEngine=MatchManagerParameter.pITimerEngine; m_pIDataBaseEngine=MatchManagerParameter.pICorrespondManager; m_pITCPNetworkEngineEvent=MatchManagerParameter.pTCPNetworkEngine; //服务组件 m_pIGameServiceFrame=MatchManagerParameter.pIMainServiceFrame; m_pIServerUserManager=MatchManagerParameter.pIServerUserManager; m_pAndroidUserManager=MatchManagerParameter.pIAndroidUserManager; m_pIServerUserItemSink=MatchManagerParameter.pIServerUserItemSink; //创建桌子 if (m_pTableInfo==NULL) { m_pTableInfo = new PrivateTableInfo[m_pGameServiceOption->wTableCount]; } ////读取初始积分 获取路径 //TCHAR szWorkDir[MAX_PATH] = TEXT(""); //CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); ////构造路径 //TCHAR szIniFile[MAX_PATH] = TEXT(""); //_sntprintf_s(szIniFile, CountArray(szIniFile), TEXT("%s\\ServerParameter.ini"), szWorkDir); ////读取配置 //CWHIniData IniData; //IniData.SetIniFilePath(szIniFile); //CString strSubItem; //strSubItem.Format(_T("Server%dInitScore"), m_pGameServiceOption->wServerID); //读取配置 //m_nInitScore = IniData.ReadInt(TEXT("ServerInfo"), strSubItem, 95); return true; } void PriaveteGame::OnStartService() { //变量定义 DBR_GR_Private_Info kPrivateInfo; ZeroMemory(&kPrivateInfo,sizeof(kPrivateInfo)); kPrivateInfo.wKindID=m_pGameServiceOption->wKindID; m_pIDataBaseEngine->PostDataBaseRequest(0L,DBR_GR_PRIVATE_INFO,0L,&kPrivateInfo,sizeof(kPrivateInfo)); //定时器; m_pITimerEngine->SetTimer(IDI_DISMISS_WAITE_END,5000L,TIMES_INFINITY,0); m_pITimerEngine->SetTimer(IDI_CREATE_UNION_ROOM, CREATE_UNION_TIME * 1000L, TIMES_INFINITY, 0); m_pITimerEngine->SetTimer(IDI_LOAD_UNION_ROOM, 5000L, 1, 0); } //时间事件 bool PriaveteGame::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter) { switch(dwTimerID) { case IDI_DISMISS_WAITE_END: //解散等待时间 10s { for(int i = 0;iwTableCount;i++) { PrivateTableInfo* pTableInfo = &m_pTableInfo[i]; if (pTableInfo->bInEnd) { pTableInfo->fAgainPastTime += 5.0f; if (pTableInfo->fAgainPastTime >= AGAIN_WAITE_TIME) { ClearRoom(pTableInfo); } } //已经创建并且没有开始的桌子 if (pTableInfo->dwCreaterUserID>0 && !pTableInfo->bStart) { // 自动代开房间不解散; if ((pTableInfo->dwGameRuleIdex&ePrivateTableCommonRule_DaiKaiFang) == 0) { pTableInfo->fCreateTime += 5.0f; if (pTableInfo->fCreateTime >= CREATE_PRIVATE_FREE_TIME) { DismissRoom(pTableInfo); } } else // 自动代开房间玩家离线5分钟自动离开游戏房间; { ITableFrame* pTableFrame = pTableInfo->pITableFrame; ASSERT(pTableFrame != NULL); if (pTableFrame != NULL && pTableFrame->GetSitUserCount() > 0) { for (int i = 0; i < pTableFrame->GetChairCount(); i++) { IServerUserItem* pUserItem = pTableFrame->GetTableUserItem(i); if (pUserItem && pUserItem->GetTableID() != INVALID_TABLE && pUserItem->GetUserStatus() == US_OFFLINE) { pTableInfo->fOfflineTimes[i] += 5.0f; // 自动离开; if (pTableInfo->fOfflineTimes[i] >= UNION_OFFLINE_LEAVE_TIME) { pTableFrame->PerformStandUpActionEx(pUserItem); pTableInfo->fOfflineTimes[i] = 0; } } } } } } // 申请解散超时; if (pTableInfo->kDismissChairID.size() > 0) { pTableInfo->fDismissPastTime += 5.0f; if (pTableInfo->fDismissPastTime >= DISMISS_WAITE_TIME) { // 无拒绝解散玩家,才进行解散; if (pTableInfo->kNotAgreeChairID.size() < 1) { DismissRoom(pTableInfo); } pTableInfo->kNotAgreeChairID.clear(); pTableInfo->kDismissChairID.clear(); pTableInfo->fDismissPastTime = 0; } } // 游戏开始时间; if (pTableInfo->bStart) { //pTableInfo->fGameStartTime += 5.0f; if (pTableInfo->IsOffLineUser()) { pTableInfo->fGameStartTime += 5.0f; } else { pTableInfo->fGameStartTime = 0.0f; } } } return true; } case IDI_CREATE_UNION_ROOM: { if (m_UnionRoomList.kList.size() > 0) { // 查找是否有带开信息未开启; for (int i = 0; i < (int)m_UnionRoomList.kList.size(); i++) { CMD_GR_AutoCreatePrivate& kInfo = m_UnionRoomList.kList[i]; PrivateTableInfo* pTableInfo = GetPrivateTableInfoByDaikaiIndex(kInfo.dwIndex); if (pTableInfo == nullptr) { AutoCreateUnionRoom(kInfo); } } } //else //{ // DBR_GR_UnionRoomInfo UnionRoom; // ZeroMemory(&UnionRoom, sizeof(DBR_GR_UnionRoomInfo)); // UnionRoom.wServerID = m_pGameServiceOption->wServerID; // UnionRoom.wKindID = m_pGameServiceOption->wKindID; // m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_UNION_ROOM_INFO, 0L, &UnionRoom, sizeof(UnionRoom)); //} return true; } case IDI_LOAD_UNION_ROOM: { DBR_GR_UnionRoomInfo UnionRoom; ZeroMemory(&UnionRoom, sizeof(DBR_GR_UnionRoomInfo)); UnionRoom.wServerID = m_pGameServiceOption->wServerID; UnionRoom.wKindID = m_pGameServiceOption->wKindID; m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_UNION_ROOM_INFO, 0L, &UnionRoom, sizeof(UnionRoom)); return true; } } // 重置自由人数场; if (dwTimerID >= IDI_AUTO_USER_RESET && dwTimerID < (IDI_AUTO_USER_RESET + m_pGameServiceOption->wTableCount)) { m_pITimerEngine->KillTimer(dwTimerID); WORD wTableID = dwTimerID - IDI_AUTO_USER_RESET; PrivateTableInfo* pTableInfo = &m_pTableInfo[wTableID]; if (pTableInfo != nullptr && pTableInfo->IsAutoUserCountRule()) { if (pTableInfo->bInEnd || pTableInfo->bStart) return true; pTableInfo->mReadyInfo.reset(); // 通知客户端可以重新准备; tagAutoUserStatus autoUserStatus; autoUserStatus.bStartGame = true; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); } } return true; } //代开信息是否已经开启; PrivateTableInfo* PriaveteGame::GetPrivateTableInfoByDaikaiIndex(DWORD dwDaikaiIndex) { for (int i = 0; i < m_pGameServiceOption->wTableCount; i++) { PrivateTableInfo* pTableInfo = &m_pTableInfo[i]; if (!pTableInfo->bStart && pTableInfo->m_dwDaikaiIndex == dwDaikaiIndex) { return pTableInfo; } } return nullptr; } //发送数据 bool PriaveteGame::SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { if(pIServerUserItem!=NULL) return m_pIGameServiceFrame->SendData(pIServerUserItem,wMainCmdID,wSubCmdID,pData,wDataSize); else return m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, wMainCmdID,wSubCmdID, pData, wDataSize); return true; } bool PriaveteGame::SendTableData(ITableFrame* pITableFrame, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { return pITableFrame->SendTableData(INVALID_CHAIR,wSubCmdID,pData,wDataSize,wMainCmdID); } void PriaveteGame::CreatePrivateCost(PrivateTableInfo* pTableInfo) { if (pTableInfo->cbRoomType == Type_Private) { CString strDebugInfo; strDebugInfo.Format(_T("RoomID[%d], dwUserID[%d], dwCost[%d]"), pTableInfo->dwRoomNum, pTableInfo->dwCreaterUserID, pTableInfo->dwPlayCost); ::OutputDebugString(strDebugInfo.GetBuffer()); // 不是工会开房扣费,工会开房已经提前扣费; if (pTableInfo->dwUnionCode == 0) { if (pTableInfo->IsCardAARule()) { EveryOnePrivateCost(pTableInfo, true); } else { CreaterPlayerPrivateCost(pTableInfo); } } } else if (pTableInfo->cbRoomType == Type_Public) { EveryOnePrivateCost(pTableInfo, false); } } PrivateTableInfo* PriaveteGame::getTableInfoByRoomID(DWORD dwRoomID) { for (int i = 0;iwTableCount;i++) { if (m_pTableInfo[i].dwRoomNum == dwRoomID) { return &m_pTableInfo[i]; } } return NULL; } PrivateTableInfo* PriaveteGame::getTableInfoByCreaterID(DWORD dwUserID) { for (int i = 0;iwTableCount;i++) { if (m_pTableInfo[i].dwCreaterUserID == dwUserID) { return &m_pTableInfo[i]; } } return NULL; } PrivateTableInfo* PriaveteGame::getTableInfoByTableID(DWORD dwRoomID) { for (int i = 0;iwTableCount;i++) { if (m_pTableInfo[i].pITableFrame && m_pTableInfo[i].pITableFrame->GetTableID() == dwRoomID) { return &m_pTableInfo[i]; } } return NULL; } PrivateTableInfo* PriaveteGame::getTableInfoByTableFrame(ITableFrame* pTableFrame) { for (int i = 0;iwTableCount;i++) { if (m_pTableInfo[i].pITableFrame == pTableFrame) { return &m_pTableInfo[i]; } } return NULL; } //数据库事件 bool PriaveteGame::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { switch (wRequestID) { case DBO_GR_PRIVATE_INFO: //私人场信息 { //参数效验 if(wDataSize>sizeof(DBO_GR_Private_Info)) return false; //提取数据 DBO_GR_Private_Info * pPrivate = (DBO_GR_Private_Info*)pData; m_kPrivateInfo.wKindID = pPrivate->wKindID; m_kPrivateInfo.lCostGold = pPrivate->lCostGold; memcpy(&m_kPrivateInfo.bPlayCout,pPrivate->bPlayCout,sizeof(m_kPrivateInfo.bPlayCout)); memcpy(&m_kPrivateInfo.lPlayCost,pPrivate->lPlayCost,sizeof(m_kPrivateInfo.lPlayCost)); break; } case DBO_GR_CREATE_PRIVATE: //私人场信息 { if (pIServerUserItem == nullptr) return false; OnEventCreatePrivate(wRequestID,pIServerUserItem,pData,wDataSize,""); break; } case DBO_GR_SINGLE_RECORD: { //参数效验; if (wDataSize != sizeof(DBO_GR_SingleGameRecord)) return false; DBO_GR_SingleGameRecord* pSingleGameRecord = (DBO_GR_SingleGameRecord*)pData; PrivateTableInfo* pTableInfo = getTableInfoByCreaterID(pSingleGameRecord->dwCreaterUserID); if ( NULL != pTableInfo ) { pTableInfo->kTotalRecord.iRecordID = pSingleGameRecord->dwRecordID; } break; } case DBO_GR_CREATE_UNION_ROOM: { //参数效验; if (wDataSize != sizeof(DBO_GR_CreateUnionRoomResult)) return false; DBO_GR_CreateUnionRoomResult* pUnionRoomResult = (DBO_GR_CreateUnionRoomResult*)pData; PrivateTableInfo* pTableInfo = getTableInfoByRoomID(pUnionRoomResult->dwRoomID); if (NULL != pTableInfo) { pTableInfo->dwUnionConsumerID = pUnionRoomResult->dwUnionConsumerID; } break; } case DBO_GR_JOIN_UNION_ROOM: { //参数效验; if (wDataSize != sizeof(DBO_GR_JoinUnionRoomResult)) return false; if (pIServerUserItem == nullptr) return false; DBO_GR_JoinUnionRoomResult* pJoinUnionRoomResult = (DBO_GR_JoinUnionRoomResult*)pData; // 可以加入; if (pJoinUnionRoomResult->bSucess) { PrivateTableInfo* pTableInfo = getTableInfoByRoomID(pJoinUnionRoomResult->dwRoomID); if (NULL != pTableInfo) { //joinPrivateRoom(pIServerUserItem, pTableInfo->pITableFrame); joinPrivateRoom(pIServerUserItem, pTableInfo, pJoinUnionRoomResult->lUnionScore); } } else { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, pJoinUnionRoomResult->szDescribeString, SMT_EJECT); } break; } case DBO_GR_UnionRoomInfo: { // 判断服务器维护; if (CServerRule::IsForfendGameStart(m_pGameServiceOption->dwServerRule) == true) return true; // 确保空; if (m_UnionRoomList.kList.size() > 0) { m_UnionRoomList.kList.clear(); } DataStream kDataStream(pData, wDataSize); m_UnionRoomList.StreamValue(kDataStream, false); for (int i = 0; i < (int)m_UnionRoomList.kList.size(); i++) { CMD_GR_AutoCreatePrivate& kInfo = m_UnionRoomList.kList[i]; PrivateTableInfo* pTableInfo = GetPrivateTableInfoByDaikaiIndex(kInfo.dwIndex); if (pTableInfo == nullptr) { AutoCreateUnionRoom(kInfo); } } break; } case DBO_GR_AUTO_CREATE: { OnEventCreateAuto(wRequestID, pData, wDataSize, ""); break; } case DBO_GR_ADD_AUTO_SUCC: { OnEventAddAutoRoomSucc(pIServerUserItem, pData, wDataSize); break; } case DBO_GR_ADD_AUTO_ERR: { //发送错误 DBO_GR_AutoFailure * pLogonFailure = (DBO_GR_AutoFailure *)pData; SendAddAutoResult(pIServerUserItem, pLogonFailure->szDescribeString, pLogonFailure->lResultCode); break; } case DBO_GR_DEL_AUTO_RESULTE: { //发送错误 DBO_GR_AutoFailure * pLogonFailure = (DBO_GR_AutoFailure *)pData; SendAddAutoResult(pIServerUserItem, pLogonFailure->szDescribeString, pLogonFailure->lResultCode); break; } } return true; } //自动创建房间; void PriaveteGame::AutoCreateUnionRoom(CMD_GR_AutoCreatePrivate &CreatePrivate) { if (CreatePrivate.cbGameType == Type_Private) { DBR_GR_Create_Private kDBRInfo; kDBRInfo.dwUserID = INVALID_CHAIR; kDBRInfo.dwDaikaiIndex = CreatePrivate.dwIndex; kDBRInfo.wKindID = m_pGameServiceAttrib->wKindID; kDBRInfo.dwUnionCode = CreatePrivate.dwUnionCode; kDBRInfo.cbUnionGoldOpen = CreatePrivate.cbUnionGoldOpen; kDBRInfo.cbRoomType = Type_Private; kDBRInfo.dwCostType = Type_Private; kDBRInfo.dwAgaginTable = INVALID_DWORD; ASSERT(CreatePrivate.bPlayCoutIdex < 4); ASSERT(m_kPrivateInfo.lPlayCost[CreatePrivate.bPlayCoutIdex] != 0); kDBRInfo.dwCost = (DWORD)m_kPrivateInfo.lPlayCost[CreatePrivate.bPlayCoutIdex]; kDBRInfo.bPlayCoutIdex = CreatePrivate.bPlayCoutIdex; kDBRInfo.bGameRuleIdex = CreatePrivate.bGameRuleIdex; kDBRInfo.bGameTypeIdex = CreatePrivate.bGameTypeIdex; kDBRInfo.cbEnterRoomScoreType = CreatePrivate.cbEnterRoomScoreType; kDBRInfo.lInitEnterRoomScore = CreatePrivate.lInitEnterRoomScore; kDBRInfo.cbBaseScore = CreatePrivate.cbBaseScore; if ((kDBRInfo.bGameRuleIdex & ePrivateTableCommonRule_CardAA) == ePrivateTableCommonRule_CardAA) { if (m_pGameServiceAttrib->wChairCount > 0) { kDBRInfo.dwCost = kDBRInfo.dwCost / m_pGameServiceAttrib->wChairCount; } } CString strDebugInfo; strDebugInfo.Format(_T("dwUserID[%d], bPlayCoutIdex[%d], dwCost[%d], bPlayCoutIdex[%d], bGameRuleIdex[%d], bGameTypeIdex[%d]"), kDBRInfo.dwUserID, CreatePrivate.bPlayCoutIdex, kDBRInfo.dwCost, kDBRInfo.bPlayCoutIdex, kDBRInfo.bGameRuleIdex, kDBRInfo.bGameTypeIdex); ::OutputDebugString(strDebugInfo.GetBuffer()); m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_AUTO_UNION_ROOM, 0L, &kDBRInfo, sizeof(DBR_GR_Create_Private)); } } //自动创建房间 bool PriaveteGame::OnEventCreateAuto(WORD wRequestID, VOID * pData, WORD wDataSize, std::string kChannel) { //参数效验 if (wDataSize > sizeof(DBO_GR_CreatePrivateResoult)) return false; //提取数据 DBO_GR_CreatePrivateResoult* pPrivate = (DBO_GR_CreatePrivateResoult*)pData; DWORD dwAgaginTable = pPrivate->dwAgaginTable; //报名失败 if (pPrivate->bSucess == false) { CTraceService::TraceString(pPrivate->szDescribeString, TraceLevel_Normal); return true; } if (pPrivate->bPlayCoutIdex >= 4) { return false; } //寻找位置 ITableFrame * pICurrTableFrame = NULL; PrivateTableInfo* pCurrTableInfo = NULL; //WORD wTableID = 0; for (WORD wTableID = 0; wTableID < m_pGameServiceOption->wTableCount; wTableID++) { //获取对象 ASSERT(m_pTableInfo[wTableID].pITableFrame != NULL); ITableFrame * pITableFrame = m_pTableInfo[wTableID].pITableFrame; if (m_pTableInfo[wTableID].bInEnd) continue; // 代开房间; if (m_pTableInfo[wTableID].m_dwDaikaiIndex == 0) { if (pITableFrame->GetNullChairCount() == pITableFrame->GetChairCount()) { pICurrTableFrame = pITableFrame; pCurrTableInfo = &m_pTableInfo[wTableID]; pCurrTableInfo->restValue(); break; } } } //桌子判断 if (pICurrTableFrame == NULL) { return true; } if (m_pGameServiceOption->wServerID >= 90) { ASSERT(false); return true; } int iRandNum = m_allocationID.PopValue(); iRandNum = (m_pGameServiceOption->wServerID + 10) * 10000 + iRandNum; pCurrTableInfo->dwPlayCout = (DWORD)m_kPrivateInfo.bPlayCout[pPrivate->bPlayCoutIdex]; if (pPrivate->cbRoomType == Type_Private) { pCurrTableInfo->dwPlayCost = (DWORD)m_kPrivateInfo.lPlayCost[pPrivate->bPlayCoutIdex]; } else { pCurrTableInfo->dwPlayCost = (DWORD)m_kPrivateInfo.lCostGold; } pCurrTableInfo->setRoomNum(iRandNum); pCurrTableInfo->dwCreaterUserID = INVALID_CHAIR; pCurrTableInfo->dwUnionCode = pPrivate->dwUnionCode; pCurrTableInfo->m_dwDaikaiIndex = pPrivate->dwDaikaiIndex; pCurrTableInfo->kHttpChannel = kChannel; pCurrTableInfo->cbRoomType = pPrivate->cbRoomType; pCurrTableInfo->dwGameRuleIdex = pPrivate->bGameRuleIdex; pCurrTableInfo->bGameTypeIdex = pPrivate->bGameTypeIdex; pCurrTableInfo->bPlayCoutIdex = pPrivate->bPlayCoutIdex; GetLocalTime(&pCurrTableInfo->kTotalRecord.kPlayTime); pCurrTableInfo->cbEnterRoomScoreType = pPrivate->cbEnterRoomScoreType; pCurrTableInfo->lInitEnterRoomScore = pPrivate->lInitEnterRoomScore; pCurrTableInfo->cbBaseScore = pPrivate->cbBaseScore; pCurrTableInfo->cbUnionGoldOpen = pPrivate->cbUnionGoldOpen; pCurrTableInfo->lScoreMultiple = pPrivate->lScoreMultiple; pCurrTableInfo->lGameGold = pPrivate->lGameGold; if (pPrivate->dwAgaginTable == INVALID_DWORD) { pCurrTableInfo->kTotalRecord.iRecordID = pPrivate->dwRecordID; } tagPrivateFrameParameter PriavateFrame; PriavateFrame.dwCreaterUserID = pCurrTableInfo->dwCreaterUserID; PriavateFrame.dwRoomNum = pCurrTableInfo->dwRoomNum; PriavateFrame.dwPlayCost = pCurrTableInfo->dwPlayCost; PriavateFrame.cbGameTypeIdex = (BYTE)pCurrTableInfo->dwGameRuleIdex; PriavateFrame.cbGameCout = (BYTE)pCurrTableInfo->dwPlayCout; PriavateFrame.dwGameRule = pCurrTableInfo->dwGameRuleIdex; PriavateFrame.cbEnterRoomScoreType = pCurrTableInfo->cbEnterRoomScoreType; //进房间时的分数类型; PriavateFrame.lInitEnterRoomScore = pCurrTableInfo->lInitEnterRoomScore; //进入房间时的分数; PriavateFrame.cbUnionGoldOpen = pCurrTableInfo->cbUnionGoldOpen; PriavateFrame.lScoreMultiple = pCurrTableInfo->lScoreMultiple; PriavateFrame.lGameGold = pCurrTableInfo->lGameGold; PriavateFrame.cbBaseScore = pCurrTableInfo->cbBaseScore; pICurrTableFrame->SetPrivateInfo(PriavateFrame); CString strTmp; strTmp.Format(_T("创建代开房间: %d, %d,%d"), iRandNum, pPrivate->bPlayCoutIdex, pPrivate->cbBaseScore); CTraceService::TraceString(strTmp, TraceLevel_Normal); sendPrivateRoomInfo(NULL, pCurrTableInfo); // 通知数据库扣费; if (pPrivate->dwUnionCode != 0) { DBR_GR_Create_UnionRoom CreateUnionRoom; ZeroMemory(&CreateUnionRoom, sizeof(DBR_GR_Create_UnionRoom)); CreateUnionRoom.wServerID = m_pGameServiceOption->wServerID; CreateUnionRoom.dwUnionCode = pPrivate->dwUnionCode; CreateUnionRoom.dwRoomID = pCurrTableInfo->dwRoomNum; CreateUnionRoom.dwCreaterUserID = pCurrTableInfo->dwCreaterUserID; CreateUnionRoom.wKindID = m_pGameServiceAttrib->wKindID; CreateUnionRoom.dwCost = pCurrTableInfo->dwPlayCost; CreateUnionRoom.dwCostType = pCurrTableInfo->cbRoomType; CreateUnionRoom.dwGameRuleIdex = pCurrTableInfo->dwGameRuleIdex; CreateUnionRoom.bPlayCoutIdex = (BYTE)pCurrTableInfo->dwPlayCout; CreateUnionRoom.dwRecordID = pPrivate->dwRecordID; CreateUnionRoom.cbBaseScore = pPrivate->cbBaseScore; m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_CREATE_UNION_ROOM, 0L, (BYTE*)&CreateUnionRoom, sizeof(DBR_GR_Create_UnionRoom)); } else { DataStream kDataStream; pCurrTableInfo->kTotalRecord.StreamValue(kDataStream, true); m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_PRIVATE_GAME_RECORD, 0, &kDataStream[0], kDataStream.size()); } //// 设置房主积分; //PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); //if (NULL == pTableInfo) return true; //if (pTableInfo->bInEnd) return true; //if (pTableInfo->IsSetOneTimeRoomScoreType()) //{ //进入房间时赋值为初始积分; // SCORE lScore = pTableInfo->lInitEnterRoomScore - pIServerUserItem->GetUserScore(); // pIServerUserItem->WriteUserScore(lScore, 0, 0, 0, SCORE_TYPE_PRESENT, 1, 0); //} return true; } //bool PriaveteGame::joinPrivateRoom(IServerUserItem * pIServerUserItem, ITableFrame * pICurrTableFrame) bool PriaveteGame::joinPrivateRoom(IServerUserItem * pIServerUserItem, PrivateTableInfo* pTableInfo, SCORE lUnionScore) { WORD wChairID = INVALID_CHAIR; ITableFrame * pICurrTableFrame = pTableInfo->pITableFrame; //椅子搜索 for (WORD i=0;iGetChairCount();i++) { if (pICurrTableFrame->GetTableUserItem(i)==NULL) { wChairID = i; break; } } //分配用户 if (wChairID!=INVALID_CHAIR) { //用户起立 if (pIServerUserItem->GetTableID()!=INVALID_TABLE) { return pIServerUserItem->GetTableID() == pICurrTableFrame->GetTableID(); } //用户坐下 if(pICurrTableFrame->PerformSitDownAction(wChairID,pIServerUserItem)==false) { return false; } // 记录欢乐积分 pTableInfo->lScoreInfoArray[wChairID] = lUnionScore; // 通知数据库写座位号; DBR_GR_WriteUnionRoomChairID JoinRoomUser; ZeroMemory(&JoinRoomUser, sizeof(JoinRoomUser)); JoinRoomUser.dwUnionConsumerID = pTableInfo->dwUnionConsumerID; JoinRoomUser.wChairID = wChairID; JoinRoomUser.dwUserID = pIServerUserItem->GetUserID(); m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_WRITE_UNION_CHAIRID, 0L, (BYTE*)&JoinRoomUser, sizeof(DBR_GR_WriteUnionRoomChairID)); return true; } return false; } //创建房间 bool PriaveteGame::OnEventCreatePrivate(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize,std::string kChannel) { //参数效验 if(pIServerUserItem==NULL) return true; if(wDataSize>sizeof(DBO_GR_CreatePrivateResoult)) return false; //提取数据 DBO_GR_CreatePrivateResoult* pPrivate = (DBO_GR_CreatePrivateResoult*)pData; DWORD dwAgaginTable = pPrivate->dwAgaginTable; //报名失败 if(pPrivate->bSucess==false) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,pPrivate->szDescribeString,SMT_EJECT); CTraceService::TraceString(pPrivate->szDescribeString, TraceLevel_Normal); return true; } if (pPrivate->bPlayCoutIdex >= 4) { return false; } //寻找位置 ITableFrame * pICurrTableFrame=NULL; PrivateTableInfo* pCurrTableInfo=NULL; if (dwAgaginTable != INVALID_DWORD) { pCurrTableInfo = getTableInfoByTableID(dwAgaginTable); if (!pCurrTableInfo) { return false; } pICurrTableFrame = pCurrTableInfo->pITableFrame; if (pCurrTableInfo->bInEnd == false) { //joinPrivateRoom(pIServerUserItem,pICurrTableFrame); joinPrivateRoom(pIServerUserItem, pCurrTableInfo, pPrivate->lUnionScore); return true; } else { pCurrTableInfo->restAgainValue(); sendPrivateRoomInfo(NULL,pCurrTableInfo); } } else { //WORD wTableID = 0; for (WORD wTableID = 0; wTableID < m_pGameServiceOption->wTableCount; wTableID++) { //获取对象 ASSERT(m_pTableInfo[wTableID].pITableFrame!=NULL); ITableFrame * pITableFrame=m_pTableInfo[wTableID].pITableFrame; if (m_pTableInfo[wTableID].bInEnd) continue; // 代开房间; if (m_pTableInfo[wTableID].m_dwDaikaiIndex == 0) { if (pITableFrame->GetNullChairCount() == pITableFrame->GetChairCount()) { pICurrTableFrame = pITableFrame; pCurrTableInfo = &m_pTableInfo[wTableID]; pCurrTableInfo->restValue(); break; } } } if (getTableInfoByCreaterID(pIServerUserItem->GetUserID())) { return true; } } //桌子判断 if(pICurrTableFrame==NULL) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("房间已满,创建房间失败。"),SMT_EJECT); return true; } if (m_pGameServiceOption->wServerID >= 90) { ASSERT(false); return true; } int iRandNum = m_allocationID.PopValue(); iRandNum = (m_pGameServiceOption->wServerID+10)*10000+iRandNum; pCurrTableInfo->dwPlayCout = (DWORD)m_kPrivateInfo.bPlayCout[pPrivate->bPlayCoutIdex]; if (pPrivate->cbRoomType == Type_Private) { pCurrTableInfo->dwPlayCost = (DWORD)m_kPrivateInfo.lPlayCost[pPrivate->bPlayCoutIdex]; } else { pCurrTableInfo->dwPlayCost = (DWORD)m_kPrivateInfo.lCostGold; } pCurrTableInfo->setRoomNum(iRandNum); pCurrTableInfo->dwCreaterUserID = pIServerUserItem->GetUserID(); pCurrTableInfo->dwUnionCode = pPrivate->dwUnionCode; pCurrTableInfo->kHttpChannel = kChannel; pCurrTableInfo->cbRoomType = pPrivate->cbRoomType; pCurrTableInfo->lCreateScore = pPrivate->lUnionScore; pCurrTableInfo->dwGameRuleIdex = pPrivate->bGameRuleIdex; pCurrTableInfo->bGameTypeIdex = pPrivate->bGameTypeIdex; pCurrTableInfo->bPlayCoutIdex = pPrivate->bPlayCoutIdex; GetLocalTime(&pCurrTableInfo->kTotalRecord.kPlayTime); pCurrTableInfo->cbEnterRoomScoreType = pPrivate->cbEnterRoomScoreType; pCurrTableInfo->lInitEnterRoomScore = pPrivate->lInitEnterRoomScore; pCurrTableInfo->cbBaseScore = pPrivate->cbBaseScore; pCurrTableInfo->cbUnionGoldOpen = pPrivate->cbUnionGoldOpen; pCurrTableInfo->lScoreMultiple = pPrivate->lScoreMultiple; pCurrTableInfo->lGameGold = pPrivate->lGameGold; if (pPrivate->dwAgaginTable == INVALID_DWORD) { pCurrTableInfo->kTotalRecord.iRecordID = pPrivate->dwRecordID; } tagPrivateFrameParameter PriavateFrame; PriavateFrame.dwCreaterUserID = pCurrTableInfo->dwCreaterUserID; PriavateFrame.dwRoomNum = pCurrTableInfo->dwRoomNum; PriavateFrame.dwPlayCost = pCurrTableInfo->dwPlayCost; PriavateFrame.cbGameTypeIdex = (BYTE)pCurrTableInfo->dwGameRuleIdex; PriavateFrame.cbGameCout = (BYTE)pCurrTableInfo->dwPlayCout; PriavateFrame.dwGameRule = pCurrTableInfo->dwGameRuleIdex; PriavateFrame.cbEnterRoomScoreType = pCurrTableInfo->cbEnterRoomScoreType; //进房间时的分数类型; PriavateFrame.lInitEnterRoomScore = pCurrTableInfo->lInitEnterRoomScore; //进入房间时的分数; PriavateFrame.cbBaseScore = pCurrTableInfo->cbBaseScore; PriavateFrame.cbUnionGoldOpen = pCurrTableInfo->cbUnionGoldOpen; PriavateFrame.lScoreMultiple = pCurrTableInfo->lScoreMultiple; PriavateFrame.lGameGold = pCurrTableInfo->lGameGold; pICurrTableFrame->SetPrivateInfo(PriavateFrame); //pICurrTableFrame->SetPrivateInfo(pCurrTableInfo->bGameTypeIdex,pCurrTableInfo->bGameRuleIdex); CMD_GF_Create_Private_Sucess kSucessInfo; kSucessInfo.lCurSocre = pPrivate->bSucess; kSucessInfo.dwRoomNum = pCurrTableInfo->dwRoomNum; SendData(pIServerUserItem,MDM_GR_PRIVATE,SUB_GR_CREATE_PRIVATE_SUCESS,&kSucessInfo,sizeof(kSucessInfo)); CString strTmp; strTmp.Format(_T("创建房间: %d, %d"), iRandNum, pPrivate->bPlayCoutIdex); CTraceService::TraceString(strTmp, TraceLevel_Normal); sendPrivateRoomInfo(NULL,pCurrTableInfo); // 通知数据库扣费; if (pPrivate->dwUnionCode != 0) { DBR_GR_Create_UnionRoom CreateUnionRoom; ZeroMemory(&CreateUnionRoom, sizeof(DBR_GR_Create_UnionRoom)); CreateUnionRoom.wServerID = m_pGameServiceOption->wServerID; CreateUnionRoom.dwUnionCode = pPrivate->dwUnionCode; CreateUnionRoom.dwRoomID = pCurrTableInfo->dwRoomNum; CreateUnionRoom.dwCreaterUserID = pCurrTableInfo->dwCreaterUserID; CreateUnionRoom.wKindID = m_pGameServiceAttrib->wKindID; CreateUnionRoom.dwCost = pCurrTableInfo->dwPlayCost; CreateUnionRoom.dwCostType = pCurrTableInfo->cbRoomType; CreateUnionRoom.dwGameRuleIdex = pCurrTableInfo->dwGameRuleIdex; CreateUnionRoom.bPlayCoutIdex = (BYTE)pCurrTableInfo->dwPlayCout; CreateUnionRoom.dwRecordID = pPrivate->dwRecordID; CreateUnionRoom.cbBaseScore = pPrivate->cbBaseScore; m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_CREATE_UNION_ROOM, 0L, (BYTE*)&CreateUnionRoom, sizeof(DBR_GR_Create_UnionRoom)); } else { DataStream kDataStream; pCurrTableInfo->kTotalRecord.StreamValue(kDataStream, true); m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_PRIVATE_GAME_RECORD, 0, &kDataStream[0], kDataStream.size()); } // 设置房主积分; PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (NULL == pTableInfo) return true; if (pTableInfo->bInEnd) return true; if (pTableInfo->IsSetOneTimeRoomScoreType()) { //进入房间时赋值为初始积分; SCORE lScore = pTableInfo->lInitEnterRoomScore - pIServerUserItem->GetUserScore(); pIServerUserItem->WriteUserScore(lScore, 0, 0, 0, SCORE_TYPE_PRESENT, 1, 0); } return true; } //创建私人场 bool PriaveteGame::OnTCPNetworkSubCreatePrivate(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize==sizeof(CMD_GR_Create_Private)); if(wDataSize!=sizeof(CMD_GR_Create_Private)) return false; // 判断服务器维护; if (CServerRule::IsForfendGameStart(m_pGameServiceOption->dwServerRule) == true) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("服务器即将维护,请关注微信群通知。"), SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK); return true; } CMD_GR_Create_Private* pCMDInfo = (CMD_GR_Create_Private*)pData; if (pIServerUserItem->GetTableID() != INVALID_TABLE) { SendData(pIServerUserItem, MDM_GR_PRIVATE, SUB_GR_PRIVATE_HAS_CREATED, NULL, 0); return true; } if(pCMDInfo->cbGameType == Type_Private) { DBR_GR_Create_Private kDBRInfo; kDBRInfo.dwUserID = pIServerUserItem->GetUserID(); kDBRInfo.wKindID = m_pGameServiceAttrib->wKindID; kDBRInfo.dwDaikaiIndex = 0; kDBRInfo.dwUnionCode = pCMDInfo->dwUnionCode; kDBRInfo.cbUnionGoldOpen = pCMDInfo->cbUnionGoldOpen; kDBRInfo.cbRoomType = Type_Private; kDBRInfo.dwCostType = Type_Private; kDBRInfo.dwAgaginTable = INVALID_DWORD; ASSERT(pCMDInfo->bPlayCoutIdex < 4); ASSERT(m_kPrivateInfo.lPlayCost[pCMDInfo->bPlayCoutIdex] != 0); kDBRInfo.dwCost = (DWORD)m_kPrivateInfo.lPlayCost[pCMDInfo->bPlayCoutIdex]; kDBRInfo.bPlayCoutIdex = pCMDInfo->bPlayCoutIdex; kDBRInfo.bGameRuleIdex = pCMDInfo->bGameRuleIdex; kDBRInfo.bGameTypeIdex = pCMDInfo->bGameTypeIdex; kDBRInfo.cbEnterRoomScoreType = pCMDInfo->cbEnterRoomScoreType; kDBRInfo.lInitEnterRoomScore = pCMDInfo->lInitEnterRoomScore; kDBRInfo.cbBaseScore = pCMDInfo->cbBaseScore; if ((kDBRInfo.bGameRuleIdex & ePrivateTableCommonRule_CardAA) == ePrivateTableCommonRule_CardAA) { if (m_pGameServiceAttrib->wChairCount > 0) { kDBRInfo.dwCost = kDBRInfo.dwCost / m_pGameServiceAttrib->wChairCount; } } CString strDebugInfo; strDebugInfo.Format(_T("dwUserID[%d], bPlayCoutIdex[%d], dwCost[%d], bPlayCoutIdex[%d], bGameRuleIdex[%d], bGameTypeIdex[%d]"), kDBRInfo.dwUserID, pCMDInfo->bPlayCoutIdex, kDBRInfo.dwCost, kDBRInfo.bPlayCoutIdex, kDBRInfo.bGameRuleIdex, kDBRInfo.bGameTypeIdex); ::OutputDebugString(strDebugInfo.GetBuffer()); m_pIDataBaseEngine->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_CREATE_PRIVAT, dwSocketID, &kDBRInfo, sizeof(DBR_GR_Create_Private)); } return true; } //创建代开信息 bool PriaveteGame::OnTCPNetworkSubAutoRoomInfo(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize == sizeof(CMD_GR_AutoRoomInfo)); if (wDataSize != sizeof(CMD_GR_AutoRoomInfo)) return false; // 判断服务器维护; if (CServerRule::IsForfendGameStart(m_pGameServiceOption->dwServerRule) == true) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("服务器即将维护,请关注微信群通知。"), SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK); return true; } CMD_GR_AutoRoomInfo* pCMDInfo = (CMD_GR_AutoRoomInfo*)pData; ASSERT(pCMDInfo->dwUserID == pIServerUserItem->GetUserID()); if (pCMDInfo->cbGameType == Type_Private) { DBR_GR_AutoRoomInfo kDBRInfo; kDBRInfo.dwUserID = pCMDInfo->dwUserID; kDBRInfo.wKindID = m_pGameServiceAttrib->wKindID; kDBRInfo.wServerID = m_pGameServiceOption->wServerID; kDBRInfo.cbGameType = pCMDInfo->cbGameType; ASSERT(pCMDInfo->bPlayCoutIdex < 4); ASSERT(m_kPrivateInfo.lPlayCost[pCMDInfo->bPlayCoutIdex] != 0); kDBRInfo.bPlayCoutIdex = pCMDInfo->bPlayCoutIdex; kDBRInfo.bPlayCout = m_kPrivateInfo.bPlayCout[pCMDInfo->bPlayCoutIdex]; kDBRInfo.bGameRuleIdex = pCMDInfo->bGameRuleIdex; kDBRInfo.bGameTypeIdex = pCMDInfo->bGameTypeIdex; kDBRInfo.cbEnterRoomScoreType = pCMDInfo->cbEnterRoomScoreType; kDBRInfo.lInitEnterRoomScore = pCMDInfo->lInitEnterRoomScore; kDBRInfo.cbBaseScore = pCMDInfo->cbBaseScore; m_pIDataBaseEngine->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_ADD_AUTO_ROOM_INFO, dwSocketID, &kDBRInfo, sizeof(DBR_GR_AutoRoomInfo)); } return true; } //增加自动开房信息成功; bool PriaveteGame::OnEventAddAutoRoomSucc(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { ASSERT(wDataSize == sizeof(CMD_GR_AutoCreatePrivate)); if (pIServerUserItem == nullptr) return false; if (wDataSize != sizeof(CMD_GR_AutoCreatePrivate)) return false; CMD_GR_AutoCreatePrivate AutoCreate; memcpy(&AutoCreate, pData, wDataSize); // 查找列表中是否存在该记录;m_UnionRoomList for (int i = 0; i < (int)m_UnionRoomList.kList.size(); i++) { CMD_GR_AutoCreatePrivate& kInfo = m_UnionRoomList.kList[i]; if (kInfo.dwIndex == AutoCreate.dwIndex) { return false; } } // 不存在加入列表,然后创建房间; AutoCreateUnionRoom(AutoCreate); m_UnionRoomList.kList.push_back(AutoCreate); // 通知客户端增加成功; SendAddAutoResult(pIServerUserItem, TEXT("添加代开信息成功!"), 0); return true; } //发送增加自动开房结果; bool PriaveteGame::SendAddAutoResult(IServerUserItem * pIServerUserItem, LPCTSTR pszString, LONG lErrorCode) { //变量定义 CMD_GR_AutoResulte autoFailure; ZeroMemory(&autoFailure, sizeof(autoFailure)); //构造数据 autoFailure.lErrorCode = lErrorCode; lstrcpyn(autoFailure.szDescribeString, pszString, CountArray(autoFailure.szDescribeString)); //数据属性 WORD wDataSize = CountStringBuffer(autoFailure.szDescribeString); WORD wHeadSize = sizeof(autoFailure) - sizeof(autoFailure.szDescribeString); //发送数据 return SendData(pIServerUserItem, MDM_GR_PRIVATE, SUB_GR_CREATE_AUTO_RESULTE, &autoFailure, wHeadSize + wDataSize); } //删除代开信息 bool PriaveteGame::OnTCPNetworkSubDelAutoRoomInfo(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize == sizeof(CMD_GP_DelAutoRoomInfo)); if (wDataSize != sizeof(CMD_GP_DelAutoRoomInfo)) return false; CMD_GP_DelAutoRoomInfo* pDelAutoInfo = (CMD_GP_DelAutoRoomInfo*)pData; if (pDelAutoInfo->wServerID != m_pGameServiceOption->wServerID) return false; // 删除内存数据; bool bHasAutoRoomInfo = false; for (std::vector::iterator iter = m_UnionRoomList.kList.begin(); iter != m_UnionRoomList.kList.end(); iter++) { if ((*iter).dwIndex == pDelAutoInfo->dwIndex) { iter = m_UnionRoomList.kList.erase(iter); bHasAutoRoomInfo = true; break; } } if (bHasAutoRoomInfo) { // 解散内存房间; for (int i = 0; i < m_pGameServiceOption->wTableCount; i++) { PrivateTableInfo* pTableInfo = &m_pTableInfo[i]; //已经创建并且没有开始的桌子 if (pTableInfo->dwCreaterUserID > 0 && !pTableInfo->bStart) { if ((pTableInfo->dwGameRuleIdex&ePrivateTableCommonRule_DaiKaiFang) == ePrivateTableCommonRule_DaiKaiFang) { if (pTableInfo->m_dwDaikaiIndex == pDelAutoInfo->dwIndex) { DismissRoom(pTableInfo); break; } } } } // 删除数据库数据; DBO_GR_DelAutoRoomInfo DelAutoRoomInfo; DelAutoRoomInfo.dwUserID = pIServerUserItem->GetUserID(); DelAutoRoomInfo.dwIndex = pDelAutoInfo->dwIndex; DelAutoRoomInfo.wServerID = pDelAutoInfo->wServerID; m_pIDataBaseEngine->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_DEL_AUTO_ROOM_INFO, dwSocketID, &DelAutoRoomInfo, sizeof(DelAutoRoomInfo)); //SendAddAutoResult(pIServerUserItem, TEXT("删除代开信息完成!"), 0); } else { SendAddAutoResult(pIServerUserItem, TEXT("抱歉,未找到代开信息!"), 1); } return true; } //自由人数玩家状态,玩家可以准备; bool PriaveteGame::OnTCPNetworkSubAutoUserStatus(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); //if (!pTableInfo) //{ // return false; //} //// 结束了或者已经开始了,就不处理该消息; //if (pTableInfo->bInEnd || pTableInfo->bStart) //{ // return true; //} //WORD wChairID = pIServerUserItem->GetChairID(); //if (wChairID == INVALID_CHAIR) return false; //pTableInfo->bAutoStart[wChairID] = true; //// 发送状态; //SendAutoUserStatus(pTableInfo); return true; } //自由人数准备状态 bool PriaveteGame::OnTCPNetworkSubAutoUserReady(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize == sizeof(CMD_GR_Private_Ready)); if (wDataSize != sizeof(CMD_GR_Private_Ready)) return false; CMD_GR_Private_Ready* pCMDInfo = (CMD_GR_Private_Ready*)pData; PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return false; } // 结束了或者已经开始了,就不处理该消息; if (pTableInfo->bInEnd || pTableInfo->bStart) { return true; } WORD wChairID = pIServerUserItem->GetChairID(); WORD wTableID = pIServerUserItem->GetTableID(); if (wChairID == INVALID_CHAIR || wTableID == INVALID_CHAIR) return false; // 第一个申请开始人; if (pCMDInfo->bStart && pTableInfo->mReadyInfo.wChairID == INVALID_CHAIR) { pTableInfo->mReadyInfo.wChairID = wChairID; } // 准备; if (pCMDInfo->bReady && pIServerUserItem->GetUserStatus()== US_SIT) { // 玩家准备; pIServerUserItem->SetUserStatus(US_READY, wTableID, wChairID); pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_READY; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_READY, &pTableInfo->mReadyInfo, sizeof(pTableInfo->mReadyInfo)); } else { // 玩家准备; //pIServerUserItem->SetUserStatus(US_READY, wTableID, wChairID); ITableFrame* pITableFrame = pTableInfo->pITableFrame; if (pTableInfo == nullptr) return true; WORD wChairCount = pITableFrame->GetChairCount(); for (int i = 0; i < wChairCount; i++) { IServerUserItem * pServerItem = pITableFrame->GetTableUserItem(i); if (pServerItem == nullptr) continue; if (pServerItem->GetUserStatus() == US_READY) { pIServerUserItem->SetUserStatus(US_SIT, wTableID, i); } } pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_REFUSED; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_READY, &pTableInfo->mReadyInfo, sizeof(pTableInfo->mReadyInfo)); } return true; } //重新加入私人场 bool PriaveteGame::OnTCPNetworkSubAgainEnter(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize==sizeof(CMD_GR_Again_Private)); if(wDataSize!=sizeof(CMD_GR_Again_Private)) return false; CMD_GR_Again_Private* pCMDInfo = (CMD_GR_Again_Private*)pData; PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } if (!pTableInfo->bInEnd && pTableInfo->dwRoomNum != 0) { //joinPrivateRoom(pIServerUserItem,pTableInfo->pITableFrame); joinPrivateRoom(pIServerUserItem, pTableInfo, 0); return true; } DBR_GR_Create_Private kDBRInfo; ZeroMemory(&kDBRInfo,sizeof(kDBRInfo)); kDBRInfo.cbRoomType = pTableInfo->cbRoomType; kDBRInfo.dwUserID = pIServerUserItem->GetUserID(); kDBRInfo.wKindID = m_pGameServiceAttrib->wKindID; kDBRInfo.dwCost = (DWORD)m_kPrivateInfo.lPlayCost[pTableInfo->bPlayCoutIdex]; kDBRInfo.dwAgaginTable = pIServerUserItem->GetTableID(); m_pIDataBaseEngine->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_CREATE_PRIVAT, dwSocketID, &kDBRInfo, sizeof(DBR_GR_Create_Private)); return true; } //加入私人场 bool PriaveteGame::OnTCPNetworkSubJoinPrivate(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //参数效验 ASSERT(wDataSize==sizeof(CMD_GR_Join_Private)); if(wDataSize!=sizeof(CMD_GR_Join_Private)) return false; // 判断服务器维护; if (CServerRule::IsForfendGameStart(m_pGameServiceOption->dwServerRule) == true) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("服务器即将维护,请关注微信群通知。"), SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK); return true; } bool bRet = true; CString strMessage; CMD_GR_Join_Private* pCMDInfo = (CMD_GR_Join_Private*)pData; PrivateTableInfo* pTableInfo = getTableInfoByRoomID(pCMDInfo->dwRoomNum); do { if (!pTableInfo) { bRet = false; strMessage = TEXT("对不起,没有找到该房间,可能房主已经退出。"); break; } if (pTableInfo->pITableFrame->GetNullChairCount() <= 0) { bRet = false; strMessage = TEXT("对不起,游戏人数已满,无法加入。"); break; } if (pTableInfo->bStart || pTableInfo->bInEnd) { bRet = false; strMessage = TEXT("对不起,游戏已经开始,无法加入。"); break; } BYTE cbStartMode = pTableInfo->GetStartMode(); if ((cbStartMode == START_MODE_FULL_READY) && (pTableInfo->bStart || pTableInfo->bInEnd)) { bRet = false; strMessage = TEXT("对不起,游戏已经开始,无法加入。"); break; } if (!pTableInfo->IsCanJoinTable(pIServerUserItem, strMessage)) { bRet = false; break; } } while (0); if (!bRet) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, strMessage, SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK); return true; } // 是工会房; if (pTableInfo->dwUnionCode != 0) { if (pIServerUserItem->GetUserID() == pTableInfo->dwCreaterUserID) { joinPrivateRoom(pIServerUserItem, pTableInfo, pTableInfo->lCreateScore); } else { DBR_GR_JoinUnionRoom JoinUnionRoom; ZeroMemory(&JoinUnionRoom, sizeof(JoinUnionRoom)); JoinUnionRoom.dwUnionCode = pTableInfo->dwUnionCode; JoinUnionRoom.dwUserID = pIServerUserItem->GetUserID(); JoinUnionRoom.dwRoomID = pTableInfo->dwRoomNum; JoinUnionRoom.wKindID = m_pGameServiceAttrib->wKindID; JoinUnionRoom.cbUnionGoldOpen = pTableInfo->cbUnionGoldOpen; m_pIDataBaseEngine->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_JOIN_UNION_ROOM, dwSocketID, &JoinUnionRoom, sizeof(DBR_GR_JoinUnionRoom)); } } else { //joinPrivateRoom(pIServerUserItem, pTableInfo->pITableFrame); joinPrivateRoom(pIServerUserItem, pTableInfo, 0); } //if (!joinPrivateRoom(pIServerUserItem,pTableInfo->pITableFrame)) //{ // //m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("加入房间失败。"), SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK); //} return true; } bool PriaveteGame::OnTCPNetworkSubDismissPrivate(VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { //CTraceService::TraceString(TEXT("SUB_GR_PRIVATE_DISMISS"),TraceLevel_Normal); //参数效验 ASSERT(wDataSize==sizeof(CMD_GR_Dismiss_Private)); if(wDataSize!=sizeof(CMD_GR_Dismiss_Private)) return false; CMD_GR_Dismiss_Private* pCMDInfo = (CMD_GR_Dismiss_Private*)pData; PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return false; } if (!pTableInfo->bStart && pTableInfo->dwCreaterUserID != pIServerUserItem->GetUserID()) { return true; } if (pTableInfo->bInEnd) { return true; } #if _DEBUG #else // 游戏开始不到2分钟不可以解散; if (pTableInfo->bStart && !pTableInfo->IsDismissRoom()) { //变量定义 CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //构造数据 RequestFailure.lErrorCode = SMT_EJECT; lstrcpyn(RequestFailure.szDescribeString, TEXT("无离线玩家或玩家离线不足2分钟,无法解散房间!"), CountArray(RequestFailure.szDescribeString)); //发送数据 WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); WORD wHeadSize = sizeof(RequestFailure)-sizeof(RequestFailure.szDescribeString); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, &RequestFailure, wHeadSize + wDataSize); return true; } #endif // 没人申请解散,不需要拒绝解散; if (pTableInfo->kDismissChairID.size() == 0 && !pCMDInfo->bDismiss) { return true; } // 解散房间; if(pCMDInfo->bDismiss) { for (int i = 0;i<(int)pTableInfo->kDismissChairID.size();i++) { if (pTableInfo->kDismissChairID[i] == pIServerUserItem->GetChairID()) { return true; } } pTableInfo->kDismissChairID.push_back(pIServerUserItem->GetChairID()); } else { // 拒绝解散; for (int i = 0;i<(int)pTableInfo->kNotAgreeChairID.size();i++) { if (pTableInfo->kNotAgreeChairID[i] == pIServerUserItem->GetChairID()) { return true; } } pTableInfo->kNotAgreeChairID.push_back(pIServerUserItem->GetChairID()); } // 解散信息发生给客户端; CMD_GF_Private_Dismiss_Info kNetInfo; kNetInfo.dwDissUserCout = pTableInfo->kDismissChairID.size(); kNetInfo.dwNotAgreeUserCout = pTableInfo->kNotAgreeChairID.size(); for (int i = 0;i<(int)pTableInfo->kDismissChairID.size();i++) { kNetInfo.dwDissChairID[i] = pTableInfo->kDismissChairID[i]; } for (int i = 0;i<(int)pTableInfo->kNotAgreeChairID.size();i++) { kNetInfo.dwNotAgreeChairID[i] = pTableInfo->kNotAgreeChairID[i]; } SendTableData(pTableInfo->pITableFrame,MDM_GR_PRIVATE,SUB_GR_PRIVATE_DISMISS,&kNetInfo,sizeof(kNetInfo)); // 有人拒绝解散; //if (pTableInfo->kNotAgreeChairID.size() >= 2) if (pTableInfo->kNotAgreeChairID.size() > 0) { pTableInfo->kNotAgreeChairID.clear(); pTableInfo->kDismissChairID.clear(); pTableInfo->fDismissPastTime = 0; CMD_GF_Private_Dismiss_Result mResult; mResult.bSuccess = false; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_PRIVATE_DISMISS_RESULT, &mResult, sizeof(mResult)); } // 解散游戏; if (!pTableInfo->bStart || (int)kNetInfo.dwDissUserCout >= (int)pTableInfo->pITableFrame->GetSitUserCount()-1) { CMD_GF_Private_Dismiss_Result mResult; mResult.bSuccess = true; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_PRIVATE_DISMISS_RESULT, &mResult, sizeof(mResult)); //pTableInfo->pITableFrame->SendGameMessage(TEXT("房间已被解散!"),SMT_EJECT); DismissRoom(pTableInfo); ClearRoom(pTableInfo); } return true; } //比赛事件 bool PriaveteGame::OnEventSocketPrivate(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_GR_PRIVATE_INFO: //私人场信息 { SendData(pIServerUserItem,MDM_GR_PRIVATE,SUB_GR_PRIVATE_INFO,&m_kPrivateInfo,sizeof(m_kPrivateInfo)); return true; } case SUB_GR_CREATE_PRIVATE: //创建私人场 { return OnTCPNetworkSubCreatePrivate(pData,wDataSize,pIServerUserItem,dwSocketID); } case SUB_GR_RIVATE_AGAIN: //重新加入私人场 { return OnTCPNetworkSubAgainEnter(pData,wDataSize,pIServerUserItem,dwSocketID); } case SUB_GR_JOIN_PRIVATE: //加入私人场 { return OnTCPNetworkSubJoinPrivate(pData,wDataSize,pIServerUserItem,dwSocketID); } case SUB_GR_PRIVATE_DISMISS: //解散 { return OnTCPNetworkSubDismissPrivate(pData,wDataSize,pIServerUserItem,dwSocketID); } case SUB_GR_CREATE_AUTO_ROOM: { return OnTCPNetworkSubAutoRoomInfo(pData, wDataSize, pIServerUserItem, dwSocketID); } case SUB_GR_DEL_AUTO_ROOM_INFO: { return OnTCPNetworkSubDelAutoRoomInfo(pData, wDataSize, pIServerUserItem, dwSocketID); } case SUB_GR_AUTO_USER_STATUS: { return OnTCPNetworkSubAutoUserStatus(pData, wDataSize, pIServerUserItem, dwSocketID); } case SUB_GR_AUTO_USER_READY: { return OnTCPNetworkSubAutoUserReady(pData, wDataSize, pIServerUserItem, dwSocketID); } } return true; } //重置桌位 void PriaveteGame::DismissRoom(PrivateTableInfo* pTableInfo) { ASSERT(pTableInfo!=NULL); if (pTableInfo==NULL) return; ITableFrame* pTableFrame=pTableInfo->pITableFrame; ASSERT(pTableFrame!=NULL); if (pTableFrame==NULL) return; //强制解散游戏 if (pTableFrame->IsGameStarted()==true) { bool bSuccess=pTableFrame->DismissGame(); if (bSuccess==false) { CTraceService::TraceString(TEXT("PriaveteGame 解散游戏 失败!"),TraceLevel_Exception); return; } } m_allocationID.PushValue(pTableInfo->dwRoomNum % 10000); // 如果是第一局没结束就解散,需要到数据库返还工会房卡; if (!pTableInfo->bStart || (pTableInfo->dwStartPlayCout < 1)) { DBR_GR_DismissUnionRoom DismissUnionRoom; ZeroMemory(&DismissUnionRoom, sizeof(DismissUnionRoom)); DismissUnionRoom.dwUnionCode = pTableInfo->dwUnionCode; DismissUnionRoom.dwUnionConsumerID = pTableInfo->dwUnionConsumerID; DismissUnionRoom.dwCost = pTableInfo->dwPlayCost; m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_DISMISS_UNION_ROOM, 0L, (BYTE*)&DismissUnionRoom, sizeof(DismissUnionRoom)); } pTableInfo->bInEnd = true; if (pTableInfo->bStart) { SendGamePrivateEndInfo(pTableInfo); CalcUnionScore(pTableInfo); pTableInfo->bInEnd = true; pTableInfo->dwCreaterUserID = 0; pTableInfo->dwUnionCode = 0; // 工会ID pTableInfo->dwUnionConsumerID = 0; // 消耗记录ID //清除每局的记录只向0.数据库记录总的记录; pTableInfo->kTotalRecord.kRecordChild.clear(); DataStream kDataStream; pTableInfo->kTotalRecord.StreamValue(kDataStream,true); m_pIDataBaseEngine->PostDataBaseRequest(0,DBR_GR_PRIVATE_GAME_RECORD,0,&kDataStream[0],kDataStream.size()); pTableInfo->bStart = false; sendPrivateRoomInfo(NULL,pTableInfo); gameEnd(pTableInfo); } else { ClearRoom(pTableInfo); } CString strTmp; strTmp.Format(_T("解散房间: %d"), pTableInfo->dwRoomNum); CTraceService::TraceString(strTmp, TraceLevel_Normal); return; } void PriaveteGame::ClearRoom(PrivateTableInfo* pTableInfo) { ASSERT(pTableInfo!=NULL); if (pTableInfo==NULL) return; ITableFrame* pTableFrame=pTableInfo->pITableFrame; ASSERT(pTableFrame!=NULL); if (pTableFrame==NULL) return; //该桌用户全部离开 for (int i=0;iGetChairCount();i++) { IServerUserItem* pUserItem=pTableFrame->GetTableUserItem(i); if(pUserItem&&pUserItem->GetTableID()!=INVALID_TABLE) { pTableFrame->PerformStandUpActionEx(pUserItem); } } pTableInfo->restValue(); } //发送私人场结束消息,结算信息来自每个游戏内部; void PriaveteGame::SendGamePrivateEndInfo(PrivateTableInfo* pTableInfo) { ITableFrame* pTableFrame = pTableInfo->pITableFrame; ASSERT(pTableFrame != NULL); if (pTableFrame == NULL) return; DataStream kDataStream; pTableFrame->GetPrivateEndInfo(kDataStream, true); if (kDataStream.size() > 0) { SendTableData(pTableFrame, MDM_GR_PRIVATE, SUB_GF_GM_PRIVATE_END, &kDataStream[0], kDataStream.size()); } } //用户积分 bool PriaveteGame::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason) { //效验参数 ASSERT(pIServerUserItem!=NULL); if (pIServerUserItem==NULL) return false; m_pIServerUserItemSink->OnEventUserItemScore(pIServerUserItem,cbReason); return true; } //用户状态 bool PriaveteGame::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID) { if(m_pIServerUserItemSink!=NULL) { return m_pIServerUserItemSink->OnEventUserItemStatus(pIServerUserItem,wOldTableID,wOldChairID); } return true; } //用户权限 bool PriaveteGame::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight,bool bGameRight) { if(m_pIServerUserItemSink!=NULL) { return m_pIServerUserItemSink->OnEventUserItemRight(pIServerUserItem,dwAddRight,dwRemoveRight,bGameRight); } return true; } //用户登录 bool PriaveteGame::OnEventUserLogon(IServerUserItem * pIServerUserItem) { return true; } //用户登出 bool PriaveteGame::OnEventUserLogout(IServerUserItem * pIServerUserItem) { return true; } //进入事件 bool PriaveteGame::OnEventEnterPrivate(DWORD dwSocketID ,VOID* pData,DWORD dwUserIP, bool bIsMobile) { //手机用户 if(bIsMobile == true) { //处理消息 CMD_GR_LogonMobile * pLogonMobile=(CMD_GR_LogonMobile *)pData; pLogonMobile->szPassword[CountArray(pLogonMobile->szPassword)-1]=0; pLogonMobile->szMachineID[CountArray(pLogonMobile->szMachineID)-1]=0; //变量定义 DBR_GR_LogonMobile LogonMobile; ZeroMemory(&LogonMobile,sizeof(LogonMobile)); //构造数据 LogonMobile.dwUserID=pLogonMobile->dwUserID; LogonMobile.dwClientAddr=dwUserIP; LogonMobile.cbDeviceType=pLogonMobile->cbDeviceType; LogonMobile.wBehaviorFlags=pLogonMobile->wBehaviorFlags; LogonMobile.wPageTableCount=pLogonMobile->wPageTableCount; lstrcpyn(LogonMobile.szPassword,pLogonMobile->szPassword,CountArray(LogonMobile.szPassword)); lstrcpyn(LogonMobile.szMachineID,pLogonMobile->szMachineID,CountArray(LogonMobile.szMachineID)); //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(LogonMobile.dwUserID,DBR_GR_LOGON_MOBILE,dwSocketID,&LogonMobile,sizeof(LogonMobile)); } else { //处理消息 CMD_GR_LogonUserID * pLogonUserID=(CMD_GR_LogonUserID *)pData; pLogonUserID->szPassword[CountArray(pLogonUserID->szPassword)-1]=0; pLogonUserID->szMachineID[CountArray(pLogonUserID->szMachineID)-1]=0; //变量定义 DBR_GR_LogonUserID LogonUserID; ZeroMemory(&LogonUserID,sizeof(LogonUserID)); //构造数据 LogonUserID.dwClientAddr=dwUserIP; LogonUserID.dwUserID=pLogonUserID->dwUserID; lstrcpyn(LogonUserID.szPassword,pLogonUserID->szPassword,CountArray(LogonUserID.szPassword)); lstrcpyn(LogonUserID.szMachineID,pLogonUserID->szMachineID,CountArray(LogonUserID.szMachineID)); //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(LogonUserID.dwUserID,DBR_GR_LOGON_USERID,dwSocketID,&LogonUserID,sizeof(LogonUserID)); } return true; } bool PriaveteGame::AddPrivateAction(ITableFrame* pTbableFrame,DWORD dwChairID, BYTE bActionIdex) { //PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pTbableFrame); //ASSERT(pTableInfo); //if (!pTableInfo) //{ // return true; //} //if (dwChairID >= 100 || bActionIdex >= MAX_PRIVATE_ACTION) //{ // return true; //} //pTableInfo->lPlayerAction[dwChairID][bActionIdex] ++; return true; } //是不是自由人数场 bool PriaveteGame::IsAutoUserCountRule(ITableFrame* pTbableFrame, bool bReal) { PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pTbableFrame); ASSERT(pTableInfo); if (!pTableInfo) { return false; } if (bReal == false) { if (pTableInfo->bStart || pTableInfo->bInEnd) { return false; } } return pTableInfo->IsAutoUserCountRule(); } bool PriaveteGame::addPrivatePlayCout(ITableFrame* pTbableFrame, WORD wCout) { PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pTbableFrame); ASSERT(pTableInfo); if (!pTableInfo) { return true; } pTableInfo->dwFinishPlayCout += wCout; return true; } //用户 bool PriaveteGame::OnEventUserJoinPrivate(IServerUserItem * pIServerUserItem, BYTE cbReason,DWORD dwSocketID) { //参数校验 ASSERT(pIServerUserItem!=NULL); if (pIServerUserItem == NULL) return false; SendData(pIServerUserItem,MDM_GR_PRIVATE,SUB_GR_PRIVATE_INFO,&m_kPrivateInfo,sizeof(m_kPrivateInfo)); PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); //判断状态 if(pIServerUserItem->GetTableID()!=INVALID_TABLE) { sendPrivateRoomInfo(pIServerUserItem,getTableInfoByTableID(pIServerUserItem->GetTableID())); } return true; } //用户退赛 bool PriaveteGame::OnEventUserQuitPrivate(IServerUserItem * pIServerUserItem, BYTE cbReason, WORD *pBestRank, DWORD dwContextID) { ASSERT(pIServerUserItem!=NULL); if (pIServerUserItem==NULL) return false; return true; } //游戏开始 bool PriaveteGame::OnEventGameStart(ITableFrame *pITableFrame, WORD wChairCount) { PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pITableFrame); ASSERT(pTableInfo); if (!pTableInfo) return true; // 是工会房间通知数据库扣费; if ((pTableInfo->dwUnionCode != 0) && !pTableInfo->bStart) { ITableFrame* pTableFrame = pTableInfo->pITableFrame; if (NULL != pTableFrame) { DBR_GR_UnionRoomUser UnionRoomUser; ZeroMemory(&UnionRoomUser, sizeof(DBR_GR_UnionRoomUser)); UnionRoomUser.dwUnionConsumerID = pTableInfo->dwUnionConsumerID; UnionRoomUser.CreateUnionRoom.dwUnionCode = pTableInfo->dwUnionCode; UnionRoomUser.CreateUnionRoom.dwRoomID = pTableInfo->dwRoomNum; UnionRoomUser.CreateUnionRoom.dwCreaterUserID = pTableInfo->dwCreaterUserID; UnionRoomUser.CreateUnionRoom.wKindID = m_pGameServiceAttrib->wKindID; UnionRoomUser.CreateUnionRoom.dwCost = pTableInfo->dwPlayCost; UnionRoomUser.CreateUnionRoom.dwCostType = pTableInfo->cbRoomType; UnionRoomUser.CreateUnionRoom.dwGameRuleIdex = pTableInfo->dwGameRuleIdex; WORD nUserCount = pTableFrame->GetChairCount(); for (int i = 0; i < nUserCount; i++) { IServerUserItem* pServerUserItem = pTableFrame->GetTableUserItem(i); if (NULL == pServerUserItem) continue; //if (pTableInfo->dwCreaterUserID != INVALID_TABLE && pTableInfo->dwCreaterUserID == pServerUserItem->GetUserID()) continue; UnionRoomUser.dwUserID[UnionRoomUser.cbUserCount++] = pServerUserItem->GetUserID(); } m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_UNION_ROOM_USER, 0L, (BYTE*)&UnionRoomUser, sizeof(UnionRoomUser)); } // 自动代开; if ((pTableInfo->dwGameRuleIdex&ePrivateTableCommonRule_DaiKaiFang) > 0) { CMD_GR_AutoCreatePrivate CreatePrivate; CreatePrivate.dwIndex = pTableInfo->m_dwDaikaiIndex; CreatePrivate.dwUnionCode = pTableInfo->dwUnionCode; //工会ID CreatePrivate.cbUnionGoldOpen = pTableInfo->cbUnionGoldOpen; // 1 欢乐场, 0普通; CreatePrivate.cbGameType = pTableInfo->cbRoomType; //游戏类型 CreatePrivate.bPlayCoutIdex = pTableInfo->bPlayCoutIdex; //游戏局数 CreatePrivate.bGameTypeIdex = pTableInfo->bGameTypeIdex; //游戏类型 CreatePrivate.bGameRuleIdex = pTableInfo->dwGameRuleIdex; //游戏规则 CreatePrivate.cbEnterRoomScoreType = pTableInfo->cbEnterRoomScoreType; //进房间时的分数类型; CreatePrivate.lInitEnterRoomScore = pTableInfo->lInitEnterRoomScore; //进入房间时的分数; CreatePrivate.cbBaseScore = pTableInfo->cbBaseScore; AutoCreateUnionRoom(CreatePrivate); } } pTableInfo->dwStartPlayCout ++; pTableInfo->bStart = true; pTableInfo->newRandChild(); sendPrivateRoomInfo(NULL,pTableInfo); // 显示游戏开始; CString strDebugInfo = _T(""); strDebugInfo.Format("EventGameStart RoomID = %d, TableID = %d", pTableInfo->dwRoomNum, pITableFrame->GetTableID()); ::OutputDebugString(strDebugInfo.GetBuffer()); return true; } //游戏结束 bool PriaveteGame::OnEventGameEnd(ITableFrame *pITableFrame,WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { ASSERT(pITableFrame!=NULL); if (pITableFrame==NULL) return false; PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pITableFrame); if (!pTableInfo) { return true; } if (pTableInfo->cbRoomType == Type_Private) { // 显示游戏开始; CString strDebugInfo = _T(""); strDebugInfo.Format("EventGameEnd RoomID = %d, TableID = %d", pTableInfo->dwRoomNum, pITableFrame->GetTableID()); ::OutputDebugString(strDebugInfo.GetBuffer()); // 一局没结束提前解散不扣房卡; if ((cbReason != GER_DISMISS) && (pTableInfo->dwStartPlayCout == 1)) { CreatePrivateCost(pTableInfo); } if (pITableFrame->IsPrivateEnd()) { DismissRoom(pTableInfo); return true; } sendPrivateRoomInfo(NULL, pTableInfo); } else if (pTableInfo->cbRoomType == Type_Public) { CreatePrivateCost(pTableInfo); DismissRoom(pTableInfo); ClearRoom(pTableInfo); } return true; } //记录游戏积分 bool PriaveteGame::WriteTableScore(ITableFrame* pITableFrame,tagScoreInfo ScoreInfoArray[], WORD wScoreCount,DataStream& kData) { PrivateTableInfo* pTableInfo = getTableInfoByTableFrame(pITableFrame); if (!pTableInfo) { return true; } // 插入私人场信息; tagGameRecord gameRecord; gameRecord.StreamValue(kData, false); gameRecord.roomInfo.cbRoomType = pTableInfo->cbRoomType; gameRecord.roomInfo.bStartGame = pTableInfo->bStart; gameRecord.roomInfo.dwRoomNum = pTableInfo->dwRoomNum; gameRecord.roomInfo.dwPlayCout = pTableInfo->dwFinishPlayCout - 1; // 减去当局的局数; gameRecord.roomInfo.dwCreateUserID = pTableInfo->dwCreaterUserID; gameRecord.roomInfo.bGameRuleIdex = pTableInfo->dwGameRuleIdex; gameRecord.roomInfo.bGameTypeIdex = pTableInfo->bGameTypeIdex; gameRecord.roomInfo.bPlayCoutIdex = pTableInfo->bPlayCoutIdex; gameRecord.roomInfo.dwPlayTotal = pTableInfo->dwPlayCout; DataStream tmpGameRecord; gameRecord.StreamValue(tmpGameRecord, true); pTableInfo->writeSocre(ScoreInfoArray, wScoreCount, tmpGameRecord); //写入单一一场数据到数据库; std::vector& refkRecordChild = pTableInfo->kTotalRecord.kRecordChild; if (refkRecordChild.size() > 0) { tagPrivateRandRecordChild& refkSingleRecord = refkRecordChild.back(); refkSingleRecord.iRecordID = pTableInfo->kTotalRecord.iRecordID; // 玩家ID; CString strUserIDs = ""; WORD nUserCount = pITableFrame->GetChairCount(); for (int i = 0; i < nUserCount; i++) { IServerUserItem* pServerUserItem = pITableFrame->GetTableUserItem(i); if (NULL == pServerUserItem) continue; CString strTmp = ""; if (!strUserIDs.IsEmpty()) { strTmp.Format(",%d", pServerUserItem->GetUserID()); } else { strTmp.Format("%d", pServerUserItem->GetUserID()); } strUserIDs += strTmp; } refkSingleRecord.kUserDefine = strUserIDs; DataStream singleGameRecordData; refkSingleRecord.StreamValue(singleGameRecordData, true); m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_SINGLE_PRIVATE_RECORD, 0L, (BYTE*)&singleGameRecordData[0], singleGameRecordData.size()); } return true; } //发送房间信息; void PriaveteGame::sendPrivateRoomInfo(IServerUserItem * pIServerUserItem,PrivateTableInfo* pTableInfo) { ASSERT(pTableInfo); if (!pTableInfo) { return; } CMD_GF_Private_Room_Info kNetInfo; kNetInfo.cbRoomType = pTableInfo->cbRoomType; kNetInfo.bStartGame = pTableInfo->bStart; kNetInfo.dwRoomNum = pTableInfo->dwRoomNum; //kNetInfo.dwPlayCout = pTableInfo->dwStartPlayCout; kNetInfo.dwPlayCout = pTableInfo->dwFinishPlayCout; kNetInfo.dwCreateUserID = pTableInfo->dwCreaterUserID; kNetInfo.dwUnionCode = pTableInfo->dwUnionCode; kNetInfo.bGameRuleIdex = pTableInfo->dwGameRuleIdex; kNetInfo.bGameTypeIdex = pTableInfo->bGameTypeIdex; kNetInfo.bPlayCoutIdex = pTableInfo->bPlayCoutIdex; kNetInfo.dwPlayTotal = pTableInfo->dwPlayCout; kNetInfo.dwPlayCost = pTableInfo->dwPlayCost; kNetInfo.cbUnionGoldOpen = pTableInfo->cbUnionGoldOpen; kNetInfo.lScoreMultiple = pTableInfo->lScoreMultiple; kNetInfo.lGameGold = pTableInfo->lGameGold; kNetInfo.cbBaseScore = pTableInfo->cbBaseScore; kNetInfo.kWinLoseScore.resize(pTableInfo->pITableFrame->GetChairCount()); //kNetInfo.kScoreInfoArray.resize(pTableInfo->pITableFrame->GetChairCount()); for (WORD i = 0;ipITableFrame->GetChairCount();i++) { kNetInfo.kWinLoseScore[i] = (int)pTableInfo->lPlayerWinLose[i]; //kNetInfo.kScoreInfoArray[i] = pTableInfo->lScoreInfoArray[i]; } DataStream kDataStream; kNetInfo.StreamValue(kDataStream,true); if (pIServerUserItem) { SendData(pIServerUserItem,MDM_GR_PRIVATE,SUB_GF_PRIVATE_ROOM_INFO,&kDataStream[0],kDataStream.size()); } else { SendTableData(pTableInfo->pITableFrame,MDM_GR_PRIVATE,SUB_GF_PRIVATE_ROOM_INFO,&kDataStream[0],kDataStream.size()); } // 发生欢乐积分 if (1 == pTableInfo->cbUnionGoldOpen) { CMD_GF_Private_Score_Info kScoreInfo; kScoreInfo.kScoreInfoArray.resize(pTableInfo->pITableFrame->GetChairCount()); for (WORD i = 0; i < pTableInfo->pITableFrame->GetChairCount(); i++) { kScoreInfo.kScoreInfoArray[i] = pTableInfo->lScoreInfoArray[i]; } DataStream kSocreStream; kScoreInfo.StreamValue(kSocreStream, true); SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GF_PRIVATE_SCORE_INFO, &kSocreStream[0], kSocreStream.size()); } } //断线 bool PriaveteGame::OnActionUserOffLine(WORD wChairID, IServerUserItem * pIServerUserItem) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return false; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return false; } if (pTableInfo->dwCreaterUserID == pIServerUserItem->GetUserID() && !pTableInfo->bInEnd) { return true; } if (pTableInfo->bInEnd) { pTableInfo->pITableFrame->PerformStandUpActionEx(pIServerUserItem); } else { // 离线时间; WORD wOfflineChairID = pIServerUserItem->GetChairID(); if (wOfflineChairID != INVALID_CHAIR) { pTableInfo->fOfflineTimes[wOfflineChairID] = 0; } //// 是不是自由场; //if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) //{ // // 可以准备清空; // pTableInfo->bAutoStart[wChairID] = false; //} } return true; } //用户坐下 bool PriaveteGame::OnActionUserSitDown(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser) { ASSERT(pIServerUserItem); if (NULL == pIServerUserItem) return true; PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (NULL == pTableInfo) return true; if (pTableInfo->bInEnd) return false; if (pTableInfo->IsSetOneTimeRoomScoreType()) { //进入房间时赋值为初始积分; SCORE lScore = pTableInfo->lInitEnterRoomScore - pIServerUserItem->GetUserScore(); pIServerUserItem->WriteUserScore(lScore, 0, 0, 0, SCORE_TYPE_PRESENT, 1, 0); } // 是不是自由场; if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) { // 可以准备清空; pTableInfo->mReadyInfo.reset(); tagAutoUserStatus autoUserStatus; autoUserStatus.bStartGame = false; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); } return true; } //用户起立 bool PriaveteGame::OnActionUserStandUp(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } if (pTableInfo->bInEnd) { return false; } // 是不是自由场; if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) { // 可以准备清空; pTableInfo->mReadyInfo.reset(); tagAutoUserStatus autoUserStatus; autoUserStatus.bStartGame = false; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); } return true; } //随机空位 WORD PriaveteGame::GetNullChairID(ITableFrame * pTableFrame) { //椅子搜索 for (WORD i = 0; i < pTableFrame->GetChairCount(); i++) { if (pTableFrame->GetTableUserItem(i) == NULL) { return i; } } return INVALID_CHAIR; } //用户同意 bool PriaveteGame::OnActionUserOnReady(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } if (pTableInfo->bInEnd) { return false; } if ( pTableInfo->IsEveryTimeRoomScoreType() ) { //每局重新赋值为初始积分; SCORE lScore = pTableInfo->lInitEnterRoomScore - pIServerUserItem->GetUserScore(); pIServerUserItem->WriteUserScore(lScore, 0, 0, 0, SCORE_TYPE_PRESENT, 1, 0); } //// 自由人数,通知客户端玩家准备情况; //if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) //{ // //变量定义 // bool bReady = *(bool *)pData; // // 第一个准备的人为申请人; // if (pTableInfo->mReadyInfo.wChairID == INVALID_CHAIR) // { // pTableInfo->mReadyInfo.wChairID = wChairID; // } // if (bReady) // { // pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_READY; // } // else // { // pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_REFUSED; // } // // SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_READY, &pTableInfo->mReadyInfo, sizeof(pTableInfo->mReadyInfo)); //} return true; } //判断房卡是否够 bool PriaveteGame::OnActionUserFangKaCheck(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, SCORE lUserInsure) { ASSERT(pIServerUserItem); if (NULL == pIServerUserItem) return true; PrivateTableInfo* pTableInfo = getTableInfoByTableID(wTableID); if (NULL == pTableInfo) return true; if (pTableInfo->bInEnd) return false; if (pTableInfo->IsCardAARule()) { ASSERT((pTableInfo->dwPlayCost / pTableInfo->pITableFrame->GetChairCount())>0); // AA 情况下判断房卡数量; if (lUserInsure < (pTableInfo->dwPlayCost / pTableInfo->pITableFrame->GetChairCount())) { return false; } } return true; } //用户可以开始 bool PriaveteGame::OnActionUserOnStart(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(tagAutoUserStatus)); if (wDataSize != sizeof(tagAutoUserStatus)) return false; if (pData == nullptr) return false; ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(wTableID);; if (pIServerUserItem->GetTableID() != INVALID_TABLE) { ASSERT(pIServerUserItem->GetTableID() == wTableID); } if (!pTableInfo) { return true; } if (pTableInfo->bInEnd) { return false; } // 是不是自由场; if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) { // 断线重连; if (pTableInfo->mReadyInfo.wChairID != INVALID_CHAIR) { //SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_READY, &pTableInfo->mReadyInfo, sizeof(pTableInfo->mReadyInfo)); if (pTableInfo->bInEnd || pTableInfo->bStart) return true; pTableInfo->mReadyInfo.reset(); // 通知客户端可以重新准备; tagAutoUserStatus autoUserStatus; autoUserStatus.bStartGame = true; SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); } else { tagAutoUserStatus autoUserStatus; CopyMemory(&autoUserStatus, pData, sizeof(tagAutoUserStatus)); SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); } } return true; } //用户开始游戏 bool PriaveteGame::OnActionUserStartGame(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(bool)); if (wDataSize != sizeof(bool)) return false; if (pData == nullptr) return false; ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } if (pTableInfo->bInEnd || pTableInfo->bStart) { return false; } ITableFrame* pTableFrame = pTableInfo->pITableFrame; ASSERT(pTableFrame != NULL); if (pTableFrame == NULL) return false; // 自由人数,通知客户端玩家准备情况; if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) { //变量定义 bool bReady = *(bool *)pData; // 判断是否可以开始游戏 if (bReady && EfficacyStartGame(pTableInfo, wChairID)) { if (!pTableFrame->IsGameStarted()) { bool bSuccess = pTableFrame->StartGame(); if (bSuccess == false) { CTraceService::TraceString(TEXT("PriaveteGame 开始游戏失败!"), TraceLevel_Exception); return false; } } return true; } else { // 第一个准备的人为申请人; if (pTableInfo->mReadyInfo.wChairID == INVALID_CHAIR) { pTableInfo->mReadyInfo.wChairID = wChairID; } if (bReady) { pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_READY; } else { pTableInfo->mReadyInfo.cbReady[wChairID] = RIT_REFUSED; } SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_READY, &pTableInfo->mReadyInfo, sizeof(pTableInfo->mReadyInfo)); // 一个人拒绝之后就要重新开始; if (!bReady) { //pTableInfo->mReadyInfo.reset(); m_pITimerEngine->SetTimer(IDI_AUTO_USER_RESET + pTableFrame->GetTableID(), NOT_AUTO_USER_TIME*1000L, 1, 0); } } } return true; } //开始效验 bool PriaveteGame::EfficacyStartGame(PrivateTableInfo* pTableInfo, WORD wReadyChairID) { //状态判断 if (!pTableInfo) return true; if (pTableInfo->bInEnd || pTableInfo->bStart) return false; ITableFrame* pTableFrame = pTableInfo->pITableFrame; ASSERT(pTableFrame != NULL); if (pTableFrame == NULL) return false; WORD wChairCount = pTableInfo->getChairCout(); //准备人数 WORD wReadyUserCount = 0; for (WORD i = 0; i < wChairCount; i++) { //获取用户 IServerUserItem * pITableUserItem = pTableFrame->GetTableUserItem(i); if (pITableUserItem == NULL) continue; //用户统计 if (pITableUserItem != NULL) { //状态判断(离线前的状态如果是准备状态) if (pITableUserItem->IsClientReady() == false) return false; BYTE cbReady = pTableInfo->mReadyInfo.cbReady[i]; if ((wReadyChairID != i) && (cbReady != RIT_READY)) return false; //用户计数 wReadyUserCount++; } } // 自由人数场; if (pTableInfo->IsAutoUserCountRule()) { //数目判断 if (wReadyUserCount >= 2L) return true; return false; } return false; } bool PriaveteGame::OnEventReqStandUP(IServerUserItem * pIServerUserItem) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); ASSERT(pTableInfo); if (!pTableInfo) { return true; } if (pTableInfo->bStart && !pTableInfo->bInEnd) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("游戏已经开始,无法退出。"),SMT_EJECT); return true; } if (getTableInfoByCreaterID(pIServerUserItem->GetUserID()) && !pTableInfo->bInEnd) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("您已返回大厅,房间将会继续保留。"),SMT_CLOSE_GAME); return true; } // 如果是工会房间,去数据库离开桌子; DBR_GR_WriteUnionRoomChairID JoinRoomUser; ZeroMemory(&JoinRoomUser, sizeof(JoinRoomUser)); JoinRoomUser.dwUnionConsumerID = pTableInfo->dwUnionConsumerID; JoinRoomUser.wChairID = pIServerUserItem->GetChairID(); JoinRoomUser.dwUserID = 0; m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_WRITE_UNION_CHAIRID, 0L, (BYTE*)&JoinRoomUser, sizeof(DBR_GR_WriteUnionRoomChairID)); pTableInfo->pITableFrame->PerformStandUpActionEx(pIServerUserItem); //// 是不是自由场; //if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) //{ // // 可以准备清空; // pTableInfo->bAutoStart[pIServerUserItem->GetChairID()] = false; // // 发送状态; // SendAutoUserStatus(pTableInfo); //} return true; } bool PriaveteGame::OnEventClientReady(WORD wChairID,IServerUserItem * pIServerUserItem) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } //sendPrivateRoomInfo(pIServerUserItem,pTableInfo); //if (pTableInfo->pITableFrame->GetGameStatus() == GAME_STATUS_FREE) //{ // pIServerUserItem->SetUserStatus(US_READY, // pTableInfo->pITableFrame->GetTableID(),wChairID); //} if (pTableInfo->kDismissChairID.size()) { CMD_GF_Private_Dismiss_Info kNetInfo; kNetInfo.dwDissUserCout = pTableInfo->kDismissChairID.size(); kNetInfo.dwNotAgreeUserCout = pTableInfo->kNotAgreeChairID.size(); for (int i = 0;i<(int)pTableInfo->kDismissChairID.size();i++) { kNetInfo.dwDissChairID[i] = pTableInfo->kDismissChairID[i]; } for (int i = 0;i<(int)pTableInfo->kNotAgreeChairID.size();i++) { kNetInfo.dwNotAgreeChairID[i] = pTableInfo->kNotAgreeChairID[i]; } SendTableData(pTableInfo->pITableFrame,MDM_GR_PRIVATE,SUB_GR_PRIVATE_DISMISS,&kNetInfo,sizeof(kNetInfo)); } //// 是不是自由场; //if (pTableInfo->IsAutoUserCountRule() && !pTableInfo->bStart) //{ // // 发送状态; // SendAutoUserStatus(pTableInfo); //} return true; } //同步私人场信息 bool PriaveteGame::OnEventPrivateRoomInfo(WORD wChairID, IServerUserItem * pIServerUserItem) { ASSERT(pIServerUserItem); if (!pIServerUserItem) { return true; } PrivateTableInfo* pTableInfo = getTableInfoByTableID(pIServerUserItem->GetTableID()); if (!pTableInfo) { return true; } sendPrivateRoomInfo(pIServerUserItem, pTableInfo); } void PriaveteGame::CreaterPlayerPrivateCost(PrivateTableInfo* pTableInfo) { DBR_GR_Create_Private_Cost kNetInfo; kNetInfo.dwUserID = pTableInfo->dwCreaterUserID; kNetInfo.wKindID = m_pGameServiceOption->wKindID; kNetInfo.dwRoomID = pTableInfo->dwRoomNum; kNetInfo.dwCost = pTableInfo->dwPlayCost; kNetInfo.dwCostType = pTableInfo->cbRoomType; kNetInfo.dwGameRuleIdex = pTableInfo->dwGameRuleIdex; m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_CREATE_PRIVAT_COST, 0L, &kNetInfo, sizeof(kNetInfo)); } void PriaveteGame::EveryOnePrivateCost(PrivateTableInfo* pTableInfo, bool bDivideCost) { if (NULL == pTableInfo) return; ITableFrame* pTableFrame = pTableInfo->pITableFrame; if ( NULL == pTableFrame) return; WORD nUserCount = pTableFrame->GetChairCount(); DWORD dwCost = pTableInfo->dwPlayCost; if (bDivideCost && nUserCount!=0) { dwCost = (dwCost / nUserCount); } for (int i = 0; i < nUserCount; i++) { IServerUserItem* pServerUserItem = pTableFrame->GetTableUserItem(i); if (NULL == pServerUserItem) continue; DBR_GR_Create_Private_Cost kNetInfo; kNetInfo.dwUserID = pServerUserItem->GetUserID(); kNetInfo.wKindID = m_pGameServiceOption->wKindID; kNetInfo.dwRoomID = pTableInfo->dwRoomNum; kNetInfo.dwCost = dwCost; kNetInfo.dwCostType = pTableInfo->cbRoomType; kNetInfo.dwGameRuleIdex = pTableInfo->dwGameRuleIdex; m_pIDataBaseEngine->PostDataBaseRequest(0L, DBR_GR_CREATE_PRIVAT_COST, 0L, &kNetInfo, sizeof(kNetInfo)); } } void PriaveteGame::gameEnd(PrivateTableInfo* pTableInfo) { ASSERT(pTableInfo != nullptr); ITableFrame* pITableFrame = pTableInfo->pITableFrame; ASSERT(pITableFrame != nullptr); if (nullptr == pITableFrame) return; DBO_GR_PrivateGameEnd mGameEnd; mGameEnd.wKindID = m_pGameServiceOption->wKindID; mGameEnd.wServerID = m_pGameServiceOption->wServerID; mGameEnd.wPlayCount = (WORD)pTableInfo->dwFinishPlayCout; WORD wChairCount = pITableFrame->GetChairCount(); for (WORD i = 0; i < wChairCount; i++) { IServerUserItem * pServerItem = pITableFrame->GetTableUserItem(i); if (pServerItem == nullptr) { continue; } mGameEnd.dwUserID = pServerItem->GetUserID(); mGameEnd.lScore = pServerItem->GetUserScore(); mGameEnd.dwCardLibIndex = pServerItem->getCardLibIndex(); m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_PRIVATE_GAME_END, 0, &mGameEnd, sizeof(DBO_GR_PrivateGameEnd)); } } void PriaveteGame::CalcUnionScore(PrivateTableInfo* pTableInfo) { if (NULL == pTableInfo) return; ITableFrame* pTableFrame = pTableInfo->pITableFrame; if (NULL == pTableFrame) return; // 通知数据库操作; DBR_GR_UnionRoomEnd UnionRoomEnd; ZeroMemory(&UnionRoomEnd, sizeof(DBR_GR_UnionRoomEnd)); UnionRoomEnd.dwUnionConsumerID = pTableInfo->dwUnionConsumerID; UnionRoomEnd.dwUnionCode = pTableInfo->dwUnionCode; UnionRoomEnd.cbUserCount = (BYTE)pTableInfo->getChairCout(); // 积分场才去处理; if (1 != pTableInfo->cbUnionGoldOpen) { for (int i = 0; i < UnionRoomEnd.cbUserCount; i++) { IServerUserItem * pServerItem = pTableFrame->GetTableUserItem(i); if (pServerItem == nullptr) { continue; } UnionRoomEnd.dwUserID[i] = pServerItem->GetUserID(); UnionRoomEnd.lUserScore[i] = pTableInfo->lPlayerWinLose[i]; } m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_UNION_ROOM_END, 0L, (BYTE*)&UnionRoomEnd, sizeof(UnionRoomEnd)); return; } // 计算积分,找到大赢家分数; SCORE lMaxScore = 0; for (int i = 0; i < UnionRoomEnd.cbUserCount; i++) { IServerUserItem * pServerItem = pTableFrame->GetTableUserItem(i); if (pServerItem == nullptr) { continue; } UnionRoomEnd.dwUserID[i] = pServerItem->GetUserID(); /*UnionRoomEnd.lUserScore[i] = pTableInfo->lPlayerWinLose[i] * pTableInfo->lScoreMultiple * pTableInfo->cbBaseScore;*/ UnionRoomEnd.lUserScore[i] = pTableInfo->lPlayerWinLose[i] * pTableInfo->cbBaseScore; if (UnionRoomEnd.lUserScore[i] > lMaxScore) { lMaxScore = UnionRoomEnd.lUserScore[i]; } } // 统计大赢家数量; int iMaxScoreCount = 0; for (int j = 0; j < UnionRoomEnd.cbUserCount; j++) { if ((lMaxScore > 0) && (UnionRoomEnd.lUserScore[j] == lMaxScore)) { iMaxScoreCount++; } } if (iMaxScoreCount > 0) { // 佣金 SCORE lGameGold = pTableInfo->lGameGold * pTableInfo->dwPlayCost; // 计算玩家积分; SCORE lRevenue = floor(lGameGold / iMaxScoreCount); // 重新计算积分, 统计扣税; for (int k = 0; k < UnionRoomEnd.cbUserCount; k++) { if ((lMaxScore > 0) && (UnionRoomEnd.lUserScore[k] == lMaxScore)) { if (UnionRoomEnd.lUserScore[k] > lRevenue) { UnionRoomEnd.lUserScore[k] -= lRevenue; UnionRoomEnd.lRevenue += lRevenue; } else { UnionRoomEnd.lRevenue += UnionRoomEnd.lUserScore[k]; UnionRoomEnd.lUserScore[k] = 0; } } } } m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_UNION_ROOM_END, 0L, (BYTE*)&UnionRoomEnd, sizeof(UnionRoomEnd)); // 写每个玩家积分; for (int i = 0; i < UnionRoomEnd.cbUserCount; i++) { IServerUserItem* pServerUserItem = pTableFrame->GetTableUserItem(i); if (NULL == pServerUserItem) continue; // 有输赢才写数据库; if (UnionRoomEnd.lUserScore[i] != 0) { DBR_GR_UnionScore unionScore; ZeroMemory(&unionScore, sizeof(DBR_GR_UnionScore)); unionScore.dwUserID = pServerUserItem->GetUserID(); unionScore.dwUnoinCode = pTableInfo->dwUnionCode; unionScore.lUserScore = UnionRoomEnd.lUserScore[i]; m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_WRITE_UNION_SCORE, 0L, (BYTE*)&unionScore, sizeof(unionScore)); } } } ////发送自由人数玩家状态 //void PriaveteGame::SendAutoUserStatus(PrivateTableInfo* pTableInfo) //{ // if (pTableInfo == nullptr) return; // // // 结束了或者已经开始了,就不处理该消息; // if (pTableInfo->bInEnd || pTableInfo->bStart)return; // // // 不是自由人数场; // if (!pTableInfo->IsAutoUserCountRule()) return; // // // 通知客户端可以开始游戏了; // tagAutoUserStatus autoUserStatus; // ZeroMemory(&autoUserStatus, sizeof(tagAutoUserStatus)); // // autoUserStatus.wChairCount = pTableInfo->pITableFrame->GetChairCount(); // CopyMemory(autoUserStatus.bAutoUserStatus, pTableInfo->bAutoStart, sizeof(bool)*autoUserStatus.wChairCount); // // SendTableData(pTableInfo->pITableFrame, MDM_GR_PRIVATE, SUB_GR_AUTO_USER_STATUS, &autoUserStatus, sizeof(autoUserStatus)); // //}