#include "StdAfx.h" #include "ServiceUnits.h" #include "ControlPacket.h" #include "AttemperEngineSink.h" #include "Commend.h" #include "Shop.h" #include "GameServer.h" #include "GameServerDlg.h" #include "ShowTime.h" #include "JsonBusiness.h" #include "../../MessageDef/Pb_TurntableLogon.pb.h" #include "../../MessageDef/Pb_UserInfo.pb.h" #include "../../MessageDef/Pb_ClubInformation.pb.h" #include "../../MessageDef/Pb_GameInfo.pb.h" #include "../../GlobalDef/Util.h" #include "ChineseCode.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////////////// //时间标识 #define IDI_LOAD_ANDROID_USER (IDI_MAIN_MODULE_START+1) //机器信息 #define IDI_REPORT_SERVER_INFO (IDI_MAIN_MODULE_START+2) //房间信息 #define IDI_CONNECT_CORRESPOND (IDI_MAIN_MODULE_START+3) //连接时间 #define IDI_GAME_SERVICE_PULSE (IDI_MAIN_MODULE_START+4) //服务脉冲 #define IDI_DISTRIBUTE_ANDROID (IDI_MAIN_MODULE_START+5) //分配机器 #define IDI_DBCORRESPOND_NOTIFY (IDI_MAIN_MODULE_START+6) //缓存通知 #define IDI_LOAD_SYSTEM_MESSAGE (IDI_MAIN_MODULE_START+7) //系统消息 #define IDI_SEND_SYSTEM_MESSAGE (IDI_MAIN_MODULE_START+8) //系统消息 #define IDI_LOAD_SENSITIVE_WORD (IDI_MAIN_MODULE_START+9) //加载敏感词 #define IDI_DISTRIBUTE_USER (IDI_MAIN_MODULE_START+10) //分配用户 #define IDI_TELL_CORRESPOND (IDI_MAIN_MODULE_START+11) //定时告知协调服务器 #define IDI_UPDATA_DATA (IDI_MAIN_MODULE_START+12) //定时更新数据 #define IDI_HTTPUPDATA_DATA (IDI_MAIN_MODULE_START+18) //定时http请求 #define IDI_SERVICE_DATA (IDI_MAIN_MODULE_START+19) //定时通道请求 #define IDI_SERVICE_CLEAR (IDI_MAIN_MODULE_START+20) //定时清空 ////////////////////////////////////////////////////////////////////////////////// //时间定义 秒 #define TIME_LOAD_ANDROID_USER 15L //加载机器 #define TIME_DISTRIBUTE_ANDROID 15L //分配用户 #define TIME_REPORT_SERVER_INFO 60L //人数和房间数量上报时间 #define TIME_DBCORRESPOND_NOTIFY 3L //缓存通知时间 #define TIME_LOAD_SYSTEM_MESSAGE 600L //系统消息时间 #define TIME_SEND_SYSTEM_MESSAGE 10L //系统消息时间 #define TIME_LOAD_SENSITIVE_WORD 5L //加载敏感词时间 #define TIME_TELL_CORRESPOND 2L //通知协调服务器时间 #define TIME_HTTP 5L //定时HTTP请求 ////////////////////////////////////////////////////////////////////////////////// //常量定义 #define TEMP_MESSAGE_ID INVALID_DWORD //间隔时间 #define MIN_INTERVAL_TIME 10 //间隔时间 #define MAX_INTERVAL_TIME 1*60 //临时标识 const unsigned int MAX_USER = 0xFFFF; //INDEX_ANDROID - 1; // 与SOCKET的bindindex大小一致 ////////////////////////////////////////////////////////////////////////////////// extern CGameServerApp theApp; DWORD CAttemperEngineSink::m_DwordThead = 0; void del_char(TCHAR str[], TCHAR c) { int i = 0, j = 0; while (str[i] != '\0') { if (str[i] != c) { str[j++] = str[i++]; } else { i++; } } str[j] = '\0'; } __int64 StrToNmuber(TCHAR *str) { __int64 ui = 0; size_t len = _tcslen(str), i = 0; while (i < len) { ui = ui * 10 + str[i] - 0x30; i++; } return ui; } //构造函数 CAttemperEngineSink::CAttemperEngineSink(): m_pGameMatchOption(nullptr) { m_Service = 1; m_BCreate = true; //允许创建房间 m_BCreate_Hua = true; //运行创建花牌房间 m_BAddCreate = true; //允许加入房间 //状态变量 m_bCollectUser = false; m_bNeekCorrespond = true; //控制变量 m_dwIntervalTime = 0; m_dwLastDisposeTime = 0; m_dwCorrespondNum = 0; //绑定数据 m_pNormalParameter = NULL; //m_pAndroidParameter = NULL; //会员参数 m_wMemberCount = 0; ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter)); //任务参数 m_wTaskCount = 0; ZeroMemory(m_TaskParameter, sizeof(m_TaskParameter)); ZeroMemory(&m_Data, sizeof(m_Data)); //状态变量 m_pInitParameter = NULL; m_pGameParameter = NULL; m_pGameServiceAttrib = NULL; m_pGameServiceOption = NULL; //组件变量 m_pITimerEngine = NULL; m_pIAttemperEngine = NULL; m_pITCPSocketService = NULL; m_pITCPNetworkEngine = NULL; m_pIGameServiceManager = NULL; //数据引擎 m_pIRecordDataBaseEngine = NULL; m_pIKernelDataBaseEngine = NULL; m_pIDBCorrespondManager = NULL; //配置数据 //ZeroMemory(&m_DataConfigColumn, sizeof(m_DataConfigColumn)); //ZeroMemory(&m_DataConfigProperty, sizeof(m_DataConfigProperty)); //比赛变量 //m_pIMatchServiceManager = NULL; //初始化私有桌子ID池 note by yd 根据定时器范围 最大桌子ID(32767500-1000000)/500=63535 for (unsigned short i = PRIVATE_TABLE_MIN_ID; i < 0xFFFF/*65535*/; ++i) m_privateTableIDPool.push_back(i); ZeroMemory(&m_JC, sizeof(m_JC)); m_pRankListData = nullptr; m_pRankListDataSize = 0; m_lastRankListTime = time(0); m_wShuffleZuan = 0; /*ZeroMemory(&mTmpGameConfig, sizeof(tagGameConfig)); mwChairID = 0;*/ return; } //析构函数 CAttemperEngineSink::~CAttemperEngineSink() { //删除数据 SafeDeleteArray(m_pNormalParameter); //SafeDeleteArray(m_pAndroidParameter); //删除桌子 m_TableFrameArray.clear(); //删除消息 m_SystemMessageBuffer.Append(m_SystemMessageActive); for (INT_PTR i = 0; i < m_SystemMessageBuffer.GetCount(); i++) { SafeDelete(m_SystemMessageBuffer[i]); } //清空数组 m_SystemMessageActive.RemoveAll(); m_SystemMessageBuffer.RemoveAll(); //清理数据 //m_KickUserItemMap.RemoveAll(); m_DistributeManage.RemoveAll(); m_PrivateRoomAll.clear(); m_OnLineUserAll.clear(); m_UserID_2_PriTableIDGROUP.clear(); return; } //接口查询 VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IMainServiceFrame, Guid, dwQueryVer); QUERYINTERFACE(IAttemperEngineSink, Guid, dwQueryVer); QUERYINTERFACE(IServerUserItemSink, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink, Guid, dwQueryVer); return NULL; } //启动事件 bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx) { //绑定信息 //m_pAndroidParameter = new tagBindParameter[MAX_ANDROID]; //ZeroMemory(m_pAndroidParameter, sizeof(tagBindParameter)*MAX_ANDROID); //绑定信息 m_pNormalParameter = new tagBindParameter[m_pGameServiceOption->wMaxPlayer]; ZeroMemory(m_pNormalParameter, sizeof(tagBindParameter)*m_pGameServiceOption->wMaxPlayer); //配置比赛 //InitMatchServiceManager(); //配置机器 if (InitAndroidUser() == false) { ASSERT(FALSE); return false; } //配置桌子 if (InitTableFrameArray() == false) { ASSERT(FALSE); return false; } //设置接口 //if (m_pIMatchServiceManager != NULL) //{ // if (m_ServerUserManager.SetServerUserItemSink(m_pIMatchServiceManager->GetServerUserItemSink()) == false) // { // ASSERT(FALSE); // return false; // } //} //else //{ if (m_ServerUserManager.SetServerUserItemSink(QUERY_ME_INTERFACE(IServerUserItemSink)) == false) { ASSERT(FALSE); return false; } //} //启动机器 //if (m_AndroidUserManager.StartService() == false) //{ // ASSERT(FALSE); // return false; //} //设置规则 m_DistributeManage.SetDistributeRule(m_pGameServiceOption->cbDistributeRule); m_pITimerEngine->SetTimer(IDI_UPDATA_DATA, 30000L, TIMES_INFINITY, NULL); int iNum = (rand() % 10)*1000 + 40000L; m_pITimerEngine->SetTimer(IDI_SERVICE_DATA, iNum, TIMES_INFINITY, NULL); m_pITimerEngine->SetTimer(IDI_SERVICE_CLEAR, 60*1000, TIMES_INFINITY, NULL); //设置时间 //m_pITimerEngine->SetTimer(IDI_GAME_SERVICE_PULSE, 1000L, TIMES_INFINITY, NULL); //m_pITimerEngine->SetTimer(IDI_DBCORRESPOND_NOTIFY, TIME_DBCORRESPOND_NOTIFY * 1000L, TIMES_INFINITY, NULL); //#ifdef _DEBUG // m_pITimerEngine->SetTimer(IDI_LOAD_SYSTEM_MESSAGE, 15 * 1000L, TIMES_INFINITY, NULL); // m_pITimerEngine->SetTimer(IDI_SEND_SYSTEM_MESSAGE, 5 * 1000L, TIMES_INFINITY, NULL); //#else // m_pITimerEngine->SetTimer(IDI_LOAD_SYSTEM_MESSAGE, TIME_LOAD_SYSTEM_MESSAGE * 1000L, TIMES_INFINITY, NULL); // m_pITimerEngine->SetTimer(IDI_SEND_SYSTEM_MESSAGE, TIME_SEND_SYSTEM_MESSAGE * 1000L, TIMES_INFINITY, NULL); //#endif //延时加载敏感词 //m_pITimerEngine->SetTimer(IDI_LOAD_SENSITIVE_WORD, TIME_LOAD_SENSITIVE_WORD * 1000L, TIMES_INFINITY, NULL); //防作弊模式 if ((m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_ALLOW) != 0) { m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_USER, m_pGameServiceOption->wDistributeTimeSpace * 1000, TIMES_INFINITY, NULL); } // //加载机器 // if (CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule) || // CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule)) // { //#ifdef _DEBUG // m_pITimerEngine->SetTimer(IDI_LOAD_ANDROID_USER, 10000L, TIMES_INFINITY, NULL); // m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_ANDROID, TIME_DISTRIBUTE_ANDROID * 1000L, TIMES_INFINITY, NULL); //#else // m_pITimerEngine->SetTimer(IDI_LOAD_ANDROID_USER, TIME_LOAD_ANDROID_USER * 1000L, TIMES_INFINITY, NULL); // m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_ANDROID, TIME_DISTRIBUTE_ANDROID * 1000L, TIMES_INFINITY, NULL); //#endif // } return true; } //停止事件 bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx) { if (m_pITimerEngine) m_pITimerEngine->KillTimer(IDI_SERVICE_DATA); if (m_pITimerEngine) m_pITimerEngine->KillTimer(IDI_SERVICE_CLEAR); //状态变量 m_bCollectUser = false; m_bNeekCorrespond = true; //配置信息 m_pInitParameter = NULL; m_pGameServiceAttrib = NULL; m_pGameServiceOption = NULL; //组件变量 m_pITimerEngine = NULL; m_pITCPSocketService = NULL; m_pITCPNetworkEngine = NULL; //数据引擎 m_pIRecordDataBaseEngine = NULL; m_pIKernelDataBaseEngine = NULL; //绑定数据 SafeDeleteArray(m_pNormalParameter); //SafeDeleteArray(m_pAndroidParameter); //任务变量 m_wTaskCount = 0; ZeroMemory(&m_TaskParameter, sizeof(m_TaskParameter)); //会员参数 m_wMemberCount = 0; ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter)); //删除用户 m_TableFrameArray.clear(); m_DistributeManage.RemoveAll(); m_ServerUserManager.DeleteUserItem(); m_ServerListManager.ResetServerList(); //停止服务 //m_AndroidUserManager.ConcludeService(); //停止比赛 //if (m_pIMatchServiceManager != NULL) // m_pIMatchServiceManager->StopService(); //移除消息 RemoveSystemMessage(); //移除任务 //m_UserTaskManager.ResetTaskManager(); //复位关键字 //m_WordsFilter.ResetSensitiveWordArray(); m_PrivateRoomAll.clear(); m_OnLineUserAll.clear(); m_UserID_2_PriTableIDGROUP.clear(); return true; } //控制事件 bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize) { switch (wIdentifier) { case CT_CONNECT_CORRESPOND: //连接协调 { //发起连接 tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress; m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort); //构造提示 TCHAR szString[512] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort); //提示消息 CTraceService::TraceString(szString, TraceLevel_Normal); return true; } case CT_LOAD_SERVICE_CONFIG: //加载配置 { ///+++加载轮盘配置(奖品有数量,会动态变化) ///---m_pIDBCorrespondManager->PostDataBaseRequest(0, DBR_GP_LOAD_ROULETTE_CONFIG, 0, NULL, 0); ///在抽奖的时候,动态加载 ///+++加载签到奖励配置 m_pIDBCorrespondManager->PostDataBaseRequest(0, DBR_GP_LOAD_CHECKIN_REWARD, 0, NULL, 0); //加载配置 m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_PARAMETER, 0L, NULL, 0L); //加载列表 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_GAME_COLUMN, 0L, NULL, 0L); //加载机器 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_ANDROID_PARAMETER, 0L, NULL, 0L); //加载消息 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_SYSTEM_MESSAGE, 0L, NULL, 0L); //加载任务 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_TASK_LOAD_LIST, 0L, NULL, 0L); //会员参数 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_MEMBER_PARAMETER, 0, NULL, 0); //加载道具 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_GAME_PROPERTY, 0L, NULL, 0L); return true; } default: break; } return false; } //调度事件 bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; } //时间事件 bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam) { //调度时间 if ((dwTimerID >= IDI_MAIN_MODULE_START) && (dwTimerID <= IDI_MAIN_MODULE_FINISH)) { //时间处理 switch (dwTimerID) { //case IDI_LOAD_ANDROID_USER: //加载机器 //{ // //变量定义 // DWORD dwBatchID = 0; // DWORD dwAndroidCount = 0; // //加载判断 // if (m_AndroidUserManager.GetAndroidLoadInfo(dwBatchID, dwAndroidCount)) // { // //构造结构 // DBR_GR_LoadAndroidUser LoadAndroidUser; // LoadAndroidUser.dwBatchID = dwBatchID; // LoadAndroidUser.dwAndroidCount = dwAndroidCount; // CTraceService::TraceString(TEXT("加载机器已屏蔽 IDI_LOAD_ANDROID_USER"), TraceLevel_Warning); // //加载机器 // //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_ANDROID_USER, 0L, &LoadAndroidUser, sizeof(LoadAndroidUser)); // } // return true; //} case IDI_REPORT_SERVER_INFO: //房间信息 { //变量定义 CMD_CS_C_ServerOnLine ServerOnLine; ZeroMemory(&ServerOnLine, sizeof(ServerOnLine)); //设置变量 ServerOnLine.wTableOnlineCount = m_PriTableID_2_TableID.size(); ServerOnLine.wTableFullCount = m_pGameServiceOption->wTableCount; ServerOnLine.dwOnLineCount = m_ServerUserManager.GetUserItemCount(); //发送数据 m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_ONLINE, &ServerOnLine, sizeof(ServerOnLine)/*, 0, 0, m_pIGameServiceManager == NULL? NULL:m_pIGameServiceManager->GetDataString()*/); return true; } case IDI_CONNECT_CORRESPOND: //连接协调 { //发起连接 tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress; m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort); //构造提示 TCHAR szString[512] = TEXT(""); ZeroMemory(szString, sizeof(TCHAR) * 512); _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort); //提示消息 CTraceService::TraceString(szString, TraceLevel_Normal); return true; } case IDI_GAME_SERVICE_PULSE: //服务维护 { return true; } case IDI_SERVICE_DATA: //加载通道 { DWORD dThead = GetCurrentThreadId(); if (CAttemperEngineSink::m_DwordThead == 0) { CAttemperEngineSink::m_DwordThead = dThead; } if (dThead == CAttemperEngineSink::m_DwordThead) { GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_UPTONGDAO, 0, NULL, 0); } return true; } case IDI_SERVICE_CLEAR: //清空操作 { DWORD dThead = GetCurrentThreadId(); if (CAttemperEngineSink::m_DwordThead == 0) { CAttemperEngineSink::m_DwordThead = dThead; } if (dThead == CAttemperEngineSink::m_DwordThead) { CTime tm; tm = CTime::GetCurrentTime(); if (tm.GetHour() ==3 && (tm.GetMinute() == 0)) { //也强制解散空闲房间 CString str = L""; str.Format(_T("强制解散空闲房间")); CTraceService::TraceString(str, TraceLevel_Normal); GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSFREEALL, 0, NULL, 0); } if (tm.GetHour() == 4 && (tm.GetMinute() == 0 || tm.GetMinute() == 1)) { if (m_pITimerEngine) m_pITimerEngine->KillAllFreeTimer(); GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_CLEAR, 0, NULL, 0); } } return true; } case IDI_UPDATA_DATA: //统计数据上报 { for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++) { if (iter->second != nullptr) { auto pTableFrame = iter->second; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (csTemp != _T("")) { m_Data.iTableCount++; m_Data.iTableNum = m_Data.iTableCount; m_Data.PrivteTable[m_Data.iTableNum - 1] = _wtol(csTemp); if (pTableFrame->GetStartCount() > 0) { m_Data.iPlayingTableCount++; int iRet = 0; for (int i = 0; i < 4; i++) { IServerUserItem * p = pTableFrame->GetTableUserItem(i); if (p && p->GetUserStatus() == US_OFFLINE) { iRet++; } } if (iRet == 4) m_Data.iDownTableCount++; } else { m_Data.iFreeTableCount++; } } } } m_Data.iLoginBody = m_ServerUserManager.GetUserItemCount(); WORD wEnumIndex = 0; while (wEnumIndex < m_ServerUserManager.GetUserItemCount()) { //过滤用户 IServerUserItem *pIServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); if (pIServerUserItem->GetUserStatus() == US_OFFLINE) { m_Data.iDownBody++; } else { m_Data.iLinkBody++; if (pIServerUserItem->GetUserStatus() == US_FREE) { m_Data.iDaTingBody++; } } } m_Data.iFreeCon = m_Data.iSocketNum - m_Data.iLinkBody; CGameServerDlg::UpData(m_Data); TagUpData Temp; ZeroMemory(&Temp, sizeof(TagUpData)); Temp = m_Data; ZeroMemory(&m_Data, sizeof(m_Data)); m_Data.iSocketNum = Temp.iSocketNum; return true; } /*case IDI_DISTRIBUTE_ANDROID: //分配机器 //{ // //动作处理 // if (m_AndroidUserManager.GetAndroidCount() > 0 && m_pGameServiceOption->wServerType != GAME_GENRE_MATCH) // { // //变量定义 // bool bAllowDynamicJoin = CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule); // bool bAllowAndroidAttend = CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule); // bool bAllowAndroidSimulate = CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule); // bool bAllowAvertCheatMode = (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR)); // //模拟处理 // if (bAllowAndroidSimulate == true && bAllowAvertCheatMode == false) // { // //机器状态 // tagAndroidUserInfo AndroidSimulate; // m_AndroidUserManager.GetAndroidUserInfo(AndroidSimulate, ANDROID_SIMULATE); // //机器处理 // if (AndroidSimulate.wFreeUserCount > 0) // { // for (WORD i = 0; i < 8; i++) // { // //随机桌子 // WORD wTableID = rand() % (__max(m_pGameServiceOption->wTableCount / 3, 1)); // //获取桌子 // auto pTableFrame = GetTableFrame(wTableID); // if (!pTableFrame) // continue; // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //分配判断 // if (TableUserInfo.wTableUserCount > 0) continue; // if ((wUserSitCount >= TableUserInfo.wMinUserCount) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR)) continue; // //坐下判断 // if (AndroidSimulate.wFreeUserCount >= TableUserInfo.wMinUserCount) // { // //变量定义 // WORD wHandleCount = 0; // WORD wWantAndroidCount = TableUserInfo.wMinUserCount; // //数据调整 // if (m_pGameServiceAttrib->wChairCount > TableUserInfo.wMinUserCount) // { // WORD wChairCount = m_pGameServiceAttrib->wChairCount; // WORD wFreeUserCount = AndroidSimulate.wFreeUserCount; // WORD wOffUserCount = __min(wChairCount, wFreeUserCount) - TableUserInfo.wMinUserCount; // wWantAndroidCount += ((wOffUserCount > 0) ? (rand() % (wOffUserCount + 1)) : 0); // } // //坐下处理 // for (WORD j = 0; j < AndroidSimulate.wFreeUserCount; j++) // { // //变量定义 // WORD wChairID = pTableFrame->GetRandNullChairID(); // //无效过滤 // //ASSERT(wChairID!=INVALID_CHAIR); // if (wChairID == INVALID_CHAIR) continue; // //用户坐下 // IAndroidUserItem * pIAndroidUserItem = AndroidSimulate.pIAndroidUserFree[j]; // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) // { // //设置变量 // wHandleCount++; // //完成判断 // if (wHandleCount >= wWantAndroidCount) // { // return true; // } // } // } // if (wHandleCount > 0) return true; // } // } // } // } // //陪打处理 // if (bAllowAndroidAttend == true) // { // //被动状态 // tagAndroidUserInfo AndroidPassivity; // m_AndroidUserManager.GetAndroidUserInfo(AndroidPassivity, ANDROID_PASSIVITY); // if (bAllowAvertCheatMode) // { // //坐下处理 // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++) // { // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j]; // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // else // { // //被动处理 // if (AndroidPassivity.wFreeUserCount > 0) // { // //百人游戏 // if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR) // { // for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++) // { // //获取桌子 // auto pTableFrame = GetTableFrame(i); // if (!pTableFrame) // continue; // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //分配判断 // if (wUserSitCount > m_pGameServiceAttrib->wChairCount * 2 / 3) continue; // //变量定义 // IServerUserItem * pIServerUserItem = NULL; // WORD wChairID = pTableFrame->GetRandNullChairID(); // //无效过滤 // ASSERT(wChairID != INVALID_CHAIR); // if (wChairID == INVALID_CHAIR) continue; // //坐下处理 // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++) // { // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j]; // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // } // else // { // for (INT_PTR i = 0; i < m_pGameServiceOption->wTableCount; i++) // { // //获取桌子 // auto pTableFrame = GetTableFrame(i); // if (!pTableFrame) // continue; // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //分配判断 // if (wUserSitCount == 0) continue; // if (TableUserInfo.wTableUserCount == 0) continue; // if ((wUserSitCount >= TableUserInfo.wMinUserCount) && (rand() % 10 > 5)) continue; // //变量定义 // IServerUserItem * pIServerUserItem = NULL; // WORD wChairID = pTableFrame->GetRandNullChairID(); // //无效过滤 // ASSERT(wChairID != INVALID_CHAIR); // if (wChairID == INVALID_CHAIR) continue; // //坐下处理 // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++) // { // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j]; // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // } // } // } // } // //陪打处理 // if (bAllowAndroidAttend == true) // { // //主动状态 // tagAndroidUserInfo AndroidInitiative; // m_AndroidUserManager.GetAndroidUserInfo(AndroidInitiative, ANDROID_INITIATIVE); // //WORD wAllAndroidCount = AndroidInitiative.wFreeUserCount + AndroidInitiative.wPlayUserCount + AndroidInitiative.wSitdownUserCount; // if (bAllowAvertCheatMode) // { // //坐下处理 // for (WORD j = 0; j < AndroidInitiative.wFreeUserCount; j++) // { // IAndroidUserItem * pIAndroidUserItem = AndroidInitiative.pIAndroidUserFree[j]; // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // else // { // //主动处理 // if (AndroidInitiative.wFreeUserCount > 0) // { // for (INT_PTR i = 0; i < m_pGameServiceOption->wTableCount; i++) // { // //获取桌子 // auto pTableFrame = GetTableFrame(i); // if (!pTableFrame) // continue; // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //分配判断 // if ((m_pGameServiceAttrib->wChairCount < MAX_CHAIR) && wUserSitCount > (TableUserInfo.wMinUserCount - 1)) continue; // //变量定义 // IServerUserItem * pIServerUserItem = NULL; // WORD wChairID = pTableFrame->GetRandNullChairID(); // //无效过滤 // ASSERT(wChairID != INVALID_CHAIR); // if (wChairID == INVALID_CHAIR) continue; // //坐下处理 // for (WORD j = 0; j < AndroidInitiative.wFreeUserCount; j++) // { // IAndroidUserItem * pIAndroidUserItem = AndroidInitiative.pIAndroidUserFree[j]; // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // } // } // } // //变量定义 // bool bMaxPlayerGame = m_pGameServiceAttrib->wChairCount >= MAX_CHAIR; // //类型判断 // if (bMaxPlayerGame) // { // //获取时间 // DWORD dwCurrTime = (DWORD)time(NULL); // if (dwCurrTime < m_dwIntervalTime + m_dwLastDisposeTime) return true; // //设置变量 // m_dwLastDisposeTime = dwCurrTime; // m_dwIntervalTime = MIN_INTERVAL_TIME + rand() % (MAX_INTERVAL_TIME - MIN_INTERVAL_TIME); // } // //起立处理 // WORD wStandUpCount = 0; // WORD wRandCount = ((rand() % 3) + 1); // INT_PTR nIndex = rand() % (__max(m_pGameServiceOption->wTableCount, 1)); // for (INT_PTR i = nIndex; i < m_pGameServiceOption->wTableCount + nIndex; ++i) // { // //获取桌子 // INT_PTR nTableIndex = i%m_pGameServiceOption->wTableCount; // auto pTableFrame = GetTableFrame(nTableIndex); // if (!pTableFrame) // continue; // if (pTableFrame->IsGameStarted() == true) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // ZeroMemory(&TableUserInfo, sizeof(TableUserInfo)); // //WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //用户过虑 // bool bRand = ((rand() % 100) > 50); // if (TableUserInfo.wTableAndroidCount == 0) continue; // if ((TableUserInfo.wTableUserCount > 0) && (bAllowAndroidAttend == true) && bRand) continue; // if (TableUserInfo.wTableAndroidCount >= TableUserInfo.wMinUserCount && bRand) continue; // //起立处理 // for (WORD j = 0; j < pTableFrame->GetChairCount(); j++) // { // //获取用户 // IServerUserItem * pIServerUserItem = pTableFrame->GetTableUserItem(j); // if (pIServerUserItem == NULL) continue; // //用户起立 // if ((pIServerUserItem->IsAndroidUser() == true) && (pTableFrame->PerformStandUpAction(pIServerUserItem) == true)) // { // wStandUpCount++; // if (wStandUpCount >= wRandCount) // return true; // else // break; // } // } // } // //起立处理 // nIndex = rand() % (__max(m_pGameServiceOption->wTableCount, 1)); // for (INT_PTR i = nIndex; i < m_pGameServiceOption->wTableCount + nIndex; ++i) // { // //获取桌子 // //INT_PTR nTableIndex = i%m_pGameServiceOption->wTableCount; // auto pTableFrame = GetTableFrame(i); // if (!pTableFrame) // continue; // if (pTableFrame->IsGameStarted() == true) continue; // //桌子状况 // tagTableUserInfo TableUserInfo; // ZeroMemory(&TableUserInfo, sizeof(TableUserInfo)); // //WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo); // //用户过虑 // bool bRand = ((rand() % 100) > 50); // if (TableUserInfo.wTableAndroidCount == 0) continue; // if ((TableUserInfo.wTableUserCount > 0) && (bAllowAndroidAttend == true) && bRand) continue; // //起立处理 // for (WORD j = 0; j < pTableFrame->GetChairCount(); j++) // { // //获取用户 // IServerUserItem * pIServerUserItem = pTableFrame->GetTableUserItem(j); // if (pIServerUserItem == NULL) continue; // //用户起立 // if ((pIServerUserItem->IsAndroidUser() == true) && (pTableFrame->PerformStandUpAction(pIServerUserItem) == true)) // { // wStandUpCount++; // if (wStandUpCount >= wRandCount) // return true; // else // break; // } // } // } // } // //比赛类型 // if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) // { // //陪玩标识 // bool bAllowAndroidAttend = CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule); // //陪玩处理 // if (bAllowAndroidAttend == true) // { // //被动状态 // tagAndroidUserInfo AndroidPassivity; // m_AndroidUserManager.GetAndroidUserInfo(AndroidPassivity, ANDROID_PASSIVITY); // //坐下处理 // WORD wIndex = rand() % (AndroidPassivity.wFreeUserCount + 1); // for (WORD j = wIndex; j < AndroidPassivity.wFreeUserCount + wIndex; j++) // { // WORD wAndroidIndex = j%AndroidPassivity.wFreeUserCount; // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[wAndroidIndex]; // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true; // } // } // } // return true; //} */ case IDI_DBCORRESPOND_NOTIFY: //缓存定时处理 { CTraceService::TraceString(TEXT("缓存定时处理已屏蔽 IDI_DBCORRESPOND_NOTIFY"), TraceLevel_Warning); //if (m_pIDBCorrespondManager) m_pIDBCorrespondManager->OnTimerNotify(); return true; } case IDI_LOAD_SYSTEM_MESSAGE: //系统消息 { CTraceService::TraceString(TEXT("系统消息已屏蔽 IDI_LOAD_SYSTEM_MESSAGE"), TraceLevel_Warning); //清除消息数据 //RemoveSystemMessage(); //加载消息 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_SYSTEM_MESSAGE, 0L, NULL, 0L); return true; } //case IDI_LOAD_SENSITIVE_WORD: //加载敏感词 //{ // //投递请求 // m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_LOAD_SENSITIVE_WORDS, 0, NULL, 0); // return true; //} case IDI_SEND_SYSTEM_MESSAGE: //系统消息 { CTraceService::TraceString(TEXT("系统消息已屏蔽 IDI_SEND_SYSTEM_MESSAGE"), TraceLevel_Warning); ////数量判断 //if (m_SystemMessageActive.GetCount() == 0) return true; ////时效判断 //DWORD dwCurrTime = (DWORD)time(NULL); //for (INT_PTR nIndex = m_SystemMessageActive.GetCount() - 1; nIndex >= 0; nIndex--) //{ // tagSystemMessage *pTagSystemMessage = m_SystemMessageActive[nIndex]; // //时效判断 // if (pTagSystemMessage->SystemMessage.tConcludeTime < dwCurrTime) // { // m_SystemMessageActive.RemoveAt(nIndex); // SafeDelete(pTagSystemMessage); // continue; // } // //间隔判断 // if (pTagSystemMessage->dwLastTime + pTagSystemMessage->SystemMessage.dwTimeRate < dwCurrTime) // { // //更新数据 // pTagSystemMessage->dwLastTime = dwCurrTime; // //构造消息 // CMD_GR_SendMessage SendMessage = {}; // SendMessage.cbAllRoom = (pTagSystemMessage->SystemMessage.dwMessageID == TEMP_MESSAGE_ID) ? TRUE : FALSE; // SendMessage.cbGame = (pTagSystemMessage->SystemMessage.cbMessageType == 1) ? TRUE : FALSE; // SendMessage.cbRoom = (pTagSystemMessage->SystemMessage.cbMessageType == 2) ? TRUE : FALSE; // if (pTagSystemMessage->SystemMessage.cbMessageType == 3) // { // SendMessage.cbGame = TRUE; // SendMessage.cbRoom = TRUE; // } // lstrcpyn(SendMessage.szSystemMessage, pTagSystemMessage->SystemMessage.szSystemMessage, CountArray(SendMessage.szSystemMessage)); // SendMessage.wChatLength = lstrlen(SendMessage.szSystemMessage) + 1; // //发送消息 // WORD wSendSize = sizeof(SendMessage) - sizeof(SendMessage.szSystemMessage) + CountStringBuffer(SendMessage.szSystemMessage); // SendSystemMessage(&SendMessage, wSendSize); // } //} return true; } case IDI_DISTRIBUTE_USER: //分配用户 { //执行分组 PerformDistribute(); return true; } case IDI_TELL_CORRESPOND: //通知协调服务器 { if (m_dwCorrespondNum == 0) { m_dwCorrespondNum++; return true; } //变量定义 CMD_CS_C_TellCorr TellCorr; ZeroMemory(&TellCorr, sizeof(TellCorr)); //服务端口 //CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits; TellCorr.wServerID = m_pGameServiceOption->wServerID; //发送数据 if(m_pITCPSocketService != NULL) m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_TELL_CORRESPOND, &TellCorr, sizeof(TellCorr)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); return true; } default: break; } } //机器时器 //if ((dwTimerID >= IDI_REBOT_MODULE_START) && (dwTimerID <= IDI_REBOT_MODULE_FINISH)) //{ // //时间处理 // m_AndroidUserManager.OnEventTimerPulse(dwTimerID, wBindParam); // return true; //} //比赛定时器 //if ((dwTimerID >= IDI_MATCH_MODULE_START) && (dwTimerID < IDI_MATCH_MODULE_FINISH)) //{ // if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventTimer(dwTimerID, wBindParam); // return true; //} //桌子时间 if ((dwTimerID >= IDI_TABLE_MODULE_START) && (dwTimerID <= IDI_TABLE_MODULE_FINISH)) { //桌子号码 DWORD dwTableTimerID = dwTimerID - IDI_TABLE_MODULE_START; WORD wTableID = (WORD)(dwTableTimerID / TIME_TABLE_MODULE_RANGE); //时间效验 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) { //输出信息 TCHAR szBuffer[128] = TEXT(""); _sntprintf(szBuffer, CountArray(szBuffer), TEXT("未找到桌号[ %d ],定时器标识[ %d ]无法正常运行."), wTableID, dwTimerID); //输出信息 CTraceService::TraceString(szBuffer, TraceLevel_Warning); m_pITimerEngine->KillTimer(dwTimerID); ///+++ 2018-1-23 清除这个定时器 return false; } //时间通知 return pTableFrame->OnEventTimer(dwTableTimerID%TIME_TABLE_MODULE_RANGE, wBindParam); } return false; } //数据库事件 bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize) { switch (wRequestID) { case DBO_GR_LOGON_SUCCESS: //登录成功 { return OnDBLogonSuccess(dwContextID, pData, wDataSize); } case DBO_GR_LOGON_FAILURE: //登录失败 { return OnDBLogonFailure(dwContextID, pData, wDataSize); } case DBO_GR_GET_USER_GAMESCORE_LIST: { return OnDBGetUserGameScoreList(dwContextID, pData, wDataSize); } case DBO_GR_GET_USER_GAMESCORE_DETAIL: { return OnDBGetUserGameScoreRecordDetail(dwContextID, pData, wDataSize); } case DBO_GR_GET_USER_GAMESCORE_REPLAY_RECORD: { return OnDBGetUserGameScoreReplayRecord(dwContextID, pData, wDataSize); } case DBO_GR_GameScoreRecord_RESULT: { return OnDBO_GR_GameScoreRecord_RESULT(dwContextID, pData, wDataSize); } case SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT: { return OnDBO_GR_GameTmpScoreRankListResult(dwContextID, pData, wDataSize); } case SUB_GR_USER_GET_BEAN_RESULT: { return OnDBO_GR_GetBearn(dwContextID, pData, wDataSize); } case SUB_GR_USER_GET_VERIF_CODE://手机重复绑定查询 { return OnDBO_GR_GetVerifCode(dwContextID, pData, wDataSize); } case SUB_GR_USER_CHECK_IPHONE://手机绑定 { return OnDBO_GR_CheckIphone(dwContextID, pData, wDataSize); } case SUB_GR_USER_CHECK_IPHONE_QUERY://手机绑定查询应答 { return OnDBO_GR_CheckIphoneQuery(dwContextID, pData, wDataSize); } case SUB_GR_USER_CHECK_NAME_QUERY: //实名查询应答 { return OnDBO_GR_CheckNameQuery(dwContextID, pData, wDataSize); } case SUB_GF_LOTTERY_ADDRESS://修改地址应答 { return OnDBO_GR_UpdateAddr(dwContextID, pData, wDataSize); } case DBO_GR_GAME_PARAMETER: //游戏参数 { return OnDBGameParameter(dwContextID, pData, wDataSize); } //case DBO_GR_GAME_COLUMN_INFO: //列表信息 //{ // return OnDBGameColumnInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_GAME_ANDROID_PARAMETER: //机器参数 //{ // return OnDBGameAndroidParameter(dwContextID, pData, wDataSize); //} //case DBO_GR_GAME_ANDROID_INFO: //机器信息 //{ // return OnDBGameAndroidInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_GAME_PROPERTY_INFO: //道具信息 //{ // return OnDBGamePropertyInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_GAME_MEMBER_PAREMETER: //会员参数 //{ // return OnDBGameMemberParameter(dwContextID, pData, wDataSize); //} //case DBO_GR_USER_INSURE_INFO: //银行信息 //{ // return OnDBUserInsureInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_USER_INSURE_SUCCESS: //银行成功 //{ // return OnDBUserInsureSuccess(dwContextID, pData, wDataSize); //} //case DBO_GR_USER_INSURE_FAILURE: //银行失败 //{ // return OnDBUserInsureFailure(dwContextID, pData, wDataSize); //} //case DBO_GR_USER_INSURE_USER_INFO: //用户信息 //{ // return OnDBUserInsureUserInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_USER_INSURE_ENABLE_RESULT: //开通结果 //{ // return OnDBUserInsureEnableResult(dwContextID, pData, wDataSize); //} case DBR_GR_USER_CHECK_BEANS_RETURN: { return OnDBR_GR_USER_ZHIJIE_BEANS_RETURN(dwContextID, pData, wDataSize); } case DBR_GR_USER_REDUCE_BEANS_RETURN://消耗元宝 { return OnDBR_GR_USER_REDUCE_BEANS_RETURN(dwContextID, pData, wDataSize); } case DBR_GR_USER_LUCK_BEANS_RETURN://冻结元宝 { return OnDBR_GR_USER_LOCK_BEANS_RETURN(dwContextID, pData, wDataSize); } case DBR_GR_USER_UNLUCK_BEANS_RETURN://解冻元宝 { return OnDBR_GR_USER_UNLOCK_BEANS_RETURN(dwContextID, pData, wDataSize); } //case DBO_GR_PROPERTY_SUCCESS: //道具成功 //{ // return OnDBPropertySuccess(dwContextID, pData, wDataSize); //} //case DBO_GR_SYSTEM_MESSAGE_RESULT: //系统消息 //{ // return OnDBSystemMessage(dwContextID, pData, wDataSize); //} //case DBO_GR_SYSTEM_MESSAGE_FINISH: //加载完成 //{ // return OnDBSystemMessageFinish(dwContextID, pData, wDataSize); //} //case DBO_GR_SENSITIVE_WORDS: //加载敏感词 //{ // return OnDBSensitiveWords(dwContextID, pData, wDataSize); //} //case DBO_GR_TASK_LIST: //任务列表 //{ // return OnDBUserTaskList(dwContextID, pData, wDataSize); //} //case DBO_GR_TASK_LIST_END: //任务结束 //{ // return OnDBUserTaskListEnd(dwContextID, pData, wDataSize); //} //case DBO_GR_TASK_INFO: //任务信息 //{ // return OnDBUserTaskInfo(dwContextID, pData, wDataSize); //} //case DBO_GR_TASK_RESULT: //任务结果 //{ // return OnDBUserTaskResult(dwContextID, pData, wDataSize); //} //case DBO_GR_PURCHASE_RESULT: //购买结果 //{ // return OnDBPurchaseResult(dwContextID, pData, wDataSize); //} //case DBO_GR_EXCHANGE_RESULT: //兑换结果 //{ // return OnDBExChangeResult(dwContextID, pData, wDataSize); //} case DBR_GR_USER_SHRAE_AWARD_RETURN: //分享奖励钻石结果 { return OnDBShareAwardResult(dwContextID, pData, wDataSize); } case DBR_GR_USER_SHRAE_INFO_RETURN: //用户分享信息 { return OnDBShareInfoResult(dwContextID, pData, wDataSize); } //case DBO_GR_TOP_WIN_LIST_RESULT: ///---胜局榜 //{ // return OnDBTopWinList(dwContextID, pData, wDataSize); //} //case DBO_GP_EXCHANGE_CONFIG_LIST_ACK: ///+++兑换配置结果 //{ // return OnDBExchangeConfigList(dwContextID, pData, wDataSize); //} //case DBR_GP_RELIEF_INFO_ACK: ///+++查询破产信息结果 //{ // return OnDBReliefInfo(dwContextID, pData, wDataSize); //} //case DBR_GP_GET_RELIEF_INFO_ACK: //{ // return OnDBGetRelief(dwContextID, pData, wDataSize); //} case DBO_GP_CHECKIN_INFO: //签到信息 { return OnDBUserCheckInInfo(dwContextID, pData, wDataSize); } case DBO_GP_CHECKIN_RESULT: //签到结果 { return OnDBUserCheckInResult(dwContextID, pData, wDataSize); } case DBO_GP_CHECKIN_REWARD: //签到奖品 { return OnDBCheckInReward(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_LIST_ACK: //获取俱乐部列表应答 { return OnDBGetClubList(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_USER_ACK: //获取俱乐部会员应答 { return OnDBGetClubUser(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_USER_ACK_EX: //获取俱乐部会员应答 { return OnDBGetClubUserEx(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_MESSAGE_ACK: //获取俱乐部消息应答 { return OnDBGetClubMessage(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_RECORD_ACK: //获取俱乐部记录应答 { return OnDBGetClubRecord(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_CREATE_ACK: //创建俱乐部应答 { return OnDBCreateClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_UPDATE_ACK: //修改俱乐部应答 { return OnDBUpdateClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_DELETE_ACK: //删除俱乐部应答 { return OnDBDeleteClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_ACK: //查看俱乐部应答 { return OnDBGetClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_JOIN_ACK: //加入俱乐部应答 { return OnDBJoinClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_QUIT_ACK: //退出俱乐部应答 { return OnDBQuitClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_ISAGREE_ACK: //同意俱乐部应答 { return OnDBAgreeClub(dwContextID, pData, wDataSize); } //case DBR_GR_CLUB_GET_ONLINE_ACK: //获取俱乐部在线信息应答 //{ // return OnDBGetClubOnLine(dwContextID, pData, wDataSize); //} case DBR_GR_CLUB_GET_ONLINE_ACKEX: //获取俱乐部在线信息应答 { return OnDBGetClubOnLineEx(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_NOTIFY_ACK: //获取俱乐部在线信通知 { return OnDBNotifyClubUser(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_PROTOCOL_ACK: //查询协议 { return OnDBGetClubProtocol(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_BLACKUSER_ACK: //特殊成员 { return OnDBGetClubBlackUser(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_PROTOCOLAGREE_ACK: { return OnDBAgreeClubProtocol(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_HOSTINFO_ACK: { return OnDBGetClubHostInfo(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_AUTOTABLE_ACK: { return OnDBAutoCreateTable(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_NOTICE_ACK: { return OnDBGetClubNotice(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_RECORD_ACK_EX: { return OnDBGetClubRecordEx(dwContextID, pData, wDataSize); } case DBR_GP_GET_ROULETTE_CONFIG_ACK: ///+++加载大转盘奖品配置结果 { return OnDBRouletteConfig(dwContextID, pData, wDataSize); } case DBR_GP_LOTTERY_HIS_ACK: ///+++中奖历史 { return OnDBLotteryHis(dwContextID, pData, wDataSize); } case DBR_GP_LOTTERY_HIS_ACKEX: ///+++中奖历史 { return OnDBLotteryHisEx(dwContextID, pData, wDataSize); } case DBR_GP_MY_ROULETTE_INFO_ACK: { return OnDBMyRouletteInfo(dwContextID, pData, wDataSize); } case DBR_GP_ROULETTE_LOTTERY_ACK: { return OnDBRouletteLottery(dwContextID, pData, wDataSize); } case DBR_GP_LOTTERY_INFO_ACK: //查询抽奖信息 { return OnDBQueryLotteryInfoResult(dwContextID, pData, wDataSize); } case DBR_GP_WELFARE_INFO_ACK: //查询福利信息 { return OnDBWelfareInfoResult(dwContextID, pData, wDataSize); } case DBR_GP_GET_UNTIE_AGENT_INFO_ACK: { return OnDBUserAgentInfo(dwContextID, pData, wDataSize); //用户获得代理解绑相关信息 } case DBR_GP_GET_ZUANSHI_INFO_ACK: { return OnDBUserUntieAgent(dwContextID, pData, wDataSize); //用户获得解绑所需钻石数目结果 } case DBR_GR_CLUB_DISSOLVEROOM_ACK: { return OnDBGetClubDissolveRoom(dwContextID, pData, wDataSize); } case DBR_GP_LOTTERY_AWARD: { return OnDBRouletteAward(dwContextID, pData, wDataSize); //手动领奖应答 } case DBR_GR_CLUB_SAVE_MORE_WANFA_ACK: //修改保存俱乐部额外玩法应答 { return OnDBUpdateAddClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_MORE_WANFA_ACK: //查看俱乐部应答 { return OnDBGetAddClub(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_XIANLIAO_RECORD: //分享战绩到闲聊群里面 { return OnDBFenXiangReCord(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_COUNT_PLAYGAEMS_ACK: //俱乐部统计对局数回应 { return OnDBGetClubPlaygames_Ack(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_COUNT_INTEGRAL_ACK: //俱乐部统计积分数回应 { return OnDBGetClubIntegral_Ack(dwContextID, pData, wDataSize); } case DBR_GR_CLUB_GET_MAKEA_SAMPLE_ACK: //俱乐部打样 { return OnDBGetClubSample(dwContextID, pData, wDataSize); } case DBR_GP_GET_WENLIN_SHUFFLE_ACK: //温岭洗牌动画 获取砖石数据 { return OnWlShuffleGameHandleACK(dwContextID, pData, wDataSize); } case DBR_GP_DEDUCT_RE_ZUANSHI_INFO: //温岭洗牌动画 扣钻刷新 { return OnWlShuffleGameDeductHandle(pData, wDataSize); } default: break; } //比赛事件 //if (wRequestID >= DBO_GR_MATCH_EVENT_START && wRequestID <= DBO_GR_MATCH_EVENT_END) //{ // CTraceService::TraceString(TEXT("比赛事件 "), TraceLevel_Warning); // //参数效验 // if (m_pIMatchServiceManager == NULL) return false; // //查找用户 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // IServerUserItem * pIServerUserItem = pBindParameter != NULL ? pBindParameter->pIServerUserItem : NULL; // return m_pIMatchServiceManager->OnEventDataBase(wRequestID, pIServerUserItem, pData, wDataSize); //} return false; } //关闭事件 bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason) { //协调连接 if (wServiceID == NETWORK_CORRESPOND) { //设置变量 m_bCollectUser = false; //删除时间 m_pITimerEngine->KillTimer(IDI_REPORT_SERVER_INFO); //重连判断 if (m_bNeekCorrespond == true) { //构造提示 TCHAR szDescribe[128] = TEXT(""); _sntprintf(szDescribe, CountArray(szDescribe), TEXT("与协调服务器的连接关闭了,%ld 秒后将重新连接"), m_pInitParameter->m_wConnectTime); //提示消息 CTraceService::TraceString(szDescribe, TraceLevel_Warning); //设置时间 ASSERT(m_pITimerEngine != NULL); m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, m_pInitParameter->m_wConnectTime * 1000L, 1, 0); } return true; } return false; } //连接事件 bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode) { //协调连接 if (wServiceID == NETWORK_CORRESPOND) { //错误判断 if (nErrorCode != 0) { //构造提示 TCHAR szDescribe[128] = TEXT(""); _sntprintf(szDescribe, CountArray(szDescribe), TEXT("协调服务器连接失败 [ %ld ],%ld 秒后将重新连接"), nErrorCode, m_pInitParameter->m_wConnectTime); //提示消息 CTraceService::TraceString(szDescribe, TraceLevel_Warning); //设置时间 ASSERT(m_pITimerEngine != NULL); m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, m_pInitParameter->m_wConnectTime * 1000L, 1, 0); return false; } CString csTemp; csTemp.Format(L"[%d]正在发送游戏房间注册信息...", m_pGameServiceOption->wServerID); //提示消息 CTraceService::TraceString(csTemp, TraceLevel_Normal); //变量定义 CMD_CS_C_RegisterServer RegisterServer; ZeroMemory(&RegisterServer, sizeof(RegisterServer)); //服务端口 CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits; RegisterServer.wServerPort = pServiceUnits->m_TCPNetworkEngine->GetCurrentPort(); //构造数据 RegisterServer.wKindID = m_pGameServiceOption->wKindID; RegisterServer.wNodeID = m_pGameServiceOption->wNodeID; RegisterServer.wSortID = m_pGameServiceOption->wSortID; RegisterServer.wServerID = m_pGameServiceOption->wServerID; RegisterServer.wServerKind = m_pGameServiceOption->wServerKind; RegisterServer.wServerType = m_pGameServiceOption->wServerType; RegisterServer.lCellScore = m_pGameServiceOption->lCellScore; RegisterServer.lEnterScore = m_pGameServiceOption->lMinEnterScore; if (CServiceUnits::g_pServiceUnits) RegisterServer.wServerLevel = CServiceUnits::g_pServiceUnits->m_InitParameter.m_ServiceLevel; RegisterServer.dwOnLineCount = m_ServerUserManager.GetUserItemCount(); RegisterServer.dwFullCount = m_pGameServiceOption->wMaxPlayer - RESERVE_USER_COUNT; RegisterServer.dwFullTable = m_pGameServiceOption->wTableCount; RegisterServer.dwServerRule = m_pGameServiceOption->dwServerRule&SR_ALLOW_AVERT_CHEAT_MODE; lstrcpyn(RegisterServer.szServerName, m_pGameServiceOption->szServerName, CountArray(RegisterServer.szServerName)); lstrcpyn(RegisterServer.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(RegisterServer.szServerAddr)); RegisterServer.bService = m_Service; //是否提供服务 //发送数据 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_SERVER, &RegisterServer, sizeof(RegisterServer)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); //发送用户房间列表 auto iter = m_UserID_2_PriTableIDGROUP.begin(); while (iter != m_UserID_2_PriTableIDGROUP.end()) { JN_GR_RoomListGroup jRG = iter->second; for (size_t i = 0; i < (jRG.Num > 30 ? 30 : jRG.Num); i++) { jRG.jgrDate[i].dwInsert_UpData_Del = 0; UpdataBodyOwnRoomToServer(&jRG.jgrDate[i], sizeof(jRG.jgrDate[i])); } iter++; } //设置时间 ASSERT(m_pITimerEngine != NULL); m_dwCorrespondNum = 0;//计数归零 m_pITimerEngine->SetTimer(IDI_REPORT_SERVER_INFO, TIME_REPORT_SERVER_INFO * 1000L, TIMES_INFINITY, 0); m_pITimerEngine->SetTimer(IDI_TELL_CORRESPOND, TIME_TELL_CORRESPOND * 1000L, TIMES_INFINITY, 0); return true; } return true; } //读取事件 bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize) { //协调连接 if (wServiceID == NETWORK_CORRESPOND) { switch (Command.wMainCmdID) { case MDM_CS_REGISTER: //注册服务 { return OnTCPSocketMainRegister(Command.wSubCmdID, pData, wDataSize); } case MDM_CS_SERVICE_INFO: //服务信息 { return OnTCPSocketMainServiceInfo(Command.wSubCmdID, pData, wDataSize); } case MDM_CS_USER_COLLECT: //用户汇总 { return OnTCPSocketMainUserCollect(Command.wSubCmdID, pData, wDataSize); } case MDM_CS_MANAGER_SERVICE: //管理服务 { return OnTCPSocketMainManagerService(Command.wSubCmdID, pData, wDataSize); } //case MDM_CS_ANDROID_SERVICE: //机器服务 //{ // CTraceService::TraceString(TEXT("机器服务已屏蔽 MDM_CS_ANDROID_SERVICE"), TraceLevel_Warning); // //return OnTCPSocketMainAndroidService(Command.wSubCmdID, pData, wDataSize); //} default: break; } } //错误断言 ASSERT(FALSE); return true; } //应答事件 bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID) { //变量定义 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); //设置变量 if (pBindParameter != NULL) { pBindParameter->dwSocketID = dwSocketID; pBindParameter->dwClientAddr = dwClientAddr; TCHAR szClientAddr[16] = TEXT(""); BYTE * pClientAddr = (BYTE *)&pBindParameter->dwClientAddr; _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]); pBindParameter->dwActiveTime = (DWORD)time(NULL); m_Data.iSocketNum = wBindIndex + 1; return true; } //错误断言 ASSERT(FALSE); return false; } //关闭事件 bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID) { //变量定义 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); if (pBindParameter == NULL) return false; m_Data.iSocketNum = wBindIndex - 1; //获取用户 IServerUserItem * pIServerUserItem = pBindParameter->pIServerUserItem; WORD wTableID = INVALID_WORD; //CString csTest1; //csTest1.Format(_T("断线重连 UserID:%d dwSocketID:%d "), pIServerUserItem->GetUserID(), dwSocketID); ////提示消息 //CTraceService::TraceString(csTest1, TraceLevel_Warning); try { // 此部分代码意义表明: // 在旁观状态,大厅状态,桌号为无效的状态下,断线将直接导致用户退出。人物信息从队列中删除。报告总服务器人物退出 // 其余状态下,用户保留绑定信息,变更为掉线状态 tagBindParameter 人物信息队列依然存在 // 用户处理 if (pIServerUserItem != NULL) { //变量定义 wTableID = pIServerUserItem->GetTableID(); //断线处理 if (wTableID != INVALID_TABLE && pIServerUserItem->GetUserInfo()->cbUserStatus != US_LOOKON && pIServerUserItem->GetUserInfo()->cbUserStatus != US_FREE && pIServerUserItem->GetUserInfo()->cbUserStatus != US_NULL) { //解除绑定 pIServerUserItem->DetachBindStatus(); /*注释原因:没桌子时不要return出去 by yd auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; //TCHAR szString[512] = TEXT(""); //_sntprintf(szString, CountArray(szString), TEXT("游戏中用户 %s(%d) 掉线。"), pIServerUserItem->GetUserInfo()->szNickName, pIServerUserItem->GetUserInfo()->dwUserID); //提示消息 //CTraceService::TraceString(szString, TraceLevel_Normal); //断线通知 pTableFrame->OnEventUserOffLine(pIServerUserItem); */ auto pTableFrame = GetTableFrame(wTableID); if (pTableFrame != NULL) { //断线通知 pTableFrame->OnEventUserOffLine(pIServerUserItem); } } else { if (pIServerUserItem->GetUserInfo()->cbUserStatus == US_LOOKON) { //清楚旁观者 if (wTableID != INVALID_TABLE) { auto pTableFrame = GetTableFrame(wTableID); if (pTableFrame) { pTableFrame->PerformStandUpAction(pIServerUserItem); } } } // pIServerUserItem->SetUserStatus(US_NULL, INVALID_TABLE, INVALID_CHAIR); pIServerUserItem->DetachBindStatus(); //解除绑定的结果将导致tagBindParameter 中的人物指针不被释放 尝试解决。 by jn 2017/11/15 } } } catch (...) { TCHAR szMessage[128] = TEXT(""); _sntprintf(szMessage, CountArray(szMessage), TEXT("关闭连接异常: wTableID=%d"), wTableID); CTraceService::TraceString(szMessage, TraceLevel_Normal); } //清除信息 ZeroMemory(pBindParameter, sizeof(tagBindParameter)); return false; } CString CAttemperEngineSink::dwIP2csIP(DWORD dwIP) { CString strIP = _T(""); WORD add1, add2, add3, add4; add1 = (WORD)(dwIP & 255); add2 = (WORD)((dwIP >> 8) & 255); add3 = (WORD)((dwIP >> 16) & 255); add4 = (WORD)((dwIP >> 24) & 255); strIP.Format(_T("%d.%d.%d.%d"), add1, add2, add3, add4); return strIP; } //读取事件 bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID) { //记录 读取事件的日志 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); DWORD dTableNum = 0; CString AppName = _T("CorrespondServer"); CString csTest = AfxGetAppName(); CString csSend; CString AppName1 = _T("中心集成服务器"); DWORD dUserID = 0; if (!(Command.wSubCmdID == SUB_KN_DETECT_SOCKET && Command.wMainCmdID == MDM_KN_COMMAND) && !(Command.wMainCmdID == 5 && Command.wSubCmdID == 3) && !(Command.wMainCmdID == 2 && Command.wSubCmdID == 1 && (AppName1 == csTest || AppName == csTest))) { CString csTestT; CString csTest1 = AfxGetAppName(); if (pIBindUserItem) { csTestT.Format(_T("%s"), dwIP2csIP(pIBindUserItem->GetClientAddr())); if (pIBindUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIBindUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); } } } else { csTestT = _T("未知IP"); } csSend.Format(_T("进程【%s】【接收】 <- %s 主命令码【%d】 子命令码【%d】\n\r"), csTest1, csTestT, Command.wMainCmdID, Command.wSubCmdID); //OutputDebugString(csSend); if (pIBindUserItem) { dUserID = pIBindUserItem->GetUserID(); } Commend::ToShow(this, Command.wMainCmdID, Command.wSubCmdID, pData, wDataSize, dTableNum, pIBindUserItem == NULL ? NULL : dUserID, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString(), false); } //if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; } bool bRet = false; switch (Command.wMainCmdID) { case MDM_GR_LOGON: //登录命令 { bRet = OnTCPNetworkMainLogon(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } case MDM_GR_USER: //用户命令 { bRet = OnTCPNetworkMainUser(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } case MDM_GR_MANAGE: //管理命令 { bRet = OnTCPNetworkMainManage(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } case MDM_GR_CLUB: //俱乐部命令 { bRet = OnTCPNetworkMainClub(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } case MDM_GF_FRAME: //框架命令 { bRet = OnTCPNetworkMainFrame(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } case MDM_GF_GAME: //游戏命令 { CTimer Start; bRet = OnTCPNetworkMainGame(Command.wSubCmdID, pData, wDataSize, dwSocketID); double dRet = Start.End(); if (IsJC(6666)) { CString csTest1; csTest1.Format(_T("游戏模块耗时 cmdid:%d ----> %.3f "), Command.wSubCmdID, dRet); //提示消息 CTraceService::TraceString(csTest1, TraceLevel_Warning); } if (IsJC(5555) && dUserID != 0 && IsJC(dUserID)) { CString csTest2; csTest2.Format(_T("[%d]游戏模块耗时 cmdid:%d ----> %.3f "), dUserID, Command.wSubCmdID, dRet); //提示消息 CTraceService::TraceString(csTest2, TraceLevel_Warning); } break; } case MDM_GF_ROULETEE: ///+++大转盘 { bRet = OnTCPNetworkMainRoulette(Command.wSubCmdID, pData, wDataSize, dwSocketID); break; } //case MDM_GR_INSURE: //银行命令 //{ // if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; } // bRet = OnTCPNetworkMainInsure(Command.wSubCmdID, pData, wDataSize, dwSocketID); //} //case MDM_GR_TASK: //任务命令 //{ // if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; } // bRet = OnTCPNetworkMainTask(Command.wSubCmdID, pData, wDataSize, dwSocketID); //} //case MDM_GR_EXCHANGE: //兑换命令 //{ // CTraceService::TraceString(TEXT("兑换命令已屏蔽 OnTCPNetworkMainExchange"), TraceLevel_Warning); // //if (pIBindUserItem == NULL) return true; // //bRet = OnTCPNetworkMainExchange(Command.wSubCmdID, pData, wDataSize, dwSocketID); // break; //} //case MDM_GR_VENUE: ///+++场馆命令 //{ // bRet = OnTCPNetworkMainVenue(Command.wSubCmdID, pData, wDataSize, dwSocketID); // break; //} //case MDM_GR_MATCH: //比赛命令 //{ // if (pIBindUserItem == NULL) return true; // bRet = OnTCPNetworkMainMatch(Command.wSubCmdID, pData, wDataSize, dwSocketID); //} case MDM_GR_CHECK: //通道检测 { if (Command.wSubCmdID != 1) return false; CTraceService::TraceString(TEXT("通道检测已屏蔽 MDM_GR_CHECK"), TraceLevel_Warning); //效验参数 ASSERT(wDataSize == sizeof(CHECK)); if (wDataSize != sizeof(CHECK)) return false; //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_CHECK, 1, pData, wDataSize); return true; } default: break; } if (bRet) { m_Data.iQNum++; } else { m_Data.iErrQ++; } //ASSERT(bRet); return bRet; } //房间消息 bool CAttemperEngineSink::SendRoomMessage(LPCTSTR lpszMessage, WORD wType) { //变量定义 CMD_CM_SystemMessage SystemMessage; ZeroMemory(&SystemMessage, sizeof(SystemMessage)); //构造数据 SystemMessage.wType = wType; SystemMessage.wLength = lstrlen(lpszMessage) + 1; lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString)); //数据属性 WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString); WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString); CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE); //OutputDebugString(csSend); Commend::ToShow(this, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize, 0, 0, m_pIGameServiceManager->GetDataString()); //发送数据 //m_AndroidUserManager.SendDataToClient(MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize); m_pITCPNetworkEngine->SendDataBatch(MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize, BG_COMPUTER); return true; } //游戏消息 bool CAttemperEngineSink::SendGameMessage(LPCTSTR lpszMessage, WORD wType) { //变量定义 CMD_CM_SystemMessage SystemMessage; ZeroMemory(&SystemMessage, sizeof(SystemMessage)); //构造数据 SystemMessage.wType = wType; SystemMessage.wLength = lstrlen(lpszMessage) + 1; lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString)); //数据属性 WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString); WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString); CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE); //OutputDebugString(csSend); Commend::ToShow(this, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, &SystemMessage, wSendSize, 0, 0, m_pIGameServiceManager->GetDataString()); GameInfo::PB_CS_S_SystemMessage Message; Message.set_wtype(SystemMessage.wType); Message.set_wlength(SystemMessage.wLength); std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz; Message.set_szstring(szString); //发送数据 std::string pbdata = Message.SerializePartialAsString(); //发送数据 //m_AndroidUserManager.SendDataToClient(MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE,(void*)pbdata.c_str(), pbdata.length()); m_pITCPNetworkEngine->SendDataBatch(MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length(), BG_COMPUTER); return true; } //房间消息 bool CAttemperEngineSink::SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //发送数据 if (pIServerUserItem->GetBindIndex() != INVALID_WORD) { //变量定义 CMD_CM_SystemMessage SystemMessage; ZeroMemory(&SystemMessage, sizeof(SystemMessage)); //构造数据 SystemMessage.wType = wType; SystemMessage.wLength = lstrlen(lpszMessage) + 1; lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString)); //数据属性 WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString); WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString); //常规用户 if (pIServerUserItem == NULL) return false; WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); if (pBindParameter == NULL) return false; GameInfo::PB_CS_S_SystemMessage Message; Message.set_wtype(SystemMessage.wType); Message.set_wlength(SystemMessage.wLength); std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz; Message.set_szstring(szString); //发送数据 std::string pbdata = Message.SerializePartialAsString(); if (pBindParameter->dwSocketID != 0) m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length()); return true; } return false; } //游戏消息 bool CAttemperEngineSink::SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //发送数据 if ((pIServerUserItem->GetBindIndex() != INVALID_WORD) && (pIServerUserItem->IsClientReady() == true)) { //变量定义 CMD_CM_SystemMessage SystemMessage; ZeroMemory(&SystemMessage, sizeof(SystemMessage)); //构造数据 SystemMessage.wType = wType; SystemMessage.wLength = lstrlen(lpszMessage) + 1; lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString)); //变量定义 //WORD dwUserIndex = pIServerUserItem->GetBindIndex(); //tagBindParameter * pBindParameter = GetBindParameter(dwUserIndex); //数据属性 WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString); WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString); //发送数据 if (pIServerUserItem->IsAndroidUser() == true) { //机器用户 const WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); GameInfo::PB_CS_S_SystemMessage Message; Message.set_wtype(SystemMessage.wType); Message.set_wlength(SystemMessage.wLength); std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz; Message.set_szstring(szString); //发送数据 std::string pbdata = Message.SerializePartialAsString(); //m_AndroidUserManager.SendDataToClient(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length()); //关闭处理 //if ((wType&(SMT_CLOSE_ROOM | SMT_CLOSE_LINK)) != 0) m_AndroidUserManager.DeleteAndroidUserItem(pBindParameter->dwSocketID, true); } else { //常规用户 WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); DWORD dTableNum = 0; if (pIBindUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIBindUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); } } CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE); //OutputDebugString(csSend); Commend::ToShow(this, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, &SystemMessage, wSendSize, dTableNum, pIBindUserItem == NULL ? NULL : pIBindUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); GameInfo::PB_CS_S_SystemMessage Message; Message.set_wtype(SystemMessage.wType); Message.set_wlength(SystemMessage.wLength); std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz; Message.set_szstring(szString); //发送数据 std::string pbdata = Message.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length()); } return true; } return false; } //同步事件 bool CAttemperEngineSink::OnTongBu(int Command, DWORD dwContextID, VOID * pData, WORD wDataSize) { switch (Command) { case DBO_GR_GAME_JC://监测 { if (wDataSize == 0) { ZeroMemory(&m_JC, sizeof(m_JC)); } else { ST_JCDATA * p = (ST_JCDATA *)pData; m_JC = *p; } return true; } case TB_LOGINOK://登录成功 { return OnDBLogonSuccessSend(dwContextID, pData, wDataSize); } case TB_GR_UPDATA://刷新元宝 { return OnDBO_GR_GetBearnSEND(dwContextID, pData, wDataSize); } case TB_GR_ZJXF://直接扣除元宝 { return OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND(dwContextID, pData, wDataSize); } case TB_GR_XF://从冻结中扣除元宝 { return OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND(dwContextID, pData, wDataSize); } case TB_GR_UNLOCK://解冻元宝 { return OnDBR_GR_USER_UNLOCK_BEANS_RETURNSEND(dwContextID, pData, wDataSize); } case TB_GR_LOCK://锁定元宝 { return OnDBR_GR_USER_LOCK_BEANS_RETURNSEND(dwContextID, pData, wDataSize); } case DBO_GR_GAME_GG://发布公告 { ASSERT(pData != NULL); if (pData == NULL) return true; ASSERT(wDataSize == sizeof(CMD_GR_SendMessage)); if (wDataSize != sizeof(CMD_GR_SendMessage)) return true; return OnTCPNetworkSubSendMessage(pData, wDataSize); } case DBO_GR_STOP_GG://停止公告 { RemoveSystemMessage();//清楚公告数据 return true; } case DBO_GR_GAME_CJ://本节点创建房间状态改变 { int *p = (int*) pData; if (*p == 1) { //允许创建 m_BCreate = TRUE; } else { //不允许创建 m_BCreate = FALSE; } return true; } case DBO_GR_GAME_HUA_CREATE://创建花牌房间得状态改变 { int *p = (int*)pData; if (*p == 1) { //允许创建 m_BCreate_Hua = TRUE; } else { //不允许创建 m_BCreate_Hua = FALSE; } return true; } case DBO_GR_GAME_JR://本节点加入房间控制状态改变 { int *p = (int*)pData; if (*p == 1) { //允许创建 m_BAddCreate = TRUE; } else { //不允许创建 m_BAddCreate = FALSE; } return true; } case DBO_GR_GAME_JSFREEALL://本节点解散所有空闲房间 { loop1: for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++) { if (iter->second != nullptr) { auto pTableFrame = iter->second; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (!csTemp.IsEmpty()) { //解散 删除流程 if (pTableFrame->SetTableFree()) { goto loop1; } } } } return true; } case DBO_GR_GAME_WORK://当前节点是否提供服务 { JN_GR_SERVICESTAT aa; ZeroMemory(&aa, sizeof(aa)); aa.dwServerID = m_pGameServiceOption->wServerID; int *pRoomID = (int*)pData; aa.bService = *pRoomID; m_Service = aa.bService; UpdataServerStata(&aa, sizeof(JN_GR_SERVICESTAT)); return true; } case DBO_GR_GAME_JSGAMEALL://本节点解散所有游戏中房间 { OnTCPNetworkSubKickAllUser(); return true; } case DBO_GR_GAME_JSROOM://本节点解散指定房间 { int *pRoomID = (int*)pData; CString csTest; csTest.Format(L"%d", *pRoomID); for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++) { if (iter->second != nullptr) { auto pTableFrame = iter->second; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (!csTemp.IsEmpty() && csTemp == csTest) { if (pTableFrame->GetStartCount() == 0) { pTableFrame->SetTableFree(); } else { pTableFrame->DismissGame(); } break; } } } return true; } case DBO_GR_GAME_FIND: //查询房间信息 { int *pRoomID = (int*)pData; CString csTest; CGameServerDlg*p = (CGameServerDlg*)theApp.m_pMainWnd; p->game1.SetWindowText(_T("等待数据中...")); p->game2.SetWindowText(_T("等待数据中...")); p->game3.SetWindowText(_T("等待数据中...")); p->game4.SetWindowText(_T("等待数据中...")); p->game5.SetWindowText(_T("等待数据中...")); p->game6.SetWindowText(_T("等待数据中...")); p->game7.SetWindowText(_T("等待数据中...")); p->game8.SetWindowText(_T("等待数据中...")); csTest.Format(L"%d", *pRoomID); for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++) { if (iter->second != nullptr) { auto pTableFrame = iter->second; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (csTemp != _T("") && csTemp == csTest) { CString csTestT; csTestT.Format(_T("%s"), pTableFrame->IsGameStarted() ? _T("已开始"):_T("未开始")); p->game1.SetWindowText(csTestT);//游戏状态 IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pTableFrame->GetPrivateTableOwnerID()); csTestT.Format(_T("%s(%d)"), pITargerUserItem == NULL ? _T("未找到昵称") :pITargerUserItem->GetNickName(), pTableFrame->GetPrivateTableOwnerID()); p->game2.SetWindowText(csTestT);//游戏状态 csTestT.Format(_T("%d"), pTableFrame->GetGameConfig().wPlayRule); p->game3.SetWindowText(csTestT);//游戏状态 csTestT.Format(_T("%d"), pTableFrame->GetDrawCount()); p->game4.SetWindowText(csTestT);//游戏状态 pITargerUserItem = pTableFrame->GetTableUserItem(0); csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus); p->game5.SetWindowText(csTestT);//游戏状态 pITargerUserItem = pTableFrame->GetTableUserItem(1); csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus); p->game6.SetWindowText(csTestT);//游戏状态 pITargerUserItem = pTableFrame->GetTableUserItem(2); csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus); p->game7.SetWindowText(csTestT);//游戏状态 pITargerUserItem = pTableFrame->GetTableUserItem(3); csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID() , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus); p->game8.SetWindowText(csTestT);//游戏状态 break; } } } return true; } case DBO_GR_SHUTDOWN_USER://强行断线指定用户 { DWORD *pUserID = (DWORD*)pData; WORD wEnumIndex = 0; IServerUserItem * pITargerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); while (pITargerUserItem != NULL) { if (pITargerUserItem->GetUserID() == *pUserID) { WORD dwUserIndex = pITargerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(dwUserIndex); if (pBindParameter) { m_pITCPNetworkEngine->CloseSocket(pBindParameter->dwSocketID); } break; } //枚举用户 pITargerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); } return true; } case DBO_GR_UPTONGDAO://更新通道 { UpDataTongDao(); return true; } case DBO_GR_CLEAR://定时清空 { //清除 m_MapUserIDJuli.RemoveAll(); m_UserID_2_PriTableIDGROUP.clear(); return true; } case DBO_GR_UPTONGDAOACK://更新通道处理完成 { ASSERT(wDataSize == sizeof(LianLuGroup)); if (wDataSize != sizeof(LianLuGroup)) return true; LianLuGroup *pGroup = static_cast(pData); //枚举数据 POSITION Position = nullptr; //枚举数据 for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++) { //获取数据 CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position); if (pGameServerItem == NULL) continue; std::wstring cc = pGameServerItem->m_GameServer.szServerAddr; std::wstring dd = pGroup->szAdminIP; if (cc == dd) { for (int j = 0; j < MAX_TONGDAO; j++) { std::wstring ip = pGroup->Data[j].szIP; if (ip == _T("")) continue; pGameServerItem->SetLLStat(pGroup->Data[j].szIP, pGroup->Data[j].iIsOk, pGroup->Data[j].SystemTimeConclude); //CString szString; //szString.Format(L"通道更新->管理IP %s 通道IP %s 状态 %d", dd, pGroup->Data[i].szIP, pGroup->Data[i].iIsOk); //提示消息 //CTraceService::TraceString(szString, TraceLevel_Normal); } } } return true; } default: break; } return true; } //房间消息 bool CAttemperEngineSink::SendRoomMessage(DWORD dwSocketID, LPCTSTR lpszMessage, WORD wType, bool bAndroid) { //变量定义 CMD_CM_SystemMessage SystemMessage; ZeroMemory(&SystemMessage, sizeof(SystemMessage)); //构造数据 SystemMessage.wType = wType; SystemMessage.wLength = lstrlen(lpszMessage) + 1; lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString)); //数据属性 WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString); WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString); WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); DWORD dTableNum = 0; if (pIBindUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIBindUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); } } //发送数据 if (bAndroid) { //机器用户 //m_AndroidUserManager.SendDataToClient(dwSocketID, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize); } else { CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE); //OutputDebugString(csSend); Commend::ToShow(this, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize, dTableNum, pIBindUserItem == NULL ? NULL : pIBindUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); //常规用户 m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize); } return true; } //发送数据 bool CAttemperEngineSink::SendData(BYTE cbSendMask, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { //机器数据 //if ((cbSendMask&BG_COMPUTER) != 0) //{ // m_AndroidUserManager.SendDataToClient(wMainCmdID, wSubCmdID, pData, wDataSize); //} CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID); //OutputDebugString(csSend); Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, 0, 0, m_pIGameServiceManager->GetDataString()); //用户数据 if (cbSendMask == BG_ALL_CLIENT) { m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, BG_MOBILE); //m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, BG_COMPUTER, 0, m_pIGameServiceManager->GetDataString()); } else { m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, cbSendMask); } return true; } //发送数据 bool CAttemperEngineSink::SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { //发送数据 if (LOWORD(dwSocketID) != INVALID_WORD) { if (LOWORD(dwSocketID) >= INDEX_ANDROID) { //机器用户 //m_AndroidUserManager.SendDataToClient(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); } else { try { WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); DWORD dTableNum = 0; if (pIBindUserItem && pIBindUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIBindUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); } } CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID); //OutputDebugString(csSend); Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, dTableNum, pIBindUserItem == NULL ? NULL : pIBindUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); } catch (...) { } //网络用户 m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); } } return true; } //发送数据 bool CAttemperEngineSink::SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //发送数据 if (pIServerUserItem->GetBindIndex() != INVALID_WORD) { if (pIServerUserItem->IsAndroidUser() == true) { //机器用户 WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); //m_AndroidUserManager.SendDataToClient(pBindParameter->dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); } else { //常规用户 WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); DWORD dTableNum = 0; if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIServerUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); } } CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID); //OutputDebugString(csSend); //CTraceService::TraceString(csSend, TraceLevel_Normal); Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, dTableNum, pIServerUserItem == NULL ? NULL : pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); } return true; } return false; } //群发数据 bool CAttemperEngineSink::SendDataBatchToMobileUser(WORD wCmdTable, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pUserItem) { //枚举用户 WORD wEnumIndex = 0; while (wEnumIndex < m_ServerUserManager.GetUserItemCount()) { //过滤用户 IServerUserItem *pIServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); if (pIServerUserItem == NULL) continue; if (!pIServerUserItem->IsMobileUser()) continue; //if (pUserItem == pIServerUserItem) continue;//不再发给自己 if (MDM_GR_USER == wMainCmdID && SUB_GR_USER_STATUS == wSubCmdID) { //状态变化 CMD_GR_UserStatus *pUserStatus = (CMD_GR_UserStatus *)pData; if (pUserStatus->UserStatus.cbUserStatus == US_LOOKON) { if (pUserItem != pIServerUserItem) continue;//不再给别人 } } //定义变量 WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule(); WORD wTagerTableID = pIServerUserItem->GetTableID(); bool bViewModeAll = ((wMobileUserRule&VIEW_MODE_ALL) != 0); bool bRecviceGameChat = ((wMobileUserRule&RECVICE_GAME_CHAT) != 0); bool bRecviceRoomChat = ((wMobileUserRule&RECVICE_ROOM_CHAT) != 0); bool bRecviceRoomWhisper = ((wMobileUserRule&RECVICE_ROOM_WHISPER) != 0); //状态过滤 if ((pIServerUserItem->GetUserStatus() >= US_SIT) && (m_pGameServiceOption->wServerType != GAME_GENRE_MATCH)) { //如果玩家在房间里,则只广播给房间中的玩家 if (wTagerTableID != wCmdTable) { continue; } } //聊天过滤 if (wSubCmdID == SUB_GR_USER_CHAT || wSubCmdID == SUB_GR_USER_EXPRESSION) { if (!bRecviceGameChat || !bRecviceRoomChat) continue; //如果玩家设置了不接受聊天消息,则不发送给他 } if (wSubCmdID == SUB_GR_WISPER_CHAT || wSubCmdID == SUB_GR_WISPER_EXPRESSION) { if (!bRecviceRoomWhisper) continue; //如果玩家设置了不接受私聊消息,则不发送给他 } if ((pIServerUserItem->GetUserStatus() == US_FREE)) { if (wTagerTableID == INVALID_TABLE) { //如果玩家大厅,广播给自己。 if (pUserItem != pIServerUserItem) continue; } else { if (wTagerTableID != wCmdTable) continue; } } //部分可视 if (!bViewModeAll) { //消息过滤 if (wSubCmdID == SUB_GR_USER_ENTER && wCmdTable == INVALID_TABLE) continue; if (wSubCmdID == SUB_GR_USER_SCORE && pIServerUserItem->GetUserStatus() < US_SIT) continue; ////定义变量 //WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos(); //WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount(); //状态消息过滤 取消分页过滤 //if (wCmdTable < wTagerDeskPos) continue; //if (wCmdTable > (wTagerDeskPos + wTagerDeskCount - 1)) continue; } CMD_GR_UserStatus* UserStatus = (CMD_GR_UserStatus*)pData; UserInfo::PB_CS_S_UserStatus Status; Status.set_dwuserid(UserStatus->dwUserID); Status.mutable_userstatus()->set_cbuserstatus(UserStatus->UserStatus.cbUserStatus); Status.mutable_userstatus()->set_wchairid(UserStatus->UserStatus.wChairID); Status.mutable_userstatus()->set_wtableid(UserStatus->UserStatus.wTableID); //发送数据 std::string pbdata = Status.SerializePartialAsString(); SendData(pIServerUserItem, wMainCmdID, wSubCmdID, (void*)pbdata.c_str(), pbdata.length()); } return true; } //用户积分 bool CAttemperEngineSink::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //变量定义 /*CMD_GR_UserScore UserScore; tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); //构造积分 UserScore.UserScore.lScore = pUserInfo->lScore; UserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); UserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); //发送数据 SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore)); //变量定义 CMD_GR_MobileUserScore MobileUserScore; //构造数据 MobileUserScore.dwUserID = pUserInfo->dwUserID; //构造积分 MobileUserScore.UserScore.lScore = pUserInfo->lScore; MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); //发送数据 SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore)); */ //即时写分 if ((CServerRule::IsImmediateWriteScore(m_pGameServiceOption->dwServerRule) == true) && (pIServerUserItem->IsVariation() == true)) { //变量定义 DBR_GR_WriteGameScore WriteGameScore; ZeroMemory(&WriteGameScore, sizeof(WriteGameScore)); //用户信息 WriteGameScore.dwUserID = pIServerUserItem->GetUserID(); WriteGameScore.dwDBQuestID = pIServerUserItem->GetDBQuestID(); WriteGameScore.dwClientAddr = pIServerUserItem->GetClientAddr(); WriteGameScore.dwInoutIndex = pIServerUserItem->GetInoutIndex(); //提取积分 pIServerUserItem->DistillVariation(WriteGameScore.VariationInfo); //调整分数 if (pIServerUserItem->IsAndroidUser() == true) { WriteGameScore.VariationInfo.lScore = 0; WriteGameScore.VariationInfo.lGrade = 0; WriteGameScore.VariationInfo.lInsure = 0; } //查找任务 //tagUserTaskEntry * pUserTaskEntry = m_UserTaskManager.GetUserTaskEntry(pIServerUserItem->GetUserID(), TASK_STATUS_UNFINISH); //if (pUserTaskEntry != NULL) WriteGameScore.bTaskForward = true; //投递请求 m_pIDBCorrespondManager->PostDataBaseRequest(WriteGameScore.dwUserID, DBR_GR_WRITE_GAME_SCORE, 0L, &WriteGameScore, sizeof(WriteGameScore), TRUE); //推进任务 //if (pUserTaskEntry != NULL) //{ // PerformTaskProgress(pIServerUserItem, pUserTaskEntry, WriteGameScore.VariationInfo.dwWinCount, WriteGameScore.VariationInfo.dwLostCount, WriteGameScore.VariationInfo.dwDrawCount); //} } //通知桌子 auto wTableID = pIServerUserItem->GetTableID(); if (wTableID != INVALID_TABLE) { auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; pTableFrame->OnUserScroeNotify(pIServerUserItem->GetChairID(), pIServerUserItem, cbReason); } return true; } //用户状态 bool CAttemperEngineSink::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID, bool bSendState) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //变量定义 CMD_GR_UserStatus UserStatus; ZeroMemory(&UserStatus, sizeof(UserStatus)); //构造数据 UserStatus.dwUserID = pIServerUserItem->GetUserID(); UserStatus.UserStatus.wTableID = pIServerUserItem->GetTableID(); UserStatus.UserStatus.wChairID = pIServerUserItem->GetChairID(); UserStatus.UserStatus.cbUserStatus = pIServerUserItem->GetUserStatus(); //修改信息 if (pIServerUserItem->GetUserStatus() == US_SIT && pIServerUserItem->IsMobileUser()) { //定义变量 WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos(); WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount(); if (pIServerUserItem->GetTableID() > (wTagerDeskPos + wTagerDeskCount - 1)) { //定义变量 WORD wNewDeskPos = (pIServerUserItem->GetTableID() / wTagerDeskCount)*wTagerDeskCount; //修改信息 pIServerUserItem->SetMobileUserDeskPos(wNewDeskPos); } } if (!bSendState) { if (pIServerUserItem->GetUserStatus() == US_SIT || pIServerUserItem->GetUserStatus() == US_READY || pIServerUserItem->GetUserStatus() == US_PLAYING || pIServerUserItem->GetUserStatus() == US_LOOKON || pIServerUserItem->GetUserStatus() == US_PLAYINGWAIT) { SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_STATUS, &UserStatus, sizeof(UserStatus), pIServerUserItem); if (UserStatus.UserStatus.cbUserStatus == US_SIT) { //是坐下,推送当前用户的用户信息。 if (UserStatus.UserStatus.wChairID != INVALID_CHAIR) { //变量定义 tagMobileUserInfoHead pUserInfoHead; tagUserInfo *pUserInfo = pIServerUserItem->GetUserInfo(); //用户属性 pUserInfoHead.wFaceID = pUserInfo->wFaceID; pUserInfoHead.dwGameID = pUserInfo->dwGameID; pUserInfoHead.dwUserID = pUserInfo->dwUserID; pUserInfoHead.dwCustomID = pUserInfo->dwCustomID; //用户属性 pUserInfoHead.cbGender = pUserInfo->cbGender; pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder; //用户状态 pUserInfoHead.wTableID = pUserInfo->wTableID; pUserInfoHead.wChairID = pUserInfo->wChairID; pUserInfoHead.cbUserStatus = US_SIT; //用户局数 pUserInfoHead.dwWinCount = pUserInfo->dwWinCount; pUserInfoHead.dwLostCount = pUserInfo->dwLostCount; pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount; pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount; pUserInfoHead.dwExperience = pUserInfo->dwExperience; pUserInfoHead.iJiePing = pUserInfo->llJiePing; pUserInfoHead.iXinYong = pUserInfo->iXinYong; pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX; pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY; lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate)); lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi)); //用户成绩 pUserInfoHead.lScore = pUserInfo->lScore; pUserInfoHead.lScore += pIServerUserItem->GetTrusteeScore(); pUserInfoHead.lScore += pIServerUserItem->GetFrozenedScore(); lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName)); //用户头像地址 lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl)); //IP地址 pUserInfoHead.dwClientAddr = pIServerUserItem->GetClientAddr(); UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead; UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID); UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID); UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID); UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID); UserInfoHead.set_cbgender(pUserInfoHead.cbGender); UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder); UserInfoHead.set_wtableid(pUserInfoHead.wTableID); UserInfoHead.set_wchairid(pUserInfoHead.wChairID); UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus); UserInfoHead.set_lscore(pUserInfoHead.lScore); UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount); UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount); UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount); UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount); UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience); std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz; UserInfoHead.set_sznickname(szNickname); UserInfoHead.set_szheadurl(szHeadUrl); UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr); UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong); std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz; std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz; UserInfoHead.set_rettime(RetTime); UserInfoHead.set_chengshi(ChengShi); UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX); UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY); UserInfoHead.set_ijieping(pUserInfoHead.iJiePing); auto pCTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (pCTableFrame) { for (int j = 0; j < pCTableFrame->GetChairCount(); j++) { IServerUserItem * pTemp = pCTableFrame->GetTableUserItem(j); if (pTemp && pTemp != pIServerUserItem) { //发送数据 std::string pbdata = UserInfoHead.SerializePartialAsString(); SendData(pTemp, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); } } WORD wEnumIndex = 0; do { //获取用户 IServerUserItem * pTemp = pCTableFrame->EnumLookonUserItem(wEnumIndex++); if (pTemp == NULL) break; //发送数据 std::string pbdata = UserInfoHead.SerializePartialAsString(); SendData(pTemp, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); } while (true); } } } } else { SendDataBatchToMobileUser(wOldTableID, MDM_GR_USER, SUB_GR_USER_STATUS, &UserStatus, sizeof(UserStatus), pIServerUserItem); } } //返回大厅 if (pIServerUserItem->GetUserStatus() == US_FREE) { pIServerUserItem->GetUserInfo()->wChairID = INVALID_CHAIR; pIServerUserItem->GetUserInfo()->wTableID = INVALID_TABLE; } //离开判断 if (pIServerUserItem->GetUserStatus() == US_NULL) { //获取绑定 WORD wBindIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); //绑带处理 if (pBindParameter != NULL) { //绑定处理 if (pBindParameter->pIServerUserItem == pIServerUserItem) { pBindParameter->pIServerUserItem = NULL; } //中断网络 if (pBindParameter->dwSocketID != 0L) { if (LOWORD(pBindParameter->dwSocketID) >= INDEX_ANDROID) { //m_AndroidUserManager.DeleteAndroidUserItem(pBindParameter->dwSocketID, false); } else { m_pITCPNetworkEngine->ShutDownSocket(pBindParameter->dwSocketID); } } } //离开处理 OnEventUserLogout(pIServerUserItem, 0L); } return true; } //用户权限 bool CAttemperEngineSink::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //变量定义 tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); //比赛权限 DBR_GR_ManageUserRight ManageUserRight; ZeroMemory(&ManageUserRight, sizeof(ManageUserRight)); ManageUserRight.dwUserID = pUserInfo->dwUserID; ManageUserRight.dwAddRight = dwAddRight; ManageUserRight.dwRemoveRight = dwRemoveRight; ManageUserRight.bGameRight = cbRightKind == UR_KIND_GAME; CTraceService::TraceString(TEXT("用户权限已屏蔽 OnEventUserItemRight"), TraceLevel_Warning); //发送请求 //m_pIDBCorrespondManager->PostDataBaseRequest(ManageUserRight.dwUserID, DBR_GR_MANAGE_USER_RIGHT, 0, &ManageUserRight, sizeof(ManageUserRight)); return true; } //登录成功 bool CAttemperEngineSink::OnDBLogonSuccessSend(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBO_GR_LogonSuccess ** pLogon = (DBO_GR_LogonSuccess **)pData; if (wDataSize != sizeof(PVOID)) { ASSERT(FALSE); return false; } CTraceService::TraceString(TEXT("登录成功 OnDBLogonSuccess"), TraceLevel_Debug); //变量定义 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); DBO_GR_LogonSuccess * pDBOLogonSuccess = *pLogon; if (pBindParameter == NULL) { CTraceService::TraceString(TEXT("pBindParameter == NULL"), TraceLevel_Warning); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return false; } //废弃判断 if ((pBindParameter->pIServerUserItem != NULL) || (pBindParameter->dwSocketID != dwContextID)) { CTraceService::TraceString(TEXT("(pBindParameter->pIServerUserItem != NULL) || (pBindParameter->dwSocketID != dwContextID)"), TraceLevel_Warning); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return false; } //解除锁定 //PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_NORMAL); //变量定义 bool bAndroidUser = (wBindIndex >= INDEX_ANDROID); bool bMobileUser = (pBindParameter->cbClientKind == CLIENT_KIND_MOBILE); //切换判断 IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pDBOLogonSuccess->dwUserID); if (pIServerUserItem != NULL) { CTraceService::TraceString(TEXT("pIServerUserItem != NULL 切换判断"), TraceLevel_Warning); auto _iter = Socket_2_UserID.find(dwContextID); if (_iter != Socket_2_UserID.end() && pDBOLogonSuccess->dwUserID != _iter->second) { ASSERT(FALSE); } //切换用户 SwitchUserItemConnect(pIServerUserItem, pDBOLogonSuccess->szMachineID, wBindIndex, pDBOLogonSuccess->cbDeviceType, pDBOLogonSuccess->wBehaviorFlags, pDBOLogonSuccess->wPageTableCount); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_USER_IMPACT); //需要补发房间列表 DWORD dwUserID = pDBOLogonSuccess->dwUserID; //清空本地的缓存 auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID); if (iter != m_UserID_2_PriTableIDGROUP.end()) { m_UserID_2_PriTableIDGROUP.erase(dwUserID); } //汇总用户(所有数据从协调拉取) if (m_bCollectUser == true) { //变量定义 CMD_CS_C_UserEnter UserEnter; ZeroMemory(&UserEnter, sizeof(UserEnter)); //设置变量 UserEnter.dwUserID = pIServerUserItem->GetUserID(); UserEnter.dwGameID = pIServerUserItem->GetGameID(); //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName)); //辅助信息 UserEnter.cbGender = pIServerUserItem->GetGender(); UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder(); UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder(); //发送消息 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, &UserEnter, sizeof(UserEnter)); //MessageDef::PB_CS_C_UserEnter pUserEnter; //pUserEnter.set_dwuserid(pIServerUserItem->GetUserID()); //pUserEnter.set_dwgameid(pIServerUserItem->GetGameID()); //pUserEnter.set_cbgender(pIServerUserItem->GetGender()); //pUserEnter.set_cbmemberorder(pIServerUserItem->GetMemberOrder()); //pUserEnter.set_cbmasterorder(pIServerUserItem->GetMasterOrder()); //std::string pbdata = pUserEnter.SerializePartialAsString(); ////unsigned char* raw_data = ; //m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); } //从新申请列表 if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //维护判断 if ((CServerRule::IsForfendRoomEnter(m_pGameServiceOption->dwServerRule) == true) && (pDBOLogonSuccess->cbMasterOrder == 0)) { CTraceService::TraceString(TEXT("维护判断"), TraceLevel_Warning); //发送失败 SendLogonFailure(TEXT("抱歉,由于系统维护的原因,当前游戏房间禁止用户进入!"), 0, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SYSTEM); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //查找机器 //if (bAndroidUser == true && m_pGameServiceOption->wServerType != GAME_GENRE_MATCH) //{ // CTraceService::TraceString(TEXT("查找机器"), TraceLevel_Warning); // //查找机器 // DWORD dwUserID = pDBOLogonSuccess->dwUserID; // IAndroidUserItem * pIAndroidUserItem = m_AndroidUserManager.SearchAndroidUserItem(dwUserID, dwContextID); // //修改积分 // if (pIAndroidUserItem != NULL) // { // //获取配置 // tagAndroidParameter * pAndroidParameter = pIAndroidUserItem->GetAndroidParameter(); // //调整积分 // if ((pAndroidParameter->lTakeMinScore != 0L) && (pAndroidParameter->lTakeMaxScore != 0L)) // { // //变量定义 // SCORE lTakeMinScore = (SCORE)pAndroidParameter->lTakeMinScore; // SCORE lTakeMaxScore = (SCORE)__max(pAndroidParameter->lTakeMaxScore, pAndroidParameter->lTakeMinScore); // //调整积分 // if ((lTakeMaxScore - lTakeMinScore) > 0L) // { // SCORE lTakeScore = (lTakeMaxScore - lTakeMinScore) / 10; // pDBOLogonSuccess->lScore = (SCORE)(lTakeMinScore + (rand() % 10)*lTakeScore + rand() % lTakeScore); // } // else // { // pDBOLogonSuccess->lScore = (SCORE)lTakeMaxScore; // } // } // } //} //最低分数 if ((m_pGameServiceOption->lMinEnterScore != 0L) && (pDBOLogonSuccess->lScore < m_pGameServiceOption->lMinEnterScore)) { CTraceService::TraceString(TEXT("最低分数"), TraceLevel_Warning); //发送失败 TCHAR szMsg[128] = TEXT(""); _sntprintf(szMsg, CountArray(szMsg), TEXT("抱歉,您的游戏成绩低于当前游戏房间的最低进入成绩%I64d,不能进入当前游戏房间!"), m_pGameServiceOption->lMinEnterScore); SendLogonFailure(szMsg, 0, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //最高分数 if ((m_pGameServiceOption->lMaxEnterScore != 0L) && (pDBOLogonSuccess->lScore > m_pGameServiceOption->lMaxEnterScore)) { CTraceService::TraceString(TEXT("最高分数"), TraceLevel_Warning); //发送失败 TCHAR szMsg[128] = TEXT(""); _sntprintf(szMsg, CountArray(szMsg), TEXT("抱歉,您的游戏成绩高于当前游戏房间的最高进入成绩%I64d,不能进入当前游戏房间!"), m_pGameServiceOption->lMaxEnterScore); SendLogonFailure(szMsg, 0, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //会员判断 if (m_pGameServiceOption->cbMinEnterMember != 0 && pDBOLogonSuccess->cbMemberOrder < m_pGameServiceOption->cbMinEnterMember && (pDBOLogonSuccess->cbMasterOrder == 0)) { CTraceService::TraceString(TEXT("会员判断"), TraceLevel_Warning); //发送失败 SendLogonFailure(TEXT("抱歉,您的会员级别低于当前游戏房间的最低进入会员条件,不能进入当前游戏房间!"), 0, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //会员判断 if (m_pGameServiceOption->cbMaxEnterMember != 0 && pDBOLogonSuccess->cbMemberOrder > m_pGameServiceOption->cbMaxEnterMember && (pDBOLogonSuccess->cbMasterOrder == 0)) { CTraceService::TraceString(TEXT("会员判断"), TraceLevel_Warning); //发送失败 SendLogonFailure(TEXT("抱歉,您的会员级别高于当前游戏房间的最高进入会员条件,不能进入当前游戏房间!"), 0, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //满人判断 WORD wMaxPlayer = m_pGameServiceOption->wMaxPlayer; DWORD dwOnlineCount = m_ServerUserManager.GetUserItemCount(); if ((pDBOLogonSuccess->cbMasterOrder == 0) && (dwOnlineCount > (DWORD)(wMaxPlayer - RESERVE_USER_COUNT))) { //发送失败 SendLogonFailure(TEXT("抱歉,此房间已经人满啦!"), 66, pBindParameter->dwSocketID); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_FULL); if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //用户变量 tagUserInfo UserInfo; tagUserInfoPlus UserInfoPlus; ZeroMemory(&UserInfo, sizeof(UserInfo)); ZeroMemory(&UserInfoPlus, sizeof(UserInfoPlus)); //属性资料 UserInfo.llJiePing = pDBOLogonSuccess->llJiePing; UserInfo.iXinYong = pDBOLogonSuccess->iXinYong; UserInfo.wFaceID = pDBOLogonSuccess->wFaceID; UserInfo.dwUserID = pDBOLogonSuccess->dwUserID; UserInfo.dwGameID = 305;// pDBOLogonSuccess->dwGameID; UserInfo.dwGroupID = pDBOLogonSuccess->dwGroupID; UserInfo.dwCustomID = pDBOLogonSuccess->dwCustomID; lstrcpyn(UserInfo.RegisterDate, pDBOLogonSuccess->RegTime, CountArray(UserInfo.RegisterDate)); lstrcpyn(UserInfo.szNickName, pDBOLogonSuccess->szNickName, CountArray(UserInfo.szNickName)); UserInfo.szNickName[31] = 0; lstrcpyn(UserInfo.szUnionID, pDBOLogonSuccess->szUnionID, CountArray(UserInfo.szUnionID)); UserInfo.dDaiLi = pDBOLogonSuccess->dDaiLi; lstrcpyn(UserInfo.szUnionID, pDBOLogonSuccess->szUnionID, CountArray(UserInfo.szUnionID)); //用户资料 UserInfo.cbGender = pDBOLogonSuccess->cbGender; UserInfo.cbMemberOrder = pDBOLogonSuccess->cbMemberOrder; UserInfo.cbMasterOrder = pDBOLogonSuccess->cbMasterOrder; //lstrcpyn(UserInfo.szGroupName, pDBOLogonSuccess->szGroupName, CountArray(UserInfo.szGroupName)); //lstrcpyn(UserInfo.szUnderWrite, pDBOLogonSuccess->szUnderWrite, CountArray(UserInfo.szUnderWrite)); UserInfo.llJuLi = _wtoll(pDBOLogonSuccess->szDescribeString); //状态设置 UserInfo.cbUserStatus = US_FREE; UserInfo.wTableID = INVALID_TABLE; UserInfo.wChairID = INVALID_CHAIR; //积分信息 UserInfo.lScore = pDBOLogonSuccess->lScore; UserInfo.dwBean = pDBOLogonSuccess->dwBean; UserInfo.lGrade = pDBOLogonSuccess->lGrade; //UserInfo.lIngot = pDBOLogonSuccess->lIngot; UserInfo.lInsure = pDBOLogonSuccess->lInsure; UserInfo.dwWinCount = pDBOLogonSuccess->dwWinCount; UserInfo.dwLostCount = pDBOLogonSuccess->dwLostCount; UserInfo.dwDrawCount = pDBOLogonSuccess->dwDrawCount; UserInfo.dwFleeCount = pDBOLogonSuccess->dwFleeCount; UserInfo.dwExperience = pDBOLogonSuccess->dwExperience; UserInfo.lLoveLiness = pDBOLogonSuccess->lLoveLiness; UserInfo.dDingWeiX = pDBOLogonSuccess->dX; UserInfo.dDingWeiY = pDBOLogonSuccess->dY; lstrcpyn(UserInfo.szChengShi, pDBOLogonSuccess->szChengShi, CountArray(pDBOLogonSuccess->szChengShi)); lstrcpyn(UserInfo.szHeadUrl, pDBOLogonSuccess->szHeadUrl, CountArray(pDBOLogonSuccess->szHeadUrl)); UserInfo.LeiJiZuanShi = pDBOLogonSuccess->LeiJiZuanShi; UserInfo.GouMaiZuanShi = pDBOLogonSuccess->GouMaiZuanShi; //俱乐部信息 CopyMemory(UserInfo.dwClubID, pDBOLogonSuccess->dwClubID, sizeof(pDBOLogonSuccess->dwClubID)); if (IsJC(UserInfo.dwUserID)) { CString csTestB; csTestB.Format(_T("登陆获取以钻石信息 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), UserInfo.GouMaiZuanShi, UserInfo.LeiJiZuanShi, UserInfo.dwUserID); CTraceService::TraceString(csTestB, TraceLevel_Normal); } //登录信息 UserInfoPlus.dwLogonTime = (DWORD)time(NULL); UserInfoPlus.dwInoutIndex = pDBOLogonSuccess->dwInoutIndex; //用户权限 UserInfoPlus.dwUserRight = pDBOLogonSuccess->dwUserRight; UserInfoPlus.dwMasterRight = pDBOLogonSuccess->dwMasterRight; //辅助变量 UserInfoPlus.bMobileUser = bMobileUser; UserInfoPlus.bAndroidUser = bAndroidUser; UserInfoPlus.lRestrictScore = m_pGameServiceOption->lRestrictScore; lstrcpyn(UserInfoPlus.szPassword, pDBOLogonSuccess->szPassword, CountArray(UserInfoPlus.szPassword)); //连接信息 UserInfoPlus.wBindIndex = wBindIndex; UserInfoPlus.dwClientAddr = pBindParameter->dwClientAddr; lstrcpyn(UserInfoPlus.szMachineID, pDBOLogonSuccess->szMachineID, CountArray(UserInfoPlus.szMachineID)); lstrcpyn(UserInfo.szName, pDBOLogonSuccess->DaiLiName, CountArray(UserInfo.szName)); lstrcpyn(UserInfo.szWx, pDBOLogonSuccess->DaiLiWX, CountArray(UserInfo.szWx)); lstrcpyn(UserInfo.szQQ, pDBOLogonSuccess->DaiLiQQ, CountArray(UserInfo.szQQ)); //激活用户 m_ServerUserManager.InsertUserItem(&pIServerUserItem, UserInfo, UserInfoPlus); auto _iter = Socket_2_UserID.find(dwContextID); if (_iter == Socket_2_UserID.end()) { std::pair Sub(dwContextID, pDBOLogonSuccess->dwUserID); Socket_2_UserID.insert(Sub); } else { Socket_2_UserID[dwContextID] = pDBOLogonSuccess->dwUserID; } //用户任务 //if (pDBOLogonSuccess->wTaskCount > 0) //{ // m_UserTaskManager.SetUserTaskInfo(pIServerUserItem->GetUserID(), pDBOLogonSuccess->UserTaskInfo, pDBOLogonSuccess->wTaskCount); //} //错误判断 if (pIServerUserItem == NULL) { //错误断言 ASSERT(FALSE); //解除锁定 PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_FULL); //断开用户 if (bAndroidUser == true) { //m_AndroidUserManager.DeleteAndroidUserItem(dwContextID, true); } else { m_pITCPNetworkEngine->ShutDownSocket(dwContextID); } if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //设置用户 pBindParameter->pIServerUserItem = pIServerUserItem; //修改参数 if (pIServerUserItem->IsMobileUser()) { SetMobileUserParameter(pIServerUserItem, pDBOLogonSuccess->cbDeviceType, pDBOLogonSuccess->wBehaviorFlags, pDBOLogonSuccess->wPageTableCount); } DWORD dwUserID = pDBOLogonSuccess->dwUserID; auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID); //if (iter == m_UserID_2_PriTableIDGROUP.end()) //{ // JN_GR_RoomListGroup Temp; // ZeroMemory(&Temp, sizeof(Temp)); // std::pair Sub(dwUserID, Temp); // m_UserID_2_PriTableIDGROUP.insert(Sub); // UserInfo::PB_CS_S_RoomListGroupSend GroupSend; // for (WORD i = 0; i < Temp.Num; i++) // { // if (Temp.jgrDate[i].dwRoomNumber == 0)break; // UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate(); // RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID); // RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID); // RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber); // RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del); // RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen); // RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu); // RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody); // RoomList->set_dwbody(Temp.jgrDate[i].dwBody); // RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa); // std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz; // RoomList->set_szip(szIp); // RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai); // RoomList->set_tmp1(Temp.jgrDate[i].tmp1); // RoomList->set_tmp2(Temp.jgrDate[i].tmp2); // RoomList->set_tmp3(Temp.jgrDate[i].tmp3); // RoomList->set_tmp4(Temp.jgrDate[i].tmp4); // RoomList->set_tmp5(Temp.jgrDate[i].tmp5); // for (WORD i = 0; i < 4; i++) // { // RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]); // } // RoomList->set_wport(Temp.jgrDate[i].wPort); // } // GroupSend.set_num(Temp.Num); // //发送数据 // std::string pbdata = GroupSend.SerializePartialAsString(); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length()); //} //else //{ // JN_GR_RoomListGroupSend Temp; // ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroupSend)); // for (int i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++) // { // CopyMemory(&(Temp.jgrDate[i]), &(m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i]), sizeof(JN_GR_RoomList)); // //纠正 // Temp.jgrDate[i].tmp1 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].bRoomCreatePay; // Temp.jgrDate[i].tmp2 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp1; // Temp.jgrDate[i].tmp3 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp2; // } // UserInfo::PB_CS_S_RoomListGroupSend GroupSend; // for (WORD i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++) // { // UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate(); // RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID); // RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID); // RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber); // RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del); // RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen); // RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu); // RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody); // RoomList->set_dwbody(Temp.jgrDate[i].dwBody); // RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa); // std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz; // RoomList->set_szip(szIp); // RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai); // RoomList->set_tmp1(Temp.jgrDate[i].tmp1); // RoomList->set_tmp2(Temp.jgrDate[i].tmp2); // RoomList->set_tmp3(Temp.jgrDate[i].tmp3); // RoomList->set_tmp4(Temp.jgrDate[i].tmp4); // RoomList->set_tmp5(Temp.jgrDate[i].tmp5); // for (WORD i = 0; i < 4; i++) // { // RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]); // } // RoomList->set_wport(Temp.jgrDate[i].wPort); // } // GroupSend.set_num(m_UserID_2_PriTableIDGROUP[dwUserID].Num); // //发送数据 // std::string pbdata = GroupSend.SerializePartialAsString(); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length()); //} if (IsJC(pIServerUserItem->GetUserID())) { CString csTestB; csTestB.Format(_T("通知创建的所有房间列表 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } //登录事件 OnEventUserLogon(pIServerUserItem, false); //汇总用户 if (m_bCollectUser == true) { //变量定义 CMD_CS_C_UserEnter UserEnter; ZeroMemory(&UserEnter, sizeof(UserEnter)); //设置变量 UserEnter.dwUserID = pIServerUserItem->GetUserID(); UserEnter.dwGameID = pIServerUserItem->GetGameID(); //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName)); //辅助信息 UserEnter.cbGender = pIServerUserItem->GetGender(); UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder(); UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder(); /*DWORD dTableNum = 0;*/ if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIServerUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; /*if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); }*/ } //发送消息 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, &UserEnter, sizeof(UserEnter)); } if (IsJC(pIServerUserItem->GetUserID())) { CString csTestB; csTestB.Format(_T("游戏登陆完成 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } if (pDBOLogonSuccess) free(pDBOLogonSuccess); return true; } //登录成功 bool CAttemperEngineSink::OnDBLogonSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (!m_pITCPNetworkEngine) return false; void *pBuffer = malloc(wDataSize); CopyMemory(pBuffer, pData, wDataSize); PVOID pLogon = pBuffer; return m_pITCPNetworkEngine->OnTBDataEvent(TB_LOGINOK, dwContextID, &pLogon, sizeof(PVOID)); } //登录失败 bool CAttemperEngineSink::OnDBLogonFailure(DWORD dwContextID, VOID * pData, WORD wDataSize) { //判断在线 tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); if (NULL == pBindParameter) { CString strTip; strTip.Format(L"Fun=[%hs] 登录失败 pBindParameter为NULL", __FUNCTION__); CTraceService::TraceString(strTip, TraceLevel_Exception); return true; } TCHAR szClientAddr[16] = TEXT(""); BYTE * pClientAddr = (BYTE *)&pBindParameter->dwClientAddr; _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]); if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem != NULL)) { CString csTest; csTest.Format(_T("登录失败 OnDBLogonFailure, SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s ") , LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr); if (pBindParameter->pIServerUserItem != NULL) { csTest.Format(_T("登录失败 OnDBLogonFailure, SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s,数组记录uid=%d") , LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr, pBindParameter->pIServerUserItem->GetUserID()); } CTraceService::TraceString(csTest, TraceLevel_Exception); return true; } //发送错误 DBO_GR_LogonFailure * pLogonFailure = (DBO_GR_LogonFailure *)pData; SendLogonFailure(pLogonFailure->szDescribeString, pLogonFailure->lResultCode, dwContextID); CString str; str.Format(TEXT("登录失败 OnDBLogonFailure 失败原因:%s , SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s ") , pLogonFailure->szDescribeString, LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr); CTraceService::TraceString(str, TraceLevel_Normal); //断开连接 if (LOWORD(dwContextID) >= INDEX_ANDROID) { //m_AndroidUserManager.DeleteAndroidUserItem(dwContextID, true); } else { m_pITCPNetworkEngine->ShutDownSocket(dwContextID); } return true; } bool CAttemperEngineSink::OnDBGetUserGameScoreList(DWORD dwContextID, VOID * pData, WORD wDataSize) { WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } //变量定义 CMD_GR_GetUserScoreRecordListResp * pGameRecords = (CMD_GR_GetUserScoreRecordListResp *)pData; UserInfo::PB_CS_S_GetUserScoreRecordListResp ListResp; ListResp.set_wparentrecordid(pGameRecords->wParentRecordID); ListResp.set_wrecordcount(pGameRecords->wRecordCount); for (WORD i = 0; i < pGameRecords->wRecordCount; i++) { UserInfo::pb_tagGameRecordDrawInfo* GameScoreRecord = ListResp.add_gamescorerecord(); GameScoreRecord->set_dwdrawid(pGameRecords->GameScoreRecord[i].dwDrawID); GameScoreRecord->set_wtableid(pGameRecords->GameScoreRecord[i].wTableID); GameScoreRecord->set_wusermedal(pGameRecords->GameScoreRecord[i].wUserMedal); GameScoreRecord->set_wusercount(pGameRecords->GameScoreRecord[i].wUserCount); GameScoreRecord->set_wparentid(pGameRecords->GameScoreRecord[i].wParentID); std::string szPrivateTableID = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].szPrivateTableID, CP_UTF8).m_psz; GameScoreRecord->set_szprivatetableid(szPrivateTableID); GameScoreRecord->set_systemtimestart(pGameRecords->GameScoreRecord[i].SystemTimeStart); GameScoreRecord->set_systemtimeconclude(pGameRecords->GameScoreRecord[i].SystemTimeConclude); GameScoreRecord->set_wwanfa(pGameRecords->GameScoreRecord[i].wWanFa % 256); GameScoreRecord->set_wplaycount(pGameRecords->GameScoreRecord[i].wWanFa / 256); for (WORD j = 0; j < 4; j++) { UserInfo::pb_tagGameRecordDrawScore* GameChairScore = GameScoreRecord->add_gamechairscore(); GameChairScore->set_dwdrawid(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwDrawID); GameChairScore->set_dwuserid(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwUserID); GameChairScore->set_wchairid(pGameRecords->GameScoreRecord[i].GameChairScore[j].wChairID); GameChairScore->set_lscore(pGameRecords->GameScoreRecord[i].GameChairScore[j].lScore); GameChairScore->set_lgrade(pGameRecords->GameScoreRecord[i].GameChairScore[j].lGrade); GameChairScore->set_dwusermedal(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwUserMedal); GameChairScore->set_dwplaytimecount(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwPlayTimeCount); std::string szUserName = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].GameChairScore[j].szUserName, CP_UTF8).m_psz; std::string szHeadImg = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].GameChairScore[j].szHeadImg, CP_UTF8).m_psz; GameChairScore->set_szusername(szUserName); GameChairScore->set_szheadimg(szHeadImg); GameChairScore->set_wwanfa(pGameRecords->GameScoreRecord[i].wWanFa % 256); GameChairScore->set_wplaycount(pGameRecords->GameScoreRecord[i].wUserCount / 256); } } //发送数据 std::string pbdata = ListResp.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_LISTACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //插入父节点房间的返回 bool CAttemperEngineSink::OnDBO_GR_GameScoreRecord_RESULT(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(DBR_GR_GameScoreRecordResult)); if (wDataSize != sizeof(DBR_GR_GameScoreRecordResult)) return false; //变量定义 DBR_GR_GameScoreRecordResult * pInfo = (DBR_GR_GameScoreRecordResult *)pData; auto pTableFrame = GetTableFrame(pInfo->wTableID); ASSERT(pTableFrame); if (pTableFrame) { pTableFrame->SetPrivateTableParentNodeID(pInfo->wPrivateTableParentNodeID); } return true; } //获取刷新元宝 bool CAttemperEngineSink::OnDBO_GR_GetBearnSEND(DWORD dwContextID, VOID * pData, WORD wDataSize) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnDBO_GR_GetBearnSEND"), TraceLevel_Debug); //效验参数 ASSERT(wDataSize == sizeof(DBR_GR_GetBearn)); if (wDataSize < sizeof(DBR_GR_GetBearn)) return false; DBR_GR_GetBearn *pGet = (DBR_GR_GetBearn *)pData; WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; //ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } if (pGet->lResultCode == 0) { CString csTest; csTest.Format(_T("%s%s"), _T("CAttemperEngineSink::OnDBO_GR_GetBearnSEND->"), pGet->strErrorDescribe); //数据库查询失败。 CTraceService::TraceString(csTest, TraceLevel_Warning); return true; } if (IsJC(pGet->dwUserID) && pGet->GouMaiZuanShi == 0) { CString csTestB; csTestB.Format(_T("OnDBO_GR_GetBearnSEND钻石信息变化 -> 原 GouMaiZuanShi:%d变%d, LeiJiZuanShiID:%d变%d,UserID=%d") , pIServerUserItem->GetUserInfo()->GouMaiZuanShi , pGet->GouMaiZuanShi , pIServerUserItem->GetUserInfo()->LeiJiZuanShi , pGet->LeiJiZuanShi , pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Warning); } pIServerUserItem->GetUserInfo()->dwBean = pGet->Currency; pIServerUserItem->GetUserInfo()->GouMaiZuanShi = pGet->GouMaiZuanShi; pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pGet->LeiJiZuanShi; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(pGet->Currency); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); return true; } //获取刷新元宝 bool CAttemperEngineSink::OnDBO_GR_GetBearn(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_UPDATA, dwContextID, pData, wDataSize); return true; } //手机重复绑定查询 bool CAttemperEngineSink::OnDBO_GR_GetVerifCode(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } CMD_GR_GetVerifCode* pGetVerifCode = (CMD_GR_GetVerifCode*)pData; if (pGetVerifCode->IsRepeat == 0) { //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484")); DWORD dUserID = pIServerUserItem->GetUserID(); GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); StringCchCat(Temp.szUnionID, 12, pGetVerifCode->PhoneNum); Temp.dUserID = dUserID; Temp.CommendID = 8; //获取手机验证码(只作透传) Temp.dwSocketID = dwContextID; CHttpClient::AddLog(dwContextID, Temp); return true; } else { CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = -8; lstrcpyn(RequestFailure.szDescribeString, pGetVerifCode->szDescribeString, CountArray(RequestFailure.szDescribeString)); //获取用户 WORD wBindIndexT = LOWORD(dwContextID); IServerUserItem * p_server_user_itemEx = GetBindUserItem(wBindIndexT); if (p_server_user_itemEx == NULL) return false; UserInfo::PB_CS_S_RequestFailure Failure; Failure.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); SendData(p_server_user_itemEx, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length()); } //SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE_QUERY, pReq, wDataSize); return true; } //手机绑定查询 bool CAttemperEngineSink::OnDBO_GR_CheckIphoneQuery(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } CMD_GR_CheckIphone_Query* pReq = (CMD_GR_CheckIphone_Query*)pData; UserInfo::PB_CS_S_CheckIphone_Query CheckIphone; CheckIphone.set_isbingnum(pReq->IsBingNum); CheckIphone.set_dwcurrency(pReq->dwCurrency); std::string PhoneNum = CW2AEX<1024>(pReq->PhoneNum, CP_UTF8).m_psz; CheckIphone.set_phonenum(PhoneNum); CheckIphone.set_isbingxianliao(pReq->IsBingXianLiao); //发送数据 std::string pbdata = CheckIphone.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE_QUERY, (void*)pbdata.c_str(), pbdata.length()); return true; } //手机绑定 bool CAttemperEngineSink::OnDBO_GR_CheckIphone(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } CMD_GR_CheckIphone* pReq = (CMD_GR_CheckIphone*)pData; if (pReq->IsBingNum == 0) { CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = 2; lstrcpyn(RequestFailure.szDescribeString, pReq->PhoneNum, CountArray(pReq->PhoneNum)); //发送数据 WORD wDataSizeT = CountStringBuffer(RequestFailure.szDescribeString); WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); if (pIServerUserItem == NULL) return true; UserInfo::PB_CS_S_RequestFailure Failure; Failure.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length()); return true; } UserInfo::PB_CS_C_CheckIphone CheckIphone; CheckIphone.set_isbingnum(pReq->IsBingNum); CheckIphone.set_dwcurrency(pReq->dwCurrency); std::string PhoneNum = CW2AEX<1024>(pReq->PhoneNum, CP_UTF8).m_psz; CheckIphone.set_phonenum(PhoneNum); //发送数据 std::string pbdata = CheckIphone.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE, (void*)pbdata.c_str(), pbdata.length()); return true; } //实名认证查询 bool CAttemperEngineSink::OnDBO_GR_CheckNameQuery(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } DBR_GR_GetCheckName* pReq = (DBR_GR_GetCheckName*)pData; UserInfo::PB_CS_S_CheckNameEx NameEx; std::string userName = CW2AEX<1024>(pReq->userName, CP_UTF8).m_psz; std::string userCard = CW2AEX<1024>(pReq->userCard, CP_UTF8).m_psz; std::string userPhoneNum = CW2AEX<1024>(pReq->userPhoneNum, CP_UTF8).m_psz; std::string userAddr = CW2AEX<1024>(pReq->userAddr, CP_UTF8).m_psz; NameEx.set_name(userName); NameEx.set_idcard(userCard); NameEx.set_phonenum(userPhoneNum); NameEx.set_addr(userAddr); //发送数据 std::string pbdata = NameEx.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_NAME_QUERY, (void*)pbdata.c_str(), pbdata.length()); return true; } //修改地址应答 bool CAttemperEngineSink::OnDBO_GR_UpdateAddr(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } BYTE* pReq = (BYTE*)pData;//0表示成功,1表示失败 TurntableLogon::PB_CS_LotteryAddr LotteryAddr; LotteryAddr.set_preq(*pReq); //发送数据 std::string pbdata = LotteryAddr.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_ADDRESS, (void*)pbdata.c_str(), pbdata.length()); return true; } //获取临时积分排行榜 bool CAttemperEngineSink::OnDBO_GR_GameTmpScoreRankListResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnDBO_GR_GameTmpScoreRankListResult"), TraceLevel_Debug); //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT)); if (wDataSize < sizeof(CMD_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT)) return false; WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } //变量定义 if (m_pRankListData) { delete[] m_pRankListData; m_pRankListData = nullptr; m_pRankListDataSize = 0; } m_pRankListData = new char[wDataSize]; CopyMemory(m_pRankListData, pData, wDataSize); m_pRankListDataSize = wDataSize; m_lastRankListTime = time(0); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT, pData, wDataSize); return true; } //获取游戏积分记录详情 bool CAttemperEngineSink::OnDBGetUserGameScoreReplayRecord(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } /*Replay::PB_CS_RECORD_REPLAY aa; aa.set_aa((char*)pData); std::string pbdata = aa.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY, (void*)pbdata.c_str(), pbdata.length());*/ SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAYACK, pData, wDataSize); return true; } //获取游戏积分记录详情 bool CAttemperEngineSink::OnDBGetUserGameScoreRecordDetail(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize <= sizeof(CMD_GR_GetUserScoreRecordDetail)); if (wDataSize >= sizeof(CMD_GR_GetUserScoreRecordDetail)) return false; WORD wBindIndex = LOWORD(dwContextID); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); auto pIServerUserItem = pBindParameter->pIServerUserItem; ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (pBindParameter->dwSocketID != dwContextID) { return true; } SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_DETAIL_INFO, pData, wDataSize); return true; } //配置信息 bool CAttemperEngineSink::OnDBGameParameter(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(DBO_GR_GameParameter)); if (wDataSize != sizeof(DBO_GR_GameParameter)) return false; //变量定义 DBO_GR_GameParameter * pGameParameter = (DBO_GR_GameParameter *)pData; //汇率信息 m_pGameParameter->wMedalRate = pGameParameter->wMedalRate; m_pGameParameter->wRevenueRate = pGameParameter->wRevenueRate; m_pGameParameter->wExchangeRate = pGameParameter->wExchangeRate; //经验奖励 m_pGameParameter->dwWinExperience = pGameParameter->dwWinExperience; //版本信息 m_pGameParameter->dwClientVersion = pGameParameter->dwClientVersion; m_pGameParameter->dwServerVersion = pGameParameter->dwServerVersion; int i = 0;//序号索引 for each (MyStructParameter var in pGameParameter->msParameter) { i = var.idNum - 1;//下标与序号的关系idNUM固定相差1,数据库取值决定的 StringCchCopy(m_pGameParameter->msParameter[i].szgameTypeCfg, _countof(m_pGameParameter->msParameter[i].szgameTypeCfg), var.szgameTypeCfg); StringCchCopy(m_pGameParameter->msParameter[i].diJinCfg, _countof(m_pGameParameter->msParameter[i].diJinCfg), var.diJinCfg); StringCchCopy(m_pGameParameter->msParameter[i].payTypeCfg, _countof(m_pGameParameter->msParameter[i].payTypeCfg), var.payTypeCfg); StringCchCopy(m_pGameParameter->msParameter[i].juShuCfg, _countof(m_pGameParameter->msParameter[i].juShuCfg), var.juShuCfg); StringCchCopy(m_pGameParameter->msParameter[i].payCoinCfg, _countof(m_pGameParameter->msParameter[i].payCoinCfg), var.payCoinCfg); StringCchCopy(m_pGameParameter->msParameter[i].ipLimitCfg, _countof(m_pGameParameter->msParameter[i].ipLimitCfg), var.ipLimitCfg); StringCchCopy(m_pGameParameter->msParameter[i].defaultDeskCfg, _countof(m_pGameParameter->msParameter[i].defaultDeskCfg), var.defaultDeskCfg); m_pGameParameter->msParameter[i].idNum = var.idNum; } /*StringCchCopy(m_pGameParameter->msParameter[0].szgameTypeCfg, _countof(m_pGameParameter->msParameter[0].szgameTypeCfg), pGameParameter->msParameter[0].szgameTypeCfg); StringCchCopy(m_pGameParameter->msParameter[0].diJinCfg, _countof(m_pGameParameter->msParameter[0].diJinCfg), pGameParameter->msParameter[0].diJinCfg); StringCchCopy(m_pGameParameter->msParameter[0].payTypeCfg, _countof(m_pGameParameter->msParameter[0].payTypeCfg), pGameParameter->msParameter[0].payTypeCfg); StringCchCopy(m_pGameParameter->msParameter[0].juShuCfg, _countof(m_pGameParameter->msParameter[0].juShuCfg), pGameParameter->msParameter[0].juShuCfg); StringCchCopy(m_pGameParameter->msParameter[0].payCoinCfg, _countof(m_pGameParameter->msParameter[0].payCoinCfg), pGameParameter->msParameter[0].payCoinCfg); StringCchCopy(m_pGameParameter->msParameter[0].ipLimitCfg, _countof(m_pGameParameter->msParameter[0].ipLimitCfg), pGameParameter->msParameter[0].ipLimitCfg); StringCchCopy(m_pGameParameter->msParameter[0].defaultDeskCfg, _countof(m_pGameParameter->msParameter[0].defaultDeskCfg), pGameParameter->msParameter[0].defaultDeskCfg); m_pGameParameter->msParameter[0].idNum = pGameParameter->msParameter[0].idNum; StringCchCopy(m_pGameParameter->msParameter[1].szgameTypeCfg, _countof(m_pGameParameter->msParameter[1].szgameTypeCfg), pGameParameter->msParameter[1].szgameTypeCfg); StringCchCopy(m_pGameParameter->msParameter[1].diJinCfg, _countof(m_pGameParameter->msParameter[1].diJinCfg), pGameParameter->msParameter[1].diJinCfg); StringCchCopy(m_pGameParameter->msParameter[1].payTypeCfg, _countof(m_pGameParameter->msParameter[1].payTypeCfg), pGameParameter->msParameter[1].payTypeCfg); StringCchCopy(m_pGameParameter->msParameter[1].juShuCfg, _countof(m_pGameParameter->msParameter[1].juShuCfg), pGameParameter->msParameter[1].juShuCfg); StringCchCopy(m_pGameParameter->msParameter[1].payCoinCfg, _countof(m_pGameParameter->msParameter[1].payCoinCfg), pGameParameter->msParameter[1].payCoinCfg); StringCchCopy(m_pGameParameter->msParameter[1].ipLimitCfg, _countof(m_pGameParameter->msParameter[1].ipLimitCfg), pGameParameter->msParameter[1].ipLimitCfg); StringCchCopy(m_pGameParameter->msParameter[1].defaultDeskCfg, _countof(m_pGameParameter->msParameter[1].defaultDeskCfg), pGameParameter->msParameter[1].defaultDeskCfg); m_pGameParameter->msParameter[1].idNum = pGameParameter->msParameter[1].idNum; StringCchCopy(m_pGameParameter->msParameter[2].szgameTypeCfg, _countof(m_pGameParameter->msParameter[2].szgameTypeCfg), pGameParameter->msParameter[2].szgameTypeCfg); StringCchCopy(m_pGameParameter->msParameter[2].diJinCfg, _countof(m_pGameParameter->msParameter[2].diJinCfg), pGameParameter->msParameter[2].diJinCfg); StringCchCopy(m_pGameParameter->msParameter[2].payTypeCfg, _countof(m_pGameParameter->msParameter[2].payTypeCfg), pGameParameter->msParameter[2].payTypeCfg); StringCchCopy(m_pGameParameter->msParameter[2].juShuCfg, _countof(m_pGameParameter->msParameter[2].juShuCfg), pGameParameter->msParameter[2].juShuCfg); StringCchCopy(m_pGameParameter->msParameter[2].payCoinCfg, _countof(m_pGameParameter->msParameter[2].payCoinCfg), pGameParameter->msParameter[2].payCoinCfg); StringCchCopy(m_pGameParameter->msParameter[2].ipLimitCfg, _countof(m_pGameParameter->msParameter[2].ipLimitCfg), pGameParameter->msParameter[2].ipLimitCfg); StringCchCopy(m_pGameParameter->msParameter[2].defaultDeskCfg, _countof(m_pGameParameter->msParameter[2].defaultDeskCfg), pGameParameter->msParameter[2].defaultDeskCfg); m_pGameParameter->msParameter[2].idNum = pGameParameter->msParameter[2].idNum; StringCchCopy(m_pGameParameter->msParameter[3].szgameTypeCfg, _countof(m_pGameParameter->msParameter[3].szgameTypeCfg), pGameParameter->msParameter[3].szgameTypeCfg); StringCchCopy(m_pGameParameter->msParameter[3].diJinCfg, _countof(m_pGameParameter->msParameter[3].diJinCfg), pGameParameter->msParameter[3].diJinCfg); StringCchCopy(m_pGameParameter->msParameter[3].payTypeCfg, _countof(m_pGameParameter->msParameter[3].payTypeCfg), pGameParameter->msParameter[3].payTypeCfg); StringCchCopy(m_pGameParameter->msParameter[3].juShuCfg, _countof(m_pGameParameter->msParameter[3].juShuCfg), pGameParameter->msParameter[3].juShuCfg); StringCchCopy(m_pGameParameter->msParameter[3].payCoinCfg, _countof(m_pGameParameter->msParameter[3].payCoinCfg), pGameParameter->msParameter[3].payCoinCfg); StringCchCopy(m_pGameParameter->msParameter[3].ipLimitCfg, _countof(m_pGameParameter->msParameter[3].ipLimitCfg), pGameParameter->msParameter[3].ipLimitCfg); StringCchCopy(m_pGameParameter->msParameter[3].defaultDeskCfg, _countof(m_pGameParameter->msParameter[3].defaultDeskCfg), pGameParameter->msParameter[3].defaultDeskCfg); m_pGameParameter->msParameter[3].idNum = pGameParameter->msParameter[3].idNum;*/ ////版本效验 //if (VERSION_EFFICACY == TRUE) //{ // //版本判断 // bool bVersionInvalid = false; // if (m_pGameParameter->dwClientVersion != m_pGameServiceAttrib->dwClientVersion) bVersionInvalid = true; // if (m_pGameParameter->dwServerVersion != m_pGameServiceAttrib->dwServerVersion) bVersionInvalid = true; // //提示信息 // if (bVersionInvalid == true) // { // CTraceService::TraceString(TEXT("平台数据库服务组件版本注册信息与当前组件版本信息不一致"), TraceLevel_Warning); // } //} //获取状态 CServiceUnits* pServiceUnits = CServiceUnits::g_pServiceUnits; enServiceStatus ServiceStatus = pServiceUnits->GetServiceStatus(); //事件通知 if (ServiceStatus != ServiceStatus_Service) { CP_ControlResult ControlResult; ControlResult.cbSuccess = ER_SUCCESS; SendUIControlPacket(UI_SERVICE_CONFIG_RESULT, &ControlResult, sizeof(ControlResult)); } return true; } //列表信息 //bool CAttemperEngineSink::OnDBGameColumnInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_GameColumnInfo * pGameColumnInfo = (DBO_GR_GameColumnInfo *)pData; // WORD wHeadSize = sizeof(DBO_GR_GameColumnInfo) - sizeof(pGameColumnInfo->ColumnItemInfo); // // //效验参数 // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0])))); // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0])))) return false; // // //数据处理 // if (pGameColumnInfo->cbColumnCount == 0) // { // //默认列表 // } // else // { // //拷贝数据 // m_DataConfigColumn.cbColumnCount = pGameColumnInfo->cbColumnCount; // CopyMemory(m_DataConfigColumn.ColumnItem, pGameColumnInfo->ColumnItemInfo, pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0])); // } // // return true; //} ////机器信息 //bool CAttemperEngineSink::OnDBGameAndroidInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_GameAndroidInfo * pGameAndroidInfo = (DBO_GR_GameAndroidInfo *)pData; // WORD wHeadSize = sizeof(DBO_GR_GameAndroidInfo) - sizeof(pGameAndroidInfo->AndroidAccountsInfo); // // //效验参数 // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameAndroidInfo->wAndroidCount * sizeof(pGameAndroidInfo->AndroidAccountsInfo[0])))); // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameAndroidInfo->wAndroidCount * sizeof(pGameAndroidInfo->AndroidAccountsInfo[0])))) return false; // // //设置机器 // if (pGameAndroidInfo->lResultCode == DB_SUCCESS) // { // m_AndroidUserManager.InsertAndroidInfo(pGameAndroidInfo->AndroidAccountsInfo, pGameAndroidInfo->wAndroidCount, pGameAndroidInfo->dwBatchID); // } // // return true; //} // ////机器参数 //bool CAttemperEngineSink::OnDBGameAndroidParameter(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_GameAndroidParameter * pGameAndroidParameter = (DBO_GR_GameAndroidParameter *)pData; // WORD wHeadSize = sizeof(DBO_GR_GameAndroidParameter) - sizeof(pGameAndroidParameter->AndroidParameter); // // //效验参数 // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameAndroidParameter->wParameterCount * sizeof(pGameAndroidParameter->AndroidParameter[0])))); // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameAndroidParameter->wParameterCount * sizeof(pGameAndroidParameter->AndroidParameter[0])))) return false; // // //设置机器 // if (pGameAndroidParameter->lResultCode == DB_SUCCESS) // { // m_AndroidUserManager.AddAndroidParameter(pGameAndroidParameter->AndroidParameter, pGameAndroidParameter->wParameterCount); // } // // return true; //} // //道具信息 //bool CAttemperEngineSink::OnDBGamePropertyInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_GamePropertyInfo * pGamePropertyInfo = (DBO_GR_GamePropertyInfo *)pData; // WORD wHeadSize = sizeof(DBO_GR_GamePropertyInfo) - sizeof(pGamePropertyInfo->PropertyInfo); // // //效验参数 // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0])))); // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0])))) return false; // // //获取状态 // CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits; // enServiceStatus ServiceStatus = pServiceUnits->GetServiceStatus(); // // //设置道具 // if (pGamePropertyInfo->lResultCode == DB_SUCCESS) // { // //设置管理 // m_GamePropertyManager.SetGamePropertyInfo(pGamePropertyInfo->PropertyInfo, pGamePropertyInfo->cbPropertyCount); // // //拷贝数据 // //m_DataConfigProperty.cbPropertyCount = pGamePropertyInfo->cbPropertyCount; // //CopyMemory(m_DataConfigProperty.PropertyInfo, pGamePropertyInfo->PropertyInfo, pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0])); // } // // //事件通知 // if (ServiceStatus != ServiceStatus_Service) // { // CP_ControlResult ControlResult; // ControlResult.cbSuccess = ER_SUCCESS; // SendUIControlPacket(UI_SERVICE_CONFIG_RESULT, &ControlResult, sizeof(ControlResult)); // } // // return true; //} ////会员参数 //bool CAttemperEngineSink::OnDBGameMemberParameter(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_MemberParameter * pMemberParameter = (DBO_GR_MemberParameter *)pData; // // //拷贝数据 // m_wMemberCount = pMemberParameter->wMemberCount; // CopyMemory(m_MemberParameter, pMemberParameter->MemberParameter, sizeof(tagMemberParameter)*m_wMemberCount); // // return true; //} // ////银行信息 //bool CAttemperEngineSink::OnDBUserInsureInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true; // // //获取用户 // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL); // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID)); // // //变量定义 // DBO_GR_UserInsureInfo * pUserInsureInfo = (DBO_GR_UserInsureInfo *)pData; // // //变量定义 // CMD_GR_S_UserInsureInfo UserInsureInfo; // ZeroMemory(&UserInsureInfo, sizeof(UserInsureInfo)); // // //构造数据 // UserInsureInfo.cbActivityGame = pUserInsureInfo->cbActivityGame; // UserInsureInfo.cbEnjoinTransfer = pUserInsureInfo->cbEnjoinTransfer; // UserInsureInfo.wRevenueTake = pUserInsureInfo->wRevenueTake; // UserInsureInfo.wRevenueTransfer = pUserInsureInfo->wRevenueTransfer; // UserInsureInfo.wRevenueTransferMember = pUserInsureInfo->wRevenueTransferMember; // UserInsureInfo.wServerID = pUserInsureInfo->wServerID; // UserInsureInfo.lUserInsure = pUserInsureInfo->lUserInsure; // UserInsureInfo.lUserScore += pIServerUserItem->GetUserScore(); // UserInsureInfo.lUserScore += pIServerUserItem->GetTrusteeScore(); // UserInsureInfo.lUserScore += pIServerUserItem->GetFrozenedScore(); // UserInsureInfo.lTransferPrerequisite = pUserInsureInfo->lTransferPrerequisite; // // DWORD dTableNum = 0; // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pat = GetTableFrame(pIServerUserItem->GetTableID()); // // TCHAR szTemp[32] = { 0 }; // if (pat) pat->GetPrivateTableID(szTemp, 32); // CString csTemp = szTemp; // // if (pat != nullptr && !csTemp.IsEmpty()) // { // dTableNum = _wtol(csTemp); // } // } // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_INSURE, SUB_GR_USER_INSURE_INFO); // //OutputDebugString(csSend); // // Commend::ToShow(this, MDM_GR_INSURE, SUB_GR_USER_INSURE_INFO, &UserInsureInfo, sizeof(UserInsureInfo), dTableNum, pIServerUserItem == NULL ? NULL : pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // // //发送数据 // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_INSURE, SUB_GR_USER_INSURE_INFO, &UserInsureInfo, sizeof(UserInsureInfo)); // // return true; //} // ////银行成功 //bool CAttemperEngineSink::OnDBUserInsureSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true; // // //获取用户 // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL); // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID)); // // //变量定义 // DBO_GR_UserInsureSuccess * pUserInsureSuccess = (DBO_GR_UserInsureSuccess *)pData; // // //变量定义 // SCORE lFrozenedScore = pUserInsureSuccess->lFrozenedScore; // SCORE lInsureRevenue = pUserInsureSuccess->lInsureRevenue; // SCORE lVariationScore = pUserInsureSuccess->lVariationScore; // SCORE lVariationInsure = pUserInsureSuccess->lVariationInsure; // // //解冻积分 // if ((lFrozenedScore > 0L) && (pIServerUserItem->UnFrozenedUserScore(lFrozenedScore) == false)) // { // ASSERT(FALSE); // return false; // } // // //银行操作 // if (pIServerUserItem->ModifyUserInsure(lVariationScore, lVariationInsure, lInsureRevenue) == false) // { // ASSERT(FALSE); // return false; // } // // //变量定义 // CMD_GR_S_UserInsureSuccess UserInsureSuccess; // ZeroMemory(&UserInsureSuccess, sizeof(UserInsureSuccess)); // // //构造变量 // UserInsureSuccess.cbActivityGame = pUserInsureSuccess->cbActivityGame; // UserInsureSuccess.lUserScore = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore(); // UserInsureSuccess.lUserInsure = pUserInsureSuccess->lSourceInsure + pUserInsureSuccess->lVariationInsure; // lstrcpyn(UserInsureSuccess.szDescribeString, pUserInsureSuccess->szDescribeString, CountArray(UserInsureSuccess.szDescribeString)); // // //发送数据 // WORD wDescribe = CountStringBuffer(UserInsureSuccess.szDescribeString); // WORD wHeadSize = sizeof(UserInsureSuccess) - sizeof(UserInsureSuccess.szDescribeString); // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_SUCCESS, &UserInsureSuccess, wHeadSize + wDescribe); // // return true; //} // ////操作失败 //bool CAttemperEngineSink::OnDBUserInsureFailure(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true; // // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //发送错误 // DBO_GR_UserInsureFailure * pUserInsureFailure = (DBO_GR_UserInsureFailure *)pData; // SendInsureFailure(pIServerUserItem, pUserInsureFailure->szDescribeString, pUserInsureFailure->lResultCode, pUserInsureFailure->cbActivityGame); // // //解冻积分 // if ((pUserInsureFailure->lFrozenedScore > 0L) && (pIServerUserItem->UnFrozenedUserScore(pUserInsureFailure->lFrozenedScore) == false)) // { // ASSERT(FALSE); // return false; // } // // return true; //} // ////用户信息 //bool CAttemperEngineSink::OnDBUserInsureUserInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true; // // //获取用户 // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL); // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID)); // // //变量定义 // DBO_GR_UserTransferUserInfo * pTransferUserInfo = (DBO_GR_UserTransferUserInfo *)pData; // // //变量定义 // CMD_GR_S_UserTransferUserInfo UserTransferUserInfo; // ZeroMemory(&UserTransferUserInfo, sizeof(UserTransferUserInfo)); // // //构造变量 // UserTransferUserInfo.cbActivityGame = pTransferUserInfo->cbActivityGame; // UserTransferUserInfo.dwTargetGameID = pTransferUserInfo->dwGameID; // lstrcpyn(UserTransferUserInfo.szAccounts, pTransferUserInfo->szAccounts, CountArray(UserTransferUserInfo.szAccounts)); // // //发送数据 // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_TRANSFER_USER_INFO, &UserTransferUserInfo, sizeof(UserTransferUserInfo)); // // return true; //} // ////开通结果 //bool CAttemperEngineSink::OnDBUserInsureEnableResult(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID)); // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true; // // //获取用户 // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL); // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID)); // // //变量定义 // DBO_GR_UserInsureEnableResult * pUserInsureEnableResult = (DBO_GR_UserInsureEnableResult *)pData; // // //变量定义 // CMD_GR_S_UserInsureEnableResult UserInsureEnableResult; // ZeroMemory(&UserInsureEnableResult, sizeof(UserInsureEnableResult)); // // //构造变量 // UserInsureEnableResult.cbInsureEnabled = pUserInsureEnableResult->cbInsureEnabled; // lstrcpyn(UserInsureEnableResult.szDescribeString, pUserInsureEnableResult->szDescribeString, CountArray(UserInsureEnableResult.szDescribeString)); // // //计算大小 // WORD wHeadSize = CountStringBuffer(UserInsureEnableResult.szDescribeString); // wHeadSize += sizeof(UserInsureEnableResult) - sizeof(UserInsureEnableResult.szDescribeString); // // //发送数据 // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_ENABLE_RESULT, &UserInsureEnableResult, wHeadSize); // // return true; //} //直接扣除游戏豆 bool CAttemperEngineSink::OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData; IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID); if (pIServerUserItem == NULL) { //用户不在此服务器上,上报中央服务器。 return false; } if (0 != pInfo->result) { //扣款失败,应该退出或删除创建的房间。此处尚未处理 SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result); return true; } if (IsJC(pIServerUserItem->GetUserID())) { CString csTestB; csTestB.Format(_T("OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND钻石信息变化 -> 原 LeiJiZuanShiID:%d变%d,UserID=%d") , pIServerUserItem->GetUserInfo()->LeiJiZuanShi , pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans , pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Warning); } pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans; pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans; //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pInfo->dwCurrBeans; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); return true; } //直接扣除游戏豆 bool CAttemperEngineSink::OnDBR_GR_USER_ZHIJIE_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_ZJXF, dwContextID, pData, wDataSize); return true; } //消耗元宝不需要通知客户 bool CAttemperEngineSink::OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData; IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID); if (pIServerUserItem == NULL) { //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (0 == pInfo->result && pTableFrame) { if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true; } return false; } if (0 != pInfo->result) { //消耗失败,此处需要记录日志 SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result); return true; } pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans; //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); if (IsJC(pIServerUserItem->GetUserID()) && pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans == 0) { CString csTestB; csTestB.Format(_T("OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND钻石信息变化 -> 原 LeiJiZuanShiID:%d变%d,UserID=%d") , pIServerUserItem->GetUserInfo()->LeiJiZuanShi , pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans , pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Warning); } //构造变量 UserBeans.dwCurrBeans = pInfo->dwCurrBeans; pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans; //发送数据 //SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, &UserBeans, sizeof(UserBeans)); //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (pTableFrame) { if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true; } return true; } //消耗元宝不需要通知 bool CAttemperEngineSink::OnDBR_GR_USER_REDUCE_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_XF, dwContextID, pData, wDataSize); return true; } //冻结执行 bool CAttemperEngineSink::OnDBR_GR_USER_LOCK_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData; IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID); if (0 != pInfo->result) { auto pTableFrame = GetTableFrame(pInfo->dwTable); if (pTableFrame == nullptr) { return false; } pTableFrame->DeletePrivateTableNow(); return true; } if (pIServerUserItem == NULL) { //用户不在此服务器上,上报中央服务器。 m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_LOCK, pData, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (0 == pInfo->result && pTableFrame) { if (pTableFrame->SetUserLockData(pInfo->dwUserID, pInfo->dwActiveBeans) == true) return true; } return false; } pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans; //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pInfo->dwCurrBeans; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (pTableFrame) { if (pTableFrame->SetUserLockData(pIServerUserItem->GetUserID(), pInfo->dwActiveBeans) == true) return true; } return true; } //冻结元宝通知客户 bool CAttemperEngineSink::OnDBR_GR_USER_LOCK_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_LOCK, dwContextID, pData, wDataSize); return true; } //解冻元宝通知客户 bool CAttemperEngineSink::OnDBR_GR_USER_UNLOCK_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize) { if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_UNLOCK, dwContextID, pData, wDataSize); return true; } //解冻执行 bool CAttemperEngineSink::OnDBR_GR_USER_UNLOCK_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData; IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID); if (pIServerUserItem == NULL) { //用户不在此服务器上,上报中央服务器。 m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_UNLOCK, pData, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (0 == pInfo->result && pTableFrame) { if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true; } return false; } if (0 != pInfo->result) { //解冻失败,此处需要记录日志 SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result); return true; } pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans; //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pInfo->dwCurrBeans; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); //更新房间内元宝冻结值 auto pTableFrame = GetTableFrame(pInfo->dwTable); if (pTableFrame) { if (pTableFrame->SetUserLockData(pIServerUserItem->GetUserID(), 0) == true) return true; } return true; } //道具成功 //bool CAttemperEngineSink::OnDBPropertySuccess(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_S_PropertySuccess * pPropertySuccess = (DBO_GR_S_PropertySuccess *)pData; // // //获取用户 // IServerUserItem * pISourceUserItem = m_ServerUserManager.SearchUserItem(pPropertySuccess->dwSourceUserID); // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pPropertySuccess->dwTargetUserID); // // //赠送用户 // if (pISourceUserItem != NULL) // { // //变量定义 // SCORE lFrozenedScore = pPropertySuccess->lFrozenedScore; // // //解冻积分 // if ((lFrozenedScore > 0L) && (pISourceUserItem->UnFrozenedUserScore(lFrozenedScore) == false)) // { // ASSERT(FALSE); // return false; // } // } // // //更新魅力 // if (pISourceUserItem != NULL) // { // pISourceUserItem->ModifyUserProperty(0, pPropertySuccess->lSendLoveLiness); // } // // //更新魅力 // if (pITargetUserItem != NULL) // { // pITargetUserItem->ModifyUserProperty(0, pPropertySuccess->lRecvLoveLiness); // } // // //变量定义 // DWORD dwCurrentTime = (DWORD)time(NULL); // tagUserProperty * pUserProperty = pITargetUserItem->GetUserProperty(); // // //道具处理 // switch (pPropertySuccess->wPropertyIndex) // { // case PROPERTY_ID_TWO_CARD: //双倍积分 // { // //使用判断 // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_DOUBLE_SCORE) != 0) // { // //变量定义 // DWORD dwValidTime = pUserProperty->PropertyInfo[0].wPropertyCount*pUserProperty->PropertyInfo[0].dwValidNum; // if (pUserProperty->PropertyInfo[0].dwEffectTime + dwValidTime < dwCurrentTime) // { // pUserProperty->PropertyInfo[0].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[0].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[0].dwValidNum = VALID_TIME_DOUBLE_SCORE; // } // else // { // //数目累加 // pUserProperty->PropertyInfo[0].wPropertyCount += pPropertySuccess->wItemCount; // } // } // else // { // //设置信息 // pUserProperty->PropertyInfo[0].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[0].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[0].dwValidNum = VALID_TIME_DOUBLE_SCORE; // pUserProperty->wPropertyUseMark |= PT_USE_MARK_DOUBLE_SCORE; // } // // break; // } // case PROPERTY_ID_FOUR_CARD: //四倍积分 // { // //使用判断 // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_FOURE_SCORE) != 0) // { // //变量定义 // DWORD dwValidTime = pUserProperty->PropertyInfo[1].wPropertyCount*pUserProperty->PropertyInfo[1].dwValidNum; // if (pUserProperty->PropertyInfo[1].dwEffectTime + dwValidTime < dwCurrentTime) // { // pUserProperty->PropertyInfo[1].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[1].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[1].dwValidNum = VALID_TIME_FOUR_SCORE; // } // else // { // //数目累加 // pUserProperty->PropertyInfo[1].wPropertyCount += pPropertySuccess->wItemCount; // } // } // else // { // //设置信息 // pUserProperty->PropertyInfo[1].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[1].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[1].dwValidNum = VALID_TIME_FOUR_SCORE; // pUserProperty->wPropertyUseMark |= PT_USE_MARK_FOURE_SCORE; // } // break; // } // case PROPERTY_ID_SCORE_CLEAR: //负分清零 // { // //变量定义 // SCORE lCurrScore = pITargetUserItem->GetUserScore(); // if (lCurrScore < 0) // { // //用户信息 // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo(); // if (pUserInfo == NULL) return true; // // //修改积分 // pUserInfo->lScore = 0; // } // break; // } // case PROPERTY_ID_ESCAPE_CLEAR: //逃跑清零 // { // //用户信息 // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo(); // if (pUserInfo == NULL) return true; // // //修改逃跑率 // if (pUserInfo->dwFleeCount > 0) // { // pUserInfo->dwFleeCount = 0; // } // // break; // } // case PROPERTY_ID_GUARDKICK_CARD: //防踢卡 // { // //使用判断 // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_GUARDKICK_CARD) != 0) // { // //变量定义 // DWORD dwValidTime = pUserProperty->PropertyInfo[2].wPropertyCount*pUserProperty->PropertyInfo[2].dwValidNum; // if (pUserProperty->PropertyInfo[2].dwEffectTime + dwValidTime < dwCurrentTime) // { // pUserProperty->PropertyInfo[2].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[2].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[2].dwValidNum = VALID_TIME_GUARDKICK_CARD; // } // else // { // //数目累加 // pUserProperty->PropertyInfo[2].wPropertyCount += pPropertySuccess->wItemCount; // } // } // else // { // //设置信息 // pUserProperty->PropertyInfo[2].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[2].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[2].dwValidNum = VALID_TIME_GUARDKICK_CARD; // pUserProperty->wPropertyUseMark |= PT_USE_MARK_GUARDKICK_CARD; // } // // break; // } // case PROPERTY_ID_POSSESS: //附身符 // { // //使用判断 // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_POSSESS) != 0) // { // //变量定义 // DWORD dwValidTime = pUserProperty->PropertyInfo[3].wPropertyCount*pUserProperty->PropertyInfo[3].dwValidNum; // if (pUserProperty->PropertyInfo[3].dwEffectTime + dwValidTime < dwCurrentTime) // { // pUserProperty->PropertyInfo[3].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[3].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[3].dwValidNum = VALID_TIME_POSSESS; // } // else // { // //数目累加 // pUserProperty->PropertyInfo[3].wPropertyCount += pPropertySuccess->wItemCount; // } // } // else // { // //设置信息 // pUserProperty->PropertyInfo[3].dwEffectTime = dwCurrentTime; // pUserProperty->PropertyInfo[3].wPropertyCount = pPropertySuccess->wItemCount; // pUserProperty->PropertyInfo[3].dwValidNum = VALID_TIME_POSSESS; // pUserProperty->wPropertyUseMark |= PT_USE_MARK_POSSESS; // } // // break; // } // case PROPERTY_ID_BLUERING_CARD: //蓝钻会员 // case PROPERTY_ID_YELLOWRING_CARD://黄钻会员 // case PROPERTY_ID_WHITERING_CARD: //白钻会员 // case PROPERTY_ID_REDRING_CARD: //红钻会员 // case PROPERTY_ID_VIPROOM_CARD: //VIP会员 // { // //用户信息 // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo(); // if (pUserInfo == NULL) return true; // // //更新会员 // pUserInfo->cbMemberOrder = pPropertySuccess->cbMemberOrder; // // //修改权限 // pITargetUserItem->ModifyUserRight(pPropertySuccess->dwUserRight, 0); // // //发送消息 // SendPropertyEffect(pITargetUserItem); // // break; // } // default: // 全部礼物 // { // break; // } // } // // //消费方式 // if (pPropertySuccess->cbConsumeScore == FALSE) // { // pISourceUserItem->ModifyUserInsure(0, -pPropertySuccess->lConsumeGold, 0); // } // // //喇叭判断 // if (pPropertySuccess->wPropertyIndex == PROPERTY_ID_TRUMPET || pPropertySuccess->wPropertyIndex == PROPERTY_ID_TYPHON) // return true; // // //变量定义 // CMD_GR_S_PropertySuccess PropertySuccess; // ZeroMemory(&PropertySuccess, sizeof(PropertySuccess)); // // //设置变量 // PropertySuccess.cbRequestArea = pPropertySuccess->cbRequestArea; // PropertySuccess.wItemCount = pPropertySuccess->wItemCount; // PropertySuccess.wPropertyIndex = pPropertySuccess->wPropertyIndex; // PropertySuccess.dwSourceUserID = pPropertySuccess->dwSourceUserID; // PropertySuccess.dwTargetUserID = pPropertySuccess->dwTargetUserID; // // //发送消息 // if (pISourceUserItem != NULL) // { // SendData(pISourceUserItem, MDM_GR_USER, SUB_GR_PROPERTY_SUCCESS, &PropertySuccess, sizeof(PropertySuccess)); // } // // //发送消息 // if (pITargetUserItem != NULL && pITargetUserItem != pISourceUserItem) // { // SendData(pITargetUserItem, MDM_GR_USER, SUB_GR_PROPERTY_SUCCESS, &PropertySuccess, sizeof(PropertySuccess)); // } // // //广播礼物 // if (GetPropertyType(pPropertySuccess->wPropertyIndex) == PT_TYPE_PRESENT) // SendPropertyMessage(PropertySuccess.dwSourceUserID, PropertySuccess.dwTargetUserID, PropertySuccess.wPropertyIndex, // PropertySuccess.wItemCount); // // return true; //} // ////道具失败 //bool CAttemperEngineSink::OnDBPropertyFailure(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //参数校验 // ASSERT(wDataSize == sizeof(DBO_GR_PropertyFailure)); // if (wDataSize != sizeof(DBO_GR_PropertyFailure)) return false; // // //提取数据 // DBO_GR_PropertyFailure * pPropertyFailure = (DBO_GR_PropertyFailure *)pData; // if (pPropertyFailure == NULL) return false; // // //变量定义 // WORD wBindIndex = LOWORD(dwContextID); // tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); // if (pBindParameter == NULL) return false; // if (pBindParameter->pIServerUserItem == NULL) return false; // // //发送消息 // return SendPropertyFailure(pBindParameter->pIServerUserItem, pPropertyFailure->szDescribeString, 0L, pPropertyFailure->cbRequestArea); //} // ////购买结果 //bool CAttemperEngineSink::OnDBPurchaseResult(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //提取数据 // DBO_GR_PurchaseResult * pPurchaseResult = (DBO_GR_PurchaseResult *)pData; // // //构造结构 // CMD_GR_PurchaseResult PurchaseResult; // ZeroMemory(&PurchaseResult, sizeof(PurchaseResult)); // // //设置变量 // PurchaseResult.bSuccessed = pPurchaseResult->bSuccessed; // PurchaseResult.lCurrScore = pPurchaseResult->lCurrScore; // PurchaseResult.cbMemberOrder = pPurchaseResult->cbMemberOrder; // lstrcpyn(PurchaseResult.szNotifyContent, pPurchaseResult->szNotifyContent, CountArray(PurchaseResult.szNotifyContent)); // // //发送数据 // WORD wSendDataSize = sizeof(PurchaseResult) - sizeof(PurchaseResult.szNotifyContent); // wSendDataSize += CountStringBuffer(PurchaseResult.szNotifyContent); // // DWORD dTableNum = 0; // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pat = GetTableFrame(pIServerUserItem->GetTableID()); // // TCHAR szTemp[32] = { 0 }; // if (pat) pat->GetPrivateTableID(szTemp, 32); // CString csTemp = szTemp; // // if (pat != nullptr && !csTemp.IsEmpty()) // { // dTableNum = _wtol(csTemp); // } // } // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_EXCHANGE, SUB_GR_PURCHASE_RESULT); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_EXCHANGE, SUB_GR_PURCHASE_RESULT, pData, wDataSize, dTableNum, pIServerUserItem == NULL ? NULL : pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_PURCHASE_RESULT, &PurchaseResult, wSendDataSize); // // //结果判断 // if (PurchaseResult.bSuccessed == true) // { // //设置权限 // pIServerUserItem->ModifyUserRight(pPurchaseResult->dwUserRight, 0, UR_KIND_SERVER); // // //更新游戏币 // if (m_pGameServiceOption->wServerType == GAME_GENRE_GOLD) // { // pIServerUserItem->ModifyUserInsure(PurchaseResult.lCurrScore - pIServerUserItem->GetUserScore(), 0, 0); // } // } // // return true; //} // ////兑换结果(钻石交换金币的结果) //bool CAttemperEngineSink::OnDBExChangeResult(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //提取数据 // DBO_GR_ExchangeResult * pExchangeResult = (DBO_GR_ExchangeResult *)pData; // // //构造结构 // //CMD_GP_ExchangeResult ExchangeResult; // //ZeroMemory(&ExchangeResult, sizeof(ExchangeResult)); // // ////设置变量 // //ExchangeResult.bSuccessed = pExchangeResult->bSuccessed; // //ExchangeResult.lCurrScore = pExchangeResult->lCurrScore; // //ExchangeResult.lCurrIngot = pExchangeResult->lCurrIngot; // //lstrcpyn(ExchangeResult.szNotifyContent, pExchangeResult->szNotifyContent, CountArray(ExchangeResult.szNotifyContent)); // // //TRACE(L"\n***兑换结果 UserID=%d lCurrIngot=%lld lCurrScore=%llld\n", pIServerUserItem->GetUserID(), ExchangeResult.lCurrIngot, ExchangeResult.lCurrScore); // // ////发送数据 // //WORD wSendDataSize = sizeof(ExchangeResult) - sizeof(ExchangeResult.szNotifyContent); // //wSendDataSize += CountStringBuffer(ExchangeResult.szNotifyContent); // // DWORD dTableNum = 0; // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pat = GetTableFrame(pIServerUserItem->GetTableID()); // if (pat != nullptr && !pat->GetPrivateTableID().empty()) // { // dTableNum = _wtol(pat->GetPrivateTableID().c_str()); // } // } // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_RESULT); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_RESULT, pData, wDataSize, dTableNum, pIServerUserItem == NULL ? NULL : pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // //m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_RESULT, &ExchangeResult, sizeof(ExchangeResult)); // // //TRACE(L"\n***sizeof(ExchangeResult)=%d, sizeof(SCORE)=%d \n", sizeof(ExchangeResult), sizeof(SCORE)); // // /////[+++兑换成功,更新下 // //if (ExchangeResult.bSuccessed) // //{ // // pIServerUserItem->GetUserInfo()->lScore = ExchangeResult.lCurrScore; // // pIServerUserItem->GetUserInfo()->dwBean = ExchangeResult.lCurrIngot; // //} // ///+++] // // //更新游戏币 ---好友场也会兑换的 // ////if (ExchangeResult.bSuccessed == true) // ////{ ///差值即是兑换产生的金币 // //// pIServerUserItem->ModifyUserInsure(ExchangeResult.lCurrScore - pIServerUserItem->GetUserScore(), 0, 0); // ////} // // return true; //} // ////任务列表 //bool CAttemperEngineSink::OnDBUserTaskList(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //变量定义 // DBO_GR_TaskListInfo * pTaskListInfo = (DBO_GR_TaskListInfo *)pData; // // //拷贝数据 // WORD wTaskCount = __min(pTaskListInfo->wTaskCount, CountArray(m_TaskParameter) - m_wTaskCount); // CopyMemory(m_TaskParameter + m_wTaskCount, ++pTaskListInfo, sizeof(tagTaskParameter)*wTaskCount); // // //设置变量 // m_wTaskCount += wTaskCount; // // return true; //} // ////任务结束 //bool CAttemperEngineSink::OnDBUserTaskListEnd(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //移除任务 // m_UserTaskManager.RemoveTaskParameter(); // // //添加任务 // m_UserTaskManager.AddTaskParameter(m_TaskParameter, m_wTaskCount); // // return true; //} // ////任务信息 //bool CAttemperEngineSink::OnDBUserTaskInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // ASSERT(wDataSize <= sizeof(DBO_GR_TaskInfo)); // if (wDataSize > sizeof(DBO_GR_TaskInfo)) return false; // // //变量定义 // DBO_GR_TaskInfo * pTaskInfo = (DBO_GR_TaskInfo *)pData; // // //网络数据 // WORD wTaskCount = 0; // BYTE cbDataBuffer[SOCKET_TCP_PACKET]; // LPBYTE pDataBuffer = cbDataBuffer; // // //设置数量 // pDataBuffer += sizeof(wTaskCount); // WORD wSendSize = sizeof(wTaskCount); // // //变量定义 // POSITION Position = NULL; // do // { // tagTaskParameter * pTaskParameter = m_UserTaskManager.EnumTaskParameter(Position); // if (pTaskParameter != NULL) // { // //越界判断 // if (wSendSize + sizeof(tagTaskParameter) > SOCKET_TCP_PACKET) // { // //重置变量 // pDataBuffer = cbDataBuffer; // *(WORD*)pDataBuffer = wTaskCount; // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_LIST); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_LIST, pData, wDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // //发送数据 // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_LIST, pDataBuffer, wSendSize); // // //重置变量 // wTaskCount = 0; // pDataBuffer += sizeof(wSendSize); // wSendSize = sizeof(wSendSize); // } // // //计算大小 // WORD wParameterSize = sizeof(tagTaskParameter) - sizeof(pTaskParameter->szTaskDescribe) + CountStringBuffer(pTaskParameter->szTaskDescribe); // *(WORD *)pDataBuffer = wParameterSize; // pDataBuffer += sizeof(wParameterSize); // wSendSize += sizeof(wParameterSize); // // //拷贝数据 // CopyMemory(pDataBuffer, pTaskParameter, wParameterSize); // // //推进指针 // wTaskCount++; // pDataBuffer += wParameterSize; // wSendSize += wParameterSize; // } // } while (Position != NULL); // // //剩余发送 // if (wTaskCount > 0 && wSendSize) // { // //重置变量 // pDataBuffer = cbDataBuffer; // *(WORD *)pDataBuffer = wTaskCount; // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_LIST); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_LIST, pData, wDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // //发送数据 // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_LIST, pDataBuffer, wSendSize); // } // // //构造结构 // CMD_GR_S_TaskInfo TaskInfo; // TaskInfo.wTaskCount = pTaskInfo->wTaskCount; // CopyMemory(TaskInfo.TaskStatus, pTaskInfo->TaskStatus, sizeof(TaskInfo.TaskStatus[0])*pTaskInfo->wTaskCount); // // //发送数据 // WORD wSendDataSize = sizeof(TaskInfo) - sizeof(TaskInfo.TaskStatus); // wSendDataSize += sizeof(TaskInfo.TaskStatus[0])*TaskInfo.wTaskCount; // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_INFO); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_INFO, &TaskInfo, wSendDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_INFO, &TaskInfo, wSendDataSize); // // return true; //} // ////任务结果 //bool CAttemperEngineSink::OnDBUserTaskResult(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //判断在线 // ASSERT(wDataSize <= sizeof(DBO_GR_TaskResult)); // if (wDataSize > sizeof(DBO_GR_TaskResult)) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //变量定义 // DBO_GR_TaskResult * pTaskResult = (DBO_GR_TaskResult *)pData; // // //变量定义 // CMD_GR_S_TaskResult TaskResult; // ZeroMemory(&TaskResult, sizeof(TaskResult)); // // //构造变量 // TaskResult.wCommandID = pTaskResult->wCommandID; // TaskResult.bSuccessed = pTaskResult->bSuccessed; // TaskResult.lCurrScore = pTaskResult->lCurrScore; // TaskResult.lCurrIngot = pTaskResult->lCurrIngot; // lstrcpyn(TaskResult.szNotifyContent, pTaskResult->szNotifyContent, CountArray(TaskResult.szNotifyContent)); // // //发送数据 // WORD wSendSize = sizeof(TaskResult) - sizeof(TaskResult.szNotifyContent) + CountStringBuffer(TaskResult.szNotifyContent); // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_RESULT); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_RESULT, &TaskResult, wSendSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_RESULT, &TaskResult, wSendSize); // // //设置任务 // if (TaskResult.bSuccessed == true && TaskResult.wCommandID == SUB_GR_TASK_TAKE) // { // tagTaskParameter * pTaskParameter = m_UserTaskManager.SearchTaskParameter(pTaskResult->wCurrTaskID); // if (pTaskParameter != NULL && pTaskParameter->wKindID == m_pGameServiceOption->wKindID) // { // //变量定义 // tagUserTaskInfo UserTaskInfo; // // //设置任务 // UserTaskInfo.wTaskProgress = 0; // UserTaskInfo.cbTaskStatus = TASK_STATUS_UNFINISH; // UserTaskInfo.wTaskID = pTaskResult->wCurrTaskID; // UserTaskInfo.dwResidueTime = pTaskParameter->dwTimeLimit; // UserTaskInfo.dwLastUpdateTime = (DWORD)time(NULL); // // //设置任务 // m_UserTaskManager.SetUserTaskInfo(pIServerUserItem->GetUserID(), &UserTaskInfo, 1); // } // } // // return true; //} // //系统消息 //bool CAttemperEngineSink::OnDBSystemMessage(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //参数校验 // ASSERT(wDataSize == sizeof(DBR_GR_SystemMessage)); // if (wDataSize != sizeof(DBR_GR_SystemMessage)) return false; // // //提取数据 // DBR_GR_SystemMessage * pSystemMessage = (DBR_GR_SystemMessage *)pData; // if (pSystemMessage == NULL) return false; // // for (INT_PTR nIndex = m_SystemMessageBuffer.GetCount() - 1; nIndex >= 0; nIndex--) // { // tagSystemMessage *pTagSystemMessage = m_SystemMessageBuffer[nIndex]; // if (pTagSystemMessage && pTagSystemMessage->SystemMessage.dwMessageID == pSystemMessage->dwMessageID) // { // CopyMemory(&pTagSystemMessage->SystemMessage, pSystemMessage, sizeof(DBR_GR_SystemMessage)); // m_SystemMessageActive.Add(pTagSystemMessage); // m_SystemMessageBuffer.RemoveAt(nIndex); // // return true; // } // } // // //定义变量 // tagSystemMessage *pSendMessage = new tagSystemMessage; // ZeroMemory(pSendMessage, sizeof(tagSystemMessage)); // // //设置变量 // pSendMessage->dwLastTime = (DWORD)pSystemMessage->tStartTime; // CopyMemory(&pSendMessage->SystemMessage, pSystemMessage, sizeof(DBR_GR_SystemMessage)); // // //记录消息 // m_SystemMessageActive.Add(pSendMessage); // // return true; //} // // ////加载完成 //bool CAttemperEngineSink::OnDBSystemMessageFinish(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //处理临时消息 // if (m_SystemMessageBuffer.GetCount() > 0) // { // //变量定义 // tagSystemMessage *pTagSystemMessage = NULL; // // for (INT_PTR nIndex = m_SystemMessageBuffer.GetCount() - 1; nIndex >= 0; nIndex--) // { // pTagSystemMessage = m_SystemMessageBuffer[nIndex]; // if (pTagSystemMessage && pTagSystemMessage->SystemMessage.dwMessageID == TEMP_MESSAGE_ID) // { // m_SystemMessageActive.Add(pTagSystemMessage); // m_SystemMessageBuffer.RemoveAt(nIndex); // } // } // } // // return true; //} //加载敏感词 //bool CAttemperEngineSink::OnDBSensitiveWords(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //开始加载 // if (dwContextID == 0xfffe) // { // m_WordsFilter.ResetSensitiveWordArray(); // m_pITimerEngine->KillTimer(IDI_LOAD_SENSITIVE_WORD); // return true; // } // // //加载完成 // if (dwContextID == 0xffff) // { // m_WordsFilter.FinishAdd(); // return true; // } // // //加载敏感词 // const TCHAR *pWords = (const TCHAR*)pData; // m_WordsFilter.AddSensitiveWords(pWords); // return true; //} //注册事件 bool CAttemperEngineSink::OnTCPSocketMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize) { switch (wSubCmdID) { case SUB_CS_S_REGISTER_FAILURE: //注册失败 { //变量定义 CMD_CS_S_RegisterFailure * pRegisterFailure = (CMD_CS_S_RegisterFailure *)pData; //效验参数 ASSERT(wDataSize >= (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString))); if (wDataSize < (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString))) return false; //关闭处理 m_bNeekCorrespond = false; m_pITCPSocketService->CloseSocket(); //显示消息 if (lstrlen(pRegisterFailure->szDescribeString) > 0) { CTraceService::TraceString(pRegisterFailure->szDescribeString, TraceLevel_Exception); } //事件通知 CP_ControlResult ControlResult; ControlResult.cbSuccess = ER_FAILURE; SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult)); return true; } default: break; } return true; } //列表事件 bool CAttemperEngineSink::OnTCPSocketMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize) { switch (wSubCmdID) { case SUB_CS_S_SERVER_INFO: //房间信息 { //废弃列表 m_ServerListManager.DisuseServerItem(); //注册比赛 if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) { //构造结构 CMD_CS_C_RegisterMatch RegitsterMatch; ZeroMemory(&RegitsterMatch, sizeof(RegitsterMatch)); //设置结构 RegitsterMatch.wServerID = m_pGameServiceOption->wServerID; RegitsterMatch.dwMatchID = m_pGameMatchOption->dwMatchID; RegitsterMatch.dwMatchNO = m_pGameMatchOption->dwMatchNO; RegitsterMatch.cbMatchType = m_pGameMatchOption->cbMatchType; RegitsterMatch.lMatchFee = m_pGameMatchOption->lMatchFee; RegitsterMatch.cbMatchFeeType = m_pGameMatchOption->cbMatchFeeType; RegitsterMatch.cbMemberOrder = m_pGameMatchOption->cbMemberOrder; RegitsterMatch.wRewardCount = m_pGameMatchOption->wRewardCount; //拷贝信息 lstrcpyn(RegitsterMatch.szMatchName, m_pGameMatchOption->szMatchName, CountArray(RegitsterMatch.szMatchName)); //定时赛制 if (m_pGameMatchOption->cbMatchType == MATCH_TYPE_LOCKTIME) { RegitsterMatch.MatchEndTime = m_pGameMatchOption->MatchType.LockTime.MatchEndTime; RegitsterMatch.MatchStartTime = m_pGameMatchOption->MatchType.LockTime.MatchStartTime; RegitsterMatch.wMatchPlayCount = m_pGameMatchOption->MatchType.LockTime.wMatchPlayCount; } //即时赛制 if (m_pGameMatchOption->cbMatchType == MATCH_TYPE_IMMEDIATE) { RegitsterMatch.wMatchPlayCount = m_pGameMatchOption->MatchType.Immediate.cbPlayCount; RegitsterMatch.wStartUserCount = m_pGameMatchOption->MatchType.Immediate.wStartUserCount; } //发送数据 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_MATCH, &RegitsterMatch, sizeof(RegitsterMatch)/*,0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); } return true; } case SUB_CS_S_SERVER_STAT: { //游戏节点状态改变 //效验参数 ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT)); if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false; //变量定义 JN_GR_SERVICESTAT * pServerModify = (JN_GR_SERVICESTAT *)pData; //查找房间 ASSERT(m_ServerListManager.SearchGameServer(pServerModify->dwServerID)); CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->dwServerID); //设置房间 if (pGameServerItem != NULL) { //修改房间信息 pGameServerItem->m_GameServer.bService = pServerModify->bService; } return true; } case SUB_CS_S_SERVER_ONLINE: //房间人数 { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_S_ServerOnLine)); if (wDataSize != sizeof(CMD_CS_S_ServerOnLine)) return false; //变量定义 CMD_CS_S_ServerOnLine * pServerOnLine = (CMD_CS_S_ServerOnLine *)pData; //查找房间 CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerOnLine->wServerID); //设置人数 if (pGameServerItem != NULL) { pGameServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount; pGameServerItem->m_GameServer.wTableFullCount = pServerOnLine->wTableFullCount; pGameServerItem->m_GameServer.wTableOnlineCount = pServerOnLine->wTableOnlineCount; ///汇总同一场馆的人数 //SumOnlineCount(pGameServerItem->m_GameServer.wNodeID); } return true; } case SUB_CS_S_SERVER_INSERT: //房间插入 { //效验参数 ASSERT(wDataSize % sizeof(tagGameServer) == 0); if (wDataSize % sizeof(tagGameServer) != 0) return false; //变量定义 WORD wItemCount = wDataSize / sizeof(tagGameServer); tagGameServer * pGameServer = (tagGameServer *)pData; //更新数据 for (WORD i = 0; i < wItemCount; i++) { CString csTestB; csTestB.Format(_T("房间插入[%d] -> %s:%d "), pGameServer->wServerID , pGameServer->szServerAddr, pGameServer->wServerPort); CTraceService::TraceString(csTestB, TraceLevel_Normal); m_ServerListManager.InsertGameServer(pGameServer++); } //更新加载通道 UpDataTongDao(); return true; } case SUB_CS_S_SERVER_MODIFY: //房间修改 { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_S_ServerModify)); if (wDataSize != sizeof(CMD_CS_S_ServerModify)) return false; //变量定义 CMD_CS_S_ServerModify * pServerModify = (CMD_CS_S_ServerModify *)pData; //查找房间 CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->wServerID); //设置房间 if (pGameServerItem != NULL) { pGameServerItem->m_GameServer.wNodeID = pServerModify->wNodeID; pGameServerItem->m_GameServer.wSortID = pServerModify->wSortID; pGameServerItem->m_GameServer.wServerPort = pServerModify->wServerPort; pGameServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount; pGameServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount; lstrcpyn(pGameServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGameServerItem->m_GameServer.szServerName)); lstrcpyn(pGameServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGameServerItem->m_GameServer.szServerAddr)); } return true; } case SUB_CS_S_SERVER_REMOVE: //房间删除 { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_S_ServerRemove)); if (wDataSize != sizeof(CMD_CS_S_ServerRemove)) return false; //变量定义 CMD_CS_S_ServerRemove * pServerRemove = (CMD_CS_S_ServerRemove *)pData; //变量定义 m_ServerListManager.DeleteGameServer(pServerRemove->wServerID); return true; } case SUB_CS_S_SERVER_FINISH: //房间完成 { //清理列表 m_ServerListManager.CleanServerItem(); //事件处理 CP_ControlResult ControlResult; ControlResult.cbSuccess = ER_SUCCESS; SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult)); return true; } case SUB_CS_S_SERVER_USER_INFO: //用户房间信息 { return true; } case SUB_CS_C_SERVER_JULI_ACK: { ASSERT(wDataSize == sizeof(CMD_CS_C_JULI)); if (wDataSize != sizeof(CMD_CS_C_JULI)) return true; CMD_CS_C_JULI *p = (CMD_CS_C_JULI*)pData; m_MapUserIDJuli[p->dUserID] = p->llJuLi; return true; } default: break; } return true; } //汇总事件 bool CAttemperEngineSink::OnTCPSocketMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize) { switch (wSubCmdID) { case SUB_CS_DISSOLVEROOM: { //群主解散俱乐部房间 ASSERT(wDataSize == sizeof(DWORD)); if (wDataSize != sizeof(DWORD)) return false; DWORD *dwRoomID = (DWORD *)pData; GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSROOM, 0, dwRoomID, sizeof(DWORD)); break; } case SUB_CS_ChangServer: { //自动创房 ASSERT(wDataSize == sizeof(CMD_GR_ClubAction2_XT)); if (wDataSize != sizeof(CMD_GR_ClubAction2_XT)) return false; CMD_GR_ClubAction2_XT * pClubAction = (CMD_GR_ClubAction2_XT *)pData; this->OnAutoCreateRoomToDB(pClubAction->dwClubID, 0, pClubAction->wWanFa); //m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, 0, pData, wDataSize); break; } case SUB_CS_C_USER_ONLINE: { //OutputDebugStringA("收到用户上线相通知"); CMD_CS_C_UserEnter * pUserChat = (CMD_CS_C_UserEnter *)pData; //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_C_UserEnter)); //效验参数 if (wDataSize != sizeof(CMD_CS_C_UserEnter)) return false; auto iter = m_OnLineUserAll.find(pUserChat->dwUserID); if (iter != m_OnLineUserAll.end()) { m_OnLineUserAll.erase(iter); } m_OnLineUserAll[pUserChat->dwUserID] = *pUserChat; break; } case SUB_CS_C_USER_OFFLINE: { //OutputDebugStringA("收到用户离线通知"); CMD_CS_C_UserLeave * pUserChat = (CMD_CS_C_UserLeave *)pData; //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_C_UserLeave)); //效验参数 if (wDataSize != sizeof(CMD_CS_C_UserLeave)) return false; auto iter = m_OnLineUserAll.find(pUserChat->dwUserID); if (iter != m_OnLineUserAll.end()) { m_OnLineUserAll.erase(iter); } break; } case SUB_CS_C_USER_DisCONN: { //OutputDebugStringA("强行断开某用户通知"); //DWORD *pUserID = (DWORD*)pData; //IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(*pUserID); ////断开用户 //if (pIServerUserItem && pIServerUserItem->GetBindIndex() != INVALID_WORD) //{ // //发送通知 // LPCTSTR pszMessage = TEXT("网络连接不稳定,请重试."); // SendRoomMessage(pIServerUserItem, pszMessage, SMT_CLOSE_SEND); // //绑定参数 // WORD wSourceIndex = pIServerUserItem->GetBindIndex(); // tagBindParameter * pSourceParameter = GetBindParameter(wSourceIndex); // //解除绑定 // ASSERT((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem)); // if ((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem)) // { // pSourceParameter->pIServerUserItem = NULL; // } // //断开用户 // if (pIServerUserItem->IsAndroidUser() == true) // { // m_AndroidUserManager.DeleteAndroidUserItem(pSourceParameter->dwSocketID, true); // } // else // { // m_pITCPNetworkEngine->ShutDownSocket(pSourceParameter->dwSocketID); // } // m_ServerUserManager.DeleteUserItem(pIServerUserItem); //} break; } case SUB_CS_C_USER_SendMessage: { CMD_GR_Club_NotifyEX_ACK * pUserChat = (CMD_GR_Club_NotifyEX_ACK *)pData; //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_Club_NotifyEX_ACK)); //效验参数 if (wDataSize != sizeof(CMD_GR_Club_NotifyEX_ACK)) return false; if ((pUserChat->Notify.newsFalg == 99) || (pUserChat->Notify.newsFalg == 100)) { CMD_GR_Club_Make_A_Sample Sample; ZeroMemory(&Sample, sizeof(Sample)); Sample.dwClubID = pUserChat->Notify.dwClubID; if (pUserChat->Notify.newsFalg == 99) { Sample.IsSample = 0; } else { Sample.IsSample = 1; } //本地在线用户 WORD wUserIndex = 0; IServerUserItem * pIServerUserItemSend = NULL; while (true) { pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); if (pIServerUserItemSend == NULL) break; if (pIServerUserItemSend->GetUserID() == pUserChat->dwUserId) { tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex()); //发送数据 if (pBindParameter != NULL) { Club::PB_CS_Club_Make_A_Sample MakeSample; MakeSample.set_dwclubid(Sample.dwClubID); MakeSample.set_issample(Sample.IsSample); //发送数据 std::string pbdata = MakeSample.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_CLUB_GET_MAKEA_SAMPLE_ACK, (void*)pbdata.c_str(), pbdata.length()); break; } } } } else { CMD_GR_Club_Notify_ACKEX NotifyAck; ZeroMemory(&NotifyAck, sizeof(NotifyAck)); NotifyAck.newsFalg = pUserChat->Notify.newsFalg; NotifyAck.dwClubID = pUserChat->Notify.dwClubID; NotifyAck.dwUserCount = pUserChat->Notify.dwUserCount; CopyMemory(NotifyAck.Message, pUserChat->Notify.Message, sizeof(NotifyAck.Message)); //本地在线用户 WORD wUserIndex = 0; while (true) { IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); if (pIServerUserItemSend == NULL) break; if (pIServerUserItemSend->GetUserID() == pUserChat->dwUserId) { tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex()); //发送数据 if (pBindParameter != NULL) { //广播新申请用户 if (pUserChat->Notify.newsFalg == 3) { CMD_GR_TableOtherInfo_Notify TableOtherInfo; ZeroMemory(&TableOtherInfo, sizeof(TableOtherInfo)); TableOtherInfo.ClubID = pUserChat->Notify.dwClubID; TableOtherInfo.Type = 16; TableOtherInfo.newUserNum = pUserChat->Notify.dwUserCount; Club::PB_CS_S_TableOtherInfo_Notify Notify; Notify.set_clubid(TableOtherInfo.ClubID); Notify.set_newmsgnum(TableOtherInfo.newMsgNum); Notify.set_newusernum(TableOtherInfo.newUserNum); Notify.set_onlineusernum(TableOtherInfo.onlineUserNum); Notify.set_playtablenum(TableOtherInfo.playTableNum); Notify.set_totaltablenum(TableOtherInfo.totalTableNum); Notify.set_totalusernum(TableOtherInfo.totalUserNum); Notify.set_type(TableOtherInfo.Type); Notify.set_waittablenum(TableOtherInfo.waitTableNum); //发送数据 std::string pbdata = Notify.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_CLUBCHANGE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length()); } Club::PB_CS_S_Club_Notify_ACKEX NotifyACK; NotifyACK.set_newsfalg(NotifyAck.newsFalg); NotifyACK.set_temp(NotifyAck.Temp); std::string Message = CW2AEX<1024>(NotifyAck.Message, CP_UTF8).m_psz; NotifyACK.set_message(Message); NotifyACK.set_dwclubid(NotifyAck.dwClubID); NotifyACK.set_dwusercount(NotifyAck.dwUserCount); //发送数据 std::string pbdata = NotifyACK.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length()); break; } } } } break; } case SUB_CS_C_GET_ROOMID: { //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx)); if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false; CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pData; IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pEx->dwUserID); if (pIServerUserItem && pIServerUserItem->GetBindIndex() != INVALID_WORD && pEx->cbAuto == 0 && pEx->dwUserID>=100000) { tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItem->GetBindIndex()); OnTCPNetworkSubUserCreateRoomEx(pData, wDataSize, pBindParameter->dwSocketID); } else { //自动开房 OnTCPNetworkSubUserCreateRoomEx2(pData, wDataSize, 0); } break; } case SUB_CS_UPDATAOWNROOMLIST://个人创建房间的总列表 { JN_GR_RoomListGroupSend * pUserChat = (JN_GR_RoomListGroupSend *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomListGroupSend)); if (wDataSize != sizeof(JN_GR_RoomListGroupSend)) return false; //找到他的连接 IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->jgrDate[0].dwUserID); if (pIServerUserItem != NULL) { UserInfo::PB_CS_S_RoomListGroupSend GroupSend; for (WORD i = 0; i < pUserChat->Num; i++) { if (pUserChat->jgrDate[i].dwRoomNumber == 0)break; UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate(); RoomList->set_dwuserid(pUserChat->jgrDate[i].dwUserID); RoomList->set_dwserverid(pUserChat->jgrDate[i].dwServerID); RoomList->set_dwroomnumber(pUserChat->jgrDate[i].dwRoomNumber); RoomList->set_dwinsert_updata_del(pUserChat->jgrDate[i].dwInsert_UpData_Del); RoomList->set_dwdifen(pUserChat->jgrDate[i].dwDiFen); RoomList->set_dwjushu(pUserChat->jgrDate[i].dwJuShu); RoomList->set_dwreadybody(pUserChat->jgrDate[i].dwReadyBody); RoomList->set_dwbody(pUserChat->jgrDate[i].dwBody); RoomList->set_bwanfa(pUserChat->jgrDate[i].bWanFa); std::string szIp = CW2AEX<1024>(pUserChat->jgrDate[i].szIp, CP_UTF8).m_psz; RoomList->set_szip(szIp); RoomList->set_bduolai(pUserChat->jgrDate[i].bDuoLai); RoomList->set_wfengding(pUserChat->jgrDate[i].wFengDing); RoomList->set_tmp1(pUserChat->jgrDate[i].tmp1); RoomList->set_tmp2(pUserChat->jgrDate[i].tmp2); RoomList->set_tmp3(pUserChat->jgrDate[i].tmp3); RoomList->set_tmp4(pUserChat->jgrDate[i].tmp4); RoomList->set_tmp5(pUserChat->jgrDate[i].tmp5); for (WORD i = 0; i < 4; i++) { RoomList->add_tmp6(pUserChat->jgrDate[i].tmp6[i]); } RoomList->set_wport(pUserChat->jgrDate[i].wPort); } GroupSend.set_num(pUserChat->Num); //发送数据 std::string pbdata = GroupSend.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length()); return true; } break; } case SUB_CS_UPDATAOTHERROOM: //更新其他服务器私有房间 { OnUpdataBodyOtherRoom(pData, wDataSize); break; } case SUB_CS_UPDATAOWNROOM://房间动态信息 { OnUpdataBodyOwnRoom(pData, wDataSize); break; } case SUB_CS_UPDATAOWNBEANS_UNLOCK: { DBO_GR_UserReduceResult * pUserChat = (DBO_GR_UserReduceResult *)pData; //效验参数 ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResult)); if (wDataSize != sizeof(DBO_GR_UserReduceResult)) return false; IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwUserID); if (pIServerUserItem) { auto UserInfo = pIServerUserItem->GetUserInfo(); if (UserInfo) { UserInfo->dwBean = pUserChat->dwCurrBeans; } //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pUserChat->dwCurrBeans; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); } break; } case SUB_CS_UPDATAOWNBEANS_LOCK: { DBO_GR_UserReduceResult * pUserChat = (DBO_GR_UserReduceResult *)pData; //效验参数 ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResult)); if (wDataSize != sizeof(DBO_GR_UserReduceResult)) return false; IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwUserID); if (pIServerUserItem) { auto UserInfo = pIServerUserItem->GetUserInfo(); if (UserInfo) { UserInfo->dwBean = pUserChat->dwCurrBeans; } //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pUserChat->dwCurrBeans; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); } break; } case SUB_CS_S_COLLECT_REQUEST: //用户汇总 { //变量定义 CMD_CS_C_UserEnter UserEnter; ZeroMemory(&UserEnter, sizeof(UserEnter)); //发送用户 WORD wIndex = 0; do { //获取用户 IServerUserItem * pIServerUserItem = m_ServerUserManager.EnumUserItem(wIndex++); if (pIServerUserItem == NULL) break; //设置变量 UserEnter.dwUserID = pIServerUserItem->GetUserID(); UserEnter.dwGameID = pIServerUserItem->GetGameID(); //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName)); //辅助信息 UserEnter.cbGender = pIServerUserItem->GetGender(); UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder(); UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder(); /*DWORD dTableNum = 0;*/ if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIServerUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; /*if (pat != nullptr && !csTemp.IsEmpty()) { dTableNum = _wtol(csTemp); }*/ } //发送数据 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, &UserEnter, sizeof(UserEnter)/*, dTableNum, pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); } while (true); //汇报完成 m_bCollectUser = true; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_FINISH/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); return true; } default: break; } return true; } //管理服务 bool CAttemperEngineSink::OnTCPSocketMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize) { switch (wSubCmdID) { case SUB_CS_S_SYSTEM_MESSAGE: //系统消息 { CTraceService::TraceString(TEXT("系统消息已屏蔽 SUB_CS_S_SYSTEM_MESSAGE"), TraceLevel_Warning); //消息处理 //SendSystemMessage((CMD_GR_SendMessage *)pData, wDataSize); return true; } case SUB_CS_S_PROPERTY_TRUMPET: //喇叭消息 { CString csSend; CString csTest = AfxGetAppName(); csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET); //OutputDebugString(csSend); //Commend::ToShow(this, MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, pData, wDataSize, 0, 0, m_pIGameServiceManager->GetDataString()); CTraceService::TraceString(TEXT("喇叭消息 SUB_CS_S_PROPERTY_TRUMPET"), TraceLevel_Warning); //发送数据 m_pITCPNetworkEngine->SendDataBatch(MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, pData, wDataSize, BG_COMPUTER); return true; } case SUB_CS_S_PLATFORM_PARAMETER: //平台参数 { //清除任务 m_wTaskCount = 0; ZeroMemory(m_TaskParameter, sizeof(m_TaskParameter)); //CTraceService::TraceString(TEXT("平台参数 加载配置已屏蔽 SUB_CS_S_PLATFORM_PARAMETER"), TraceLevel_Warning); //加载配置 m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_PARAMETER, 0L, NULL, 0L); //加载任务 //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_TASK_LOAD_LIST, 0L, NULL, 0L); //会员参数 //CTraceService::TraceString(TEXT("会员参数已屏蔽 DBR_GR_LOAD_MEMBER_PARAMETER"), TraceLevel_Warning); //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_MEMBER_PARAMETER, 0, NULL, 0); return true; } default: break; } return true; } //机器服务 //bool CAttemperEngineSink::OnTCPSocketMainAndroidService(WORD wSubCmdID, VOID * pData, WORD wDataSize) //{ // switch (wSubCmdID) // { // case SUB_CS_S_ADDPARAMETER: //添加参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_S_AddParameter) == wDataSize); // if (sizeof(CMD_CS_S_AddParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_S_AddParameter * pAddParameter = (CMD_CS_S_AddParameter *)pData; // // //添加参数 // //m_AndroidUserManager.AddAndroidParameter(&pAddParameter->AndroidParameter, 1); // // return true; // } // case SUB_CS_S_MODIFYPARAMETER: //修改参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_S_ModifyParameter) == wDataSize); // if (sizeof(CMD_CS_S_ModifyParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_S_ModifyParameter * pModifyParameter = (CMD_CS_S_ModifyParameter *)pData; // // //修改参数 // //m_AndroidUserManager.AddAndroidParameter(&pModifyParameter->AndroidParameter, 1); // // return true; // } // case SUB_CS_S_DELETEPARAMETER: //删除参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_S_DeleteParameter) == wDataSize); // if (sizeof(CMD_CS_S_DeleteParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_S_DeleteParameter * pDeleteParameter = (CMD_CS_S_DeleteParameter *)pData; // // //删除参数 // //m_AndroidUserManager.RemoveAndroidParameter(pDeleteParameter->dwBatchID); // // return true; // } // default: break; // } // // return true; //} //登录处理 bool CAttemperEngineSink::OnTCPNetworkMainLogon(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { //case SUB_GR_LOGON_USERID: //I D 登录 //{ // return OnTCPNetworkSubLogonUserID(pData, wDataSize, dwSocketID); //} case SUB_GR_LOGON_MOBILE: //手机登录 { m_Data.dLoginQ++; return OnTCPNetworkSubLogonMobile(pData, wDataSize, dwSocketID); } default: break; //case SUB_GR_LOGON_ACCOUNTS: //帐号登录 //{ // return OnTCPNetworkSubLogonAccounts(pData, wDataSize, dwSocketID); //} } return false; } //用户处理 bool CAttemperEngineSink::OnTCPNetworkMainUser(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { ///for test //if (SUB_GR_USER_CREATE == wSubCmdID) //{ // OnTCPNetworkShareInfo(pData, wDataSize, dwSocketID); // OnTCPNetworkShareAwardBean(pData, wDataSize, dwSocketID); //} switch (wSubCmdID) { case SUB_GP_WELFARE_INFO: ///===福利领取信息 { return OnTCPNetworkWelfareInfo(pData, wDataSize, dwSocketID); } case SUB_GP_CHECKIN_REWARD2: //签到奖品 { return OnTCPNetworkCheckinReward(pData, wDataSize, dwSocketID); } case SUB_GP_CHECKIN_INFO2: //查询签到 { return OnTCPNetworkCheckinQuery(pData, wDataSize, dwSocketID); } case SUB_GP_CHECKIN_DONE2: //执行签到 { return OnTCPNetworkCheckinDone(pData, wDataSize, dwSocketID); } //case SUB_GR_USER_PRIVATE_GAME_SVR: ///+++拉取好友房服务器 //{ // return OnTCPNetworkPrivateGameSvr(pData, wDataSize, dwSocketID); //} //case SUB_GR_USER_GET_RELIEF: //领取破产补助 //{ // return OnTCPNetworkGetRelief(pData, wDataSize, dwSocketID); //} //case SUB_GR_USER_TOP_WIN_LIST: //胜局榜(战神列表) //{ // return OnTCPNetworkTopWinList(pData, wDataSize, dwSocketID); //} case SUB_GR_USER_SHRAE_INFO: //分享奖励钻石 { return OnTCPNetworkShareInfo(pData, wDataSize, dwSocketID); } case SUB_GR_USER_SHRAE_AWARD_BEAN: //分享奖励钻石 { return OnTCPNetworkShareAwardBean(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_BEAN: //请求元宝 { return OnTCPNetworkGetBearn(pData, wDataSize, dwSocketID); } case SUB_GR_USER_QINGQIUJIESAN: //房主请求解散 { return OnTCPNetworkFangZhuJieSan(pData, wDataSize, dwSocketID); } case SUB_GR_DELETE_PRIVATE_TABLE_REQ: //申请解散 { return OnTCPNetworkSubDeletePrivateTableReq(pData, wDataSize, dwSocketID); } case SUB_GR_DELETE_PRIVATE_TABLE_RESP: //个人投票表决 { return OnTCPNetworkSubDeletePrivateTableResp(pData, wDataSize, dwSocketID); } case SUB_GR_USER_RULE: //用户规则 { return OnTCPNetworkSubUserRule(pData, wDataSize, dwSocketID); } case SUB_GR_USER_LOOKON: //用户旁观 { return OnTCPNetworkSubUserLookon(pData, wDataSize, dwSocketID); } case SUB_GR_USER_STANDUP: //用户起立 { return OnTCPNetworkSubUserStandUp(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHAT: //用户聊天 { return OnTCPNetworkSubUserChat(pData, wDataSize, dwSocketID); } case SUB_GR_USER_EXPRESSION: //用户表情 { return OnTCPNetworkSubUserExpression(pData, wDataSize, dwSocketID); } case SUB_GR_WISPER_CHAT: //用户私聊 { return OnTCPNetworkSubWisperChat(pData, wDataSize, dwSocketID); } case SUB_GR_WISPER_EXPRESSION: //私聊表情 { return OnTCPNetworkSubWisperExpression(pData, wDataSize, dwSocketID); } //case SUB_GR_PROPERTY_BUY: //购买道具 //{ // return OnTCPNetworkSubPropertyBuy(pData, wDataSize, dwSocketID); //} //case SUB_GR_PROPERTY_TRUMPET: //喇叭道具 //{ // return OnTCPNetwordSubSendTrumpet(pData, wDataSize, dwSocketID); //} //case SUB_GR_USER_INVITE_REQ: //邀请用户 //{ // return OnTCPNetworkSubUserInviteReq(pData, wDataSize, dwSocketID); //} //case SUB_GR_USER_REPULSE_SIT: //拒绝厌友 //{ // return OnTCPNetworkSubUserRepulseSit(pData, wDataSize, dwSocketID); //} //case SUB_GR_USER_KICK_USER: //踢出用户 //{ // return OnTCPNetworkSubMemberKickUser(pData, wDataSize, dwSocketID); //} case SUB_GR_USER_INFO_REQ: //请求用户信息 { return OnTCPNetworkSubUserInfoReq(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHAIR_REQ: //请求更换位置 { return OnTCPNetworkSubUserChairReq(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHAIR_INFO_REQ: //请求椅子用户信息 { return OnTCPNetworkSubChairUserInfoReq(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_GAME_SCORE_RECORD_LIST://获取牌桌游戏数据简要列表 { return OnTCPSocketGetUserGameScoreRecordList(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_GAME_SCORE_RECORD_DETAIL_INFO: { return OnTCPSocketGetUserGameScoreRecordDetail(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY: //获取回放记录 { return OnTCPSocketGetUserGameReplayRecord(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST: //获取临时积分排行榜 { return OnTCPSocketGetUserGameTempScoreRankList(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CREATE://创建房间 { return OnTCPNetworkSubUserCreateRoom(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GETADD_INFO://获取加入房间的信息 { return OnTCPNetworkSubUserJoinRoomInfo(pData, wDataSize, dwSocketID); } case SUB_GR_USER_ADD: //加入房间 { return OnTCPNetworkSubUserJoinRoom(pData, wDataSize, dwSocketID); } case SUB_GR_USER_SEAT: //玩家坐下请求 { return OnTCPNetworkSubUserDown(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_DINGDAN: //请求订单 { return OnTCPNetworkSubUserGetDingdan(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_DINGDAN_NEW: //请求订单 { return OnTCPNetworkSubUserGetDingdanNew(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_VERIF_CODE: //获取手机验证码 { return OnTCPNetworkSubUserCheckVerifCode(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHECK_IPHONE: //绑定手机 { return OnTCPNetworkSubUserCheckIphone(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHECK_IPHONE_QUERY: //绑定手机查询 { return OnTCPNetworkSubUserCheckIphoneQuery(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHECK_XIANLIAO: //绑定闲聊 { return OnTCPNetworkSubUserXianLiao(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHECK_NAME: //实名认证 { return OnTCPNetworkSubUserCheckName(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CHECK_NAME_QUERY: { return OnTCPNetworkSubUserCheckNameQuery(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_DINGDANLIST: //获取购买记录 { return OnTCPNetworkSubUserGetDingdanList(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_BANGDING: //绑定代理 { return OnTCPNetworkSubUseBangDing(pData, wDataSize, dwSocketID); } case SUB_GR_USER_DAILI_INFO: //获取绑定代理信息 { return OnTCPNetworkSubUseGetDaiLiInfo(pData, wDataSize, dwSocketID); } case SUB_GR_USER_APPLY_UNTIE_AGENT: //玩家自主申请解绑 { return OnTCPNetworkSubUserUntieAgent(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_UNTIE_AGENT_INFO: //用户获得代理解绑相关信息 { return OnTCPNetworkSubUserAgentInfo(pData, wDataSize, dwSocketID); } case SUB_GP_WENLIN_SHUFFLE: //温岭洗牌动画 { return OnWlShuffleGameHandle(pData, wDataSize, dwSocketID); } default: break; } return false; } //银行处理 //bool CAttemperEngineSink::OnTCPNetworkMainInsure(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // switch (wSubCmdID) // { // case SUB_GR_ENABLE_INSURE_REQUEST: //开通银行 // { // return OnTCPNetworkSubEnableInsureRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_QUERY_INSURE_INFO: //银行查询 // { // return OnTCPNetworkSubQueryInsureInfo(pData, wDataSize, dwSocketID); // } // case SUB_GR_SAVE_SCORE_REQUEST: //存款请求 // { // return OnTCPNetworkSubSaveScoreRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_TAKE_SCORE_REQUEST: //取款请求 // { // return OnTCPNetworkSubTakeScoreRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_TRANSFER_SCORE_REQUEST: //转帐请求 // { // return OnTCPNetworkSubTransferScoreRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_QUERY_USER_INFO_REQUEST://查询用户 // { // return OnTCPNetworkSubQueryUserInfoRequest(pData, wDataSize, dwSocketID); // } // default: break; // } // // return false; //} //任务处理 //bool CAttemperEngineSink::OnTCPNetworkMainTask(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // switch (wSubCmdID) // { // case SUB_GR_TASK_TAKE: //领取任务 // { // return OnTCPNetworkSubTakeTaskRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_TASK_REWARD: //领取奖励 // { // return OnTCPNetworkSubTaskRewardRequest(pData, wDataSize, dwSocketID); // } // case SUB_GR_TASK_LOAD_INFO: //加载任务 // { // return OnTCPNetworkSubLoadTaskInfoRequest(pData, wDataSize, dwSocketID); // } // default: break; // } // // return false; //} //兑换处理 //bool CAttemperEngineSink::OnTCPNetworkMainExchange(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // switch (wSubCmdID) // { // case SUB_GR_EXCHANGE_LOAD_INFO: //查询信息 // { // return OnTCPNetworkSubQueryExchangeInfo(pData, wDataSize, dwSocketID); // } // /*case SUB_GR_PURCHASE_MEMBER: //购买会员 // { // return OnTCPNetworkSubPurchaseMember(pData, wDataSize, dwSocketID); // }*/ // case SUB_GR_EXCHANGE_SCORE: //兑换游戏币 // { // return OnTCPNetworkSubExchangeScore(pData, wDataSize, dwSocketID); // } // default: break; // } // // return false; //} //俱乐部处理 bool CAttemperEngineSink::OnTCPNetworkMainClub(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_GR_USER_GET_CLUBLIST: //获取俱乐部列表 { return OnTCPNetworkSubGetClubList(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBUSER: //获取俱乐部会员 { return OnTCPNetworkSubGetClubUser(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBUSE_EX: { return OnTCPNetworkSubGetClubUserEx(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBMESSAGE://获取俱乐部消息 { return OnTCPNetworkSubGetClubMessage(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBRECORD://获取俱乐部记录 { return OnTCPNetworkSubGetClubRecord(pData, wDataSize, dwSocketID); } case SUB_GR_USER_CREATE_CLUB://创建俱乐部 { return OnTCPNetworkSubCreateClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_UPDATE_CLUB://修改俱乐部 { return OnTCPNetworkSubUpdateClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_DELETE_CLUB://删除俱乐部 { return OnTCPNetworkSubDeleteClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUB://查看俱乐部 { return OnTCPNetworkSubGetClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_JOIN_CLUB://加入俱乐部 { return OnTCPNetworkSubJoinClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_QUIT_CLUB://退出俱乐部 { return OnTCPNetworkSubQuitClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_ISAGREE_CLUB: //同意加入俱乐部 { return OnTCPNetworkSubAgreeClub(pData, wDataSize, dwSocketID); } //case SUB_GR_USER_GET_CLUBONLINE://获取俱乐部在线信息 //{ // return OnTCPNetworkSubGetClubOnLine(pData, wDataSize, dwSocketID); //} case SUB_GR_USER_GET_CLUBONLINE_EX://获取在线信息 { return OnTCPNetworkSubGetClubOnLineEx(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBBLACKUSER://获取黑名单和管理员名单 { return OnTCPNetworkSubGetClubBlackUser(pData,wDataSize,dwSocketID); } case SUB_GR_USER_GET_PROTOLCOL://获取协议 { return OnTCPNetworkSubGetClubProtocol(pData,wDataSize,dwSocketID); } case SUB_GR_USER_GET_PROTOLCOLAGREE://同意协议 { return OnTCPNetworkSubAgreeClubProtocol(pData,wDataSize,dwSocketID); } case SUB_GR_USER_GET_NOTICE://获取公告 { return OnTCPNetworkSubGetClubNotice(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_CLUBONLINE_TABLE://获取在线桌子 { return OnTCPNetworkSubGetClubTable(pData, wDataSize, dwSocketID); } case SUB_GR_USER_DISSOLVE_ROOM://群主解散俱乐部房间 { return OnTCPNetworkSubDissolveRoom(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_SAVE_MORE_WANFA:// 额外玩法修改请求 { return OnTCPNetworkSubUpdateAddClub(pData, wDataSize, dwSocketID); } case SUB_GR_USER_GET_MORE_WANFA://获取额外玩法 { return OnTCPNetworkSubUpdateAddClub(pData, wDataSize, dwSocketID); } case SUB_GR_CLUB_GET_COUNT_EXPLOITS: //俱乐部统计该俱乐部战绩 { return OnTCPNetworkSubGetClubCountExploits(pData, wDataSize, dwSocketID); } case SUB_GR_CLUB_GET_COUNT_PLAYGAEMS: //俱乐部统计对局数 { return OnTCPNetworkSubGetClubCountPlaygames(pData, wDataSize, dwSocketID); } case SUB_GR_CLUB_GET_COUNT_INTEGRAL: //俱乐部统计积分数 { return OnTCPNetworkSubGetClubCountIntegral(pData, wDataSize, dwSocketID); } case SUB_GR_CLUB_GET_MAKEA_SAMPLE: //俱乐部打样 { return OnTCPNetworkSubGetClubSample(pData, wDataSize, dwSocketID); } default: break; } return false; } //管理处理 bool CAttemperEngineSink::OnTCPNetworkMainManage(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { //switch (wSubCmdID) //{ //case SUB_GR_QUERY_OPTION: //查询设置 //{ // return OnTCPNetworkSubQueryOption(pData, wDataSize, dwSocketID); //} //case SUB_GR_OPTION_SERVER: //房间设置 //{ // return OnTCPNetworkSubOptionServer(pData, wDataSize, dwSocketID); //} //case SUB_GR_KILL_USER: //踢出用户 //{ // return OnTCPNetworkSubManagerKickUser(pData, wDataSize, dwSocketID); //} //case SUB_GR_LIMIT_USER_CHAT: //限制聊天 //{ // return true;//OnTCPNetworkSubLimitUserChat(pData, wDataSize, dwSocketID); //} //case SUB_GR_KICK_ALL_USER: //踢出用户 //{ // return OnTCPNetworkSubKickAllUser(pData, wDataSize, dwSocketID); //} //case SUB_GR_SEND_MESSAGE: //发布消息 //{ // return false;//OnTCPNetworkSubSendMessage(pData, wDataSize, dwSocketID); //} //case SUB_GR_DISMISSGAME: //管理员强制解散游戏 //{ // return OnTCPNetworkSubDismissGame(pData, wDataSize, dwSocketID); //} //case SUB_GR_SEND_WARNING: //警告用户 //{ // return OnTCPNetworkSubWarningUser(pData, wDataSize, dwSocketID); //} //} return false; } //比赛命令 //bool CAttemperEngineSink::OnTCPNetworkMainMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //获取信息 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //效验接口 // ASSERT(m_pIMatchServiceManager != NULL); // if (m_pIMatchServiceManager == NULL) return false; // // //消息处理 // return m_pIMatchServiceManager->OnEventSocketMatch(wSubCmdID, pData, wDataSize, pIServerUserItem, dwSocketID); //} //游戏处理 bool CAttemperEngineSink::OnTCPNetworkMainGame(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取信息 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //处理过虑 WORD wTableID = pIServerUserItem->GetTableID(); WORD wChairID = pIServerUserItem->GetChairID(); if ((wTableID == INVALID_TABLE) || (wChairID == INVALID_CHAIR)) return true; //消息处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; return pTableFrame->OnEventSocketGame(wSubCmdID, pData, wDataSize, pIServerUserItem); } //框架处理 bool CAttemperEngineSink::OnTCPNetworkMainFrame(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取信息 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //处理过虑 WORD wTableID = pIServerUserItem->GetTableID(); //WORD wChairID = pIServerUserItem->GetChairID(); if ((wTableID == INVALID_TABLE)) return true; //消息处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; return pTableFrame->OnEventSocketFrame(wSubCmdID, pData, wDataSize, pIServerUserItem); } //手机登录 bool CAttemperEngineSink::OnTCPNetworkSubLogonMobile(VOID * pData, WORD wDataSize, DWORD dwSocketID) { TurntableLogon::PB_CS_C_LogonMobile pLogonMobile; pLogonMobile.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_LogonMobile LogonMobile; ZeroMemory(&LogonMobile, sizeof(LogonMobile)); LogonMobile.wGameID = pLogonMobile.wgameid(); LogonMobile.dwProcessVersion = pLogonMobile.dwprocessversion(); LogonMobile.cbDeviceType = pLogonMobile.cbdevicetype(); LogonMobile.wPageTableCount = pLogonMobile.wgameid(); LogonMobile.dwUserID = pLogonMobile.dwuserid(); CString szpassword = (CA2CTEX<2048>(pLogonMobile.szpassword().c_str(), CP_UTF8)).m_szBuffer; CString szmachineid = (CA2CTEX<2048>(pLogonMobile.szmachineid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(LogonMobile.szPassword, CountArray(LogonMobile.szPassword), TEXT("%s"), szpassword); _sntprintf(LogonMobile.szMachineID, CountArray(LogonMobile.szMachineID), TEXT("%s"), szmachineid); LogonMobile.dX = pLogonMobile.dx(); LogonMobile.dY = pLogonMobile.dy(); CString szchengshi = (CA2CTEX<2048>(pLogonMobile.szchengshi().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(LogonMobile.szChengShi, CountArray(LogonMobile.szChengShi), TEXT("%s"), szchengshi); LogonMobile.szPassword[CountArray(LogonMobile.szPassword) - 1] = 0; LogonMobile.szMachineID[CountArray(LogonMobile.szMachineID) - 1] = 0; //绑定信息 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); ///---用户信息置空 yd 2017-11-15 /*if (pIBindUserItem != NULL) { pIBindUserItem = NULL; }*/ //重复判断 判断分配的tagBindParameter 是否是没有人用过的 if ((pBindParameter == NULL) || (pIBindUserItem != NULL)) { if (pIBindUserItem != NULL) { CString strErr; strErr.Format(_T("绑定用户失败 wBindIndex=%d,pBindParameter->pIServerUserItem != NULL"), wBindIndex); CTraceService::TraceString(strErr, TraceLevel_Normal); } else { CString strErr; strErr.Format(_T("重复判断,登录失败 wBindIndex=%d,pBindParameter=NULL"), wBindIndex); CTraceService::TraceString(strErr, TraceLevel_Normal); ASSERT(FALSE); } ///---add by yd //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); return false; } //机器人和真人不许互踢 IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(LogonMobile.dwUserID); //密码判断 CString strPassword = LogonMobile.szPassword; strPassword.Trim(); if (pBindParameter->dwClientAddr != 0L && strPassword.GetLength() == 0) { //发送失败 CString csTest; csTest.Format(_T("客户端登录失败。原因:很抱歉,您的登录密码为0,不允许继续进入!")); CTraceService::TraceString(csTest, TraceLevel_Normal); return true; } //版本信息 pBindParameter->cbClientKind = CLIENT_KIND_MOBILE; pBindParameter->dwProcessVersion = LogonMobile.dwProcessVersion; //大厅版本 //DWORD dwClientVersion = pLogonMobile->dwProcessVersion; //if (PerformCheckVersion(0L, 0L, dwClientVersion, dwSocketID) == false) //{ // CString csTest; // csTest.Format(_T("客户端[%d]登录失败。原因:大厅版本校验失败!"), pIServerUserItem->GetUserID()); // CTraceService::TraceString(csTest, TraceLevel_Normal); //发送失败 // SendRequestFailure(pIServerUserItem, TEXT("客户端[%d]登录失败。原因:大厅版本校验失败!"), 0); // return true; //} //切换判断 if ((pIServerUserItem != NULL) && (pIServerUserItem->ContrastLogonPass(LogonMobile.szPassword) == true)) { auto _iter = Socket_2_UserID.find(dwSocketID); if (_iter != Socket_2_UserID.end() && LogonMobile.dwUserID != _iter->second) { CString csTest1; csTest1.Format(_T("断线重连,dwSocketID变化了,userid和dwSocketID绑定和之前不一样了!")); CTraceService::TraceString(csTest1, TraceLevel_Warning); ASSERT(FALSE); } SwitchUserItemConnect(pIServerUserItem, LogonMobile.szMachineID, wBindIndex, LogonMobile.cbDeviceType, LogonMobile.wBehaviorFlags, LogonMobile.wPageTableCount); return true; } //比赛效验 //if (m_pIMatchServiceManager != NULL&&m_pIMatchServiceManager->OnEventEnterMatch(dwSocketID, pData, pBindParameter->dwClientAddr, true)) //{ // return true; //} if (IsJC(7777)) { TCHAR szString[512] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("用户 (%d) 数据库登录"), LogonMobile.dwUserID); CTraceService::TraceString(szString, TraceLevel_Normal); } //变量定义 DBR_GR_LogonMobile LogonMobiles; ZeroMemory(&LogonMobiles, sizeof(LogonMobiles)); //构造数据 LogonMobiles.dwUserID = LogonMobile.dwUserID; LogonMobiles.dwClientAddr = pBindParameter->dwClientAddr; lstrcpyn(LogonMobiles.szPassword, LogonMobile.szPassword, CountArray(LogonMobiles.szPassword)); lstrcpyn(LogonMobiles.szMachineID, LogonMobile.szMachineID, CountArray(LogonMobiles.szMachineID)); LogonMobiles.cbDeviceType = LogonMobile.cbDeviceType; LogonMobiles.wBehaviorFlags = LogonMobile.wBehaviorFlags; LogonMobiles.wPageTableCount = LogonMobile.wPageTableCount; LogonMobiles.dX = LogonMobile.dX; LogonMobiles.dY = LogonMobile.dY; lstrcpyn(LogonMobiles.szChengShi, LogonMobile.szChengShi, CountArray(LogonMobiles.szChengShi)); //投递请求 m_pIDBCorrespondManager->PostDataBaseRequest(LogonMobiles.dwUserID, DBR_GR_LOGON_MOBILE, dwSocketID, &LogonMobiles, sizeof(LogonMobiles)); return true; } //帐号登录 bool CAttemperEngineSink::OnTCPNetworkSubLogonAccounts(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("帐号登录 OnTCPNetworkSubLogonAccounts"), TraceLevel_Debug); //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_LogonAccounts)); if (wDataSize <= sizeof(CMD_GR_LogonAccounts)) return false; //处理消息 CMD_GR_LogonAccounts * pLogonAccounts = (CMD_GR_LogonAccounts *)pData; pLogonAccounts->szPassword[CountArray(pLogonAccounts->szPassword) - 1] = 0; pLogonAccounts->szAccounts[CountArray(pLogonAccounts->szAccounts) - 1] = 0; pLogonAccounts->szMachineID[CountArray(pLogonAccounts->szMachineID) - 1] = 0; //绑定信息 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); //重复判断 if (pIBindUserItem != NULL) { ASSERT(FALSE); return false; } //机器人和真人不许互踢 IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pLogonAccounts->szAccounts); if (pIServerUserItem != NULL) { if ((pIServerUserItem->IsAndroidUser() && (pBindParameter->dwClientAddr != 0L)) || (!pIServerUserItem->IsAndroidUser() && (pBindParameter->dwClientAddr == 0L))) { SendRequestFailure(pIServerUserItem, TEXT("该帐号已在此房间游戏,且不允许踢出,请咨询管理员!"), 0); //SendRoomMessage(dwSocketID, TEXT("该帐号已在此房间游戏,且不允许踢出,请咨询管理员!"), SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_ROOM, (pBindParameter->dwClientAddr == 0L)); return false; } } //密码判断 CString strPassword = pLogonAccounts->szPassword; strPassword.Trim(); if (pBindParameter->dwClientAddr != 0L && strPassword.GetLength() == 0) { //发送失败 SendLogonFailure(TEXT("很抱歉,您的登录密码错误,不允许继续进入!"), LOGON_FAIL_SERVER_INVALIDATION, dwSocketID); return true; } //版本信息 pBindParameter->cbClientKind = CLIENT_KIND_COMPUTER; pBindParameter->dwPlazaVersion = pLogonAccounts->dwPlazaVersion; pBindParameter->dwFrameVersion = pLogonAccounts->dwFrameVersion; pBindParameter->dwProcessVersion = pLogonAccounts->dwProcessVersion; //大厅版本 DWORD dwPlazaVersion = pLogonAccounts->dwPlazaVersion; DWORD dwFrameVersion = pLogonAccounts->dwFrameVersion; DWORD dwClientVersion = pLogonAccounts->dwProcessVersion; if (PerformCheckVersion(dwPlazaVersion, dwFrameVersion, dwClientVersion, dwSocketID) == false) return true; //切换判断 if ((pIServerUserItem != NULL) && (pIServerUserItem->ContrastLogonPass(pLogonAccounts->szPassword) == true)) { SwitchUserItemConnect(pIServerUserItem, pLogonAccounts->szMachineID, wBindIndex); return true; } //变量定义 DBR_GR_LogonAccounts LogonAccounts; ZeroMemory(&LogonAccounts, sizeof(LogonAccounts)); //构造数据 LogonAccounts.dwClientAddr = pBindParameter->dwClientAddr; lstrcpyn(LogonAccounts.szAccounts, pLogonAccounts->szAccounts, CountArray(LogonAccounts.szAccounts)); lstrcpyn(LogonAccounts.szPassword, pLogonAccounts->szPassword, CountArray(LogonAccounts.szPassword)); lstrcpyn(LogonAccounts.szMachineID, pLogonAccounts->szMachineID, CountArray(LogonAccounts.szMachineID)); //投递请求 m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOGON_ACCOUNTS, dwSocketID, &LogonAccounts, sizeof(LogonAccounts)); return true; } //用户规则 bool CAttemperEngineSink::OnTCPNetworkSubUserRule(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_UserRule)); if (wDataSize < sizeof(CMD_GR_UserRule)) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //规则判断 //ASSERT(CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule)==false); if (CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule) == true || m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) return true; //消息处理 tagUserRule * pUserRule = pIServerUserItem->GetUserRule(); CMD_GR_UserRule * pCMDUserRule = (CMD_GR_UserRule *)pData; //规则标志 pUserRule->bLimitSameIP = ((pCMDUserRule->cbRuleMask&UR_LIMIT_SAME_IP) > 0); pUserRule->bLimitWinRate = ((pCMDUserRule->cbRuleMask&UR_LIMIT_WIN_RATE) > 0); pUserRule->bLimitFleeRate = ((pCMDUserRule->cbRuleMask&UR_LIMIT_FLEE_RATE) > 0); pUserRule->bLimitGameScore = ((pCMDUserRule->cbRuleMask&UR_LIMIT_GAME_SCORE) > 0); //规则属性 pUserRule->szPassword[0] = 0; pUserRule->wMinWinRate = pCMDUserRule->wMinWinRate; pUserRule->wMaxFleeRate = pCMDUserRule->wMaxFleeRate; pUserRule->lMaxGameScore = pCMDUserRule->lMaxGameScore; pUserRule->lMinGameScore = pCMDUserRule->lMinGameScore; //桌子密码 if (wDataSize > sizeof(CMD_GR_UserRule)) { tagDataDescribe DataDescribe; CRecvPacketHelper RecvPacket(pCMDUserRule + 1, wDataSize - sizeof(CMD_GR_UserRule)); //提取处理 while (true) { //提取数据 auto pDataBuffer = RecvPacket.GetData(DataDescribe); if (DataDescribe.wDataDescribe == DTP_NULL) break; //数据分析 switch (DataDescribe.wDataDescribe) { case DTP_GR_TABLE_PASSWORD: //桌子密码 { //效验数据 ASSERT(pDataBuffer != NULL); ASSERT(DataDescribe.wDataSize <= sizeof(pUserRule->szPassword)); //规则判断 ASSERT(CServerRule::IsForfendLockTable(m_pGameServiceOption->dwServerRule) == false); if (CServerRule::IsForfendLockTable(m_pGameServiceOption->dwServerRule) == true) break; //设置数据 if (DataDescribe.wDataSize <= sizeof(pUserRule->szPassword)) { CopyMemory(&pUserRule->szPassword, pDataBuffer, DataDescribe.wDataSize); pUserRule->szPassword[CountArray(pUserRule->szPassword) - 1] = 0; } break; } default: break; } } } return true; } //用户旁观 bool CAttemperEngineSink::OnTCPNetworkSubUserLookon(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_UserLookon Lookon; Lookon.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserLookon pUserLookon; ZeroMemory(&pUserLookon, sizeof(pUserLookon)); pUserLookon.wTableID = Lookon.wtableid(); CString szprivtetableid = (CA2CTEX<2048>(Lookon.szprivtetableid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUserLookon.szPrivteTableID, CountArray(pUserLookon.szPrivteTableID), TEXT("%s"), szprivtetableid); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //消息处理 WORD wTableID = pIServerUserItem->GetTableID(); //WORD wChairID = pIServerUserItem->GetChairID(); BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if ((wTableID == pUserLookon.wTableID) && (cbUserStatus == US_LOOKON)) return true; //用户判断 if (cbUserStatus == US_PLAYING) { SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserLookon", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->szPrivateTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Normal); } return true; } //离开处理 if (wTableID != INVALID_TABLE) { std::shared_ptr pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } if (pUserLookon.wTableID != 0 && pUserLookon.wTableID != INVALID_TABLE) { //坐下处理 std::shared_ptr pTableFrame = GetTableFrame(pUserLookon.wTableID); if (!pTableFrame) { return false; //SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0); } pTableFrame->PerformLookonAction(pIServerUserItem); } else { std::shared_ptr pTableFrame = GetPriTableFrame(pUserLookon.szPrivteTableID); if (!pTableFrame) { SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0); return true; } pTableFrame->PerformLookonAction(pIServerUserItem); } return true; } //字牌检测 bool CAttemperEngineSink::CheckConfigZiPai(tagGameConfig UserSitDown) { CString juShuCfg; CString gameTypeCfg; CString diJinCfg; CString payTypeCfg; juShuCfg = m_pGameParameter->msParameter[3].juShuCfg; gameTypeCfg = m_pGameParameter->msParameter[3].szgameTypeCfg; diJinCfg = m_pGameParameter->msParameter[3].diJinCfg; payTypeCfg = m_pGameParameter->msParameter[3].payTypeCfg; CList list1; CList list2; CList list3; CList list4; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = gameTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = gameTypeCfg.Left(pos); int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); i++; gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1); pos = gameTypeCfg.Find(_T('#')); } if (gameTypeCfg.GetLength() > 0) { int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); } pos = diJinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = diJinCfg.Left(pos); int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); i++; diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1); pos = diJinCfg.Find(_T('#')); } if (diJinCfg.GetLength() > 0) { int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); } pos = payTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payTypeCfg.Left(pos); int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); i++; payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1); pos = payTypeCfg.Find(_T('#')); } if (payTypeCfg.GetLength() > 0) { int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); } bool bFind = false; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == UserSitDown.wPlayCountRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list2.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list2.GetAt(list2.FindIndex(var)); if (iRet == UserSitDown.wSubGameID) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list3.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list3.GetAt(list3.FindIndex(var)); if (iRet == UserSitDown.wPlayRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list4.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list4.GetAt(list4.FindIndex(var)); if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule) { bFind = true; break; } } if (!bFind) { return false; } return true; } //戳瞎子检测 bool CAttemperEngineSink::CheckConfigXiaZi(tagGameConfig UserSitDown) { CString juShuCfg; CString gameTypeCfg; CString diJinCfg; CString payTypeCfg; juShuCfg = m_pGameParameter->msParameter[2].juShuCfg; gameTypeCfg = m_pGameParameter->msParameter[2].szgameTypeCfg; diJinCfg = m_pGameParameter->msParameter[2].diJinCfg; payTypeCfg = m_pGameParameter->msParameter[2].payTypeCfg; CList list1; CList list2; CList list3; CList list4; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = gameTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = gameTypeCfg.Left(pos); int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); i++; gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1); pos = gameTypeCfg.Find(_T('#')); } if (gameTypeCfg.GetLength() > 0) { int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); } pos = diJinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = diJinCfg.Left(pos); int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); i++; diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1); pos = diJinCfg.Find(_T('#')); } if (diJinCfg.GetLength() > 0) { int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); } pos = payTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payTypeCfg.Left(pos); int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); i++; payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1); pos = payTypeCfg.Find(_T('#')); } if (payTypeCfg.GetLength() > 0) { int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); } bool bFind = false; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == UserSitDown.wPlayCountRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list2.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list2.GetAt(list2.FindIndex(var)); if (iRet == UserSitDown.wSubGameID) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list3.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list3.GetAt(list3.FindIndex(var)); if (iRet == UserSitDown.wPlayRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list4.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list4.GetAt(list4.FindIndex(var)); if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule) { bFind = true; break; } } if (!bFind) { return false; } return true; } bool CAttemperEngineSink::CheckConfig(tagGameConfig UserSitDown) { CString juShuCfg; CString gameTypeCfg; CString diJinCfg; CString payTypeCfg; juShuCfg = m_pGameParameter->msParameter[0].juShuCfg; gameTypeCfg = m_pGameParameter->msParameter[0].szgameTypeCfg; diJinCfg = m_pGameParameter->msParameter[0].diJinCfg; payTypeCfg = m_pGameParameter->msParameter[0].payTypeCfg; CList list1; CList list2; CList list3; CList list4; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = gameTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = gameTypeCfg.Left(pos); int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); i++; gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1); pos = gameTypeCfg.Find(_T('#')); } if (gameTypeCfg.GetLength() > 0) { int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); } pos = diJinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = diJinCfg.Left(pos); int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); i++; diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1); pos = diJinCfg.Find(_T('#')); } if (diJinCfg.GetLength() > 0) { int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); } pos = payTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payTypeCfg.Left(pos); int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); i++; payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1); pos = payTypeCfg.Find(_T('#')); } if (payTypeCfg.GetLength() > 0) { int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); } bool bFind = false; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == UserSitDown.wPlayCountRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list2.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list2.GetAt(list2.FindIndex(var)); if (iRet == UserSitDown.wSubGameID) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list3.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list3.GetAt(list3.FindIndex(var)); if (iRet == UserSitDown.wPlayRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list4.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list4.GetAt(list4.FindIndex(var)); if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule) { bFind = true; break; } } if (!bFind) { return false; } return true; } bool CAttemperEngineSink::CheckConfigXueLiu(tagGameConfig UserSitDown) { CString juShuCfg; CString gameTypeCfg; CString diJinCfg; CString payTypeCfg; juShuCfg = m_pGameParameter->msParameter[1].juShuCfg; gameTypeCfg = m_pGameParameter->msParameter[1].szgameTypeCfg; diJinCfg = m_pGameParameter->msParameter[1].diJinCfg; payTypeCfg = m_pGameParameter->msParameter[1].payTypeCfg; CList list1; CList list2; CList list3; CList list4; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = gameTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = gameTypeCfg.Left(pos); int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); i++; gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1); pos = gameTypeCfg.Find(_T('#')); } if (gameTypeCfg.GetLength() > 0) { int iRet = _wtoi(gameTypeCfg.GetBuffer(0)); list2.AddTail(iRet); gameTypeCfg.ReleaseBuffer(); } pos = diJinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = diJinCfg.Left(pos); int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); i++; diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1); pos = diJinCfg.Find(_T('#')); } if (diJinCfg.GetLength() > 0) { int iRet = _wtoi(diJinCfg.GetBuffer(0)); list3.AddTail(iRet); diJinCfg.ReleaseBuffer(); } pos = payTypeCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payTypeCfg.Left(pos); int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); i++; payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1); pos = payTypeCfg.Find(_T('#')); } if (payTypeCfg.GetLength() > 0) { int iRet = _wtoi(payTypeCfg.GetBuffer(0)); list4.AddTail(iRet); payTypeCfg.ReleaseBuffer(); } bool bFind = false; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == UserSitDown.wPlayCountRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list2.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list2.GetAt(list2.FindIndex(var)); if (iRet == UserSitDown.wSubGameID) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list3.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list3.GetAt(list3.FindIndex(var)); if (iRet == UserSitDown.wPlayRule) { bFind = true; break; } } if (!bFind) { return false; } bFind = false; iCount = list4.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list4.GetAt(list4.FindIndex(var)); if (iRet == UserSitDown.wMaxFanRule || iRet+10 == UserSitDown.wMaxFanRule) { bFind = true; break; } } if (!bFind) { return false; } return true; } //用户创建私有房间第二步 bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoomEx(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx)); if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false; //效验数据 CMD_GR_UserSitDownEx * pUserSitDown = (CMD_GR_UserSitDownEx *)pData; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 //ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (1 != pUserSitDown->data.cbCreateTable) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断 { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d"), L"OnTCPNetworkSubUserCreateRoomEx", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Normal); } //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0); return true; } if (cbUserStatus == US_SIT || US_READY == cbUserStatus || US_LOOKON == cbUserStatus)//用户判断 { //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,不允许创建!"), 0); CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,不允许创建!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } WORD wTableID = pIServerUserItem->GetTableID(); if (wTableID != INVALID_TABLE) { //如果还在哪桌打麻将呢,则先离开处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->data.TableConfig; if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID < 3) { //检验房间参数 if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID >= 20) { //检验房间参数 /*if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { CMD_GR_UserSitDownAck req; req.cbRet = 1; req.szText; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); return true; }*/ } JN_GR_RoomListGroup sPrivateTableID; ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup)); std::shared_ptr pTableFrame; std::wstring str; //查看自己创建的房间 auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID()); if (iter != m_UserID_2_PriTableIDGROUP.end()) { sPrivateTableID = iter->second; if (sPrivateTableID.Num > 29) { //SendRequestFailure(pIServerUserItem, TEXT("创建房间数超限,请先解散当前房间!"), 0); CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前状态不允许创建!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else { std::pair temp(pIServerUserItem->GetUserID(), sPrivateTableID); m_UserID_2_PriTableIDGROUP.insert(temp); } //添加房间信息 tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown->data.TableConfig; UINT wReduceBeans = 0; UINT wBean = 0; if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 wBean = GetNeedPayEx(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 wBean = GetNeedPayZhiP(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 wBean = GetNeedPayCxz(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID < 3) { //检验房间参数 wBean = GetNeedPay(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 20) { wBean = GetNeedPay(pConfig->wPlayCountRule); } if (wBean == 0xff) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("创建规则校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } if (pConfig->wMaxFanRule == 0) { //房主支付 wReduceBeans = wBean; int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi; if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20) { //使用的是赠送的钻石,限制其房主支付 CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (pConfig->wMaxFanRule >= 10) { //群主支付 wReduceBeans = wBean; } else { if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { wReduceBeans = wBean / 3; } else if(ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { wReduceBeans = wBean / 3; } else { wReduceBeans = wBean / MAX_CHAIR; } } if (wReduceBeans > 24) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置错误,请确认后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } auto UserInfo = pIServerUserItem->GetUserInfo(); if (pConfig->wMaxFanRule < 10 && UserInfo->dwBean < wReduceBeans) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!")); ///---元宝改钻石 2017-8-3 UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } if (pUserSitDown->data.tableType == 1/*pConfig->wMaxFanRule >= 10*/) { //返回数据 void * pBuffer = NULL; try { pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); CMD_GR_UserSitDownEx2 * pEx = (CMD_GR_UserSitDownEx2 *)pBuffer; CopyMemory(&(pEx->hostInfo), &(pUserSitDown->hostInfo), sizeof(CMD_GR_UserInfo)); CopyMemory(&(pEx->data), &(pUserSitDown->data), sizeof(CMD_GR_UserSitDown)); CopyMemory(&(pEx->data.TableConfig), pUserSitDown->data.TableConfig, sizeof(tagGameConfig)); pEx->cbWanFa = pUserSitDown->cbWanFa; pEx->RoomID = pUserSitDown->RoomID; pEx->ReduceBeans = wReduceBeans; //返回数据 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_HOSTINFO, dwSocketID, pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); if (pBuffer) free(pBuffer); pBuffer = NULL; } catch (...) { if (pBuffer) free(pBuffer); } return true; } else { if (UserInfo->dwBean < wReduceBeans) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!")); ///---元宝改钻石 2017-8-3 UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } //俱乐部房间 if (pUserSitDown->data.tableType == 1) { int count = 0; //从全局服务器上找 int flag = 1; CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it1 = m_PrivateRoomAll.begin(); while (it1 != m_PrivateRoomAll.end() && flag) { JN_GR_RoomListBig rooms = it1->second; if (rooms.roomType == 1 && rooms.tmp6[0] == pUserSitDown->data.clubID) { //如果房间是自动开房(新老版本兼容) if (rooms.tmp5 == 1) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈属于自动开房,不能手动创建房间")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } if (rooms.roomStatus == 0) { count++; if (count == 10) { flag = 0; break; } } } it1++; } if (count >= 10) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈还有10桌未开始,请稍后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } pTableFrame = CreatePrivateTable(pUserSitDown->RoomID, pConfig->wSubGameID); if (nullptr == pTableFrame) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前游戏房间已经人满为患了,请稍后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); str = szTemp; m_PriTableID_2_TableID[str] = pTableFrame->GetTableID(); pConfig->wHadPlayCount = pTableFrame->GetTableID(); pConfig->zmExtraRule = 1; StringCchCat(pConfig->sPrivateTableID, 7, str.c_str()); pTableFrame->OnEventSetGameConfig((void*)pUserSitDown->data.TableConfig, wDataSize - sizeof(CMD_GR_UserSitDown), str); pTableFrame->SetPrivateTableOwnerID(pIServerUserItem->GetUserID()); pTableFrame->SetGameConfig(*pConfig, pUserSitDown->data.WXianZhi); //俱乐部房间和好友房间的区分 pTableFrame->SetTableKind(pUserSitDown->data.tableType); pTableFrame->SetTableClub(pUserSitDown->data.clubID); sPrivateTableID.jgrDate[sPrivateTableID.Num].roomType = pUserSitDown->data.tableType; sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6[0] = pUserSitDown->data.clubID; //头像 StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl), pIServerUserItem->GetUserInfo()->szHeadUrl); sPrivateTableID.jgrDate[sPrivateTableID.Num].dwUserID = pIServerUserItem->GetUserID(); sPrivateTableID.jgrDate[sPrivateTableID.Num].dwServerID = m_pGameServiceOption->wServerID; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwRoomNumber = _ttol(str.c_str()); if (pTableFrame->GetStartMode() == START_MODE_ALL_READY) { sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = 2; } else { sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = pTableFrame->GetChairCount(); } sPrivateTableID.jgrDate[sPrivateTableID.Num].dwDiFen = pConfig->wPlayRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwJuShu = pConfig->wPlayCountRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwReadyBody = 0; sPrivateTableID.jgrDate[sPrivateTableID.Num].bWanFa = pConfig->wSubGameID; sPrivateTableID.jgrDate[sPrivateTableID.Num].bDuoLai = pConfig->bDuoLai; //多癞子可平胡,0可以 1不可以 sPrivateTableID.jgrDate[sPrivateTableID.Num].wFengDing = pConfig->wFengDing; //封顶值 sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp1 = pConfig->tmp1; //备用字段 sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp2 = pConfig->tmp2; //备用字段 sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp3 = pConfig->tmp3; StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName), pIServerUserItem->GetUserInfo()->szNickName); sPrivateTableID.jgrDate[sPrivateTableID.Num].bFanGua = pConfig->wMaxScore; sPrivateTableID.jgrDate[sPrivateTableID.Num].bRoomCreatePay = pConfig->wMaxFanRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwInsert_UpData_Del = 0; CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID); if (pCGameServerItem) { //计算距离排名 int iPaiMing = 0; int iCountMax = 1; GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); std::wstring ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax); StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), ip.c_str()); sPrivateTableID.jgrDate[sPrivateTableID.Num].wPort = pCGameServerItem->m_GameServer.wServerPort; } //同步到中心服务器 JN_GR_RoomListBig UserChat = sPrivateTableID.jgrDate[sPrivateTableID.Num]; UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat)); sPrivateTableID.Num++; m_UserID_2_PriTableIDGROUP[pIServerUserItem->GetUserID()] = sPrivateTableID; ///[+++支付修正下,根据玩法人数扣(修改3人玩法的BUG)2018-1-11 WORD wChairCount = pTableFrame->GetChairCount(); if (pConfig->wMaxFanRule == 0 || pConfig->wMaxFanRule >=10) { ///房主支付 wReduceBeans = wBean / wChairCount * wChairCount; //强制转换对于特定2人 if (pTableFrame->GetStartMode() == START_MODE_ALL_READY) { wReduceBeans = 2 * (pConfig->wPlayCountRule / 8); } CString strHint; strHint.Format(L"房主支付,以前支付=%d,现在支付=%d", wBean, wReduceBeans); CTraceService::TraceString(strHint, TraceLevel_Normal); } ///---] UserInfo->dwBean = UserInfo->dwBean - wReduceBeans; //锁定元宝 pTableFrame->LockBeans(pIServerUserItem->GetUserID(), wReduceBeans); //加入旁观 if (pTableFrame->PerformLookonAction(pIServerUserItem)) { pTableFrame->OnTCPNetworkSubUserCreateRoom(pIServerUserItem); m_Data.dCreateTable++; //进入房间旁观 CMD_GR_UserSitDownAckEx req; ZeroMemory(&req, sizeof(req)); memset(szTemp, 0, sizeof(szTemp)); if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); lstrcpy(req.szPrivateTableID, szTemp); req.cbRet = 0; req.dijin = pConfig->wPlayRule; req.paytype = pConfig->wMaxFanRule; req.desktype = pUserSitDown->data.tableType; req.playtype = pConfig->wSubGameID; req.totalplay = pConfig->wPlayCountRule; req.bDuoLai = pConfig->bDuoLai; req.wFengDing = pConfig->wFengDing; req.ipLimit = pConfig->wMaxScore; req.playnum = pConfig->tmp1; req.tmp3 = pConfig->tmp2; req.isowner = 1; req.roomId = pTableFrame->GetTableID(); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz; SitDownAck.set_szprivatetableid(szPrivateTableID); SitDownAck.set_cbret(req.cbRet); SitDownAck.set_dijin(req.dijin); SitDownAck.set_paytype(req.paytype); SitDownAck.set_desktype(req.desktype); SitDownAck.set_playtype(req.playtype); SitDownAck.set_totalplay(req.totalplay); SitDownAck.set_bduolai(req.bDuoLai); SitDownAck.set_wfengding(req.wFengDing); SitDownAck.set_iplimit(req.ipLimit); SitDownAck.set_playnum(req.playnum); SitDownAck.set_tmp3(req.tmp3); SitDownAck.set_isowner(req.isowner); SitDownAck.set_roomid(req.roomId); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); //用户状态 pIServerUserItem->SetClientReady(true); pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR); } //俱乐部创建房间广播 if (pUserSitDown->data.tableType == 1 && pUserSitDown->data.clubID != 0) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = pUserSitDown->data.clubID; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } return true; } //用户创建私有房间第二步自动创房 bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoomEx2(VOID * pData, WORD wDataSize, DWORD dwSocketID) { OutputDebugStringA("自动开房OnTCPNetworkSubUserCreateRoomEx2---"); //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx)); if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false; //效验数据 CMD_GR_UserSitDownEx * pUserSitDown = (CMD_GR_UserSitDownEx *)pData; tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->data.TableConfig; if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { //检验失败 return true; } } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { //检验失败 return true; } } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { //检验失败 return true; } } else if (ptagGameConfig->wSubGameID < 3) { //检验房间参数 if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig)) { return true; } } else if (ptagGameConfig->wSubGameID >= 20) { } JN_GR_RoomListGroup sPrivateTableID; ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup)); std::shared_ptr pTableFrame; std::wstring str; if (pUserSitDown->cbAuto == 1) { //查看群主创建的房间是否超过十个(全局校验)改为30 int count = 0; CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig rooms = it->second; if (rooms.dwUserID == pUserSitDown->hostInfo.dwOwnerID) { count++; } it++; } if (count >= 30) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败,群主房间已满30个,俱乐部 [ ClubID=%ld ]"), pUserSitDown->data.clubID); CTraceService::TraceString(szString, TraceLevel_Normal); return true; } } //查看群主创建的房间是否超过十个 改为30 auto iter = m_UserID_2_PriTableIDGROUP.find(pUserSitDown->hostInfo.dwOwnerID); if (iter != m_UserID_2_PriTableIDGROUP.end()) { sPrivateTableID = iter->second; if (sPrivateTableID.Num > 29) { return true; } } else { std::pair temp(pUserSitDown->hostInfo.dwOwnerID, sPrivateTableID); m_UserID_2_PriTableIDGROUP.insert(temp); } //添加房间信息 tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown->data.TableConfig; UINT wReduceBeans; UINT wBean = 0; if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 wBean = GetNeedPayEx(ptagGameConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { wBean = GetNeedPayZhiP(pConfig->wPlayCountRule); //纸牌= } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 wBean = GetNeedPayCxz(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID < 3) { //检验房间参数 wBean = GetNeedPay(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 20) { wBean = GetNeedPay(pConfig->wPlayCountRule); } if (wBean == 0xff) { //校验失败 return true; } if (pConfig->wMaxFanRule == 0) { //房主支付 wReduceBeans = wBean; //int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi; //if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20) //{ // //使用的是赠送的钻石,限制其房主支付 // CMD_GR_UserSitDownAck req; // ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); // req.cbRet = 1; // req.szText; // StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。")); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); // return true; //} } else if (pConfig->wMaxFanRule >= 10) { //群主支付 wReduceBeans = wBean; } else { if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { wReduceBeans = wBean / 3; } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { wReduceBeans = wBean / 3; } else { wReduceBeans = wBean / MAX_CHAIR; } } if (wReduceBeans > 24) { //校验失败 return true; } //返回数据 void * pBuffer = NULL; try { pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); CMD_GR_UserSitDownEx2 * pEx = (CMD_GR_UserSitDownEx2 *)pBuffer; CopyMemory(&(pEx->hostInfo), &(pUserSitDown->hostInfo), sizeof(CMD_GR_UserInfo)); CopyMemory(&(pEx->data), &(pUserSitDown->data), sizeof(CMD_GR_UserSitDown)); CopyMemory(&(pEx->data.TableConfig), pUserSitDown->data.TableConfig, sizeof(tagGameConfig)); pEx->cbAuto = 1; pEx->cbWanFa = pUserSitDown->cbWanFa; pEx->RoomID = pUserSitDown->RoomID; pEx->dwUesrID = pUserSitDown->dwUserID; pEx->ReduceBeans = wReduceBeans; //返回数据 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_HOSTINFO, dwSocketID, pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig)); if (pBuffer) free(pBuffer); pBuffer = NULL; } catch (...) { if (pBuffer) free(pBuffer); } return true; } //用户创建私有房间 bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 UserInfo::PB_CS_C_GR_UserSitDown SitDown; SitDown.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserSitDown pUserSitDown; ZeroMemory(&pUserSitDown, sizeof(pUserSitDown)); pUserSitDown.WXianZhi = SitDown.wxianzhi(); pUserSitDown.Wsocket = SitDown.wsocket(); CString szpassword = (CA2CTEX<2048>(SitDown.szpassword().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUserSitDown.szPassword, CountArray(pUserSitDown.szPassword), TEXT("%s"), szpassword); pUserSitDown.cbCreateTable = SitDown.cbcreatetable(); CString szprivatetableid = (CA2CTEX<2048>(SitDown.szprivatetableid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUserSitDown.szPrivateTableID, CountArray(pUserSitDown.szPrivateTableID), TEXT("%s"), szprivatetableid); pUserSitDown.bDuoLai = SitDown.bduolai(); pUserSitDown.wFengDing = SitDown.wfengding(); pUserSitDown.tableType = SitDown.tabletype(); pUserSitDown.clubID = SitDown.clubid(); for (WORD i = 0; i < SitDown.tableconfig_size(); i++) { const UserInfo::PB_CS_C_tagGameConfig & tableconfig = SitDown.tableconfig(i); pUserSitDown.TableConfig[i].wSubGameID = SitDown.tableconfig(i).wsubgameid(); pUserSitDown.TableConfig[i].wPlayRule = SitDown.tableconfig(i).wplayrule(); pUserSitDown.TableConfig[i].wMaxFanRule = SitDown.tableconfig(i).wmaxfanrule(); pUserSitDown.TableConfig[i].wMaxScore = SitDown.tableconfig(i).wmaxscore(); pUserSitDown.TableConfig[i].wPlayCountRule = SitDown.tableconfig(i).wplaycountrule(); pUserSitDown.TableConfig[i].wHadPlayCount = SitDown.tableconfig(i).whadplaycount(); pUserSitDown.TableConfig[i].zmExtraRule = SitDown.tableconfig(i).zmextrarule(); pUserSitDown.TableConfig[i].dghRule = SitDown.tableconfig(i).dghrule(); CString sprivatetableid = (CA2CTEX<2048>(SitDown.tableconfig(i).sprivatetableid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUserSitDown.TableConfig[i].sPrivateTableID, CountArray(pUserSitDown.TableConfig[i].sPrivateTableID), TEXT("%s"), sprivatetableid); pUserSitDown.TableConfig[i].bDuoLai = SitDown.tableconfig(i).bduolai(); pUserSitDown.TableConfig[i].wFengDing = SitDown.tableconfig(i).wfengding(); pUserSitDown.TableConfig[i].tmp1 = SitDown.tableconfig(i).tmp1(); pUserSitDown.TableConfig[i].tmp2 = SitDown.tableconfig(i).tmp2(); pUserSitDown.TableConfig[i].tmp3 = SitDown.tableconfig(i).tmp3(); pUserSitDown.TableConfig[i].tmp4 = SitDown.tableconfig(i).tmp4(); pUserSitDown.TableConfig[i].tmp5 = SitDown.tableconfig(i).tmp5(); } //效验数据 pUserSitDown.Wsocket = dwSocketID; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 if (pIServerUserItem == NULL) return false; if (IsJC(pIServerUserItem->GetUserID())) { CString csTestB; csTestB.Format(_T("创建房间 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } if (1 != pUserSitDown.cbCreateTable) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } if (!m_BCreate) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } CMD_GR_TJROOM req; ZeroMemory(&req, sizeof(CMD_GR_TJROOM)); req.cbRet = 2; StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr); req.wPort = pCGameServerItem->wServerPort; UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz; SitDownAck.set_sztext(szIp); SitDownAck.set_bduolai(req.wPort); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } BOOL bCreateHuaPai = FALSE; tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown.TableConfig; if (ptagGameConfig != NULL) { bCreateHuaPai = (3 == ptagGameConfig->wSubGameID); } if (!m_BCreate_Hua && bCreateHuaPai) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } CMD_GR_TJROOM req; ZeroMemory(&req, sizeof(CMD_GR_TJROOM)); req.cbRet = 2; StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr); req.wPort = pCGameServerItem->wServerPort; UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz; SitDownAck.set_sztext(szIp); SitDownAck.set_bduolai(req.wPort); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断 { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!")); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d"), L"OnTCPNetworkSubUserCreateRoom", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Normal); } //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0); return true; } WORD wTableID = pIServerUserItem->GetTableID(); if (wTableID != INVALID_TABLE) { //如果还在哪桌打麻将呢,则先离开处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } //tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->TableConfig; /////[+++ for test //CString csTestB; //csTestB.Format(_T("创建房间wSubGameID=%d"), ptagGameConfig->wSubGameID); //CTraceService::TraceString(csTestB, TraceLevel_Normal); /////+++] if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown.TableConfig)) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown.TableConfig)) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown.TableConfig)) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (ptagGameConfig->wSubGameID < 3) { //一脚赖油 if (!CheckConfig(*(tagGameConfig*)pUserSitDown.TableConfig)) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if(ptagGameConfig->wSubGameID >= 20) { //黄石晃晃 //if (!CheckConfig(*(tagGameConfig*)pUserSitDown->TableConfig)) //{ // CMD_GR_UserSitDownAck req; // req.cbRet = 1; // req.szText; // StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!")); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); // return true; //} } //当前服务器桌子上限判断 DWORD wMaxTable = m_pGameServiceOption->wTableCount; DWORD dwOnlineTableCount = m_PriTableID_2_TableID.size(); if (dwOnlineTableCount >= (wMaxTable - 1)) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } CMD_GR_TJROOM req; ZeroMemory(&req, sizeof(CMD_GR_TJROOM)); req.cbRet = 2; StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr); req.wPort = pCGameServerItem->wServerPort; UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz; SitDownAck.set_sztext(szIp); SitDownAck.set_bduolai(req.wPort); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } JN_GR_RoomListGroup sPrivateTableID; ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup)); std::shared_ptr pTableFrame; std::wstring str ; //查看自己创建的房间 auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID()); if (iter != m_UserID_2_PriTableIDGROUP.end()) { sPrivateTableID = iter->second; if (sPrivateTableID.Num > 29) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("最多只能创建三十个房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else { std::pair temp(pIServerUserItem->GetUserID(), sPrivateTableID); m_UserID_2_PriTableIDGROUP.insert(temp); } //添加房间信息 tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown.TableConfig; UINT wReduceBeans = 0; UINT wBean = 0; if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14) { //新版本 血流 wBean = GetNeedPayEx(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 wBean = GetNeedPayZhiP(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 wBean = GetNeedPayCxz(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID < 3 ) { //检验房间参数 wBean = GetNeedPay(pConfig->wPlayCountRule); } else if (ptagGameConfig->wSubGameID >= 20) { //黄石晃晃 wBean = GetNeedPay(pConfig->wPlayCountRule); } if (wBean == 0xff) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("创建规则校验失败!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } if (pConfig->wMaxFanRule == 0) { //房主支付 wReduceBeans = wBean; //检测钻石来源,如果在免费区域则拒绝。 int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi; if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20) { //使用的是赠送的钻石,限制其房主支付 CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。")); //CString csTestB; //csTestB.Format(_T("免费赠送钻石,不能用于房主开房. -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID()); //CTraceService::TraceString(csTestB, TraceLevel_Normal); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } else if (pConfig->wMaxFanRule >= 10) { //俱乐部群主支付 wReduceBeans = wBean; } else { if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5) { //戳瞎子 wReduceBeans = wBean / 3; } else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16) { //纸牌 wReduceBeans = wBean / 3; } else { wReduceBeans = wBean / MAX_CHAIR; } } if (wReduceBeans > 24) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("房间配置错误,请确认后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } auto UserInfo = pIServerUserItem->GetUserInfo(); if (UserInfo->dwBean < wReduceBeans && pConfig->wMaxFanRule <10) { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } void * pBuffer = NULL; try { pBuffer = malloc(sizeof(CMD_GR_UserSitDown) + 2*sizeof(DWORD) + sizeof(byte)*2 + sizeof(CMD_GR_UserInfo)); ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDown) + 2 * sizeof(DWORD) + sizeof(byte)*2 + sizeof(CMD_GR_UserInfo)); CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pBuffer; memcpy(&(pEx->data), &pUserSitDown, sizeof(CMD_GR_UserSitDown)); pEx->dwUserID = pIServerUserItem->GetUserID(); //获取私有房间随机号码 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pBuffer, sizeof(CMD_GR_UserSitDownEx)); if (pBuffer) free(pBuffer); pBuffer = NULL; } catch (...) { if (pBuffer) free(pBuffer); } return true; } //戳瞎子需要多少元宝 USHORT CAttemperEngineSink::GetNeedPayCxz(WORD wPlayCountRule) { //USHORT uRet = 0; CString juShuCfg; CString payCoinCfg; juShuCfg = m_pGameParameter->msParameter[2].juShuCfg; payCoinCfg = m_pGameParameter->msParameter[2].payCoinCfg; CList list1; CList list2; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = payCoinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payCoinCfg.Left(pos); int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); i++; payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1); pos = payCoinCfg.Find(_T('#')); } if (payCoinCfg.GetLength() > 0) { int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); } bool bFind = false; int iNum = 0; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == wPlayCountRule) { bFind = true; iNum = var; break; } } if (!bFind) { return 0XFF; } if (NULL == list2.FindIndex(iNum)) { return 0XFF; } int iBao = list2.GetAt(list2.FindIndex(iNum)); return iBao; } //纸牌 USHORT CAttemperEngineSink::GetNeedPayZhiP(WORD wPlayCountRule) { //USHORT uRet = 0; CString juShuCfg; CString payCoinCfg; juShuCfg = m_pGameParameter->msParameter[3].juShuCfg; payCoinCfg = m_pGameParameter->msParameter[3].payCoinCfg; CList list1; CList list2; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = payCoinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payCoinCfg.Left(pos); int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); i++; payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1); pos = payCoinCfg.Find(_T('#')); } if (payCoinCfg.GetLength() > 0) { int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); } bool bFind = false; int iNum = 0; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == wPlayCountRule) { bFind = true; iNum = var; break; } } if (!bFind) { return 0XFF; } if (NULL == list2.FindIndex(iNum)) { return 0XFF; } int iBao = list2.GetAt(list2.FindIndex(iNum)); return iBao; } //一脚赖油此局总共需要多少元宝 USHORT CAttemperEngineSink::GetNeedPay(WORD wPlayCountRule) { CString juShuCfg; CString payCoinCfg; juShuCfg = m_pGameParameter->msParameter[0].juShuCfg; payCoinCfg = m_pGameParameter->msParameter[0].payCoinCfg; CList list1; CList list2; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = payCoinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payCoinCfg.Left(pos); int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); i++; payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1); pos = payCoinCfg.Find(_T('#')); } if (payCoinCfg.GetLength() > 0) { int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); } bool bFind = false; int iNum = 0; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == wPlayCountRule) { bFind = true; iNum = var; break; } } if (!bFind) { return 0XFF; } if (NULL == list2.FindIndex(iNum)) { return 0XFF; } int iBao = list2.GetAt(list2.FindIndex(iNum)); return iBao; } //血流此局总共需要多少元宝 USHORT CAttemperEngineSink::GetNeedPayEx(WORD wPlayCountRule) { CString juShuCfg; CString payCoinCfg; juShuCfg = m_pGameParameter->msParameter[1].juShuCfg; payCoinCfg = m_pGameParameter->msParameter[1].payCoinCfg; CList list1; CList list2; int pos = juShuCfg.Find(_T('#')); int i = 0; while (pos != -1) { CString field = juShuCfg.Left(pos); int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); i++; juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1); pos = juShuCfg.Find(_T('#')); } if (juShuCfg.GetLength() > 0) { int iRet = _wtoi(juShuCfg.GetBuffer(0)); list1.AddTail(iRet); juShuCfg.ReleaseBuffer(); } pos = payCoinCfg.Find(_T('#')); i = 0; while (pos != -1) { CString field = payCoinCfg.Left(pos); int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); i++; payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1); pos = payCoinCfg.Find(_T('#')); } if (payCoinCfg.GetLength() > 0) { int iRet = _wtoi(payCoinCfg.GetBuffer(0)); list2.AddTail(iRet); payCoinCfg.ReleaseBuffer(); } bool bFind = false; int iNum = 0; int iCount = list1.GetCount(); for (int var = 0; var < iCount; var++) { int iRet = list1.GetAt(list1.FindIndex(var)); if (iRet == wPlayCountRule) { bFind = true; iNum = var; break; } } if (!bFind) { return 0XFF; } if (NULL == list2.FindIndex(iNum)) { return 0XFF; } int iBao = list2.GetAt(list2.FindIndex(iNum)); return iBao; } // 函数对象 class SortByLineCountFunc { public: int operator()(CGameServerItem* l, CGameServerItem* r) { return l->m_GameServer.dwOnLineCount < r->m_GameServer.dwOnLineCount; } }; class SortCountFunc { public: int operator()(LONGLONG l, LONGLONG r) { return l< r; } }; //获取距离排名 bool CAttemperEngineSink::GetPaiMing(DWORD dUserID, LONGLONG JuLi, int& iPaiMing, int& iCount) { iPaiMing = 0; iCount = 1; //枚举数据 m_MapUserIDJuli[dUserID] = JuLi; std::vector vecJuLi; DWORD dUser; LONGLONG llJuLi; POSITION pos = m_MapUserIDJuli.GetStartPosition(); while (pos) { m_MapUserIDJuli.GetNextAssoc(pos, dUser, llJuLi); vecJuLi.push_back(llJuLi); } iCount = vecJuLi.size(); std::sort(vecJuLi.begin(), vecJuLi.end(), SortCountFunc()); int count = vecJuLi.size(); for (int i = 0; i < count; i++) { if (vecJuLi[i] == JuLi) { iPaiMing = i; break; } } vecJuLi.clear(); return true; } std::string WStringToString(const std::wstring& wstr) { std::string str; int nLen = (int)wstr.length(); str.resize(nLen, ' '); int nResult = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wstr.c_str(), nLen, (LPSTR)str.c_str(), nLen, NULL, NULL); if (nResult == 0) { return ""; } return str; } //获取加入私有房间信息 bool CAttemperEngineSink::OnTCPNetworkSubUserJoinRoomInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_GetPrivateRoomInfo PrivateRoomInfo; PrivateRoomInfo.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_GetPrivateRoomInfo pUserSitDown; ZeroMemory(&pUserSitDown, sizeof(pUserSitDown)); pUserSitDown.RoomID = PrivateRoomInfo.roomid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 //ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断 { CMD_GR_UserSitDownAck req; ZeroMemory(&req, sizeof(req)); req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能加入房间,请先结束当前游戏!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } WORD wTableID = pIServerUserItem->GetTableID(); if (wTableID != INVALID_TABLE) {//离开处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } std::shared_ptr pTableFrame; CString csTest; csTest.Format(_T("%d"), pUserSitDown.RoomID); std::wstring str = csTest.GetBuffer(); csTest.ReleaseBuffer(); std::wstring ip; int iPaiMing = 0; int iCountMax = 1; pTableFrame = GetPriTableFrame(str); if (pTableFrame) { //此房间在本服务器上 JN_GR_RoomListInfo RoomInfo; ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo)); RoomInfo.dwDiFen = (pTableFrame->GetGameConfig()).wPlayRule; RoomInfo.dwJuShu = (pTableFrame->GetGameConfig()).wPlayCountRule; RoomInfo.bRoomCreatePay = (pTableFrame->GetGameConfig()).wMaxFanRule; RoomInfo.dwRoomNumber = pUserSitDown.RoomID; RoomInfo.dwServerID = m_pGameServiceOption->wServerID; RoomInfo.bFanGua = (pTableFrame->GetGameConfig()).wMaxScore; RoomInfo.bWanFa = (pTableFrame->GetGameConfig()).wSubGameID; RoomInfo.bDuoLai = (pTableFrame->GetGameConfig()).bDuoLai; //多癞子可平胡,0可以 1不可以 RoomInfo.wFengDing = (pTableFrame->GetGameConfig()).wFengDing; //封顶值 RoomInfo.tmp1 = (pTableFrame->GetGameConfig()).tmp1; //备用字段 RoomInfo.tmp2 = (pTableFrame->GetGameConfig()).tmp2; //备用字段 // to do 判断用户版本号 TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); del_char(szMachineID, L'.'); __int64 iMachineID = StrToNmuber(szMachineID); //--最低要求的版本号 TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 }; memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer)); del_char(szMinClientVer, L'.'); __int64 iMinClientVer = StrToNmuber(szMinClientVer); //if (iMachineID < iMinClientVer && (RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2)) //{ // CString str; // str.Format(_T("请下载最新版本,才能玩双扣 UserId=%d iMachineID=%d"), pIServerUserItem->GetUserID(), iMachineID); // CTraceService::TraceString(str, TraceLevel_Warning); // CMD_GR_UserSitDownAck req; // req.cbRet = 1; // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!")); // UserInfo::PB_CS_S_UserSitDownAck SitDownAck; // SitDownAck.set_cbret(req.cbRet); // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; // SitDownAck.set_sztext(szText); // //发送数据 // std::string pbdata = SitDownAck.SerializePartialAsString(); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); // return true; //} CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID); if (pCGameServerItem) { //计算距离排名 GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax); StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str()); RoomInfo.wPort = pCGameServerItem->m_GameServer.wServerPort; } if (ip == L"") { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } IServerUserItem * pIUserItem = m_ServerUserManager.SearchUserItem(pTableFrame->GetPrivateTableOwnerID()); if (pIUserItem) { StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), pIUserItem->GetNickName()); } m_Data.dAddRoom++; if (pCGameServerItem != NULL) { if (IsJC(9999)) { CString csTestB; csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d") , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); CTraceService::TraceString(csTestB, TraceLevel_Normal); } } else { CString csTestB; csTestB.Format(_T("未找到游戏节点 %d"), m_pGameServiceOption->wServerID); CTraceService::TraceString(csTestB, TraceLevel_Normal); } UserInfo::PB_CS_S_RoomListInfo RoomListInfo; std::string szName = CW2AEX<1024>(RoomInfo.szName, CP_UTF8).m_psz; std::string szIp = CW2AEX<1024>(RoomInfo.szIp, CP_UTF8).m_psz; RoomListInfo.set_szname(szName); RoomListInfo.set_dwserverid(RoomInfo.dwServerID); RoomListInfo.set_szip(szIp); RoomListInfo.set_bduolai(RoomInfo.bDuoLai); RoomListInfo.set_wfengding(RoomInfo.wFengDing); RoomListInfo.set_tmp1(RoomInfo.tmp1); RoomListInfo.set_tmp2(RoomInfo.tmp2); RoomListInfo.set_tmp3(RoomInfo.tmp3); RoomListInfo.set_tmp4(RoomInfo.tmp4); RoomListInfo.set_tmp5(RoomInfo.tmp5); for (WORD i = 0; i < 4; i++) { RoomListInfo.add_tmp6(RoomInfo.tmp6[i]); } RoomListInfo.set_wport(RoomInfo.wPort); RoomListInfo.set_dwroomnumber(RoomInfo.dwRoomNumber); RoomListInfo.set_dwdifen(RoomInfo.dwDiFen); RoomListInfo.set_dwjushu(RoomInfo.dwJuShu); RoomListInfo.set_broomcreatepay(RoomInfo.bRoomCreatePay); RoomListInfo.set_bfangua(RoomInfo.bFanGua); RoomListInfo.set_bwanfa(RoomInfo.bWanFa); //发送数据 std::string pbdata = RoomListInfo.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GETADD_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //从全局服务器查找 JN_GR_RoomListBig Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig)); { CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(pUserSitDown.RoomID); if (iter == m_PrivateRoomAll.end()) { //没找到 CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("没有这个房间,请确认后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); //std::string szPrivateTableID = CW2AEX<1024>(pUserSitDown.RoomID, CP_UTF8).m_psz; /*std::string pRoomID = WStringToString(str); SitDownAck.set_szprivatetableid(pRoomID);*/ std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } Temp = iter->second; } JN_GR_RoomListInfo RoomInfo; ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo)); RoomInfo.dwDiFen = Temp.dwDiFen; RoomInfo.dwJuShu = Temp.dwJuShu; RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay; RoomInfo.dwRoomNumber = Temp.dwRoomNumber; RoomInfo.dwServerID = Temp.dwServerID; RoomInfo.bFanGua = Temp.bFanGua; RoomInfo.bWanFa = Temp.bWanFa; RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以 RoomInfo.wFengDing = Temp.wFengDing; //封顶值 RoomInfo.tmp1 = Temp.tmp1; //备用字段 RoomInfo.tmp2 = Temp.tmp2; //备用字段 // to do 判断用户版本号 TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); del_char(szMachineID, L'.'); __int64 iMachineID = StrToNmuber(szMachineID); //--最低要求的版本号 TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 }; memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer)); del_char(szMinClientVer, L'.'); __int64 iMinClientVer = StrToNmuber(szMinClientVer); //if (iMachineID < iMinClientVer && (RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2)) //{ // CString str; // str.Format(_T("请下载最新版本,才能玩新定财神玩法 UserId=%d iMachineID=%d"), pIServerUserItem->GetUserID(), iMachineID); // CTraceService::TraceString(str, TraceLevel_Warning); // CMD_GR_UserSitDownAck req; // req.cbRet = 1; // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!")); // UserInfo::PB_CS_S_UserSitDownAck SitDownAck; // SitDownAck.set_cbret(req.cbRet); // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; // SitDownAck.set_sztext(szText); // //发送数据 // std::string pbdata = SitDownAck.SerializePartialAsString(); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); // return true; //} StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName); CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(Temp.dwServerID); if (pCGameServerItem) { if (pIServerUserItem->GetUserInfo()->iXinYong == 1 && pCGameServerItem->m_GameServer.wServerLevel > 2) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("此房间不可用,请自行建房.")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } //计算距离排名 iPaiMing = 0; iCountMax = 1; GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax); StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str()); } if (ip == L"") { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } RoomInfo.wPort = Temp.wPort; m_Data.dAddRoomChange++; if (pCGameServerItem != NULL) { if (IsJC(9999)) { CString csTestB; csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d") , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); CTraceService::TraceString(csTestB, TraceLevel_Normal); } } else { CString csTestB; csTestB.Format(_T("未找到游戏节点 %d"), Temp.dwServerID); CTraceService::TraceString(csTestB, TraceLevel_Normal); } UserInfo::PB_CS_S_RoomListInfo RoomListInfo; std::string szName = CW2AEX<1024>(RoomInfo.szName, CP_UTF8).m_psz; RoomListInfo.set_szname(szName); RoomListInfo.set_dwserverid(RoomInfo.dwServerID); std::string szIp = CW2AEX<1024>(RoomInfo.szIp, CP_UTF8).m_psz; RoomListInfo.set_szip(szIp); RoomListInfo.set_bduolai(RoomInfo.bDuoLai); RoomListInfo.set_wfengding(RoomInfo.wFengDing); RoomListInfo.set_tmp1(RoomInfo.tmp1); RoomListInfo.set_tmp2(RoomInfo.tmp2); RoomListInfo.set_tmp3(RoomInfo.tmp3); RoomListInfo.set_tmp4(RoomInfo.tmp4); RoomListInfo.set_tmp5(RoomInfo.tmp5); for (WORD i = 0; i < 4; i++) { RoomListInfo.add_tmp6(RoomInfo.tmp6[i]); } RoomListInfo.set_wport(RoomInfo.wPort); RoomListInfo.set_dwroomnumber(RoomInfo.dwRoomNumber); RoomListInfo.set_dwdifen(RoomInfo.dwDiFen); RoomListInfo.set_dwjushu(RoomInfo.dwJuShu); RoomListInfo.set_broomcreatepay(RoomInfo.bRoomCreatePay); RoomListInfo.set_bfangua(RoomInfo.bFanGua); RoomListInfo.set_bwanfa(RoomInfo.bWanFa); //发送数据 std::string pbdata = RoomListInfo.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GETADD_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //用户加入私有房间 bool CAttemperEngineSink::OnTCPNetworkSubUserJoinRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 UserInfo::PB_CS_C_GR_UserSitDown SitDown; SitDown.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserSitDown pUserSitDown; ZeroMemory(&pUserSitDown, sizeof(pUserSitDown)); pUserSitDown.WXianZhi = SitDown.wxianzhi(); pUserSitDown.Wsocket = SitDown.wsocket(); CString szpassword = (CA2CTEX<2048>(SitDown.szpassword().c_str(), CP_UTF8)).m_szBuffer; CopyMemory(pUserSitDown.szPassword, szpassword, sizeof(pUserSitDown.szPassword)); _sntprintf(pUserSitDown.szPassword, CountArray(pUserSitDown.szPassword), TEXT("%s"), szpassword); pUserSitDown.cbCreateTable = SitDown.cbcreatetable(); CString szprivatetableid = (CA2CTEX<2048>(SitDown.szprivatetableid().c_str(), CP_UTF8)).m_szBuffer; CopyMemory(pUserSitDown.szPrivateTableID, szprivatetableid, sizeof(pUserSitDown.szPrivateTableID)); pUserSitDown.bDuoLai = SitDown.bduolai(); pUserSitDown.wFengDing = SitDown.wfengding(); pUserSitDown.tableType = SitDown.tabletype(); pUserSitDown.clubID = SitDown.clubid(); for (WORD i = 0; i < SitDown.tableconfig_size(); i++) { if (SitDown.tableconfig(i).whadplaycount())continue; pUserSitDown.TableConfig[i].wSubGameID = SitDown.tableconfig(i).wsubgameid(); pUserSitDown.TableConfig[i].wPlayRule = SitDown.tableconfig(i).wplayrule(); pUserSitDown.TableConfig[i].wMaxFanRule = SitDown.tableconfig(i).wmaxfanrule(); pUserSitDown.TableConfig[i].wMaxScore = SitDown.tableconfig(i).wmaxscore(); pUserSitDown.TableConfig[i].wPlayCountRule = SitDown.tableconfig(i).wplaycountrule(); pUserSitDown.TableConfig[i].wHadPlayCount = SitDown.tableconfig(i).whadplaycount(); pUserSitDown.TableConfig[i].zmExtraRule = SitDown.tableconfig(i).zmextrarule(); pUserSitDown.TableConfig[i].dghRule = SitDown.tableconfig(i).dghrule(); CString sprivatetableid = (CA2CTEX<2048>(SitDown.tableconfig(i).sprivatetableid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUserSitDown.TableConfig[i].sPrivateTableID, CountArray(pUserSitDown.TableConfig[i].sPrivateTableID), TEXT("%s"), sprivatetableid); pUserSitDown.TableConfig[i].bDuoLai = SitDown.tableconfig(i).bduolai(); pUserSitDown.TableConfig[i].wFengDing = SitDown.tableconfig(i).wfengding(); pUserSitDown.TableConfig[i].tmp1 = SitDown.tableconfig(i).tmp1(); pUserSitDown.TableConfig[i].tmp2 = SitDown.tableconfig(i).tmp2(); pUserSitDown.TableConfig[i].tmp3 = SitDown.tableconfig(i).tmp3(); pUserSitDown.TableConfig[i].tmp4 = SitDown.tableconfig(i).tmp4(); pUserSitDown.TableConfig[i].tmp5 = SitDown.tableconfig(i).tmp5(); } //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (2 != pUserSitDown.cbCreateTable) { //SendRequestFailure(pIServerUserItem, TEXT("请求协议错误!"), 0); CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } //用户效验 //ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; if (!m_BAddCreate) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("服务器即将维护,暂时不能加入房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断 { if (pIServerUserItem->GetTableID() == INVALID_TABLE) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,桌号与状态不一致"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Warning); } //登录成功 断线重连 auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (pTableFrame) { pTableFrame->OnEventUserOnLine(pIServerUserItem); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,模拟断线重练。"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Normal); } } else { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,查找桌子实体失败"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Warning); } return true; } //请求调整 //WORD wRequestTableID = pUserSitDown->wTableID; //WORD wRequestChairID = pUserSitDown->wChairID; WORD wTableID = pIServerUserItem->GetTableID(); if (wTableID != INVALID_TABLE) {//离开处理 auto pTableFrame = GetTableFrame(wTableID); if (!pTableFrame) return false; CString csTestB; csTestB.Format(_T("表示玩家%d有桌子号%d信息了,又来加入旁观"), pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID); CTraceService::TraceString(csTestB, TraceLevel_Warning); std::shared_ptr pTempTableFrame; pTempTableFrame = GetPriTableFrame(pUserSitDown.szPrivateTableID); if (pTempTableFrame == NULL)return true; WORD wTempTableID = pTempTableFrame->GetTableID(); if (wTableID != wTempTableID) { CString csT; csT.Format(_T("表示内存玩家%d有桌子索引%d桌子号%s信息了,又来加入旁观%d,%s"), pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID, pIServerUserItem->GetUserInfo()->szPrivateTableID, pTempTableFrame->GetTableID(), pUserSitDown.szPrivateTableID); CTraceService::TraceString(csT, TraceLevel_Warning); return false; //if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } else { return true; } //if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; } std::shared_ptr pTableFrame; pTableFrame = GetPriTableFrame(pUserSitDown.szPrivateTableID); if (!pTableFrame) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("没有这个房间,请确认后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szPrivateTableID = CW2AEX<1024>(pUserSitDown.szPrivateTableID, CP_UTF8).m_psz; SitDownAck.set_szprivatetableid(szPrivateTableID); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); OutputDebugStringA("无条件上报删除该桌子"); CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.dwRoomNumber == _ttol(pUserSitDown.szPrivateTableID)) { Temp.dwInsert_UpData_Del = 2; UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); break; } it++; } //SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0); return true; } ///+++新需求:红名的玩家不能进入正常玩家开的房间,只能在自己开的房间里玩 add by 2017-12-15 if (pIServerUserItem != NULL && pIServerUserItem->GetUserInfo() != NULL && 1 == pIServerUserItem->GetUserInfo()->iXinYong) { BOOL bSelfRoom = FALSE; ///--是否为自己创建的房间 auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID()); if (iter != m_UserID_2_PriTableIDGROUP.end()) { JN_GR_RoomListGroup rooms = iter->second; for (int i = 0; i < (rooms.Num > 30 ? 30 : rooms.Num); i++) { if (rooms.jgrDate->dwRoomNumber == _wtoi(pUserSitDown.szPrivateTableID)) { bSelfRoom = TRUE; break; } } } if (!bSelfRoom) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("对不起,您是异常用户,只能进入自己创建的房间")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } //俱乐部加入限制 if (pUserSitDown.tableType == 0 && pTableFrame->GetTableKind()) { int dwClubID = (int)pTableFrame->GetTableClub(); bool bClubflag = true; for (int k = 0; k < 20; k++) //这个20循环是什么意思 { if (pIServerUserItem->GetUserInfo()->dwClubID[k] == dwClubID) { bClubflag = false; break; } } if (bClubflag) { CMD_GR_UserSitDownAck req; req.cbRet = 1; CString text = _T("对不起,您不能加入,该房间属于牌友圈:"); TCHAR tID[10]; _itow(dwClubID, tID, 10); text.Append(tID); StringCchCopy(req.szText, _countof(req.szText), text); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); return true; } } // to do 判断用户版本号 TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); del_char(szMachineID, L'.'); __int64 iMachineID = StrToNmuber(szMachineID); //--最低要求的版本号 TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 }; memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer)); del_char(szMinClientVer, L'.'); __int64 iMinClientVer = StrToNmuber(szMinClientVer); //if (iMachineID < iMinClientVer && (pTableFrame->GetGameConfig().wSubGameID == 14 || pTableFrame->GetGameConfig().tmp1 == 2)) //{ // CString str; // str.Format(_T("请下载最新版本,才能玩百变双扣。 iMachineID=%I64u userID=%d"), iMachineID, pIServerUserItem->GetUserID()); // CTraceService::TraceString(str, TraceLevel_Warning); // CMD_GR_UserSitDownAck req; // req.cbRet = 1; // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!")); // UserInfo::PB_CS_S_UserSitDownAck SitDownAck; // SitDownAck.set_cbret(req.cbRet); // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; // SitDownAck.set_sztext(szText); // //发送数据 // std::string pbdata = SitDownAck.SerializePartialAsString(); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); // return true; //} //加入旁观 if (pTableFrame->PerformLookonAction(pIServerUserItem)) { //进入房间旁观 CMD_GR_UserSitDownAckEx req; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); lstrcpy(req.szPrivateTableID, szTemp); req.cbRet = 0; req.dijin = pTableFrame->GetGameConfig().wPlayRule; req.paytype = pTableFrame->GetGameConfig().wMaxFanRule; req.desktype = pTableFrame->GetTableKind();// pTableFrame->GetGameConfig().wSubGameID; req.playtype = pTableFrame->GetGameConfig().wSubGameID; req.totalplay = pTableFrame->GetGameConfig().wPlayCountRule; req.bDuoLai = pTableFrame->GetGameConfig().bDuoLai; //多癞子可平胡,0可以 1不可以 req.wFengDing = pTableFrame->GetGameConfig().wFengDing; //封顶值 req.ipLimit = pTableFrame->GetGameConfig().wMaxScore; //备用字段 req.playnum = pTableFrame->GetGameConfig().tmp1; //备用字段 req.tmp3 = pTableFrame->GetGameConfig().tmp2; //备用字段 req.isowner = pTableFrame->GetPrivateTableOwnerID() == pIServerUserItem->GetUserID() ? 1 : 0; req.roomId = pTableFrame->GetTableID(); pIServerUserItem->GetUserInfo()->wTableID = req.roomId; //先设置好状态再发协议给前端 UserInfo::PB_CS_S_UserSitDownAck SitDownAck; std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz; SitDownAck.set_szprivatetableid(szPrivateTableID); SitDownAck.set_cbret(req.cbRet); SitDownAck.set_dijin(req.dijin); SitDownAck.set_paytype(req.paytype); SitDownAck.set_desktype(req.desktype); SitDownAck.set_playtype(req.playtype); SitDownAck.set_totalplay(req.totalplay); SitDownAck.set_bduolai(req.bDuoLai); SitDownAck.set_wfengding(req.wFengDing); SitDownAck.set_iplimit(req.ipLimit); SitDownAck.set_playnum(req.playnum); SitDownAck.set_tmp3(req.tmp3); SitDownAck.set_isowner(req.isowner); SitDownAck.set_roomid(req.roomId); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); //用户状态 pIServerUserItem->SetClientReady(true); pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR); pTableFrame->SendUserInfoStat(pIServerUserItem); } return true; } //请求元宝 bool CAttemperEngineSink::OnTCPNetworkGetBearn(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkGetBearn"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_BEAN, dwSocketID, &dUserID, sizeof(dUserID)); return true; } //房主请求解散 bool CAttemperEngineSink::OnTCPNetworkFangZhuJieSan(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_FREE)//用户判断 { SendRequestFailure(pIServerUserItem, TEXT("您未进入房间,不能解散!"), 0); return true; } auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrame) { SendRequestFailure(pIServerUserItem, TEXT("当前房间不存在!"), 0); return true; } //房主检验 if (pTableFrame->GetPrivateTableOwnerID() != pIServerUserItem->GetUserID()) { SendRequestFailure(pIServerUserItem, TEXT("不是您创建的房间,无法解散!"), 0); return true; } //解散 删除流程 pTableFrame->SetTableFree(); return true; } //请求订单编号 bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdan(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize >= sizeof(CMD_GR_GetDingDan)); if (wDataSize < sizeof(CMD_GR_GetDingDan)) return false; //效验数据 CMD_GR_GetDingDan * pUser = (CMD_GR_GetDingDan *)pData; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0) { //没有UNIONID return false; } GETDUILIEBASE Base; ZeroMemory(&Base, sizeof(GETDUILIEBASE)); StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID); Base.CommendID = 1;//请求订单编号 Base.dwSocketID = dwSocketID; GETDUILIE Temp; ZeroMemory(&Temp, sizeof(GETDUILIE)); Temp.dd.dProductId = pUser->dProductId; Temp.dd.jiage = pUser->jiage; memcpy(Temp.dd.ProductName, pUser->ProductName, sizeof(pUser->ProductName)); Temp.dd.payflag = 0; //Temp.dd.sdkflag = 0; //Temp.dd.tmpflag = 0; Temp.ack.dUserID = pIServerUserItem->GetUserID(); Temp.ack.dDaiLi = pIServerUserItem->GetUserInfo()->dDaiLi; //赋值市场测试设为300 Temp.ack.dwGameID = 305//gameID对应自己市场id; /*pIServerUserItem->GetUserInfo()->dwGameID*/; //添加地址 DWORD address = pIServerUserItem->GetClientAddr(); BYTE * pClientAddr = (BYTE *)&address; _sntprintf(Temp.ack.szClientAddr, CountArray(Temp.ack.szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]); m_Data.dChongZhi++; CopyMemory(Base.szBuffer, &Temp, sizeof(GETDUILIE)); CHttpClient::AddLog(dwSocketID, Base); return true; } //新方式请求订单编号 bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanNew(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_GetDingDanNEW DingDanNEW; DingDanNEW.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_GetDingDanNEW pUser; ZeroMemory(&pUser, sizeof(pUser)); pUser.dProductId = DingDanNEW.dproductid(); CString productname = (CA2CTEX<2048>(DingDanNEW.productname().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.ProductName, CountArray(pUser.ProductName), TEXT("%s"), productname); pUser.jiage = DingDanNEW.jiage(); pUser.payflag = DingDanNEW.payflag(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0) { //没有UNIONID return false; } GETDUILIEBASE Base; ZeroMemory(&Base, sizeof(GETDUILIEBASE)); StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID); Base.CommendID = 1;//请求订单编号 Base.dwSocketID = dwSocketID; GETDUILIE Temp; ZeroMemory(&Temp, sizeof(GETDUILIE)); Temp.dd.dProductId = pUser.dProductId; Temp.dd.jiage = pUser.jiage; memcpy(Temp.dd.ProductName, pUser.ProductName, sizeof(pUser.ProductName)); Temp.dd.payflag = pUser.payflag; Temp.ack.dUserID = pIServerUserItem->GetUserID(); Temp.ack.dDaiLi = pIServerUserItem->GetUserInfo()->dDaiLi; Temp.ack.dwGameID = 305/*pIServerUserItem->GetUserInfo()->dwGameID*/; DWORD address = pIServerUserItem->GetClientAddr(); BYTE * pClientAddr = (BYTE *)&address; _sntprintf(Temp.ack.szClientAddr, CountArray(Temp.ack.szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]); m_Data.dChongZhi++; CopyMemory(Base.szBuffer, &Temp, sizeof(GETDUILIE)); CHttpClient::AddLog(dwSocketID, Base); return true; } //用户解绑代理结果回调 bool CAttemperEngineSink::OnTCPNetworkSubUserUntieAgentCallBack(CString csTest, DWORD dwSocketID) { ////获取用户 //WORD wBindIndex = LOWORD(dwSocketID); //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //if (pIServerUserItem == NULL) return false; //return SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_APPLY_UNTIE_AGENT_ACK, &iRet, sizeof(int)); TCHAR* pData = NULL; try { pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); BYTE* pByte = (BYTE*)pData; WORD *pTemp = (WORD*)pData; pTemp[0] = csTest.GetLength() + 1; CopyMemory(pByte + 2, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR)); csTest.ReleaseBuffer(); //SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); free((void*)pData); pData = NULL; int iRet = -1; if (csTest.Find(_T("1")) != -1) { //成功 更新 //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return true; if (pIServerUserItem->GetUserInfo()) { pIServerUserItem->GetUserInfo()->dDaiLi = 0; } iRet = 0; } int startIndex = csTest.Find(_T("")); DBR_GR_UntieAgentInfo UntieAgentInfo = { 0 }; UntieAgentInfo.IRet = iRet; CString strResult = csTest.Mid(startIndex); int endIndex = strResult.Find(_T("")); strResult = strResult.Mid(6, endIndex-6); _tcscpy(UntieAgentInfo.szErrorDsc, strResult); UserInfo::PB_CS_S_UntieAgentInfo AgentInfo; AgentInfo.set_iret(UntieAgentInfo.IRet); std::string szErrorDsc = CW2AEX<1024>(UntieAgentInfo.szErrorDsc, CP_UTF8).m_psz; AgentInfo.set_szerrordsc(szErrorDsc); //发送数据 std::string pbdata = AgentInfo.SerializePartialAsString(); return SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_APPLY_UNTIE_AGENT_ACK, (void*)pbdata.c_str(), pbdata.length()); } catch (...) { if (pData) { free((void*)pData); } } return true; } //获取手机验证码,写个线程去调短信接口 bool CAttemperEngineSink::OnTCPNetworkSubUserCheckVerifCode(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_CheckVerifCode VerifCode; VerifCode.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_CheckVerifCode pUser; ZeroMemory(&pUser, sizeof(pUser)); CString phonenum = (CA2CTEX<2048>(VerifCode.phonenum().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; /* //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484")); DWORD dUserID = pIServerUserItem->GetUserID(); GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); StringCchCat(Temp.szUnionID, 12, pUser->PhoneNum); Temp.dUserID = dUserID; Temp.CommendID = 8; //获取手机验证码(只作透传) Temp.dwSocketID = dwSocketID; CHttpClient::AddLog(dwSocketID, Temp); return true; */ CMD_GR_GetVerifCode GetVerifCode = { 0 }; StringCchCat(GetVerifCode.PhoneNum, 12, pUser.PhoneNum); GetVerifCode.dUserID = pIServerUserItem->GetUserID(); m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_VERIF_CODE, dwSocketID, &GetVerifCode, sizeof(CMD_GR_GetVerifCode)); return true; } //回调短信验证,表示验证通过了,落地绑定关系到数据库 bool CAttemperEngineSink::OnTCPNetworkSubUserCheckVerifCodeCallBack(CString csIphoneNum, CString strVerfCode, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); if (IsJC(302)) { CString strTip; strTip.Format(L"**落地手机号码:%s", csIphoneNum); CTraceService::TraceString(strTip, TraceLevel_Normal); } DBR_GR_GetCheckIphone pData; memset(&pData, 0, sizeof(DBR_GR_GetCheckIphone)); //如果返回的是校验通过,数据落地,然后返回前端 pData.dwUserID = dUserID; _sntprintf(pData.PhoneNum, 12, TEXT("%s"), csIphoneNum); _sntprintf(pData.VerfCode, 7, TEXT("%s"), strVerfCode); return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_IPHONE, dwSocketID, &pData, sizeof(DBR_GR_GetCheckIphone)); } //绑定手机,前端传来验证码,写个线程去校验验证码 bool CAttemperEngineSink::OnTCPNetworkSubUserCheckIphone(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_CheckIphone Iphone; Iphone.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_CheckVerifCode pUser; ZeroMemory(&pUser, sizeof(pUser)); CString phonenum = (CA2CTEX<2048>(Iphone.phonenum().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum); CString verfcode = (CA2CTEX<2048>(Iphone.verfcode().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.VerfCode, CountArray(pUser.VerfCode), TEXT("%s"), verfcode); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; //std::string strVerfCode = CW2AEX<1024>(pUser_bak->Name).m_psz; //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484")); //pUser->VerfCode = atoi(strVerfCode.c_str()); GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); StringCchCat(Temp.szUnionID, 12, pUser.PhoneNum); //Temp.dUserID = pUser->VerfCode; //用来临时作为验证码 memcpy(Temp.bb.szName, pUser.VerfCode, 6*sizeof(TCHAR)); Temp.CommendID = 9; //校验手机验证码(只作透传) Temp.dwSocketID = dwSocketID; CHttpClient::AddLog(dwSocketID, Temp); return true; } //绑定手机查询 bool CAttemperEngineSink::OnTCPNetworkSubUserCheckIphoneQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_IPHONE_QUERY, dwSocketID, &dUserID, sizeof(dUserID)); } //绑定闲聊 bool CAttemperEngineSink::OnTCPNetworkSubUserXianLiao(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_CheckXiaoLiao XiaoLiao; XiaoLiao.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_CheckXiaoLiao pUser; ZeroMemory(&pUser, sizeof(pUser)); CString openid = (CA2CTEX<2048>(XiaoLiao.openid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.OpenID, CountArray(pUser.OpenID), TEXT("%s"), openid); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DBR_GR_GetCheckXianLiao XianLiao = { 0 }; XianLiao.dwUserID = pIServerUserItem->GetUserID(); lstrcpyn(XianLiao.OpenID, pUser.OpenID, CountArray(pUser.OpenID)); return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_XIANLIAO, dwSocketID, &XianLiao, sizeof(DBR_GR_GetCheckXianLiao)); } //实名认证 bool CAttemperEngineSink::OnTCPNetworkSubUserCheckName(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_CheckName Name; Name.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_CheckName pUser; ZeroMemory(&pUser, sizeof(pUser)); CString name = (CA2CTEX<2048>(Name.name().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.Name, CountArray(pUser.Name), TEXT("%s"), name); CString idcard = (CA2CTEX<2048>(Name.idcard().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pUser.IDCard, CountArray(pUser.IDCard), TEXT("%s"), idcard); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); CHECKNAMEINFO user; user.nameInfo = pUser; user.dUserID = dUserID; return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_NAME, dwSocketID, &user, sizeof(CHECKNAMEINFO)); } bool CAttemperEngineSink::OnTCPNetworkSubUserCheckNameQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_NAME_QUERY, dwSocketID, &dUserID, sizeof(dUserID)); } //订单编号返回应答 bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanCallBack(GETDUILIE Data, DWORD dwSocketID) { TCHAR* pData = NULL; try { CString csTest = Data.ack.szRet; pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); BYTE* pByte = (BYTE*)pData; WORD* pTemp = (WORD*)pData; //pTemp[0] = csTest.GetLength() + 1; CopyMemory(pByte, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR)); csTest.ReleaseBuffer(); m_Data.dChongZhiOK++; CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_DINGDANACK); string m_str = ""; m_str = cjb.string_To_UTF8(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); UserInfo::PB_CS_S_GetDingDanACK DingDan; DingDan.set_ret(m_str); //发送数据 std::string pbdata = DingDan.SerializePartialAsString(); SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_DINGDANACK, (void*)pbdata.c_str(), pbdata.length()); free((void*)pData); pData = NULL; } catch (...) { if (pData) { free((void*)pData); } } return true; } //获取购买记录 bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanList(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); StringCchCat(Temp.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID); Temp.CommendID = 2;//获取购买记录 Temp.dwSocketID = dwSocketID; CHttpClient::AddLog(dwSocketID, Temp); return true; } //获取购买记录返回应答 bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanListCallBack(CString csTest, DWORD dwSocketID) { TCHAR* pData = NULL; try { pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); BYTE* pByte = (BYTE*)pData; WORD* pTemp = (WORD*)pData; pTemp[0] = csTest.GetLength() + 1; CopyMemory(pByte + 2, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR)); csTest.ReleaseBuffer(); CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_DINGDANLISTACK); std::string str = cjb.GetInfoJson(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD)); UserInfo::PB_CS_S_DingdanList DingDanList; DingDanList.set_ret(str); //发送数据 std::string pbdata = DingDanList.SerializePartialAsString(); SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_DINGDANLISTACK, (void*)pbdata.c_str(), pbdata.length()); free((void*)pData); pData = NULL; } catch (...) { if (pData) { free((void*)pData); } } return true; } //绑定代理信息 bool CAttemperEngineSink::OnTCPNetworkSubUseGetDaiLiInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0) { //没有UNIONID return false; } if (pIServerUserItem->GetUserInfo()->dDaiLi != 0) { CMD_GR_DaiLiInfo aa; ZeroMemory(&aa, sizeof(CMD_GR_DaiLiInfo)); StringCbCat(aa.szName, 32, pIServerUserItem->GetUserInfo()->szName); StringCbCat(aa.szWx, 32, pIServerUserItem->GetUserInfo()->szWx); StringCbCat(aa.szQQ, 32, pIServerUserItem->GetUserInfo()->szQQ); UserInfo::PB_CS_S_DaiLiInfo DaiLiInfo; std::string szName = CW2AEX<1024>(aa.szName, CP_UTF8).m_psz; std::string szWx = CW2AEX<1024>(aa.szWx, CP_UTF8).m_psz; std::string szQQ = CW2AEX<1024>(aa.szQQ, CP_UTF8).m_psz; DaiLiInfo.set_szname(szName); DaiLiInfo.set_szwx(szWx); DaiLiInfo.set_szqq(szQQ); //发送数据 std::string pbdata = DaiLiInfo.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_DAILI_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } return true; } //绑定代理 bool CAttemperEngineSink::OnTCPNetworkSubUseBangDing(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_BangDing Ding; Ding.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_BangDing pUser; ZeroMemory(&pUser, sizeof(pUser)); pUser.dDaiLi = Ding.ddaili(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0) { //没有UNIONID return false; } if (pIServerUserItem->GetUserInfo()->dDaiLi != 0) { //已经绑定了代理 CMD_GR_BangDingACK Temp; ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK)); CString csText = _T("0您已经绑定过了0"); WORD *pWord = (WORD *)&Temp; pWord[0] = csText.GetLength() + 1; StringCbCat(Temp.szText, 1024, csText.GetBuffer(0)); csText.ReleaseBuffer(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, &Temp, 2 + pWord[0] * sizeof(TCHAR)); return true; } if (pUser.dDaiLi< 10000 || pUser.dDaiLi > 999999) { //代理值非法 CMD_GR_BangDingACK Temp; ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK)); Temp.bRet = 0; CString csText = _T("0输入代理编号出错0"); WORD *pWord = (WORD *)&Temp; pWord[0] = csText.GetLength() + 1; StringCbCat(Temp.szText, 1024, csText.GetBuffer(0)); csText.ReleaseBuffer(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, &Temp, 2 + pWord[0] * sizeof(TCHAR)); return true; } GETDUILIEBASE Base; ZeroMemory(&Base, sizeof(GETDUILIEBASE)); StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID); Base.CommendID = 3;//绑定代理 Base.dwSocketID = dwSocketID; Base.dUserID = pIServerUserItem->GetUserID(); CopyMemory(Base.szBuffer, &pUser, sizeof(CMD_GR_BangDing)); CMD_GR_Info aa; ZeroMemory(&aa, sizeof(CMD_GR_Info)); StringCchCat(aa.szName, 32, pIServerUserItem->GetUserInfo()->szNickName); StringCchCat(aa.szImgHead, 256, pIServerUserItem->GetUserInfo()->szHeadUrl); Base.bb = aa; CHttpClient::AddLog(dwSocketID, Base); return true; } //绑定代理应答 bool CAttemperEngineSink::OnTCPNetworkSubUserBangDingCallBack(CString csTest, DWORD dwSocketID, DWORD dDaiLi) { TCHAR* pData = NULL; try { CMD_GR_BangDingACK Temp; ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK)); Temp.bRet = 0; if (csTest.Find(_T("1")) != -1) { //成功 更新 //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem* pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return true; if (pIServerUserItem->GetUserInfo()) { pIServerUserItem->GetUserInfo()->dDaiLi = dDaiLi; } Temp.bRet = 1; //查询更新数据库 } WORD* pWord = (WORD*)&Temp; pWord[0] = csTest.GetLength() + 1; StringCbCat(Temp.szText, 1024, csTest.GetBuffer(0)); CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK); std::string str = cjb.GetInfoJson((TCHAR*)&Temp, sizeof(CMD_GR_BangDingACK)); UserInfo::PB_CS_S_BangDing BangDing; BangDing.set_ret(str); //发送数据 std::string pbdata = BangDing.SerializePartialAsString(); SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, (void*)pbdata.c_str(), pbdata.length()); } catch (...) { if (pData) { free((void*)pData); } } return true; } //用户坐下请求 bool CAttemperEngineSink::OnTCPNetworkSubUserDown(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_UserSeatEx SeatEx; SeatEx.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserSeatEx pUserSitDown; ZeroMemory(&pUserSitDown, sizeof(pUserSitDown)); pUserSitDown.seatId = SeatEx.seatid(); pUserSitDown.x = SeatEx.x(); pUserSitDown.y = SeatEx.y(); if (pUserSitDown.seatId > 3) { CString csTestB; csTestB.Format(_T("坐下不合法:%d"), pUserSitDown.seatId); CTraceService::TraceString(csTestB, TraceLevel_Warning); return false; } //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 //ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } pIServerUserItem->GetUserInfo()->dDingWeiX = pUserSitDown.x; pIServerUserItem->GetUserInfo()->dDingWeiY = pUserSitDown.y; BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断 { SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,不能选择座位!"), 0); return true; } auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrame) { SendRequestFailure(pIServerUserItem, TEXT("当前房间不存在!"), 0); return true; } if (pTableFrame->PerformSitDownAction(pUserSitDown.seatId, pIServerUserItem)) { //更新桌子列表 JN_GR_RoomListGroup Temp; auto iter = m_UserID_2_PriTableIDGROUP.find(pTableFrame->GetPrivateTableOwnerID()); if (iter != std::end(m_UserID_2_PriTableIDGROUP)) { Temp = iter->second; //判定有没有找到该房间 BOOL bFind = false; for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++) { if (Temp.jgrDate[i].dwRoomNumber == _ttol(pTableFrame->GetPrivateTableID().c_str())) { bFind = true; break; } } //没找到从全局找 if (bFind == false) { CWHDataLocker DataLocker(m_CriticalSection); auto iterY = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str())); if (iterY != m_PrivateRoomAll.end()) { if (Temp.Num < 30) { Temp.jgrDate[Temp.Num] = iterY->second; Temp.Num++; } } else { return false; } } } else { //由于4点中的清除操作照成房间找不到 //从全局去找 CWHDataLocker DataLocker(m_CriticalSection); auto aTemp = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str())); if (aTemp != m_PrivateRoomAll.end()) { Temp.Num = 1; Temp.jgrDate[0] = aTemp->second; } else { return false; } } int nflag = 0;//临时变量 LYH 2018-8-28 TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++) { if (Temp.jgrDate[i].dwRoomNumber == _ttol(szTemp)) { nflag = 1; /*if (2 == Temp.jgrDate[i].dwReadyBody)break;*/ Temp.jgrDate[i].dwReadyBody++; //添加玩家信息 Temp.jgrDate[i].player[pUserSitDown.seatId].dwUserID = pIServerUserItem->GetUserID(); CopyMemory(Temp.jgrDate[i].player[pUserSitDown.seatId].szName, pIServerUserItem->GetNickName(), sizeof(Temp.jgrDate[i].player[pUserSitDown.seatId].szName)); CopyMemory(Temp.jgrDate[i].player[pUserSitDown.seatId].szHeadUrl, pIServerUserItem->GetUserInfo()->szHeadUrl, sizeof(Temp.jgrDate[i].player[pUserSitDown.seatId].szHeadUrl)); //同步到中心服务器 JN_GR_RoomListBig UserChat = Temp.jgrDate[i]; UserChat.dwInsert_UpData_Del = 1; if (pTableFrame->GetNullChairCount() == 0 || (pTableFrame->GetNullChairCount() == 1 && pTableFrame->GetStartMode() == START_MODE_ALL_READY)) { UserChat.roomStatus = 1; //自动创房判定 if (pTableFrame->GetTableKind() == 1 && pTableFrame->GetTableAuto() == 1) { int FreeTalbe = 0; CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig TempTemp = it->second; if (TempTemp.tmp6[0] == pTableFrame->GetTableClub() && TempTemp.roomStatus == 0 && TempTemp.dwRoomNumber != _ttol(szTemp)) { if (UserChat.tmp4 == TempTemp.tmp4) { FreeTalbe++; } } it++; } //没有找到空闲的桌子 if (FreeTalbe == 0) { this->OnAutoCreateRoomToDB(pTableFrame->GetTableClub(), pIServerUserItem->GetUserID(), UserChat.tmp4); } } } else { OutputDebugStringA("人员还没有满"); } UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat)); //俱乐部房间变动广播 if (UserChat.tmp6[0] != 0 && UserChat.roomType == 1) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = UserChat.tmp6[0]; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } break; } } if (0 == nflag) { CString csTestB; csTestB.Format(_T("创建者ID=%d,该节点m_UserID_2_PriTableIDGROUP数组内未找到房间号【%s】"), pTableFrame->GetPrivateTableOwnerID(), szTemp); CTraceService::TraceString(csTestB, TraceLevel_Warning); } m_UserID_2_PriTableIDGROUP[pTableFrame->GetPrivateTableOwnerID()] = Temp; UserInfo::PB_CS_S_UserSitAck SitAck; SitAck.set_ret(0); //发送数据 std::string pbdata = SitAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_SEAT_ACK, (void*)pbdata.c_str(), pbdata.length()); } return true; } //用户起立 bool CAttemperEngineSink::OnTCPNetworkSubUserStandUp(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_UserStandUp StandUp; StandUp.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserStandUp pUserStandUp; ZeroMemory(&pUserStandUp, sizeof(pUserStandUp)); pUserStandUp.wTableID = StandUp.wtableid(); pUserStandUp.wChairID = StandUp.wchairid(); pUserStandUp.cbForceLeave = StandUp.cbforceleave(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; BYTE iStata = pIServerUserItem->GetUserInfo()->cbUserStatus;//原本状态 auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrame) return false; //用户判断 if ((pUserStandUp.cbForceLeave == FALSE) && (pIServerUserItem->GetUserStatus() == US_PLAYING || pIServerUserItem->GetUserStatus() == US_PLAYINGWAIT)) { SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserStandUp", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->szPrivateTableID , pIServerUserItem->GetUserStatus()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } return true; } //当这个人桌子上游戏开始了,他又不是旁观用户 就不让他走了。 if (pTableFrame->GetStartCount() >= 1 && pIServerUserItem->GetUserStatus() == US_READY) { SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserStandUp2", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->szPrivateTableID , pIServerUserItem->GetUserStatus()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } return true; } //离开处理 if (pTableFrame->PerformStandUpAction(pIServerUserItem)) { //如果是旁观状态,不用清楚。 if (iStata == US_SIT || iStata == US_READY) { //更新桌子列表 JN_GR_RoomListGroup Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroup)); auto iter = m_UserID_2_PriTableIDGROUP.find(pTableFrame->GetPrivateTableOwnerID()); if (iter == std::end(m_UserID_2_PriTableIDGROUP)) { CWHDataLocker DataLocker(m_CriticalSection); auto iter2 = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str())); if (iter2 != m_PrivateRoomAll.end()) { Temp.Num = 1; Temp.jgrDate[0] = iter2->second; } else { return false; } } else { Temp = iter->second; } for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++) { TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); if (Temp.jgrDate[i].dwRoomNumber == _ttol(szTemp)) { if (Temp.jgrDate[i].dwReadyBody > 0) { Temp.jgrDate[i].dwReadyBody--; for (int j = 0; j < 4; j++) { if (Temp.jgrDate[i].player[j].dwUserID == pIServerUserItem->GetUserID()) { ZeroMemory(&(Temp.jgrDate[i].player[j]), sizeof(PlayerInfo)); break; } } } //同步到中心服务器 JN_GR_RoomListBig UserChat = Temp.jgrDate[i]; UserChat.dwInsert_UpData_Del = 1; UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat)); //俱乐部房间变动广播 if (UserChat.tmp6[0] != 0 && UserChat.roomType == 1) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = UserChat.tmp6[0]; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } } } m_UserID_2_PriTableIDGROUP[pTableFrame->GetPrivateTableOwnerID()] = Temp; } } return true; } bool CAttemperEngineSink::OnTCPSocketGetUserGameScoreRecordList(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_C_GetUserRecordListReqNew RepulseSit; RepulseSit.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_GetUserRecordListReqNew pRecordList; ZeroMemory(&pRecordList, sizeof(pRecordList)); pRecordList.dwUserID = RepulseSit.dwuserid(); pRecordList.dwKingID = RepulseSit.dwkingid(); pRecordList.wParentID = RepulseSit.wparentid(); pRecordList.wLimitIndex = RepulseSit.wlimitindex(); pRecordList.wLimitCount = RepulseSit.wlimitcount(); pRecordList.dwParentID = RepulseSit.dwparentid(); m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_GET_GAME_SCORE_RECORD_LIST, dwSocketID, &pRecordList, sizeof(CMD_GR_GetUserRecordListReqNew)); return true; } bool CAttemperEngineSink::OnTCPSocketGetUserGameScoreRecordDetail(VOID * pData, WORD wDataSize, DWORD dwSocketID) { ////效验参数 //ASSERT(wDataSize == sizeof(CMD_GR_GetUserRecordDetailInfoReq)); //if (wDataSize != sizeof(CMD_GR_GetUserRecordDetailInfoReq)) return false; ////获取用户 //WORD wBindIndex = LOWORD(dwSocketID); //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); ////用户效验 //ASSERT(pIServerUserItem != NULL); //if (pIServerUserItem == NULL) return false; ////定义变量 //CMD_GR_GetUserRecordDetailInfoReq * pUserData = (CMD_GR_GetUserRecordDetailInfoReq *)pData; //DBR_GR_GetUserGameScoreRecordDetail req; //req.dwUserID = pIServerUserItem->GetUserID(); //req.dwKingID = pUserData->wKindID; //req.wRecordID = pUserData->wRecordID; //m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_GET_GAME_SCORE_RECORD_DETAIL, dwSocketID, &req, sizeof(req)); return true; } bool CAttemperEngineSink::OnTCPSocketGetUserGameReplayRecord(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //定义变量 UserInfo::PB_CS_C_GR_ReplayRecordReq RecordReq; RecordReq.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ReplayRecordReq req; ZeroMemory(&req, sizeof(req)); req.dwRecordID = RecordReq.dwrecordid(); m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY, dwSocketID, &req, sizeof(CMD_GR_ReplayRecordReq)); return true; } //获取临时积分排行榜 bool CAttemperEngineSink::OnTCPSocketGetUserGameTempScoreRankList(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPSocketGetUserGameTempScoreRankList"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; auto now = time(0); if (now - m_lastRankListTime < 300 && m_pRankListData && m_pRankListDataSize > 0) { SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT, m_pRankListData, m_pRankListDataSize); return true; } m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST, dwSocketID, 0, 0); return true; } //更新某人拥有的房间状态值 bool CAttemperEngineSink::UpdataBodyOwnRoom(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataMyOwnRoom"), TraceLevel_Debug); //变量定义 JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomListBig)); //效验参数 if (wDataSize != sizeof(JN_GR_RoomListBig)) return false; //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_S_RoomList RoomList; RoomList.set_dwuserid(pUserChat->dwUserID); RoomList.set_dwserverid(pUserChat->dwServerID); RoomList.set_dwroomnumber(pUserChat->dwRoomNumber); RoomList.set_dwinsert_updata_del(pUserChat->dwInsert_UpData_Del); RoomList.set_dwdifen(pUserChat->dwDiFen); RoomList.set_dwjushu(pUserChat->dwJuShu); RoomList.set_dwreadybody(pUserChat->dwReadyBody); RoomList.set_dwbody(pUserChat->dwBody); RoomList.set_bwanfa(pUserChat->bWanFa); std::string szIp = CW2AEX<1024>(pUserChat->szIp, CP_UTF8).m_psz; RoomList.set_szip(szIp); RoomList.set_bduolai(pUserChat->bDuoLai); RoomList.set_wfengding(pUserChat->wFengDing); RoomList.set_tmp1(pUserChat->bRoomCreatePay); RoomList.set_tmp2(pUserChat->tmp1); RoomList.set_tmp3(pUserChat->tmp2); RoomList.set_tmp4(pUserChat->tmp4); RoomList.set_tmp5(pUserChat->tmp5); for (WORD i = 0; i < 4; i++) { RoomList.add_tmp6(pUserChat->tmp6[i]); } RoomList.set_wport(pUserChat->wPort); //发送数据 std::string pbdata = RoomList.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_MYROOM_UPDATA, (void*)pbdata.c_str(), pbdata.length()); return true; } bool CAttemperEngineSink::UpdataServerStata(VOID * pData, WORD wDataSize) { //变量定义 JN_GR_SERVICESTAT * pUserChat = (JN_GR_SERVICESTAT *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT)); //效验参数 if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false; m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_UPDATASERVICE, pUserChat, wDataSize/*,0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); return true; } bool CAttemperEngineSink::UpdataBodyOwnRoomToServer(VOID * pData, WORD wDataSize) { //变量定义 JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomListBig)); //效验参数 if (wDataSize != sizeof(JN_GR_RoomListBig)) return false; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOM, pUserChat, wDataSize); return true; } //发送某人的房间的状态 bool CAttemperEngineSink::OnUpdataBodyOwnRoom(VOID * pData, WORD wDataSize) { JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomListBig)); //效验参数 if (wDataSize != sizeof(JN_GR_RoomListBig)) return false; DWORD dwUserID = pUserChat->dwUserID; //找到他的连接 IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(dwUserID); if (pIServerUserItem != NULL) { UpdataBodyOwnRoom(pIServerUserItem, pData, wDataSize); return true; } return true; } //发送某人的房间的状态 bool CAttemperEngineSink::OnUpdataBodyOtherRoom(VOID * pData, WORD wDataSize) { JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomListBig)); //效验参数 if (wDataSize != sizeof(JN_GR_RoomListBig)) return false; if (pUserChat->dwInsert_UpData_Del == 0) { CWHDataLocker DataLocker(m_CriticalSection); m_PrivateRoomAll[pUserChat->dwRoomNumber] = *pUserChat; } else if (pUserChat->dwInsert_UpData_Del == 2) { CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(pUserChat->dwRoomNumber); if (iter != m_PrivateRoomAll.end()) { m_PrivateRoomAll.erase(iter); } } else if ((pUserChat->dwInsert_UpData_Del == 1)) { CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(pUserChat->dwRoomNumber); if (iter != m_PrivateRoomAll.end()) { m_PrivateRoomAll[pUserChat->dwRoomNumber] = *pUserChat; } //删除俱乐部更新房间类型 if (0 == pUserChat->tmp6[0]) { CString PrivateTableID; PrivateTableID.Format(_T("%d"), pUserChat->dwRoomNumber); std::shared_ptr pTableFrame = GetPriTableFrame(PrivateTableID.GetBuffer(0)); if (pTableFrame)pTableFrame->SetTableKind(pUserChat->roomType); } } //广播给当前服务器中该俱乐部玩家 if (pUserChat->roomType == 1 && pUserChat->tmp6[0]) { CMD_GR_Table_Notify tableNotify; ZeroMemory(&tableNotify, sizeof(tableNotify)); tableNotify.type = pUserChat->dwInsert_UpData_Del; tableNotify.tableID = pUserChat->dwRoomNumber; tableNotify.clubID = pUserChat->tmp6[0]; //遍历查找 WORD wUserIndex = 0; while (true) { IServerUserItem* pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); if (pIServerUserItemSend == NULL) break; for (int i = 0; i < 20; i++) { if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == pUserChat->tmp6[0]) { tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex()); //发送数据 if (pBindParameter != NULL) { Club::PB_CS_S_Table_Notify Notify; Notify.set_clubid(tableNotify.clubID); Notify.set_tableid(tableNotify.tableID); Notify.set_type(tableNotify.type); //发送数据 std::string pbdata = Notify.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_CLUBTABLE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length()); break; } } } } } return true; } //更新我拥有的房间状态值 bool CAttemperEngineSink::UpdataMyOwnRoom(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataMyOwnRoom"), TraceLevel_Debug); //变量定义 JN_GR_RoomList * pUserChat = (JN_GR_RoomList *)pData; //效验参数 ASSERT(wDataSize == sizeof(JN_GR_RoomList)); //效验参数 if (wDataSize != sizeof(JN_GR_RoomList)) return false; //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_S_RoomList RoomList; RoomList.set_dwuserid(pUserChat->dwUserID); RoomList.set_dwserverid(pUserChat->dwServerID); RoomList.set_dwroomnumber(pUserChat->dwRoomNumber); RoomList.set_dwinsert_updata_del(pUserChat->dwInsert_UpData_Del); RoomList.set_dwdifen(pUserChat->dwDiFen); RoomList.set_dwjushu(pUserChat->dwJuShu); RoomList.set_dwreadybody(pUserChat->dwReadyBody); RoomList.set_dwbody(pUserChat->dwBody); RoomList.set_bwanfa(pUserChat->bWanFa); std::string szIp = CW2AEX<1024>(pUserChat->szIp, CP_UTF8).m_psz; RoomList.set_szip(szIp); RoomList.set_bduolai(pUserChat->bDuoLai); RoomList.set_wfengding(pUserChat->wFengDing); RoomList.set_tmp1(pUserChat->tmp1); RoomList.set_tmp2(pUserChat->tmp2); RoomList.set_tmp3(pUserChat->tmp3); RoomList.set_tmp4(pUserChat->tmp4); RoomList.set_tmp5(pUserChat->tmp5); for (WORD i = 0; i < 4; i++) { RoomList.add_tmp6(pUserChat->tmp6[i]); } RoomList.set_wport(pUserChat->wPort); //发送数据 std::string pbdata = RoomList.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_MYROOM_UPDATA, (void*)pbdata.c_str(), pbdata.length()); return true; } //更新房间局数 bool CAttemperEngineSink::UpdataTableJushu(DWORD PrivateTableID,DWORD CurrrentJushu) { CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataTableJushu"), TraceLevel_Debug); CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(PrivateTableID); if (iter != m_PrivateRoomAll.end()) { JN_GR_RoomListBig temp; temp = iter->second; if (temp.tmp6[0] != 0 && temp.roomType == 1) { temp.dwInsert_UpData_Del = 1; temp.currentjushu = CurrrentJushu; //上报给协调 UpdataBodyOwnRoomToServer(&temp, sizeof(temp)); //通知用户刷新界面 CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = temp.tmp6[0]; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } } return true; } //用户聊天 bool CAttemperEngineSink::OnTCPNetworkSubUserChat(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //变量定义 CMD_GR_C_UserChat * pUserChat = (CMD_GR_C_UserChat *)pData; //效验参数 ASSERT(wDataSize <= sizeof(CMD_GR_C_UserChat)); ASSERT(wDataSize >= (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString))); ASSERT(wDataSize == (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength * sizeof(pUserChat->szChatString[0]))); //效验参数 if (wDataSize > sizeof(CMD_GR_C_UserChat)) return false; if (wDataSize < (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString))) return false; if (wDataSize != (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength * sizeof(pUserChat->szChatString[0]))) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pISendUserItem != NULL); if (pISendUserItem == NULL) return false; if (pUserChat->dwTargetUserID != 0) { IServerUserItem* pIRecvUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwTargetUserID); if (pIRecvUserItem == NULL) return true; } //状态判断 if ((CServerRule::IsForfendRoomChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户大厅聊天!"), 0); return true; } //权限判断 if (CUserRight::CanRoomChat(pISendUserItem->GetUserRight()) == false) { //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT); SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), 0); return true; } //权限判断 if (pUserChat->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 || CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false)) { return false; } //构造消息 CMD_GR_S_UserChat UserChat; ZeroMemory(&UserChat, sizeof(UserChat)); //字符过滤 SensitiveWordFilter(pUserChat->szChatString, UserChat.szChatString, CountArray(UserChat.szChatString)); //构造数据 UserChat.dwChatColor = pUserChat->dwChatColor; UserChat.wChatLength = pUserChat->wChatLength; UserChat.dwSendUserID = pUserChat->dwSendUserID; UserChat.dwTargetUserID = pUserChat->dwTargetUserID; UserChat.wChatLength = CountStringBuffer(UserChat.szChatString); //转发消息 WORD wHeadSize = sizeof(UserChat) - sizeof(UserChat.szChatString); SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_CHAT, &UserChat, wHeadSize + UserChat.wChatLength * sizeof(UserChat.szChatString[0])); return true; } //用户表情 bool CAttemperEngineSink::OnTCPNetworkSubUserExpression(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_C_UserExpression)); if (wDataSize != sizeof(CMD_GR_C_UserExpression)) return false; //变量定义 CMD_GR_C_UserExpression * pUserExpression = (CMD_GR_C_UserExpression *)pData; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pISendUserItem != NULL); if (pISendUserItem == NULL) return false; //寻找用户 if (pUserExpression->dwTargetUserID != 0) { IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pUserExpression->dwTargetUserID); if (pIRecvUserItem == NULL) return true; } //状态判断 if ((CServerRule::IsForfendRoomChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户大厅聊天!"), 0); return true; } //权限判断 if (CUserRight::CanRoomChat(pISendUserItem->GetUserRight()) == false) { //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT); SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), 0); return true; } //权限判断 if (pUserExpression->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 || CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false)) { return false; } //构造消息 CMD_GR_S_UserExpression UserExpression; ZeroMemory(&UserExpression, sizeof(UserExpression)); //构造数据 UserExpression.wItemIndex = pUserExpression->wItemIndex; UserExpression.dwSendUserID = pUserExpression->dwSendUserID; UserExpression.dwTargetUserID = pUserExpression->dwTargetUserID; //转发消息 SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_EXPRESSION, &UserExpression, sizeof(UserExpression)); return true; } //用户私聊 bool CAttemperEngineSink::OnTCPNetworkSubWisperChat(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //变量定义 CMD_GR_C_WisperChat * pWisperChat = (CMD_GR_C_WisperChat *)pData; //效验参数 ASSERT(wDataSize >= (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString))); ASSERT(wDataSize == (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString) + pWisperChat->wChatLength * sizeof(pWisperChat->szChatString[0]))); //效验参数 if (wDataSize < (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString))) return false; if (wDataSize != (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString) + pWisperChat->wChatLength * sizeof(pWisperChat->szChatString[0]))) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pISendUserItem != NULL); if (pISendUserItem == NULL) return false; //寻找用户 IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pWisperChat->dwTargetUserID); if (pIRecvUserItem == NULL) return true; //状态判断 if ((CServerRule::IsForfendWisperChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户私聊!"), 0); return true; } //同桌判断 if ((CServerRule::IsForfendWisperOnGame(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { //变量定义 bool bForfend = true; WORD wTableIDSend = pISendUserItem->GetTableID(); WORD wTableIDRecv = pIRecvUserItem->GetTableID(); //规则判断 if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false; if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false; if ((bForfend == true) && (pISendUserItem->GetUserStatus() != US_PLAYING)) bForfend = false; if ((bForfend == true) && (pIRecvUserItem->GetUserStatus() != US_PLAYING)) bForfend = false; if ((bForfend == true) && ((wTableIDSend == INVALID_TABLE) || (wTableIDSend != wTableIDRecv))) bForfend = false; //提示消息 if (bForfend == true) { SendRequestFailure(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), 0); //SendRoomMessage(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), SMT_EJECT | SMT_CHAT); return true; } } //权限判断 if (CUserRight::CanWisper(pISendUserItem->GetUserRight()) == false) { SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), 0); //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT); return true; } //权限判断 if (pWisperChat->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 || CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false)) { return false; } //变量定义 CMD_GR_S_WisperChat WisperChat; ZeroMemory(&WisperChat, sizeof(WisperChat)); //字符过滤 SensitiveWordFilter(pWisperChat->szChatString, WisperChat.szChatString, CountArray(WisperChat.szChatString)); //构造数据 WisperChat.dwChatColor = pWisperChat->dwChatColor; WisperChat.wChatLength = pWisperChat->wChatLength; WisperChat.dwSendUserID = pISendUserItem->GetUserID(); WisperChat.dwTargetUserID = pIRecvUserItem->GetUserID(); WisperChat.wChatLength = CountStringBuffer(WisperChat.szChatString); //转发消息 WORD wHeadSize = sizeof(WisperChat) - sizeof(WisperChat.szChatString); SendData(pISendUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0])); //转发消息 WisperChat.dwSendUserID = pWisperChat->dwSendUserID; SendData(pIRecvUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0])); //机器判断 if (pIRecvUserItem->IsAndroidUser() == true) { //枚举用户 WORD wEnumIndex = 0; IServerUserItem * pTempServerUserItem; do { pTempServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); if (pTempServerUserItem != NULL) { if (pTempServerUserItem == pISendUserItem) continue; if (pTempServerUserItem == pIRecvUserItem) continue; if (pTempServerUserItem->GetMasterOrder() > 0 && CMasterRight::CanManagerAndroid(pTempServerUserItem->GetMasterRight()) == true) { SendData(pTempServerUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0])); } } } while (pTempServerUserItem != NULL); } return true; } //用户表情 bool CAttemperEngineSink::OnTCPNetworkSubWisperExpression(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_C_WisperExpression)); if (wDataSize != sizeof(CMD_GR_C_WisperExpression)) return false; //变量定义 CMD_GR_C_WisperExpression * pWisperExpression = (CMD_GR_C_WisperExpression *)pData; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pISendUserItem != NULL); if (pISendUserItem == NULL) return false; //寻找用户 IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pWisperExpression->dwTargetUserID); if (pIRecvUserItem == NULL) return true; //状态判断 if ((CServerRule::IsForfendWisperChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户私聊!"), 0); return true; } //同桌判断 if ((CServerRule::IsForfendWisperOnGame(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0)) { //变量定义 bool bForfend = true; WORD wTableIDSend = pISendUserItem->GetTableID(); WORD wTableIDRecv = pIRecvUserItem->GetTableID(); //规则判断 if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false; if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false; if ((bForfend == true) && (pISendUserItem->GetUserStatus() != US_PLAYING)) bForfend = false; if ((bForfend == true) && (pIRecvUserItem->GetUserStatus() != US_PLAYING)) bForfend = false; if ((bForfend == true) && ((wTableIDSend == INVALID_TABLE) || (wTableIDSend != wTableIDRecv))) bForfend = false; //提示消息 if (bForfend == true) { SendRequestFailure(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), 0); //SendRoomMessage(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), SMT_EJECT | SMT_CHAT); return true; } } //权限判断 if (CUserRight::CanWisper(pISendUserItem->GetUserRight()) == false) { SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), 0); //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT); return true; } //权限判断 if (pWisperExpression->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 || CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false)) { return false; } //变量定义 CMD_GR_S_WisperExpression WisperExpression; ZeroMemory(&WisperExpression, sizeof(WisperExpression)); //构造数据 WisperExpression.wItemIndex = pWisperExpression->wItemIndex; WisperExpression.dwSendUserID = pISendUserItem->GetUserID(); WisperExpression.dwTargetUserID = pWisperExpression->dwTargetUserID; //转发消息 SendData(pISendUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression)); //转发消息 WisperExpression.dwSendUserID = pWisperExpression->dwSendUserID; SendData(pIRecvUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression)); //机器判断 if (pIRecvUserItem->IsAndroidUser() == true) { //枚举用户 WORD wEnumIndex = 0; IServerUserItem * pTempServerUserItem; do { pTempServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); if (pTempServerUserItem != NULL) { if (pTempServerUserItem == pISendUserItem) continue; if (pTempServerUserItem == pIRecvUserItem) continue; if (pTempServerUserItem->GetMasterOrder() > 0) { SendData(pTempServerUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression)); } } } while (pTempServerUserItem != NULL); } return true; } //购买道具 //bool CAttemperEngineSink::OnTCPNetworkSubPropertyBuy(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //事件处理 // int cbResult = OnPropertyBuy(pData, wDataSize, dwSocketID); // // //结果判断 // if (cbResult == RESULT_ERROR) return false; // if (cbResult == RESULT_FAIL) return true; // if (cbResult == RESULT_SUCCESS) return true; // // return true; //} //购买道具 //int CAttemperEngineSink::OnPropertyBuy(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_PropertyBuy)); // if (wDataSize != sizeof(CMD_GR_C_PropertyBuy)) return RESULT_ERROR; // // //变量定义 // CMD_GR_C_PropertyBuy * pPropertyBuy = (CMD_GR_C_PropertyBuy *)pData; // // //数据效验 // ASSERT(pPropertyBuy->wItemCount > 0); // if (pPropertyBuy->wItemCount == 0) return RESULT_ERROR; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return RESULT_ERROR; // // //目标用户 // IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pPropertyBuy->dwTargetUserID); // if (pITargerUserItem == NULL) return RESULT_ERROR; // // //比赛房间 // if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) // { // //发送消息 // SendPropertyFailure(pIServerUserItem, TEXT("比赛房间不可以使用此功能!"), 0L, pPropertyBuy->cbRequestArea); // // return RESULT_FAIL; // } // // //练习房间 // if (m_pGameServiceOption->wServerType == GAME_GENRE_EDUCATE) // { // SendPropertyFailure(pIServerUserItem, TEXT("练习房间不可以使用此功能!"), 0L, pPropertyBuy->cbRequestArea); // return RESULT_FAIL; // } // // //购前事件 // if (OnEventPropertyBuyPrep(pPropertyBuy->cbRequestArea, pPropertyBuy->wPropertyIndex, pIServerUserItem, pITargerUserItem) == false) // return RESULT_FAIL; // // //变量定义 // DBR_GR_PropertyRequest PropertyRequest; // ZeroMemory(&PropertyRequest, sizeof(PropertyRequest)); // // //查找道具 // tagPropertyInfo * pPropertyInfo = m_GamePropertyManager.SearchPropertyItem(pPropertyBuy->wPropertyIndex); // if (pPropertyInfo == NULL) // { // SendPropertyFailure(pIServerUserItem, TEXT("您购买的道具不存在或在维护中,请与管理员联系!"), 0L, pPropertyBuy->cbRequestArea); // return RESULT_FAIL; // } // // //消费方式 // if (pPropertyBuy->cbConsumeScore == TRUE) // { // //房间判断 // ASSERT((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) != 0); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return RESULT_FAIL; // // //锁定计算 // PropertyRequest.cbConsumeScore = TRUE; // PropertyRequest.lFrozenedScore = pPropertyInfo->lPropertyGold*pPropertyBuy->wItemCount; // // //会员折扣 // if (pIServerUserItem->GetMemberOrder() > 0) // { // PropertyRequest.lFrozenedScore = PropertyRequest.lFrozenedScore*pPropertyInfo->wDiscount / 100L; // } // // //锁定积分 // if (pIServerUserItem->FrozenedUserScore(PropertyRequest.lFrozenedScore) == false) // { // SendPropertyFailure(pIServerUserItem, TEXT("您的游戏币余额不足,道具购买失败!"), 0L, pPropertyBuy->cbRequestArea); // return RESULT_FAIL; // } // } // else // { // //银行扣费 // PropertyRequest.lFrozenedScore = 0L; // PropertyRequest.cbConsumeScore = FALSE; // // //变量定义 // SCORE lInsure = pIServerUserItem->GetUserInsure(); // SCORE lConsumeScore = pPropertyInfo->lPropertyGold*pPropertyBuy->wItemCount; // // //会员折扣 // if (pIServerUserItem->GetMemberOrder() > 0) // { // lConsumeScore = lConsumeScore*pPropertyInfo->wDiscount / 100L; // } // // //银行校验 // if (lInsure < lConsumeScore) // { // SendPropertyFailure(pIServerUserItem, TEXT("您的银行余额不足,请存款后再次购买!"), 0L, pPropertyBuy->cbRequestArea); // return RESULT_FAIL; // } // } // // //购买信息 // PropertyRequest.cbRequestArea = pPropertyBuy->cbRequestArea; // PropertyRequest.wItemCount = pPropertyBuy->wItemCount; // PropertyRequest.wPropertyIndex = pPropertyBuy->wPropertyIndex; // PropertyRequest.dwSourceUserID = pIServerUserItem->GetUserID(); // PropertyRequest.dwTargetUserID = pITargerUserItem->GetUserID(); // // //设置权限 // if (PropertyRequest.wPropertyIndex == PROPERTY_ID_VIPROOM_CARD) // PropertyRequest.dwUserRight |= UR_GAME_KICK_OUT_USER | UR_GAME_ENTER_VIP_ROOM; // else if (PropertyRequest.wPropertyIndex >= PROPERTY_ID_BLUERING_CARD && PropertyRequest.wPropertyIndex <= PROPERTY_ID_REDRING_CARD) // PropertyRequest.dwUserRight |= UR_GAME_KICK_OUT_USER; // else // PropertyRequest.dwUserRight = 0; // // //系统信息 // PropertyRequest.wTableID = INVALID_TABLE; // PropertyRequest.dwInoutIndex = pIServerUserItem->GetInoutIndex(); // PropertyRequest.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(PropertyRequest.szMachineID, pIServerUserItem->GetMachineID(), CountArray(PropertyRequest.szMachineID)); // // //投递数据 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_PROPERTY_REQUEST, dwSocketID, &PropertyRequest, sizeof(PropertyRequest)); // // return RESULT_SUCCESS; //} //使用道具 //bool CAttemperEngineSink::OnTCPNetwordSubSendTrumpet(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_SendTrumpet)); // if (wDataSize != sizeof(CMD_GR_C_SendTrumpet)) return false; // // //变量定义 // CMD_GR_C_SendTrumpet * pSendTrumpet = (CMD_GR_C_SendTrumpet *)pData; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // if (pIServerUserItem == NULL) return false; // // //构造结构 // CMD_GR_C_PropertyBuy PropertyBuy; // PropertyBuy.cbRequestArea = pSendTrumpet->cbRequestArea; // PropertyBuy.dwTargetUserID = pIServerUserItem->GetUserID(); // PropertyBuy.wPropertyIndex = pSendTrumpet->wPropertyIndex; // PropertyBuy.cbConsumeScore = FALSE; // PropertyBuy.wItemCount = 1; // // //购买 // int cbResult = OnPropertyBuy((void *)&PropertyBuy, sizeof(PropertyBuy), dwSocketID); // // //结果判断 // if (cbResult == RESULT_ERROR) return false; // if (cbResult != RESULT_SUCCESS) return true; // // //获取道具 // //tagUserProperty * pUserProperty = pIServerUserItem->GetUserProperty(); // // //道具索引 // BYTE cbIndex = (pSendTrumpet->wPropertyIndex == PROPERTY_ID_TRUMPET) ? 2 : 3; // // //构造结构 // CMD_GR_S_SendTrumpet SendTrumpet; // SendTrumpet.dwSendUserID = pIServerUserItem->GetUserID(); // SendTrumpet.wPropertyIndex = pSendTrumpet->wPropertyIndex; // SendTrumpet.TrumpetColor = pSendTrumpet->TrumpetColor; // ZeroMemory(SendTrumpet.szTrumpetContent, sizeof(SendTrumpet.szTrumpetContent)); // CopyMemory(SendTrumpet.szSendNickName, pIServerUserItem->GetNickName(), sizeof(SendTrumpet.szSendNickName)); // // //字符过滤 // SensitiveWordFilter(pSendTrumpet->szTrumpetContent, SendTrumpet.szTrumpetContent, CountArray(SendTrumpet.szTrumpetContent)); // // //房间转发 // if (cbIndex == 3) // { // //广播房间 // CMD_CS_S_SendTrumpet * pInfo = (CMD_CS_S_SendTrumpet *)&SendTrumpet; // if (m_pITCPSocketService) // { // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pat = GetTableFrame(pIServerUserItem->GetTableID()); // // TCHAR szTemp[32] = { 0 }; // if (pat) pat->GetPrivateTableID(szTemp, 32); // CString csTemp = szTemp; // // /*if (pat != nullptr && !csTemp.IsEmpty()) // { // DWORD dTableNum = _wtol(szTemp); // }*/ // } // m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_PROPERTY_TRUMPET, pInfo, sizeof(CMD_CS_S_SendTrumpet)/*, dTableNum, pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); // } // } // // //游戏转发 // if (cbIndex == 2) // { // //DWORD dTableNum = 0; // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pat = GetTableFrame(pIServerUserItem->GetTableID()); // // TCHAR szTemp[32] = { 0 }; // if (pat) pat->GetPrivateTableID(szTemp, 32); // CString csTemp = szTemp; // // /*if (pat != nullptr && !csTemp.IsEmpty()) // { // dTableNum = _wtol(szTemp); // }*/ // } // // CString csSend; // CString csTest = AfxGetAppName(); // // csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET); // //OutputDebugString(csSend); // Commend::ToShow(this, MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, &SendTrumpet, sizeof(SendTrumpet), 0, 0, m_pIGameServiceManager->GetDataString()); // // //发送数据 // m_pITCPNetworkEngine->SendDataBatch(MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, &SendTrumpet, sizeof(SendTrumpet), BG_COMPUTER); // } // // return true; //} //邀请用户 //bool CAttemperEngineSink::OnTCPNetworkSubUserInviteReq(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // UserInfo::PB_CS_C_UserInviteReq InviteReq; // InviteReq.ParseFromArray(pData, wDataSize); // // //处理消息 // CMD_GR_UserInviteReq pUserInviteReq; // ZeroMemory(&pUserInviteReq, sizeof(pUserInviteReq)); // pUserInviteReq.wTableID = InviteReq.wtableid(); // pUserInviteReq.dwUserID = InviteReq.dwuserid(); // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // if (pIServerUserItem == NULL) return false; // // //效验状态 // if (pUserInviteReq.wTableID == INVALID_TABLE) return true; // if (pIServerUserItem->GetTableID() != pUserInviteReq.wTableID) return true; // if (pIServerUserItem->GetUserStatus() == US_PLAYING) return true; // if (pIServerUserItem->GetUserStatus() == US_OFFLINE) return true; // // //目标用户 // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pUserInviteReq.dwUserID); // if (pITargetUserItem == NULL) return true; // if (pITargetUserItem->GetUserStatus() == US_PLAYING) return true; // // UserInfo::PB_CS_S_UserInvite Invite; // Invite.set_wtableid(pUserInviteReq.wTableID); // Invite.set_dwuserid(pIServerUserItem->GetUserID()); // //发送数据 // std::string pbdata = Invite.SerializePartialAsString(); // // SendData(pITargetUserItem, MDM_GR_USER, SUB_GR_USER_INVITE, (void*)pbdata.c_str(), pbdata.length()); // return true; //} ////拒绝厌友 //bool CAttemperEngineSink::OnTCPNetworkSubUserRepulseSit(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // UserInfo::PB_CS_C_UserRepulseSit RepulseSit; // RepulseSit.ParseFromArray(pData, wDataSize); // // //处理消息 // CMD_GR_UserRepulseSit pUserRepulseSit; // ZeroMemory(&pUserRepulseSit, sizeof(pUserRepulseSit)); // pUserRepulseSit.wTableID = RepulseSit.wtableid(); // pUserRepulseSit.wChairID = RepulseSit.wchairid(); // pUserRepulseSit.dwUserID = RepulseSit.dwuserid(); // pUserRepulseSit.dwRepulseUserID = RepulseSit.dwrepulseuserid(); // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // if (pIServerUserItem == NULL) return false; // // //获取桌子 // auto pTableFrame = GetTableFrame(pUserRepulseSit.wTableID); // if (!pTableFrame) // return false; // if (pTableFrame->IsGameStarted() == true) return true; // // //获取用户 // IServerUserItem * pRepulseIServerUserItem = pTableFrame->GetTableUserItem(pUserRepulseSit.wChairID); // if (pRepulseIServerUserItem == NULL) return true; // if (pRepulseIServerUserItem->GetUserID() != pUserRepulseSit.dwRepulseUserID)return true; // // //发送消息 // TCHAR szDescribe[256] = TEXT(""); // lstrcpyn(szDescribe, TEXT("此桌有玩家设置了不与您同桌游戏!"), CountArray(szDescribe)); // SendRoomMessage(pRepulseIServerUserItem, szDescribe, SMT_TABLE_EXIT); // // //弹起玩家 // pTableFrame->PerformStandUpAction(pRepulseIServerUserItem); // // return true; //} // ////踢出命令 //bool CAttemperEngineSink::OnTCPNetworkSubMemberKickUser(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // UserInfo::PB_CS_C_KickUser Kick; // Kick.ParseFromArray(pData, wDataSize); // // //处理消息 // CMD_GR_KickUser pKickUser; // ZeroMemory(&pKickUser, sizeof(pKickUser)); // pKickUser.dwTargetUserID = Kick.dwtargetuserid(); // // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //目标用户 // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pKickUser.dwTargetUserID); // if (pITargetUserItem == NULL) return true; // // //用户效验 // ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMemberOrder() > pITargetUserItem->GetMemberOrder())); // if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMemberOrder() <= pITargetUserItem->GetMemberOrder())) return false; // // //权限判断 // ASSERT(CUserRight::CanKillOutUser(pIServerUserItem->GetUserRight()) == true); // if (CUserRight::CanKillOutUser(pIServerUserItem->GetUserRight()) == false) return false; // // //禁踢管理员 // if (pITargetUserItem->GetMasterOrder() > 0) // { // //发送消息 // SendRequestFailure(pIServerUserItem, TEXT("很抱歉,踢出管理员是不被允许的!"), 0); // return true; // } // // //百人游戏 // if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR) // { // //发送消息 // SendRequestFailure(pIServerUserItem, TEXT("很抱歉,百人游戏不许踢人!"), 0); // return true; // } // // //用户状态 // if (pITargetUserItem->GetUserStatus() == US_PLAYING) // { // //变量定义 // TCHAR szMessage[256] = TEXT(""); // _sntprintf(szMessage, CountArray(szMessage), TEXT("由于玩家 [ %s ] 正在游戏中,您不能将它踢出游戏!"), pITargetUserItem->GetNickName()); // // //发送消息 // SendRequestFailure(pIServerUserItem, szMessage, 0); // return true; // } // // //防踢判断 // if ((pITargetUserItem->GetUserProperty()->wPropertyUseMark&PT_USE_MARK_GUARDKICK_CARD) != 0) // { // //变量定义 // DWORD dwCurrentTime = (DWORD)time(NULL); // tagUserProperty * pUserProperty = pITargetUserItem->GetUserProperty(); // // //时效判断 // DWORD dwValidTime = pUserProperty->PropertyInfo[2].wPropertyCount*pUserProperty->PropertyInfo[2].dwValidNum; // if (pUserProperty->PropertyInfo[2].dwEffectTime + dwValidTime > dwCurrentTime) // { // //变量定义 // TCHAR szMessage[256] = TEXT(""); // _sntprintf(szMessage, CountArray(szMessage), TEXT("由于玩家 [ %s ] 正在使用防踢卡,您无法将它踢出游戏!"), pITargetUserItem->GetNickName()); // // //发送消息 // SendRequestFailure(pIServerUserItem, szMessage, 0); // // return true; // } // else // pUserProperty->wPropertyUseMark &= ~PT_USE_MARK_GUARDKICK_CARD; // } // // //请离桌子 // WORD wTargerTableID = pITargetUserItem->GetTableID(); // if (wTargerTableID != INVALID_TABLE) // { // //定义变量 // TCHAR szMessage[64] = TEXT(""); // _sntprintf(szMessage, CountArray(szMessage), TEXT("你已被%s请离桌子!"), pIServerUserItem->GetNickName()); // // //发送消息 // // SendGameMessage(pITargetUserItem, szMessage, SMT_TABLE_EXIT); // // auto pTableFrame = GetTableFrame(wTargerTableID); // if (!pTableFrame) // return false; // if (pTableFrame->PerformStandUpAction(pITargetUserItem) == false) return true; // } // // return true; //} //请求用户信息 bool CAttemperEngineSink::OnTCPNetworkSubUserInfoReq(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_C_UserInfoReq InfoReq; InfoReq.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_UserInfoReq pUserInfoReq; ZeroMemory(&pUserInfoReq, sizeof(pUserInfoReq)); pUserInfoReq.dwUserIDReq = InfoReq.dwuseridreq(); pUserInfoReq.wTablePos = InfoReq.wtablepos(); pIServerUserItem->SetMobileUserDeskPos(pUserInfoReq.wTablePos); //发送信息 SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, pUserInfoReq.dwUserIDReq); return true; } //请求更换位置 bool CAttemperEngineSink::OnTCPNetworkSubUserChairReq(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //用户状态 if (pIServerUserItem->GetUserStatus() == US_PLAYING) { //失败 SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), REQUEST_FAILURE_NORMAL); if (IsJC(1234)) { CString csTestB; csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserChairReq", pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->szPrivateTableID , pIServerUserItem->GetUserStatus()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } return true; } //动态加入 bool bDynamicJoin = true; if (m_pGameServiceAttrib->cbDynamicJoin == FALSE) bDynamicJoin = false; if (CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule) == false) bDynamicJoin = false; //查找桌子 INT nStartIndex = rand() % m_pGameServiceOption->wTableCount; for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++) { //定义变量 INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount; //过滤同桌 if (nTableIndex == pIServerUserItem->GetTableID())continue; //获取桌子 auto pTableFrame = GetTableFrame(nTableIndex); if (!pTableFrame) return false; if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue; if (pTableFrame->IsTableLocked()) continue; if (pTableFrame->GetChairCount() == pTableFrame->GetNullChairCount()) continue; //无效过滤 WORD wChairID = pTableFrame->GetRandNullChairID(); if (wChairID == INVALID_CHAIR) continue; //离开处理 if (pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pTableFrameTemp = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrameTemp) return false; if (pTableFrameTemp->PerformStandUpAction(pIServerUserItem) == false) return true; } //定义变量 WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos(); WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount(); //更新信息 if ((nTableIndex < wTagerDeskPos) || (nTableIndex > (wTagerDeskPos + wTagerDeskCount - 1))) { WORD wNewPos = (nTableIndex / wTagerDeskCount)*wTagerDeskCount; pIServerUserItem->SetMobileUserDeskPos(wNewPos); } //用户坐下 pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem); return true; } //查找桌子 nStartIndex = rand() % m_pGameServiceOption->wTableCount; for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++) { //定义变量 INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount; //过滤同桌 if (nTableIndex == pIServerUserItem->GetTableID())continue; //获取桌子 auto pTableFrame = GetTableFrame(nTableIndex); if (!pTableFrame) return false; if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue; if (pTableFrame->IsTableLocked()) continue; //无效过滤 WORD wChairID = pTableFrame->GetRandNullChairID(); if (wChairID == INVALID_CHAIR) continue; //离开处理 if (pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pTableFrameTemp = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrameTemp) return false; if (pTableFrameTemp->PerformStandUpAction(pIServerUserItem) == false) return true; } //定义变量 WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos(); WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount(); //更新信息 if ((nTableIndex < wTagerDeskPos) || (nTableIndex > (wTagerDeskPos + wTagerDeskCount - 1))) { WORD wNewPos = (nTableIndex / wTagerDeskCount)*wTagerDeskCount; pIServerUserItem->SetMobileUserDeskPos(wNewPos); } //用户坐下 pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem); return true; } //查找同桌 if (pIServerUserItem->GetTableID() != INVALID_TABLE) { //获取桌子 auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrame) return false; if (pTableFrame->IsGameStarted() == false && pTableFrame->IsTableLocked() == false) { //无效过滤 WORD wChairID = pTableFrame->GetRandNullChairID(); if (wChairID != INVALID_CHAIR) { //离开处理 if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true; //用户坐下 pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem); return true; } } } //失败 SendRequestFailure(pIServerUserItem, TEXT("没找到可进入的游戏桌!"), REQUEST_FAILURE_NORMAL); return true; } //请求椅子用户信息 bool CAttemperEngineSink::OnTCPNetworkSubChairUserInfoReq(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_C_ChairUserInfoReq InfoReq; InfoReq.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ChairUserInfoReq pUserInfoReq; ZeroMemory(&pUserInfoReq, sizeof(pUserInfoReq)); pUserInfoReq.wTableID = InfoReq.wtableid(); pUserInfoReq.wChairID = InfoReq.wchairid(); if (pUserInfoReq.wTableID == INVALID_TABLE) return true; //发送消息 auto pTableFrame = GetTableFrame(pUserInfoReq.wTableID); if (!pTableFrame) return false; WORD wChairCout = pTableFrame->GetChairCount(); for (WORD wIndex = 0; wIndex < wChairCout; wIndex++) { //获取用户 if (pUserInfoReq.wChairID != INVALID_CHAIR && wIndex != pUserInfoReq.wChairID)continue; IServerUserItem * pTagerIServerUserItem = pTableFrame->GetTableUserItem(wIndex); if (pTagerIServerUserItem == NULL)continue; if (pIServerUserItem == pTagerIServerUserItem) continue; //请求自己 //变量定义 tagMobileUserInfoHead pUserInfoHead; tagUserInfo *pUserInfo = pTagerIServerUserItem->GetUserInfo(); //用户属性 pUserInfoHead.wFaceID = pUserInfo->wFaceID; pUserInfoHead.dwGameID = pUserInfo->dwGameID; pUserInfoHead.dwUserID = pUserInfo->dwUserID; pUserInfoHead.dwCustomID = pUserInfo->dwCustomID; //用户属性 pUserInfoHead.cbGender = pUserInfo->cbGender; pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder; //用户状态 pUserInfoHead.wTableID = pUserInfo->wTableID; pUserInfoHead.wChairID = pUserInfo->wChairID; pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus; //用户局数 pUserInfoHead.dwWinCount = pUserInfo->dwWinCount; pUserInfoHead.dwLostCount = pUserInfo->dwLostCount; pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount; pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount; pUserInfoHead.dwExperience = pUserInfo->dwExperience; //用户成绩 pUserInfoHead.lScore = pUserInfo->lScore; pUserInfoHead.lScore += pTagerIServerUserItem->GetTrusteeScore(); pUserInfoHead.lScore += pTagerIServerUserItem->GetFrozenedScore(); lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName)); //用户头像地址 lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl)); //IP地址 pUserInfoHead.dwClientAddr = pTagerIServerUserItem->GetClientAddr(); pUserInfoHead.iJiePing = pUserInfo->llJiePing; pUserInfoHead.iXinYong = pUserInfo->iXinYong; pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX; pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY; lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate)); lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi)); UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead; UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID); UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID); UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID); UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID); UserInfoHead.set_cbgender(pUserInfoHead.cbGender); UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder); UserInfoHead.set_wtableid(pUserInfoHead.wTableID); UserInfoHead.set_wchairid(pUserInfoHead.wChairID); UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus); UserInfoHead.set_lscore(pUserInfoHead.lScore); UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount); UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount); UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount); UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount); UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience); std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz; std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz; std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz; UserInfoHead.set_sznickname(szNickname); UserInfoHead.set_szheadurl(szHeadUrl); UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr); UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong); UserInfoHead.set_rettime(RetTime); UserInfoHead.set_chengshi(ChengShi); UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX); UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY); UserInfoHead.set_ijieping(pUserInfoHead.iJiePing); //发送数据 std::string pbdata = UserInfoHead.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); } if (pTableFrame) pTableFrame->PerformLookonLogin(pIServerUserItem); return true; } //查询参数 //bool CAttemperEngineSink::OnTCPNetworkSubQueryExchangeInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //构造结构 // //CMD_GR_ExchangeParameter ExchangeParameter; // //ZeroMemory(&ExchangeParameter, sizeof(ExchangeParameter)); // // ////设置变量 // //ExchangeParameter.wExchangeRate = m_pGameParameter->wExchangeRate; // // //WORD wBindIndex = LOWORD(dwSocketID); // //IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex); // // ////计算大小 // //DWORD dTableNum = 0; // //if (pIBindUserItem && pIBindUserItem->GetTableID() != INVALID_TABLE) // //{ // // auto pat = GetTableFrame(pIBindUserItem->GetTableID()); // // TCHAR szTemp[32] = { 0 }; // // if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32); // // CString csTemp = szTemp; // // // if (!csTemp.IsEmpty()) // // { // // dTableNum = _wtol(szTemp); // // } // //} // // //CString csSend; // //CString csTest = AfxGetAppName(); // // //csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_RESULT); // ////OutputDebugString(csSend); // //Commend::ToShow(this, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, &ExchangeParameter, sizeof(CMD_GR_ExchangeParameter), 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()); // // ////发送数据 // //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, &ExchangeParameter, sizeof(CMD_GR_ExchangeParameter)); // // ///+++查询兑换配置列表(即:金币兑换商品列表) // /*m_pIRecordDataBaseEngine*/m_pIKernelDataBaseEngine->PostDataBaseRequest(DBO_GP_EXCHANGE_CONFIG_LIST, dwSocketID, NULL, 0); // // return true; //} // ////购买会员 //bool CAttemperEngineSink::OnTCPNetworkSubPurchaseMember(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_PurchaseMember)); // if (wDataSize != sizeof(CMD_GR_PurchaseMember)) return false; // // //构造结构 // CMD_GR_PurchaseMember * pPurchaseMember = (CMD_GR_PurchaseMember*)pData; // pPurchaseMember->szMachineID[CountArray(pPurchaseMember->szMachineID) - 1] = 0; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //构造结构 // DBR_GR_PurchaseMember PurchaseMember; // ZeroMemory(&PurchaseMember, sizeof(PurchaseMember)); // // //设置变量 // PurchaseMember.dwUserID = pPurchaseMember->dwUserID; // PurchaseMember.cbMemberOrder = pPurchaseMember->cbMemberOrder; // PurchaseMember.wPurchaseTime = pPurchaseMember->wPurchaseTime; // PurchaseMember.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(PurchaseMember.szMachineID, pPurchaseMember->szMachineID, CountArray(PurchaseMember.szMachineID)); // // CTraceService::TraceString(TEXT("购买会员已屏蔽 OnTCPNetworkSubPurchaseMember"), TraceLevel_Warning); // //投递请求 // //m_pIDBCorrespondManager->PostDataBaseRequest(PurchaseMember.dwUserID, DBR_GR_PURCHASE_MEMBER, dwSocketID, &PurchaseMember, sizeof(PurchaseMember)); // // return true; //} // ////兑换游戏币 //bool CAttemperEngineSink::OnTCPNetworkSubExchangeScore(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_ExchangeScore)); // if (wDataSize != sizeof(CMD_GR_ExchangeScore)) return false; // // //构造结构 // CMD_GR_ExchangeScore * pExchangeScore = (CMD_GR_ExchangeScore*)pData; // pExchangeScore->szMachineID[CountArray(pExchangeScore->szMachineID) - 1] = 0; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //构造结构 // DBR_GR_ExchangeScore ExchangeScore; // ZeroMemory(&ExchangeScore, sizeof(ExchangeScore)); // // //设置变量 // ExchangeScore.dwUserID = pExchangeScore->dwUserID; // //ExchangeScore.lExchangeIngot = pExchangeScore->lExchangeIngot; // ExchangeScore.dwExchangeID = pExchangeScore->dwExchangeID; //兑换ID // ExchangeScore.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(ExchangeScore.szMachineID, pExchangeScore->szMachineID, CountArray(ExchangeScore.szMachineID)); // CTraceService::TraceString(TEXT("兑换游戏币已屏蔽 DBR_GR_EXCHANGE_SCORE"), TraceLevel_Warning); // //投递请求 // //m_pIDBCorrespondManager->PostDataBaseRequest(ExchangeScore.dwUserID, DBR_GR_EXCHANGE_SCORE, dwSocketID, &ExchangeScore, sizeof(ExchangeScore)); // // return true; //} //俱乐部列表 bool CAttemperEngineSink::OnTCPNetworkSubGetClubList(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubList ClubLists; ClubLists.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubList pClubList; ZeroMemory(&pClubList, sizeof(pClubList)); pClubList.wStartIndex = ClubLists.wstartindex(); pClubList.wCount = ClubLists.wcount(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubList ClubList; ZeroMemory(&ClubList, sizeof(ClubList)); //设置变量 ClubList.dwUserID = pIServerUserItem->GetUserID(); ClubList.wStartIndex = pClubList.wStartIndex; ClubList.wCount = pClubList.wCount; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_LIST, dwSocketID, &ClubList, sizeof(ClubList)); } //俱乐部会员 bool CAttemperEngineSink::OnTCPNetworkSubGetClubUser(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //参数校验 ASSERT(wDataSize == sizeof(CMD_GR_ClubUser)); if (wDataSize != sizeof(CMD_GR_ClubUser)) return false; //构造结构 CMD_GR_ClubUser * pClubUser = (CMD_GR_ClubUser*)pData; if (pClubUser == NULL) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubUser ClubUser; ZeroMemory(&ClubUser, sizeof(ClubUser)); //设置变量 ClubUser.dwUserID = pIServerUserItem->GetUserID(); ClubUser.dwClubID = pClubUser->dwClubID; ClubUser.wStartIndex = pClubUser->wStartIndex; ClubUser.wCount = pClubUser->wCount; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER, dwSocketID, &ClubUser, sizeof(ClubUser)); } //俱乐部会员(在线) bool CAttemperEngineSink::OnTCPNetworkSubGetClubUserEx(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubUser User; User.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubUser pClubUser; ZeroMemory(&pClubUser, sizeof(pClubUser)); pClubUser.dwClubID = User.dwclubid(); pClubUser.wStartIndex = User.wstartindex(); pClubUser.wCount = User.wcount(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubUser ClubUser; ZeroMemory(&ClubUser, sizeof(ClubUser)); //设置变量 ClubUser.dwUserID = pIServerUserItem->GetUserID(); ClubUser.dwClubID = pClubUser.dwClubID; ClubUser.wStartIndex = pClubUser.wStartIndex; ClubUser.wCount = pClubUser.wCount; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER_EX, dwSocketID, &ClubUser, sizeof(ClubUser)); } //俱乐部消息 bool CAttemperEngineSink::OnTCPNetworkSubGetClubMessage(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubMessage Message; Message.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubMessage pClubMessage; ZeroMemory(&pClubMessage, sizeof(pClubMessage)); pClubMessage.wStartIndex = Message.wstartindex(); pClubMessage.wCount = Message.wcount(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubMessage ClubMessage; ZeroMemory(&ClubMessage, sizeof(ClubMessage)); //设置变量 ClubMessage.dwUserID = pIServerUserItem->GetUserID(); ClubMessage.wStartIndex = pClubMessage.wStartIndex; ClubMessage.wCount = pClubMessage.wCount; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MESSAGE, dwSocketID, &ClubMessage, sizeof(ClubMessage)); } //俱乐部记录 bool CAttemperEngineSink::OnTCPNetworkSubGetClubRecord(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubRecord Record; Record.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubRecord pClubRecord; ZeroMemory(&pClubRecord, sizeof(pClubRecord)); pClubRecord.dwClubID = Record.dwclubid(); pClubRecord.wStartIndex = Record.wstartindex(); pClubRecord.wCount = Record.wcount(); pClubRecord.dtStartTime = Record.dtstarttime(); pClubRecord.dwPrivatetable = Record.dwprivatetable(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubRecordRead ClubRecord; ZeroMemory(&ClubRecord, sizeof(ClubRecord)); //设置变量 ClubRecord.dwUserID = pIServerUserItem->GetUserID(); ClubRecord.dwClubID = pClubRecord.dwClubID; ClubRecord.wStartIndex = pClubRecord.wStartIndex; ClubRecord.wCount = pClubRecord.wCount; ClubRecord.dtStartTime = pClubRecord.dtStartTime; ClubRecord.dwPrivateTable = pClubRecord.dwPrivatetable; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_RECORD_EX, dwSocketID, &ClubRecord, sizeof(ClubRecord)); } //俱乐部创建 bool CAttemperEngineSink::OnTCPNetworkSubCreateClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { OutputDebugStringA("创建俱乐部"); Club::PB_CS_C_ClubInfo ClubInfo; ClubInfo.ParseFromArray(pData, wDataSize); CString szclubname = (CA2CTEX<2048>(ClubInfo.szclubname().c_str(), CP_UTF8)).m_szBuffer; CString szhostname = (CA2CTEX<2048>(ClubInfo.szhostname().c_str(), CP_UTF8)).m_szBuffer; CString szheadurl = (CA2CTEX<2048>(ClubInfo.szheadurl().c_str(), CP_UTF8)).m_szBuffer; CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.csgameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer; //处理消息 CMD_S_ClubInfo pClubInfo; ZeroMemory(&pClubInfo, sizeof(pClubInfo)); pClubInfo.dwClubID = ClubInfo.dwclubid(); _sntprintf(pClubInfo.szClubName, CountArray(pClubInfo.szClubName), TEXT("%s"), szclubname); pClubInfo.cbIsOwner = ClubInfo.cbisowner(); pClubInfo.wTotalNum = ClubInfo.wtotalnum(); pClubInfo.wWaitTableNum = ClubInfo.wwaittablenum(); pClubInfo.wOnLineNum = ClubInfo.wonlinenum(); pClubInfo.wWaitUserNum = ClubInfo.wwaitusernum(); pClubInfo.dwOwnerID = ClubInfo.dwownerid(); _sntprintf(pClubInfo.szHostName, CountArray(pClubInfo.szHostName), TEXT("%s"), szhostname); _sntprintf(pClubInfo.szHeadUrl, CountArray(pClubInfo.szHeadUrl), TEXT("%s"), szheadurl); pClubInfo.temp1 = ClubInfo.temp1(); pClubInfo.temp2 = ClubInfo.temp2(); pClubInfo.temp3 = ClubInfo.temp3(); pClubInfo.temp4 = ClubInfo.temp4(); pClubInfo.csGameConfig.wSubGameID = ClubInfo.csgameconfig().wsubgameid(); pClubInfo.csGameConfig.wPlayRule = ClubInfo.csgameconfig().wplayrule(); pClubInfo.csGameConfig.wMaxFanRule = ClubInfo.csgameconfig().wmaxfanrule(); pClubInfo.csGameConfig.wMaxScore = ClubInfo.csgameconfig().wmaxscore(); pClubInfo.csGameConfig.wPlayCountRule = ClubInfo.csgameconfig().wplaycountrule(); pClubInfo.csGameConfig.wHadPlayCount = ClubInfo.csgameconfig().whadplaycount(); pClubInfo.csGameConfig.zmExtraRule = ClubInfo.csgameconfig().zmextrarule(); pClubInfo.csGameConfig.dghRule = ClubInfo.csgameconfig().dghrule(); _sntprintf(pClubInfo.csGameConfig.sPrivateTableID, CountArray(pClubInfo.csGameConfig.sPrivateTableID), TEXT("%s"), sprivatetableid); pClubInfo.csGameConfig.bDuoLai = ClubInfo.csgameconfig().bduolai(); pClubInfo.csGameConfig.wFengDing = ClubInfo.csgameconfig().wfengding(); pClubInfo.csGameConfig.tmp1 = ClubInfo.csgameconfig().tmp1(); pClubInfo.csGameConfig.tmp2 = ClubInfo.csgameconfig().tmp2(); pClubInfo.csGameConfig.tmp3 = ClubInfo.csgameconfig().tmp3(); pClubInfo.csGameConfig.tmp4 = ClubInfo.csgameconfig().tmp4(); pClubInfo.csGameConfig.tmp5 = ClubInfo.csgameconfig().tmp5(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction1 ClubAction1; ZeroMemory(&ClubAction1, sizeof(ClubAction1)); ClubAction1.dwUserID = pIServerUserItem->GetUserID(); ClubAction1.ClubInfo = pClubInfo; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_CREATE, dwSocketID, &ClubAction1, sizeof(ClubAction1)); } //俱乐部修改 bool CAttemperEngineSink::OnTCPNetworkSubUpdateAddClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubAutoAddInfo ClubInfo; ClubInfo.ParseFromArray(pData, wDataSize); //处理消息 CMD_S_ClubAutoAddInfo pClubInfo; ZeroMemory(&pClubInfo, sizeof(pClubInfo)); pClubInfo.dwClubID = ClubInfo.dwclubid(); pClubInfo.cbWanfaId = ClubInfo.cbwanfaid(); pClubInfo.cbStatus = ClubInfo.cbstatus(); pClubInfo.gameconfig.wSubGameID = ClubInfo.gameconfig().wsubgameid(); pClubInfo.gameconfig.wPlayRule = ClubInfo.gameconfig().wplayrule(); pClubInfo.gameconfig.wMaxFanRule = ClubInfo.gameconfig().wmaxfanrule(); pClubInfo.gameconfig.wMaxScore = ClubInfo.gameconfig().wmaxscore(); pClubInfo.gameconfig.wPlayCountRule = ClubInfo.gameconfig().wplaycountrule(); pClubInfo.gameconfig.wHadPlayCount = ClubInfo.gameconfig().whadplaycount(); pClubInfo.gameconfig.zmExtraRule = ClubInfo.gameconfig().zmextrarule(); pClubInfo.gameconfig.dghRule = ClubInfo.gameconfig().dghrule(); CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.gameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer; _sntprintf(pClubInfo.gameconfig.sPrivateTableID, CountArray(pClubInfo.gameconfig.sPrivateTableID), TEXT("%s"), sprivatetableid); pClubInfo.gameconfig.bDuoLai = ClubInfo.gameconfig().bduolai(); pClubInfo.gameconfig.wFengDing = ClubInfo.gameconfig().wfengding(); pClubInfo.gameconfig.tmp1 = ClubInfo.gameconfig().tmp1(); pClubInfo.gameconfig.tmp2 = ClubInfo.gameconfig().tmp2(); pClubInfo.gameconfig.tmp3 = ClubInfo.gameconfig().tmp3(); pClubInfo.gameconfig.tmp4 = ClubInfo.gameconfig().tmp4(); pClubInfo.gameconfig.tmp5 = ClubInfo.gameconfig().tmp5(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAddAction ClubAction1; ZeroMemory(&ClubAction1, sizeof(ClubAction1)); ClubAction1.dwUserID = pIServerUserItem->GetUserID(); if (0 == pClubInfo.cbStatus) { //获取额外玩法 CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, (sizeof(CMD_S_ClubAutoAddInfo) - sizeof(tagTableConfig))); //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MORE_WANFA, dwSocketID, &ClubAction1, sizeof(DBR_GR_ClubAddAction)); } else { if (2 == pClubInfo.cbStatus) { CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, (sizeof(CMD_S_ClubAutoAddInfo) - sizeof(tagTableConfig))); } if (1 == pClubInfo.cbStatus) { CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, sizeof(CMD_S_ClubAutoAddInfo)); } } //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_SAVE_MORE_WANFA, dwSocketID, &ClubAction1, sizeof(DBR_GR_ClubAddAction)); } //俱乐部修改 bool CAttemperEngineSink::OnTCPNetworkSubUpdateClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubInfo ClubInfo; ClubInfo.ParseFromArray(pData, wDataSize); CString szclubname = (CA2CTEX<2048>(ClubInfo.szclubname().c_str(), CP_UTF8)).m_szBuffer; CString szhostname = (CA2CTEX<2048>(ClubInfo.szhostname().c_str(), CP_UTF8)).m_szBuffer; CString szheadurl = (CA2CTEX<2048>(ClubInfo.szheadurl().c_str(), CP_UTF8)).m_szBuffer; CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.csgameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer; //处理消息 CMD_S_ClubInfo pClubInfo; ZeroMemory(&pClubInfo, sizeof(pClubInfo)); pClubInfo.dwClubID = ClubInfo.dwclubid(); _sntprintf(pClubInfo.szClubName, CountArray(pClubInfo.szClubName), TEXT("%s"), szclubname); pClubInfo.cbIsOwner = ClubInfo.cbisowner(); pClubInfo.wTotalNum = ClubInfo.wtotalnum(); pClubInfo.wWaitTableNum = ClubInfo.wwaittablenum(); pClubInfo.wOnLineNum = ClubInfo.wonlinenum(); pClubInfo.wWaitUserNum = ClubInfo.wwaitusernum(); pClubInfo.dwOwnerID = ClubInfo.dwownerid(); _sntprintf(pClubInfo.szHostName, CountArray(pClubInfo.szHostName), TEXT("%s"), szhostname); _sntprintf(pClubInfo.szHeadUrl, CountArray(pClubInfo.szHeadUrl), TEXT("%s"), szheadurl); pClubInfo.temp1 = ClubInfo.temp1(); pClubInfo.temp2 = ClubInfo.temp2(); pClubInfo.temp3 = ClubInfo.temp3(); pClubInfo.temp4 = ClubInfo.temp4(); pClubInfo.csGameConfig.wSubGameID = ClubInfo.csgameconfig().wsubgameid(); pClubInfo.csGameConfig.wPlayRule = ClubInfo.csgameconfig().wplayrule(); pClubInfo.csGameConfig.wMaxFanRule = ClubInfo.csgameconfig().wmaxfanrule(); pClubInfo.csGameConfig.wMaxScore = ClubInfo.csgameconfig().wmaxscore(); pClubInfo.csGameConfig.wPlayCountRule = ClubInfo.csgameconfig().wplaycountrule(); pClubInfo.csGameConfig.wHadPlayCount = ClubInfo.csgameconfig().whadplaycount(); pClubInfo.csGameConfig.zmExtraRule = ClubInfo.csgameconfig().zmextrarule(); pClubInfo.csGameConfig.dghRule = ClubInfo.csgameconfig().dghrule(); _sntprintf(pClubInfo.csGameConfig.sPrivateTableID, CountArray(pClubInfo.csGameConfig.sPrivateTableID), TEXT("%s"), sprivatetableid); pClubInfo.csGameConfig.bDuoLai = ClubInfo.csgameconfig().bduolai(); pClubInfo.csGameConfig.wFengDing = ClubInfo.csgameconfig().wfengding(); pClubInfo.csGameConfig.tmp1 = ClubInfo.csgameconfig().tmp1(); pClubInfo.csGameConfig.tmp2 = ClubInfo.csgameconfig().tmp2(); pClubInfo.csGameConfig.tmp3 = ClubInfo.csgameconfig().tmp3(); pClubInfo.csGameConfig.tmp4 = ClubInfo.csgameconfig().tmp4(); pClubInfo.csGameConfig.tmp5 = ClubInfo.csgameconfig().tmp5(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction1 ClubAction1; ZeroMemory(&ClubAction1, sizeof(ClubAction1)); ClubAction1.dwUserID = pIServerUserItem->GetUserID(); ClubAction1.ClubInfo = pClubInfo; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_UPDATE, dwSocketID, &ClubAction1, sizeof(ClubAction1)); } //俱乐部删除 bool CAttemperEngineSink::OnTCPNetworkSubDeleteClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_Club_Action1 ClubAction; ClubAction.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Action1 pClubID; ZeroMemory(&pClubID, sizeof(pClubID)); pClubID.dwClubID = ClubAction.dwclubid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction2 ClubAction2; ZeroMemory(&ClubAction2, sizeof(ClubAction2)); ClubAction2.dwUserID = pIServerUserItem->GetUserID(); ClubAction2.dwClubID = pClubID.dwClubID; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_DELETE, dwSocketID, &ClubAction2, sizeof(ClubAction2)); } //俱乐部获取 bool CAttemperEngineSink::OnTCPNetworkSubGetClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_Club_Action1 ClubAction; ClubAction.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Action1 pClubID; ZeroMemory(&pClubID, sizeof(pClubID)); pClubID.dwClubID = ClubAction.dwclubid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction2 ClubAction2; ZeroMemory(&ClubAction2, sizeof(ClubAction2)); ClubAction2.dwUserID = pIServerUserItem->GetUserID(); ClubAction2.dwClubID = pClubID.dwClubID; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, dwSocketID, &ClubAction2, sizeof(ClubAction2)); } //俱乐部加入 bool CAttemperEngineSink::OnTCPNetworkSubJoinClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_Club_Action1 ClubAction; ClubAction.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Action1 pClubID; ZeroMemory(&pClubID, sizeof(pClubID)); pClubID.dwClubID = ClubAction.dwclubid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction2 ClubAction2; ZeroMemory(&ClubAction2, sizeof(ClubAction2)); ClubAction2.dwUserID = pIServerUserItem->GetUserID(); ClubAction2.dwClubID = pClubID.dwClubID; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_JOIN, dwSocketID, &ClubAction2, sizeof(ClubAction2)); } //俱乐部退出 bool CAttemperEngineSink::OnTCPNetworkSubQuitClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_Club_Action1 ClubAction; ClubAction.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Action1 pClubID; ZeroMemory(&pClubID, sizeof(pClubID)); pClubID.dwClubID = ClubAction.dwclubid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_ClubAction2 ClubAction2; ZeroMemory(&ClubAction2, sizeof(ClubAction2)); ClubAction2.dwUserID = pIServerUserItem->GetUserID(); ClubAction2.dwClubID = pClubID.dwClubID; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_QUIT, dwSocketID, &ClubAction2, sizeof(ClubAction2)); } //俱乐同意加入 bool CAttemperEngineSink::OnTCPNetworkSubAgreeClub(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_Club_Action2 ClubAction; ClubAction.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Action2 pAction2; ZeroMemory(&pAction2, sizeof(pAction2)); pAction2.dwClubID = ClubAction.dwclubid(); pAction2.dwUserID = ClubAction.dwuserid(); pAction2.cbIsAgree = ClubAction.cbisagree(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); DBR_GR_ClubAction3 ClubAction3; ZeroMemory(&ClubAction3, sizeof(ClubAction3)); ClubAction3.Agree = pAction2.cbIsAgree; ClubAction3.dwCurrentID = pIServerUserItem->GetUserID(); ClubAction3.dwClubID = pAction2.dwClubID; ClubAction3.dwUserID = pAction2.dwUserID; //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_ISAGREE, dwSocketID, &ClubAction3, sizeof(ClubAction3)); } //俱乐部在线信息 //bool CAttemperEngineSink::OnTCPNetworkSubGetClubOnLine(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_ClubOnLine)); // if (wDataSize != sizeof(CMD_GR_ClubOnLine)) return false; // // //构造结构 // CMD_GR_ClubOnLine * pClubOnLine = (CMD_GR_ClubOnLine*)pData; // if (pClubOnLine == NULL) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //构造数据 // DBR_GR_ClubOnLineRq ClubOnLine; // ZeroMemory(&ClubOnLine, sizeof(ClubOnLine)); // // ClubOnLine.dwUserID= pIServerUserItem->GetUserID(); // ClubOnLine.dwClubID = pClubOnLine->dwClubID; // ClubOnLine.wStartIndex = pClubOnLine->wStartIndex; // ClubOnLine.wCount = pClubOnLine->wCount; // // //投递请求 // return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_ONLINE, dwSocketID, &ClubOnLine, sizeof(DBR_GR_ClubOnLineRq)); //} //升序 bool LessSort(const JN_GR_RoomListBig a, const JN_GR_RoomListBig b){ return a.dwReadyBody ve; std::vector veGameing; std::vector veGame; JN_GR_RoomListBig Rooms; ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig)); std::unordered_map::iterator it2 = m_PrivateRoomAll.begin(); while (it2 != m_PrivateRoomAll.end()) { ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig)); Rooms = it2->second; if (Rooms.roomType == 1 && Rooms.tmp6[0] == pClubOnLine.dwClubID) { if (0 == Rooms.roomStatus) { veGame.push_back(Rooms); } else { veGameing.push_back(Rooms); } } it2++; } //合并 等待状态 和 游戏状态 ve.insert(ve.end(), veGame.begin(), veGame.end()); ve.insert(ve.end(), veGameing.begin(), veGameing.end()); CTimer Start; double dRet = Start.End(); if (IsJC(110)) { CString csTest; csTest.Format(_T("协议(3-437) 俱乐部房间排序 ----> %.3f wtotalTableNum=%d"), dRet, ClubOnLineAck.wtotalTableNum); //提示消息 CTraceService::TraceString(csTest, TraceLevel_Normal); } std::vector::iterator iter; for (iter = ve.begin(); iter != ve.end(); iter++) { ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig)); Rooms = *iter; //版本控制 TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); del_char(szMachineID, L'.'); __int64 iMachineID = StrToNmuber(szMachineID); //最低要求的版本号 TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 }; memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer)); del_char(szMinClientVer, L'.'); __int64 iMinClientVer = StrToNmuber(szMinClientVer); /*if (iMachineID < iMinClientVer && ((Rooms.bWanFa == 14 || Rooms.tmp1==2))) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("版本不匹配:用户ID不匹配[ RoomInfo.bDuoLai=%ld,RoomInfo.bWanFa=%ld,RoomInfo.wFengDing = %ld ]"), Rooms.bDuoLai, Rooms.bWanFa, Rooms.wFengDing); CTraceService::TraceString(szString, TraceLevel_Warning); continue; }*/ if (IsJC(110)) { CString csArr; csArr.Format(L"dwRoomNumber=%d ", Rooms.dwRoomNumber); CTraceService::TraceString(csArr, TraceLevel_Normal); } //全部 if (pClubOnLine.cbType == 0) { ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber; } //缺一人 if (pClubOnLine.cbType == 1 && Rooms.roomStatus == 0 && Rooms.dwBody - Rooms.dwReadyBody == 1) { ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber; } //等待中 if (pClubOnLine.cbType == 2 && Rooms.roomStatus == 0) { ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber; } //游戏中 if (pClubOnLine.cbType == 3 && Rooms.roomStatus == 1) { ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber; } //共同数据 if (Rooms.roomStatus == 0) { ClubOnLineAck.wWaitTableNum++; } if (Rooms.roomStatus == 1) { ClubOnLineAck.wPlayTableNmu++; } if (Rooms.roomStatus == 0 && Rooms.dwBody - Rooms.dwReadyBody == 1) { ClubOnLineAck.wQueTableNum++; } } } Club::PB_CS_S_ClubOnLine_AckEx ClubActionACK; ClubActionACK.set_dwclubid(ClubOnLineAck.dwClubID); ClubActionACK.set_wquetablenum(ClubOnLineAck.wQueTableNum); ClubActionACK.set_wwaittablenum(ClubOnLineAck.wWaitTableNum); ClubActionACK.set_wplaytablenmu(ClubOnLineAck.wPlayTableNmu); ClubActionACK.set_temp(ClubOnLineAck.temp); ClubActionACK.set_wtotaltablenum(ClubOnLineAck.wtotalTableNum); for (WORD i = 0; i < ClubOnLineAck.wtotalTableNum; i++) { ClubActionACK.add_tableid(ClubOnLineAck.tableID[i]); } //发送数据 std::string pbdata = ClubActionACK.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_ACK_EX, (void*)pbdata.c_str(), pbdata.length()); //触发向客户端更新桌子总数,在线人数,俱乐部总人数,新消息数(待优化) { DBR_GR_ClubAction2 clubAction2; ZeroMemory(&clubAction2, sizeof(clubAction2)); clubAction2.dwClubID = pClubOnLine.dwClubID; clubAction2.dwUserID = pIServerUserItem->GetUserID(); //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_ONLINEEX, dwSocketID, &clubAction2, sizeof(clubAction2)); } } //俱乐部在线桌子信息 bool CAttemperEngineSink::OnTCPNetworkSubGetClubTable(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubOnLineTable OnLineTable; OnLineTable.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubOnLineTable pClubOnLineTable; ZeroMemory(&pClubOnLineTable, sizeof(pClubOnLineTable)); pClubOnLineTable.dwClubID = OnLineTable.dwclubid(); pClubOnLineTable.dwTableID = OnLineTable.dwtableid(); pClubOnLineTable.cbType = OnLineTable.cbtype(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //获取桌子配置 if (pClubOnLineTable.cbType == 0) { //返回数据 CMD_GR_ClubOnLineTableCfAck ClubOnLineTableCfAck; ZeroMemory(&ClubOnLineTableCfAck, sizeof(ClubOnLineTableCfAck)); { CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(pClubOnLineTable.dwTableID); if (iter != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig)); Temp = iter->second; JN_GR_RoomListInfo RoomInfo; ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo)); RoomInfo.dwDiFen = Temp.dwDiFen; RoomInfo.dwJuShu = Temp.dwJuShu; RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay; RoomInfo.dwRoomNumber = Temp.dwRoomNumber; RoomInfo.dwServerID = Temp.dwServerID; RoomInfo.bFanGua = Temp.bFanGua; RoomInfo.bWanFa = Temp.bWanFa; RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以 RoomInfo.wFengDing = Temp.wFengDing; //封顶值 RoomInfo.tmp1 = Temp.tmp1; //备用字段 RoomInfo.tmp2 = Temp.tmp2; //备用字段 StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName); //房间名称 StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), Temp.szIp); //房间ip RoomInfo.wPort = Temp.wPort; //房间端口 CopyMemory(&(ClubOnLineTableCfAck.Room), &RoomInfo, sizeof(RoomInfo)); ClubOnLineTableCfAck.dwTableID = pClubOnLineTable.dwTableID; Club::PB_CS_S_ClubOnLineTableCfAck OnLineTableCfAck; OnLineTableCfAck.set_dwtableid(ClubOnLineTableCfAck.dwTableID); std::string szName = CW2AEX<1024>(ClubOnLineTableCfAck.Room.szName, CP_UTF8).m_psz; std::string szIp = CW2AEX<1024>(ClubOnLineTableCfAck.Room.szIp, CP_UTF8).m_psz; OnLineTableCfAck.mutable_room()->set_szname(szName); OnLineTableCfAck.mutable_room()->set_dwserverid(ClubOnLineTableCfAck.Room.dwServerID); OnLineTableCfAck.mutable_room()->set_szip(szIp); OnLineTableCfAck.mutable_room()->set_bduolai(ClubOnLineTableCfAck.Room.bDuoLai); OnLineTableCfAck.mutable_room()->set_wfengding(ClubOnLineTableCfAck.Room.wFengDing); OnLineTableCfAck.mutable_room()->set_tmp1(ClubOnLineTableCfAck.Room.tmp1); OnLineTableCfAck.mutable_room()->set_tmp2(ClubOnLineTableCfAck.Room.tmp2); for (WORD i = 0; i < 4; i++) { OnLineTableCfAck.mutable_room()->add_tmp6(ClubOnLineTableCfAck.Room.tmp6[i]); } OnLineTableCfAck.mutable_room()->set_wport(ClubOnLineTableCfAck.Room.wPort); OnLineTableCfAck.mutable_room()->set_dwroomnumber(ClubOnLineTableCfAck.Room.dwRoomNumber); OnLineTableCfAck.mutable_room()->set_dwdifen(ClubOnLineTableCfAck.Room.dwDiFen); OnLineTableCfAck.mutable_room()->set_dwjushu(ClubOnLineTableCfAck.Room.dwJuShu); OnLineTableCfAck.mutable_room()->set_broomcreatepay(ClubOnLineTableCfAck.Room.bRoomCreatePay); OnLineTableCfAck.mutable_room()->set_bfangua(ClubOnLineTableCfAck.Room.bFanGua); OnLineTableCfAck.mutable_room()->set_bwanfa(ClubOnLineTableCfAck.Room.bWanFa); OnLineTableCfAck.mutable_room()->set_tmp3(ClubOnLineTableCfAck.Room.tmp3); OnLineTableCfAck.mutable_room()->set_tmp4(ClubOnLineTableCfAck.Room.tmp4); OnLineTableCfAck.mutable_room()->set_tmp5(ClubOnLineTableCfAck.Room.tmp5); //发送数据 std::string pbdata = OnLineTableCfAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLE_ACK, (void*)pbdata.c_str(), pbdata.length()); } } } //桌子用户信息 if (pClubOnLineTable.cbType == 1) { CMD_GR_ClubOnLineTableAck OnLineTableAck; ZeroMemory(&OnLineTableAck, sizeof(OnLineTableAck)); { CWHDataLocker DataLocker(m_CriticalSection); auto iter = m_PrivateRoomAll.find(pClubOnLineTable.dwTableID); if (iter != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig)); Temp = iter->second; OnLineTableAck.dwTableID = pClubOnLineTable.dwTableID; OnLineTableAck.wJushu = Temp.currentjushu; OnLineTableAck.wTableState = Temp.roomStatus; //房主 OnLineTableAck.Userinfo[4].dwUserID = Temp.dwUserID; CopyMemory(OnLineTableAck.Userinfo[4].szName, Temp.szName, sizeof(Temp.szName)); CopyMemory(OnLineTableAck.Userinfo[4].szHeadUrl, Temp.szHeadUrl, sizeof(Temp.szHeadUrl)); // && 0 == Temp.roomStatus if (Temp.dwUserID == pIServerUserItem->GetUserID()&& 0 Temp.dwReadyBody) { TCHAR szString[512] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("userid=%d [%d]已经开始游戏,但检测少人了(%d>%d),当前局数:%d"), pIServerUserItem->GetUserID(),Temp.dwRoomNumber, Temp.dwBody, Temp.dwReadyBody, Temp.currentjushu); CTraceService::TraceString(szString, TraceLevel_Warning); bool bIsUserNull = false; for (int i = 0; i < Temp.dwBody; i++){ if (0 == Temp.player[i].dwUserID) { bIsUserNull = true; //将少人的数据补上 std::shared_ptr pTableFrame; CString csTest; csTest.Format(_T("%d"), Temp.dwRoomNumber); std::wstring str = csTest.GetBuffer(); csTest.ReleaseBuffer(); pTableFrame = GetPriTableFrame(str); if (pTableFrame){ IServerUserItem * pTagerIServerUserItem = pTableFrame->GetTableUserItem(i); if (pTagerIServerUserItem == NULL)continue; if (pIServerUserItem == pTagerIServerUserItem) continue; //请求自己 //变量定义 //tagMobileUserInfoHead pUserInfoHead; tagUserInfo *pUserInfo = pTagerIServerUserItem->GetUserInfo(); Temp.player[i].dwUserID=pUserInfo->dwUserID; lstrcpyn(Temp.player[i].szHeadUrl, pUserInfo->szHeadUrl, CountArray(Temp.player[i].szHeadUrl)); lstrcpyn(Temp.player[i].szName, pUserInfo->szNickName, CountArray(Temp.player[i].szName)); Temp.dwReadyBody++; //同步到中心服务器 UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); } } } OnLineTableAck.wTableState = Temp.roomStatus; //玩家 CopyMemory(OnLineTableAck.Userinfo, Temp.player, sizeof(Temp.player)); Club::PB_CS_S_ClubOnLineTableAck TableAck; TableAck.set_dwtableid(OnLineTableAck.dwTableID); TableAck.set_wjushu(OnLineTableAck.wJushu); TableAck.set_wtablestate(OnLineTableAck.wTableState); for (WORD i = 0; i < 5; i++) { Club::pb_PlayerInfo* PlayerInfo = TableAck.add_userinfo(); PlayerInfo->set_dwuserid(OnLineTableAck.Userinfo[i].dwUserID); std::string szName = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szHeadUrl, CP_UTF8).m_psz; PlayerInfo->set_szname(szName); PlayerInfo->set_szheadurl(szHeadUrl); } //发送数据 std::string pbdata = TableAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLEUSER_ACK, (void*)pbdata.c_str(), pbdata.length()); if ((Temp.dwBody == Temp.dwReadyBody || bIsUserNull) && 0 == Temp.roomStatus) { Temp.roomStatus = 1;//房间状态 //同步到中心服务器 UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); //自动创建1个房间 if (0 < Temp.tmp6[0] && 1 == Temp.tmp5) { memset(szString, 0, 512 * sizeof(TCHAR)); _sntprintf(szString, CountArray(szString), TEXT("userid=%d 检测少人(游戏已开始),m_PriTableID_2_TableID有这个房间 可以(自动创建1个房间)"), pIServerUserItem->GetUserID()); CTraceService::TraceString(szString, TraceLevel_Warning); this->OnAutoCreateRoomToDB(Temp.tmp6[0], pIServerUserItem->GetUserID(), Temp.tmp4); } } } else{ //玩家 CopyMemory(OnLineTableAck.Userinfo, Temp.player, sizeof(Temp.player)); Club::PB_CS_S_ClubOnLineTableAck TableAck; TableAck.set_dwtableid(OnLineTableAck.dwTableID); TableAck.set_wjushu(OnLineTableAck.wJushu); TableAck.set_wtablestate(OnLineTableAck.wTableState); for (WORD i = 0; i < 5; i++) { Club::pb_PlayerInfo* PlayerInfo = TableAck.add_userinfo(); PlayerInfo->set_dwuserid(OnLineTableAck.Userinfo[i].dwUserID); std::string szName = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szHeadUrl, CP_UTF8).m_psz; PlayerInfo->set_szname(szName); PlayerInfo->set_szheadurl(szHeadUrl); } //发送数据 std::string pbdata = TableAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLEUSER_ACK, (void*)pbdata.c_str(), pbdata.length()); } } } } return true; } //俱乐部会员黑名单 bool CAttemperEngineSink::OnTCPNetworkSubGetClubBlackUser(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubUser2 ClubUser2; ClubUser2.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubUser2 pClubUser; ZeroMemory(&pClubUser, sizeof(pClubUser)); pClubUser.dwClubID = ClubUser2.dwclubid(); pClubUser.wStartIndex = ClubUser2.wstartindex(); pClubUser.wCount = ClubUser2.wcount(); pClubUser.cbKind = ClubUser2.cbkind(); pClubUser.dwTemp = ClubUser2.dwtemp(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubUser2 ClubUser; ZeroMemory(&ClubUser, sizeof(ClubUser)); //设置变量 ClubUser.dwUserID = pIServerUserItem->GetUserID(); ClubUser.dwClubID = pClubUser.dwClubID; ClubUser.wStartIndex = pClubUser.wStartIndex; ClubUser.wCount = pClubUser.wCount; ClubUser.cbKind = pClubUser.cbKind; ClubUser.dwTemp = pClubUser.dwTemp; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER2, dwSocketID, &ClubUser, sizeof(ClubUser)); } //俱乐部检测协议 bool CAttemperEngineSink::OnTCPNetworkSubGetClubProtocol(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubProtocol Protocol; Protocol.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubProtocol pClubProtocol; ZeroMemory(&pClubProtocol, sizeof(pClubProtocol)); pClubProtocol.dwClubID = Protocol.dwclubid(); pClubProtocol.dwTemp = Protocol.dwtemp(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubProtocol ClubProtocol; ZeroMemory(&ClubProtocol, sizeof(ClubProtocol)); //设置变量 ClubProtocol.dwUserID = pIServerUserItem->GetUserID(); ClubProtocol.dwClubID = pClubProtocol.dwClubID; ClubProtocol.dwTemp = pClubProtocol.dwTemp; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_PROTOCOL, dwSocketID, &ClubProtocol, sizeof(ClubProtocol)); } //俱乐部同意协议 bool CAttemperEngineSink::OnTCPNetworkSubAgreeClubProtocol(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_S_ClubProtocolAgree Protocol; Protocol.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubProtocolAgree pClubUserAgree; ZeroMemory(&pClubUserAgree, sizeof(pClubUserAgree)); pClubUserAgree.dwClubID = Protocol.dwclubid(); pClubUserAgree.cbAgree = Protocol.cbagree(); pClubUserAgree.dwTemp = Protocol.dwtemp(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubProtocolAgree ClubUserAgree; ZeroMemory(&ClubUserAgree, sizeof(ClubUserAgree)); //设置变量 ClubUserAgree.dwUserID = pIServerUserItem->GetUserID(); ClubUserAgree.dwClubID = pClubUserAgree.dwClubID; ClubUserAgree.dwTemp = pClubUserAgree.dwTemp; ClubUserAgree.cbAgree = pClubUserAgree.cbAgree; //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_PROTOCOLAGREE, dwSocketID, &ClubUserAgree, sizeof(ClubUserAgree)); } //俱乐部公告 bool CAttemperEngineSink::OnTCPNetworkSubGetClubNotice(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubNotice Notice; Notice.ParseFromArray(pData, wDataSize); CString message = (CA2CTEX<2048>(Notice.message().c_str(), CP_UTF8)).m_szBuffer; //处理消息 CMD_GR_ClubNotice pClubUserNotice; ZeroMemory(&pClubUserNotice, sizeof(pClubUserNotice)); pClubUserNotice.dwClubID = Notice.dwclubid(); pClubUserNotice.cbType = Notice.cbtype(); pClubUserNotice.dwTemp = Notice.dwtemp(); _sntprintf(pClubUserNotice.Message, CountArray(pClubUserNotice.Message), TEXT("%s"), message); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造结构 DBR_GR_ClubNotice ClubNotice; ZeroMemory(&ClubNotice, sizeof(ClubNotice)); //设置变量 ClubNotice.dwUserID = pIServerUserItem->GetUserID(); ClubNotice.dwClubID = pClubUserNotice.dwClubID; ClubNotice.dwTemp = pClubUserNotice.dwTemp; ClubNotice.cbType = pClubUserNotice.cbType; CopyMemory(ClubNotice.Message, pClubUserNotice.Message, sizeof(pClubUserNotice.Message)); //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_NOTICE, dwSocketID, &ClubNotice, sizeof(ClubNotice)); } //群主解散俱乐部房间 bool CAttemperEngineSink::OnTCPNetworkSubDissolveRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubDissolveRoom DissolveRoom; DissolveRoom.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubDissolveRoom pClubDissolveRoom; ZeroMemory(&pClubDissolveRoom, sizeof(pClubDissolveRoom)); pClubDissolveRoom.dwClubID = DissolveRoom.dwclubid(); pClubDissolveRoom.dwRoomID = DissolveRoom.dwroomid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //校验该房间属于该俱乐部 CWHDataLocker DataLocker(m_CriticalSection); JN_GR_RoomListBig* pRoomListBig = &m_PrivateRoomAll[pClubDissolveRoom.dwRoomID]; if (pRoomListBig == NULL) return false; if (pRoomListBig->roomType == 1 && pRoomListBig->tmp6[0] == pClubDissolveRoom.dwClubID) { DBR_GR_ClubDissolveRoom ClubDissolveRoom = { 0 }; ClubDissolveRoom.dwClubID = pClubDissolveRoom.dwClubID; ClubDissolveRoom.dwRoomID = pClubDissolveRoom.dwRoomID; ClubDissolveRoom.dwUserID = pIServerUserItem->GetUserID(); //校验该用户为该俱乐部群主 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_DISSOLVEROOM, dwSocketID, &ClubDissolveRoom, sizeof(ClubDissolveRoom)); } else { SendRequestFailure(pIServerUserItem, TEXT("不是本俱乐部房间,不能强制解散!"), 0); } return true; } //俱乐部统计战绩 bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountExploits(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubExploits ploits; ploits.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubExploits pClubRecord; ZeroMemory(&pClubRecord, sizeof(pClubRecord)); pClubRecord.dwClubID = ploits.dwclubid(); pClubRecord.PrivateTableID = ploits.privatetableid(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_EXPLOITS, dwSocketID, &pClubRecord, wDataSize); } //俱乐部统计对局数排名 bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountPlaygames(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubPlaygames Playgames; Playgames.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubPlaygames pClubPlaygames; ZeroMemory(&pClubPlaygames, sizeof(pClubPlaygames)); pClubPlaygames.dwClubID = Playgames.dwclubid(); pClubPlaygames.wType = Playgames.wtype(); pClubPlaygames.StartIndex = Playgames.startindex(); pClubPlaygames.mCount = Playgames.mcount(); pClubPlaygames.wDateCount = Playgames.wdatecount(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; CMD_GR_ClubPlaygamesUser pClubPlaygamesUser; ZeroMemory(&pClubPlaygamesUser, sizeof(pClubPlaygamesUser)); pClubPlaygamesUser.dwClubID = pClubPlaygames.dwClubID; pClubPlaygamesUser.wType = pClubPlaygames.wType; pClubPlaygamesUser.StartIndex = pClubPlaygames.StartIndex; pClubPlaygamesUser.mCount = pClubPlaygames.mCount; pClubPlaygamesUser.wDateCount = pClubPlaygames.wDateCount; pClubPlaygamesUser.UserID = pIServerUserItem->GetUserID(); return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_PLAYGAEMS, dwSocketID, &pClubPlaygamesUser, sizeof(CMD_GR_ClubPlaygamesUser)); } //俱乐部统计积分数排名 bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountIntegral(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_C_ClubIntegral Integral; Integral.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_ClubIntegral pClubIntegral; ZeroMemory(&pClubIntegral, sizeof(pClubIntegral)); pClubIntegral.dwClubID = Integral.dwclubid(); pClubIntegral.wType = Integral.wtype(); pClubIntegral.wDateCount = Integral.wdatecount(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; CMD_GR_ClubIntegralUser pClubIntegralUser; pClubIntegralUser.dwClubID = pClubIntegral.dwClubID; pClubIntegralUser.wType = pClubIntegral.wType; pClubIntegralUser.wDateCount = pClubIntegral.wDateCount; pClubIntegralUser.UserID = pIServerUserItem->GetUserID(); return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_INTEGRAL, dwSocketID, &pClubIntegralUser, sizeof(CMD_GR_ClubIntegralUser)); } //俱乐部打样 bool CAttemperEngineSink::OnTCPNetworkSubGetClubSample(VOID * pData, WORD wDataSize, DWORD dwSocketID) { Club::PB_CS_Club_Make_A_Sample MakeSample; MakeSample.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_Club_Make_A_Sample pSample; ZeroMemory(&pSample, sizeof(pSample)); pSample.dwClubID = MakeSample.dwclubid(); pSample.IsSample = MakeSample.issample(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //构造数据 DBR_GR_Club_Make_A_Sample Sample; ZeroMemory(&Sample, sizeof(Sample)); Sample.dwClubID = pSample.dwClubID; Sample.IsSample = pSample.IsSample; Sample.dwUserID = pIServerUserItem->GetUserID(); //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MAKEA_SAMPLE, dwSocketID, &Sample, sizeof(Sample)); } //////////////////////////////////////////////////////// //查询银行 //bool CAttemperEngineSink::OnTCPNetworkSubQueryInsureInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_QueryInsureInfoRequest)); // if (wDataSize != sizeof(CMD_GR_C_QueryInsureInfoRequest)) return false; // // //房间判断 // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //变量定义 // CMD_GR_C_QueryInsureInfoRequest * pQueryInsureInfoRequest = (CMD_GR_C_QueryInsureInfoRequest *)pData; // // //变量定义 // DBR_GR_QueryInsureInfo QueryInsureInfo; // ZeroMemory(&QueryInsureInfo, sizeof(QueryInsureInfo)); // // //构造数据 // QueryInsureInfo.cbActivityGame = pQueryInsureInfoRequest->cbActivityGame; // QueryInsureInfo.dwUserID = pIServerUserItem->GetUserID(); // QueryInsureInfo.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(QueryInsureInfo.szPassword, pQueryInsureInfoRequest->szInsurePass, CountArray(QueryInsureInfo.szPassword)); // // CTraceService::TraceString(TEXT("查询银行已屏蔽 DBR_GR_QUERY_INSURE_INFO"), TraceLevel_Warning); // //投递请求 // //m_pIDBCorrespondManager->PostDataBaseRequest(QueryInsureInfo.dwUserID, DBR_GR_QUERY_INSURE_INFO, dwSocketID, &QueryInsureInfo, sizeof(QueryInsureInfo)); // // return true; //} // ////开通银行 //bool CAttemperEngineSink::OnTCPNetworkSubEnableInsureRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_EnableInsureRequest)); // if (wDataSize != sizeof(CMD_GR_C_EnableInsureRequest)) return false; // // //房间判断 // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //变量定义 // CMD_GR_C_EnableInsureRequest * pEnableInsureRequest = (CMD_GR_C_EnableInsureRequest *)pData; // // //变量定义 // DBR_GR_UserEnableInsure UserEnableInsure; // ZeroMemory(&UserEnableInsure, sizeof(UserEnableInsure)); // // //构造数据 // UserEnableInsure.dwUserID = pIServerUserItem->GetUserID(); // UserEnableInsure.dwClientAddr = pIServerUserItem->GetClientAddr(); // UserEnableInsure.cbActivityGame = pEnableInsureRequest->cbActivityGame; // lstrcpyn(UserEnableInsure.szLogonPass, pEnableInsureRequest->szLogonPass, CountArray(UserEnableInsure.szLogonPass)); // lstrcpyn(UserEnableInsure.szInsurePass, pEnableInsureRequest->szInsurePass, CountArray(UserEnableInsure.szInsurePass)); // lstrcpyn(UserEnableInsure.szMachineID, pEnableInsureRequest->szMachineID, CountArray(UserEnableInsure.szMachineID)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(UserEnableInsure.dwUserID, DBR_GR_USER_ENABLE_INSURE, dwSocketID, &UserEnableInsure, sizeof(UserEnableInsure)); // // return true; //} // ////存款请求 //bool CAttemperEngineSink::OnTCPNetworkSubSaveScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_SaveScoreRequest)); // if (wDataSize != sizeof(CMD_GR_C_SaveScoreRequest)) return false; // // //房间判断 // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //变量定义 // CMD_GR_C_SaveScoreRequest * pSaveScoreRequest = (CMD_GR_C_SaveScoreRequest *)pData; // // //效验参数 // ASSERT(pSaveScoreRequest->lSaveScore > 0L); // if (pSaveScoreRequest->lSaveScore <= 0L) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //规则判断 // if (pSaveScoreRequest->cbActivityGame == FALSE && CServerRule::IsForfendSaveInRoom(m_pGameServiceOption->dwServerRule)) // { // //发送数据 // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止房间存款,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame); // return true; // } // // //规则判断 // if (pSaveScoreRequest->cbActivityGame == TRUE && CServerRule::IsForfendSaveInGame(m_pGameServiceOption->dwServerRule)) // { // //发送数据 // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止游戏存款,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame); // return true; // } // // //变量定义 // SCORE lConsumeQuota; // // // //获取限额 // if (pIServerUserItem->GetTableID() != INVALID_TABLE) // { // auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); // if (!pTableFrame) // return false; // lConsumeQuota = pTableFrame->QueryConsumeQuota(pIServerUserItem); // } // else // { // lConsumeQuota = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore(); // } // // //限额判断 // if (pSaveScoreRequest->lSaveScore > lConsumeQuota) // { // SCORE lUserWholeScore = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore(); // if (lConsumeQuota < lUserWholeScore) // { // //构造提示 // TCHAR szDescribe[128] = TEXT(""); // _sntprintf(szDescribe, CountArray(szDescribe), TEXT("由于您正在游戏中,游戏币可存入额度为 %I64d,存入操作失败!"), lConsumeQuota); // // //发送数据 // SendInsureFailure(pIServerUserItem, szDescribe, 0L, pSaveScoreRequest->cbActivityGame); // } // else // { // //发送数据 // SendInsureFailure(pIServerUserItem, TEXT("您的游戏币余额不足,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame); // } // // return true; // } // // //锁定积分 // if (pIServerUserItem->FrozenedUserScore(pSaveScoreRequest->lSaveScore) == false) // { // ASSERT(FALSE); // return false; // } // // //变量定义 // DBR_GR_UserSaveScore UserSaveScore; // ZeroMemory(&UserSaveScore, sizeof(UserSaveScore)); // // //构造数据 // UserSaveScore.cbActivityGame = pSaveScoreRequest->cbActivityGame; // UserSaveScore.dwUserID = pIServerUserItem->GetUserID(); // UserSaveScore.lSaveScore = pSaveScoreRequest->lSaveScore; // UserSaveScore.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(UserSaveScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserSaveScore.szMachineID)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_SAVE_SCORE, dwSocketID, &UserSaveScore, sizeof(UserSaveScore)); // // return true; //} // ////取款请求 //bool CAttemperEngineSink::OnTCPNetworkSubTakeScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_TakeScoreRequest)); // if (wDataSize != sizeof(CMD_GR_C_TakeScoreRequest)) return false; // // //房间判断 // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //变量定义 // CMD_GR_C_TakeScoreRequest * pTakeScoreRequest = (CMD_GR_C_TakeScoreRequest *)pData; // pTakeScoreRequest->szInsurePass[CountArray(pTakeScoreRequest->szInsurePass) - 1] = 0; // // //效验参数 // ASSERT(pTakeScoreRequest->lTakeScore > 0L); // if (pTakeScoreRequest->lTakeScore <= 0L) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //规则判断 // if (pTakeScoreRequest->cbActivityGame == FALSE && CServerRule::IsForfendTakeInRoom(m_pGameServiceOption->dwServerRule)) // { // //发送数据 // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止房间取款,取出操作失败!"), 0L, pTakeScoreRequest->cbActivityGame); // return true; // } // // //规则判断 // if (pTakeScoreRequest->cbActivityGame == TRUE && CServerRule::IsForfendTakeInGame(m_pGameServiceOption->dwServerRule)) // { // //发送数据 // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止游戏取款,取出操作失败!"), 0L, pTakeScoreRequest->cbActivityGame); // return true; // } // // //变量定义 // DBR_GR_UserTakeScore UserTakeScore; // ZeroMemory(&UserTakeScore, sizeof(UserTakeScore)); // // //构造数据 // UserTakeScore.cbActivityGame = pTakeScoreRequest->cbActivityGame; // UserTakeScore.dwUserID = pIServerUserItem->GetUserID(); // UserTakeScore.lTakeScore = pTakeScoreRequest->lTakeScore; // UserTakeScore.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(UserTakeScore.szPassword, pTakeScoreRequest->szInsurePass, CountArray(UserTakeScore.szPassword)); // lstrcpyn(UserTakeScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserTakeScore.szMachineID)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_TAKE_SCORE, dwSocketID, &UserTakeScore, sizeof(UserTakeScore)); // // return true; //} // ////转帐请求 //bool CAttemperEngineSink::OnTCPNetworkSubTransferScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GP_C_TransferScoreRequest)); // if (wDataSize != sizeof(CMD_GP_C_TransferScoreRequest)) return false; // // //房间判断 // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //变量定义 // CMD_GP_C_TransferScoreRequest * pTransferScoreRequest = (CMD_GP_C_TransferScoreRequest *)pData; // pTransferScoreRequest->szAccounts[CountArray(pTransferScoreRequest->szAccounts) - 1] = 0; // pTransferScoreRequest->szInsurePass[CountArray(pTransferScoreRequest->szInsurePass) - 1] = 0; // // //效验参数 // ASSERT(pTransferScoreRequest->lTransferScore > 0L); // if (pTransferScoreRequest->lTransferScore <= 0L) return false; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //变量定义 // DBR_GR_UserTransferScore UserTransferScore; // ZeroMemory(&UserTransferScore, sizeof(UserTransferScore)); // // //构造数据 // UserTransferScore.cbActivityGame = pTransferScoreRequest->cbActivityGame; // UserTransferScore.dwUserID = pIServerUserItem->GetUserID(); // UserTransferScore.dwClientAddr = pIServerUserItem->GetClientAddr(); // UserTransferScore.lTransferScore = pTransferScoreRequest->lTransferScore; // lstrcpyn(UserTransferScore.szAccounts, pTransferScoreRequest->szAccounts, CountArray(UserTransferScore.szAccounts)); // lstrcpyn(UserTransferScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserTransferScore.szMachineID)); // lstrcpyn(UserTransferScore.szPassword, pTransferScoreRequest->szInsurePass, CountArray(UserTransferScore.szPassword)); // lstrcpyn(UserTransferScore.szTransRemark, pTransferScoreRequest->szTransRemark, CountArray(UserTransferScore.szTransRemark)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_TRANSFER_SCORE, dwSocketID, &UserTransferScore, sizeof(UserTransferScore)); // // return true; //} // //查询用户请求 //bool CAttemperEngineSink::OnTCPNetworkSubQueryUserInfoRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_C_QueryUserInfoRequest)); // if (wDataSize != sizeof(CMD_GR_C_QueryUserInfoRequest)) return false; // // //房间判断 // ASSERT((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) != 0); // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false; // // //变量定义 // CMD_GR_C_QueryUserInfoRequest * pQueryUserInfoRequest = (CMD_GR_C_QueryUserInfoRequest *)pData; // pQueryUserInfoRequest->szAccounts[CountArray(pQueryUserInfoRequest->szAccounts) - 1] = 0; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //ID判断 // if (pQueryUserInfoRequest->cbByNickName == FALSE) // { // //长度判断 // int nLen = lstrlen(pQueryUserInfoRequest->szAccounts); // if (nLen >= 8) // { // SendInsureFailure(pIServerUserItem, TEXT("请输入合法的玩家ID!"), 0, pQueryUserInfoRequest->cbActivityGame); // return true; // } // // //合法判断 // for (int i = 0; i < nLen; i++) // { // if (pQueryUserInfoRequest->szAccounts[i] < TEXT('0') || pQueryUserInfoRequest->szAccounts[i] > TEXT('9')) // { // SendInsureFailure(pIServerUserItem, TEXT("请输入合法的玩家ID!"), 0, pQueryUserInfoRequest->cbActivityGame); // return true; // } // } // } // // //变量定义 // DBR_GR_QueryTransferUserInfo QueryTransferUserInfo; // ZeroMemory(&QueryTransferUserInfo, sizeof(QueryTransferUserInfo)); // // //构造数据 // QueryTransferUserInfo.dwUserID = pIServerUserItem->GetUserID(); // QueryTransferUserInfo.cbByNickName = pQueryUserInfoRequest->cbByNickName; // QueryTransferUserInfo.cbActivityGame = pQueryUserInfoRequest->cbActivityGame; // lstrcpyn(QueryTransferUserInfo.szAccounts, pQueryUserInfoRequest->szAccounts, CountArray(QueryTransferUserInfo.szAccounts)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_QUERY_TRANSFER_USER_INFO, dwSocketID, &QueryTransferUserInfo, sizeof(QueryTransferUserInfo)); // // return true; //} ////领取任务 //bool CAttemperEngineSink::OnTCPNetworkSubTakeTaskRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_C_TakeTask)); // if (wDataSize != sizeof(CMD_GR_C_TakeTask)) return false; // // //提取数据 // CMD_GR_C_TakeTask * pTaskTake = (CMD_GR_C_TakeTask *)pData; // pTaskTake->szPassword[CountArray(pTaskTake->szPassword) - 1] = 0; // pTaskTake->szMachineID[CountArray(pTaskTake->szMachineID) - 1] = 0; // // //查找用户 // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pTaskTake->dwUserID); // if (pIServerUserItem == NULL) return false; // // //构造结构 // DBR_GR_TaskTake TaskTake; // TaskTake.dwUserID = pTaskTake->dwUserID; // TaskTake.wTaskID = pTaskTake->wTaskID; // TaskTake.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(TaskTake.szPassword, pTaskTake->szPassword, CountArray(TaskTake.szPassword)); // lstrcpyn(TaskTake.szMachineID, pTaskTake->szMachineID, CountArray(TaskTake.szMachineID)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_TAKE, dwSocketID, &TaskTake, sizeof(TaskTake)); // // return true; //} // ////领取奖励 //bool CAttemperEngineSink::OnTCPNetworkSubTaskRewardRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_C_TaskReward)); // if (wDataSize != sizeof(CMD_GR_C_TaskReward)) return false; // // //提取数据 // CMD_GR_C_TaskReward * pTaskReward = (CMD_GR_C_TaskReward *)pData; // pTaskReward->szPassword[CountArray(pTaskReward->szPassword) - 1] = 0; // pTaskReward->szMachineID[CountArray(pTaskReward->szMachineID) - 1] = 0; // // //查找用户 // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pTaskReward->dwUserID); // if (pIServerUserItem == NULL) return false; // // //构造结构 // DBR_GR_TaskReward TaskReward; // TaskReward.dwUserID = pTaskReward->dwUserID; // TaskReward.wTaskID = pTaskReward->wTaskID; // TaskReward.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(TaskReward.szPassword, pTaskReward->szPassword, CountArray(TaskReward.szPassword)); // lstrcpyn(TaskReward.szMachineID, pTaskReward->szMachineID, CountArray(TaskReward.szMachineID)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_REWARD, dwSocketID, &TaskReward, sizeof(TaskReward)); // // return true; //} // ////加载任务 //bool CAttemperEngineSink::OnTCPNetworkSubLoadTaskInfoRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //参数校验 // ASSERT(wDataSize == sizeof(CMD_GR_C_LoadTaskInfo)); // if (wDataSize != sizeof(CMD_GR_C_LoadTaskInfo)) return false; // // //提取数据 // CMD_GR_C_LoadTaskInfo * pLoadTaskInfo = (CMD_GR_C_LoadTaskInfo *)pData; // pLoadTaskInfo->szPassword[CountArray(pLoadTaskInfo->szPassword) - 1] = 0; // // //查找用户 // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pLoadTaskInfo->dwUserID); // if (pIServerUserItem == NULL) return false; // // //构造结构 // DBR_GR_TaskQueryInfo TaskQueryInfo; // TaskQueryInfo.dwUserID = pLoadTaskInfo->dwUserID; // lstrcpyn(TaskQueryInfo.szPassword, pLoadTaskInfo->szPassword, CountArray(TaskQueryInfo.szPassword)); // // //投递请求 // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_QUERY_INFO, dwSocketID, &TaskQueryInfo, sizeof(TaskQueryInfo)); // // return true; //} //查询设置 bool CAttemperEngineSink::OnTCPNetworkSubQueryOption(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0)); if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false; //变量定义 CMD_GR_OptionCurrent OptionCurrent; ZeroMemory(&OptionCurrent, sizeof(OptionCurrent)); //挂接属性 OptionCurrent.ServerOptionInfo.wKindID = m_pGameServiceOption->wKindID; OptionCurrent.ServerOptionInfo.wNodeID = m_pGameServiceOption->wNodeID; OptionCurrent.ServerOptionInfo.wSortID = m_pGameServiceOption->wSortID; //房间配置 OptionCurrent.ServerOptionInfo.wRevenueRatio = m_pGameServiceOption->wRevenueRatio; OptionCurrent.ServerOptionInfo.lServiceScore = m_pGameServiceOption->lServiceScore; OptionCurrent.ServerOptionInfo.lRestrictScore = m_pGameServiceOption->lRestrictScore; OptionCurrent.ServerOptionInfo.lMinTableScore = m_pGameServiceOption->lMinTableScore; OptionCurrent.ServerOptionInfo.lMinEnterScore = m_pGameServiceOption->lMinEnterScore; OptionCurrent.ServerOptionInfo.lMaxEnterScore = m_pGameServiceOption->lMaxEnterScore; //会员限制 OptionCurrent.ServerOptionInfo.cbMinEnterMember = m_pGameServiceOption->cbMinEnterMember; OptionCurrent.ServerOptionInfo.cbMaxEnterMember = m_pGameServiceOption->cbMaxEnterMember; //房间属性 OptionCurrent.ServerOptionInfo.dwServerRule = m_pGameServiceOption->dwServerRule; lstrcpyn(OptionCurrent.ServerOptionInfo.szServerName, m_pGameServiceOption->szServerName, CountArray(OptionCurrent.ServerOptionInfo.szServerName)); //聊天规则 OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_CHAT; OptionCurrent.dwRuleMask |= SR_FORFEND_ROOM_CHAT; OptionCurrent.dwRuleMask |= SR_FORFEND_WISPER_CHAT; OptionCurrent.dwRuleMask |= SR_FORFEND_WISPER_ON_GAME; //房间规则 OptionCurrent.dwRuleMask |= SR_FORFEND_ROOM_ENTER; OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_ENTER; OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_LOOKON; //银行规则 OptionCurrent.dwRuleMask |= SR_FORFEND_TAKE_IN_ROOM; OptionCurrent.dwRuleMask |= SR_FORFEND_TAKE_IN_GAME; OptionCurrent.dwRuleMask |= SR_FORFEND_SAVE_IN_ROOM; OptionCurrent.dwRuleMask |= SR_FORFEND_SAVE_IN_GAME; //其他规则 //OptionCurrent.dwRuleMask|=SR_RECORD_GAME_TRACK; OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_RULE; OptionCurrent.dwRuleMask |= SR_FORFEND_LOCK_TABLE; OptionCurrent.dwRuleMask |= SR_ALLOW_ANDROID_SIMULATE; //组件规则 if (m_pGameServiceAttrib->cbDynamicJoin == TRUE) OptionCurrent.dwRuleMask |= SR_ALLOW_DYNAMIC_JOIN; if (m_pGameServiceAttrib->cbAndroidUser == TRUE) OptionCurrent.dwRuleMask |= SR_ALLOW_ANDROID_ATTEND; //if (m_pGameServiceAttrib->cbOffLineTrustee==TRUE) OptionCurrent.dwRuleMask|=SR_ALLOW_OFFLINE_TRUSTEE; //模式规则 if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) OptionCurrent.dwRuleMask |= SR_RECORD_GAME_SCORE; if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) OptionCurrent.dwRuleMask |= SR_IMMEDIATE_WRITE_SCORE; //发送数据 SendData(pIServerUserItem, MDM_GR_MANAGE, SUB_GR_OPTION_CURRENT, &OptionCurrent, sizeof(OptionCurrent)); return true; } //房间设置 bool CAttemperEngineSink::OnTCPNetworkSubOptionServer(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_ServerOption)); if (wDataSize != sizeof(CMD_GR_ServerOption)) return false; //变量定义 CMD_GR_ServerOption * pServerOption = (CMD_GR_ServerOption *)pData; tagServerOptionInfo * pServerOptionInfo = &pServerOption->ServerOptionInfo; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0)); if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false; //变量定义 bool bModifyServer = false; //挂接节点 if (m_pGameServiceOption->wNodeID != pServerOptionInfo->wNodeID) { bModifyServer = true; m_pGameServiceOption->wNodeID = pServerOptionInfo->wNodeID; } //挂接类型 if ((pServerOptionInfo->wKindID != 0) && (m_pGameServiceOption->wKindID != pServerOptionInfo->wKindID)) { bModifyServer = true; m_pGameServiceOption->wKindID = pServerOptionInfo->wKindID; } //挂接排序 if ((pServerOptionInfo->wSortID != 0) && (m_pGameServiceOption->wSortID != pServerOptionInfo->wSortID)) { bModifyServer = true; m_pGameServiceOption->wSortID = pServerOptionInfo->wSortID; } //房间名字 if ((pServerOptionInfo->szServerName[0] != 0) && (lstrcmp(m_pGameServiceOption->szServerName, pServerOptionInfo->szServerName) != 0)) { bModifyServer = true; lstrcpyn(m_pGameServiceOption->szServerName, pServerOptionInfo->szServerName, CountArray(m_pGameServiceOption->szServerName)); } //税收配置 m_pGameServiceOption->wRevenueRatio = pServerOptionInfo->wRevenueRatio; m_pGameServiceOption->lServiceScore = pServerOptionInfo->lServiceScore; //房间配置 m_pGameServiceOption->lRestrictScore = pServerOptionInfo->lRestrictScore; m_pGameServiceOption->lMinTableScore = pServerOptionInfo->lMinTableScore; m_pGameServiceOption->lMinEnterScore = pServerOptionInfo->lMinEnterScore; m_pGameServiceOption->lMaxEnterScore = pServerOptionInfo->lMaxEnterScore; //会员限制 m_pGameServiceOption->cbMinEnterMember = pServerOptionInfo->cbMinEnterMember; m_pGameServiceOption->cbMaxEnterMember = pServerOptionInfo->cbMaxEnterMember; //聊天规则 CServerRule::SetForfendGameChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameChat(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendRoomChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendRoomChat(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendWisperChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendWisperChat(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendWisperOnGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendWisperOnGame(pServerOptionInfo->dwServerRule)); //房间规则 CServerRule::SetForfendRoomEnter(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendRoomEnter(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendGameEnter(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameEnter(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendGameLookon(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameLookon(pServerOptionInfo->dwServerRule)); //银行规则 CServerRule::SetForfendTakeInRoom(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendTakeInRoom(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendTakeInGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendTakeInGame(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendSaveInRoom(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendSaveInRoom(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendSaveInGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendSaveInGame(pServerOptionInfo->dwServerRule)); //其他规则 CServerRule::SetRecordGameTrack(m_pGameServiceOption->dwServerRule, CServerRule::IsRecordGameTrack(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendGameRule(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameRule(pServerOptionInfo->dwServerRule)); CServerRule::SetForfendLockTable(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendLockTable(pServerOptionInfo->dwServerRule)); //动态加入 if (m_pGameServiceAttrib->cbDynamicJoin == TRUE) { CServerRule::SetAllowDynamicJoin(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowDynamicJoin(pServerOptionInfo->dwServerRule)); } //机器管理 if (m_pGameServiceAttrib->cbAndroidUser == TRUE) { CServerRule::SetAllowAndroidAttend(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowAndroidAttend(pServerOptionInfo->dwServerRule)); } //断线托管 if (m_pGameServiceAttrib->cbOffLineTrustee == TRUE) { CServerRule::SetAllowOffLineTrustee(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowOffLineTrustee(pServerOptionInfo->dwServerRule)); } //记录成绩 if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) { CServerRule::SetRecordGameScore(m_pGameServiceOption->dwServerRule, CServerRule::IsRecordGameScore(pServerOptionInfo->dwServerRule)); } //立即写分 if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) { CServerRule::SetImmediateWriteScore(m_pGameServiceOption->dwServerRule, CServerRule::IsImmediateWriteScore(pServerOptionInfo->dwServerRule)); } //调整参数 CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits; pServiceUnits->RectifyServiceParameter(); //发送修改 if (bModifyServer == true) { //变量定义 CMD_CS_C_ServerModify ServerModify; ZeroMemory(&ServerModify, sizeof(ServerModify)); //服务端口 ServerModify.wServerPort = pServiceUnits->m_TCPNetworkEngine->GetCurrentPort(); //房间信息 ServerModify.wKindID = m_pGameServiceOption->wKindID; ServerModify.wNodeID = m_pGameServiceOption->wNodeID; ServerModify.wSortID = m_pGameServiceOption->wSortID; ServerModify.dwOnLineCount = m_ServerUserManager.GetUserItemCount(); ServerModify.dwFullCount = m_pGameServiceOption->wMaxPlayer - RESERVE_USER_COUNT; lstrcpyn(ServerModify.szServerName, m_pGameServiceOption->szServerName, CountArray(ServerModify.szServerName)); lstrcpyn(ServerModify.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(ServerModify.szServerAddr)); //DWORD dTableNum = 0; if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIServerUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; /*if (!csTemp.IsEmpty()) { dTableNum = _wtol(szTemp); }*/ } //发送数据 m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_MODIFY, &ServerModify, sizeof(ServerModify)/*, dTableNum, pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); } //发送信息 SendRequestFailure(pIServerUserItem, TEXT("当前游戏服务器房间的“运行值”状态配置数据修改成功"), 0); //输出信息 TCHAR szBuffer[128] = TEXT(""); _sntprintf(szBuffer, CountArray(szBuffer), TEXT("远程修改房间配置通知 管理员 %s [ %ld ]"), pIServerUserItem->GetNickName(), pIServerUserItem->GetUserID()); //输出信息 CTraceService::TraceString(szBuffer, TraceLevel_Info); return true; } //踢出用户 //bool CAttemperEngineSink::OnTCPNetworkSubManagerKickUser(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize == sizeof(CMD_GR_KickUser)); // if (wDataSize != sizeof(CMD_GR_KickUser)) return false; // // //变量定义 // CMD_GR_KickUser * pKickUser = (CMD_GR_KickUser *)pData; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0)); // if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false; // // //权限判断 // ASSERT(CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == true); // if (CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == false) return false; // // //目标用户 // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pKickUser->dwTargetUserID); // if (pITargetUserItem == NULL) return true; // // //用户状态 // if (pITargetUserItem->GetUserStatus() == US_PLAYING) return true; // // //踢出记录 // m_KickUserItemMap[pITargetUserItem->GetUserID()] = (DWORD)time(NULL); // // //请离桌子 // WORD wTargerTableID = pITargetUserItem->GetTableID(); // if (wTargerTableID != INVALID_TABLE) // { // //发送消息 // SendGameMessage(pITargetUserItem, TEXT("你已被管理员请离桌子!"), SMT_TABLE_EXIT); // // auto pTableFrame = GetTableFrame(wTargerTableID); // if (!pTableFrame) // return false; // if (pTableFrame->PerformStandUpAction(pITargetUserItem) == false) return true; // } // // //发送通知 // LPCTSTR pszMessage = TEXT("你已被管理员请离此游戏房间!"); // SendRoomMessage(pITargetUserItem, pszMessage, SMT_TABLE_EXIT); // // pITargetUserItem->SetUserStatus(US_NULL, INVALID_TABLE, INVALID_CHAIR); // // return true; //} //限制聊天 //bool CAttemperEngineSink::OnTCPNetworkSubLimitUserChat(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验数据 // ASSERT(wDataSize == sizeof(CMD_GR_LimitUserChat)); // if (wDataSize != sizeof(CMD_GR_LimitUserChat)) return false; // // //消息处理 // CMD_GR_LimitUserChat * pLimitUserChat = (CMD_GR_LimitUserChat *)pData; // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // if (pIServerUserItem == NULL) return false; // // //目标用户 // IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pLimitUserChat->dwTargetUserID); // if (pITargerUserItem == NULL) return true; // // //变量定义 // DWORD dwAddRight = 0, dwRemoveRight = 0; // // //大厅聊天 // if (pLimitUserChat->cbLimitFlags == OSF_ROOM_CHAT) // { // if (CMasterRight::CanLimitRoomChat(pIServerUserItem->GetMasterRight()) == false) return false; // // if (pLimitUserChat->cbLimitValue == TRUE) // dwAddRight |= UR_CANNOT_ROOM_CHAT; // else // dwRemoveRight |= UR_CANNOT_ROOM_CHAT; // } // // //游戏聊天 // if (pLimitUserChat->cbLimitFlags == OSF_GAME_CHAT) // { // if (CMasterRight::CanLimitGameChat(pIServerUserItem->GetMasterRight()) == false) return false; // // if (pLimitUserChat->cbLimitValue == TRUE) // dwAddRight |= UR_CANNOT_GAME_CHAT; // else // dwRemoveRight |= UR_CANNOT_GAME_CHAT; // } // // //大厅私聊 // if (pLimitUserChat->cbLimitFlags == OSF_ROOM_WISPER) // { // if (CMasterRight::CanLimitWisper(pIServerUserItem->GetMasterRight()) == false) return false; // // if (pLimitUserChat->cbLimitValue == TRUE) // dwAddRight |= UR_CANNOT_WISPER; // else // dwRemoveRight |= UR_CANNOT_WISPER; // } // // //发送喇叭 // if (pLimitUserChat->cbLimitFlags == OSF_SEND_BUGLE) // { // if (CMasterRight::CanLimitUserChat(pIServerUserItem->GetMasterRight()) == false) return false; // // if (pLimitUserChat->cbLimitValue == TRUE) // dwAddRight |= UR_CANNOT_BUGLE; // else // dwRemoveRight |= UR_CANNOT_BUGLE; // } // // if (dwAddRight != 0 || dwRemoveRight != 0) // { // pITargerUserItem->ModifyUserRight(dwAddRight, dwRemoveRight); // // //发送通知 // CMD_GR_ConfigUserRight cur; // ZeroMemory(&cur, sizeof(cur)); // cur.dwUserRight = pITargerUserItem->GetUserRight(); // // SendData(pITargerUserItem, MDM_GR_CONFIG, SUB_GR_CONFIG_USER_RIGHT, &cur, sizeof(cur)); // // //发送消息 // SendRequestFailure(pIServerUserItem, TEXT("用户聊天权限配置成功!"), 0); // } // else return false; // // return true; //} //解散所有所有游戏中牌桌 bool CAttemperEngineSink::OnTCPNetworkSubKickAllUser() { //消息处理 //CMD_GR_KickAllUser * pKillAllUser = (CMD_GR_KickAllUser *)pData; //效验数据 //ASSERT(wDataSize <= sizeof(CMD_GR_KickAllUser)); //if (wDataSize > sizeof(CMD_GR_KickAllUser)) return false; //ASSERT(wDataSize == CountStringBuffer(pKillAllUser->szKickMessage)); //if (wDataSize != CountStringBuffer(pKillAllUser->szKickMessage)) return false; //获取用户 //WORD wBindIndex = LOWORD(dwSocketID); //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //if (pIServerUserItem == NULL) return false; //权限判断 //ASSERT(CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == true); //if (CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == false) return false; //解散所有游戏 for (auto value : m_TableFrameArray) { auto pTableFrame = value.second; //获取桌子 if (pTableFrame->GetStartCount() ==0 ) continue; pTableFrame->DismissGame(); } //tagBindParameter *pBindParameter = m_pNormalParameter; //for( INT i = 0; i < m_pGameServiceOption->wMaxPlayer; i++ ) //{ // //目录用户 // IServerUserItem * pITargerUserItem= pBindParameter->pIServerUserItem; // if (pITargerUserItem==NULL || pITargerUserItem==pIServerUserItem ) // { // pBindParameter++; // continue; // } // //发送消息 // SendRoomMessage(pITargerUserItem,pKillAllUser->szKickMessage,SMT_CHAT|SMT_EJECT|SMT_CLOSE_LINK|SMT_CLOSE_ROOM); // pBindParameter++; //} return true; } //发布消息 bool CAttemperEngineSink::OnTCPNetworkSubSendMessage(VOID * pData, WORD wDataSize) { //获取用户 //WORD wBindIndex = LOWORD(dwSocketID); //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //if (pIServerUserItem == NULL) return false; //权限判断 //ASSERT(CMasterRight::CanIssueMessage(pIServerUserItem->GetMasterRight()) == true); //if (CMasterRight::CanIssueMessage(pIServerUserItem->GetMasterRight()) == false) return false; //变量定义 CMD_GR_SendMessage *pSysMessage = (CMD_GR_SendMessage *)pData; if (pSysMessage->cbLoop == TRUE) { //定于变量 tagSystemMessage *pSendMessage = new tagSystemMessage; ZeroMemory(pSendMessage, sizeof(tagSystemMessage)); //构造消息 pSendMessage->dwLastTime = (DWORD)time(NULL); pSendMessage->SystemMessage.dwMessageID = TEMP_MESSAGE_ID; pSendMessage->SystemMessage.cbAllRoom = pSysMessage->cbAllRoom; if (pSysMessage->cbRoom == TRUE && pSysMessage->cbGame == TRUE) pSendMessage->SystemMessage.cbMessageType = 3; else if (pSysMessage->cbRoom == TRUE) pSendMessage->SystemMessage.cbMessageType = 2; else if (pSysMessage->cbGame == TRUE) pSendMessage->SystemMessage.cbMessageType = 1; pSendMessage->SystemMessage.dwTimeRate = pSysMessage->dwTimeRate; pSendMessage->SystemMessage.tStartTime = (DWORD)time(NULL); pSendMessage->SystemMessage.tConcludeTime = pSysMessage->tConcludeTime; lstrcpyn(pSendMessage->SystemMessage.szSystemMessage, pSysMessage->szSystemMessage, CountArray(pSendMessage->SystemMessage.szSystemMessage)); //记录消息 m_SystemMessageActive.Add(pSendMessage); } //消息处理 return SendSystemMessage((CMD_GR_SendMessage *)pData, wDataSize); } //解散游戏 bool CAttemperEngineSink::OnTCPNetworkSubDismissGame(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验数据 ASSERT(wDataSize == sizeof(CMD_GR_DismissGame)); if (wDataSize != sizeof(CMD_GR_DismissGame)) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; //权限判断 ASSERT(CMasterRight::CanDismissGame(pIServerUserItem->GetMasterRight()) == true); if (CMasterRight::CanDismissGame(pIServerUserItem->GetMasterRight()) == false) return false; //消息处理 CMD_GR_DismissGame * pDismissGame = (CMD_GR_DismissGame *)pData; auto pTableFrame = GetTableFrame(pDismissGame->wDismissTableNum); if (!pTableFrame) return false; //解散游戏 if (pTableFrame->IsGameStarted()) pTableFrame->DismissGame(); //pTableFrame->SendGameMessage(TEXT("抱歉,此桌已被管理员解散游戏"), 0); //SetUserServerID(pIServerUserItem, 0); return true; } bool CAttemperEngineSink::OnTCPNetworkSubDeletePrivateTableReq(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_DELETE_PRIVATE_ROOM_REQ RoomReq; RoomReq.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_DELETE_PRIVATE_ROOM_REQ req; ZeroMemory(&req, sizeof(req)); req.wTableID = RoomReq.wtableid(); req.wChairID = RoomReq.wchairid(); req.leftTime = RoomReq.lefttime(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (!pTableFrame) { SendRequestFailure(pIServerUserItem, TEXT("房间已被删除!"), 0); return true; } TCHAR szTemp[32] = { 0 }; if (pTableFrame != nullptr) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (csTemp.IsEmpty()) { SendRequestFailure(pIServerUserItem,TEXT("不是好友房间,不能解散!"), 0); return true; } auto pUserItem = pTableFrame->GetTableUserItem(req.wChairID); if (pUserItem == NULL) { SendRequestFailure(pIServerUserItem, TEXT("您的座位号有误,不能解散!"), 0); return true; } if (pIServerUserItem->GetUserID() != pUserItem->GetUserID()) { return true; } BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus != US_PLAYING && cbUserStatus != US_READY && cbUserStatus != US_SIT && cbUserStatus != US_PLAYINGWAIT)//用户判断 { SendRequestFailure(pIServerUserItem, TEXT("您当前的状态不能申请解散!"), 0); return true; } pTableFrame->DeletePrivateTableReq(pIServerUserItem, req); pTableFrame->DeletePrivateTableResp(pIServerUserItem, 1, true); return true; } //删除私有房间 bool CAttemperEngineSink::OnTCPNetworkSubDeletePrivateTableResp(VOID * pData, WORD wDataSize, DWORD dwSocketID) { UserInfo::PB_CS_C_DELETE_PRIVATE_ROOM_RESP RoomResp; RoomResp.ParseFromArray(pData, wDataSize); //处理消息 CMD_GR_DELETE_PRIVATE_ROOM_RESP pDeleteResp; ZeroMemory(&pDeleteResp, sizeof(pDeleteResp)); pDeleteResp.wTableID = RoomResp.wtableid(); pDeleteResp.wChairID = RoomResp.wchairid(); pDeleteResp.bAgree = RoomResp.bagree(); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; auto pTableFrame = GetTableFrame(pDeleteResp.wTableID); if (!pTableFrame) { //SendRequestFailure(pIServerUserItem, TEXT("房间已被删除!"), 0); return true; } TCHAR szTemp[32] = { 0 }; if (pTableFrame != nullptr) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; if (csTemp.IsEmpty()) { SendRequestFailure(pIServerUserItem, TEXT("不是私有房间,不能删除!"), 0); return true; } auto pUserItem = pTableFrame->GetTableUserItem(pDeleteResp.wChairID); if (pUserItem == NULL) return false; if (pUserItem->GetUserID() != pIServerUserItem->GetUserID()) return false; BYTE cbUserStatus = pIServerUserItem->GetUserStatus(); if (cbUserStatus != US_PLAYING && cbUserStatus != US_READY && cbUserStatus != US_SIT && cbUserStatus != US_PLAYINGWAIT)//用户判断 { SendRequestFailure(pIServerUserItem, TEXT("您当前的状态不能投票!"), 0); return true; } pTableFrame->DeletePrivateTableResp(pIServerUserItem, pDeleteResp.bAgree); return true; } //警告命令 bool CAttemperEngineSink::OnTCPNetworkSubWarningUser(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验数据 ASSERT(wDataSize == sizeof(CMD_GR_SendWarning)); if (wDataSize != sizeof(CMD_GR_SendWarning)) return false; //提取数据 CMD_GR_SendWarning * pSendWarning = (CMD_GR_SendWarning*)pData; ASSERT(pSendWarning != NULL); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pSendWarning->dwTargetUserID); if (pITargetUserItem == NULL) return true; //权限判断 ASSERT(CMasterRight::CanSendWarning(pIServerUserItem->GetMasterRight()) == true); if (CMasterRight::CanSendWarning(pIServerUserItem->GetMasterRight()) == false) return false; //权限判断 ASSERT(pIServerUserItem->GetMasterOrder() > pITargetUserItem->GetMasterOrder()); if (pIServerUserItem->GetMasterOrder() < pITargetUserItem->GetMasterOrder()) return false; //发送警告 TCHAR szMessage[128] = TEXT(""); _sntprintf(szMessage, CountArray(szMessage), TEXT("警告:%s"), pSendWarning->szWarningMessage); SendRequestFailure(pITargetUserItem, szMessage, 0); return true; } //用户登录 VOID CAttemperEngineSink::OnEventUserLogon(IServerUserItem * pIServerUserItem, bool bAlreadyOnLine) { CTraceService::TraceString(TEXT("用户登录 OnEventUserLogon"), TraceLevel_Debug); //获取参数 WORD wBindIndex = pIServerUserItem->GetBindIndex(); bool bAndroidUser = pIServerUserItem->IsAndroidUser(); tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); /*if (pIServerUserItem->GetUserStatus() == US_LOOKON) { pIServerUserItem->SetUserStatus(US_FREE, INVALID_TABLE, INVALID_CHAIR, true); }*/ //玩家获取自己的数据 SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, pIServerUserItem->GetUserID()); TurntableLogon::PB_CS_S_LogonSuccess Success; //发送数据 std::string pbdata = Success.SerializePartialAsString(); SendData(pBindParameter->dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FINISH, (void*)pbdata.c_str(), pbdata.length()); //立即登录 if (pIServerUserItem->GetTableID() == INVALID_TABLE) { WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule(); if ((wMobileUserRule&BEHAVIOR_LOGON_IMMEDIATELY) != 0) { MobileUserImmediately(pIServerUserItem); } else { SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, INVALID_CHAIR); } m_Data.dLoginQOK++; pIServerUserItem->SetClientReady(true); } else { //断线重连 auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (pTableFrame) { bool bRet = pTableFrame->OnEventUserOnLine(pIServerUserItem); if (!bRet) { CString csTestB; csTestB.Format(_T("断线重练失败 -> 原因:OnEventUserOnLine调用失败, 用户ID:%d,桌号:%d,状态:%d chairID=%d"), pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , pIServerUserItem->GetUserInfo()->cbUserStatus, pIServerUserItem->GetChairID()); CTraceService::TraceString(csTestB, TraceLevel_Normal); } else{ m_Data.dLoginDuanXianOK++; } } else { CString csTestB; csTestB.Format(_T("断线重练失败 -> 原因:桌号实体不存在, 用户ID:%d,桌号:%d,状态:%d"), pIServerUserItem->GetUserID() , pIServerUserItem->GetUserInfo()->wTableID , pIServerUserItem->GetUserInfo()->cbUserStatus); CTraceService::TraceString(csTestB, TraceLevel_Normal); ///+++2017-11-24 pIServerUserItem->SetUserStatus(US_FREE, INVALID_TABLE, INVALID_CHAIR, false); } } //} //网络设置 if (bAndroidUser == false) { if (pBindParameter->cbClientKind == CLIENT_KIND_MOBILE) { m_pITCPNetworkEngine->AllowBatchSend(pBindParameter->dwSocketID, true, BG_MOBILE); } else { m_pITCPNetworkEngine->AllowBatchSend(pBindParameter->dwSocketID, true, BG_COMPUTER); } } //登录通知 //if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventUserLogon(pIServerUserItem); return; } //用户离开 VOID CAttemperEngineSink::OnEventUserLogout(IServerUserItem * pIServerUserItem, DWORD dwLeaveReason) { //变量定义 DBR_GR_LeaveGameServer LeaveGameServer; ZeroMemory(&LeaveGameServer, sizeof(LeaveGameServer)); //提取成绩 pIServerUserItem->QueryRecordInfo(LeaveGameServer.RecordInfo); pIServerUserItem->DistillVariation(LeaveGameServer.VariationInfo); //用户信息 LeaveGameServer.dwLeaveReason = dwLeaveReason; LeaveGameServer.dwUserID = pIServerUserItem->GetUserID(); LeaveGameServer.dwInoutIndex = pIServerUserItem->GetInoutIndex(); LeaveGameServer.dwOnLineTimeCount = (DWORD)(time(NULL)) - pIServerUserItem->GetLogonTime(); //连接信息 LeaveGameServer.dwClientAddr = pIServerUserItem->GetClientAddr(); lstrcpyn(LeaveGameServer.szMachineID, pIServerUserItem->GetMachineID(), CountArray(LeaveGameServer.szMachineID)); //投递请求 //m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_LEAVE_GAME_SERVER, 0L, &LeaveGameServer, sizeof(LeaveGameServer), TRUE); //查找对象 //tagUserTaskEntry * pUserTaskEntry = m_UserTaskManager.GetUserTaskEntry(pIServerUserItem->GetUserID(), TASK_STATUS_UNFINISH | TASK_STATUS_FAILED); //推进任务 //if (pUserTaskEntry != NULL) //{ // PerformTaskProgress(pIServerUserItem, pUserTaskEntry, LeaveGameServer.VariationInfo.dwWinCount, LeaveGameServer.VariationInfo.dwLostCount, LeaveGameServer.VariationInfo.dwDrawCount); //} //汇总用户 if (m_bCollectUser == true) { //变量定义 CMD_CS_C_UserLeave UserLeave; ZeroMemory(&UserLeave, sizeof(UserLeave)); //设置变量 UserLeave.dwUserID = pIServerUserItem->GetUserID(); /*DWORD dTableNum = 0;*/ if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE) { auto pat = GetTableFrame(pIServerUserItem->GetTableID()); TCHAR szTemp[32] = { 0 }; if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; /*if (!csTemp.IsEmpty()) { dTableNum = _wtol(szTemp); }*/ } //发送消息 m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_LEAVE, &UserLeave, sizeof(UserLeave)/*, dTableNum, pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); } //玩家退赛 //if (m_pIMatchServiceManager != NULL) //{ // m_pIMatchServiceManager->OnEventUserQuitMatch(pIServerUserItem, 0); //} //删除分组 DeleteDistribute(pIServerUserItem); //移除任务 //m_UserTaskManager.RemoveUserTask(pIServerUserItem->GetUserID()); //删除用户 m_ServerUserManager.DeleteUserItem(pIServerUserItem); //登出通知 //if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventUserLogout(pIServerUserItem); return; } //解锁游戏币 bool CAttemperEngineSink::PerformUnlockScore(DWORD dwUserID, DWORD dwInoutIndex, DWORD dwLeaveReason) { return true; ////变量定义 //DBR_GR_LeaveGameServer LeaveGameServer; //ZeroMemory(&LeaveGameServer, sizeof(LeaveGameServer)); ////设置变量 //LeaveGameServer.dwUserID = dwUserID; //LeaveGameServer.dwInoutIndex = dwInoutIndex; //LeaveGameServer.dwLeaveReason = dwLeaveReason; ////投递请求 ////m_pIDBCorrespondManager->PostDataBaseRequest(dwUserID, DBR_GR_LEAVE_GAME_SERVER, 0L, &LeaveGameServer, sizeof(LeaveGameServer)); //return true; } //推进任务 bool CAttemperEngineSink::PerformTaskProgress(IServerUserItem * pIServerUserItem, tagUserTaskEntry * pUserTaskEntry, DWORD dwWinCount, DWORD dwLostCount, DWORD dwDrawCount) { //参数校验 ASSERT(pIServerUserItem != NULL && pUserTaskEntry != NULL); if (pIServerUserItem == NULL || pUserTaskEntry == NULL) return false; //状态校验 if (pUserTaskEntry->pTaskParameter == NULL) return true; if (pUserTaskEntry->cbTaskStatus != TASK_STATUS_UNFINISH) return true; if (pUserTaskEntry->pTaskParameter->wKindID != m_pGameServiceOption->wKindID) return true; //任务参数 tagTaskParameter * pTaskParameter = pUserTaskEntry->pTaskParameter; //获取时间 DWORD dwSpanSecond = (DWORD)time(NULL) - pUserTaskEntry->dwLastUpdateTime; dwSpanSecond = __min(dwSpanSecond, pUserTaskEntry->dwResidueTime); //更新时间 pUserTaskEntry->dwResidueTime -= dwSpanSecond; pUserTaskEntry->dwLastUpdateTime = (DWORD)time(NULL); //任务超时 if (pUserTaskEntry->dwResidueTime == 0) { pUserTaskEntry->wTaskProgress = 0; pUserTaskEntry->pTaskParameter = NULL; pUserTaskEntry->cbTaskStatus = TASK_STATUS_FAILED; } //任务未完成 if (pUserTaskEntry->cbTaskStatus == TASK_STATUS_UNFINISH) { //任务类型 switch (pTaskParameter->wTaskType) { case TASK_TYPE_WIN_INNINGS: //赢局任务 { //更新状态 pUserTaskEntry->wTaskProgress += dwWinCount; if (pUserTaskEntry->wTaskProgress >= pTaskParameter->wTaskObject) { pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS; } break; }; case TASK_TYPE_SUM_INNINGS: //总局任务 { //更新状态 pUserTaskEntry->wTaskProgress += dwWinCount + dwLostCount + dwDrawCount; if (pUserTaskEntry->wTaskProgress >= pTaskParameter->wTaskObject) { pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS; } break; }; case TASK_TYPE_FIRST_WIN: //首胜任务 { //更新状态 pUserTaskEntry->wTaskProgress = dwWinCount; if (pUserTaskEntry->wTaskProgress == pTaskParameter->wTaskObject) { pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS; } else { pUserTaskEntry->cbTaskStatus = TASK_STATUS_FAILED; } break; }; case TASK_TYPE_JOIN_MATCH: //比赛任务 { break; }; default: { ASSERT(FALSE); break; }; } } //任务完成 //if (pUserTaskEntry->cbTaskStatus == TASK_STATUS_SUCCESS) //{ // //构造结构 // CMD_GR_S_TaskFinish TaskFinish; // TaskFinish.wFinishTaskID = pTaskParameter->wTaskID; // lstrcpyn(TaskFinish.szTaskName, pTaskParameter->szTaskName, CountArray(TaskFinish.szTaskName)); // //发送消息 // WORD wHeadSize = sizeof(TaskFinish) - sizeof(TaskFinish.szTaskName); // WORD wDataSize = wHeadSize + CountStringBuffer(TaskFinish.szTaskName); // SendData(pIServerUserItem, MDM_GR_TASK, SUB_GR_TASK_FINISH, &TaskFinish, wDataSize); //} //递归调用 if (pUserTaskEntry->pNextTaskEntry != NULL) { PerformTaskProgress(pIServerUserItem, pUserTaskEntry->pNextStatusEntry, dwWinCount, dwLostCount, dwDrawCount); } return true; } //版本检查 bool CAttemperEngineSink::PerformCheckVersion(DWORD dwPlazaVersion, DWORD dwFrameVersion, DWORD dwClientVersion, DWORD dwSocketID) { //变量定义 bool bMustUpdateClient = false; bool bAdviceUpdateClient = false; //游戏版本 //if (VERSION_EFFICACY == TRUE) //{ // if (GetSubVer(dwClientVersion) < GetSubVer(m_pGameServiceAttrib->dwClientVersion)) bAdviceUpdateClient = true; // if (GetMainVer(dwClientVersion) != GetMainVer(m_pGameServiceAttrib->dwClientVersion)) bMustUpdateClient = true; // if (GetProductVer(dwClientVersion) != GetProductVer(m_pGameServiceAttrib->dwClientVersion)) bMustUpdateClient = true; //} //else { if (GetSubVer(dwClientVersion) < GetSubVer(m_pGameParameter->dwClientVersion)) bAdviceUpdateClient = true; if (GetMainVer(dwClientVersion) != GetMainVer(m_pGameParameter->dwClientVersion)) bMustUpdateClient = true; if (GetProductVer(dwClientVersion) != GetProductVer(m_pGameParameter->dwClientVersion)) bMustUpdateClient = true; } //更新通知 if ((bMustUpdateClient == true) || (bAdviceUpdateClient == true)) { //变量定义 CMD_GR_UpdateNotify UpdateNotify; ZeroMemory(&UpdateNotify, sizeof(UpdateNotify)); //变量定义 UpdateNotify.cbMustUpdatePlaza = false; UpdateNotify.cbMustUpdateClient = bMustUpdateClient; UpdateNotify.cbAdviceUpdateClient = bAdviceUpdateClient; //当前版本 UpdateNotify.dwCurrentPlazaVersion = VERSION_PLAZA; UpdateNotify.dwCurrentFrameVersion = VERSION_FRAME; UpdateNotify.dwCurrentClientVersion = m_pGameServiceAttrib->dwClientVersion; //发送消息 SendData(dwSocketID, MDM_GR_LOGON, SUB_GR_UPDATE_NOTIFY, &UpdateNotify, sizeof(UpdateNotify)); //中止判断 if (bMustUpdateClient == true) { m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); return false; } } return true; } //切换连接 bool CAttemperEngineSink::SwitchUserItemConnect(IServerUserItem * pIServerUserItem, TCHAR szMachineID[LEN_MACHINE_ID], WORD wTargetIndex, BYTE cbDeviceType, WORD wBehaviorFlags, WORD wPageTableCount) { //效验参数 ASSERT((pIServerUserItem != NULL) && (wTargetIndex != INVALID_WORD)); if ((pIServerUserItem == NULL) || (wTargetIndex == INVALID_WORD)) { //CTraceService::TraceString(TEXT("登录失败,切换链接校验失败。"), TraceLevel_Normal); return false; } //断开用户 if (pIServerUserItem->GetBindIndex() != INVALID_WORD) { // by jn 此次修改存在风险,属于尝试性修改。稍后观察是否有其他风险 2017/08/21 // pIServerUserItem->DetachBindStatus(); //强制解绑 //发送通知 LPCTSTR pszMessage = TEXT("网络连接不稳定,请重试."); SendRoomMessage(pIServerUserItem, pszMessage, SMT_CLOSE_SEND); //绑定参数 WORD wSourceIndex = pIServerUserItem->GetBindIndex(); tagBindParameter * pSourceParameter = GetBindParameter(wSourceIndex); //解除绑定 ASSERT((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem)); if ((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem)) { pSourceParameter->pIServerUserItem = NULL; } //断开用户 if (pIServerUserItem->IsAndroidUser() == true) { //m_AndroidUserManager.DeleteAndroidUserItem(pSourceParameter->dwSocketID, true); } else { m_pITCPNetworkEngine->ShutDownSocket(pSourceParameter->dwSocketID); } } //变量定义 bool bAndroidUser = (wTargetIndex >= INDEX_ANDROID); tagBindParameter * pTargetParameter = GetBindParameter(wTargetIndex); //激活用户 pTargetParameter->pIServerUserItem = pIServerUserItem; pIServerUserItem->SetUserParameter(pTargetParameter->dwClientAddr, wTargetIndex, szMachineID, bAndroidUser, false); if (pIServerUserItem->GetUserStatus() == US_OFFLINE) { //变量定义 WORD wTableID = pIServerUserItem->GetTableID(); WORD wChairID = pIServerUserItem->GetChairID(); pIServerUserItem->SetUserStatus(US_PLAYING, wTableID, wChairID); } //手机标识 if (pTargetParameter->cbClientKind == CLIENT_KIND_MOBILE) { pIServerUserItem->SetMobileUser(true); SetMobileUserParameter(pIServerUserItem, cbDeviceType, wBehaviorFlags, wPageTableCount); } //取消托管 if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) { if (pIServerUserItem->IsTrusteeUser() == true && pIServerUserItem->GetUserStatus() != US_PLAYING) { pIServerUserItem->SetTrusteeUser(false); } } if (IsJC(7777)) { TCHAR szString[512] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("用户 %s(%d) 切换连接登录"), pIServerUserItem->GetUserInfo()->szNickName, pIServerUserItem->GetUserInfo()->dwUserID); CTraceService::TraceString(szString, TraceLevel_Normal); } //2018.7.2 奚志远 解决大退房间列表不见了 DWORD dwUserID = pIServerUserItem->GetUserID(); auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID); if (iter == m_UserID_2_PriTableIDGROUP.end()) { JN_GR_RoomListGroup Temp; ZeroMemory(&Temp, sizeof(Temp)); std::pair Sub(dwUserID, Temp); m_UserID_2_PriTableIDGROUP.insert(Sub); UserInfo::PB_CS_S_RoomListGroupSend GroupSend; for (WORD i = 0; i < Temp.Num; i++) { if (Temp.jgrDate[i].dwRoomNumber == 0)break; UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate(); RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID); RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID); RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber); RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del); RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen); RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu); RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody); RoomList->set_dwbody(Temp.jgrDate[i].dwBody); RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa); std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz; RoomList->set_szip(szIp); RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai); RoomList->set_wfengding(Temp.jgrDate[i].wFengDing); RoomList->set_tmp1(Temp.jgrDate[i].tmp1); RoomList->set_tmp2(Temp.jgrDate[i].tmp2); RoomList->set_tmp3(Temp.jgrDate[i].tmp3); RoomList->set_tmp4(Temp.jgrDate[i].tmp4); RoomList->set_tmp5(Temp.jgrDate[i].tmp5); for (WORD i = 0; i < 4; i++) { RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]); } RoomList->set_wport(Temp.jgrDate[i].wPort); } GroupSend.set_num(Temp.Num); //发送数据 std::string pbdata = GroupSend.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length()); } else { JN_GR_RoomListGroupSend Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroupSend)); for (int i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++) { CopyMemory(&(Temp.jgrDate[i]), &(m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i]), sizeof(JN_GR_RoomList)); //纠正 Temp.jgrDate[i].tmp1 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].bRoomCreatePay; Temp.jgrDate[i].tmp2 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp1; Temp.jgrDate[i].tmp3 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp2; } UserInfo::PB_CS_S_RoomListGroupSend GroupSend; for (WORD i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++) { if (Temp.jgrDate[i].dwRoomNumber == 0)break; UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate(); RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID); RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID); RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber); RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del); RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen); RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu); RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody); RoomList->set_dwbody(Temp.jgrDate[i].dwBody); RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa); std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz; RoomList->set_szip(szIp); RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai); RoomList->set_wfengding(Temp.jgrDate[i].wFengDing); RoomList->set_tmp1(Temp.jgrDate[i].tmp1); RoomList->set_tmp2(Temp.jgrDate[i].tmp2); RoomList->set_tmp3(Temp.jgrDate[i].tmp3); RoomList->set_tmp4(Temp.jgrDate[i].tmp4); RoomList->set_tmp5(Temp.jgrDate[i].tmp5); for (WORD i = 0; i < 4; i++) { RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]); } RoomList->set_wport(Temp.jgrDate[i].wPort); } GroupSend.set_num(m_UserID_2_PriTableIDGROUP[dwUserID].Num); //发送数据 std::string pbdata = GroupSend.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length()); } //提示消息 //CTraceService::TraceString(szString, TraceLevel_Normal); //登录事件 OnEventUserLogon(pIServerUserItem, true); //安全提示 //if ((bAndroidUser == false) && (bIsOffLine == false) && (bSameMachineID == false)) //{ // SendRoomMessage(pIServerUserItem, TEXT("请注意,您的帐号在另一地方进入了此游戏房间,对方被迫离开!"), SMT_CLOSE_SEND); //} return true; } //登录失败 bool CAttemperEngineSink::SendLogonFailure(LPCTSTR pszString, LONG lErrorCode, DWORD dwSocketID) { CTraceService::TraceString(TEXT("登录失败 SendLogonFailure"), TraceLevel_Exception); //变量定义 TurntableLogon::PB_CS_S_LogonFailure Failure; Failure.set_lerrorcode(lErrorCode); std::string szDescribeString = CW2AEX<1024>(pszString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); SendData(dwSocketID, MDM_GR_LOGON, SUB_M_LOGON_FAILURE, (void*)pbdata.c_str(), pbdata.length()); return true; } //银行失败 //bool CAttemperEngineSink::SendInsureFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszString, LONG lErrorCode, BYTE cbActivityGame) //{ // CTraceService::TraceString(TEXT("银行失败 SendInsureFailure"), TraceLevel_Debug); // //效验参数 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) return false; // // //变量定义 // CMD_GR_S_UserInsureFailure UserInsureFailure; // ZeroMemory(&UserInsureFailure, sizeof(UserInsureFailure)); // // //构造数据 // UserInsureFailure.cbActivityGame = cbActivityGame; // UserInsureFailure.lErrorCode = lErrorCode; // lstrcpyn(UserInsureFailure.szDescribeString, pszString, CountArray(UserInsureFailure.szDescribeString)); // // //数据属性 // WORD wDataSize = CountStringBuffer(UserInsureFailure.szDescribeString); // WORD wHeadSize = sizeof(UserInsureFailure) - sizeof(UserInsureFailure.szDescribeString); // // //发送数据 // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_FAILURE, &UserInsureFailure, wHeadSize + wDataSize); // // return true; //} //请求失败 bool CAttemperEngineSink::SendRequestFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode) { CTraceService::TraceString(TEXT("请求失败 SendRequestFailure"), TraceLevel_Debug); //变量定义 CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = lErrorCode; lstrcpyn(RequestFailure.szDescribeString, pszDescribe, CountArray(RequestFailure.szDescribeString)); UserInfo::PB_CS_S_RequestFailure Failure; Failure.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length()); return true; } //道具失败 //bool CAttemperEngineSink::SendPropertyFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode, WORD wRequestArea) //{ // //变量定义 // CMD_GR_PropertyFailure PropertyFailure; // ZeroMemory(&PropertyFailure, sizeof(PropertyFailure)); // // //设置变量 // PropertyFailure.lErrorCode = lErrorCode; // PropertyFailure.wRequestArea = wRequestArea; // lstrcpyn(PropertyFailure.szDescribeString, pszDescribe, CountArray(PropertyFailure.szDescribeString)); // // //发送数据 // WORD wDataSize = CountStringBuffer(PropertyFailure.szDescribeString); // WORD wHeadSize = sizeof(PropertyFailure) - sizeof(PropertyFailure.szDescribeString); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_PROPERTY_FAILURE, &PropertyFailure, wHeadSize + wDataSize); // // return true; //} //发送用户 bool CAttemperEngineSink::SendUserInfoPacket(IServerUserItem * pIServerUserItem, DWORD dwSocketID, bool bSendAndroidFalg) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //变量定义 BYTE cbBuffer[SOCKET_TCP_PACKET]; tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); tagUserInfoHead * pUserInfoHead = (tagUserInfoHead *)cbBuffer; CSendPacketHelper SendPacket(cbBuffer + sizeof(tagUserInfoHead), sizeof(cbBuffer) - sizeof(tagUserInfoHead)); //用户属性 pUserInfoHead->wFaceID = pUserInfo->wFaceID; pUserInfoHead->dwGameID = pUserInfo->dwGameID; pUserInfoHead->dwUserID = pUserInfo->dwUserID; pUserInfoHead->dwGroupID = pUserInfo->dwGroupID; pUserInfoHead->dwCustomID = pUserInfo->dwCustomID; //用户属性 pUserInfoHead->cbGender = pUserInfo->cbGender; pUserInfoHead->cbMemberOrder = pUserInfo->cbMemberOrder; pUserInfoHead->cbMasterOrder = pUserInfo->cbMasterOrder; pUserInfoHead->bIsAndroid = pIServerUserItem->IsAndroidUser() && bSendAndroidFalg; //用户状态 pUserInfoHead->wTableID = pUserInfo->wTableID; pUserInfoHead->wChairID = pUserInfo->wChairID; pUserInfoHead->cbUserStatus = pUserInfo->cbUserStatus; //用户局数 pUserInfoHead->dwWinCount = pUserInfo->dwWinCount; pUserInfoHead->dwLostCount = pUserInfo->dwLostCount; pUserInfoHead->dwDrawCount = pUserInfo->dwDrawCount; pUserInfoHead->dwFleeCount = pUserInfo->dwFleeCount; pUserInfoHead->dwExperience = pUserInfo->dwExperience; pUserInfoHead->lLoveLiness = pUserInfo->lLoveLiness; //用户积分 pUserInfoHead->lGrade = pUserInfo->lGrade; pUserInfoHead->lInsure = pUserInfo->lInsure; pUserInfoHead->lIngot = 0; //用户成绩 pUserInfoHead->lScore = pUserInfo->lScore; pUserInfoHead->lScore += pIServerUserItem->GetTrusteeScore(); pUserInfoHead->lScore += pIServerUserItem->GetFrozenedScore(); //叠加信息 SendPacket.AddPacket(pUserInfo->szNickName, DTP_GR_NICK_NAME); SendPacket.AddPacket(pUserInfo->szGroupName, DTP_GR_GROUP_NAME); SendPacket.AddPacket(pUserInfo->szUnderWrite, DTP_GR_UNDER_WRITE); //发送数据 if (dwSocketID == INVALID_DWORD) { WORD wHeadSize = sizeof(tagUserInfoHead); SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_ENTER, cbBuffer, wHeadSize + SendPacket.GetDataSize()); SendUserInfoPacketBatchToMobileUser(pIServerUserItem); } else { WORD wHeadSize = sizeof(tagUserInfoHead); SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_ENTER, cbBuffer, wHeadSize + SendPacket.GetDataSize()); } return true; } ////广播道具 //bool CAttemperEngineSink::SendPropertyMessage(DWORD dwSourceID, DWORD dwTargerID, WORD wPropertyIndex, WORD wPropertyCount) //{ // //构造结构 // CMD_GR_S_PropertyMessage PropertyMessage; // PropertyMessage.wPropertyIndex = wPropertyIndex; // PropertyMessage.dwSourceUserID = dwSourceID; // PropertyMessage.dwTargerUserID = dwTargerID; // PropertyMessage.wPropertyCount = wPropertyCount; // // //在线用户 // WORD wUserIndex = 0; // while (true) // { // IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); // if (pIServerUserItemSend == NULL) break; // SendData(pIServerUserItemSend, MDM_GR_USER, SUB_GR_PROPERTY_MESSAGE, &PropertyMessage, sizeof(PropertyMessage)); // } // // return true; //} //道具效应 //bool CAttemperEngineSink::SendPropertyEffect(IServerUserItem * pIServerUserItem) //{ // //参数校验 // if (pIServerUserItem == NULL) return false; // // //构造结构 // CMD_GR_S_PropertyEffect PropertyEffect; // PropertyEffect.wUserID = pIServerUserItem->GetUserID(); // PropertyEffect.cbMemberOrder = pIServerUserItem->GetMemberOrder(); // // //在线用户 // WORD wUserIndex = 0; // while (true) // { // IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); // if (pIServerUserItemSend == NULL) break; // SendData(pIServerUserItemSend, MDM_GR_USER, SUB_GR_PROPERTY_EFFECT, &PropertyEffect, sizeof(PropertyEffect)); // } // // return true; //} //道具事件 //bool CAttemperEngineSink::OnEventPropertyBuyPrep(WORD cbRequestArea, WORD wPropertyIndex, IServerUserItem *pISourceUserItem, IServerUserItem *pTargetUserItem) //{ // //目标玩家 // if (pTargetUserItem == NULL) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("赠送失败,您要赠送的玩家已经离开!"), 0L, cbRequestArea); // // return false; // } // // //房间判断 // if ((m_pGameServiceOption->wServerType == GAME_GENRE_GOLD || m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) && // (wPropertyIndex == PROPERTY_ID_SCORE_CLEAR || wPropertyIndex == PROPERTY_ID_TWO_CARD || wPropertyIndex == PROPERTY_ID_FOUR_CARD || wPropertyIndex == PROPERTY_ID_POSSESS)) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("此房间不可以使用此道具,购买失败"), 0L, cbRequestArea); // // return false; // } // // //查找道具 // tagPropertyInfo * pPropertyInfo = m_GamePropertyManager.SearchPropertyItem(wPropertyIndex); // // //有效效验 // if (pPropertyInfo == NULL) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("此道具还未启用,购买失败!"), 0L, cbRequestArea); // // return false; // } // // //自己使用 // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_MESELF) == 0 && pISourceUserItem == pTargetUserItem) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可自己使用,购买失败!"), 0L, cbRequestArea); // // return false; // } // // //玩家使用 // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_PLAYER) == 0 && pISourceUserItem != pTargetUserItem) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可赠送给玩家,只能自己使用,购买失败!"), 0L, cbRequestArea); // // return false; // } // // //旁观范围 // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_LOOKON) == 0) // { // //变量定义 // WORD wTableID = pTargetUserItem->GetTableID(); // if (wTableID != INVALID_TABLE) // { // //变量定义 // WORD wEnumIndex = 0; // //获取桌子 // auto pTableFrame = GetTableFrame(wTableID); // if (!pTableFrame) // return false; // //枚举用户 // do // { // //获取用户 // IServerUserItem * pIServerUserItem = pTableFrame->EnumLookonUserItem(wEnumIndex++); // if (pIServerUserItem == nullptr) break; // if (pIServerUserItem == pTargetUserItem) // { // //发送消息 // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可赠送给旁观用户,购买失败!"), 0L, cbRequestArea); // return false; // } // } while (true); // } // } // // //道具判断 // switch (wPropertyIndex) // { // case PROPERTY_ID_SCORE_CLEAR: //负分清零 // { // //变量定义 // SCORE lCurrScore = pTargetUserItem->GetUserScore(); // if (lCurrScore >= 0) // { // //变量定义 // TCHAR szMessage[128] = TEXT(""); // if (pISourceUserItem == pTargetUserItem) // _sntprintf(szMessage, CountArray(szMessage), TEXT("您现在的积分已经是非负数,不需要使用负分清零道具!")); // else // _sntprintf(szMessage, CountArray(szMessage), TEXT("[ %s ]现在的积分已经是非负数,不需要使用负分清零道具!"), pTargetUserItem->GetNickName()); // // //发送消息 // SendPropertyFailure(pISourceUserItem, szMessage, 0L, cbRequestArea); // // return false; // } // break; // } // case PROPERTY_ID_ESCAPE_CLEAR: //逃跑清零 // { // //变量定义 // DWORD dwCurrFleeCount = pTargetUserItem->GetUserInfo()->dwFleeCount; // if (dwCurrFleeCount == 0) // { // //变量定义 // TCHAR szMessage[128] = TEXT(""); // if (pISourceUserItem == pTargetUserItem) // _sntprintf(szMessage, CountArray(szMessage), TEXT("您现在的逃跑率已经为0,不需要使用逃跑清零道具!")); // else // _sntprintf(szMessage, CountArray(szMessage), TEXT("[ %s ]现在的逃跑率已经为0,不需要使用逃跑清零道具!"), pTargetUserItem->GetNickName()); // // //发送消息 // SendPropertyFailure(pISourceUserItem, szMessage, 0L, cbRequestArea); // // return false; // } // break; // } // default: break; // } // // return true; //} //绑定用户 IServerUserItem * CAttemperEngineSink::GetBindUserItem(WORD wBindIndex) { //获取参数 tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); //获取用户 if (pBindParameter != NULL) { return pBindParameter->pIServerUserItem; } else { CString strErr; strErr.Format(_T("绑定用户失败 pBindParameter=NULL")); CTraceService::TraceString(strErr, TraceLevel_Normal); } //错误断言 ASSERT(FALSE); return NULL; } //绑定参数 tagBindParameter * CAttemperEngineSink::GetBindParameter(WORD wBindIndex) { //无效连接 if (wBindIndex == INVALID_WORD) { //CString strErr; //strErr.Format(_T("绑定用户失败 wBindIndex=INVALID_WORD")); //CTraceService::TraceString(strErr, TraceLevel_Normal); return NULL; } if (m_pGameServiceOption == NULL) { CString strErr; strErr.Format(_T("绑定用户失败 m_pGameServiceOption=NULL")); CTraceService::TraceString(strErr, TraceLevel_Normal); return NULL; } //常规连接 if (wBindIndex < m_pGameServiceOption->wMaxPlayer) { return m_pNormalParameter + wBindIndex; } //机器连接 //if ((wBindIndex >= INDEX_ANDROID) && (wBindIndex < (INDEX_ANDROID + MAX_ANDROID))) //{ // return m_pAndroidParameter + (wBindIndex - INDEX_ANDROID); //} //else { ///---记录下非法索引 CString strErr; strErr.Format(_T("绑定索引错误,wBindIndex=%d"), wBindIndex); CTraceService::TraceString(strErr, TraceLevel_Warning); } //错误断言 ASSERT(FALSE); return NULL; } //道具类型 WORD CAttemperEngineSink::GetPropertyType(WORD wPropertyIndex) { switch (wPropertyIndex) { case PROPERTY_ID_CAR: case PROPERTY_ID_EGG: case PROPERTY_ID_CLAP: case PROPERTY_ID_KISS: case PROPERTY_ID_BEER: case PROPERTY_ID_CAKE: case PROPERTY_ID_RING: case PROPERTY_ID_BEAT: case PROPERTY_ID_BOMB: case PROPERTY_ID_SMOKE: case PROPERTY_ID_VILLA: case PROPERTY_ID_BRICK: case PROPERTY_ID_FLOWER: { return PT_TYPE_PRESENT; }; case PROPERTY_ID_TWO_CARD: case PROPERTY_ID_FOUR_CARD: case PROPERTY_ID_SCORE_CLEAR: case PROPERTY_ID_ESCAPE_CLEAR: case PROPERTY_ID_TRUMPET: case PROPERTY_ID_TYPHON: case PROPERTY_ID_GUARDKICK_CARD: case PROPERTY_ID_POSSESS: case PROPERTY_ID_BLUERING_CARD: case PROPERTY_ID_YELLOWRING_CARD: case PROPERTY_ID_WHITERING_CARD: case PROPERTY_ID_REDRING_CARD: case PROPERTY_ID_VIPROOM_CARD: { return PT_TYPE_PROPERTY; }; default: break; } ASSERT(false); return PT_TYPE_ERROR; } //分配用户 bool CAttemperEngineSink::PerformDistribute() { //人数校验 if (m_DistributeManage.GetCount() < m_pGameServiceOption->wMinDistributeUser) return false; //分配用户 while (true) { //人数校验 if (m_DistributeManage.GetCount() < m_pGameServiceOption->wMinPartakeGameUser) break; //变量定义 CDistributeInfoArray DistributeInfoArray; //获取用户 WORD wRandCount = __max(m_pGameServiceOption->wMaxPartakeGameUser - m_pGameServiceOption->wMinPartakeGameUser + 1, 1); WORD wChairCount = m_pGameServiceOption->wMinPartakeGameUser + rand() % wRandCount; WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray, wChairCount); if (wDistributeCount < m_pGameServiceOption->wMinPartakeGameUser) break; //寻找位置 std::shared_ptr pCurrTableFrame; for (WORD i = 0; i < m_pGameServiceOption->wTableCount; i++) { auto pTableFrame = GetTableFrame(i);//获取对象 if (!pTableFrame) continue; //状态判断 if (pTableFrame->GetSitUserCount() == 0) { pCurrTableFrame = pTableFrame; break; } } //桌子判断 if (!pCurrTableFrame) break; //玩家坐下 bool bSitSuccess = true; INT_PTR nSitFailedIndex = INVALID_CHAIR; for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++) { //变量定义 WORD wChairID = pCurrTableFrame->GetNullChairID(); //分配用户 if (wChairID != INVALID_CHAIR) { //获取用户 IServerUserItem * pIServerUserItem = DistributeInfoArray[nIndex].pIServerUserItem; //用户坐下 if (pCurrTableFrame->PerformSitDownAction(wChairID, pIServerUserItem) == false) { bSitSuccess = false; nSitFailedIndex = nIndex; break; } } } //坐下结果 if (bSitSuccess) { //移除结点 while (DistributeInfoArray.GetCount() > 0) { m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode); DistributeInfoArray.RemoveAt(0); } } else { for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++) { if (nSitFailedIndex == nIndex) { m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[nIndex].pPertainNode); } else { //用户起立 if (DistributeInfoArray[nIndex].pIServerUserItem->GetTableID() != INVALID_TABLE) { WORD wTableID = DistributeInfoArray[nIndex].pIServerUserItem->GetTableID(); auto pTableFrame = GetTableFrame(wTableID);//获取对象 if (!pTableFrame) return false; pTableFrame->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem); } } } } } //提示消息 CString csTest; csTest.Format(_T("分配用户IDI_DISTRIBUTE_USER ---->分组值m_DistributeManage.GetCount() %d "), m_DistributeManage.GetCount()); CTraceService::TraceString(csTest, TraceLevel_Normal); return true; } //配置机器 bool CAttemperEngineSink::InitAndroidUser() { //机器参数 tagAndroidUserParameter AndroidUserParameter; ZeroMemory(&AndroidUserParameter, sizeof(AndroidUserParameter)); //配置参数 AndroidUserParameter.bServiceContinue = true; AndroidUserParameter.pGameParameter = m_pGameParameter; AndroidUserParameter.pGameServiceAttrib = m_pGameServiceAttrib; AndroidUserParameter.pGameServiceOption = m_pGameServiceOption; //服务组件 AndroidUserParameter.pITimerEngine = m_pITimerEngine; AndroidUserParameter.pIServerUserManager = &m_ServerUserManager; AndroidUserParameter.pIGameServiceManager = m_pIGameServiceManager; AndroidUserParameter.pITCPNetworkEngineEvent = QUERY_OBJECT_PTR_INTERFACE(m_pIAttemperEngine, ITCPNetworkEngineEvent); //服务配置 if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR) { AndroidUserParameter.bServiceContinue = false; AndroidUserParameter.dwMinSitInterval = MIN_INTERVAL_TIME; AndroidUserParameter.dwMaxSitInterval = MAX_INTERVAL_TIME; } //设置对象 //if (m_AndroidUserManager.InitAndroidUser(AndroidUserParameter) == false) //{ // return false; //} return true; } std::wstring CAttemperEngineSink::GetNextPrivateRoomID(int idLen) { //连接协调服务器,创建私有房间号码 static std::wstring str = L"123456789"; static std::wstring zero = L"0"; srand(time(nullptr)); const int tryTimes = 100; //失败尝试次数 int a = m_pGameServiceOption->wServerID % 100 / 10; // 十位数 int b = m_pGameServiceOption->wServerID % 100 % 10; // 个位数 if (b == 9) a++; std::wstring roomID(L""); for (int i = 0; i < tryTimes; i++) { roomID.resize(idLen); for (int j = 0; j < idLen; j++) roomID[j] = str[rand() % str.length()]; roomID[4] = str[a]; if (b == 9) roomID[5] = zero[0]; else roomID[5] = str[b]; auto titer = m_PriTableID_2_TableID.find(roomID); if (titer == m_PriTableID_2_TableID.end()) return roomID; } return roomID; } bool CAttemperEngineSink::DecUserTable(DWORD dwUser, DWORD dwTableID,int TableCount) { const auto iterate = m_UserID_2_PriTableIDGROUP.find(dwUser); if (iterate == std::end(m_UserID_2_PriTableIDGROUP)) return false; JN_GR_RoomListGroup Temp = iterate->second; JN_GR_RoomListGroup TempSet; ZeroMemory(&TempSet, sizeof(JN_GR_RoomListGroup)); bool bEnd = false; int iNum = 0; for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++) { if (Temp.jgrDate[i].dwRoomNumber == dwTableID && dwTableID > 0) { //同步到中心服务器 JN_GR_RoomListBig UserChat = Temp.jgrDate[i]; UserChat.dwInsert_UpData_Del = 2; UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat)); //俱乐部删除桌子广播 if (UserChat.roomType == 1 && UserChat.tmp6[0] != 0) { if (UserChat.tmp5 == 0 || (UserChat.tmp5 == 1 && TableCount > 1)) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = UserChat.tmp6[0]; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } } } else { if (Temp.jgrDate[i].dwRoomNumber != 0) { TempSet.jgrDate[iNum] = Temp.jgrDate[i]; iNum++; } } } TempSet.Num = iNum; if (iNum == 0) bEnd = true; if (bEnd) { m_UserID_2_PriTableIDGROUP.erase(dwUser); } else { m_UserID_2_PriTableIDGROUP[dwUser] = TempSet; } return true; } std::shared_ptr CAttemperEngineSink::CreatePrivateTable(DWORD RoomID, WORD wGameType) { CString PrivateTableID; PrivateTableID.Format(_T("%d"), RoomID); //桌子参数 tagTableFrameParameter TableFrameParameter; ZeroMemory(&TableFrameParameter, sizeof(TableFrameParameter)); //内核组件 TableFrameParameter.pITimerEngine = m_pITimerEngine; TableFrameParameter.pIKernelDataBaseEngine = m_pIKernelDataBaseEngine; TableFrameParameter.pIRecordDataBaseEngine = m_pIRecordDataBaseEngine; //服务组件 TableFrameParameter.pIMainServiceFrame = this; //TableFrameParameter.pIAndroidUserManager = &m_AndroidUserManager; TableFrameParameter.pIGameServiceManager = m_pIGameServiceManager; //配置参数 TableFrameParameter.pGameParameter = m_pGameParameter; TableFrameParameter.pGameServiceAttrib = m_pGameServiceAttrib; TableFrameParameter.pGameServiceOption = m_pGameServiceOption; auto table = std::make_shared(); TCHAR szTemp[32] = { 0 }; if (table != nullptr) table->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; table->SetPrivateTableID(PrivateTableID.GetBuffer(0)); PrivateTableID.ReleaseBuffer(); const auto tableId = m_privateTableIDPool.front(); m_privateTableIDPool.pop_front(); ///---如果用完了呢? m_TableFrameArray[tableId] = table; //配置桌子 if (table->InitializationFrame(tableId, TableFrameParameter, wGameType) == false) { return nullptr; } return table; } //配置桌子 bool CAttemperEngineSink::InitTableFrameArray() { //桌子参数 tagTableFrameParameter TableFrameParameter; ZeroMemory(&TableFrameParameter, sizeof(TableFrameParameter)); //内核组件 TableFrameParameter.pITimerEngine = m_pITimerEngine; TableFrameParameter.pIKernelDataBaseEngine = m_pIKernelDataBaseEngine; TableFrameParameter.pIRecordDataBaseEngine = m_pIRecordDataBaseEngine; //服务组件 TableFrameParameter.pIMainServiceFrame = this; //TableFrameParameter.pIAndroidUserManager = &m_AndroidUserManager; TableFrameParameter.pIGameServiceManager = m_pIGameServiceManager; //配置参数 TableFrameParameter.pGameParameter = m_pGameParameter; TableFrameParameter.pGameServiceAttrib = m_pGameServiceAttrib; TableFrameParameter.pGameServiceOption = m_pGameServiceOption; //创建桌子 for (WORD i = 0; i < m_pGameServiceOption->wTableCount; i++) { //创建对象 auto pTableFrame = std::make_shared(); m_TableFrameArray[i] = pTableFrame; //配置桌子 if (pTableFrame->InitializationFrame(i, TableFrameParameter,1) == false) { return false; } //绑定桌子 //if (m_pIMatchServiceManager != NULL) //{ // m_pIMatchServiceManager->BindTableFrame(QUERY_OBJECT_PTR_INTERFACE((m_TableFrameArray[i]), ITableFrame), i); //} } return true; } //配置比赛 //bool CAttemperEngineSink::InitMatchServiceManager() //{ // //参数校验 // if (m_pIMatchServiceManager == NULL) return true; // // //桌子参数 // tagMatchManagerParameter MatchManagerParameter; // ZeroMemory(&MatchManagerParameter, sizeof(MatchManagerParameter)); // // //配置参数 // MatchManagerParameter.pGameMatchOption = m_pGameMatchOption; // MatchManagerParameter.pGameServiceOption = m_pGameServiceOption; // MatchManagerParameter.pGameServiceAttrib = m_pGameServiceAttrib; // // //内核组件 // MatchManagerParameter.pITimerEngine = m_pITimerEngine; // MatchManagerParameter.pICorrespondManager = m_pIDBCorrespondManager; // MatchManagerParameter.pTCPNetworkEngine = QUERY_OBJECT_PTR_INTERFACE(m_pIAttemperEngine, ITCPNetworkEngineEvent); // // //服务组件 // MatchManagerParameter.pIMainServiceFrame = this; // MatchManagerParameter.pIServerUserItemSink = this; // MatchManagerParameter.pIAndroidUserManager = &m_AndroidUserManager; // MatchManagerParameter.pIServerUserManager = QUERY_OBJECT_INTERFACE(m_ServerUserManager, IServerUserManager); // // //初始化接口 // m_pIMatchServiceManager->InitMatchInterface(MatchManagerParameter); // // return true; //} //发送请求 bool CAttemperEngineSink::SendUIControlPacket(WORD wRequestID, VOID * pData, WORD wDataSize) { //发送数据 CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits; pServiceUnits->PostControlRequest(wRequestID, pData, wDataSize); return true; } //插入分配 bool CAttemperEngineSink::InsertDistribute(IServerUserItem * pIServerUserItem) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //状态判断 ASSERT(pIServerUserItem->GetUserStatus() < US_PLAYING); if (pIServerUserItem->GetUserStatus() >= US_PLAYING) return false; //比赛类型 //if (m_pIMatchServiceManager != NULL) //{ // //获取参数 // WORD wBindIndex = pIServerUserItem->GetBindIndex(); // tagBindParameter * pBindParameter = GetBindParameter(wBindIndex); // //加入比赛 // return m_pIMatchServiceManager->OnEventUserJoinMatch(pIServerUserItem, 0, pBindParameter->dwSocketID); //} //变量定义 tagDistributeInfo DistributeInfo; ZeroMemory(&DistributeInfo, sizeof(DistributeInfo)); //设置变量 DistributeInfo.pIServerUserItem = pIServerUserItem; DistributeInfo.wLastTableID = pIServerUserItem->GetTableID(); DistributeInfo.pPertainNode = NULL; //加入数组 if (m_DistributeManage.InsertDistributeNode(DistributeInfo) == false) { return pIServerUserItem->IsAndroidUser() ? false : true; } //用户起立 if (pIServerUserItem->GetTableID() != INVALID_TABLE) { WORD wTableID = pIServerUserItem->GetTableID(); auto pTableFrame = GetTableFrame(wTableID);//获取对象 if (!pTableFrame) return false; pTableFrame->PerformStandUpAction(pIServerUserItem); } UserInfo::PB_CS_S_Distribute Distribute; //发送数据 std::string pbdata = Distribute.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_WAIT_DISTRIBUTE, (void*)pbdata.c_str(), pbdata.length()); //分配判断 bool bDistribute = false; if (m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_IMMEDIATE) bDistribute = true; //执行分组 if (bDistribute == true) { PerformDistribute(); } return true; } bool CAttemperEngineSink::DeletePrivateTable(ITableFrame* pTableFrame) { if (!pTableFrame) return false; TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); CString csTemp = szTemp; JN_GR_RoomListBig TargetRoom; ZeroMemory(&TargetRoom, sizeof(TargetRoom)); if (csTemp.IsEmpty()) { return false; } else { CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.dwRoomNumber == _ttol(szTemp)) { TargetRoom = Temp; break; } it++; } } //俱乐部自动创房判定 int TableCount = 0; if (TargetRoom.tmp5 == 1 && TargetRoom.roomType == 1) { int FreeTalbe = 0; CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.tmp6[0] == TargetRoom.tmp6[0] && Temp.roomStatus == 0 && Temp.dwRoomNumber != TargetRoom.dwRoomNumber) { FreeTalbe++; } if (Temp.tmp6[0] == TargetRoom.tmp6[0]) { TableCount++; } it++; } //没有找到空闲的桌子 if (FreeTalbe == 0) { this->OnAutoCreateRoomToDB(TargetRoom.tmp6[0], 0, TargetRoom.tmp4); } } bool result = DecUserTable(pTableFrame->GetPrivateTableOwnerID(), _ttol(szTemp), TableCount); if (result == false) { //无条件上报删除该桌子 TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("上报删除桌子 [ tableID=%d ]"), _ttol(szTemp)); CTraceService::TraceString(szString, TraceLevel_Warning); TargetRoom.dwInsert_UpData_Del = 2; UpdataBodyOwnRoomToServer(&TargetRoom, sizeof(TargetRoom)); //俱乐部删除桌子广播 if (TargetRoom.roomType == 1 && TargetRoom.tmp6[0] != 0) { if (TargetRoom.tmp5 == 0 || (TargetRoom.tmp5 == 1 && TableCount > 1)) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = TargetRoom.tmp6[0]; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } } } m_TableFrameArray.erase(pTableFrame->GetTableID()); ///---yd 释放桌子后,tableId回收到“私有桌子ID池”中 m_privateTableIDPool.push_back(pTableFrame->GetTableID()); std::wstring sPrivateTableID = szTemp; m_PriTableID_2_TableID.erase(sPrivateTableID); return true; } //敏感词过滤 void CAttemperEngineSink::SensitiveWordFilter(LPCTSTR pMsg, LPTSTR pszFiltered, int nMaxLen) { //m_WordsFilter.Filtrate(pMsg, pszFiltered, nMaxLen); } //删除用户 bool CAttemperEngineSink::DeleteDistribute(IServerUserItem * pIServerUserItem) { //移除节点 m_DistributeManage.RemoveDistributeNode(pIServerUserItem); return true; } //设置参数 void CAttemperEngineSink::SetMobileUserParameter(IServerUserItem * pIServerUserItem, BYTE cbDeviceType, WORD wBehaviorFlags, WORD wPageTableCount) { if (wPageTableCount > m_pGameServiceOption->wTableCount)wPageTableCount = m_pGameServiceOption->wTableCount; pIServerUserItem->SetMobileUserDeskCount(wPageTableCount); pIServerUserItem->SetMobileUserRule(wBehaviorFlags); pIServerUserItem->SetMobileUserMachineType(cbDeviceType); } //群发用户信息 bool CAttemperEngineSink::SendUserInfoPacketBatchToMobileUser(IServerUserItem * pIServerUserItem) { //return true; //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //变量定义 tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); tagMobileUserInfoHead pUserInfoHead; //用户属性 pUserInfoHead.wFaceID = pUserInfo->wFaceID; pUserInfoHead.dwGameID = pUserInfo->dwGameID; pUserInfoHead.dwUserID = pUserInfo->dwUserID; pUserInfoHead.dwCustomID = pUserInfo->dwCustomID; //用户属性 pUserInfoHead.cbGender = pUserInfo->cbGender; pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder; //用户状态 pUserInfoHead.wTableID = pUserInfo->wTableID; pUserInfoHead.wChairID = pUserInfo->wChairID; pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus; //用户局数 pUserInfoHead.dwWinCount = pUserInfo->dwWinCount; pUserInfoHead.dwLostCount = pUserInfo->dwLostCount; pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount; pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount; pUserInfoHead.dwExperience = pUserInfo->dwExperience; pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX; pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY; pUserInfoHead.iJiePing = pUserInfo->llJiePing; pUserInfoHead.iXinYong = pUserInfo->iXinYong; lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate)); //用户成绩 pUserInfoHead.lScore = pUserInfo->lScore; pUserInfoHead.lScore += pIServerUserItem->GetTrusteeScore(); pUserInfoHead.lScore += pIServerUserItem->GetFrozenedScore(); lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi)); lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName)); //用户头像地址 lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl)); //IP地址 pUserInfoHead.dwClientAddr = pIServerUserItem->GetClientAddr(); UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead; UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID); UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID); UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID); UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID); UserInfoHead.set_cbgender(pUserInfoHead.cbGender); UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder); UserInfoHead.set_wtableid(pUserInfoHead.wTableID); UserInfoHead.set_wchairid(pUserInfoHead.wChairID); UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus); UserInfoHead.set_lscore(pUserInfoHead.lScore); UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount); UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount); UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount); UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount); UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience); std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz; std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz; std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz; UserInfoHead.set_sznickname(szNickname); UserInfoHead.set_szheadurl(szHeadUrl); UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr); UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong); UserInfoHead.set_rettime(RetTime); UserInfoHead.set_chengshi(ChengShi); UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX); UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY); UserInfoHead.set_ijieping(pUserInfoHead.iJiePing); //发送数据 std::string pbdata = UserInfoHead.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); return true; } /* ///[+++花牌增加 ---需要客户端确认下,对以前版本是否兼容 tagGameConfig gameConfig; ZeroMemory(&gameConfig, sizeof(gameConfig)); auto pTmpTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (pTmpTableFrame != NULL) { gameConfig = pTmpTableFrame->GetGameConfig(); } SendData(pBindParameter->dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FINISH, &gameConfig, sizeof(gameConfig)); ///+++] */ //发可视用户信息 bool CAttemperEngineSink::SendViewTableUserInfoPacketToMobileUser(IServerUserItem * pIServerUserItem, DWORD dwUserIDReq) { ///[+++花牌增加 ---需要客户端确认下,对以前版本是否兼容 tagGameConfig gameConfig; ZeroMemory(&gameConfig, sizeof(gameConfig)); auto pTmpTableFrame = GetTableFrame(pIServerUserItem->GetTableID()); if (pTmpTableFrame != NULL) { gameConfig = pTmpTableFrame->GetGameConfig(); } ///+++] //变量定义 tagMobileUserInfoHead pUserInfoHead; WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule(); //WORD wTagerTableID = pIServerUserItem->GetTableID(); WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos(); WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount(); bool bViewModeAll = ((wMobileUserRule&VIEW_MODE_ALL) != 0); if (wTagerDeskCount == 0) wTagerDeskCount = 1; //枚举用户 WORD wEnumIndex = 0; while (wEnumIndex < m_ServerUserManager.GetUserItemCount()) { //过滤用户 IServerUserItem *pIUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++); if (pIUserItem == NULL || (dwUserIDReq == INVALID_CHAIR && pIUserItem == pIServerUserItem)) continue; //表示请求所有人但不包含请求自己的信息 if (dwUserIDReq != INVALID_CHAIR && pIUserItem->GetUserID() != dwUserIDReq) continue; //表示只发送指定用户的信息 //部分可视 if (dwUserIDReq == INVALID_CHAIR && !bViewModeAll) {//如果不是全图可见模式,则只发送当前桌子的用户数据 if (pIUserItem->GetTableID() < wTagerDeskPos) continue; if (pIUserItem->GetTableID() > (wTagerDeskPos + wTagerDeskCount - 1)) continue; } //定义变量 tagUserInfo * pUserInfo = pIUserItem->GetUserInfo(); //前端区别麻将判断根据高八位(人数)大于0 则为扑克,反之为麻将 if (14 <= gameConfig.wSubGameID && 16 >= gameConfig.wSubGameID)//扑克表示高8位chairCount 底8位wSubGameID LYH 2018-10-18 { BYTE cbChairCount = pTmpTableFrame->GetChairCount(); pUserInfoHead.wFaceID = ((cbChairCount << 8) | gameConfig.wSubGameID); } else{ pUserInfoHead.wFaceID = gameConfig.wSubGameID/*pUserInfo->wFaceID*/; ///2017-10-25 麻将复用FaceID当作游戏ID } //用户属性 //pUserInfoHead.wFaceID = gameConfig.wSubGameID/*pUserInfo->wFaceID*/; ///2017-10-25 复用FaceID,当作游戏ID pUserInfoHead.dwGameID = pUserInfo->dwGameID; pUserInfoHead.dwUserID = pUserInfo->dwUserID; //DWORD wVenueID = 0xFFFFFFFF; //if (isVenueServer()) //{ // //登录完成 ///---此处应客户端要求,增加场ID,用以标识登录的是金币场 // wVenueID = m_pGameServiceOption->wNodeID; //} //pUserInfoHead.dwCustomID = wVenueID/*pUserInfo->dwCustomID*/; ///---作为场馆ID pUserInfoHead.dwCustomID = pUserInfo->dwCustomID; //用户属性 pUserInfoHead.cbGender = pUserInfo->cbGender; pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder; //用户状态 pUserInfoHead.wTableID = pUserInfo->wTableID; pUserInfoHead.wChairID = pUserInfo->wChairID; pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus; //用户局数 pUserInfoHead.dwWinCount = pUserInfo->dwWinCount; pUserInfoHead.dwLostCount = pUserInfo->dwLostCount; pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount; pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount; pUserInfoHead.dwExperience = pUserInfo->dwExperience; //用户成绩 pUserInfoHead.lScore = pUserInfo->lScore; pUserInfoHead.lScore += pIUserItem->GetTrusteeScore(); pUserInfoHead.lScore += pIUserItem->GetFrozenedScore(); pUserInfoHead.iJiePing = pUserInfo->llJiePing; pUserInfoHead.iXinYong = pUserInfo->iXinYong; pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX; pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY; lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi)); lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName)); //用户头像地址 lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl)); //IP地址 pUserInfoHead.dwClientAddr = pIUserItem->GetClientAddr(); lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate)); UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead; UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID); UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID); UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID); UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID); UserInfoHead.set_cbgender(pUserInfoHead.cbGender); UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder); UserInfoHead.set_wtableid(pUserInfoHead.wTableID); UserInfoHead.set_wchairid(pUserInfoHead.wChairID); UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus); UserInfoHead.set_lscore(pUserInfoHead.lScore); UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount); UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount); UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount); UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount); UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience); std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz; std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz; std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz; UserInfoHead.set_sznickname(szNickname); UserInfoHead.set_szheadurl(szHeadUrl); UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr); UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong); UserInfoHead.set_rettime(RetTime); UserInfoHead.set_chengshi(ChengShi); UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX); UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY); UserInfoHead.set_ijieping(pUserInfoHead.iJiePing); //发送数据 std::string pbdata = UserInfoHead.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length()); } return true; } //手机立即登录 bool CAttemperEngineSink::MobileUserImmediately(IServerUserItem * pIServerUserItem) { CTraceService::TraceString(TEXT("手机立即登录 MobileUserImmediately"), TraceLevel_Debug); //动态加入 bool bDynamicJoin = true; if (m_pGameServiceAttrib->cbDynamicJoin == FALSE) bDynamicJoin = false; if (CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule) == false) bDynamicJoin = false; //查找桌子 INT nStartIndex = rand() % m_pGameServiceOption->wTableCount; for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++) { //定义变量 INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount; //获取桌子 auto pTableFrame = GetTableFrame(nTableIndex);//获取对象 if (!pTableFrame) continue; if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue; if (pTableFrame->IsTableLocked()) continue; if (pTableFrame->GetChairCount() == pTableFrame->GetNullChairCount()) continue; //无效过滤 WORD wChairID = pTableFrame->GetRandNullChairID(); if (wChairID == INVALID_CHAIR) continue; //用户坐下 pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem); return true; } //查找桌子 nStartIndex = rand() % m_pGameServiceOption->wTableCount; for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++) { //定义变量 INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount; //获取桌子 auto pTableFrame = GetTableFrame(nTableIndex);//获取对象 if (!pTableFrame) continue; if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue; if (pTableFrame->IsTableLocked()) continue; //无效过滤 WORD wChairID = pTableFrame->GetRandNullChairID(); if (wChairID == INVALID_CHAIR) continue; //用户坐下 pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem); return true; } //失败 SendRequestFailure(pIServerUserItem, TEXT("没找到可进入的游戏桌!"), REQUEST_FAILURE_NORMAL); return true; } //发送系统消息 bool CAttemperEngineSink::SendSystemMessage(CMD_GR_SendMessage * pSendMessage, WORD wDataSize) { //消息处理 ASSERT(pSendMessage != NULL); //效验数据 ASSERT(wDataSize == sizeof(CMD_GR_SendMessage) - sizeof(pSendMessage->szSystemMessage) + sizeof(TCHAR)*pSendMessage->wChatLength); if (wDataSize != sizeof(CMD_GR_SendMessage) - sizeof(pSendMessage->szSystemMessage) + sizeof(TCHAR)*pSendMessage->wChatLength) return false; //所有房间 if (pSendMessage->cbAllRoom == TRUE) { pSendMessage->cbAllRoom = FALSE; m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_SYSTEM_MESSAGE, pSendMessage, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); } //else //{ //发送系统消息 //if (pSendMessage->cbGame == TRUE) //SendGameMessage(pSendMessage->szSystemMessage, SMT_CHAT); //if (pSendMessage->cbRoom == TRUE) //SendRoomMessage(pSendMessage->szSystemMessage, SMT_CHAT); //} if (pSendMessage->cbGame == TRUE) SendGameMessage(pSendMessage->szSystemMessage, SMT_SYS); return true; } bool CAttemperEngineSink::SetUserServerID(IServerUserItem * pIServerUserItem, BYTE cbFlag, WORD ServerID) { //记录用户的ServerID CMD_CS_C_UserServer UserServer; ZeroMemory(&UserServer, sizeof(UserServer)); UserServer.dwUserID = pIServerUserItem->GetUserID(); UserServer.cbFlag = cbFlag; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_SERVER, &UserServer, sizeof(UserServer)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/); return true; } //移除消息 void CAttemperEngineSink::RemoveSystemMessage() { //缓存消息 m_SystemMessageBuffer.Append(m_SystemMessageActive); m_SystemMessageActive.RemoveAll(); } ////////////////////////////////////////////////////////////////////////////////// // 是否监测此用户 BOOL CAttemperEngineSink::IsJC(DWORD UserID) { for (int i = 0; i < 20;i++) { if (m_JC.dUserID[i] == 0) break; if (m_JC.dUserID[i] == UserID) { return TRUE; } } return FALSE; } // 更新通道 int CAttemperEngineSink::UpDataTongDao() { //查询所有节点服务器信息 std::unordered_map iptostat; //枚举数据 POSITION Position = NULL; //枚举数据 for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++) { //获取数据 CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position); if (pGameServerItem == NULL) continue; bool finda = false; std::wstring cc = pGameServerItem->m_GameServer.szServerAddr; auto iter = iptostat.find(cc); if (iter != std::end(iptostat)) { //已经存在 finda = true; } if (finda) continue; iptostat[cc] = 1; } IPLIST Temp; ZeroMemory(&Temp, sizeof(IPLIST)); CList aa; std::unordered_map::iterator iter_ = iptostat.begin(); for (int i = 0; i < iptostat.size(); i++) { if (iter_->first != _T("")) { aa.AddTail(iter_->first); } iter_++; } iptostat.clear(); POSITION Pos = aa.GetHeadPosition(); int i = 0; while (Pos) { std::wstring wRet = aa.GetNext(Pos); StringCchCat(Temp.ST_LIST[i], 64, wRet.c_str()); i++; if (i > (64-1)) break; } //更新加载通道 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0L, &Temp, sizeof(IPLIST)); return 0; } //分享奖励钻石(仅当天首次分享才有奖励) bool CAttemperEngineSink::OnTCPNetworkShareAwardBean(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkShareAwardBean"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ShareAwardBean shareAwardBean; shareAwardBean.dwUserID = pIServerUserItem->GetUserID(); lstrcpyn(shareAwardBean.szClientIp, dwIP2csIP(pIServerUserItem->GetClientAddr()), sizeof(shareAwardBean.szClientIp)); m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_SHRAE_AWARD_BEAN, dwSocketID, &shareAwardBean, sizeof(shareAwardBean)); return true; } //分享奖励钻石结果 bool CAttemperEngineSink::OnDBShareAwardResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_ShareAwardBeanResult * pShareAwardResult = (DBR_GR_ShareAwardBeanResult*)pData; UserInfo::PB_CS_S_ShareAwardBeanResult BeanResult; BeanResult.set_dwcurrency(pShareAwardResult->dwCurrency); BeanResult.set_wawardcurrency(pShareAwardResult->wAwardCurrency); //发送数据 std::string pbdata = BeanResult.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_SHRAE_AWARD_BEAN_RESULT, (void*)pbdata.c_str(), pbdata.length()); return true; } //用户分享信息 bool CAttemperEngineSink::OnTCPNetworkShareInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkShareInfo"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_SHRAE_INFO, dwSocketID, &dUserID, sizeof(dUserID)); return true; } //用户当天分享信息结果 bool CAttemperEngineSink::OnDBShareInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_ShareAwardInfo * pShareInfo = (DBR_GR_ShareAwardInfo *)pData; UserInfo::PB_CS_S_ShareAwardInfo shareAwardInfo; shareAwardInfo.set_wtodaysharedflag(pShareInfo->wTodaySharedFlag); shareAwardInfo.set_wshardawardcurrency(pShareInfo->wShardAwardCurrency); //发送数据 std::string pbdata = shareAwardInfo.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_SHRAE_INFO_RESULT, (void*)pbdata.c_str(), pbdata.length()); return true; } /////+++拉取场馆游戏服务器 //bool CAttemperEngineSink::OnTCPNetworkMainVenue(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // switch (wSubCmdID) // { // case SUB_GR_VENUE_C_GAME_SERVER: //拉取场馆游戏服务器(返回最优的那个) 场馆ID // { // OnTCPNetworkGetVenueGameSvr(pData, wDataSize, dwSocketID); // return true; // } // case SUB_GR_VENUE_C_INFO_LIST: //拉取场馆信息列表 // { // OnTCPNetworkGetVenueInfoList(pData, wDataSize, dwSocketID); // return true; // } // default: break; // } // // return false; //} ///---发送场馆信息列表 //bool CAttemperEngineSink::OnTCPNetworkGetVenueInfoList(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // TRACE("\n\n***Fun=[%s] Line[%d] ***\n\n", __FUNCTION__, __LINE__); // if (m_vecVenueInfo.size() <= 0 || NULL == m_pITCPNetworkEngine) // { // ASSERT(FALSE); // return false; // } // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // return false; // } // // //网络数据 // bool bExistVenue = false; ///---是否存在场馆信息 // WORD wSendSize = 0; // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 }; // memset(cbDataBuffer, 0, sizeof(cbDataBuffer)); // // for (std::vector::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++) // { // //发送数据 // if ((wSendSize + sizeof(tagVenueInfo)) > sizeof(cbDataBuffer)) // { // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST, cbDataBuffer, wSendSize); // wSendSize = 0; // } // // //获取数据 // tagVenueInfo venueInfo = *it; // // // 协议数据 // CMD_VenueInfo cmdVenueInfo(venueInfo); // // //拷贝数据 // CopyMemory(cbDataBuffer + wSendSize, &cmdVenueInfo, sizeof(cmdVenueInfo)); // wSendSize += sizeof(cmdVenueInfo); // bExistVenue = true; // } // // //发送剩余 // if (wSendSize > 0) // { // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST, cbDataBuffer, wSendSize); // } // // ///---不存在,发空 // if (!bExistVenue) // { // ASSERT(false); // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST); // } // // ///---查询该用户有无破产赠送 (改在进入低级场时触发) // ////if (pIServerUserItem->GetUserScore() < SCORE_RELIEF_VALUE) // ////{ // //// OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID); // ////} // // return true; //} //tagVenueInfo CAttemperEngineSink::getVenueInfo(WORD wVenueID) //{ // tagVenueInfo venue; // for (std::vector::iterator it = m_vecVenueInfo.begin(); // it != m_vecVenueInfo.end(); it++) // { // tagVenueInfo venueTemp = *it; // // if (venueTemp.wVenueID == wVenueID) // { // return venueTemp; // } // } // ASSERT(FALSE); // return venue; //} ///---查询破产补助信息 //bool CAttemperEngineSink::OnTCPNetworkQueryRelief(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // ASSERT(FALSE); // return false; // } // DWORD dwUserID = pIServerUserItem->GetUserID(); // m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_RELIEF_INFO, dwSocketID, &dwUserID, sizeof(dwUserID)); /*m_pIRecordDataBaseEngine投递队列有数据延迟太大*/ // // /////---打印下,投递时间 // //TCHAR szString[512] = { 0 }; // //_sntprintf(szString, CountArray(szString), TEXT("查询有无破产领取 [ userID=%d ]"), dwUserID); // //CTraceService::TraceString(szString, TraceLevel_Normal); // // return true; //} // 人数倒序排列 class SortByLineCountDescFunc { public: int operator()(CGameServerItem* l, CGameServerItem* r) { return l->m_GameServer.dwOnLineCount > r->m_GameServer.dwOnLineCount; } }; // 服务器级倒序排列 class SortByServerLevelDescFunc { public: int operator()(CGameServerItem* l, CGameServerItem* r) { return l->m_GameServer.wServerLevel > r->m_GameServer.wServerLevel; } }; /* 增加分组成功概率规则:1, 玩家往人数多的游戏服务上去匹配; 2, 同一服务器往人数多的桌子上去匹配; */ ///---拉取场馆服务器 //bool CAttemperEngineSink::OnTCPNetworkGetVenueGameSvr(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //效验参数 // ASSERT(wDataSize >= sizeof(WORD)); // if (wDataSize < sizeof(WORD)) // { // return false; // } // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // return false; // } // // WORD * pwVenueID = (WORD *)pData; //场馆ID // // ///---检查有无救济 // if (CanGetRelief(pIServerUserItem, *pwVenueID)) // { // ///---当前金币不够进去,下发救济领取通知 // return OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID); // } // // ///---如果为0,系统推荐一个合适的场馆给他(用于“快速开始”功能) // if (0 == *pwVenueID) // { // tagVenueInfo venueInfo; // for (std::vector::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++) // { // if (((it)->sMinScore == 0 || ((it)->sMinScore != 0 && pIServerUserItem->GetUserScore() >= (it)->sMinScore)) // && ((it)->sMaxScore == 0 || ((it)->sMaxScore != 0 && pIServerUserItem->GetUserScore() <= (it)->sMaxScore))) // { // venueInfo = *it; // break; // } // } // // if (venueInfo.wVenueID != 0) // { // WORD venueID = venueInfo.wVenueID; //场馆ID // *pwVenueID = venueID; // } // else // { // ///---检查携带金币是否符合最低场要求 // if (m_vecVenueInfo.size() > 0 && m_vecVenueInfo[0].sMinScore != 0 && pIServerUserItem->GetUserScore() < m_vecVenueInfo[0].sMinScore) // { // CString strHint; // strHint.Format(L"您的金币不足,金币最低要求%lld,请先兑换金币!", m_vecVenueInfo[0].sMinScore); // SendRequestFailure(pIServerUserItem, strHint, 1); // return true; // } // // SendRequestFailure(pIServerUserItem, L"没有合适的服务器", 1); // return true; // } // } // // ASSERT(*pwVenueID > 0); // // if (*pwVenueID <= 0) ///---场馆ID // { // SendRequestFailure(pIServerUserItem, TEXT("金币场馆ID无效!"), 0); // // TCHAR szHint[256] = { 0 }; // swprintf(szHint, TEXT("场馆ID非法, venueID=%d"), *pwVenueID); // CTraceService::TraceString(szHint, TraceLevel_Warning); // return true; // } // // ///---检查有无救济 // if (CanGetRelief(pIServerUserItem, *pwVenueID)) // { // ///---当前金币不够进去,下发救济领取通知 // return OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID); // } // // ///---先检查携带金币,不够 // //if (pIServerUserItem->GetUserScore() <= 0) // //{ // // SendRequestFailure(pIServerUserItem, TEXT("抱歉,您没有金币,请先兑换金币!"), 0); // // return true; // //} // // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); // int iXinYong = pUserInfo->iXinYong; //用户信用等级 // // // //查找符合场馆ID的房间 // std::vector gameSvrItemVec; // POSITION Position = NULL; // CGameServerItem * pGameServerItem = NULL; // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++) // { // //获取数据 // pGameServerItem = m_ServerListManager.EmunGameServerItem(Position); // if (pGameServerItem == NULL // || pGameServerItem->m_GameServer.wNodeID != *pwVenueID) // { // continue; // } // gameSvrItemVec.push_back(pGameServerItem); // } // // ///---过滤不符合条件的服务器 // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByServerLevelDescFunc()); ///-- 排序目的是优先过滤高级别的服务器(防攻击用) // std::vector::iterator it = gameSvrItemVec.begin(); // while (it != gameSvrItemVec.end()) // { // CGameServerItem* pGameServerItemTemp = *it; // // if (NULL == pGameServerItemTemp) // { // it = gameSvrItemVec.erase(it); // continue; // } // // //不提供服务 // if (pGameServerItemTemp->m_GameServer.bService < 1) // { // it = gameSvrItemVec.erase(it); // continue; // } // // //人员已满 // if (pGameServerItemTemp->m_GameServer.dwOnLineCount >= pGameServerItemTemp->m_GameServer.dwFullCount) // { // it = gameSvrItemVec.erase(it); // continue; // } // // //玩家级别 // if (pGameServerItemTemp->m_GameServer.wServerLevel > iXinYong && gameSvrItemVec.size() > 1/*总得返回一个用吧*/) // { // it = gameSvrItemVec.erase(it); // continue; // } // // it++; // } // // if (gameSvrItemVec.size() == 0) ///---没有GameServer // { // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 }; // memset(cbDataBuffer, 0, sizeof(cbDataBuffer)); // // WORD wErrorCode = 1; // memcpy(cbDataBuffer, &wErrorCode, sizeof(wErrorCode)); // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_GAME_SERVER, &cbDataBuffer, sizeof(WORD) + sizeof(tagVenueServer)); // // SendRequestFailure(pIServerUserItem, TEXT("没有可用的金币场服务器!"), 1); // // TCHAR szHint[256] = { 0 }; // swprintf(szHint, TEXT("没有可用的金币场服务器,venueID=%d"), *pwVenueID); // CTraceService::TraceString(szHint, TraceLevel_Warning); // return TRUE; // } // // ///---按人数倒序排列,返回最多人数的服务器 // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByLineCountDescFunc()); // // tagGameServer tmpGameSvr = gameSvrItemVec[0]->m_GameServer; // tagVenueServer tmpVenueSvr; // tmpVenueSvr.wKindID = tmpGameSvr.wKindID; // tmpVenueSvr.wVenueID = tmpGameSvr.wNodeID; // tmpVenueSvr.wServerID = tmpGameSvr.wServerID; // tmpVenueSvr.wServerKind = tmpGameSvr.wServerKind; // StringCbCat(tmpVenueSvr.szServerAddr, 32, tmpGameSvr.szServerAddr); // tmpVenueSvr.wServerPort = tmpGameSvr.wServerPort; // // tagVenueInfo venueInfo = getVenueInfo(tmpVenueSvr.wVenueID); // ASSERT(venueInfo.wVenueID != 0); // if (venueInfo.wVenueID > 0) // { // tmpVenueSvr.lCellScore = venueInfo.sBaseScore; // tmpVenueSvr.lMinScore = venueInfo.sMinScore; // tmpVenueSvr.lMaxScore = venueInfo.sMaxScore; // // ///---检查携带金币是否符合要求 // if (venueInfo.sMinScore != 0 && pIServerUserItem->GetUserScore() < venueInfo.sMinScore) // { // CString strHint; // strHint.Format(L"您的金币不足,本场最低要求金币%lld,请先兑换金币!", venueInfo.sMinScore); // SendRequestFailure(pIServerUserItem, strHint, 1); // return true; // } // else if (venueInfo.sMaxScore != 0 && pIServerUserItem->GetUserScore() > venueInfo.sMaxScore) // { // SendRequestFailure(pIServerUserItem, TEXT("抱歉,您的金币不符合进入要求,请选择合适的金币场!"), 1); // return true; // } // } // // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 }; // memset(cbDataBuffer, 0, sizeof(cbDataBuffer)); // // WORD wErrorCode = 0; // memcpy(cbDataBuffer, &wErrorCode, sizeof(wErrorCode)); // memcpy(cbDataBuffer + sizeof(WORD), &tmpVenueSvr, sizeof(tmpVenueSvr)); // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_GAME_SERVER, &cbDataBuffer, sizeof(WORD) + sizeof(tagVenueServer)); // // return true; //} // /////---上行拉取胜局榜 //bool CAttemperEngineSink::OnTCPNetworkTopWinList(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkTopWinList"), TraceLevel_Debug); // // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // ASSERT(FALSE); // return false; // } // // /*m_pIRecordDataBaseEngine*/m_pIKernelDataBaseEngine->PostDataBaseRequest(DBO_GR_TOP_WIN_LIST, dwSocketID, NULL, 0); // return true; //} // /////---用户领取破产补助 //bool CAttemperEngineSink::OnTCPNetworkGetRelief(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // ASSERT(FALSE); // return false; // } // // ///---记录领取客户端的相关信息 // DBR_GR_GetRelief getRelief; // getRelief.dwUserID = pIServerUserItem->GetUserID(); // getRelief.dwClientAddr = pIServerUserItem->GetClientAddr(); // lstrcpyn(getRelief.szMachineID, pIServerUserItem->GetMachineID(), CountArray(getRelief.szMachineID)); // // m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_RELIEF, dwSocketID, &getRelief, sizeof(getRelief)); // return true; //} // /////+++拉取胜局榜列表的返回 //BOOL CAttemperEngineSink::OnDBTopWinList(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // std::vector vecTopWinInfo; // //效验参数 // ASSERT(wDataSize % sizeof(tagTopWinInfo) == 0); // if (wDataSize % sizeof(tagTopWinInfo) != 0) // { // return FALSE; // } // // //变量定义 // WORD wItemCount = wDataSize / sizeof(tagTopWinInfo); // tagTopWinInfo * pTopWin = (tagTopWinInfo *)pData; // // //更新数据 // for (WORD i = 0; i < wItemCount; i++) // { // tagTopWinInfo tmpTopWinInfo(*pTopWin); // //插入列表 // vecTopWinInfo.push_back(tmpTopWinInfo); // pTopWin++; // } // // if (vecTopWinInfo.size() <= 0 || NULL == m_pITCPNetworkEngine) // { // ASSERT(FALSE); // return false; // } // // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (NULL == pIServerUserItem) // { // TRACE(L"\nOnDBTopWinList,胜局榜用户为空\n"); // return false; // } // // bool bExistTopWin = false; ///---是否存在胜局榜 // WORD wSendSize = 0; // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 }; // memset(cbDataBuffer, 0, sizeof(cbDataBuffer)); // // for (std::vector::iterator it = vecTopWinInfo.begin(); it != vecTopWinInfo.end(); it++) // { // //发送数据 // if ((wSendSize + sizeof(tagTopWinInfo)) > sizeof(cbDataBuffer)) // { // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK, cbDataBuffer, wSendSize); // wSendSize = 0; // } // // //获取数据 // // //拷贝数据 // CopyMemory(cbDataBuffer + wSendSize, &(*it), sizeof(tagTopWinInfo)); // wSendSize += sizeof(tagTopWinInfo); // bExistTopWin = true; // // } // // //发送剩余 // if (wSendSize > 0) // { // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK, cbDataBuffer, wSendSize); // } // // ///---不存在,发空 // if (!bExistTopWin) // { // ASSERT(false); // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK); // } // // return true; //} // /////+++钻石兑换金币列表(即金币兑换商品列表) //BOOL CAttemperEngineSink::OnDBExchangeConfigList(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //效验参数 // ASSERT(wDataSize % sizeof(tagExchangeConfig) == 0); // if (wDataSize % sizeof(tagExchangeConfig) != 0) // { // return FALSE; // } // // std::vector vecExchangeConfig; // // //变量定义 // WORD wItemCount = wDataSize / sizeof(tagExchangeConfig); // tagExchangeConfig * pExchangeConfig = (tagExchangeConfig *)pData; // // for (WORD i = 0; i < wItemCount; i++) // { // tagExchangeConfig exchageConfig(*pExchangeConfig); // //插入列表 // vecExchangeConfig.push_back(exchageConfig); // pExchangeConfig++; // } // // //金币兑换商品列表为空 // if (vecExchangeConfig.size() <= 0) // { // ASSERT(FALSE); // return false; // } // // //获取用户 // /*WORD wBindIndex = LOWORD(dwContextID); // auto pIServerUserItem = GetBindUserItem(wBindIndex);*/ // // //用户效验 // //ASSERT(pIServerUserItem != NULL); // //if (pIServerUserItem == NULL) // //{ // // return false; // //} // // bool bExist = false; ///---是否存在 // WORD wSendSize = 0; // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 }; // memset(cbDataBuffer, 0, sizeof(cbDataBuffer)); // // for (std::vector::iterator it = vecExchangeConfig.begin(); it != vecExchangeConfig.end(); it++) // { // //发送数据 // if ((wSendSize + sizeof(tagExchangeConfig)) > sizeof(cbDataBuffer)) // { // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, cbDataBuffer, wSendSize); // wSendSize = 0; // } // // //拷贝数据 // CopyMemory(cbDataBuffer + wSendSize, &(*it), sizeof(tagExchangeConfig)); // wSendSize += sizeof(tagExchangeConfig); // bExist = true; // // } // // //发送剩余 // if (wSendSize > 0) // { // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, cbDataBuffer, wSendSize); // } // // ///---不存在,发空 // if (!bExist) // { // ASSERT(false); // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO); // } // // return true; //} // /////+++查询破产信息结果 //BOOL CAttemperEngineSink::OnDBReliefInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // //ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // //ASSERT(FALSE); // return false; // } // // //提取数据 // tagReliefInfo * pReliefInfo = (tagReliefInfo *)pData; // // tagReliefInfo reliefInfo; // reliefInfo.wTotalCount = pReliefInfo->wTotalCount; // reliefInfo.wGetCount = pReliefInfo->wGetCount; // reliefInfo.dwReliefScore = pReliefInfo->dwReliefScore; // // if (pReliefInfo->wTotalCount > 0) // { // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_RELIEF_NOTIFY, &reliefInfo, sizeof(reliefInfo)); // } // // ///---更新救济领取信息 // pIServerUserItem->GetUserInfo()->dwUpdateReliefLeftCount = GetTickCount(); // pIServerUserItem->GetUserInfo()->wReliefLeftCount = pReliefInfo->wTotalCount - pReliefInfo->wGetCount; // // return true; //} // /////+++下行领取破产结果 //BOOL CAttemperEngineSink::OnDBGetRelief(DWORD dwContextID, VOID * pData, WORD wDataSize) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ///ASSERT(pIServerUserItem != NULL); ///---还没领取完,就断线了 // if (pIServerUserItem == NULL) // { // return false; // } // // //提取数据 // tagReliefScore * pReliefScore = (tagReliefScore *)pData; // // tagReliefScore reliefScore; // reliefScore.dwReliefScore = pReliefScore->dwReliefScore; // reliefScore.lCurrScore = pReliefScore->lCurrScore; // // ///更新用户最新携带 // pIServerUserItem->GetUserInfo()->lScore = pReliefScore->lCurrScore; // // TRACE(L"\n领取破产补助成功 userid=%d reliefScore.dwReliefScore=%d reliefScore.lScore=%lld\n", pIServerUserItem->GetUserID(), reliefScore.dwReliefScore, reliefScore.lCurrScore); // // //发送数据[3:50] // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_GET_RELIEF_ACK, &reliefScore, sizeof(reliefScore)); // // /////---广播积分变动协议 // //{ // // CMD_GR_UserScore UserScore; // // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); // // // //变量定义 // // CMD_GR_MobileUserScore MobileUserScore; // // // MobileUserScore.dwUserID = pUserInfo->dwUserID; // // MobileUserScore.UserScore.lScore = pUserInfo->lScore; // // MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); // // MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); // // // //发送数据 // // SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore)); // // TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore); // //} // // //---本桌用户广播 // WORD wTableID = pIServerUserItem->GetTableID(); // auto it = m_TableFrameArray.find(wTableID); // if (it != m_TableFrameArray.end()) // { // auto pITable = it->second; // if (pITable != NULL) // { // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); // // //变量定义 // CMD_GR_MobileUserScore MobileUserScore; // // MobileUserScore.dwUserID = pUserInfo->dwUserID; // MobileUserScore.UserScore.lScore = pUserInfo->lScore; // MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); // MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); // // pITable->SendTableData(INVALID_CHAIR, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore), MDM_GR_USER); // TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore); // } // } // // // ////{ // //// CMD_GR_UserScore UserScore; // //// tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); // // //// //变量定义 // //// CMD_GR_MobileUserScore MobileUserScore; // // //// MobileUserScore.dwUserID = pUserInfo->dwUserID; // //// MobileUserScore.UserScore.lScore = pUserInfo->lScore; // //// MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); // //// MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); // // //// //发送数据 // //// SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore)); // //// TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore); // ////} // // return true; //} //列表 bool CAttemperEngineSink::OnDBGetClubList(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubList_Ack * pClubListAck = (CMD_GR_ClubList_Ack *)pData; if (pData == NULL) return false; for (int i = 0; i <20; i++) { pIServerUserItem->GetUserInfo()->dwClubID[i] = 0; } for (int i = 0; i < pClubListAck->wClubCount;i++) { pIServerUserItem->GetUserInfo()->dwClubID[i] = pClubListAck->csGameClubInfo[i].dwClubID; } Club::PB_CS_S_ClubList_Ack ClubList; ClubList.set_wnewscount(pClubListAck->wNewsCount); ClubList.set_wclubcount(pClubListAck->wClubCount); for (WORD i = 0; i < pClubListAck->wClubCount; i++) { Club::PB_CS_C_ClubInfo* ClubInfo = ClubList.add_csgameclubinfo(); ClubInfo->set_dwclubid(pClubListAck->csGameClubInfo[i].dwClubID); std::string szClubName = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szClubName, CP_UTF8).m_psz; std::string szHostName = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szHostName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szHeadUrl, CP_UTF8).m_psz; ClubInfo->set_szclubname(szClubName); ClubInfo->set_cbisowner(pClubListAck->csGameClubInfo[i].cbIsOwner); ClubInfo->set_wtotalnum(pClubListAck->csGameClubInfo[i].wTotalNum); ClubInfo->set_wwaittablenum(pClubListAck->csGameClubInfo[i].wWaitTableNum); ClubInfo->set_wonlinenum(pClubListAck->csGameClubInfo[i].wOnLineNum); ClubInfo->set_wwaitusernum(pClubListAck->csGameClubInfo[i].wWaitUserNum); ClubInfo->set_dwownerid(pClubListAck->csGameClubInfo[i].dwOwnerID); ClubInfo->set_szhostname(szHostName); ClubInfo->set_szheadurl(szHeadUrl); ClubInfo->set_temp1(pClubListAck->csGameClubInfo[i].temp1); ClubInfo->set_temp2(pClubListAck->csGameClubInfo[i].temp2); ClubInfo->set_temp3(pClubListAck->csGameClubInfo[i].temp3); ClubInfo->set_temp4(pClubListAck->csGameClubInfo[i].temp4); ClubInfo->mutable_csgameconfig()->set_wsubgameid(pClubListAck->csGameClubInfo[i].csGameConfig.wSubGameID); ClubInfo->mutable_csgameconfig()->set_wplayrule(pClubListAck->csGameClubInfo[i].csGameConfig.wPlayRule); ClubInfo->mutable_csgameconfig()->set_wmaxfanrule(pClubListAck->csGameClubInfo[i].csGameConfig.wMaxFanRule); ClubInfo->mutable_csgameconfig()->set_wmaxscore(pClubListAck->csGameClubInfo[i].csGameConfig.wMaxScore); ClubInfo->mutable_csgameconfig()->set_wplaycountrule(pClubListAck->csGameClubInfo[i].csGameConfig.wPlayCountRule); ClubInfo->mutable_csgameconfig()->set_whadplaycount(pClubListAck->csGameClubInfo[i].csGameConfig.wHadPlayCount); ClubInfo->mutable_csgameconfig()->set_zmextrarule(pClubListAck->csGameClubInfo[i].csGameConfig.zmExtraRule); ClubInfo->mutable_csgameconfig()->set_dghrule(pClubListAck->csGameClubInfo[i].csGameConfig.dghRule); std::string sPrivateTableID = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].csGameConfig.sPrivateTableID, CP_UTF8).m_psz; ClubInfo->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID); ClubInfo->mutable_csgameconfig()->set_bduolai(pClubListAck->csGameClubInfo[i].csGameConfig.bDuoLai); ClubInfo->mutable_csgameconfig()->set_wfengding(pClubListAck->csGameClubInfo[i].csGameConfig.wFengDing); ClubInfo->mutable_csgameconfig()->set_tmp1(pClubListAck->csGameClubInfo[i].csGameConfig.tmp1); ClubInfo->mutable_csgameconfig()->set_tmp2(pClubListAck->csGameClubInfo[i].csGameConfig.tmp2); ClubInfo->mutable_csgameconfig()->set_tmp3(pClubListAck->csGameClubInfo[i].csGameConfig.tmp3); ClubInfo->mutable_csgameconfig()->set_tmp4(pClubListAck->csGameClubInfo[i].csGameConfig.tmp4); ClubInfo->mutable_csgameconfig()->set_tmp5(pClubListAck->csGameClubInfo[i].csGameConfig.tmp5); } //发送数据 std::string pbdata = ClubList.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBLIST_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //会员 bool CAttemperEngineSink::OnDBGetClubUser(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubUser_Ack * pClubUserAck = (CMD_GR_ClubUser_Ack *)pData; if(pClubUserAck == NULL) return false; for (int i = 0; i < pClubUserAck->wCount; i++) { //从其全局服务器上找 if (i >= 20){ break; } auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID); if (iter != m_OnLineUserAll.end()) { pClubUserAck->csMemberInfo[i].isOnline = 1; } } Club::PB_CS_S_ClubUser_Ack ClubRecord; ClubRecord.set_cbhost(pClubUserAck->cbHost); ClubRecord.set_dwclubid(pClubUserAck->dwClubID); ClubRecord.set_wcount(pClubUserAck->wCount); for (WORD i = 0; i < pClubUserAck->wCount; i++) { Club::PB_CS_S_MemberInfo* RecordInfo = ClubRecord.add_csmemberinfo(); RecordInfo->set_bangmaid(pClubUserAck->csMemberInfo[i].BangMaID); RecordInfo->set_cbstaus(pClubUserAck->csMemberInfo[i].cbStaus); RecordInfo->set_ishost(pClubUserAck->csMemberInfo[i].isHost); RecordInfo->set_isonline(pClubUserAck->csMemberInfo[i].isOnline); RecordInfo->set_dwuserid(pClubUserAck->csMemberInfo[i].dwUserID); std::string szName = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szHeadUrl, CP_UTF8).m_psz; RecordInfo->set_szname(szName); RecordInfo->set_szheadurl(szHeadUrl); } //发送数据 std::string pbdata = ClubRecord.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBUSER_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //会员 bool CAttemperEngineSink::OnDBGetClubUserEx(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubUser_Ack_Ex * pClubUserAck = (CMD_GR_ClubUser_Ack_Ex *)pData; if (pClubUserAck == NULL) return false; for (int i = 0; i < pClubUserAck->wMemCount; i++) { //从其全局服务器上找 if (i >= 1000){ break; } auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID); if (iter != m_OnLineUserAll.end()) { pClubUserAck->csMemberInfo[i].isOnline = 1; } } //排序 for (int i = 0; i < pClubUserAck->wMemCount; i++) { if (pClubUserAck->csMemberInfo[i].isHost > 0 || pClubUserAck->csMemberInfo[i].Agree == 0 ) continue; if (pClubUserAck->csMemberInfo[i].isOnline == 0 && pClubUserAck->csMemberInfo[i].dwUserID > 0) { for (int k = i + 1; k < pClubUserAck->wMemCount; k++) { if (pClubUserAck->csMemberInfo[k].isOnline == 1) { CMD_S_MemberInfoEx Member; ZeroMemory(&Member, sizeof(CMD_S_MemberInfoEx)); CopyMemory(&Member, &(pClubUserAck->csMemberInfo[i]), sizeof(CMD_S_MemberInfoEx)); ZeroMemory(&(pClubUserAck->csMemberInfo[i]), sizeof(CMD_S_MemberInfoEx)); CopyMemory(&(pClubUserAck->csMemberInfo[i]), &(pClubUserAck->csMemberInfo[k]), sizeof(CMD_S_MemberInfoEx)); ZeroMemory(&(pClubUserAck->csMemberInfo[k]), sizeof(CMD_S_MemberInfoEx)); CopyMemory(&(pClubUserAck->csMemberInfo[k]), &Member, sizeof(CMD_S_MemberInfoEx)); break; } } } } //投递请求 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER_ONLINE, dwContextID, pClubUserAck, sizeof(CMD_GR_ClubUser_Ack_Ex)); } //通知 bool CAttemperEngineSink::OnDBGetClubMessage(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubMessage_Ack * pClubMessageAck = (CMD_GR_ClubMessage_Ack *)pData; if (pClubMessageAck == NULL) return false; Club::PB_CS_S_ClubMessage_Ack ClubMessage; ClubMessage.set_wcount(pClubMessageAck->wCount); for (WORD i = 0; i < pClubMessageAck->wCount; i++) { Club::pb_MessageInfo* MessageInfo = ClubMessage.add_messageinfo(); MessageInfo->set_dtype(pClubMessageAck->CMD_S_MessageInfo[i].dType); std::string szContent = CW2AEX<1024>(pClubMessageAck->CMD_S_MessageInfo[i].szContent, CP_UTF8).m_psz; MessageInfo->set_szcontent(szContent); MessageInfo->set_dtactiontime(pClubMessageAck->CMD_S_MessageInfo[i].dtActionTime); } //发送数据 std::string pbdata = ClubMessage.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBMESSAGE_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //记录 bool CAttemperEngineSink::OnDBGetClubRecord(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubRecord_Ack * pClubRecordAck = (CMD_GR_ClubRecord_Ack *)pData; if (pClubRecordAck == NULL) return false; //发送数据 m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBRECORD_ACK, pClubRecordAck, wDataSize); return true; } //记录 bool CAttemperEngineSink::OnDBGetClubRecordEx(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubRecord_Ack_EX * pClubRecordAck = (CMD_GR_ClubRecord_Ack_EX *)pData; if (pClubRecordAck == NULL) return false; Club::PB_CS_S_ClubRecord_Ack_EX ClubRecord; ClubRecord.set_wcount(pClubRecordAck->wCount); ClubRecord.set_dwtablecount(pClubRecordAck->dwTableCount); ClubRecord.set_dwzunshi(pClubRecordAck->dwZunShi); ClubRecord.set_dwclubid(pClubRecordAck->dwClubID); for (WORD i = 0; i < pClubRecordAck->wCount; i++) { Club::PB_CS_S_RecordInfoEX* RecordInfo = ClubRecord.add_csrecordinfo(); for (WORD j = 0; j < 4; j++) { RecordInfo->add_score(pClubRecordAck->csRecordInfo[i].Score[j]); RecordInfo->add_tmp(pClubRecordAck->csRecordInfo[i].Tmp[j]); } RecordInfo->mutable_record()->set_dwtableid(pClubRecordAck->csRecordInfo[i].Record.dwTableID); RecordInfo->mutable_record()->set_cbjushu(pClubRecordAck->csRecordInfo[i].Record.cbJuShu); RecordInfo->mutable_record()->set_cbpayway(pClubRecordAck->csRecordInfo[i].Record.cbPayWay); RecordInfo->mutable_record()->set_dwtableownerid(pClubRecordAck->csRecordInfo[i].Record.dwTableOwnerID); RecordInfo->mutable_record()->set_dtcreatetime(pClubRecordAck->csRecordInfo[i].Record.dtCreateTime); for (WORD k = 0; k < 4; k++) { RecordInfo->mutable_record()->add_playerid(pClubRecordAck->csRecordInfo[i].Record.PlayerID[k]); } for (WORD l = 0; l < 4; l++) { Club::pb_PlayerName* PlayerName = RecordInfo->mutable_record()->add_playername1(); std::string PlayerName2 = CW2AEX<1024>(pClubRecordAck->csRecordInfo[i].Record.PlayerName[l], CP_UTF8).m_psz; PlayerName->set_playername2(PlayerName2); } } //发送数据 std::string pbdata = ClubRecord.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBRECORD_ACK_EX, (void*)pbdata.c_str(), pbdata.length()); return true; } //俱乐部局数排名 bool CAttemperEngineSink::OnDBGetClubPlaygames_Ack(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } tagClubPlaygames2* pClubRecordAck = (tagClubPlaygames2*)pData; if (pClubRecordAck == NULL) { return false; } Club::PB_CS_S_tagClubPlaygames ClubRecord; ClubRecord.set_wdatecount(pClubRecordAck->wDateCount); ClubRecord.set_temp(pClubRecordAck->temp); for (WORD i = 0; i < 10; i++) { if (pClubRecordAck->Playgames[i].dwUserID == 0)continue; Club::PB_CS_tagClubPlaygames* pPlaygame = ClubRecord.add_playgames(); pPlaygame->set_dwuserid(pClubRecordAck->Playgames[i].dwUserID); pPlaygame->set_mcount(pClubRecordAck->Playgames[i].mCount); std::string szUserName = CW2AEX<1024>(pClubRecordAck->Playgames[i].szUserName, CP_UTF8).m_psz; std::string szHeadImg = CW2AEX<1024>(pClubRecordAck->Playgames[i].szHeadImg, CP_UTF8).m_psz; pPlaygame->set_szusername(szUserName); pPlaygame->set_szheadimg(szHeadImg); } //发送数据 std::string pbdata = ClubRecord.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_COUNT_PLAYGAEMS_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //俱乐部积分排名 bool CAttemperEngineSink::OnDBGetClubIntegral_Ack(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } tagClubIntegral2* pClubRecordAck = (tagClubIntegral2*)pData; if (pClubRecordAck == NULL) { return false; } Club::PB_CS_S_tagClubIntegral Integral; Integral.set_wdatecount(pClubRecordAck->wDateCount); Integral.set_temp(pClubRecordAck->temp); for (WORD i = 0; i < 10; i++) { if (pClubRecordAck->Integral[i].dwUserID == 0)continue; Club::PB_CS_tagClubIntegral* pIntegral = Integral.add_integral(); pIntegral->set_dwuserid(pClubRecordAck->Integral[i].dwUserID); pIntegral->set_mcount(pClubRecordAck->Integral[i].mCount); pIntegral->set_mcount(pClubRecordAck->Integral[i].mJiFen); std::string szUserName = CW2AEX<1024>(pClubRecordAck->Integral[i].szUserName, CP_UTF8).m_psz; std::string szHeadImg = CW2AEX<1024>(pClubRecordAck->Integral[i].szHeadImg, CP_UTF8).m_psz; pIntegral->set_szusername(szUserName); pIntegral->set_szheadimg(szHeadImg); } //发送数据 std::string pbdata = Integral.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_COUNT_INTEGRAL_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //创建 bool CAttemperEngineSink::OnDBCreateClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_Club_Action_Ack4 * pActionAck1 = (DBR_GR_Club_Action_Ack4 *)pData; if (pActionAck1 == NULL) return false; if (pActionAck1->Result == 1) { for (int i = 0; i < 20; i++) { if (pIServerUserItem->GetUserInfo()->dwClubID[i] == 0) { pIServerUserItem->GetUserInfo()->dwClubID[i] = pActionAck1->ClubInfo.dwClubID; break; } } } //自动建房 if (pActionAck1->ClubInfo.temp1 == 2) { this->OnAutoCreateRoomToDB(pActionAck1->ClubInfo.dwClubID, pIServerUserItem->GetUserID(), 0); } CMD_GR_Club_Action_Ack1 ActionAck1; ZeroMemory(&ActionAck1, sizeof(CMD_GR_Club_Action_Ack1)); ActionAck1.Result = pActionAck1->Result; CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message)); Club::PB_CS_S_Club_Action_Ack1 ClubAction; ClubAction.set_result(ActionAck1.Result); std::string Message = CW2AEX<1024>(ActionAck1.Message, CP_UTF8).m_psz; ClubAction.set_message(Message); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_CREATE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //俱乐部额外玩法修改 bool CAttemperEngineSink::OnDBUpdateAddClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Action_Ack1Add * pActionAck = (CMD_GR_Club_Action_Ack1Add *)pData; if (pActionAck == NULL) return false; Club::PB_CS_S_Club_Action_Ack1Add ClubAction; ClubAction.set_result(pActionAck->Result); std::string Message = CW2AEX<1024>(pActionAck->Message, CP_UTF8).m_psz; ClubAction.set_message(Message); ClubAction.mutable_autoaddinfo()->set_dwclubid(pActionAck->AutoAddInfo.dwClubID); ClubAction.mutable_autoaddinfo()->set_cbwanfaid(pActionAck->AutoAddInfo.cbWanfaId); ClubAction.mutable_autoaddinfo()->set_cbstatus(pActionAck->AutoAddInfo.cbStatus); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wsubgameid(pActionAck->AutoAddInfo.gameconfig.wSubGameID); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplayrule(pActionAck->AutoAddInfo.gameconfig.wPlayRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxfanrule(pActionAck->AutoAddInfo.gameconfig.wMaxFanRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxscore(pActionAck->AutoAddInfo.gameconfig.wMaxScore); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplaycountrule(pActionAck->AutoAddInfo.gameconfig.wPlayCountRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_whadplaycount(pActionAck->AutoAddInfo.gameconfig.wHadPlayCount); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_zmextrarule(pActionAck->AutoAddInfo.gameconfig.zmExtraRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_dghrule(pActionAck->AutoAddInfo.gameconfig.dghRule); std::string sPrivateTableID = CW2AEX<1024>(pActionAck->AutoAddInfo.gameconfig.sPrivateTableID, CP_UTF8).m_psz; ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_sprivatetableid(sPrivateTableID); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_bduolai(pActionAck->AutoAddInfo.gameconfig.bDuoLai); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wfengding(pActionAck->AutoAddInfo.gameconfig.wFengDing); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp1(pActionAck->AutoAddInfo.gameconfig.tmp1); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp2(pActionAck->AutoAddInfo.gameconfig.tmp2); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp3(pActionAck->AutoAddInfo.gameconfig.tmp3); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp4(pActionAck->AutoAddInfo.gameconfig.tmp4); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp5(pActionAck->AutoAddInfo.gameconfig.tmp5); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_MORE_WANFA_ACK, (void*)pbdata.c_str(), pbdata.length()); if (1 == pActionAck->AutoAddInfo.cbStatus && pActionAck->Result == 1) {//自动建房 this->OnAutoCreateRoomToDB(pActionAck->AutoAddInfo.dwClubID, pIServerUserItem->GetUserID(), pActionAck->AutoAddInfo.cbWanfaId); } return true; } //修改 bool CAttemperEngineSink::OnDBUpdateClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Action_Ack2Ex * pActionAck2 = (CMD_GR_Club_Action_Ack2Ex *)pData; if (pActionAck2 == NULL) return false; //构造返回参数 CMD_GR_Club_Action_Ack2 ActionAck2; ZeroMemory(&ActionAck2, sizeof(CMD_GR_Club_Action_Ack2)); CopyMemory(&ActionAck2, &(pActionAck2->Ack2), sizeof(CMD_GR_Club_Action_Ack2)); //如果开房设置作了修改 if (pActionAck2->TableChoiceChange == 1) { //自动建房 if (pActionAck2->Ack2.ClubInfo.temp1 == 2) { this->OnAutoCreateRoomToDB(pActionAck2->Ack2.ClubInfo.dwClubID, pIServerUserItem->GetUserID(), 0); //更改已创好房的属性 CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck2->Ack2.ClubInfo.dwClubID && Temp.tmp5 == 0) { Temp.dwInsert_UpData_Del = 1; Temp.tmp5 = 1; UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); } it++; } } else { //更改已创好房的属性 CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck2->Ack2.ClubInfo.dwClubID && Temp.tmp5 == 1) { Temp.dwInsert_UpData_Del = 1; Temp.tmp5 = 0; UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); } it++; } } } Club::PB_CS_S_Club_Action_Ack2 ClubList; ClubList.set_result(ActionAck2.Result); std::string Message = CW2AEX<1024>(ActionAck2.Message, CP_UTF8).m_psz; std::string szClubName = CW2AEX<1024>(ActionAck2.ClubInfo.szClubName, CP_UTF8).m_psz; std::string szHostName = CW2AEX<1024>(ActionAck2.ClubInfo.szHostName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(ActionAck2.ClubInfo.szHeadUrl, CP_UTF8).m_psz; ClubList.set_message(Message); ClubList.mutable_clubinfo()->set_dwclubid(ActionAck2.ClubInfo.dwClubID); ClubList.mutable_clubinfo()->set_szclubname(szClubName); ClubList.mutable_clubinfo()->set_cbisowner(ActionAck2.ClubInfo.cbIsOwner); ClubList.mutable_clubinfo()->set_wtotalnum(ActionAck2.ClubInfo.wTotalNum); ClubList.mutable_clubinfo()->set_wwaittablenum(ActionAck2.ClubInfo.wWaitTableNum); ClubList.mutable_clubinfo()->set_wonlinenum(ActionAck2.ClubInfo.wOnLineNum); ClubList.mutable_clubinfo()->set_wwaitusernum(ActionAck2.ClubInfo.wWaitUserNum); ClubList.mutable_clubinfo()->set_dwownerid(ActionAck2.ClubInfo.dwOwnerID); ClubList.mutable_clubinfo()->set_szhostname(szHostName); ClubList.mutable_clubinfo()->set_szheadurl(szHeadUrl); ClubList.mutable_clubinfo()->set_temp1(ActionAck2.ClubInfo.temp1); ClubList.mutable_clubinfo()->set_temp2(ActionAck2.ClubInfo.temp2); ClubList.mutable_clubinfo()->set_temp3(ActionAck2.ClubInfo.temp3); ClubList.mutable_clubinfo()->set_temp4(ActionAck2.ClubInfo.temp4); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wsubgameid(ActionAck2.ClubInfo.csGameConfig.wSubGameID); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplayrule(ActionAck2.ClubInfo.csGameConfig.wPlayRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxfanrule(ActionAck2.ClubInfo.csGameConfig.wMaxFanRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxscore(ActionAck2.ClubInfo.csGameConfig.wMaxScore); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplaycountrule(ActionAck2.ClubInfo.csGameConfig.wPlayCountRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_whadplaycount(ActionAck2.ClubInfo.csGameConfig.wHadPlayCount); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_zmextrarule(ActionAck2.ClubInfo.csGameConfig.zmExtraRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_dghrule(ActionAck2.ClubInfo.csGameConfig.dghRule); std::string sPrivateTableID = CW2AEX<1024>(ActionAck2.ClubInfo.csGameConfig.sPrivateTableID, CP_UTF8).m_psz; ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_bduolai(ActionAck2.ClubInfo.csGameConfig.bDuoLai); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wfengding(ActionAck2.ClubInfo.csGameConfig.wFengDing); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp1(ActionAck2.ClubInfo.csGameConfig.tmp1); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp2(ActionAck2.ClubInfo.csGameConfig.tmp2); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp3(ActionAck2.ClubInfo.csGameConfig.tmp3); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp4(ActionAck2.ClubInfo.csGameConfig.tmp4); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp5(ActionAck2.ClubInfo.csGameConfig.tmp5); //发送数据 std::string pbdata = ClubList.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_UPDATE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //删除 bool CAttemperEngineSink::OnDBDeleteClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_Club_Action_Ack1 * pActionAck1 = (DBR_GR_Club_Action_Ack1 *)pData; if (pActionAck1 == NULL) return false; //遍历房间修改已经创房的属性 { CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Temp = it->second; if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck1->dwClubID) { Temp.roomType = 0; Temp.tmp6[0] = 0; Temp.dwInsert_UpData_Del = 1; UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp)); } it++; } } //返回数据 CMD_GR_Club_Action_Ack1 ActionAck1; ZeroMemory(&ActionAck1, sizeof(ActionAck1)); ActionAck1.Result = pActionAck1->Result; CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message)); Club::PB_CS_S_Club_Action_Ack1 ClubAction; ClubAction.set_result(ActionAck1.Result); std::string Message = CW2AEX<1024>(ActionAck1.Message, CP_UTF8).m_psz; ClubAction.set_message(Message); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_DELETE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //查看 bool CAttemperEngineSink::OnDBGetClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Action_Ack2 * pActionAck2 = (CMD_GR_Club_Action_Ack2 *)pData; if (pActionAck2 == NULL) return false; Club::PB_CS_S_Club_Action_Ack2 ClubList; ClubList.set_result(pActionAck2->Result); std::string Message = CW2AEX<1024>(pActionAck2->Message, CP_UTF8).m_psz; std::string szClubName = CW2AEX<1024>(pActionAck2->ClubInfo.szClubName, CP_UTF8).m_psz; std::string szHostName = CW2AEX<1024>(pActionAck2->ClubInfo.szHostName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pActionAck2->ClubInfo.szHeadUrl, CP_UTF8).m_psz; ClubList.set_message(Message); ClubList.mutable_clubinfo()->set_dwclubid(pActionAck2->ClubInfo.dwClubID); ClubList.mutable_clubinfo()->set_szclubname(szClubName); ClubList.mutable_clubinfo()->set_cbisowner(pActionAck2->ClubInfo.cbIsOwner); ClubList.mutable_clubinfo()->set_wtotalnum(pActionAck2->ClubInfo.wTotalNum); ClubList.mutable_clubinfo()->set_wwaittablenum(pActionAck2->ClubInfo.wWaitTableNum); ClubList.mutable_clubinfo()->set_wonlinenum(pActionAck2->ClubInfo.wOnLineNum); ClubList.mutable_clubinfo()->set_wwaitusernum(pActionAck2->ClubInfo.wWaitUserNum); ClubList.mutable_clubinfo()->set_dwownerid(pActionAck2->ClubInfo.dwOwnerID); ClubList.mutable_clubinfo()->set_szhostname(szHostName); ClubList.mutable_clubinfo()->set_szheadurl(szHeadUrl); ClubList.mutable_clubinfo()->set_temp1(pActionAck2->ClubInfo.temp1); ClubList.mutable_clubinfo()->set_temp2(pActionAck2->ClubInfo.temp2); ClubList.mutable_clubinfo()->set_temp3(pActionAck2->ClubInfo.temp3); ClubList.mutable_clubinfo()->set_temp4(pActionAck2->ClubInfo.temp4); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wsubgameid(pActionAck2->ClubInfo.csGameConfig.wSubGameID); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplayrule(pActionAck2->ClubInfo.csGameConfig.wPlayRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxfanrule(pActionAck2->ClubInfo.csGameConfig.wMaxFanRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxscore(pActionAck2->ClubInfo.csGameConfig.wMaxScore); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplaycountrule(pActionAck2->ClubInfo.csGameConfig.wPlayCountRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_whadplaycount(pActionAck2->ClubInfo.csGameConfig.wHadPlayCount); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_zmextrarule(pActionAck2->ClubInfo.csGameConfig.zmExtraRule); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_dghrule(pActionAck2->ClubInfo.csGameConfig.dghRule); std::string sPrivateTableID = CW2AEX<1024>(pActionAck2->ClubInfo.csGameConfig.sPrivateTableID, CP_UTF8).m_psz; ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_bduolai(pActionAck2->ClubInfo.csGameConfig.bDuoLai); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wfengding(pActionAck2->ClubInfo.csGameConfig.wFengDing); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp1(pActionAck2->ClubInfo.csGameConfig.tmp1); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp2(pActionAck2->ClubInfo.csGameConfig.tmp2); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp3(pActionAck2->ClubInfo.csGameConfig.tmp3); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp4(pActionAck2->ClubInfo.csGameConfig.tmp4); ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp5(pActionAck2->ClubInfo.csGameConfig.tmp5); //发送数据 std::string pbdata = ClubList.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //查看 额外玩法 bool CAttemperEngineSink::OnDBGetAddClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Action_Ack1Add * pActionAck2 = (CMD_GR_Club_Action_Ack1Add *)pData; if (pActionAck2 == NULL) return false; Club::PB_CS_S_Club_Action_Ack1Add ClubAction; ClubAction.set_result(pActionAck2->Result); std::string Message = CW2AEX<1024>(pActionAck2->Message, CP_UTF8).m_psz; ClubAction.set_message(Message); ClubAction.mutable_autoaddinfo()->set_dwclubid(pActionAck2->AutoAddInfo.dwClubID); ClubAction.mutable_autoaddinfo()->set_cbwanfaid(pActionAck2->AutoAddInfo.cbWanfaId); ClubAction.mutable_autoaddinfo()->set_cbstatus(pActionAck2->AutoAddInfo.cbStatus); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wsubgameid(pActionAck2->AutoAddInfo.gameconfig.wSubGameID); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplayrule(pActionAck2->AutoAddInfo.gameconfig.wPlayRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxfanrule(pActionAck2->AutoAddInfo.gameconfig.wMaxFanRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxscore(pActionAck2->AutoAddInfo.gameconfig.wMaxScore); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplaycountrule(pActionAck2->AutoAddInfo.gameconfig.wPlayCountRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_whadplaycount(pActionAck2->AutoAddInfo.gameconfig.wHadPlayCount); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_zmextrarule(pActionAck2->AutoAddInfo.gameconfig.zmExtraRule); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_dghrule(pActionAck2->AutoAddInfo.gameconfig.dghRule); std::string sPrivateTableID = CW2AEX<1024>(pActionAck2->AutoAddInfo.gameconfig.sPrivateTableID, CP_UTF8).m_psz; ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_sprivatetableid(sPrivateTableID); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_bduolai(pActionAck2->AutoAddInfo.gameconfig.bDuoLai); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wfengding(pActionAck2->AutoAddInfo.gameconfig.wFengDing); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp1(pActionAck2->AutoAddInfo.gameconfig.tmp1); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp2(pActionAck2->AutoAddInfo.gameconfig.tmp2); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp3(pActionAck2->AutoAddInfo.gameconfig.tmp3); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp4(pActionAck2->AutoAddInfo.gameconfig.tmp4); ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp5(pActionAck2->AutoAddInfo.gameconfig.tmp5); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_MORE_WANFA_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //加入 bool CAttemperEngineSink::OnDBJoinClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Action_Ack1 * pActionAck1 = (CMD_GR_Club_Action_Ack1 *)pData; if (pActionAck1 == NULL) return false; Club::PB_CS_S_Club_Action_Ack1 ClubAction; ClubAction.set_result(pActionAck1->Result); std::string Message = CW2AEX<1024>(pActionAck1->Message, CP_UTF8).m_psz; ClubAction.set_message(Message); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_JOIN_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //退出 bool CAttemperEngineSink::OnDBQuitClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_Club_Action_Ack1 * pActionAck1 = (DBR_GR_Club_Action_Ack1 *)pData; if (pActionAck1 == NULL) return false; if (pActionAck1->Result == 1) { for (int i = 0; i < 20; i++) { if (pIServerUserItem->GetUserInfo()->dwClubID[i] == pActionAck1->dwClubID) { pIServerUserItem->GetUserInfo()->dwClubID[i] = 0; break; } } } CMD_GR_Club_Action_Ack1 ActionAck1; ZeroMemory(&ActionAck1, sizeof(ActionAck1)); ActionAck1.Result = pActionAck1->Result; CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message)); Club::PB_CS_S_Club_Action_Ack1 ClubAction; ClubAction.set_result(ActionAck1.Result); std::string Message = CW2AEX<1024>(pActionAck1->Message, CP_UTF8).m_psz; ClubAction.set_message(Message); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_QUIT_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //同意加入 bool CAttemperEngineSink::OnDBAgreeClub(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_Club_Action_Ack3 * pActionAck3 = (DBR_GR_Club_Action_Ack3 *)pData; if (pActionAck3 == NULL) return false; if ((pActionAck3->Agree == 1 || pActionAck3->Agree == 5 || pActionAck3->Agree == 11) && pActionAck3->Result == 1) { //在线用户 WORD wUserIndex = 0; while (true) { IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); if (pIServerUserItemSend == NULL) break; if (pIServerUserItemSend->GetUserID() == pActionAck3->dwUserID) { for (int i = 0; i < 20; i++) { if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == 0) { pIServerUserItemSend->GetUserInfo()->dwClubID[i] = pActionAck3->dwClubID; break; } } break; } } } if ((pActionAck3->Agree == 2 || pActionAck3->Agree == 4) && pActionAck3->Result == 1) { //在线用户 WORD wUserIndex = 0; while (true) { IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++); if (pIServerUserItemSend == NULL) break; if (pIServerUserItemSend->GetUserID() == pActionAck3->dwUserID) { for (int i = 0; i < 20; i++) { if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == pActionAck3->dwClubID) { pIServerUserItemSend->GetUserInfo()->dwClubID[i] =0; break; } } break; } } } CMD_GR_Club_Action_Ack3 ActionAck3; ZeroMemory(&ActionAck3, sizeof(ActionAck3)); ActionAck3.Result = pActionAck3->Result; ActionAck3.dwClubID = pActionAck3->dwClubID; ActionAck3.cbAgree = pActionAck3->Agree; CopyMemory(ActionAck3.Message, pActionAck3->Message, sizeof(pActionAck3->Message)); if (ActionAck3.Result == 1) { _sntprintf(ActionAck3.Message, CountArray(ActionAck3.Message), TEXT("%d"), pActionAck3->dwUserID); } Club::PB_CS_S_Club_Action_Ack3 ClubAction; ClubAction.set_wclubid(ActionAck3.dwClubID); ClubAction.set_result(ActionAck3.Result); std::string Message = CW2AEX<1024>(ActionAck3.Message, CP_UTF8).m_psz; ClubAction.set_message(Message); ClubAction.set_cbagree(ActionAck3.cbAgree); //发送数据 std::string pbdata = ClubAction.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_ISAGREE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //自动创房 bool CAttemperEngineSink::OnDBAutoCreateTable(DWORD dwContextID, VOID * pData, WORD wDataSize){ CMD_GR_Club_Action_Ack2Ex2 * pActionAck2 = (CMD_GR_Club_Action_Ack2Ex2 *)pData; if (pActionAck2 == NULL) return false; if (pActionAck2->Ack2.ClubInfo.temp1 == 2) { //校验P //本节点是否能创建房间 if (!m_BCreate) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:没有可用的服务器,俱乐部 [ ClubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID); CTraceService::TraceString(szString, TraceLevel_Normal); return true; } //向协调申请换服务器开房 CMD_GR_ClubAction2_XT ClubAction; ZeroMemory(&ClubAction, sizeof(ClubAction)); ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID; //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段 ClubAction.dwServerID = pCGameServerItem->wServerID; ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction)); return true; } //花牌判定 BOOL bCreateHuaPai = (14 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID) || (15 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID) || (16 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID); if (!m_BCreate_Hua && bCreateHuaPai) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:花牌没有可用的服务器,俱乐部 [ clubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID); CTraceService::TraceString(szString, TraceLevel_Normal); return true; } //向协调申请换服务器开房 CMD_GR_ClubAction2_XT ClubAction; ZeroMemory(&ClubAction, sizeof(ClubAction)); ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID; //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段 ClubAction.dwServerID = pCGameServerItem->wServerID; ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction)); return true; } //当前服务器桌子上限判断 DWORD wMaxTable = m_pGameServiceOption->wTableCount; DWORD dwOnlineTableCount = m_PriTableID_2_TableID.size(); if (dwOnlineTableCount >= (wMaxTable - 1)) { tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID); //推荐可以创建桌子的服务器 if (pCGameServerItem == NULL) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:本服务器桌子到达上限没有可用的服务器,俱乐部 [ clubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID); CTraceService::TraceString(szString, TraceLevel_Normal); return true; } //向协调申请换服务器开房 CMD_GR_ClubAction2_XT ClubAction; ZeroMemory(&ClubAction, sizeof(ClubAction)); ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID; //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段 ClubAction.dwServerID = pCGameServerItem->wServerID; ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction)); return true; } //EE void * pBuffer = NULL; try { pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig)); ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig)); CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pBuffer; pEx->dwUserID = pActionAck2->dwUserID; pEx->cbAuto = 1;//表示自动创房 pEx->hostInfo.dwOwnerID = pActionAck2->Ack2.ClubInfo.dwOwnerID; CopyMemory(pEx->hostInfo.szHeadUrl, pActionAck2->Ack2.ClubInfo.szHeadUrl, sizeof(pActionAck2->Ack2.ClubInfo.szHeadUrl)); CopyMemory(pEx->hostInfo.szHostName, pActionAck2->Ack2.ClubInfo.szHostName, sizeof(pActionAck2->Ack2.ClubInfo.szHostName)); memcpy(pEx->data.TableConfig, &(pActionAck2->Ack2.ClubInfo.csGameConfig), sizeof(tagTableConfig)); pEx->data.cbCreateTable = 1;//1表示创建新房间 pEx->data.tableType = 1; //?? pEx->data.clubID = pActionAck2->Ack2.ClubInfo.dwClubID; pEx->cbWanFa = pActionAck2->Ack2.ClubInfo.temp4;//用来表示俱乐部的自动开房多玩法的0,1,2 //获取私有房间随机号码 ASSERT(m_pITCPSocketService != NULL); m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pBuffer, sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig)); if (pBuffer) free(pBuffer); pBuffer = NULL; } catch (...) { if (pBuffer) free(pBuffer); } } return true; } //公告 bool CAttemperEngineSink::OnDBGetClubNotice(DWORD dwContextID, VOID * pData, WORD wDataSize){ DBR_GR_ClubNotice_ACK* pClubNotice = (DBR_GR_ClubNotice_ACK *)pData; if (pClubNotice == NULL) return false; //返回数据 CMD_GR_ClubNoticeACK NoticeAck; ZeroMemory(&NoticeAck, sizeof(NoticeAck)); NoticeAck.cbResult = pClubNotice->Result; NoticeAck.cbType = pClubNotice->cbType; NoticeAck.dwClubID = pClubNotice->dwClubID; NoticeAck.dwTemp = pClubNotice->dwTemp; CopyMemory(NoticeAck.Message, pClubNotice->Message, sizeof(NoticeAck.Message)); Club::PB_CS_S_ClubNoticeACK ClubNotice; ClubNotice.set_dwclubid(NoticeAck.dwClubID); ClubNotice.set_cbtype(NoticeAck.cbType); ClubNotice.set_dwtemp(NoticeAck.dwTemp); ClubNotice.set_cbresult(NoticeAck.cbResult); std::string Message = CW2AEX<1024>(NoticeAck.Message, CP_UTF8).m_psz; ClubNotice.set_message(Message); //发送数据 std::string pbdata = ClubNotice.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_NOTICE_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //在线信息 //bool CAttemperEngineSink::OnDBGetClubOnLine(DWORD dwContextID, VOID * pData, WORD wDataSize){ // // //获取用户 // WORD wBindIndex = LOWORD(dwContextID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // return false; // } // // DBR_GR_ClubOnLine * pClubOnLineAck = (DBR_GR_ClubOnLine *)pData; // if(pClubOnLineAck == NULL) return false; // // //返回数据 // CMD_GR_ClubOnLine_Ack ClubOnLine; // ZeroMemory(&ClubOnLine, sizeof(ClubOnLine)); // // ClubOnLine.wTotalUserCount = pClubOnLineAck->wUserCount; // if (ClubOnLine.wTotalUserCount > 1000){ ClubOnLine.wTotalUserCount = 1000; } // ClubOnLine.wNewUserCount = pClubOnLineAck->wNewUserCount; // ClubOnLine.dwClubID = pClubOnLineAck->dwClubID; // ClubOnLine.wUserMessageCount = pClubOnLineAck->wMessageCount; // // // // //在线用户 // WORD userCount = 0; // // //从全局服务器上找 // for (int i = 0; i < ClubOnLine.wTotalUserCount; i++) // { // auto iter = m_OnLineUserAll.find(pClubOnLineAck->dwUserID[i]); // if (iter != m_OnLineUserAll.end()) // { // userCount++; // } // } // ClubOnLine.wOnLineUserNum = userCount; // // // //房间信息 // DWORD tableCount = 0; // //int startIndex = 0; // CMD_S_Table_Info tableInfo[200] = { 0 }; // // int AutoTableFreeCountAdd[3] = { 0 };//LYH 2018-11-2 表示多玩法的不同玩法桌子空闲个数 // // //从全局服务器上查找 // int AutoTableCount = 0; // CWHDataLocker DataLocker(m_CriticalSection); // JN_GR_RoomListInfo RoomInfo; // JN_GR_RoomListBig Temp; // std::unordered_map::iterator it2 = m_PrivateRoomAll.begin(); // while (it2 != m_PrivateRoomAll.end()) // { // ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig)); // Temp = it2->second; // if (Temp.roomType == 1 && Temp.tmp6[0] == pClubOnLineAck->dwClubID) // { // if (Temp.roomStatus == 0 && Temp.currentjushu == 0) // { // for (BYTE i = 0; i < 3; i++) // { // if (Temp.tmp4 == i && pClubOnLineAck->IsWanFa[i] == 1) // { // AutoTableFreeCountAdd[i]++; // break; // } // } // } // //如果是自动开的房且没有开始(有待优化)(服务器重启自动开房判定) // AutoTableCount++; // ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo)); // // RoomInfo.dwDiFen = Temp.dwDiFen; // RoomInfo.dwJuShu = Temp.dwJuShu; // RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay; // RoomInfo.dwRoomNumber = Temp.dwRoomNumber; // RoomInfo.dwServerID = Temp.dwServerID; // RoomInfo.bFanGua = Temp.bFanGua; // RoomInfo.bWanFa = Temp.bWanFa; // // RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以 // RoomInfo.wFengDing = Temp.wFengDing; //封顶值 // RoomInfo.tmp1 = Temp.tmp1; //备用字段 // RoomInfo.tmp2 = Temp.tmp2; //备用字段 // // // to do 判断用户版本号 // TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; // memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); // del_char(szMachineID, L'.'); // __int64 iMachineID = StrToNmuber(szMachineID); // // //--最低要求的版本号 // TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 }; // memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer)); // del_char(szMinClientVer, L'.'); // __int64 iMinClientVer = StrToNmuber(szMinClientVer); // // if (iMachineID < iMinClientVer && ((RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2))) // { // it2++; // TCHAR szString[512] = { 0 }; // _sntprintf(szString, CountArray(szString), TEXT("版本异常:用户ID不匹配[ RoomInfo.bDuoLai=%ld,RoomInfo.bWanFa=%ld,RoomInfo.wFengDing = %ld ]"), RoomInfo.bDuoLai, RoomInfo.bWanFa, RoomInfo.wFengDing); // CTraceService::TraceString(szString, TraceLevel_Warning); // continue; // } // // StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName); // //修改直接获取房间ip信息2018-07-30 // StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), Temp.szIp); // //CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(Temp.dwServerID); // //if (pCGameServerItem) // //{ // /*if (pIServerUserItem->GetUserInfo()->iXinYong == 1 && // pCGameServerItem->m_GameServer.wServerLevel > 2) // { // continue; // CMD_GR_UserSitDownAck req; // req.cbRet = 1; // // req.szText; // StringCchCopy(req.szText, _countof(req.szText), _T("此房间不可用,请自行建房.")); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); // return true; // }*/ // // //计算距离排名 // //iPaiMing = 0; iCountMax = 1; // //GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); // //ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax); // //if (ip.c_str() != Temp.szIp) // //{ // // CString str; // // str.Format(_T("获取的ip不等于内存szIp。ip=%s Temp.szIp=%s", ip, Temp.szIp)); // // CTraceService::TraceString(str, TraceLevel_Warning); // //} // //StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str()); // //} // // // // if (Temp.szIp == L"") // { // it2++; // TCHAR szString[512] = { 0 }; // _sntprintf(szString, CountArray(szString), TEXT("获取ip异常")); // CTraceService::TraceString(szString, TraceLevel_Warning); // continue; // /*CMD_GR_UserSitDownAck req; // req.cbRet = 1; // // req.szText; // StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!")); // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1); // return true;*/ // } // // RoomInfo.wPort = Temp.wPort; // //m_Data.dAddRoomChange++; // // //if (pCGameServerItem != NULL) // //{ // // if (IsJC(9999)) // // { // // CString csTestB; // // csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d") // // , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort // // , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); // // CTraceService::TraceString(csTestB, TraceLevel_Normal); // // } // //} // //else // //{ // // CString csTestB; // // csTestB.Format(_T("未找到游戏节点 %d"), Temp.dwServerID); // // // CTraceService::TraceString(csTestB, TraceLevel_Normal); // //} // // tableInfo[tableCount].dwUserID = Temp.dwUserID; // tableInfo[tableCount].cbNum = Temp.dwReadyBody; // CopyMemory(tableInfo[tableCount].szHeadUrl, Temp.szHeadUrl, sizeof(Temp.szHeadUrl)); // CopyMemory(&(tableInfo[tableCount].room), &RoomInfo, sizeof(RoomInfo)); // tableCount++; // //if (tableCount >= 10){ break; } lyh 2018 - 9 - 13 // if (tableCount >= 200){break;} // } // it2++; // } // // ////对tableinfo进行排序 // if ( tableCount >= 2 ) // { // for (int i = 0; i < tableCount - 1; i++) // { // // for (int j = 0; j < tableCount - 1 - i; j++) // { // if (tableInfo[j].cbNum > tableInfo[j + 1].cbNum) // { // CMD_S_Table_Info tableInfoTemp; // ZeroMemory(&tableInfoTemp, sizeof(CMD_S_Table_Info)); // CopyMemory(&tableInfoTemp, &tableInfo[j], sizeof(CMD_S_Table_Info)); // // ZeroMemory(&tableInfo[j], sizeof(CMD_S_Table_Info)); // CopyMemory(&tableInfo[j], &tableInfo[j + 1], sizeof(CMD_S_Table_Info)); // // ZeroMemory(&tableInfo[j + 1], sizeof(CMD_S_Table_Info)); // CopyMemory(&tableInfo[j + 1], &tableInfoTemp, sizeof(CMD_S_Table_Info)); // } // } // } // } // // // int k = 0; // for (int i = pClubOnLineAck->wStartIndex; i < tableCount; i++) // { // CopyMemory(&ClubOnLine.csTableInfo[k++], &tableInfo[i], sizeof(CMD_S_Table_Info)); // if (k == pClubOnLineAck->wCount || k>= 20) break; // } // // ClubOnLine.wTableInfoCount = k; // ClubOnLine.wTableNum = tableCount; // //真实数据包长 // int pageLen = (sizeof(CMD_S_Table_Info)*k) + (sizeof(WORD) * 6) + sizeof(DWORD); // //发送数据 // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_ACK, &ClubOnLine, pageLen);// sizeof(ClubOnLine) // // //自动开房校验:1.宕机没房间的时候第一个玩家获取在线信息时自动创房 2.平时出现没有自动创房时,群主获取在线信息时自动创房 // if (AutoTableCount == 0 && pClubOnLineAck->TableChoice == 2) // { // for (BYTE i = 0; i < 3; i++) // { // if (AutoTableFreeCountAdd[i] == 0 && pClubOnLineAck->IsWanFa[i] == 1) // { // this->OnAutoCreateRoomToDB(pClubOnLineAck->dwClubID, pIServerUserItem->GetUserID(), i); // } // } // } // // return true; //} //在线信息 bool CAttemperEngineSink::OnDBGetClubOnLineEx(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_ClubOnLine * pClubOnLineAck = (DBR_GR_ClubOnLine *)pData; if (pClubOnLineAck == NULL) return false; //在线用户 WORD userCount = 0; for (int i = 0; i < pClubOnLineAck->wUserCount; i++) { auto iter = m_OnLineUserAll.find(pClubOnLineAck->dwUserID[i]); if (iter != m_OnLineUserAll.end()) { userCount++; } } CMD_GR_TableOtherInfo_Notify TableOtherInfo; ZeroMemory(&TableOtherInfo, sizeof(TableOtherInfo)); TableOtherInfo.ClubID = pClubOnLineAck->dwClubID; TableOtherInfo.totalUserNum = pClubOnLineAck->wUserCount; TableOtherInfo.onlineUserNum = userCount; TableOtherInfo.newMsgNum = pClubOnLineAck->wMessageCount; TableOtherInfo.newUserNum = pClubOnLineAck->wNewUserCount; TableOtherInfo.Type = 0x7F;//127 if (TableOtherInfo.newMsgNum == 0) TableOtherInfo.Type -= 8; if (TableOtherInfo.newUserNum == 0) TableOtherInfo.Type -= 16; int AutoWaitTableCountAdd[3] = { 0 }; // [CountArray(pClubOnLineAck->cbSubGameID)] = { 0 };//LYH 11-2 龙11.10修改 { CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it2 = m_PrivateRoomAll.begin(); while (it2 != m_PrivateRoomAll.end()) { JN_GR_RoomListBig Rooms = it2->second; if (Rooms.roomType == 1 && Rooms.tmp6[0] == pClubOnLineAck->dwClubID) { TableOtherInfo.totalTableNum++; if (Rooms.roomStatus == 0 && Rooms.currentjushu == 0) { TableOtherInfo.waitTableNum++; for (BYTE i = 0; i < 3; i++) { if (Rooms.tmp4 == i && pClubOnLineAck->IsWanFa[i] == 1) { AutoWaitTableCountAdd[i]++; break; } } } if (Rooms.roomStatus == 1 || Rooms.currentjushu > 0) TableOtherInfo.playTableNum++; } it2++; } } Club::PB_CS_S_TableOtherInfo_Notify Notify; Notify.set_clubid(TableOtherInfo.ClubID); Notify.set_newmsgnum(TableOtherInfo.newMsgNum); Notify.set_newusernum(TableOtherInfo.newUserNum); Notify.set_onlineusernum(TableOtherInfo.onlineUserNum); Notify.set_playtablenum(TableOtherInfo.playTableNum); Notify.set_totaltablenum(TableOtherInfo.totalTableNum); Notify.set_totalusernum(TableOtherInfo.totalUserNum); Notify.set_type(TableOtherInfo.Type); Notify.set_waittablenum(TableOtherInfo.waitTableNum); //发送数据 std::string pbdata = Notify.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_CLUBCHANGE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length()); //自动创房触发 if (pClubOnLineAck->TableChoice == 2) { for (BYTE i = 0; i < 3; i++) { if (pClubOnLineAck->IsWanFa[i] == 1 && AutoWaitTableCountAdd[i] == 0) { //TCHAR szString[512] = { 0 }; //_sntprintf(szString, CountArray(szString), TEXT("打印玩法创建情况pClubOnLineAck->IsWanFa[%d]= %d, AutoWaitTableCountAdd[i]= %d"), i, pClubOnLineAck->IsWanFa[i], AutoWaitTableCountAdd[i]); //CTraceService::TraceString(szString, TraceLevel_Warning); this->OnAutoCreateRoomToDB(pClubOnLineAck->dwClubID, pIServerUserItem->GetUserID(), i); } } } return true; } bool CAttemperEngineSink::OnDBNotifyClubUser(DWORD dwContextID, VOID * pData, WORD wDataSize) { OutputDebugStringA("OnDBNotifyClubUser"); DBR_GR_UserData * pUserData = (DBR_GR_UserData *)pData; //返回数据 CMD_GR_Club_Notify_ACK Notify; ZeroMemory(&Notify, sizeof(Notify)); //赋值 Notify.newsFalg = pUserData->newsFlag; Notify.dwClubID = pUserData->dwClubID; Notify.dwUserCount = pUserData->newUserCount; CopyMemory(Notify.Message, pUserData->Message, sizeof(pUserData->Message)); //从全局服务器上找 for (int i = 0; i < pUserData->wUserCount; i++) { auto iter = m_OnLineUserAll.find(pUserData->dwUserID[i]); if (iter != m_OnLineUserAll.end()) { CMD_GR_Club_NotifyEX_ACK NotifyEx; ZeroMemory(&NotifyEx, sizeof(CMD_GR_Club_NotifyEX_ACK)); NotifyEx.dwUserId = pUserData->dwUserID[i]; CopyMemory(&NotifyEx.Notify, &Notify, sizeof(Notify)); if (m_pITCPSocketService) { m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_SendMessage, &NotifyEx, sizeof(CMD_GR_Club_NotifyEX_ACK)); } } } return true; } //特殊会员 bool CAttemperEngineSink::OnDBGetClubBlackUser(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_ClubUser2_Ack * pClubUserAck = (CMD_GR_ClubUser2_Ack *)pData; if (pClubUserAck == NULL) return false; for (int i = 0; i < pClubUserAck->wCount; i++) { //从其全局服务器上找 if (i >= 20){ break; } auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID); if (iter != m_OnLineUserAll.end()) { pClubUserAck->csMemberInfo[i].isOnline = 1; } } Club::PB_CS_S_ClubUser2_Ack ClubRecord; ClubRecord.set_cbkind(pClubUserAck->cbKind); ClubRecord.set_tmp(pClubUserAck->tmp); ClubRecord.set_cbhost(pClubUserAck->cbHost); ClubRecord.set_dwclubid(pClubUserAck->dwClubID); ClubRecord.set_wcount(pClubUserAck->wCount); for (WORD i = 0; i < pClubUserAck->wCount; i++) { Club::PB_CS_S_MemberInfo* RecordInfo = ClubRecord.add_csmemberinfo(); RecordInfo->set_bangmaid(pClubUserAck->csMemberInfo[i].BangMaID); RecordInfo->set_cbstaus(pClubUserAck->csMemberInfo[i].cbStaus); RecordInfo->set_ishost(pClubUserAck->csMemberInfo[i].isHost); RecordInfo->set_isonline(pClubUserAck->csMemberInfo[i].isOnline); RecordInfo->set_dwuserid(pClubUserAck->csMemberInfo[i].dwUserID); std::string szName = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szName, CP_UTF8).m_psz; std::string szHeadUrl = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szHeadUrl, CP_UTF8).m_psz; RecordInfo->set_szname(szName); RecordInfo->set_szheadurl(szHeadUrl); } //发送数据 std::string pbdata = ClubRecord.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBBLACKUSER_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //协议 bool CAttemperEngineSink::OnDBGetClubProtocol(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_ClubProtocolAgree * pClubProtocolAck = (DBR_GR_ClubProtocolAgree *)pData; if (pClubProtocolAck == NULL) return false; //返回数据 CMD_GR_ClubProtocolAgree ClubProtocol; ZeroMemory(&ClubProtocol, sizeof(ClubProtocol)); ClubProtocol.dwClubID = pClubProtocolAck->dwClubID; ClubProtocol.cbAgree = pClubProtocolAck->cbAgree; ClubProtocol.dwTemp = pClubProtocolAck->dwTemp; Club::PB_CS_S_ClubProtocolAgree ProtocolAgree; ProtocolAgree.set_dwclubid(ClubProtocol.dwClubID); ProtocolAgree.set_cbagree(ClubProtocol.cbAgree); ProtocolAgree.set_dwtemp(ClubProtocol.dwTemp); //发送数据 std::string pbdata = ProtocolAgree.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_PROTOLCOL_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //群主解散俱乐部房间 bool CAttemperEngineSink::OnDBGetClubDissolveRoom(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_ClubDissolveRoom* pClubDissolveRoom = (DBR_GR_ClubDissolveRoom*)pData; if (pClubDissolveRoom == NULL) return false; if (pClubDissolveRoom->cbIsAdmin == 0) { //GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSROOM, 0, &pClubDissolveRoom->dwRoomID, sizeof(DWORD)); //通知协调全局解散此房间 DWORD dwRoomID = pClubDissolveRoom->dwRoomID; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, &dwRoomID, sizeof(DWORD)); } else if (pClubDissolveRoom->cbIsAdmin == 1) { SendRequestFailure(pIServerUserItem, TEXT("您没有权限,不能强制解散!"), 0); } else { SendRequestFailure(pIServerUserItem, TEXT("今日超过次数!"), 0); } return true; } //同意协议 bool CAttemperEngineSink::OnDBAgreeClubProtocol(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_Club_Action_Ack1 * pClubProtocolAck = (DBR_GR_Club_Action_Ack1 *)pData; if (pClubProtocolAck == NULL) return false; Club::PB_CS_S_ClubActionAck1 ProtocolAgree; ProtocolAgree.set_dwclubid(pClubProtocolAck->dwClubID); ProtocolAgree.set_result(pClubProtocolAck->Result); std::string Message = CW2AEX<1024>(pClubProtocolAck->Message, CP_UTF8).m_psz; ProtocolAgree.set_message(Message); //发送数据 std::string pbdata = ProtocolAgree.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_PROTOLCOLAGREE_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //群主信息(自动开房和群主支付创房) bool CAttemperEngineSink::OnDBGetClubHostInfo(DWORD dwContextID, VOID * pData, WORD wDataSize){ DBR_GR_UserSitDownEx3 * pClubHostInfoAck = (DBR_GR_UserSitDownEx3 *)pData; if (pClubHostInfoAck == NULL) return false; IServerUserItem * pIServerUserItem = NULL; if (pClubHostInfoAck->UserSitDownData.cbAuto == 0 && dwContextID != 0) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL ) { return false; } } if (pClubHostInfoAck->UserSitDownData.data.cbCreateTable == 1) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); pIServerUserItem = GetBindUserItem(wBindIndex); CMD_GR_UserSitDownAck req; req.cbRet = 1; if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { StringCchCopy(req.szText, _countof(req.szText), _T("俱乐部已经打样,不能创建房间")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); } return true; } tagGameConfig* pConfigTemp = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig; if (1 == pClubHostInfoAck->UserSitDownData.cbAuto || pConfigTemp->wMaxFanRule >= 10)//不是群主创房且不是自动创房 不进行下去,直接返回 { if (pClubHostInfoAck->currCurrency < pClubHostInfoAck->UserSitDownData.ReduceBeans) { if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("群主钻石不足,不能创建房间!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); } else { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:群主钻石不够,俱乐部[ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID); CTraceService::TraceString(szString, TraceLevel_Normal); //广播给其他用户(目前广播给群主) CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = pClubHostInfoAck->UserSitDownData.data.clubID; UserData.newsFlag = 4; //UserData.dwUserId = pClubHostInfoAck->UserSitDownData.dwUesrID; CString s = L"自动创房失败:群主钻石不够"; _tcscpy(UserData.Message, s); m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } return true; } } //俱乐部房间 if (pClubHostInfoAck->UserSitDownData.data.tableType == 1) { int count = 0; //从全局服务器上找 int flag = 1; CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it1 = m_PrivateRoomAll.begin(); while (it1 != m_PrivateRoomAll.end() && flag) { JN_GR_RoomListBig rooms = it1->second; if (rooms.roomType == 1 && rooms.tmp6[0] == pClubHostInfoAck->UserSitDownData.data.clubID) { tagGameConfig* pConfigTemp = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig; if (rooms.roomStatus == 0 && pConfigTemp->wSubGameID == rooms.bWanFa && pConfigTemp->wFengDing == rooms.wFengDing && rooms.tmp4 == pClubHostInfoAck->UserSitDownData.cbWanFa)//按照玩法来筛选空闲 { if (rooms.tmp5 == 1 && rooms.currentjushu == 0)//当这个俱乐部为自动有自动建房的房间,且为空闲的,就不往下走了 //添加校验(自动开房) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:%d 已经存在一个房间了.房间号:%d,人数:%d,状态:%d 玩法几:%d"), pClubHostInfoAck->UserSitDownData.data.clubID, rooms.dwRoomNumber, rooms.dwReadyBody, rooms.roomStatus, rooms.tmp4); CTraceService::TraceString(szString, TraceLevel_Warning); return true; } count++; if (count == 10) { flag = 0; break; } } } it1++; } if (count >= 10) { if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈还有10桌未开始,请稍后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); } return true; } } std::shared_ptr pTableFrame; tagGameConfig* pConfig = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig; pTableFrame = CreatePrivateTable(pClubHostInfoAck->UserSitDownData.RoomID, pConfig->wSubGameID); if (nullptr == pTableFrame) { if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前游戏房间已经人满为患了,请稍后再试!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); } else { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:服务器房间已满,俱乐部 [ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID); CTraceService::TraceString(szString, TraceLevel_Normal); } return true; } TCHAR szTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32); std::wstring str; str = szTemp; m_PriTableID_2_TableID[str] = pTableFrame->GetTableID(); pConfig->wHadPlayCount = pTableFrame->GetTableID(); pConfig->zmExtraRule = 1; StringCchCat(pConfig->sPrivateTableID, 7, str.c_str()); pTableFrame->OnEventSetGameConfig((void*)pClubHostInfoAck->UserSitDownData.data.TableConfig, wDataSize - sizeof(CMD_GR_UserSitDown), str); int TargetID = 0; TCHAR TargetHeadUrl[LEN_HEAD_URL]; TCHAR TargetName[32]; ZeroMemory(TargetName, sizeof(TargetName)); ZeroMemory(TargetHeadUrl, sizeof(TargetHeadUrl)); if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { TargetID = pIServerUserItem->GetUserID(); CopyMemory(TargetHeadUrl, pIServerUserItem->GetUserInfo()->szHeadUrl, sizeof(TargetHeadUrl)); CopyMemory(TargetName, pIServerUserItem->GetUserInfo()->szNickName, sizeof(TargetName)); } else { //校验群主房间是否已满(全局校验) int i = 0; for (i = 0; i <5; i++) { int count = 0; int TestID = pClubHostInfoAck->AdmInfo[i].dwOwnerID; if (TestID == 0) { TCHAR szString[512] = { 0 }; _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:没有找到管理员,房间已满30个,俱乐部 [ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID); CTraceService::TraceString(szString, TraceLevel_Normal); return true; } //全局校验 CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it = m_PrivateRoomAll.begin(); while (it != m_PrivateRoomAll.end()) { JN_GR_RoomListBig rooms = it->second; if (rooms.dwUserID == TestID) { count++; } it++; } if (count >= 30) { continue; } else { break; } } TargetID = pClubHostInfoAck->AdmInfo[i].dwOwnerID; CopyMemory(TargetHeadUrl, pClubHostInfoAck->AdmInfo[i].szHeadUrl, sizeof(TargetHeadUrl)); CopyMemory(TargetName, pClubHostInfoAck->AdmInfo[i].szHostName, sizeof(TargetName)); } pTableFrame->SetPrivateTableOwnerID(TargetID); pTableFrame->SetGameConfig(*pConfig, pClubHostInfoAck->UserSitDownData.data.WXianZhi); //俱乐部房间和好友房间的区分 pTableFrame->SetTableKind(pClubHostInfoAck->UserSitDownData.data.tableType); pTableFrame->SetTableClub(pClubHostInfoAck->UserSitDownData.data.clubID); pTableFrame->SetTableAuto(pClubHostInfoAck->UserSitDownData.cbAuto); JN_GR_RoomListGroup sPrivateTableID; ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup)); //查看自己创建的房间 auto iter = m_UserID_2_PriTableIDGROUP.find(TargetID); if (iter != m_UserID_2_PriTableIDGROUP.end()) { sPrivateTableID = iter->second; if (sPrivateTableID.Num > 29) { if (pClubHostInfoAck->UserSitDownData.cbAuto== 0) { CMD_GR_UserSitDownAck req; req.cbRet = 1; StringCchCopy(req.szText, _countof(req.szText), _T("当前状态不允许创建!")); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; SitDownAck.set_cbret(req.cbRet); std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz; SitDownAck.set_sztext(szText); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); } return true; } } else { std::pair temp(TargetID, sPrivateTableID); m_UserID_2_PriTableIDGROUP.insert(temp); } sPrivateTableID.jgrDate[sPrivateTableID.Num].roomType = pClubHostInfoAck->UserSitDownData.data.tableType; memset(sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6, 0, 3*sizeof(int)); sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6[0] = pClubHostInfoAck->UserSitDownData.data.clubID; sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp5 = pClubHostInfoAck->UserSitDownData.cbAuto; sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp4 = pClubHostInfoAck->UserSitDownData.cbWanFa; //新加一个用来表示同一个俱乐部不同玩法 //头像 StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl),TargetHeadUrl); sPrivateTableID.jgrDate[sPrivateTableID.Num].dwUserID = TargetID; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwServerID = m_pGameServiceOption->wServerID; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwRoomNumber = _ttol(str.c_str()); if (pTableFrame->GetStartMode() == START_MODE_ALL_READY) { sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = 2; } else { sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = pTableFrame->GetChairCount(); } sPrivateTableID.jgrDate[sPrivateTableID.Num].dwDiFen = pConfig->wPlayRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwJuShu = pConfig->wPlayCountRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwReadyBody = 0; sPrivateTableID.jgrDate[sPrivateTableID.Num].bWanFa = pConfig->wSubGameID; sPrivateTableID.jgrDate[sPrivateTableID.Num].bDuoLai = pConfig->bDuoLai; //多癞子可平胡,0可以 1不可以 sPrivateTableID.jgrDate[sPrivateTableID.Num].wFengDing = pConfig->wFengDing; //封顶值 sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp1 = pConfig->tmp1; //备用字段(纠正) sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp2 = pConfig->tmp2; //备用字段 sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp3 = pConfig->tmp3; StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName), TargetName); sPrivateTableID.jgrDate[sPrivateTableID.Num].bFanGua = pConfig->wMaxScore; sPrivateTableID.jgrDate[sPrivateTableID.Num].bRoomCreatePay = pConfig->wMaxFanRule; sPrivateTableID.jgrDate[sPrivateTableID.Num].dwInsert_UpData_Del = 0; CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID); if (pCGameServerItem) { //非自动创房通过玩家设置IP if (pClubHostInfoAck->UserSitDownData.cbAuto == 0) { int iPaiMing = 0; int iCountMax = 1; GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax); std::wstring ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax); StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), ip.c_str()); } else { //设置本地址IP StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), pCGameServerItem->m_GameServer.szServerAddr); } sPrivateTableID.jgrDate[sPrivateTableID.Num].wPort = pCGameServerItem->m_GameServer.wServerPort; } //同步到中心服务器 JN_GR_RoomListBig UserChat = sPrivateTableID.jgrDate[sPrivateTableID.Num]; UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat)); sPrivateTableID.Num++; m_UserID_2_PriTableIDGROUP[TargetID] = sPrivateTableID; ///[+++支付修正下,根据玩法人数扣(修改3人玩法的BUG)2018-1-11 WORD wChairCount = pTableFrame->GetChairCount(); WORD wReduceBeans = 0; if (pConfig->wMaxFanRule == 0 || pConfig->wMaxFanRule >= 10) { wReduceBeans = pClubHostInfoAck->UserSitDownData.ReduceBeans / wChairCount * wChairCount; //强制转换对于特定2人 if (pTableFrame->GetStartMode() == START_MODE_ALL_READY) { wReduceBeans = 2 * (pConfig->wPlayCountRule / 8); } } else { wReduceBeans = pClubHostInfoAck->UserSitDownData.ReduceBeans; } if (1 == pClubHostInfoAck->UserSitDownData.cbAuto || pConfigTemp->wMaxFanRule >= 10)//不是群主创房且不是自动创房 不进行下去,直接返回 { //UserInfo->dwBean = UserInfo->dwBean - wReduceBeans; //锁定元宝 pTableFrame->LockBeans(pClubHostInfoAck->UserSitDownData.hostInfo.dwOwnerID, wReduceBeans); } else if (pIServerUserItem) { pIServerUserItem->GetUserInfo()->dwBean = pIServerUserItem->GetUserInfo()->dwBean - wReduceBeans; //锁定元宝 pTableFrame->LockBeans(pIServerUserItem->GetUserID(), wReduceBeans); } //加入旁观 if (pClubHostInfoAck->UserSitDownData .cbAuto == 0 && pTableFrame->PerformLookonAction(pIServerUserItem)) { //房间创建30中后没人玩就解散(方便后台切换服务器) pTableFrame->OnTCPNetworkSubUserCreateRoom(pIServerUserItem); m_Data.dCreateTable++; //进入房间旁观 CMD_GR_UserSitDownAckEx req; TCHAR szTempTemp[32] = { 0 }; if (pTableFrame) pTableFrame->GetPrivateTableID(szTempTemp, 32); lstrcpy(req.szPrivateTableID, szTempTemp); req.cbRet = 0; req.dijin = pConfig->wPlayRule; req.paytype = pConfig->wMaxFanRule; req.desktype = pTableFrame->GetTableKind();// pConfig->wSubGameID; req.playtype = pConfig->wSubGameID; req.totalplay = pConfig->wPlayCountRule; req.bDuoLai = pConfig->bDuoLai; req.wFengDing = pConfig->wFengDing; req.ipLimit = pConfig->wMaxScore; req.playnum = pConfig->tmp1; req.tmp3 = pConfig->tmp2; req.isowner = 1; req.roomId = pTableFrame->GetTableID(); UserInfo::PB_CS_S_UserSitDownAck SitDownAck; std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz; SitDownAck.set_szprivatetableid(szPrivateTableID); SitDownAck.set_cbret(req.cbRet); SitDownAck.set_dijin(req.dijin); SitDownAck.set_paytype(req.paytype); SitDownAck.set_desktype(req.desktype); SitDownAck.set_playtype(req.playtype); SitDownAck.set_totalplay(req.totalplay); SitDownAck.set_bduolai(req.bDuoLai); SitDownAck.set_wfengding(req.wFengDing); SitDownAck.set_iplimit(req.ipLimit); SitDownAck.set_playnum(req.playnum); SitDownAck.set_tmp3(req.tmp3); SitDownAck.set_isowner(req.isowner); SitDownAck.set_roomid(req.roomId); //发送数据 std::string pbdata = SitDownAck.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length()); //用户状态 pIServerUserItem->SetClientReady(true); pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR); } //俱乐部创建房间广播 if (pClubHostInfoAck->UserSitDownData.data.tableType == 1 && pClubHostInfoAck->UserSitDownData.data.clubID != 0) { CMD_GR_UserData UserData; ZeroMemory(&UserData, sizeof(UserData)); UserData.dwClubID = pClubHostInfoAck->UserSitDownData.data.clubID; UserData.newsFlag = 2; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData)); } return true; } //俱乐部打样应答 bool CAttemperEngineSink::OnDBGetClubSample(DWORD dwContextID, VOID * pData, WORD wDataSize){ //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } CMD_GR_Club_Make_A_Sample * pSample = (CMD_GR_Club_Make_A_Sample *)pData; if (pSample == NULL) return false; Club::PB_CS_Club_Make_A_Sample MakeSample; MakeSample.set_dwclubid(pSample->dwClubID); MakeSample.set_issample(pSample->IsSample); //发送数据 std::string pbdata = MakeSample.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_MAKEA_SAMPLE_ACK, (void*)pbdata.c_str(), pbdata.length()); if (pSample->IsSample == 1 && pSample->dwClubID) { std::vector ve; JN_GR_RoomListBig Rooms; ve.clear(); //全局查找 { CWHDataLocker DataLocker(m_CriticalSection); std::unordered_map::iterator it2 = m_PrivateRoomAll.begin(); while (it2 != m_PrivateRoomAll.end()) { ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig)); Rooms = it2->second; if (Rooms.roomType == 1 && Rooms.tmp6[0] == pSample->dwClubID) { ve.push_back(Rooms); } it2++; } } std::sort(ve.begin(), ve.end(), LessSort);//升序 std::vector::iterator iter; //等待中 for (iter = ve.begin(); iter != ve.end(); iter++) { if (iter->roomStatus == 0) { DWORD dwRoomID = iter->dwRoomNumber; m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, &dwRoomID, sizeof(DWORD)); } } } return true; } ///+++是否为金币场服务器 //bool CAttemperEngineSink::isVenueServer() //{ // if (m_pGameServiceOption != NULL && GAME_GENRE_SCORE == m_pGameServiceOption->wServerType) // { // return true; // } // return false; //} //统计该场的总人数 //DWORD CAttemperEngineSink::SumOnlineCount(WORD wVenueID) //{ // //--不是金币场的服务器,就不用汇总了 // if (wVenueID <= 0) // { // return 0; // } // // DWORD dwSum = 0; // //枚举数据 // POSITION Position = NULL; // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++) // { // //获取数据 // CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position); // if (pGameServerItem != NULL && pGameServerItem->m_GameServer.wNodeID == wVenueID) // { // dwSum += pGameServerItem->m_GameServer.dwOnLineCount; // } // } // // for (std::vector::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++) // { // tagVenueInfo& venue = *it; // if (venue.wVenueID == wVenueID) // { //#ifdef DEBUG // //CString strOnline; // //strOnline.Format(L"场馆人数wVenueID=%d dwSum =%d", wVenueID, dwSum); // //CTraceService::TraceString(strOnline, TraceLevel_Normal); //#endif // DEBUG // // venue.dwOnlineCount = dwSum; // break;; // } // } // return dwSum; //} // /////能否领取救济 //bool CAttemperEngineSink::CanGetRelief(IServerUserItem* pIServerUserItem, WORD venueID) //{ // if (pIServerUserItem != NULL && m_vecVenueInfo.size() > 0) // { // ///---救济领取信息(10秒内有效) // tagUserInfo* pUser = pIServerUserItem->GetUserInfo(); // if (pUser != NULL) // { // if ((GetTickCount() - pUser->dwUpdateReliefLeftCount < 10 * 1000) // && pUser->wReliefLeftCount <= 0) // { // return false; // } // } // // const tagVenueInfo & venue = m_vecVenueInfo[0]; // if ((0 == venueID || venue.wVenueID == venueID) && pIServerUserItem->GetUserScore() < venue.sMinScore) // { // return true; // } // } // return false; //} // //---拉取好友房服务器 //bool CAttemperEngineSink::OnTCPNetworkPrivateGameSvr(VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); // // //用户效验 // ASSERT(pIServerUserItem != NULL); // if (pIServerUserItem == NULL) // { // return false; // } // // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); // // int iXinYong = pUserInfo->iXinYong; //用户信用等级 // // //过滤不符合条件的服务器 // std::vector gameSvrItemVec; // // POSITION Position = NULL; // CGameServerItem * pGameServerItem = NULL; // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++) // { // pGameServerItem = m_ServerListManager.EmunGameServerItem(Position); // // ///去掉金币服务器 // if (pGameServerItem == NULL || pGameServerItem->m_GameServer.wNodeID > 0) // { // continue; // } // // //不提供服务 // if (pGameServerItem->m_GameServer.bService < 1) // { // continue; // } // // //人员已满 // if (pGameServerItem->m_GameServer.dwOnLineCount >= pGameServerItem->m_GameServer.dwFullCount) // { // continue; // } // // //玩家级别 // if (pGameServerItem->m_GameServer.wServerLevel > iXinYong && gameSvrItemVec.size() > 1/*总得返回一个用吧*/) // { // continue; // } // // gameSvrItemVec.push_back(pGameServerItem); // } // // //找人数少的服务器 // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByLineCountFunc()); // tagPrivateGameServer privateGameSvr; // //发送数据 // std::string pbdata = ""; // if (gameSvrItemVec.size() > 0) // { // //优先从人数少的随机选 // int randIndex = gameSvrItemVec.size() >= 4 ? rand() % (gameSvrItemVec.size() / 2) : rand() % gameSvrItemVec.size(); // // CGameServerItem* pGameSvr = gameSvrItemVec[randIndex]; // // privateGameSvr.wKindID = pGameSvr->m_GameServer.wKindID; //名称索引 // privateGameSvr.wNodeID = pGameSvr->m_GameServer.wNodeID; //节点索引 // privateGameSvr.wSortID = pGameSvr->m_GameServer.wSortID; //排序索引 // privateGameSvr.wServerID = pGameSvr->m_GameServer.wServerID; //房间索引 // privateGameSvr.wServerKind = pGameSvr->m_GameServer.wServerKind; //房间类型 // privateGameSvr.wServerType = pGameSvr->m_GameServer.wServerType; //房间类型 // privateGameSvr.wServerPort = pGameSvr->m_GameServer.wServerPort; //房间端口 // lstrcpyn(privateGameSvr.szServerAddr, pGameSvr->m_GameServer.szServerAddr, CountArray(privateGameSvr.szServerAddr)); // //StringCbCat(privateGameSvr.szServerAddr, 32, pGameSvr->m_GameServer.szServerAddr); //房间地址 // CString strHint; // strHint.Format(L"%d, %d, %d, %d, %d, %d, %d, %s", // privateGameSvr.wKindID, // privateGameSvr.wNodeID, // privateGameSvr.wSortID, // privateGameSvr.wServerID, // privateGameSvr.wServerKind, // privateGameSvr.wServerType, // privateGameSvr.wServerPort, // privateGameSvr.szServerAddr); // TRACE(L"svr=%s", strHint); // // UserInfo::PB_CS_S_tagPrivateGameServer GameServer; // GameServer.set_wkindid(pGameSvr->m_GameServer.wKindID); // GameServer.set_wnodeid(pGameSvr->m_GameServer.wNodeID); // GameServer.set_wsortid(pGameSvr->m_GameServer.wSortID); // GameServer.set_wserverid(pGameSvr->m_GameServer.wServerID); // GameServer.set_wserverkind(pGameSvr->m_GameServer.wServerKind); // GameServer.set_wservertype(pGameSvr->m_GameServer.wServerType); // GameServer.set_wserverport(pGameSvr->m_GameServer.wServerPort); // std::string szServerAddr = CW2AEX<1024>(pGameSvr->m_GameServer.szServerAddr, CP_UTF8).m_psz; // GameServer.set_szserveraddr(szServerAddr); // pbdata = GameServer.SerializePartialAsString(); // } // // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_PRIVATE_GAME_SVR_ACK, (void*)pbdata.c_str(), pbdata.length()); // // // return true; // //} //玩家自主解绑代理 bool CAttemperEngineSink::OnTCPNetworkSubUserUntieAgent(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_ZUANSHI_INFO, dwSocketID, &dUserID, sizeof(DWORD)); return true; } ///用户获得代理解绑相关信息 BOOL CAttemperEngineSink::OnDBUserUntieAgent(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(DBR_GR_GetUntieAgentInfo)); if (wDataSize != sizeof(DBR_GR_GetUntieAgentInfo)) { return FALSE; } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DBR_GR_GetUntieAgentInfo * pGetUntieAgentInfo = (DBR_GR_GetUntieAgentInfo *)pData; GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); StringCchCat(Temp.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID); Temp.dUserID = pIServerUserItem->GetUserInfo()->dwUserID; _sntprintf(Temp.bb.szName, 32, TEXT("%d"), pIServerUserItem->GetUserInfo()->dDaiLi); _sntprintf(Temp.bb.szImgHead, 256, TEXT("%d"), pGetUntieAgentInfo->cbCost); //StringCchCat(Temp.szUnionID, 32, L"10043"); //Temp.dUserID = 101088; Temp.CommendID = 10; //玩家自主解绑代理(只作透传) Temp.dwSocketID = dwContextID; CHttpClient::AddLog(dwContextID, Temp); return true; } //用户获得代理解绑相关信息 bool CAttemperEngineSink::OnTCPNetworkSubUserAgentInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //ASSERT(wDataSize == sizeof(BYTE)); //if (wDataSize != sizeof(BYTE)) //{ // return false; //} //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_UNTIE_AGENT_INFO, dwSocketID, &dUserID, sizeof(DWORD)); return true; } ///用户获得代理解绑相关信息 BOOL CAttemperEngineSink::OnDBUserAgentInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(DBR_GR_GetUntieAgentInfo)); if (wDataSize != sizeof(DBR_GR_GetUntieAgentInfo)) { return FALSE; } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_GetUntieAgentInfo * pGetUntieAgentInfo = (DBR_GR_GetUntieAgentInfo *)pData; pGetUntieAgentInfo->dwDaiLiID = pIServerUserItem->GetUserInfo()->dDaiLi; UserInfo::PB_CS_S_GetUntieAgentInfo AgentInfo; AgentInfo.set_cbcost(pGetUntieAgentInfo->cbCost); AgentInfo.set_cbdays(pGetUntieAgentInfo->cbDays); AgentInfo.set_dwcurrency(pGetUntieAgentInfo->dwCurrency); AgentInfo.set_dwdailiid(pGetUntieAgentInfo->dwDaiLiID); //发送数据 std::string pbdata = AgentInfo.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_GET_UNTIE_AGENT_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///---福利领取信息 bool CAttemperEngineSink::OnTCPNetworkWelfareInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CString strHint; strHint.Format(L"Fun=%hs", __FUNCTION__); CTraceService::TraceString(strHint, TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DWORD dUserID = pIServerUserItem->GetUserID(); //投递请求 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_WELFARE_INFO, dwSocketID, &dUserID, sizeof(dUserID)); return true; } //查询福利信息应答 BOOL CAttemperEngineSink::OnDBWelfareInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(tagWelfareInfo) * 3); if (wDataSize != sizeof(tagWelfareInfo) * 3) { return FALSE; } tagWelfareInfo * pWelfareInfo = (tagWelfareInfo*)pData; tagWelfareInfo welfareInfArr[3]; memcpy(welfareInfArr, pWelfareInfo, sizeof(tagWelfareInfo) * 3); //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } UserInfo::PB_CS_S_tagWelfareInfo WelfareInfo; for (WORD i = 0; i < 3; i++) { UserInfo::pb_tagWelfareInfo *tagWelfareInfo = WelfareInfo.add_welfareinfo(); tagWelfareInfo->set_btwelfaretype(welfareInfArr[i].btWelfareType); tagWelfareInfo->set_bttakednum(welfareInfArr[i].btTakedNum); tagWelfareInfo->set_bttotalnum(welfareInfArr[i].btTotalNum); tagWelfareInfo->set_btvalidflag(welfareInfArr[i].btValidFlag); } //发送数据 std::string pbdata = WelfareInfo.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_WELFARE_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///+++大转盘命令 bool CAttemperEngineSink::OnTCPNetworkMainRoulette(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_GF_ROULETEE_CONFIG: ///奖品配置+"我"的配置信息 { return OnTCPNetworkMyRouletteConfig(pData, wDataSize, dwSocketID); } case SUB_GF_ROULETEE_LOTTERY: ///转盘抽奖 { return OnTCPNetworkRouletteLottery(pData, wDataSize, dwSocketID); } case SUB_GF_LOTTERY_INFO: ///查询抽奖信息 { return OnTCPNetworkLotteryInfo(pData, wDataSize, dwSocketID); } case SUB_GF_LOTTERY_HIS: ///查询抽奖历史记录 { return OnTCPNetworkLotteryHis(pData, wDataSize, dwSocketID); } case SUB_GF_LOTTERY_AWARD: //手动领奖 { return OnTCPNetworkLotteryAward(pData, wDataSize, dwSocketID); } case SUB_GF_LOTTERY_ADDRESS: //注册收件信息 { return OnTCPNetworkLotteryAddress(pData, wDataSize, dwSocketID); } default: break; } return false; } ///拉取转盘奖品配置(返回我的转盘相关信息) bool CAttemperEngineSink::OnTCPNetworkMyRouletteConfig(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CString strHint; strHint.Format(L"Fun=%hs", __FUNCTION__); CTraceService::TraceString(strHint, TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { ASSERT(FALSE); return false; } DWORD dUserID = pIServerUserItem->GetUserID(); m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_MY_ROULETTE_INFO, dwSocketID, &dUserID, sizeof(dUserID)); return true; } ///+++DB返回转盘奖品配置结果 BOOL CAttemperEngineSink::OnDBRouletteConfig(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize % sizeof(tagRouletteConfig) == 0); if (wDataSize % sizeof(tagRouletteConfig) != 0) { return FALSE; } ///---清除以前的数据 if (wDataSize > 0) { m_vecRouletteConfig.clear(); } //变量定义 WORD wItemCount = wDataSize / sizeof(tagRouletteConfig); tagRouletteConfig * pRouletteConfig = (tagRouletteConfig *)pData; for (WORD i = 0; i < wItemCount; i++) { tagRouletteConfig rouletteConfig(*pRouletteConfig); //插入列表 m_vecRouletteConfig.push_back(rouletteConfig); pRouletteConfig++; } ///--第二步、执行抽奖 WORD wLotteryType = 0; _DoRouletteLottery(&wLotteryType, sizeof(wLotteryType), dwContextID); return true; } ///++中奖历史 BOOL CAttemperEngineSink::OnDBLotteryHis(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize % sizeof(tagLotteryHis) == 0); if (wDataSize % sizeof(tagLotteryHis) != 0) { return FALSE; } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } tagLotteryHisACK * pLotteryHis = (tagLotteryHisACK*)pData; TurntableLogon::PB_CS_S_tagLotteryHisACK LotteryHis; for (int i = 0; i < 30; i++) { if (pLotteryHis->LotteryHis[i].dwUserID == 0)continue; TurntableLogon::PB_CS_S_tagLotteryHis *tagLottery = LotteryHis.add_lotteryhis(); tagLottery->set_dwuserid(pLotteryHis->LotteryHis[i].dwUserID); std::string szUserName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szUserName, CP_UTF8).m_psz; std::string szLotteryName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szLotteryName, CP_UTF8).m_psz; std::string szInputeDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szInputeDate, CP_UTF8).m_psz; std::string szGetLotteryDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szGetLotteryDate, CP_UTF8).m_psz; tagLottery->set_szusername(szUserName); tagLottery->set_wlotterytype(pLotteryHis->LotteryHis[i].wLotteryType); tagLottery->set_wrouletteid(pLotteryHis->LotteryHis[i].wRouletteID); tagLottery->set_szlotteryname(szLotteryName); tagLottery->set_szgetlotterydate(szInputeDate); tagLottery->set_szgetlotterydate(szGetLotteryDate); tagLottery->set_btgetlotteryflag(pLotteryHis->LotteryHis[i].btGetLotteryFlag); } //发送数据 std::string pbdata = LotteryHis.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_HIS_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } BOOL CAttemperEngineSink::OnDBLotteryHisEx(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize % sizeof(tagLotteryHisEx) == 0); if (wDataSize % sizeof(tagLotteryHisEx) != 0) { return FALSE; } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } tagLotteryHisExACK* pLotteryHis = (tagLotteryHisExACK*)pData; TurntableLogon::PB_CS_S_tagLotteryHisExACK LotteryHis; for (int i = 0; i < 6; i++) { if (pLotteryHis->LotteryHis[i].dwRecordID == 0)continue; TurntableLogon::PB_CS_S_tagLotteryHisEx* tagLottery = LotteryHis.add_lotteryhisex(); tagLottery->set_dwrecordid(pLotteryHis->LotteryHis[i].dwRecordID); tagLottery->set_wrouletteid(pLotteryHis->LotteryHis[i].wRouletteID); std::string szLotteryName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szLotteryName, CP_UTF8).m_psz; std::string szInputeDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szInputeDate, CP_UTF8).m_psz; tagLottery->set_szlotteryname(szLotteryName); tagLottery->set_szinputedate(szInputeDate); tagLottery->set_btgetlotteryflag(pLotteryHis->LotteryHis[i].btGetLotteryFlag); } //发送数据 std::string pbdata = LotteryHis.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_HIS_ACKEX, (void*)pbdata.c_str(), pbdata.length()); return true; } ///+++DB返回转盘奖品配置结果 BOOL CAttemperEngineSink::OnDBMyRouletteInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(tagRouletteConfig2)); if (wDataSize != sizeof(tagRouletteConfig2)) { return FALSE; } //--查看用 tagRouletteConfig2 rouletteConfig2; memcpy(&rouletteConfig2, pData, wDataSize); //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } TurntableLogon::PB_CS_S_tagRouletteConfig2 RouletteConfig; RouletteConfig.set_wresult(rouletteConfig2.wResult); std::string szDesc = CW2AEX<1024>(rouletteConfig2.szDesc, CP_UTF8).m_psz; std::string szICON = CW2AEX<1024>(rouletteConfig2.szICON, CP_UTF8).m_psz; std::string szLotteryRule = CW2AEX<1024>(rouletteConfig2.szLotteryRule, CP_UTF8).m_psz; RouletteConfig.set_szdesc(szDesc); RouletteConfig.set_wid(rouletteConfig2.wID); RouletteConfig.set_szicon(szICON); RouletteConfig.set_whadlotterycount(rouletteConfig2.wHadLotteryCount); RouletteConfig.set_wlotterycountpara(rouletteConfig2.wLotteryCountPara); RouletteConfig.set_wlotterylimit(rouletteConfig2.wLotteryLimit); RouletteConfig.set_winningvalue(rouletteConfig2.wInningValue); RouletteConfig.set_wrechargevalue(rouletteConfig2.wRechargeValue); for (WORD i = 0; i < 3; i++) { RouletteConfig.add_winninginfo(rouletteConfig2.wInningInfo[i]); } RouletteConfig.set_cbrechargeinfo(rouletteConfig2.cbRechargeInfo); RouletteConfig.set_szlotteryrule(szLotteryRule); //发送数据 std::string pbdata = RouletteConfig.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_ROULETEE_CONFIG_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///+++转盘抽奖 bool CAttemperEngineSink::OnTCPNetworkRouletteLottery(VOID * pData, WORD wDataSize, DWORD dwSocketID) { ///---第一步 拉取轮盘奖品的配置 m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_ROULETTE_CONFIG, dwSocketID, pData, wDataSize); return true; } /// 转盘抽奖 bool CAttemperEngineSink::_DoRouletteLottery(VOID * pData, WORD wDataSize, DWORD dwSocketID) { ASSERT(wDataSize == sizeof(WORD)); if (wDataSize != sizeof(WORD)) { return false; } WORD wLotteryType = *((WORD *)pData); ASSERT(0 == wLotteryType || 1 == wLotteryType); //判断有没有配置奖品 ASSERT(m_vecRouletteConfig.size() > 0); if (m_vecRouletteConfig.size() <= 0) { CTraceService::TraceString(L"转盘奖品配置为空(表Roulette)", TraceLevel_Warning); return true; } //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } //概率总和 DWORD dwOddSum = 0; std::vector::iterator it; for (it = m_vecRouletteConfig.begin(); it != m_vecRouletteConfig.end(); it++) { tagRouletteConfig roulette = *it; ///---过滤掉个数为0的奖品 if (roulette.iQuantity <= 0) { continue; } dwOddSum += roulette.wOdds; } srand(GetTickCount()); DWORD dwRand = rand() % dwOddSum + 1; for (it = m_vecRouletteConfig.begin(); it != m_vecRouletteConfig.end(); it++) { tagRouletteConfig roulette = *it; ///---过滤掉个数为0的奖品 if (roulette.iQuantity <= 0) { continue; } if (dwRand <= roulette.wOdds) { break; } else { dwRand -= roulette.wOdds; } } ASSERT(it != m_vecRouletteConfig.end()); if (it != m_vecRouletteConfig.end()) { CString strLottery; strLottery.Format(L"UserID=%d 中奖结果:%s", pIServerUserItem->GetUserID(), (*it).szName); CTraceService::TraceString(strLottery, TraceLevel_Normal); } ///---记录中奖信息 DBR_GR_RouletteLottery rouletteLottery; rouletteLottery.dwUserID = pIServerUserItem->GetUserID(); rouletteLottery.wLotteryType = wLotteryType; ///---抽奖类型 0:轮盘抽奖 1:玩牌抽奖 2017-12-29 rouletteLottery.dwClientAddr = pIServerUserItem->GetClientAddr(); lstrcpyn(rouletteLottery.szMachineID, pIServerUserItem->GetMachineID(), CountArray(rouletteLottery.szMachineID)); rouletteLottery.wRouletteLotteryID = (*it).wID; lstrcpyn(rouletteLottery.szLotteryName, (*it).szName, CountArray(rouletteLottery.szLotteryName)); m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_ROULETTE_LOTTERY, dwSocketID, &rouletteLottery, sizeof(rouletteLottery)); return true; } ///+++轮盘抽奖 BOOL CAttemperEngineSink::OnDBRouletteLottery(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(tagLotteryResultEx)); if (wDataSize != sizeof(tagLotteryResultEx)) { return FALSE; } tagLotteryResultEx * pLotteryResult = (tagLotteryResultEx*)pData; { CString strLottery; strLottery.Format(L"lScore=%lld, dwBean=%d", pLotteryResult->LotteryResult.lScore, pLotteryResult->LotteryResult.dwBean); CTraceService::TraceString(strLottery, TraceLevel_Normal); } if (pLotteryResult->LotteryResult.wResult == 0) { if (pLotteryResult->wAwardType <= 2) { _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc); } else if (pLotteryResult->wAwardType == 4) { if (pLotteryResult->szPhoneNum[0] == _T('\0')) _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s\n[ff0000]请去\"我的奖品\"完善收件信息!"), pLotteryResult->LotteryResult.szDesc); else _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc); } else if (pLotteryResult->wAwardType == 3 || pLotteryResult->wAwardType == 6 || pLotteryResult->wAwardType == 7) { if (pLotteryResult->szPhoneNum[0] == _T('\0')) _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s\n[ff0000]您尚未绑定手机号,请去\"我的奖品\"手动领取"), pLotteryResult->LotteryResult.szDesc); else _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc); } else if (pLotteryResult->wAwardType == 8) { _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("%s"), pLotteryResult->LotteryResult.szDesc); } } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } //--抽奖成功,更新下 // 2018-3-29 pIServerUserItem->GetUserInfo()->lScore = pLotteryResult->LotteryResult.lScore; pIServerUserItem->GetUserInfo()->dwBean = pLotteryResult->LotteryResult.dwBean; TurntableLogon::PB_CS_S_tagLotteryResult Result; Result.set_wresult(pLotteryResult->LotteryResult.wResult); std::string szDesc = CW2AEX<1024>(pLotteryResult->LotteryResult.szDesc, CP_UTF8).m_psz; std::string szResultDesc = CW2AEX<1024>(pLotteryResult->LotteryResult.szResultDesc, CP_UTF8).m_psz; Result.set_szdesc(szDesc); Result.set_wlotterytype(pLotteryResult->LotteryResult.wLotteryType); Result.set_wroulettelotterid(pLotteryResult->LotteryResult.wRouletteLotterID); Result.set_whadlotterycount(pLotteryResult->LotteryResult.wHadLotteryCount); Result.set_wlotterycountpara(pLotteryResult->LotteryResult.wLotteryCountPara); Result.set_lscore(pLotteryResult->LotteryResult.lScore); Result.set_dwbean(pLotteryResult->LotteryResult.dwBean); Result.set_szresultdesc(szResultDesc); //发送数据 std::string pbdata = Result.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_ROULETEE_LOTTERY_ACK, (void*)pbdata.c_str(), pbdata.length()); //抽奖记录传到web端 过滤掉金币钻石、谢谢惠顾 if (pLotteryResult->wAwardType > 2 && pLotteryResult->wAwardType < 8 ) { GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); Temp.dUserID = pIServerUserItem->GetUserInfo()->dwUserID; _sntprintf(Temp.bb.szName, 32, TEXT("%d"), pLotteryResult->LotteryResult.wRouletteLotterID); StringCchCat(Temp.bb.szImgHead, 12, pLotteryResult->szPhoneNum); _sntprintf(Temp.szUnionID, 32, TEXT("%d"), pLotteryResult->wAwardType); sprintf(Temp.szBuffer, "%d", pLotteryResult->dwRecordID); Temp.CommendID = 11; //抽奖记录 Temp.dwSocketID = dwContextID; CHttpClient::AddLog(dwContextID, Temp); } return true; } ///查询抽奖信息 bool CAttemperEngineSink::OnTCPNetworkLotteryInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID) { ASSERT(wDataSize == sizeof(WORD)); if (wDataSize != sizeof(WORD)) { return false; } WORD wLotteryType = *((WORD *)pData); ASSERT(0 == wLotteryType || 1 == wLotteryType); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } ///---记录中奖信息 DBR_GR_LotteryInfo rouletteLotteryInfo; rouletteLotteryInfo.dwUserID = pIServerUserItem->GetUserID(); rouletteLotteryInfo.wLotteryType = wLotteryType; ///---抽奖类型 0:轮盘抽奖 1:玩牌抽奖 2017-12-29 m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_INFO, dwSocketID, &rouletteLotteryInfo, sizeof(rouletteLotteryInfo)); return true; } ///---查询签到奖品 ( 已经预加载 CT_LOAD_SERVICE_CONFIG ) bool CAttemperEngineSink::OnTCPNetworkCheckinReward(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //变量定义 CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinReward"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } UserInfo::PB_CS_S_tagCheckinReward CheckinReward; for (WORD i = 0; i < LEN_WEEK; i++) { CheckinReward.add_lrewardgold(m_checkinReward[i].lRewardGold); CheckinReward.add_irewardcurrency(m_checkinReward[i].iRewardCurrency); } //发送数据 std::string pbdata = CheckinReward.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_USER, SUB_GP_CHECKIN_REWARD2_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///---查询签到信息 bool CAttemperEngineSink::OnTCPNetworkCheckinQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinQuery"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DWORD dUserID = pIServerUserItem->GetUserID(); //投递请求 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_CHECKIN_QUERY_INFO, dwSocketID, &dUserID, sizeof(dUserID)); return true; } //查询玩家签到信息 bool CAttemperEngineSink::OnDBUserCheckInInfo(DWORD dwContextID, VOID * pData, WORD wDataSize) { //变量定义 tagCheckInInfo * pCheckInInfo = (tagCheckInInfo *)pData; //变量定义 tagCheckInInfo CheckInInfo; ZeroMemory(&CheckInInfo, sizeof(CheckInInfo)); //构造变量 CheckInInfo.bSuccessed = pCheckInInfo->bSuccessed; //成功标识 CheckInInfo.bTodayChecked = pCheckInInfo->bTodayChecked; CheckInInfo.wSeriesDate = pCheckInInfo->wSeriesDate; lstrcpyn(CheckInInfo.szNotifyContent, pCheckInInfo->szNotifyContent, CountArray(CheckInInfo.szNotifyContent)); UserCheckinInfo userCheckinInfo; userCheckinInfo.btTodayChecked = CheckInInfo.bTodayChecked ? 1 : 0; userCheckinInfo.wSeriesDay = CheckInInfo.wSeriesDate; memcpy(&userCheckinInfo.checkinReward, m_checkinReward, sizeof(userCheckinInfo.checkinReward)); UserInfo::PB_CS_S_UserCheckinInfo CheckinInfo; CheckinInfo.set_bttodaychecked(userCheckinInfo.btTodayChecked); CheckinInfo.set_wseriesday(userCheckinInfo.wSeriesDay); for (WORD i = 0; i < LEN_WEEK; i++) { UserInfo::pb_tagCheckinReward* CheckinReward = CheckinInfo.add_checkinreward(); CheckinReward->set_lrewardgold(userCheckinInfo.checkinReward[i].lRewardGold); CheckinReward->set_irewardcurrency(userCheckinInfo.checkinReward[i].iRewardCurrency); } //发送数据 std::string pbdata = CheckinInfo.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_CHECKIN_INFO2_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///---执行签到 bool CAttemperEngineSink::OnTCPNetworkCheckinDone(VOID * pData, WORD wDataSize, DWORD dwSocketID) { CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinQuery"), TraceLevel_Debug); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } tagCheckInDone checkinDown; checkinDown.dwUserID = pIServerUserItem->GetUserID(); checkinDown.dwClientAddr = pIServerUserItem->GetClientAddr(); lstrcpyn(checkinDown.szMachineID, pIServerUserItem->GetMachineID(), CountArray(checkinDown.szMachineID)); //投递请求 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_CHECKIN_DONE, dwSocketID, &checkinDown, sizeof(checkinDown)); return true; } //签到结果 bool CAttemperEngineSink::OnDBUserCheckInResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } //变量定义 tagCheckInResult * pCheckInResult = (tagCheckInResult *)pData; //变量定义 tagCheckInResult checkinResult; ZeroMemory(&checkinResult, sizeof(checkinResult)); //构造变量 ///===checkinResult.bSuccessed = pCheckInResult->bSuccessed; checkinResult.btSuccessed = pCheckInResult->btSuccessed; checkinResult.lScore = pCheckInResult->lScore; checkinResult.dwBean = pCheckInResult->dwBean; lstrcpyn(checkinResult.szNotifyContent, pCheckInResult->szNotifyContent, CountArray(checkinResult.szNotifyContent)); //--签到成功,更新下 // 2018-3-29 if (checkinResult.btSuccessed) { pIServerUserItem->GetUserInfo()->lScore = checkinResult.lScore; pIServerUserItem->GetUserInfo()->dwBean = checkinResult.dwBean; } UserInfo::PB_CS_S_tagCheckInResult InResult; InResult.set_btsuccessed(checkinResult.btSuccessed); InResult.set_lscore(checkinResult.lScore); InResult.set_dwbean(checkinResult.dwBean); std::string szNotifyContent = CW2AEX<1024>(checkinResult.szNotifyContent, CP_UTF8).m_psz; InResult.set_sznotifycontent(szNotifyContent); //发送数据 std::string pbdata = InResult.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_CHECKIN_DONE2_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //签到的奖励 bool CAttemperEngineSink::OnDBCheckInReward(DWORD dwContextID, VOID * pData, WORD wDataSize) { //参数校验 ASSERT(wDataSize == sizeof(tagCheckinReward)*LEN_WEEK); if (wDataSize != sizeof(tagCheckinReward)*LEN_WEEK) { return false; } //提取数据 tagCheckinReward * pCheckinReward = (tagCheckinReward *)pData; //保存到成员变量 CopyMemory(m_checkinReward, pCheckinReward, sizeof(tagCheckinReward)*LEN_WEEK); return true; } ///+++轮盘抽奖 bool CAttemperEngineSink::OnDBQueryLotteryInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(tagLotteryInfo)); if (wDataSize != sizeof(tagLotteryInfo)) { return false; } tagLotteryInfo * pLotteryInfo = (tagLotteryInfo*)pData; //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } TurntableLogon::PB_CS_S_tagLotteryInfo LotteryInfo; LotteryInfo.set_wresult(pLotteryInfo->wResult); LotteryInfo.set_wlotterytype(pLotteryInfo->wLotteryType); LotteryInfo.set_whadlotterycount(pLotteryInfo->wHadLotteryCount); LotteryInfo.set_wlotterycountpara(pLotteryInfo->wLotteryCountPara); LotteryInfo.set_wcurrentdrawcount(pLotteryInfo->wCurrentDrawCount); LotteryInfo.set_wdrawlotterycountpara(pLotteryInfo->wDrawLotteryCountPara); std::string szDesc = CW2AEX<1024>(pLotteryInfo->szDesc, CP_UTF8).m_psz; LotteryInfo.set_szdesc(szDesc); //发送数据 std::string pbdata = LotteryInfo.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_INFO_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } ///查询抽奖历史记录 BYTE btQueryFlag; //++查询标志 0:只查自己的;1:查最近中奖记录 bool CAttemperEngineSink::OnTCPNetworkLotteryHis(VOID * pData, WORD wDataSize, DWORD dwSocketID) { TurntableLogon::PB_CS_C_workLotteryHis LotteryHis; LotteryHis.ParseFromArray(pData, wDataSize); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } ///---记录中奖信息 DBR_GR_LotteryHis lotteryHis; lotteryHis.dwUserID = pIServerUserItem->GetUserID(); lotteryHis.btQueryFlag = LotteryHis.btqueryflag(); //查询标志 0:只查自己的;1:查最近中奖记录 // to do 判断用户版本号 TCHAR szMachineID[LEN_MACHINE_ID] = { 0 }; memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID)); del_char(szMachineID, L'.'); __int64 iMachineID = StrToNmuber(szMachineID); /*if (iMachineID < 112) { m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_HIS, dwSocketID, &lotteryHis, sizeof(lotteryHis)); } else {*/ m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_HIS_EX, dwSocketID, &lotteryHis, sizeof(lotteryHis)); /*}*/ return true; } //扫码绑定执行代码加钻和代理id bool CAttemperEngineSink::OnSetAddBingIDAndCurrency(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_GetDaiLiSaoMaResult) || wDataSize == sizeof(CMD_GR_GetDaiLiSaoMaResult)); //效验参数 if (wDataSize != sizeof(CMD_GR_GetDaiLiSaoMaResult) && wDataSize != sizeof(CMD_GR_GetDaiLiSaoMaResult)) return false; //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; m_pIRecordDataBaseEngine->PostDataBaseRequest(DBO_GR_TASK_SAOMA, dwSocketID, pData, wDataSize); return true; } //扫码绑定给前端推送钻石数量 bool CAttemperEngineSink::OnDBUserZuanShi(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(CMD_GR_UserBean) || wDataSize == sizeof(CMD_GR_UserBean)); //效验参数 if (wDataSize != sizeof(CMD_GR_UserBean) && wDataSize != sizeof(CMD_GR_UserBean)) return false; //dwContextID WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; CMD_GR_UserBean* gg = (CMD_GR_UserBean*)pData; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(gg->dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); return true; } //回调抽奖记录入库,更新领取标志 bool CAttemperEngineSink::OnTCPNetworkSubUserLotteryResultCallBack(WORD wLotteryID, DWORD dwSocketID) { //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DBR_GR_LotteryFlag struLotteryFlag; struLotteryFlag.wLotteryID = wLotteryID; struLotteryFlag.dwUserID = pIServerUserItem->GetUserID(); return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_FLAG, dwSocketID, &struLotteryFlag, sizeof(DBR_GR_LotteryFlag)); } ///手动领奖 bool CAttemperEngineSink::OnTCPNetworkLotteryAward(VOID * pData, WORD wDataSize, DWORD dwSocketID) { TurntableLogon::PB_CS_C_workLotteryAward LotteryAward; LotteryAward.ParseFromArray(pData, wDataSize); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_LotteryAward struLotteryAward; struLotteryAward.dwRecordID = LotteryAward.precord(); struLotteryAward.dwUserID = pIServerUserItem->GetUserID(); //投递请求 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_AWARD, dwSocketID, &struLotteryAward, sizeof(struLotteryAward)); return true; } //注册收件信息 bool CAttemperEngineSink::OnTCPNetworkLotteryAddress(VOID * pData, WORD wDataSize, DWORD dwSocketID) { TurntableLogon::PB_CS_LotteryAddr LotteryAddr; LotteryAddr.ParseFromArray(pData, wDataSize); CString szaddress = (CA2CTEX<2048>(LotteryAddr.szaddress().c_str(), CP_UTF8)).m_szBuffer; CString szaddressname = (CA2CTEX<2048>(LotteryAddr.szaddressname().c_str(), CP_UTF8)).m_szBuffer; CString szaddrphonenum = (CA2CTEX<2048>(LotteryAddr.szaddrphonenum().c_str(), CP_UTF8)).m_szBuffer; //处理消息 CMD_GR_LotteryAddr pLotteryAddr; ZeroMemory(&pLotteryAddr, sizeof(pLotteryAddr)); _sntprintf(pLotteryAddr.szAddress, CountArray(pLotteryAddr.szAddress), TEXT("%s"), szaddress); _sntprintf(pLotteryAddr.szAddressName, CountArray(pLotteryAddr.szAddressName), TEXT("%s"), szaddressname); _sntprintf(pLotteryAddr.szAddrPhoneNum, CountArray(pLotteryAddr.szAddrPhoneNum), TEXT("%s"), szaddrphonenum); //_stprintf_s(pLotteryAddr.szAddress, 11, _T("%S"), LotteryAddr.szaddress().c_str()); //_stprintf_s(pLotteryAddr.szAddressName, 11, _T("%S"), LotteryAddr.szaddressname().c_str()); //_stprintf_s(pLotteryAddr.szAddrPhoneNum, 11, _T("%S"), LotteryAddr.szaddrphonenum().c_str()); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); //用户效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { return false; } DBR_GR_LotteryAddr struLotteryAddr; struLotteryAddr.dwUserID = pIServerUserItem->GetUserID(); memcpy(struLotteryAddr.szAddress, pLotteryAddr.szAddress, sizeof(struLotteryAddr.szAddress)); memcpy(struLotteryAddr.szAddressName, pLotteryAddr.szAddressName, sizeof(struLotteryAddr.szAddressName)); memcpy(struLotteryAddr.szAddrPhoneNum, pLotteryAddr.szAddrPhoneNum, sizeof(struLotteryAddr.szAddrPhoneNum)); //投递请求 m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_ADDRESS, dwSocketID, &struLotteryAddr, sizeof(struLotteryAddr)); return true; } //手动领奖 BOOL CAttemperEngineSink::OnDBRouletteAward(DWORD dwContextID, VOID * pData, WORD wDataSize) { //效验参数 ASSERT(wDataSize == sizeof(DBR_GR_LotteryAward)); if (wDataSize != sizeof(DBR_GR_LotteryAward)) { return FALSE; } //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); DBR_GR_LotteryAward * pLotteryAward = (DBR_GR_LotteryAward*)pData; if (pLotteryAward->cbCheckResult != 0) { CMD_GR_RequestFailureAward RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = 1; //表示失败 switch (pLotteryAward->cbCheckResult) { case 1: { _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品已领取!")); break; } case 2: { _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品发放中,请稍候查收!")); break; } case 3: { _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("领取失败,必要信息不全!")); break; } default: { _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品发放异常,请联系客服!")); break; } } ////发送数据 //WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); //WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); if (pIServerUserItem != NULL) { TurntableLogon::PB_CS_C_workLotteryAward LotteryAward; LotteryAward.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; LotteryAward.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = LotteryAward.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_AWARD, (void*)pbdata.c_str(), pbdata.length()); } } else { //发放奖品 GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); Temp.dUserID = pLotteryAward->dwUserID; StringCchCat(Temp.szUnionID, 12, pLotteryAward->szAddrPhoneNum); StringCchCat(Temp.bb.szName, 17, pLotteryAward->szAddressee); StringCchCat(Temp.bb.szImgHead, 129, pLotteryAward->szAddress); sprintf(Temp.szBuffer, "%d", pLotteryAward->dwRecordID); Temp.CommendID = 12; //抽奖记录 Temp.dwSocketID = dwContextID; CHttpClient::AddLog(dwContextID, Temp); CMD_GR_RequestFailureAward RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = 0; //表示成功 CString str; str.Format(_T("%d"), pLotteryAward->dwRecordID); _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), str); ////发送数据 //WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); //WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); if (pIServerUserItem != NULL) { TurntableLogon::PB_CS_C_workLotteryAward LotteryAward; LotteryAward.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; LotteryAward.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = LotteryAward.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_AWARD, (void*)pbdata.c_str(), pbdata.length()); } } return true; } //分享战绩到闲聊 bool CAttemperEngineSink::OnDBFenXiangReCord(DWORD dwContextID, VOID * pData, WORD wDataSize) { DBR_GR_ClubRecordXianLiao * pClubRecord = (DBR_GR_ClubRecordXianLiao*)pData; GETDUILIEBASE Temp; ZeroMemory(&Temp, sizeof(GETDUILIEBASE)); Temp.CommendID = 13; //调用.net闲聊分享战绩 //Temp.dwSocketID = pClubRecord->dwTableID;//桌子号 //Temp.dUserID = pClubRecord->dwClubID;//俱乐部id switch (pClubRecord->WanFa) { case 0: case 1: case 2: { TCHAR szBuffer[32] = _T("一脚癞油"); _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID,pClubRecord->DiFen); break; } case 3: case 4: case 5: { if (pClubRecord->dwUserCount == 3) { TCHAR szBuffer[32] = _T("戳虾子"); _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen); } else { TCHAR szBuffer[32] = _T("戳虾子-单挑"); _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen); } break; } case 10: case 11: case 12: { TCHAR szBuffer[32] = _T("血流成河"); _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen); break; } case 14: case 15: case 16: { TCHAR szBuffer[32] = _T("花牌"); _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen); break; } default: break; } //CMD_GR_Info bb; //人物信息 //CDM_GR_XIANL_Info PlayerInfo[4] = { 0 }; //for (BYTE i = 0; i < pClubRecord->dwUserCount; i++) //{ // PlayerInfo[i].userID = pClubRecord->Player[i].userID; // CopyMemory(&PlayerInfo[i].szName, pClubRecord->Player[i].szName, sizeof(PlayerInfo[i].szName)); // CopyMemory(&PlayerInfo[i].szImgHead, pClubRecord->Player[i].szImgHead, sizeof(PlayerInfo[i].szImgHead)); // PlayerInfo[i].gScore = pClubRecord->Player[i].gScore; //} CopyMemory(Temp.szBuffer, pClubRecord, wDataSize);//战绩信息 DWORD dwSocketID = INVALID_CHAIR; CHttpClient::AddLog(dwSocketID, Temp); return true; } //自动创建房间,发送请求到数据库进行创建 bool CAttemperEngineSink::OnAutoCreateRoomToDB(DWORD dwClubID, DWORD dwUserID, WORD wWanFa) { DBR_GR_ClubAction2 ClubAction; ZeroMemory(&ClubAction, sizeof(ClubAction)); ClubAction.dwClubID = dwClubID; ClubAction.dwUserID = dwUserID; ClubAction.wWanFa = wWanFa; //ClubAction.wFengDing = wFengDing; //自动创建1个房间 return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, 0, &ClubAction, sizeof(DBR_GR_ClubAction2)); } bool CAttemperEngineSink::OnWlShuffleGameHandle(VOID * pData, WORD wDataSize, DWORD dwSocketID) { //ASSERT(wDataSize == sizeof(BYTE)); //if (wDataSize != sizeof(BYTE)) //{ // return false; //} //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; DWORD dUserID = pIServerUserItem->GetUserID(); m_pIKernelDataBaseEngine->PostDataBaseRequest(SUB_GP_WENLIN_SHUFFLE, dwSocketID, &dUserID, sizeof(DWORD)); return true; } //洗牌动画 获取砖石数据应答 bool CAttemperEngineSink::OnWlShuffleGameHandleACK(DWORD dwContextID, VOID * pData, WORD wDataSize) { ASSERT(sizeof(USER_SHUFFLE_ZUANSHI) == wDataSize); //获取用户 WORD wBindIndex = LOWORD(dwContextID); IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; if (pIServerUserItem->GetUserStatus() == US_PLAYING) return true; USER_SHUFFLE_ZUANSHI * pInfo = (USER_SHUFFLE_ZUANSHI*)pData; m_wShuffleZuan = pInfo->dwNeedZuanshi;//所需钻石 //获取当前玩家钻石数 pInfo->dwUserZuanShi = pIServerUserItem->GetUserInfo()->dwBean; UserInfo::PB_CS_S_USER_SHUFFLE_ZUANSHI Zuanshi; Zuanshi.set_dwuserzuanshi(pInfo->dwUserZuanShi); Zuanshi.set_dwneedzuanshi(pInfo->dwNeedZuanshi); //发送数据 std::string pbdata = Zuanshi.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GP_WENLIN_SHUFFLE_ACK, (void*)pbdata.c_str(), pbdata.length()); return true; } //扣钻 更新钻石 bool CAttemperEngineSink::OnWlShuffleGameDeductHandle(VOID * pData, WORD wDataSize) { ASSERT(sizeof(DBR_GR_WLDeductInfo) == wDataSize); DBR_GR_WLDeductInfo * pInfo = (DBR_GR_WLDeductInfo*)pData; IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID); if (NULL == pIServerUserItem) return false; if (pIServerUserItem->GetUserInfo()->dwBean >= pInfo->dwConsumeCurrency) { pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwConsumeCurrency; } else { pIServerUserItem->GetUserInfo()->dwBean = 0; } //变量定义 CMD_GR_UserBean UserBeans; ZeroMemory(&UserBeans, sizeof(UserBeans)); //构造变量 UserBeans.dwCurrBeans = pIServerUserItem->GetUserInfo()->dwBean; UserInfo::PB_CS_S_UserBean Bean; Bean.set_dwcurrbeans(UserBeans.dwCurrBeans); //发送数据 std::string pbdata = Bean.SerializePartialAsString(); SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length()); return true; }