诸暨麻将添加redis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

21698 řádky
728 KiB

  1. #include "StdAfx.h"
  2. #include "ServiceUnits.h"
  3. #include "ControlPacket.h"
  4. #include "AttemperEngineSink.h"
  5. #include "Commend.h"
  6. #include "Shop.h"
  7. #include "GameServer.h"
  8. #include "GameServerDlg.h"
  9. #include "ShowTime.h"
  10. #include "JsonBusiness.h"
  11. #include "../../MessageDef/Pb_TurntableLogon.pb.h"
  12. #include "../../MessageDef/Pb_UserInfo.pb.h"
  13. #include "../../MessageDef/Pb_ClubInformation.pb.h"
  14. #include "../../MessageDef/Pb_GameInfo.pb.h"
  15. #include "../../GlobalDef/Util.h"
  16. #include "ChineseCode.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. //////////////////////////////////////////////////////////////////////////////////
  23. //时间标识
  24. #define IDI_LOAD_ANDROID_USER (IDI_MAIN_MODULE_START+1) //机器信息
  25. #define IDI_REPORT_SERVER_INFO (IDI_MAIN_MODULE_START+2) //房间信息
  26. #define IDI_CONNECT_CORRESPOND (IDI_MAIN_MODULE_START+3) //连接时间
  27. #define IDI_GAME_SERVICE_PULSE (IDI_MAIN_MODULE_START+4) //服务脉冲
  28. #define IDI_DISTRIBUTE_ANDROID (IDI_MAIN_MODULE_START+5) //分配机器
  29. #define IDI_DBCORRESPOND_NOTIFY (IDI_MAIN_MODULE_START+6) //缓存通知
  30. #define IDI_LOAD_SYSTEM_MESSAGE (IDI_MAIN_MODULE_START+7) //系统消息
  31. #define IDI_SEND_SYSTEM_MESSAGE (IDI_MAIN_MODULE_START+8) //系统消息
  32. #define IDI_LOAD_SENSITIVE_WORD (IDI_MAIN_MODULE_START+9) //加载敏感词
  33. #define IDI_DISTRIBUTE_USER (IDI_MAIN_MODULE_START+10) //分配用户
  34. #define IDI_TELL_CORRESPOND (IDI_MAIN_MODULE_START+11) //定时告知协调服务器
  35. #define IDI_UPDATA_DATA (IDI_MAIN_MODULE_START+12) //定时更新数据
  36. #define IDI_HTTPUPDATA_DATA (IDI_MAIN_MODULE_START+18) //定时http请求
  37. #define IDI_SERVICE_DATA (IDI_MAIN_MODULE_START+19) //定时通道请求
  38. #define IDI_SERVICE_CLEAR (IDI_MAIN_MODULE_START+20) //定时清空
  39. //////////////////////////////////////////////////////////////////////////////////
  40. //时间定义 秒
  41. #define TIME_LOAD_ANDROID_USER 15L //加载机器
  42. #define TIME_DISTRIBUTE_ANDROID 15L //分配用户
  43. #define TIME_REPORT_SERVER_INFO 60L //人数和房间数量上报时间
  44. #define TIME_DBCORRESPOND_NOTIFY 3L //缓存通知时间
  45. #define TIME_LOAD_SYSTEM_MESSAGE 600L //系统消息时间
  46. #define TIME_SEND_SYSTEM_MESSAGE 10L //系统消息时间
  47. #define TIME_LOAD_SENSITIVE_WORD 5L //加载敏感词时间
  48. #define TIME_TELL_CORRESPOND 2L //通知协调服务器时间
  49. #define TIME_HTTP 5L //定时HTTP请求
  50. //////////////////////////////////////////////////////////////////////////////////
  51. //常量定义
  52. #define TEMP_MESSAGE_ID INVALID_DWORD
  53. //间隔时间
  54. #define MIN_INTERVAL_TIME 10 //间隔时间
  55. #define MAX_INTERVAL_TIME 1*60 //临时标识
  56. const unsigned int MAX_USER = 0xFFFF; //INDEX_ANDROID - 1; // 与SOCKET的bindindex大小一致
  57. //////////////////////////////////////////////////////////////////////////////////
  58. extern CGameServerApp theApp;
  59. DWORD CAttemperEngineSink::m_DwordThead = 0;
  60. void del_char(TCHAR str[], TCHAR c)
  61. {
  62. int i = 0, j = 0;
  63. while (str[i] != '\0')
  64. {
  65. if (str[i] != c)
  66. {
  67. str[j++] = str[i++];
  68. }
  69. else
  70. {
  71. i++;
  72. }
  73. }
  74. str[j] = '\0';
  75. }
  76. __int64 StrToNmuber(TCHAR *str)
  77. {
  78. __int64 ui = 0;
  79. size_t len = _tcslen(str), i = 0;
  80. while (i < len)
  81. {
  82. ui = ui * 10 + str[i] - 0x30;
  83. i++;
  84. }
  85. return ui;
  86. }
  87. //构造函数
  88. CAttemperEngineSink::CAttemperEngineSink(): m_pGameMatchOption(nullptr)
  89. {
  90. m_Service = 1;
  91. m_BCreate = true; //允许创建房间
  92. m_BCreate_Hua = true; //运行创建花牌房间
  93. m_BAddCreate = true; //允许加入房间
  94. //状态变量
  95. m_bCollectUser = false;
  96. m_bNeekCorrespond = true;
  97. //控制变量
  98. m_dwIntervalTime = 0;
  99. m_dwLastDisposeTime = 0;
  100. m_dwCorrespondNum = 0;
  101. //绑定数据
  102. m_pNormalParameter = NULL;
  103. //m_pAndroidParameter = NULL;
  104. //会员参数
  105. m_wMemberCount = 0;
  106. ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter));
  107. //任务参数
  108. m_wTaskCount = 0;
  109. ZeroMemory(m_TaskParameter, sizeof(m_TaskParameter));
  110. ZeroMemory(&m_Data, sizeof(m_Data));
  111. //状态变量
  112. m_pInitParameter = NULL;
  113. m_pGameParameter = NULL;
  114. m_pGameServiceAttrib = NULL;
  115. m_pGameServiceOption = NULL;
  116. //组件变量
  117. m_pITimerEngine = NULL;
  118. m_pIAttemperEngine = NULL;
  119. m_pITCPSocketService = NULL;
  120. m_pITCPNetworkEngine = NULL;
  121. m_pIGameServiceManager = NULL;
  122. //数据引擎
  123. m_pIRecordDataBaseEngine = NULL;
  124. m_pIKernelDataBaseEngine = NULL;
  125. m_pIDBCorrespondManager = NULL;
  126. //配置数据
  127. //ZeroMemory(&m_DataConfigColumn, sizeof(m_DataConfigColumn));
  128. //ZeroMemory(&m_DataConfigProperty, sizeof(m_DataConfigProperty));
  129. //比赛变量
  130. //m_pIMatchServiceManager = NULL;
  131. //初始化私有桌子ID池 note by yd 根据定时器范围 最大桌子ID(32767500-1000000)/500=63535
  132. for (unsigned short i = PRIVATE_TABLE_MIN_ID; i < 0xFFFF/*65535*/; ++i)
  133. m_privateTableIDPool.push_back(i);
  134. ZeroMemory(&m_JC, sizeof(m_JC));
  135. m_pRankListData = nullptr;
  136. m_pRankListDataSize = 0;
  137. m_lastRankListTime = time(0);
  138. m_wShuffleZuan = 0;
  139. /*ZeroMemory(&mTmpGameConfig, sizeof(tagGameConfig));
  140. mwChairID = 0;*/
  141. return;
  142. }
  143. //析构函数
  144. CAttemperEngineSink::~CAttemperEngineSink()
  145. {
  146. //删除数据
  147. SafeDeleteArray(m_pNormalParameter);
  148. //SafeDeleteArray(m_pAndroidParameter);
  149. //删除桌子
  150. m_TableFrameArray.clear();
  151. //删除消息
  152. m_SystemMessageBuffer.Append(m_SystemMessageActive);
  153. for (INT_PTR i = 0; i < m_SystemMessageBuffer.GetCount(); i++)
  154. {
  155. SafeDelete(m_SystemMessageBuffer[i]);
  156. }
  157. //清空数组
  158. m_SystemMessageActive.RemoveAll();
  159. m_SystemMessageBuffer.RemoveAll();
  160. //清理数据
  161. //m_KickUserItemMap.RemoveAll();
  162. m_DistributeManage.RemoveAll();
  163. m_PrivateRoomAll.clear();
  164. m_OnLineUserAll.clear();
  165. m_UserID_2_PriTableIDGROUP.clear();
  166. return;
  167. }
  168. //接口查询
  169. VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  170. {
  171. QUERYINTERFACE(IMainServiceFrame, Guid, dwQueryVer);
  172. QUERYINTERFACE(IAttemperEngineSink, Guid, dwQueryVer);
  173. QUERYINTERFACE(IServerUserItemSink, Guid, dwQueryVer);
  174. QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink, Guid, dwQueryVer);
  175. return NULL;
  176. }
  177. //启动事件
  178. bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx)
  179. {
  180. //绑定信息
  181. //m_pAndroidParameter = new tagBindParameter[MAX_ANDROID];
  182. //ZeroMemory(m_pAndroidParameter, sizeof(tagBindParameter)*MAX_ANDROID);
  183. //绑定信息
  184. m_pNormalParameter = new tagBindParameter[m_pGameServiceOption->wMaxPlayer];
  185. ZeroMemory(m_pNormalParameter, sizeof(tagBindParameter)*m_pGameServiceOption->wMaxPlayer);
  186. //配置比赛
  187. //InitMatchServiceManager();
  188. //配置机器
  189. if (InitAndroidUser() == false)
  190. {
  191. ASSERT(FALSE);
  192. return false;
  193. }
  194. //配置桌子
  195. if (InitTableFrameArray() == false)
  196. {
  197. ASSERT(FALSE);
  198. return false;
  199. }
  200. //设置接口
  201. //if (m_pIMatchServiceManager != NULL)
  202. //{
  203. // if (m_ServerUserManager.SetServerUserItemSink(m_pIMatchServiceManager->GetServerUserItemSink()) == false)
  204. // {
  205. // ASSERT(FALSE);
  206. // return false;
  207. // }
  208. //}
  209. //else
  210. //{
  211. if (m_ServerUserManager.SetServerUserItemSink(QUERY_ME_INTERFACE(IServerUserItemSink)) == false)
  212. {
  213. ASSERT(FALSE);
  214. return false;
  215. }
  216. //}
  217. //启动机器
  218. //if (m_AndroidUserManager.StartService() == false)
  219. //{
  220. // ASSERT(FALSE);
  221. // return false;
  222. //}
  223. //设置规则
  224. m_DistributeManage.SetDistributeRule(m_pGameServiceOption->cbDistributeRule);
  225. m_pITimerEngine->SetTimer(IDI_UPDATA_DATA, 30000L, TIMES_INFINITY, NULL);
  226. int iNum = (rand() % 10)*1000 + 40000L;
  227. m_pITimerEngine->SetTimer(IDI_SERVICE_DATA, iNum, TIMES_INFINITY, NULL);
  228. m_pITimerEngine->SetTimer(IDI_SERVICE_CLEAR, 60*1000, TIMES_INFINITY, NULL);
  229. //设置时间
  230. //m_pITimerEngine->SetTimer(IDI_GAME_SERVICE_PULSE, 1000L, TIMES_INFINITY, NULL);
  231. //m_pITimerEngine->SetTimer(IDI_DBCORRESPOND_NOTIFY, TIME_DBCORRESPOND_NOTIFY * 1000L, TIMES_INFINITY, NULL);
  232. //#ifdef _DEBUG
  233. // m_pITimerEngine->SetTimer(IDI_LOAD_SYSTEM_MESSAGE, 15 * 1000L, TIMES_INFINITY, NULL);
  234. // m_pITimerEngine->SetTimer(IDI_SEND_SYSTEM_MESSAGE, 5 * 1000L, TIMES_INFINITY, NULL);
  235. //#else
  236. // m_pITimerEngine->SetTimer(IDI_LOAD_SYSTEM_MESSAGE, TIME_LOAD_SYSTEM_MESSAGE * 1000L, TIMES_INFINITY, NULL);
  237. // m_pITimerEngine->SetTimer(IDI_SEND_SYSTEM_MESSAGE, TIME_SEND_SYSTEM_MESSAGE * 1000L, TIMES_INFINITY, NULL);
  238. //#endif
  239. //延时加载敏感词
  240. //m_pITimerEngine->SetTimer(IDI_LOAD_SENSITIVE_WORD, TIME_LOAD_SENSITIVE_WORD * 1000L, TIMES_INFINITY, NULL);
  241. //防作弊模式
  242. if ((m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_ALLOW) != 0)
  243. {
  244. m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_USER, m_pGameServiceOption->wDistributeTimeSpace * 1000, TIMES_INFINITY, NULL);
  245. }
  246. // //加载机器
  247. // if (CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule) ||
  248. // CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule))
  249. // {
  250. //#ifdef _DEBUG
  251. // m_pITimerEngine->SetTimer(IDI_LOAD_ANDROID_USER, 10000L, TIMES_INFINITY, NULL);
  252. // m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_ANDROID, TIME_DISTRIBUTE_ANDROID * 1000L, TIMES_INFINITY, NULL);
  253. //#else
  254. // m_pITimerEngine->SetTimer(IDI_LOAD_ANDROID_USER, TIME_LOAD_ANDROID_USER * 1000L, TIMES_INFINITY, NULL);
  255. // m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_ANDROID, TIME_DISTRIBUTE_ANDROID * 1000L, TIMES_INFINITY, NULL);
  256. //#endif
  257. // }
  258. return true;
  259. }
  260. //停止事件
  261. bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx)
  262. {
  263. if (m_pITimerEngine) m_pITimerEngine->KillTimer(IDI_SERVICE_DATA);
  264. if (m_pITimerEngine) m_pITimerEngine->KillTimer(IDI_SERVICE_CLEAR);
  265. //状态变量
  266. m_bCollectUser = false;
  267. m_bNeekCorrespond = true;
  268. //配置信息
  269. m_pInitParameter = NULL;
  270. m_pGameServiceAttrib = NULL;
  271. m_pGameServiceOption = NULL;
  272. //组件变量
  273. m_pITimerEngine = NULL;
  274. m_pITCPSocketService = NULL;
  275. m_pITCPNetworkEngine = NULL;
  276. //数据引擎
  277. m_pIRecordDataBaseEngine = NULL;
  278. m_pIKernelDataBaseEngine = NULL;
  279. //绑定数据
  280. SafeDeleteArray(m_pNormalParameter);
  281. //SafeDeleteArray(m_pAndroidParameter);
  282. //任务变量
  283. m_wTaskCount = 0;
  284. ZeroMemory(&m_TaskParameter, sizeof(m_TaskParameter));
  285. //会员参数
  286. m_wMemberCount = 0;
  287. ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter));
  288. //删除用户
  289. m_TableFrameArray.clear();
  290. m_DistributeManage.RemoveAll();
  291. m_ServerUserManager.DeleteUserItem();
  292. m_ServerListManager.ResetServerList();
  293. //停止服务
  294. //m_AndroidUserManager.ConcludeService();
  295. //停止比赛
  296. //if (m_pIMatchServiceManager != NULL)
  297. // m_pIMatchServiceManager->StopService();
  298. //移除消息
  299. RemoveSystemMessage();
  300. //移除任务
  301. //m_UserTaskManager.ResetTaskManager();
  302. //复位关键字
  303. //m_WordsFilter.ResetSensitiveWordArray();
  304. m_PrivateRoomAll.clear();
  305. m_OnLineUserAll.clear();
  306. m_UserID_2_PriTableIDGROUP.clear();
  307. return true;
  308. }
  309. //控制事件
  310. bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize)
  311. {
  312. switch (wIdentifier)
  313. {
  314. case CT_CONNECT_CORRESPOND: //连接协调
  315. {
  316. //发起连接
  317. tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress;
  318. m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  319. //构造提示
  320. TCHAR szString[512] = TEXT("");
  321. _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  322. //提示消息
  323. CTraceService::TraceString(szString, TraceLevel_Normal);
  324. return true;
  325. }
  326. case CT_LOAD_SERVICE_CONFIG: //加载配置
  327. {
  328. ///+++加载轮盘配置(奖品有数量,会动态变化)
  329. ///---m_pIDBCorrespondManager->PostDataBaseRequest(0, DBR_GP_LOAD_ROULETTE_CONFIG, 0, NULL, 0); ///在抽奖的时候,动态加载
  330. ///+++加载签到奖励配置
  331. m_pIDBCorrespondManager->PostDataBaseRequest(0, DBR_GP_LOAD_CHECKIN_REWARD, 0, NULL, 0);
  332. //加载配置
  333. m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_PARAMETER, 0L, NULL, 0L);
  334. //加载列表
  335. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_GAME_COLUMN, 0L, NULL, 0L);
  336. //加载机器
  337. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_ANDROID_PARAMETER, 0L, NULL, 0L);
  338. //加载消息
  339. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_SYSTEM_MESSAGE, 0L, NULL, 0L);
  340. //加载任务
  341. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_TASK_LOAD_LIST, 0L, NULL, 0L);
  342. //会员参数
  343. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_MEMBER_PARAMETER, 0, NULL, 0);
  344. //加载道具
  345. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_GAME_PROPERTY, 0L, NULL, 0L);
  346. return true;
  347. }
  348. default: break;
  349. }
  350. return false;
  351. }
  352. //调度事件
  353. bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize)
  354. {
  355. return false;
  356. }
  357. //时间事件
  358. bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam)
  359. {
  360. //调度时间
  361. if ((dwTimerID >= IDI_MAIN_MODULE_START) && (dwTimerID <= IDI_MAIN_MODULE_FINISH))
  362. {
  363. //时间处理
  364. switch (dwTimerID)
  365. {
  366. //case IDI_LOAD_ANDROID_USER: //加载机器
  367. //{
  368. // //变量定义
  369. // DWORD dwBatchID = 0;
  370. // DWORD dwAndroidCount = 0;
  371. // //加载判断
  372. // if (m_AndroidUserManager.GetAndroidLoadInfo(dwBatchID, dwAndroidCount))
  373. // {
  374. // //构造结构
  375. // DBR_GR_LoadAndroidUser LoadAndroidUser;
  376. // LoadAndroidUser.dwBatchID = dwBatchID;
  377. // LoadAndroidUser.dwAndroidCount = dwAndroidCount;
  378. // CTraceService::TraceString(TEXT("加载机器已屏蔽 IDI_LOAD_ANDROID_USER"), TraceLevel_Warning);
  379. // //加载机器
  380. // //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_ANDROID_USER, 0L, &LoadAndroidUser, sizeof(LoadAndroidUser));
  381. // }
  382. // return true;
  383. //}
  384. case IDI_REPORT_SERVER_INFO: //房间信息
  385. {
  386. //变量定义
  387. CMD_CS_C_ServerOnLine ServerOnLine;
  388. ZeroMemory(&ServerOnLine, sizeof(ServerOnLine));
  389. //设置变量
  390. ServerOnLine.wTableOnlineCount = m_PriTableID_2_TableID.size();
  391. ServerOnLine.wTableFullCount = m_pGameServiceOption->wTableCount;
  392. ServerOnLine.dwOnLineCount = m_ServerUserManager.GetUserItemCount();
  393. //发送数据
  394. m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_ONLINE, &ServerOnLine, sizeof(ServerOnLine)/*, 0, 0, m_pIGameServiceManager == NULL? NULL:m_pIGameServiceManager->GetDataString()*/);
  395. return true;
  396. }
  397. case IDI_CONNECT_CORRESPOND: //连接协调
  398. {
  399. //发起连接
  400. tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress;
  401. m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  402. //构造提示
  403. TCHAR szString[512] = TEXT("");
  404. ZeroMemory(szString, sizeof(TCHAR) * 512);
  405. _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  406. //提示消息
  407. CTraceService::TraceString(szString, TraceLevel_Normal);
  408. return true;
  409. }
  410. case IDI_GAME_SERVICE_PULSE: //服务维护
  411. {
  412. return true;
  413. }
  414. case IDI_SERVICE_DATA: //加载通道
  415. {
  416. DWORD dThead = GetCurrentThreadId();
  417. if (CAttemperEngineSink::m_DwordThead == 0)
  418. {
  419. CAttemperEngineSink::m_DwordThead = dThead;
  420. }
  421. if (dThead == CAttemperEngineSink::m_DwordThead)
  422. {
  423. GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_UPTONGDAO, 0, NULL, 0);
  424. }
  425. return true;
  426. }
  427. case IDI_SERVICE_CLEAR: //清空操作
  428. {
  429. DWORD dThead = GetCurrentThreadId();
  430. if (CAttemperEngineSink::m_DwordThead == 0)
  431. {
  432. CAttemperEngineSink::m_DwordThead = dThead;
  433. }
  434. if (dThead == CAttemperEngineSink::m_DwordThead)
  435. {
  436. CTime tm; tm = CTime::GetCurrentTime();
  437. if (tm.GetHour() ==3
  438. && (tm.GetMinute() == 0))
  439. {
  440. //也强制解散空闲房间
  441. CString str = L"";
  442. str.Format(_T("强制解散空闲房间"));
  443. CTraceService::TraceString(str, TraceLevel_Normal);
  444. GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSFREEALL, 0, NULL, 0);
  445. }
  446. if (tm.GetHour() == 4
  447. && (tm.GetMinute() == 0
  448. || tm.GetMinute() == 1))
  449. {
  450. if (m_pITimerEngine) m_pITimerEngine->KillAllFreeTimer();
  451. GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_CLEAR, 0, NULL, 0);
  452. }
  453. }
  454. return true;
  455. }
  456. case IDI_UPDATA_DATA: //统计数据上报
  457. {
  458. for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++)
  459. {
  460. if (iter->second != nullptr)
  461. {
  462. auto pTableFrame = iter->second;
  463. TCHAR szTemp[32] = { 0 };
  464. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  465. CString csTemp = szTemp;
  466. if (csTemp != _T(""))
  467. {
  468. m_Data.iTableCount++;
  469. m_Data.iTableNum = m_Data.iTableCount;
  470. m_Data.PrivteTable[m_Data.iTableNum - 1] = _wtol(csTemp);
  471. if (pTableFrame->GetStartCount() > 0)
  472. {
  473. m_Data.iPlayingTableCount++;
  474. int iRet = 0;
  475. for (int i = 0; i < 4; i++)
  476. {
  477. IServerUserItem * p = pTableFrame->GetTableUserItem(i);
  478. if (p && p->GetUserStatus() == US_OFFLINE)
  479. {
  480. iRet++;
  481. }
  482. }
  483. if (iRet == 4) m_Data.iDownTableCount++;
  484. }
  485. else
  486. {
  487. m_Data.iFreeTableCount++;
  488. }
  489. }
  490. }
  491. }
  492. m_Data.iLoginBody = m_ServerUserManager.GetUserItemCount();
  493. WORD wEnumIndex = 0;
  494. while (wEnumIndex < m_ServerUserManager.GetUserItemCount())
  495. {
  496. //过滤用户
  497. IServerUserItem *pIServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  498. if (pIServerUserItem->GetUserStatus() == US_OFFLINE)
  499. {
  500. m_Data.iDownBody++;
  501. }
  502. else
  503. {
  504. m_Data.iLinkBody++;
  505. if (pIServerUserItem->GetUserStatus() == US_FREE)
  506. {
  507. m_Data.iDaTingBody++;
  508. }
  509. }
  510. }
  511. m_Data.iFreeCon = m_Data.iSocketNum - m_Data.iLinkBody;
  512. CGameServerDlg::UpData(m_Data);
  513. TagUpData Temp;
  514. ZeroMemory(&Temp, sizeof(TagUpData));
  515. Temp = m_Data;
  516. ZeroMemory(&m_Data, sizeof(m_Data));
  517. m_Data.iSocketNum = Temp.iSocketNum;
  518. return true;
  519. }
  520. /*case IDI_DISTRIBUTE_ANDROID: //分配机器
  521. //{
  522. // //动作处理
  523. // if (m_AndroidUserManager.GetAndroidCount() > 0 && m_pGameServiceOption->wServerType != GAME_GENRE_MATCH)
  524. // {
  525. // //变量定义
  526. // bool bAllowDynamicJoin = CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule);
  527. // bool bAllowAndroidAttend = CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule);
  528. // bool bAllowAndroidSimulate = CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule);
  529. // bool bAllowAvertCheatMode = (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR));
  530. // //模拟处理
  531. // if (bAllowAndroidSimulate == true && bAllowAvertCheatMode == false)
  532. // {
  533. // //机器状态
  534. // tagAndroidUserInfo AndroidSimulate;
  535. // m_AndroidUserManager.GetAndroidUserInfo(AndroidSimulate, ANDROID_SIMULATE);
  536. // //机器处理
  537. // if (AndroidSimulate.wFreeUserCount > 0)
  538. // {
  539. // for (WORD i = 0; i < 8; i++)
  540. // {
  541. // //随机桌子
  542. // WORD wTableID = rand() % (__max(m_pGameServiceOption->wTableCount / 3, 1));
  543. // //获取桌子
  544. // auto pTableFrame = GetTableFrame(wTableID);
  545. // if (!pTableFrame)
  546. // continue;
  547. // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue;
  548. // //桌子状况
  549. // tagTableUserInfo TableUserInfo;
  550. // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  551. // //分配判断
  552. // if (TableUserInfo.wTableUserCount > 0) continue;
  553. // if ((wUserSitCount >= TableUserInfo.wMinUserCount) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR)) continue;
  554. // //坐下判断
  555. // if (AndroidSimulate.wFreeUserCount >= TableUserInfo.wMinUserCount)
  556. // {
  557. // //变量定义
  558. // WORD wHandleCount = 0;
  559. // WORD wWantAndroidCount = TableUserInfo.wMinUserCount;
  560. // //数据调整
  561. // if (m_pGameServiceAttrib->wChairCount > TableUserInfo.wMinUserCount)
  562. // {
  563. // WORD wChairCount = m_pGameServiceAttrib->wChairCount;
  564. // WORD wFreeUserCount = AndroidSimulate.wFreeUserCount;
  565. // WORD wOffUserCount = __min(wChairCount, wFreeUserCount) - TableUserInfo.wMinUserCount;
  566. // wWantAndroidCount += ((wOffUserCount > 0) ? (rand() % (wOffUserCount + 1)) : 0);
  567. // }
  568. // //坐下处理
  569. // for (WORD j = 0; j < AndroidSimulate.wFreeUserCount; j++)
  570. // {
  571. // //变量定义
  572. // WORD wChairID = pTableFrame->GetRandNullChairID();
  573. // //无效过滤
  574. // //ASSERT(wChairID!=INVALID_CHAIR);
  575. // if (wChairID == INVALID_CHAIR) continue;
  576. // //用户坐下
  577. // IAndroidUserItem * pIAndroidUserItem = AndroidSimulate.pIAndroidUserFree[j];
  578. // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true)
  579. // {
  580. // //设置变量
  581. // wHandleCount++;
  582. // //完成判断
  583. // if (wHandleCount >= wWantAndroidCount)
  584. // {
  585. // return true;
  586. // }
  587. // }
  588. // }
  589. // if (wHandleCount > 0) return true;
  590. // }
  591. // }
  592. // }
  593. // }
  594. // //陪打处理
  595. // if (bAllowAndroidAttend == true)
  596. // {
  597. // //被动状态
  598. // tagAndroidUserInfo AndroidPassivity;
  599. // m_AndroidUserManager.GetAndroidUserInfo(AndroidPassivity, ANDROID_PASSIVITY);
  600. // if (bAllowAvertCheatMode)
  601. // {
  602. // //坐下处理
  603. // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++)
  604. // {
  605. // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j];
  606. // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true;
  607. // }
  608. // }
  609. // else
  610. // {
  611. // //被动处理
  612. // if (AndroidPassivity.wFreeUserCount > 0)
  613. // {
  614. // //百人游戏
  615. // if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR)
  616. // {
  617. // for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++)
  618. // {
  619. // //获取桌子
  620. // auto pTableFrame = GetTableFrame(i);
  621. // if (!pTableFrame)
  622. // continue;
  623. // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue;
  624. // //桌子状况
  625. // tagTableUserInfo TableUserInfo;
  626. // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  627. // //分配判断
  628. // if (wUserSitCount > m_pGameServiceAttrib->wChairCount * 2 / 3) continue;
  629. // //变量定义
  630. // IServerUserItem * pIServerUserItem = NULL;
  631. // WORD wChairID = pTableFrame->GetRandNullChairID();
  632. // //无效过滤
  633. // ASSERT(wChairID != INVALID_CHAIR);
  634. // if (wChairID == INVALID_CHAIR) continue;
  635. // //坐下处理
  636. // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++)
  637. // {
  638. // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j];
  639. // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true;
  640. // }
  641. // }
  642. // }
  643. // else
  644. // {
  645. // for (INT_PTR i = 0; i < m_pGameServiceOption->wTableCount; i++)
  646. // {
  647. // //获取桌子
  648. // auto pTableFrame = GetTableFrame(i);
  649. // if (!pTableFrame)
  650. // continue;
  651. // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue;
  652. // //桌子状况
  653. // tagTableUserInfo TableUserInfo;
  654. // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  655. // //分配判断
  656. // if (wUserSitCount == 0) continue;
  657. // if (TableUserInfo.wTableUserCount == 0) continue;
  658. // if ((wUserSitCount >= TableUserInfo.wMinUserCount) && (rand() % 10 > 5)) continue;
  659. // //变量定义
  660. // IServerUserItem * pIServerUserItem = NULL;
  661. // WORD wChairID = pTableFrame->GetRandNullChairID();
  662. // //无效过滤
  663. // ASSERT(wChairID != INVALID_CHAIR);
  664. // if (wChairID == INVALID_CHAIR) continue;
  665. // //坐下处理
  666. // for (WORD j = 0; j < AndroidPassivity.wFreeUserCount; j++)
  667. // {
  668. // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[j];
  669. // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true;
  670. // }
  671. // }
  672. // }
  673. // }
  674. // }
  675. // }
  676. // //陪打处理
  677. // if (bAllowAndroidAttend == true)
  678. // {
  679. // //主动状态
  680. // tagAndroidUserInfo AndroidInitiative;
  681. // m_AndroidUserManager.GetAndroidUserInfo(AndroidInitiative, ANDROID_INITIATIVE);
  682. // //WORD wAllAndroidCount = AndroidInitiative.wFreeUserCount + AndroidInitiative.wPlayUserCount + AndroidInitiative.wSitdownUserCount;
  683. // if (bAllowAvertCheatMode)
  684. // {
  685. // //坐下处理
  686. // for (WORD j = 0; j < AndroidInitiative.wFreeUserCount; j++)
  687. // {
  688. // IAndroidUserItem * pIAndroidUserItem = AndroidInitiative.pIAndroidUserFree[j];
  689. // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true;
  690. // }
  691. // }
  692. // else
  693. // {
  694. // //主动处理
  695. // if (AndroidInitiative.wFreeUserCount > 0)
  696. // {
  697. // for (INT_PTR i = 0; i < m_pGameServiceOption->wTableCount; i++)
  698. // {
  699. // //获取桌子
  700. // auto pTableFrame = GetTableFrame(i);
  701. // if (!pTableFrame)
  702. // continue;
  703. // if ((pTableFrame->IsGameStarted() == true) && (bAllowDynamicJoin == false)) continue;
  704. // //桌子状况
  705. // tagTableUserInfo TableUserInfo;
  706. // WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  707. // //分配判断
  708. // if ((m_pGameServiceAttrib->wChairCount < MAX_CHAIR) && wUserSitCount > (TableUserInfo.wMinUserCount - 1)) continue;
  709. // //变量定义
  710. // IServerUserItem * pIServerUserItem = NULL;
  711. // WORD wChairID = pTableFrame->GetRandNullChairID();
  712. // //无效过滤
  713. // ASSERT(wChairID != INVALID_CHAIR);
  714. // if (wChairID == INVALID_CHAIR) continue;
  715. // //坐下处理
  716. // for (WORD j = 0; j < AndroidInitiative.wFreeUserCount; j++)
  717. // {
  718. // IAndroidUserItem * pIAndroidUserItem = AndroidInitiative.pIAndroidUserFree[j];
  719. // if (pTableFrame->PerformSitDownAction(wChairID, pIAndroidUserItem->GetMeUserItem()) == true) return true;
  720. // }
  721. // }
  722. // }
  723. // }
  724. // }
  725. // //变量定义
  726. // bool bMaxPlayerGame = m_pGameServiceAttrib->wChairCount >= MAX_CHAIR;
  727. // //类型判断
  728. // if (bMaxPlayerGame)
  729. // {
  730. // //获取时间
  731. // DWORD dwCurrTime = (DWORD)time(NULL);
  732. // if (dwCurrTime < m_dwIntervalTime + m_dwLastDisposeTime) return true;
  733. // //设置变量
  734. // m_dwLastDisposeTime = dwCurrTime;
  735. // m_dwIntervalTime = MIN_INTERVAL_TIME + rand() % (MAX_INTERVAL_TIME - MIN_INTERVAL_TIME);
  736. // }
  737. // //起立处理
  738. // WORD wStandUpCount = 0;
  739. // WORD wRandCount = ((rand() % 3) + 1);
  740. // INT_PTR nIndex = rand() % (__max(m_pGameServiceOption->wTableCount, 1));
  741. // for (INT_PTR i = nIndex; i < m_pGameServiceOption->wTableCount + nIndex; ++i)
  742. // {
  743. // //获取桌子
  744. // INT_PTR nTableIndex = i%m_pGameServiceOption->wTableCount;
  745. // auto pTableFrame = GetTableFrame(nTableIndex);
  746. // if (!pTableFrame)
  747. // continue;
  748. // if (pTableFrame->IsGameStarted() == true) continue;
  749. // //桌子状况
  750. // tagTableUserInfo TableUserInfo;
  751. // ZeroMemory(&TableUserInfo, sizeof(TableUserInfo));
  752. // //WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  753. // //用户过虑
  754. // bool bRand = ((rand() % 100) > 50);
  755. // if (TableUserInfo.wTableAndroidCount == 0) continue;
  756. // if ((TableUserInfo.wTableUserCount > 0) && (bAllowAndroidAttend == true) && bRand) continue;
  757. // if (TableUserInfo.wTableAndroidCount >= TableUserInfo.wMinUserCount && bRand) continue;
  758. // //起立处理
  759. // for (WORD j = 0; j < pTableFrame->GetChairCount(); j++)
  760. // {
  761. // //获取用户
  762. // IServerUserItem * pIServerUserItem = pTableFrame->GetTableUserItem(j);
  763. // if (pIServerUserItem == NULL) continue;
  764. // //用户起立
  765. // if ((pIServerUserItem->IsAndroidUser() == true) && (pTableFrame->PerformStandUpAction(pIServerUserItem) == true))
  766. // {
  767. // wStandUpCount++;
  768. // if (wStandUpCount >= wRandCount)
  769. // return true;
  770. // else
  771. // break;
  772. // }
  773. // }
  774. // }
  775. // //起立处理
  776. // nIndex = rand() % (__max(m_pGameServiceOption->wTableCount, 1));
  777. // for (INT_PTR i = nIndex; i < m_pGameServiceOption->wTableCount + nIndex; ++i)
  778. // {
  779. // //获取桌子
  780. // //INT_PTR nTableIndex = i%m_pGameServiceOption->wTableCount;
  781. // auto pTableFrame = GetTableFrame(i);
  782. // if (!pTableFrame)
  783. // continue;
  784. // if (pTableFrame->IsGameStarted() == true) continue;
  785. // //桌子状况
  786. // tagTableUserInfo TableUserInfo;
  787. // ZeroMemory(&TableUserInfo, sizeof(TableUserInfo));
  788. // //WORD wUserSitCount = pTableFrame->GetTableUserInfo(TableUserInfo);
  789. // //用户过虑
  790. // bool bRand = ((rand() % 100) > 50);
  791. // if (TableUserInfo.wTableAndroidCount == 0) continue;
  792. // if ((TableUserInfo.wTableUserCount > 0) && (bAllowAndroidAttend == true) && bRand) continue;
  793. // //起立处理
  794. // for (WORD j = 0; j < pTableFrame->GetChairCount(); j++)
  795. // {
  796. // //获取用户
  797. // IServerUserItem * pIServerUserItem = pTableFrame->GetTableUserItem(j);
  798. // if (pIServerUserItem == NULL) continue;
  799. // //用户起立
  800. // if ((pIServerUserItem->IsAndroidUser() == true) && (pTableFrame->PerformStandUpAction(pIServerUserItem) == true))
  801. // {
  802. // wStandUpCount++;
  803. // if (wStandUpCount >= wRandCount)
  804. // return true;
  805. // else
  806. // break;
  807. // }
  808. // }
  809. // }
  810. // }
  811. // //比赛类型
  812. // if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH)
  813. // {
  814. // //陪玩标识
  815. // bool bAllowAndroidAttend = CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule);
  816. // //陪玩处理
  817. // if (bAllowAndroidAttend == true)
  818. // {
  819. // //被动状态
  820. // tagAndroidUserInfo AndroidPassivity;
  821. // m_AndroidUserManager.GetAndroidUserInfo(AndroidPassivity, ANDROID_PASSIVITY);
  822. // //坐下处理
  823. // WORD wIndex = rand() % (AndroidPassivity.wFreeUserCount + 1);
  824. // for (WORD j = wIndex; j < AndroidPassivity.wFreeUserCount + wIndex; j++)
  825. // {
  826. // WORD wAndroidIndex = j%AndroidPassivity.wFreeUserCount;
  827. // IAndroidUserItem * pIAndroidUserItem = AndroidPassivity.pIAndroidUserFree[wAndroidIndex];
  828. // if (InsertDistribute(pIAndroidUserItem->GetMeUserItem()) == true) return true;
  829. // }
  830. // }
  831. // }
  832. // return true;
  833. //}
  834. */
  835. case IDI_DBCORRESPOND_NOTIFY: //缓存定时处理
  836. {
  837. CTraceService::TraceString(TEXT("缓存定时处理已屏蔽 IDI_DBCORRESPOND_NOTIFY"), TraceLevel_Warning);
  838. //if (m_pIDBCorrespondManager) m_pIDBCorrespondManager->OnTimerNotify();
  839. return true;
  840. }
  841. case IDI_LOAD_SYSTEM_MESSAGE: //系统消息
  842. {
  843. CTraceService::TraceString(TEXT("系统消息已屏蔽 IDI_LOAD_SYSTEM_MESSAGE"), TraceLevel_Warning);
  844. //清除消息数据
  845. //RemoveSystemMessage();
  846. //加载消息
  847. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_SYSTEM_MESSAGE, 0L, NULL, 0L);
  848. return true;
  849. }
  850. //case IDI_LOAD_SENSITIVE_WORD: //加载敏感词
  851. //{
  852. // //投递请求
  853. // m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_LOAD_SENSITIVE_WORDS, 0, NULL, 0);
  854. // return true;
  855. //}
  856. case IDI_SEND_SYSTEM_MESSAGE: //系统消息
  857. {
  858. CTraceService::TraceString(TEXT("系统消息已屏蔽 IDI_SEND_SYSTEM_MESSAGE"), TraceLevel_Warning);
  859. ////数量判断
  860. //if (m_SystemMessageActive.GetCount() == 0) return true;
  861. ////时效判断
  862. //DWORD dwCurrTime = (DWORD)time(NULL);
  863. //for (INT_PTR nIndex = m_SystemMessageActive.GetCount() - 1; nIndex >= 0; nIndex--)
  864. //{
  865. // tagSystemMessage *pTagSystemMessage = m_SystemMessageActive[nIndex];
  866. // //时效判断
  867. // if (pTagSystemMessage->SystemMessage.tConcludeTime < dwCurrTime)
  868. // {
  869. // m_SystemMessageActive.RemoveAt(nIndex);
  870. // SafeDelete(pTagSystemMessage);
  871. // continue;
  872. // }
  873. // //间隔判断
  874. // if (pTagSystemMessage->dwLastTime + pTagSystemMessage->SystemMessage.dwTimeRate < dwCurrTime)
  875. // {
  876. // //更新数据
  877. // pTagSystemMessage->dwLastTime = dwCurrTime;
  878. // //构造消息
  879. // CMD_GR_SendMessage SendMessage = {};
  880. // SendMessage.cbAllRoom = (pTagSystemMessage->SystemMessage.dwMessageID == TEMP_MESSAGE_ID) ? TRUE : FALSE;
  881. // SendMessage.cbGame = (pTagSystemMessage->SystemMessage.cbMessageType == 1) ? TRUE : FALSE;
  882. // SendMessage.cbRoom = (pTagSystemMessage->SystemMessage.cbMessageType == 2) ? TRUE : FALSE;
  883. // if (pTagSystemMessage->SystemMessage.cbMessageType == 3)
  884. // {
  885. // SendMessage.cbGame = TRUE;
  886. // SendMessage.cbRoom = TRUE;
  887. // }
  888. // lstrcpyn(SendMessage.szSystemMessage, pTagSystemMessage->SystemMessage.szSystemMessage, CountArray(SendMessage.szSystemMessage));
  889. // SendMessage.wChatLength = lstrlen(SendMessage.szSystemMessage) + 1;
  890. // //发送消息
  891. // WORD wSendSize = sizeof(SendMessage) - sizeof(SendMessage.szSystemMessage) + CountStringBuffer(SendMessage.szSystemMessage);
  892. // SendSystemMessage(&SendMessage, wSendSize);
  893. // }
  894. //}
  895. return true;
  896. }
  897. case IDI_DISTRIBUTE_USER: //分配用户
  898. {
  899. //执行分组
  900. PerformDistribute();
  901. return true;
  902. }
  903. case IDI_TELL_CORRESPOND: //通知协调服务器
  904. {
  905. if (m_dwCorrespondNum == 0)
  906. {
  907. m_dwCorrespondNum++;
  908. return true;
  909. }
  910. //变量定义
  911. CMD_CS_C_TellCorr TellCorr;
  912. ZeroMemory(&TellCorr, sizeof(TellCorr));
  913. //服务端口
  914. //CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  915. TellCorr.wServerID = m_pGameServiceOption->wServerID;
  916. //发送数据
  917. if(m_pITCPSocketService != NULL)
  918. m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_TELL_CORRESPOND, &TellCorr, sizeof(TellCorr)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  919. return true;
  920. }
  921. default: break;
  922. }
  923. }
  924. //机器时器
  925. //if ((dwTimerID >= IDI_REBOT_MODULE_START) && (dwTimerID <= IDI_REBOT_MODULE_FINISH))
  926. //{
  927. // //时间处理
  928. // m_AndroidUserManager.OnEventTimerPulse(dwTimerID, wBindParam);
  929. // return true;
  930. //}
  931. //比赛定时器
  932. //if ((dwTimerID >= IDI_MATCH_MODULE_START) && (dwTimerID < IDI_MATCH_MODULE_FINISH))
  933. //{
  934. // if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventTimer(dwTimerID, wBindParam);
  935. // return true;
  936. //}
  937. //桌子时间
  938. if ((dwTimerID >= IDI_TABLE_MODULE_START) && (dwTimerID <= IDI_TABLE_MODULE_FINISH))
  939. {
  940. //桌子号码
  941. DWORD dwTableTimerID = dwTimerID - IDI_TABLE_MODULE_START;
  942. WORD wTableID = (WORD)(dwTableTimerID / TIME_TABLE_MODULE_RANGE);
  943. //时间效验
  944. auto pTableFrame = GetTableFrame(wTableID);
  945. if (!pTableFrame)
  946. {
  947. //输出信息
  948. TCHAR szBuffer[128] = TEXT("");
  949. _sntprintf(szBuffer, CountArray(szBuffer), TEXT("未找到桌号[ %d ],定时器标识[ %d ]无法正常运行."), wTableID, dwTimerID);
  950. //输出信息
  951. CTraceService::TraceString(szBuffer, TraceLevel_Warning);
  952. m_pITimerEngine->KillTimer(dwTimerID); ///+++ 2018-1-23 清除这个定时器
  953. return false;
  954. }
  955. //时间通知
  956. return pTableFrame->OnEventTimer(dwTableTimerID%TIME_TABLE_MODULE_RANGE, wBindParam);
  957. }
  958. return false;
  959. }
  960. //数据库事件
  961. bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  962. {
  963. switch (wRequestID)
  964. {
  965. case DBO_GR_LOGON_SUCCESS: //登录成功
  966. {
  967. return OnDBLogonSuccess(dwContextID, pData, wDataSize);
  968. }
  969. case DBO_GR_LOGON_FAILURE: //登录失败
  970. {
  971. return OnDBLogonFailure(dwContextID, pData, wDataSize);
  972. }
  973. case DBO_GR_GET_USER_GAMESCORE_LIST:
  974. {
  975. return OnDBGetUserGameScoreList(dwContextID, pData, wDataSize);
  976. }
  977. case DBO_GR_GET_USER_GAMESCORE_DETAIL:
  978. {
  979. return OnDBGetUserGameScoreRecordDetail(dwContextID, pData, wDataSize);
  980. }
  981. case DBO_GR_GET_USER_GAMESCORE_REPLAY_RECORD:
  982. {
  983. return OnDBGetUserGameScoreReplayRecord(dwContextID, pData, wDataSize);
  984. }
  985. case DBO_GR_GameScoreRecord_RESULT:
  986. {
  987. return OnDBO_GR_GameScoreRecord_RESULT(dwContextID, pData, wDataSize);
  988. }
  989. case SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT:
  990. {
  991. return OnDBO_GR_GameTmpScoreRankListResult(dwContextID, pData, wDataSize);
  992. }
  993. case SUB_GR_USER_GET_BEAN_RESULT:
  994. {
  995. return OnDBO_GR_GetBearn(dwContextID, pData, wDataSize);
  996. }
  997. case SUB_GR_USER_GET_VERIF_CODE://手机重复绑定查询
  998. {
  999. return OnDBO_GR_GetVerifCode(dwContextID, pData, wDataSize);
  1000. }
  1001. case SUB_GR_USER_CHECK_IPHONE://手机绑定
  1002. {
  1003. return OnDBO_GR_CheckIphone(dwContextID, pData, wDataSize);
  1004. }
  1005. case SUB_GR_USER_CHECK_IPHONE_QUERY://手机绑定查询应答
  1006. {
  1007. return OnDBO_GR_CheckIphoneQuery(dwContextID, pData, wDataSize);
  1008. }
  1009. case SUB_GR_USER_CHECK_NAME_QUERY: //实名查询应答
  1010. {
  1011. return OnDBO_GR_CheckNameQuery(dwContextID, pData, wDataSize);
  1012. }
  1013. case SUB_GF_LOTTERY_ADDRESS://修改地址应答
  1014. {
  1015. return OnDBO_GR_UpdateAddr(dwContextID, pData, wDataSize);
  1016. }
  1017. case DBO_GR_GAME_PARAMETER: //游戏参数
  1018. {
  1019. return OnDBGameParameter(dwContextID, pData, wDataSize);
  1020. }
  1021. //case DBO_GR_GAME_COLUMN_INFO: //列表信息
  1022. //{
  1023. // return OnDBGameColumnInfo(dwContextID, pData, wDataSize);
  1024. //}
  1025. //case DBO_GR_GAME_ANDROID_PARAMETER: //机器参数
  1026. //{
  1027. // return OnDBGameAndroidParameter(dwContextID, pData, wDataSize);
  1028. //}
  1029. //case DBO_GR_GAME_ANDROID_INFO: //机器信息
  1030. //{
  1031. // return OnDBGameAndroidInfo(dwContextID, pData, wDataSize);
  1032. //}
  1033. //case DBO_GR_GAME_PROPERTY_INFO: //道具信息
  1034. //{
  1035. // return OnDBGamePropertyInfo(dwContextID, pData, wDataSize);
  1036. //}
  1037. //case DBO_GR_GAME_MEMBER_PAREMETER: //会员参数
  1038. //{
  1039. // return OnDBGameMemberParameter(dwContextID, pData, wDataSize);
  1040. //}
  1041. //case DBO_GR_USER_INSURE_INFO: //银行信息
  1042. //{
  1043. // return OnDBUserInsureInfo(dwContextID, pData, wDataSize);
  1044. //}
  1045. //case DBO_GR_USER_INSURE_SUCCESS: //银行成功
  1046. //{
  1047. // return OnDBUserInsureSuccess(dwContextID, pData, wDataSize);
  1048. //}
  1049. //case DBO_GR_USER_INSURE_FAILURE: //银行失败
  1050. //{
  1051. // return OnDBUserInsureFailure(dwContextID, pData, wDataSize);
  1052. //}
  1053. //case DBO_GR_USER_INSURE_USER_INFO: //用户信息
  1054. //{
  1055. // return OnDBUserInsureUserInfo(dwContextID, pData, wDataSize);
  1056. //}
  1057. //case DBO_GR_USER_INSURE_ENABLE_RESULT: //开通结果
  1058. //{
  1059. // return OnDBUserInsureEnableResult(dwContextID, pData, wDataSize);
  1060. //}
  1061. case DBR_GR_USER_CHECK_BEANS_RETURN:
  1062. {
  1063. return OnDBR_GR_USER_ZHIJIE_BEANS_RETURN(dwContextID, pData, wDataSize);
  1064. }
  1065. case DBR_GR_USER_REDUCE_BEANS_RETURN://消耗元宝
  1066. {
  1067. return OnDBR_GR_USER_REDUCE_BEANS_RETURN(dwContextID, pData, wDataSize);
  1068. }
  1069. case DBR_GR_USER_LUCK_BEANS_RETURN://冻结元宝
  1070. {
  1071. return OnDBR_GR_USER_LOCK_BEANS_RETURN(dwContextID, pData, wDataSize);
  1072. }
  1073. case DBR_GR_USER_UNLUCK_BEANS_RETURN://解冻元宝
  1074. {
  1075. return OnDBR_GR_USER_UNLOCK_BEANS_RETURN(dwContextID, pData, wDataSize);
  1076. }
  1077. //case DBO_GR_PROPERTY_SUCCESS: //道具成功
  1078. //{
  1079. // return OnDBPropertySuccess(dwContextID, pData, wDataSize);
  1080. //}
  1081. //case DBO_GR_SYSTEM_MESSAGE_RESULT: //系统消息
  1082. //{
  1083. // return OnDBSystemMessage(dwContextID, pData, wDataSize);
  1084. //}
  1085. //case DBO_GR_SYSTEM_MESSAGE_FINISH: //加载完成
  1086. //{
  1087. // return OnDBSystemMessageFinish(dwContextID, pData, wDataSize);
  1088. //}
  1089. //case DBO_GR_SENSITIVE_WORDS: //加载敏感词
  1090. //{
  1091. // return OnDBSensitiveWords(dwContextID, pData, wDataSize);
  1092. //}
  1093. //case DBO_GR_TASK_LIST: //任务列表
  1094. //{
  1095. // return OnDBUserTaskList(dwContextID, pData, wDataSize);
  1096. //}
  1097. //case DBO_GR_TASK_LIST_END: //任务结束
  1098. //{
  1099. // return OnDBUserTaskListEnd(dwContextID, pData, wDataSize);
  1100. //}
  1101. //case DBO_GR_TASK_INFO: //任务信息
  1102. //{
  1103. // return OnDBUserTaskInfo(dwContextID, pData, wDataSize);
  1104. //}
  1105. //case DBO_GR_TASK_RESULT: //任务结果
  1106. //{
  1107. // return OnDBUserTaskResult(dwContextID, pData, wDataSize);
  1108. //}
  1109. //case DBO_GR_PURCHASE_RESULT: //购买结果
  1110. //{
  1111. // return OnDBPurchaseResult(dwContextID, pData, wDataSize);
  1112. //}
  1113. //case DBO_GR_EXCHANGE_RESULT: //兑换结果
  1114. //{
  1115. // return OnDBExChangeResult(dwContextID, pData, wDataSize);
  1116. //}
  1117. case DBR_GR_USER_SHRAE_AWARD_RETURN: //分享奖励钻石结果
  1118. {
  1119. return OnDBShareAwardResult(dwContextID, pData, wDataSize);
  1120. }
  1121. case DBR_GR_USER_SHRAE_INFO_RETURN: //用户分享信息
  1122. {
  1123. return OnDBShareInfoResult(dwContextID, pData, wDataSize);
  1124. }
  1125. //case DBO_GR_TOP_WIN_LIST_RESULT: ///---胜局榜
  1126. //{
  1127. // return OnDBTopWinList(dwContextID, pData, wDataSize);
  1128. //}
  1129. //case DBO_GP_EXCHANGE_CONFIG_LIST_ACK: ///+++兑换配置结果
  1130. //{
  1131. // return OnDBExchangeConfigList(dwContextID, pData, wDataSize);
  1132. //}
  1133. //case DBR_GP_RELIEF_INFO_ACK: ///+++查询破产信息结果
  1134. //{
  1135. // return OnDBReliefInfo(dwContextID, pData, wDataSize);
  1136. //}
  1137. //case DBR_GP_GET_RELIEF_INFO_ACK:
  1138. //{
  1139. // return OnDBGetRelief(dwContextID, pData, wDataSize);
  1140. //}
  1141. case DBO_GP_CHECKIN_INFO: //签到信息
  1142. {
  1143. return OnDBUserCheckInInfo(dwContextID, pData, wDataSize);
  1144. }
  1145. case DBO_GP_CHECKIN_RESULT: //签到结果
  1146. {
  1147. return OnDBUserCheckInResult(dwContextID, pData, wDataSize);
  1148. }
  1149. case DBO_GP_CHECKIN_REWARD: //签到奖品
  1150. {
  1151. return OnDBCheckInReward(dwContextID, pData, wDataSize);
  1152. }
  1153. case DBR_GR_CLUB_GET_LIST_ACK: //获取俱乐部列表应答
  1154. {
  1155. return OnDBGetClubList(dwContextID, pData, wDataSize);
  1156. }
  1157. case DBR_GR_CLUB_GET_USER_ACK: //获取俱乐部会员应答
  1158. {
  1159. return OnDBGetClubUser(dwContextID, pData, wDataSize);
  1160. }
  1161. case DBR_GR_CLUB_GET_USER_ACK_EX: //获取俱乐部会员应答
  1162. {
  1163. return OnDBGetClubUserEx(dwContextID, pData, wDataSize);
  1164. }
  1165. case DBR_GR_CLUB_GET_MESSAGE_ACK: //获取俱乐部消息应答
  1166. {
  1167. return OnDBGetClubMessage(dwContextID, pData, wDataSize);
  1168. }
  1169. case DBR_GR_CLUB_GET_RECORD_ACK: //获取俱乐部记录应答
  1170. {
  1171. return OnDBGetClubRecord(dwContextID, pData, wDataSize);
  1172. }
  1173. case DBR_GR_CLUB_CREATE_ACK: //创建俱乐部应答
  1174. {
  1175. return OnDBCreateClub(dwContextID, pData, wDataSize);
  1176. }
  1177. case DBR_GR_CLUB_UPDATE_ACK: //修改俱乐部应答
  1178. {
  1179. return OnDBUpdateClub(dwContextID, pData, wDataSize);
  1180. }
  1181. case DBR_GR_CLUB_DELETE_ACK: //删除俱乐部应答
  1182. {
  1183. return OnDBDeleteClub(dwContextID, pData, wDataSize);
  1184. }
  1185. case DBR_GR_CLUB_GET_ACK: //查看俱乐部应答
  1186. {
  1187. return OnDBGetClub(dwContextID, pData, wDataSize);
  1188. }
  1189. case DBR_GR_CLUB_JOIN_ACK: //加入俱乐部应答
  1190. {
  1191. return OnDBJoinClub(dwContextID, pData, wDataSize);
  1192. }
  1193. case DBR_GR_CLUB_QUIT_ACK: //退出俱乐部应答
  1194. {
  1195. return OnDBQuitClub(dwContextID, pData, wDataSize);
  1196. }
  1197. case DBR_GR_CLUB_ISAGREE_ACK: //同意俱乐部应答
  1198. {
  1199. return OnDBAgreeClub(dwContextID, pData, wDataSize);
  1200. }
  1201. //case DBR_GR_CLUB_GET_ONLINE_ACK: //获取俱乐部在线信息应答
  1202. //{
  1203. // return OnDBGetClubOnLine(dwContextID, pData, wDataSize);
  1204. //}
  1205. case DBR_GR_CLUB_GET_ONLINE_ACKEX: //获取俱乐部在线信息应答
  1206. {
  1207. return OnDBGetClubOnLineEx(dwContextID, pData, wDataSize);
  1208. }
  1209. case DBR_GR_CLUB_NOTIFY_ACK: //获取俱乐部在线信通知
  1210. {
  1211. return OnDBNotifyClubUser(dwContextID, pData, wDataSize);
  1212. }
  1213. case DBR_GR_CLUB_PROTOCOL_ACK: //查询协议
  1214. {
  1215. return OnDBGetClubProtocol(dwContextID, pData, wDataSize);
  1216. }
  1217. case DBR_GR_CLUB_GET_BLACKUSER_ACK: //特殊成员
  1218. {
  1219. return OnDBGetClubBlackUser(dwContextID, pData, wDataSize);
  1220. }
  1221. case DBR_GR_CLUB_PROTOCOLAGREE_ACK:
  1222. {
  1223. return OnDBAgreeClubProtocol(dwContextID, pData, wDataSize);
  1224. }
  1225. case DBR_GR_CLUB_HOSTINFO_ACK:
  1226. {
  1227. return OnDBGetClubHostInfo(dwContextID, pData, wDataSize);
  1228. }
  1229. case DBR_GR_CLUB_AUTOTABLE_ACK:
  1230. {
  1231. return OnDBAutoCreateTable(dwContextID, pData, wDataSize);
  1232. }
  1233. case DBR_GR_CLUB_NOTICE_ACK:
  1234. {
  1235. return OnDBGetClubNotice(dwContextID, pData, wDataSize);
  1236. }
  1237. case DBR_GR_CLUB_GET_RECORD_ACK_EX:
  1238. {
  1239. return OnDBGetClubRecordEx(dwContextID, pData, wDataSize);
  1240. }
  1241. case DBR_GP_GET_ROULETTE_CONFIG_ACK: ///+++加载大转盘奖品配置结果
  1242. {
  1243. return OnDBRouletteConfig(dwContextID, pData, wDataSize);
  1244. }
  1245. case DBR_GP_LOTTERY_HIS_ACK: ///+++中奖历史
  1246. {
  1247. return OnDBLotteryHis(dwContextID, pData, wDataSize);
  1248. }
  1249. case DBR_GP_LOTTERY_HIS_ACKEX: ///+++中奖历史
  1250. {
  1251. return OnDBLotteryHisEx(dwContextID, pData, wDataSize);
  1252. }
  1253. case DBR_GP_MY_ROULETTE_INFO_ACK:
  1254. {
  1255. return OnDBMyRouletteInfo(dwContextID, pData, wDataSize);
  1256. }
  1257. case DBR_GP_ROULETTE_LOTTERY_ACK:
  1258. {
  1259. return OnDBRouletteLottery(dwContextID, pData, wDataSize);
  1260. }
  1261. case DBR_GP_LOTTERY_INFO_ACK: //查询抽奖信息
  1262. {
  1263. return OnDBQueryLotteryInfoResult(dwContextID, pData, wDataSize);
  1264. }
  1265. case DBR_GP_WELFARE_INFO_ACK: //查询福利信息
  1266. {
  1267. return OnDBWelfareInfoResult(dwContextID, pData, wDataSize);
  1268. }
  1269. case DBR_GP_GET_UNTIE_AGENT_INFO_ACK:
  1270. {
  1271. return OnDBUserAgentInfo(dwContextID, pData, wDataSize); //用户获得代理解绑相关信息
  1272. }
  1273. case DBR_GP_GET_ZUANSHI_INFO_ACK:
  1274. {
  1275. return OnDBUserUntieAgent(dwContextID, pData, wDataSize); //用户获得解绑所需钻石数目结果
  1276. }
  1277. case DBR_GR_CLUB_DISSOLVEROOM_ACK:
  1278. {
  1279. return OnDBGetClubDissolveRoom(dwContextID, pData, wDataSize);
  1280. }
  1281. case DBR_GP_LOTTERY_AWARD:
  1282. {
  1283. return OnDBRouletteAward(dwContextID, pData, wDataSize); //手动领奖应答
  1284. }
  1285. case DBR_GR_CLUB_SAVE_MORE_WANFA_ACK: //修改保存俱乐部额外玩法应答
  1286. {
  1287. return OnDBUpdateAddClub(dwContextID, pData, wDataSize);
  1288. }
  1289. case DBR_GR_CLUB_GET_MORE_WANFA_ACK: //查看俱乐部应答
  1290. {
  1291. return OnDBGetAddClub(dwContextID, pData, wDataSize);
  1292. }
  1293. case DBR_GR_CLUB_XIANLIAO_RECORD: //分享战绩到闲聊群里面
  1294. {
  1295. return OnDBFenXiangReCord(dwContextID, pData, wDataSize);
  1296. }
  1297. case DBR_GR_CLUB_GET_COUNT_PLAYGAEMS_ACK: //俱乐部统计对局数回应
  1298. {
  1299. return OnDBGetClubPlaygames_Ack(dwContextID, pData, wDataSize);
  1300. }
  1301. case DBR_GR_CLUB_GET_COUNT_INTEGRAL_ACK: //俱乐部统计积分数回应
  1302. {
  1303. return OnDBGetClubIntegral_Ack(dwContextID, pData, wDataSize);
  1304. }
  1305. case DBR_GR_CLUB_GET_MAKEA_SAMPLE_ACK: //俱乐部打样
  1306. {
  1307. return OnDBGetClubSample(dwContextID, pData, wDataSize);
  1308. }
  1309. case DBR_GP_GET_WENLIN_SHUFFLE_ACK: //温岭洗牌动画 获取砖石数据
  1310. {
  1311. return OnWlShuffleGameHandleACK(dwContextID, pData, wDataSize);
  1312. }
  1313. case DBR_GP_DEDUCT_RE_ZUANSHI_INFO: //温岭洗牌动画 扣钻刷新
  1314. {
  1315. return OnWlShuffleGameDeductHandle(pData, wDataSize);
  1316. }
  1317. default: break;
  1318. }
  1319. //比赛事件
  1320. //if (wRequestID >= DBO_GR_MATCH_EVENT_START && wRequestID <= DBO_GR_MATCH_EVENT_END)
  1321. //{
  1322. // CTraceService::TraceString(TEXT("比赛事件 "), TraceLevel_Warning);
  1323. // //参数效验
  1324. // if (m_pIMatchServiceManager == NULL) return false;
  1325. // //查找用户
  1326. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  1327. // IServerUserItem * pIServerUserItem = pBindParameter != NULL ? pBindParameter->pIServerUserItem : NULL;
  1328. // return m_pIMatchServiceManager->OnEventDataBase(wRequestID, pIServerUserItem, pData, wDataSize);
  1329. //}
  1330. return false;
  1331. }
  1332. //关闭事件
  1333. bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason)
  1334. {
  1335. //协调连接
  1336. if (wServiceID == NETWORK_CORRESPOND)
  1337. {
  1338. //设置变量
  1339. m_bCollectUser = false;
  1340. //删除时间
  1341. m_pITimerEngine->KillTimer(IDI_REPORT_SERVER_INFO);
  1342. //重连判断
  1343. if (m_bNeekCorrespond == true)
  1344. {
  1345. //构造提示
  1346. TCHAR szDescribe[128] = TEXT("");
  1347. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("与协调服务器的连接关闭了,%ld 秒后将重新连接"), m_pInitParameter->m_wConnectTime);
  1348. //提示消息
  1349. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  1350. //设置时间
  1351. ASSERT(m_pITimerEngine != NULL);
  1352. m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, m_pInitParameter->m_wConnectTime * 1000L, 1, 0);
  1353. }
  1354. return true;
  1355. }
  1356. return false;
  1357. }
  1358. //连接事件
  1359. bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode)
  1360. {
  1361. //协调连接
  1362. if (wServiceID == NETWORK_CORRESPOND)
  1363. {
  1364. //错误判断
  1365. if (nErrorCode != 0)
  1366. {
  1367. //构造提示
  1368. TCHAR szDescribe[128] = TEXT("");
  1369. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("协调服务器连接失败 [ %ld ],%ld 秒后将重新连接"),
  1370. nErrorCode, m_pInitParameter->m_wConnectTime);
  1371. //提示消息
  1372. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  1373. //设置时间
  1374. ASSERT(m_pITimerEngine != NULL);
  1375. m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, m_pInitParameter->m_wConnectTime * 1000L, 1, 0);
  1376. return false;
  1377. }
  1378. CString csTemp;
  1379. csTemp.Format(L"[%d]正在发送游戏房间注册信息...", m_pGameServiceOption->wServerID);
  1380. //提示消息
  1381. CTraceService::TraceString(csTemp, TraceLevel_Normal);
  1382. //变量定义
  1383. CMD_CS_C_RegisterServer RegisterServer;
  1384. ZeroMemory(&RegisterServer, sizeof(RegisterServer));
  1385. //服务端口
  1386. CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  1387. RegisterServer.wServerPort = pServiceUnits->m_TCPNetworkEngine->GetCurrentPort();
  1388. //构造数据
  1389. RegisterServer.wKindID = m_pGameServiceOption->wKindID;
  1390. RegisterServer.wNodeID = m_pGameServiceOption->wNodeID;
  1391. RegisterServer.wSortID = m_pGameServiceOption->wSortID;
  1392. RegisterServer.wServerID = m_pGameServiceOption->wServerID;
  1393. RegisterServer.wServerKind = m_pGameServiceOption->wServerKind;
  1394. RegisterServer.wServerType = m_pGameServiceOption->wServerType;
  1395. RegisterServer.lCellScore = m_pGameServiceOption->lCellScore;
  1396. RegisterServer.lEnterScore = m_pGameServiceOption->lMinEnterScore;
  1397. if (CServiceUnits::g_pServiceUnits) RegisterServer.wServerLevel = CServiceUnits::g_pServiceUnits->m_InitParameter.m_ServiceLevel;
  1398. RegisterServer.dwOnLineCount = m_ServerUserManager.GetUserItemCount();
  1399. RegisterServer.dwFullCount = m_pGameServiceOption->wMaxPlayer - RESERVE_USER_COUNT;
  1400. RegisterServer.dwFullTable = m_pGameServiceOption->wTableCount;
  1401. RegisterServer.dwServerRule = m_pGameServiceOption->dwServerRule&SR_ALLOW_AVERT_CHEAT_MODE;
  1402. lstrcpyn(RegisterServer.szServerName, m_pGameServiceOption->szServerName, CountArray(RegisterServer.szServerName));
  1403. lstrcpyn(RegisterServer.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(RegisterServer.szServerAddr));
  1404. RegisterServer.bService = m_Service; //是否提供服务
  1405. //发送数据
  1406. ASSERT(m_pITCPSocketService != NULL);
  1407. m_pITCPSocketService->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_SERVER, &RegisterServer, sizeof(RegisterServer)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  1408. //发送用户房间列表
  1409. auto iter = m_UserID_2_PriTableIDGROUP.begin();
  1410. while (iter != m_UserID_2_PriTableIDGROUP.end())
  1411. {
  1412. JN_GR_RoomListGroup jRG = iter->second;
  1413. for (size_t i = 0; i < (jRG.Num > 30 ? 30 : jRG.Num); i++)
  1414. {
  1415. jRG.jgrDate[i].dwInsert_UpData_Del = 0;
  1416. UpdataBodyOwnRoomToServer(&jRG.jgrDate[i], sizeof(jRG.jgrDate[i]));
  1417. }
  1418. iter++;
  1419. }
  1420. //设置时间
  1421. ASSERT(m_pITimerEngine != NULL);
  1422. m_dwCorrespondNum = 0;//计数归零
  1423. m_pITimerEngine->SetTimer(IDI_REPORT_SERVER_INFO, TIME_REPORT_SERVER_INFO * 1000L, TIMES_INFINITY, 0);
  1424. m_pITimerEngine->SetTimer(IDI_TELL_CORRESPOND, TIME_TELL_CORRESPOND * 1000L, TIMES_INFINITY, 0);
  1425. return true;
  1426. }
  1427. return true;
  1428. }
  1429. //读取事件
  1430. bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize)
  1431. {
  1432. //协调连接
  1433. if (wServiceID == NETWORK_CORRESPOND)
  1434. {
  1435. switch (Command.wMainCmdID)
  1436. {
  1437. case MDM_CS_REGISTER: //注册服务
  1438. {
  1439. return OnTCPSocketMainRegister(Command.wSubCmdID, pData, wDataSize);
  1440. }
  1441. case MDM_CS_SERVICE_INFO: //服务信息
  1442. {
  1443. return OnTCPSocketMainServiceInfo(Command.wSubCmdID, pData, wDataSize);
  1444. }
  1445. case MDM_CS_USER_COLLECT: //用户汇总
  1446. {
  1447. return OnTCPSocketMainUserCollect(Command.wSubCmdID, pData, wDataSize);
  1448. }
  1449. case MDM_CS_MANAGER_SERVICE: //管理服务
  1450. {
  1451. return OnTCPSocketMainManagerService(Command.wSubCmdID, pData, wDataSize);
  1452. }
  1453. //case MDM_CS_ANDROID_SERVICE: //机器服务
  1454. //{
  1455. // CTraceService::TraceString(TEXT("机器服务已屏蔽 MDM_CS_ANDROID_SERVICE"), TraceLevel_Warning);
  1456. // //return OnTCPSocketMainAndroidService(Command.wSubCmdID, pData, wDataSize);
  1457. //}
  1458. default: break;
  1459. }
  1460. }
  1461. //错误断言
  1462. ASSERT(FALSE);
  1463. return true;
  1464. }
  1465. //应答事件
  1466. bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID)
  1467. {
  1468. //变量定义
  1469. WORD wBindIndex = LOWORD(dwSocketID);
  1470. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  1471. //设置变量
  1472. if (pBindParameter != NULL)
  1473. {
  1474. pBindParameter->dwSocketID = dwSocketID;
  1475. pBindParameter->dwClientAddr = dwClientAddr;
  1476. TCHAR szClientAddr[16] = TEXT("");
  1477. BYTE * pClientAddr = (BYTE *)&pBindParameter->dwClientAddr;
  1478. _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  1479. pBindParameter->dwActiveTime = (DWORD)time(NULL);
  1480. m_Data.iSocketNum = wBindIndex + 1;
  1481. return true;
  1482. }
  1483. //错误断言
  1484. ASSERT(FALSE);
  1485. return false;
  1486. }
  1487. //关闭事件
  1488. bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID)
  1489. {
  1490. //变量定义
  1491. WORD wBindIndex = LOWORD(dwSocketID);
  1492. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  1493. if (pBindParameter == NULL) return false;
  1494. m_Data.iSocketNum = wBindIndex - 1;
  1495. //获取用户
  1496. IServerUserItem * pIServerUserItem = pBindParameter->pIServerUserItem;
  1497. WORD wTableID = INVALID_WORD;
  1498. //CString csTest1;
  1499. //csTest1.Format(_T("断线重连 UserID:%d dwSocketID:%d "), pIServerUserItem->GetUserID(), dwSocketID);
  1500. ////提示消息
  1501. //CTraceService::TraceString(csTest1, TraceLevel_Warning);
  1502. try
  1503. {
  1504. // 此部分代码意义表明:
  1505. // 在旁观状态,大厅状态,桌号为无效的状态下,断线将直接导致用户退出。人物信息从队列中删除。报告总服务器人物退出
  1506. // 其余状态下,用户保留绑定信息,变更为掉线状态 tagBindParameter 人物信息队列依然存在
  1507. // 用户处理
  1508. if (pIServerUserItem != NULL)
  1509. {
  1510. //变量定义
  1511. wTableID = pIServerUserItem->GetTableID();
  1512. //断线处理
  1513. if (wTableID != INVALID_TABLE
  1514. && pIServerUserItem->GetUserInfo()->cbUserStatus != US_LOOKON
  1515. && pIServerUserItem->GetUserInfo()->cbUserStatus != US_FREE
  1516. && pIServerUserItem->GetUserInfo()->cbUserStatus != US_NULL)
  1517. {
  1518. //解除绑定
  1519. pIServerUserItem->DetachBindStatus();
  1520. /*注释原因:没桌子时不要return出去 by yd
  1521. auto pTableFrame = GetTableFrame(wTableID);
  1522. if (!pTableFrame)
  1523. return false;
  1524. //TCHAR szString[512] = TEXT("");
  1525. //_sntprintf(szString, CountArray(szString), TEXT("游戏中用户 %s(%d) 掉线。"), pIServerUserItem->GetUserInfo()->szNickName, pIServerUserItem->GetUserInfo()->dwUserID);
  1526. //提示消息
  1527. //CTraceService::TraceString(szString, TraceLevel_Normal);
  1528. //断线通知
  1529. pTableFrame->OnEventUserOffLine(pIServerUserItem);
  1530. */
  1531. auto pTableFrame = GetTableFrame(wTableID);
  1532. if (pTableFrame != NULL)
  1533. {
  1534. //断线通知
  1535. pTableFrame->OnEventUserOffLine(pIServerUserItem);
  1536. }
  1537. }
  1538. else
  1539. {
  1540. if (pIServerUserItem->GetUserInfo()->cbUserStatus == US_LOOKON)
  1541. {
  1542. //清楚旁观者
  1543. if (wTableID != INVALID_TABLE)
  1544. {
  1545. auto pTableFrame = GetTableFrame(wTableID);
  1546. if (pTableFrame)
  1547. {
  1548. pTableFrame->PerformStandUpAction(pIServerUserItem);
  1549. }
  1550. }
  1551. }
  1552. //
  1553. pIServerUserItem->SetUserStatus(US_NULL, INVALID_TABLE, INVALID_CHAIR);
  1554. pIServerUserItem->DetachBindStatus(); //解除绑定的结果将导致tagBindParameter 中的人物指针不被释放 尝试解决。 by jn 2017/11/15
  1555. }
  1556. }
  1557. }
  1558. catch (...)
  1559. {
  1560. TCHAR szMessage[128] = TEXT("");
  1561. _sntprintf(szMessage, CountArray(szMessage), TEXT("关闭连接异常: wTableID=%d"), wTableID);
  1562. CTraceService::TraceString(szMessage, TraceLevel_Normal);
  1563. }
  1564. //清除信息
  1565. ZeroMemory(pBindParameter, sizeof(tagBindParameter));
  1566. return false;
  1567. }
  1568. CString CAttemperEngineSink::dwIP2csIP(DWORD dwIP)
  1569. {
  1570. CString strIP = _T("");
  1571. WORD add1, add2, add3, add4;
  1572. add1 = (WORD)(dwIP & 255);
  1573. add2 = (WORD)((dwIP >> 8) & 255);
  1574. add3 = (WORD)((dwIP >> 16) & 255);
  1575. add4 = (WORD)((dwIP >> 24) & 255);
  1576. strIP.Format(_T("%d.%d.%d.%d"), add1, add2, add3, add4);
  1577. return strIP;
  1578. }
  1579. //读取事件
  1580. bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1581. {
  1582. //记录 读取事件的日志
  1583. WORD wBindIndex = LOWORD(dwSocketID);
  1584. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  1585. DWORD dTableNum = 0;
  1586. CString AppName = _T("CorrespondServer");
  1587. CString csTest = AfxGetAppName();
  1588. CString csSend;
  1589. CString AppName1 = _T("中心集成服务器");
  1590. DWORD dUserID = 0;
  1591. if (!(Command.wSubCmdID == SUB_KN_DETECT_SOCKET && Command.wMainCmdID == MDM_KN_COMMAND)
  1592. && !(Command.wMainCmdID == 5 && Command.wSubCmdID == 3)
  1593. && !(Command.wMainCmdID == 2 && Command.wSubCmdID == 1 && (AppName1 == csTest || AppName == csTest)))
  1594. {
  1595. CString csTestT; CString csTest1 = AfxGetAppName();
  1596. if (pIBindUserItem)
  1597. {
  1598. csTestT.Format(_T("%s"), dwIP2csIP(pIBindUserItem->GetClientAddr()));
  1599. if (pIBindUserItem->GetTableID() != INVALID_TABLE)
  1600. {
  1601. auto pat = GetTableFrame(pIBindUserItem->GetTableID());
  1602. TCHAR szTemp[32] = { 0 };
  1603. if (pat) pat->GetPrivateTableID(szTemp, 32);
  1604. CString csTemp = szTemp;
  1605. if (pat != nullptr && !csTemp.IsEmpty())
  1606. {
  1607. dTableNum = _wtol(csTemp);
  1608. }
  1609. }
  1610. }
  1611. else
  1612. {
  1613. csTestT = _T("未知IP");
  1614. }
  1615. csSend.Format(_T("进程【%s】【接收】 <- %s 主命令码【%d】 子命令码【%d】\n\r"), csTest1, csTestT, Command.wMainCmdID, Command.wSubCmdID);
  1616. //OutputDebugString(csSend);
  1617. if (pIBindUserItem)
  1618. {
  1619. dUserID = pIBindUserItem->GetUserID();
  1620. }
  1621. Commend::ToShow(this, Command.wMainCmdID, Command.wSubCmdID, pData, wDataSize, dTableNum, pIBindUserItem == NULL ? NULL : dUserID, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString(), false);
  1622. }
  1623. //if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; }
  1624. bool bRet = false;
  1625. switch (Command.wMainCmdID)
  1626. {
  1627. case MDM_GR_LOGON: //登录命令
  1628. {
  1629. bRet = OnTCPNetworkMainLogon(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1630. break;
  1631. }
  1632. case MDM_GR_USER: //用户命令
  1633. {
  1634. bRet = OnTCPNetworkMainUser(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1635. break;
  1636. }
  1637. case MDM_GR_MANAGE: //管理命令
  1638. {
  1639. bRet = OnTCPNetworkMainManage(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1640. break;
  1641. }
  1642. case MDM_GR_CLUB: //俱乐部命令
  1643. {
  1644. bRet = OnTCPNetworkMainClub(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1645. break;
  1646. }
  1647. case MDM_GF_FRAME: //框架命令
  1648. {
  1649. bRet = OnTCPNetworkMainFrame(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1650. break;
  1651. }
  1652. case MDM_GF_GAME: //游戏命令
  1653. {
  1654. CTimer Start;
  1655. bRet = OnTCPNetworkMainGame(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1656. double dRet = Start.End();
  1657. if (IsJC(6666))
  1658. {
  1659. CString csTest1;
  1660. csTest1.Format(_T("游戏模块耗时 cmdid:%d ----> %.3f "), Command.wSubCmdID, dRet);
  1661. //提示消息
  1662. CTraceService::TraceString(csTest1, TraceLevel_Warning);
  1663. }
  1664. if (IsJC(5555) && dUserID != 0 && IsJC(dUserID))
  1665. {
  1666. CString csTest2;
  1667. csTest2.Format(_T("[%d]游戏模块耗时 cmdid:%d ----> %.3f "), dUserID, Command.wSubCmdID, dRet);
  1668. //提示消息
  1669. CTraceService::TraceString(csTest2, TraceLevel_Warning);
  1670. }
  1671. break;
  1672. }
  1673. case MDM_GF_ROULETEE: ///+++大转盘
  1674. {
  1675. bRet = OnTCPNetworkMainRoulette(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1676. break;
  1677. }
  1678. //case MDM_GR_INSURE: //银行命令
  1679. //{
  1680. // if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; }
  1681. // bRet = OnTCPNetworkMainInsure(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1682. //}
  1683. //case MDM_GR_TASK: //任务命令
  1684. //{
  1685. // if (pIBindUserItem == NULL) { m_Data.iLJErrQ++; return true; }
  1686. // bRet = OnTCPNetworkMainTask(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1687. //}
  1688. //case MDM_GR_EXCHANGE: //兑换命令
  1689. //{
  1690. // CTraceService::TraceString(TEXT("兑换命令已屏蔽 OnTCPNetworkMainExchange"), TraceLevel_Warning);
  1691. // //if (pIBindUserItem == NULL) return true;
  1692. // //bRet = OnTCPNetworkMainExchange(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1693. // break;
  1694. //}
  1695. //case MDM_GR_VENUE: ///+++场馆命令
  1696. //{
  1697. // bRet = OnTCPNetworkMainVenue(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1698. // break;
  1699. //}
  1700. //case MDM_GR_MATCH: //比赛命令
  1701. //{
  1702. // if (pIBindUserItem == NULL) return true;
  1703. // bRet = OnTCPNetworkMainMatch(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  1704. //}
  1705. case MDM_GR_CHECK: //通道检测
  1706. {
  1707. if (Command.wSubCmdID != 1) return false;
  1708. CTraceService::TraceString(TEXT("通道检测已屏蔽 MDM_GR_CHECK"), TraceLevel_Warning);
  1709. //效验参数
  1710. ASSERT(wDataSize == sizeof(CHECK));
  1711. if (wDataSize != sizeof(CHECK)) return false;
  1712. //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_CHECK, 1, pData, wDataSize);
  1713. return true;
  1714. }
  1715. default: break;
  1716. }
  1717. if (bRet)
  1718. {
  1719. m_Data.iQNum++;
  1720. }
  1721. else
  1722. {
  1723. m_Data.iErrQ++;
  1724. }
  1725. //ASSERT(bRet);
  1726. return bRet;
  1727. }
  1728. //房间消息
  1729. bool CAttemperEngineSink::SendRoomMessage(LPCTSTR lpszMessage, WORD wType)
  1730. {
  1731. //变量定义
  1732. CMD_CM_SystemMessage SystemMessage;
  1733. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  1734. //构造数据
  1735. SystemMessage.wType = wType;
  1736. SystemMessage.wLength = lstrlen(lpszMessage) + 1;
  1737. lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString));
  1738. //数据属性
  1739. WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString);
  1740. WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString);
  1741. CString csSend;
  1742. CString csTest = AfxGetAppName();
  1743. csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE);
  1744. //OutputDebugString(csSend);
  1745. Commend::ToShow(this, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize, 0, 0, m_pIGameServiceManager->GetDataString());
  1746. //发送数据
  1747. //m_AndroidUserManager.SendDataToClient(MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize);
  1748. m_pITCPNetworkEngine->SendDataBatch(MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize, BG_COMPUTER);
  1749. return true;
  1750. }
  1751. //游戏消息
  1752. bool CAttemperEngineSink::SendGameMessage(LPCTSTR lpszMessage, WORD wType)
  1753. {
  1754. //变量定义
  1755. CMD_CM_SystemMessage SystemMessage;
  1756. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  1757. //构造数据
  1758. SystemMessage.wType = wType;
  1759. SystemMessage.wLength = lstrlen(lpszMessage) + 1;
  1760. lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString));
  1761. //数据属性
  1762. WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString);
  1763. WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString);
  1764. CString csSend;
  1765. CString csTest = AfxGetAppName();
  1766. csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE);
  1767. //OutputDebugString(csSend);
  1768. Commend::ToShow(this, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, &SystemMessage, wSendSize, 0, 0, m_pIGameServiceManager->GetDataString());
  1769. GameInfo::PB_CS_S_SystemMessage Message;
  1770. Message.set_wtype(SystemMessage.wType);
  1771. Message.set_wlength(SystemMessage.wLength);
  1772. std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz;
  1773. Message.set_szstring(szString);
  1774. //发送数据
  1775. std::string pbdata = Message.SerializePartialAsString();
  1776. //发送数据
  1777. //m_AndroidUserManager.SendDataToClient(MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE,(void*)pbdata.c_str(), pbdata.length());
  1778. m_pITCPNetworkEngine->SendDataBatch(MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length(), BG_COMPUTER);
  1779. return true;
  1780. }
  1781. //房间消息
  1782. bool CAttemperEngineSink::SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType)
  1783. {
  1784. //效验参数
  1785. ASSERT(pIServerUserItem != NULL);
  1786. if (pIServerUserItem == NULL) return false;
  1787. //发送数据
  1788. if (pIServerUserItem->GetBindIndex() != INVALID_WORD)
  1789. {
  1790. //变量定义
  1791. CMD_CM_SystemMessage SystemMessage;
  1792. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  1793. //构造数据
  1794. SystemMessage.wType = wType;
  1795. SystemMessage.wLength = lstrlen(lpszMessage) + 1;
  1796. lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString));
  1797. //数据属性
  1798. WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString);
  1799. WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString);
  1800. //常规用户
  1801. if (pIServerUserItem == NULL) return false;
  1802. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  1803. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  1804. if (pBindParameter == NULL) return false;
  1805. GameInfo::PB_CS_S_SystemMessage Message;
  1806. Message.set_wtype(SystemMessage.wType);
  1807. Message.set_wlength(SystemMessage.wLength);
  1808. std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz;
  1809. Message.set_szstring(szString);
  1810. //发送数据
  1811. std::string pbdata = Message.SerializePartialAsString();
  1812. if (pBindParameter->dwSocketID != 0) m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length());
  1813. return true;
  1814. }
  1815. return false;
  1816. }
  1817. //游戏消息
  1818. bool CAttemperEngineSink::SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType)
  1819. {
  1820. //效验参数
  1821. ASSERT(pIServerUserItem != NULL);
  1822. if (pIServerUserItem == NULL) return false;
  1823. //发送数据
  1824. if ((pIServerUserItem->GetBindIndex() != INVALID_WORD) && (pIServerUserItem->IsClientReady() == true))
  1825. {
  1826. //变量定义
  1827. CMD_CM_SystemMessage SystemMessage;
  1828. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  1829. //构造数据
  1830. SystemMessage.wType = wType;
  1831. SystemMessage.wLength = lstrlen(lpszMessage) + 1;
  1832. lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString));
  1833. //变量定义
  1834. //WORD dwUserIndex = pIServerUserItem->GetBindIndex();
  1835. //tagBindParameter * pBindParameter = GetBindParameter(dwUserIndex);
  1836. //数据属性
  1837. WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString);
  1838. WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString);
  1839. //发送数据
  1840. if (pIServerUserItem->IsAndroidUser() == true)
  1841. {
  1842. //机器用户
  1843. const WORD wBindIndex = pIServerUserItem->GetBindIndex();
  1844. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  1845. GameInfo::PB_CS_S_SystemMessage Message;
  1846. Message.set_wtype(SystemMessage.wType);
  1847. Message.set_wlength(SystemMessage.wLength);
  1848. std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz;
  1849. Message.set_szstring(szString);
  1850. //发送数据
  1851. std::string pbdata = Message.SerializePartialAsString();
  1852. //m_AndroidUserManager.SendDataToClient(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length());
  1853. //关闭处理
  1854. //if ((wType&(SMT_CLOSE_ROOM | SMT_CLOSE_LINK)) != 0) m_AndroidUserManager.DeleteAndroidUserItem(pBindParameter->dwSocketID, true);
  1855. }
  1856. else
  1857. {
  1858. //常规用户
  1859. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  1860. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  1861. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  1862. DWORD dTableNum = 0;
  1863. if (pIBindUserItem->GetTableID() != INVALID_TABLE)
  1864. {
  1865. auto pat = GetTableFrame(pIBindUserItem->GetTableID());
  1866. TCHAR szTemp[32] = { 0 };
  1867. if (pat) pat->GetPrivateTableID(szTemp, 32);
  1868. CString csTemp = szTemp;
  1869. if (pat != nullptr && !csTemp.IsEmpty())
  1870. {
  1871. dTableNum = _wtol(csTemp);
  1872. }
  1873. }
  1874. CString csSend;
  1875. CString csTest = AfxGetAppName();
  1876. csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE);
  1877. //OutputDebugString(csSend);
  1878. 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());
  1879. GameInfo::PB_CS_S_SystemMessage Message;
  1880. Message.set_wtype(SystemMessage.wType);
  1881. Message.set_wlength(SystemMessage.wLength);
  1882. std::string szString = CW2AEX<1024>(SystemMessage.szString, CP_UTF8).m_psz;
  1883. Message.set_szstring(szString);
  1884. //发送数据
  1885. std::string pbdata = Message.SerializePartialAsString();
  1886. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, (void*)pbdata.c_str(), pbdata.length());
  1887. }
  1888. return true;
  1889. }
  1890. return false;
  1891. }
  1892. //同步事件
  1893. bool CAttemperEngineSink::OnTongBu(int Command, DWORD dwContextID, VOID * pData, WORD wDataSize)
  1894. {
  1895. switch (Command)
  1896. {
  1897. case DBO_GR_GAME_JC://监测
  1898. {
  1899. if (wDataSize == 0)
  1900. {
  1901. ZeroMemory(&m_JC, sizeof(m_JC));
  1902. }
  1903. else
  1904. {
  1905. ST_JCDATA * p = (ST_JCDATA *)pData;
  1906. m_JC = *p;
  1907. }
  1908. return true;
  1909. }
  1910. case TB_LOGINOK://登录成功
  1911. {
  1912. return OnDBLogonSuccessSend(dwContextID, pData, wDataSize);
  1913. }
  1914. case TB_GR_UPDATA://刷新元宝
  1915. {
  1916. return OnDBO_GR_GetBearnSEND(dwContextID, pData, wDataSize);
  1917. }
  1918. case TB_GR_ZJXF://直接扣除元宝
  1919. {
  1920. return OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND(dwContextID, pData, wDataSize);
  1921. }
  1922. case TB_GR_XF://从冻结中扣除元宝
  1923. {
  1924. return OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND(dwContextID, pData, wDataSize);
  1925. }
  1926. case TB_GR_UNLOCK://解冻元宝
  1927. {
  1928. return OnDBR_GR_USER_UNLOCK_BEANS_RETURNSEND(dwContextID, pData, wDataSize);
  1929. }
  1930. case TB_GR_LOCK://锁定元宝
  1931. {
  1932. return OnDBR_GR_USER_LOCK_BEANS_RETURNSEND(dwContextID, pData, wDataSize);
  1933. }
  1934. case DBO_GR_GAME_GG://发布公告
  1935. {
  1936. ASSERT(pData != NULL);
  1937. if (pData == NULL) return true;
  1938. ASSERT(wDataSize == sizeof(CMD_GR_SendMessage));
  1939. if (wDataSize != sizeof(CMD_GR_SendMessage)) return true;
  1940. return OnTCPNetworkSubSendMessage(pData, wDataSize);
  1941. }
  1942. case DBO_GR_STOP_GG://停止公告
  1943. {
  1944. RemoveSystemMessage();//清楚公告数据
  1945. return true;
  1946. }
  1947. case DBO_GR_GAME_CJ://本节点创建房间状态改变
  1948. {
  1949. int *p = (int*) pData;
  1950. if (*p == 1)
  1951. {
  1952. //允许创建
  1953. m_BCreate = TRUE;
  1954. }
  1955. else
  1956. {
  1957. //不允许创建
  1958. m_BCreate = FALSE;
  1959. }
  1960. return true;
  1961. }
  1962. case DBO_GR_GAME_HUA_CREATE://创建花牌房间得状态改变
  1963. {
  1964. int *p = (int*)pData;
  1965. if (*p == 1)
  1966. {
  1967. //允许创建
  1968. m_BCreate_Hua = TRUE;
  1969. }
  1970. else
  1971. {
  1972. //不允许创建
  1973. m_BCreate_Hua = FALSE;
  1974. }
  1975. return true;
  1976. }
  1977. case DBO_GR_GAME_JR://本节点加入房间控制状态改变
  1978. {
  1979. int *p = (int*)pData;
  1980. if (*p == 1)
  1981. {
  1982. //允许创建
  1983. m_BAddCreate = TRUE;
  1984. }
  1985. else
  1986. {
  1987. //不允许创建
  1988. m_BAddCreate = FALSE;
  1989. }
  1990. return true;
  1991. }
  1992. case DBO_GR_GAME_JSFREEALL://本节点解散所有空闲房间
  1993. {
  1994. loop1:
  1995. for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++)
  1996. {
  1997. if (iter->second != nullptr)
  1998. {
  1999. auto pTableFrame = iter->second;
  2000. TCHAR szTemp[32] = { 0 };
  2001. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  2002. CString csTemp = szTemp;
  2003. if (!csTemp.IsEmpty())
  2004. {
  2005. //解散 删除流程
  2006. if (pTableFrame->SetTableFree())
  2007. {
  2008. goto loop1;
  2009. }
  2010. }
  2011. }
  2012. }
  2013. return true;
  2014. }
  2015. case DBO_GR_GAME_WORK://当前节点是否提供服务
  2016. {
  2017. JN_GR_SERVICESTAT aa;
  2018. ZeroMemory(&aa, sizeof(aa));
  2019. aa.dwServerID = m_pGameServiceOption->wServerID;
  2020. int *pRoomID = (int*)pData;
  2021. aa.bService = *pRoomID;
  2022. m_Service = aa.bService;
  2023. UpdataServerStata(&aa, sizeof(JN_GR_SERVICESTAT));
  2024. return true;
  2025. }
  2026. case DBO_GR_GAME_JSGAMEALL://本节点解散所有游戏中房间
  2027. {
  2028. OnTCPNetworkSubKickAllUser();
  2029. return true;
  2030. }
  2031. case DBO_GR_GAME_JSROOM://本节点解散指定房间
  2032. {
  2033. int *pRoomID = (int*)pData;
  2034. CString csTest;
  2035. csTest.Format(L"%d", *pRoomID);
  2036. for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++)
  2037. {
  2038. if (iter->second != nullptr)
  2039. {
  2040. auto pTableFrame = iter->second;
  2041. TCHAR szTemp[32] = { 0 };
  2042. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  2043. CString csTemp = szTemp;
  2044. if (!csTemp.IsEmpty() && csTemp == csTest)
  2045. {
  2046. if (pTableFrame->GetStartCount() == 0)
  2047. {
  2048. pTableFrame->SetTableFree();
  2049. }
  2050. else
  2051. {
  2052. pTableFrame->DismissGame();
  2053. }
  2054. break;
  2055. }
  2056. }
  2057. }
  2058. return true;
  2059. }
  2060. case DBO_GR_GAME_FIND: //查询房间信息
  2061. {
  2062. int *pRoomID = (int*)pData;
  2063. CString csTest;
  2064. CGameServerDlg*p = (CGameServerDlg*)theApp.m_pMainWnd;
  2065. p->game1.SetWindowText(_T("等待数据中..."));
  2066. p->game2.SetWindowText(_T("等待数据中..."));
  2067. p->game3.SetWindowText(_T("等待数据中..."));
  2068. p->game4.SetWindowText(_T("等待数据中..."));
  2069. p->game5.SetWindowText(_T("等待数据中..."));
  2070. p->game6.SetWindowText(_T("等待数据中..."));
  2071. p->game7.SetWindowText(_T("等待数据中..."));
  2072. p->game8.SetWindowText(_T("等待数据中..."));
  2073. csTest.Format(L"%d", *pRoomID);
  2074. for (auto iter = m_TableFrameArray.begin(); iter != m_TableFrameArray.end(); iter++)
  2075. {
  2076. if (iter->second != nullptr)
  2077. {
  2078. auto pTableFrame = iter->second;
  2079. TCHAR szTemp[32] = { 0 };
  2080. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  2081. CString csTemp = szTemp;
  2082. if (csTemp != _T("") && csTemp == csTest)
  2083. {
  2084. CString csTestT;
  2085. csTestT.Format(_T("%s"), pTableFrame->IsGameStarted() ? _T("已开始"):_T("未开始"));
  2086. p->game1.SetWindowText(csTestT);//游戏状态
  2087. IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pTableFrame->GetPrivateTableOwnerID());
  2088. csTestT.Format(_T("%s(%d)"), pITargerUserItem == NULL ? _T("未找到昵称") :pITargerUserItem->GetNickName(), pTableFrame->GetPrivateTableOwnerID());
  2089. p->game2.SetWindowText(csTestT);//游戏状态
  2090. csTestT.Format(_T("%d"), pTableFrame->GetGameConfig().wPlayRule);
  2091. p->game3.SetWindowText(csTestT);//游戏状态
  2092. csTestT.Format(_T("%d"), pTableFrame->GetDrawCount());
  2093. p->game4.SetWindowText(csTestT);//游戏状态
  2094. pITargerUserItem = pTableFrame->GetTableUserItem(0);
  2095. csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName()
  2096. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID()
  2097. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus);
  2098. p->game5.SetWindowText(csTestT);//游戏状态
  2099. pITargerUserItem = pTableFrame->GetTableUserItem(1);
  2100. csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName()
  2101. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID()
  2102. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus);
  2103. p->game6.SetWindowText(csTestT);//游戏状态
  2104. pITargerUserItem = pTableFrame->GetTableUserItem(2);
  2105. csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName()
  2106. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID()
  2107. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus);
  2108. p->game7.SetWindowText(csTestT);//游戏状态
  2109. pITargerUserItem = pTableFrame->GetTableUserItem(3);
  2110. csTestT.Format(_T("%s(%d) 状态%d"), pITargerUserItem == NULL ? _T("没人") : pITargerUserItem->GetNickName()
  2111. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserID()
  2112. , pITargerUserItem == NULL ? 0 : pITargerUserItem->GetUserInfo()->cbUserStatus);
  2113. p->game8.SetWindowText(csTestT);//游戏状态
  2114. break;
  2115. }
  2116. }
  2117. }
  2118. return true;
  2119. }
  2120. case DBO_GR_SHUTDOWN_USER://强行断线指定用户
  2121. {
  2122. DWORD *pUserID = (DWORD*)pData;
  2123. WORD wEnumIndex = 0;
  2124. IServerUserItem * pITargerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  2125. while (pITargerUserItem != NULL)
  2126. {
  2127. if (pITargerUserItem->GetUserID() == *pUserID)
  2128. {
  2129. WORD dwUserIndex = pITargerUserItem->GetBindIndex();
  2130. tagBindParameter * pBindParameter = GetBindParameter(dwUserIndex);
  2131. if (pBindParameter)
  2132. {
  2133. m_pITCPNetworkEngine->CloseSocket(pBindParameter->dwSocketID);
  2134. }
  2135. break;
  2136. }
  2137. //枚举用户
  2138. pITargerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  2139. }
  2140. return true;
  2141. }
  2142. case DBO_GR_UPTONGDAO://更新通道
  2143. {
  2144. UpDataTongDao();
  2145. return true;
  2146. }
  2147. case DBO_GR_CLEAR://定时清空
  2148. {
  2149. //清除
  2150. m_MapUserIDJuli.RemoveAll();
  2151. m_UserID_2_PriTableIDGROUP.clear();
  2152. return true;
  2153. }
  2154. case DBO_GR_UPTONGDAOACK://更新通道处理完成
  2155. {
  2156. ASSERT(wDataSize == sizeof(LianLuGroup));
  2157. if (wDataSize != sizeof(LianLuGroup)) return true;
  2158. LianLuGroup *pGroup = static_cast<LianLuGroup*>(pData);
  2159. //枚举数据
  2160. POSITION Position = nullptr;
  2161. //枚举数据
  2162. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  2163. {
  2164. //获取数据
  2165. CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  2166. if (pGameServerItem == NULL) continue;
  2167. std::wstring cc = pGameServerItem->m_GameServer.szServerAddr;
  2168. std::wstring dd = pGroup->szAdminIP;
  2169. if (cc == dd)
  2170. {
  2171. for (int j = 0; j < MAX_TONGDAO; j++)
  2172. {
  2173. std::wstring ip = pGroup->Data[j].szIP;
  2174. if (ip == _T("")) continue;
  2175. pGameServerItem->SetLLStat(pGroup->Data[j].szIP, pGroup->Data[j].iIsOk, pGroup->Data[j].SystemTimeConclude);
  2176. //CString szString;
  2177. //szString.Format(L"通道更新->管理IP %s 通道IP %s 状态 %d", dd, pGroup->Data[i].szIP, pGroup->Data[i].iIsOk);
  2178. //提示消息
  2179. //CTraceService::TraceString(szString, TraceLevel_Normal);
  2180. }
  2181. }
  2182. }
  2183. return true;
  2184. }
  2185. default:
  2186. break;
  2187. }
  2188. return true;
  2189. }
  2190. //房间消息
  2191. bool CAttemperEngineSink::SendRoomMessage(DWORD dwSocketID, LPCTSTR lpszMessage, WORD wType, bool bAndroid)
  2192. {
  2193. //变量定义
  2194. CMD_CM_SystemMessage SystemMessage;
  2195. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  2196. //构造数据
  2197. SystemMessage.wType = wType;
  2198. SystemMessage.wLength = lstrlen(lpszMessage) + 1;
  2199. lstrcpyn(SystemMessage.szString, lpszMessage, CountArray(SystemMessage.szString));
  2200. //数据属性
  2201. WORD wHeadSize = sizeof(SystemMessage) - sizeof(SystemMessage.szString);
  2202. WORD wSendSize = wHeadSize + CountStringBuffer(SystemMessage.szString);
  2203. WORD wBindIndex = LOWORD(dwSocketID);
  2204. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  2205. DWORD dTableNum = 0;
  2206. if (pIBindUserItem->GetTableID() != INVALID_TABLE)
  2207. {
  2208. auto pat = GetTableFrame(pIBindUserItem->GetTableID());
  2209. TCHAR szTemp[32] = { 0 };
  2210. if (pat) pat->GetPrivateTableID(szTemp, 32);
  2211. CString csTemp = szTemp;
  2212. if (pat != nullptr && !csTemp.IsEmpty())
  2213. {
  2214. dTableNum = _wtol(csTemp);
  2215. }
  2216. }
  2217. //发送数据
  2218. if (bAndroid)
  2219. {
  2220. //机器用户
  2221. //m_AndroidUserManager.SendDataToClient(dwSocketID, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize);
  2222. }
  2223. else
  2224. {
  2225. CString csSend;
  2226. CString csTest = AfxGetAppName();
  2227. csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE);
  2228. //OutputDebugString(csSend);
  2229. 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());
  2230. //常规用户
  2231. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &SystemMessage, wSendSize);
  2232. }
  2233. return true;
  2234. }
  2235. //发送数据
  2236. bool CAttemperEngineSink::SendData(BYTE cbSendMask, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  2237. {
  2238. //机器数据
  2239. //if ((cbSendMask&BG_COMPUTER) != 0)
  2240. //{
  2241. // m_AndroidUserManager.SendDataToClient(wMainCmdID, wSubCmdID, pData, wDataSize);
  2242. //}
  2243. CString csSend;
  2244. CString csTest = AfxGetAppName();
  2245. csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID);
  2246. //OutputDebugString(csSend);
  2247. Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, 0, 0, m_pIGameServiceManager->GetDataString());
  2248. //用户数据
  2249. if (cbSendMask == BG_ALL_CLIENT)
  2250. {
  2251. m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, BG_MOBILE);
  2252. //m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, BG_COMPUTER, 0, m_pIGameServiceManager->GetDataString());
  2253. }
  2254. else
  2255. {
  2256. m_pITCPNetworkEngine->SendDataBatch(wMainCmdID, wSubCmdID, pData, wDataSize, cbSendMask);
  2257. }
  2258. return true;
  2259. }
  2260. //发送数据
  2261. bool CAttemperEngineSink::SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  2262. {
  2263. //发送数据
  2264. if (LOWORD(dwSocketID) != INVALID_WORD)
  2265. {
  2266. if (LOWORD(dwSocketID) >= INDEX_ANDROID)
  2267. {
  2268. //机器用户
  2269. //m_AndroidUserManager.SendDataToClient(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  2270. }
  2271. else
  2272. {
  2273. try
  2274. {
  2275. WORD wBindIndex = LOWORD(dwSocketID);
  2276. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  2277. DWORD dTableNum = 0;
  2278. if (pIBindUserItem && pIBindUserItem->GetTableID() != INVALID_TABLE)
  2279. {
  2280. auto pat = GetTableFrame(pIBindUserItem->GetTableID());
  2281. TCHAR szTemp[32] = { 0 };
  2282. if (pat) pat->GetPrivateTableID(szTemp, 32);
  2283. CString csTemp = szTemp;
  2284. if (pat != nullptr && !csTemp.IsEmpty())
  2285. {
  2286. dTableNum = _wtol(csTemp);
  2287. }
  2288. }
  2289. CString csSend;
  2290. CString csTest = AfxGetAppName();
  2291. csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID);
  2292. //OutputDebugString(csSend);
  2293. Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, dTableNum, pIBindUserItem == NULL ? NULL : pIBindUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  2294. }
  2295. catch (...)
  2296. {
  2297. }
  2298. //网络用户
  2299. m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  2300. }
  2301. }
  2302. return true;
  2303. }
  2304. //发送数据
  2305. bool CAttemperEngineSink::SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  2306. {
  2307. //效验参数
  2308. ASSERT(pIServerUserItem != NULL);
  2309. if (pIServerUserItem == NULL) return false;
  2310. //发送数据
  2311. if (pIServerUserItem->GetBindIndex() != INVALID_WORD)
  2312. {
  2313. if (pIServerUserItem->IsAndroidUser() == true)
  2314. {
  2315. //机器用户
  2316. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  2317. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  2318. //m_AndroidUserManager.SendDataToClient(pBindParameter->dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  2319. }
  2320. else
  2321. {
  2322. //常规用户
  2323. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  2324. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  2325. DWORD dTableNum = 0;
  2326. if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  2327. {
  2328. auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  2329. TCHAR szTemp[32] = { 0 };
  2330. if (pat) pat->GetPrivateTableID(szTemp, 32);
  2331. CString csTemp = szTemp;
  2332. if (pat != nullptr && !csTemp.IsEmpty())
  2333. {
  2334. dTableNum = _wtol(csTemp);
  2335. }
  2336. }
  2337. CString csSend;
  2338. CString csTest = AfxGetAppName();
  2339. csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), wMainCmdID, wSubCmdID);
  2340. //OutputDebugString(csSend);
  2341. //CTraceService::TraceString(csSend, TraceLevel_Normal);
  2342. Commend::ToShow(this, wMainCmdID, wSubCmdID, pData, wDataSize, dTableNum, pIServerUserItem == NULL ? NULL : pIServerUserItem->GetUserID(), m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  2343. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  2344. }
  2345. return true;
  2346. }
  2347. return false;
  2348. }
  2349. //群发数据
  2350. bool CAttemperEngineSink::SendDataBatchToMobileUser(WORD wCmdTable, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pUserItem)
  2351. {
  2352. //枚举用户
  2353. WORD wEnumIndex = 0;
  2354. while (wEnumIndex < m_ServerUserManager.GetUserItemCount())
  2355. {
  2356. //过滤用户
  2357. IServerUserItem *pIServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  2358. if (pIServerUserItem == NULL) continue;
  2359. if (!pIServerUserItem->IsMobileUser()) continue;
  2360. //if (pUserItem == pIServerUserItem) continue;//不再发给自己
  2361. if (MDM_GR_USER == wMainCmdID && SUB_GR_USER_STATUS == wSubCmdID)
  2362. {
  2363. //状态变化
  2364. CMD_GR_UserStatus *pUserStatus = (CMD_GR_UserStatus *)pData;
  2365. if (pUserStatus->UserStatus.cbUserStatus == US_LOOKON)
  2366. {
  2367. if (pUserItem != pIServerUserItem) continue;//不再给别人
  2368. }
  2369. }
  2370. //定义变量
  2371. WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule();
  2372. WORD wTagerTableID = pIServerUserItem->GetTableID();
  2373. bool bViewModeAll = ((wMobileUserRule&VIEW_MODE_ALL) != 0);
  2374. bool bRecviceGameChat = ((wMobileUserRule&RECVICE_GAME_CHAT) != 0);
  2375. bool bRecviceRoomChat = ((wMobileUserRule&RECVICE_ROOM_CHAT) != 0);
  2376. bool bRecviceRoomWhisper = ((wMobileUserRule&RECVICE_ROOM_WHISPER) != 0);
  2377. //状态过滤
  2378. if ((pIServerUserItem->GetUserStatus() >= US_SIT) && (m_pGameServiceOption->wServerType != GAME_GENRE_MATCH))
  2379. {
  2380. //如果玩家在房间里,则只广播给房间中的玩家
  2381. if (wTagerTableID != wCmdTable)
  2382. {
  2383. continue;
  2384. }
  2385. }
  2386. //聊天过滤
  2387. if (wSubCmdID == SUB_GR_USER_CHAT || wSubCmdID == SUB_GR_USER_EXPRESSION)
  2388. {
  2389. if (!bRecviceGameChat || !bRecviceRoomChat) continue; //如果玩家设置了不接受聊天消息,则不发送给他
  2390. }
  2391. if (wSubCmdID == SUB_GR_WISPER_CHAT || wSubCmdID == SUB_GR_WISPER_EXPRESSION)
  2392. {
  2393. if (!bRecviceRoomWhisper) continue; //如果玩家设置了不接受私聊消息,则不发送给他
  2394. }
  2395. if ((pIServerUserItem->GetUserStatus() == US_FREE))
  2396. {
  2397. if (wTagerTableID == INVALID_TABLE)
  2398. {
  2399. //如果玩家大厅,广播给自己。
  2400. if (pUserItem != pIServerUserItem) continue;
  2401. }
  2402. else
  2403. {
  2404. if (wTagerTableID != wCmdTable) continue;
  2405. }
  2406. }
  2407. //部分可视
  2408. if (!bViewModeAll)
  2409. {
  2410. //消息过滤
  2411. if (wSubCmdID == SUB_GR_USER_ENTER && wCmdTable == INVALID_TABLE) continue;
  2412. if (wSubCmdID == SUB_GR_USER_SCORE && pIServerUserItem->GetUserStatus() < US_SIT) continue;
  2413. ////定义变量
  2414. //WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos();
  2415. //WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount();
  2416. //状态消息过滤 取消分页过滤
  2417. //if (wCmdTable < wTagerDeskPos) continue;
  2418. //if (wCmdTable > (wTagerDeskPos + wTagerDeskCount - 1)) continue;
  2419. }
  2420. CMD_GR_UserStatus* UserStatus = (CMD_GR_UserStatus*)pData;
  2421. UserInfo::PB_CS_S_UserStatus Status;
  2422. Status.set_dwuserid(UserStatus->dwUserID);
  2423. Status.mutable_userstatus()->set_cbuserstatus(UserStatus->UserStatus.cbUserStatus);
  2424. Status.mutable_userstatus()->set_wchairid(UserStatus->UserStatus.wChairID);
  2425. Status.mutable_userstatus()->set_wtableid(UserStatus->UserStatus.wTableID);
  2426. //发送数据
  2427. std::string pbdata = Status.SerializePartialAsString();
  2428. SendData(pIServerUserItem, wMainCmdID, wSubCmdID, (void*)pbdata.c_str(), pbdata.length());
  2429. }
  2430. return true;
  2431. }
  2432. //用户积分
  2433. bool CAttemperEngineSink::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason)
  2434. {
  2435. //效验参数
  2436. ASSERT(pIServerUserItem != NULL);
  2437. if (pIServerUserItem == NULL) return false;
  2438. //变量定义
  2439. /*CMD_GR_UserScore UserScore;
  2440. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  2441. //构造积分
  2442. UserScore.UserScore.lScore = pUserInfo->lScore;
  2443. UserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  2444. UserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  2445. //发送数据
  2446. SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore));
  2447. //变量定义
  2448. CMD_GR_MobileUserScore MobileUserScore;
  2449. //构造数据
  2450. MobileUserScore.dwUserID = pUserInfo->dwUserID;
  2451. //构造积分
  2452. MobileUserScore.UserScore.lScore = pUserInfo->lScore;
  2453. MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  2454. MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  2455. //发送数据
  2456. SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore));
  2457. */
  2458. //即时写分
  2459. if ((CServerRule::IsImmediateWriteScore(m_pGameServiceOption->dwServerRule) == true) && (pIServerUserItem->IsVariation() == true))
  2460. {
  2461. //变量定义
  2462. DBR_GR_WriteGameScore WriteGameScore;
  2463. ZeroMemory(&WriteGameScore, sizeof(WriteGameScore));
  2464. //用户信息
  2465. WriteGameScore.dwUserID = pIServerUserItem->GetUserID();
  2466. WriteGameScore.dwDBQuestID = pIServerUserItem->GetDBQuestID();
  2467. WriteGameScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  2468. WriteGameScore.dwInoutIndex = pIServerUserItem->GetInoutIndex();
  2469. //提取积分
  2470. pIServerUserItem->DistillVariation(WriteGameScore.VariationInfo);
  2471. //调整分数
  2472. if (pIServerUserItem->IsAndroidUser() == true)
  2473. {
  2474. WriteGameScore.VariationInfo.lScore = 0;
  2475. WriteGameScore.VariationInfo.lGrade = 0;
  2476. WriteGameScore.VariationInfo.lInsure = 0;
  2477. }
  2478. //查找任务
  2479. //tagUserTaskEntry * pUserTaskEntry = m_UserTaskManager.GetUserTaskEntry(pIServerUserItem->GetUserID(), TASK_STATUS_UNFINISH);
  2480. //if (pUserTaskEntry != NULL) WriteGameScore.bTaskForward = true;
  2481. //投递请求
  2482. m_pIDBCorrespondManager->PostDataBaseRequest(WriteGameScore.dwUserID, DBR_GR_WRITE_GAME_SCORE, 0L, &WriteGameScore, sizeof(WriteGameScore), TRUE);
  2483. //推进任务
  2484. //if (pUserTaskEntry != NULL)
  2485. //{
  2486. // PerformTaskProgress(pIServerUserItem, pUserTaskEntry, WriteGameScore.VariationInfo.dwWinCount, WriteGameScore.VariationInfo.dwLostCount, WriteGameScore.VariationInfo.dwDrawCount);
  2487. //}
  2488. }
  2489. //通知桌子
  2490. auto wTableID = pIServerUserItem->GetTableID();
  2491. if (wTableID != INVALID_TABLE)
  2492. {
  2493. auto pTableFrame = GetTableFrame(wTableID);
  2494. if (!pTableFrame)
  2495. return false;
  2496. pTableFrame->OnUserScroeNotify(pIServerUserItem->GetChairID(), pIServerUserItem, cbReason);
  2497. }
  2498. return true;
  2499. }
  2500. //用户状态
  2501. bool CAttemperEngineSink::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID, bool bSendState)
  2502. {
  2503. //效验参数
  2504. ASSERT(pIServerUserItem != NULL);
  2505. if (pIServerUserItem == NULL) return false;
  2506. //变量定义
  2507. CMD_GR_UserStatus UserStatus;
  2508. ZeroMemory(&UserStatus, sizeof(UserStatus));
  2509. //构造数据
  2510. UserStatus.dwUserID = pIServerUserItem->GetUserID();
  2511. UserStatus.UserStatus.wTableID = pIServerUserItem->GetTableID();
  2512. UserStatus.UserStatus.wChairID = pIServerUserItem->GetChairID();
  2513. UserStatus.UserStatus.cbUserStatus = pIServerUserItem->GetUserStatus();
  2514. //修改信息
  2515. if (pIServerUserItem->GetUserStatus() == US_SIT && pIServerUserItem->IsMobileUser())
  2516. {
  2517. //定义变量
  2518. WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos();
  2519. WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount();
  2520. if (pIServerUserItem->GetTableID() > (wTagerDeskPos + wTagerDeskCount - 1))
  2521. {
  2522. //定义变量
  2523. WORD wNewDeskPos = (pIServerUserItem->GetTableID() / wTagerDeskCount)*wTagerDeskCount;
  2524. //修改信息
  2525. pIServerUserItem->SetMobileUserDeskPos(wNewDeskPos);
  2526. }
  2527. }
  2528. if (!bSendState)
  2529. {
  2530. if (pIServerUserItem->GetUserStatus() == US_SIT
  2531. || pIServerUserItem->GetUserStatus() == US_READY
  2532. || pIServerUserItem->GetUserStatus() == US_PLAYING
  2533. || pIServerUserItem->GetUserStatus() == US_LOOKON
  2534. || pIServerUserItem->GetUserStatus() == US_PLAYINGWAIT)
  2535. {
  2536. SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_STATUS, &UserStatus, sizeof(UserStatus), pIServerUserItem);
  2537. if (UserStatus.UserStatus.cbUserStatus == US_SIT)
  2538. {
  2539. //是坐下,推送当前用户的用户信息。
  2540. if (UserStatus.UserStatus.wChairID != INVALID_CHAIR)
  2541. {
  2542. //变量定义
  2543. tagMobileUserInfoHead pUserInfoHead;
  2544. tagUserInfo *pUserInfo = pIServerUserItem->GetUserInfo();
  2545. //用户属性
  2546. pUserInfoHead.wFaceID = pUserInfo->wFaceID;
  2547. pUserInfoHead.dwGameID = pUserInfo->dwGameID;
  2548. pUserInfoHead.dwUserID = pUserInfo->dwUserID;
  2549. pUserInfoHead.dwCustomID = pUserInfo->dwCustomID;
  2550. //用户属性
  2551. pUserInfoHead.cbGender = pUserInfo->cbGender;
  2552. pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder;
  2553. //用户状态
  2554. pUserInfoHead.wTableID = pUserInfo->wTableID;
  2555. pUserInfoHead.wChairID = pUserInfo->wChairID;
  2556. pUserInfoHead.cbUserStatus = US_SIT;
  2557. //用户局数
  2558. pUserInfoHead.dwWinCount = pUserInfo->dwWinCount;
  2559. pUserInfoHead.dwLostCount = pUserInfo->dwLostCount;
  2560. pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount;
  2561. pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount;
  2562. pUserInfoHead.dwExperience = pUserInfo->dwExperience;
  2563. pUserInfoHead.iJiePing = pUserInfo->llJiePing;
  2564. pUserInfoHead.iXinYong = pUserInfo->iXinYong;
  2565. pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX;
  2566. pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY;
  2567. lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate));
  2568. lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi));
  2569. //用户成绩
  2570. pUserInfoHead.lScore = pUserInfo->lScore;
  2571. pUserInfoHead.lScore += pIServerUserItem->GetTrusteeScore();
  2572. pUserInfoHead.lScore += pIServerUserItem->GetFrozenedScore();
  2573. lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName));
  2574. //用户头像地址
  2575. lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl));
  2576. //IP地址
  2577. pUserInfoHead.dwClientAddr = pIServerUserItem->GetClientAddr();
  2578. UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead;
  2579. UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID);
  2580. UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID);
  2581. UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID);
  2582. UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID);
  2583. UserInfoHead.set_cbgender(pUserInfoHead.cbGender);
  2584. UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder);
  2585. UserInfoHead.set_wtableid(pUserInfoHead.wTableID);
  2586. UserInfoHead.set_wchairid(pUserInfoHead.wChairID);
  2587. UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus);
  2588. UserInfoHead.set_lscore(pUserInfoHead.lScore);
  2589. UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount);
  2590. UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount);
  2591. UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount);
  2592. UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount);
  2593. UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience);
  2594. std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz;
  2595. std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz;
  2596. UserInfoHead.set_sznickname(szNickname);
  2597. UserInfoHead.set_szheadurl(szHeadUrl);
  2598. UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr);
  2599. UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong);
  2600. std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz;
  2601. std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz;
  2602. UserInfoHead.set_rettime(RetTime);
  2603. UserInfoHead.set_chengshi(ChengShi);
  2604. UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX);
  2605. UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY);
  2606. UserInfoHead.set_ijieping(pUserInfoHead.iJiePing);
  2607. auto pCTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  2608. if (pCTableFrame)
  2609. {
  2610. for (int j = 0; j < pCTableFrame->GetChairCount(); j++)
  2611. {
  2612. IServerUserItem * pTemp = pCTableFrame->GetTableUserItem(j);
  2613. if (pTemp && pTemp != pIServerUserItem)
  2614. {
  2615. //发送数据
  2616. std::string pbdata = UserInfoHead.SerializePartialAsString();
  2617. SendData(pTemp, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  2618. }
  2619. }
  2620. WORD wEnumIndex = 0;
  2621. do
  2622. {
  2623. //获取用户
  2624. IServerUserItem * pTemp = pCTableFrame->EnumLookonUserItem(wEnumIndex++);
  2625. if (pTemp == NULL) break;
  2626. //发送数据
  2627. std::string pbdata = UserInfoHead.SerializePartialAsString();
  2628. SendData(pTemp, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  2629. } while (true);
  2630. }
  2631. }
  2632. }
  2633. }
  2634. else
  2635. {
  2636. SendDataBatchToMobileUser(wOldTableID, MDM_GR_USER, SUB_GR_USER_STATUS, &UserStatus, sizeof(UserStatus), pIServerUserItem);
  2637. }
  2638. }
  2639. //返回大厅
  2640. if (pIServerUserItem->GetUserStatus() == US_FREE)
  2641. {
  2642. pIServerUserItem->GetUserInfo()->wChairID = INVALID_CHAIR;
  2643. pIServerUserItem->GetUserInfo()->wTableID = INVALID_TABLE;
  2644. }
  2645. //离开判断
  2646. if (pIServerUserItem->GetUserStatus() == US_NULL)
  2647. {
  2648. //获取绑定
  2649. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  2650. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  2651. //绑带处理
  2652. if (pBindParameter != NULL)
  2653. {
  2654. //绑定处理
  2655. if (pBindParameter->pIServerUserItem == pIServerUserItem)
  2656. {
  2657. pBindParameter->pIServerUserItem = NULL;
  2658. }
  2659. //中断网络
  2660. if (pBindParameter->dwSocketID != 0L)
  2661. {
  2662. if (LOWORD(pBindParameter->dwSocketID) >= INDEX_ANDROID)
  2663. {
  2664. //m_AndroidUserManager.DeleteAndroidUserItem(pBindParameter->dwSocketID, false);
  2665. }
  2666. else
  2667. {
  2668. m_pITCPNetworkEngine->ShutDownSocket(pBindParameter->dwSocketID);
  2669. }
  2670. }
  2671. }
  2672. //离开处理
  2673. OnEventUserLogout(pIServerUserItem, 0L);
  2674. }
  2675. return true;
  2676. }
  2677. //用户权限
  2678. bool CAttemperEngineSink::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind)
  2679. {
  2680. //效验参数
  2681. ASSERT(pIServerUserItem != NULL);
  2682. if (pIServerUserItem == NULL) return false;
  2683. //变量定义
  2684. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  2685. //比赛权限
  2686. DBR_GR_ManageUserRight ManageUserRight;
  2687. ZeroMemory(&ManageUserRight, sizeof(ManageUserRight));
  2688. ManageUserRight.dwUserID = pUserInfo->dwUserID;
  2689. ManageUserRight.dwAddRight = dwAddRight;
  2690. ManageUserRight.dwRemoveRight = dwRemoveRight;
  2691. ManageUserRight.bGameRight = cbRightKind == UR_KIND_GAME;
  2692. CTraceService::TraceString(TEXT("用户权限已屏蔽 OnEventUserItemRight"), TraceLevel_Warning);
  2693. //发送请求
  2694. //m_pIDBCorrespondManager->PostDataBaseRequest(ManageUserRight.dwUserID, DBR_GR_MANAGE_USER_RIGHT, 0, &ManageUserRight, sizeof(ManageUserRight));
  2695. return true;
  2696. }
  2697. //登录成功
  2698. bool CAttemperEngineSink::OnDBLogonSuccessSend(DWORD dwContextID, VOID * pData, WORD wDataSize)
  2699. {
  2700. DBO_GR_LogonSuccess ** pLogon = (DBO_GR_LogonSuccess **)pData;
  2701. if (wDataSize != sizeof(PVOID))
  2702. {
  2703. ASSERT(FALSE);
  2704. return false;
  2705. }
  2706. CTraceService::TraceString(TEXT("登录成功 OnDBLogonSuccess"), TraceLevel_Debug);
  2707. //变量定义
  2708. WORD wBindIndex = LOWORD(dwContextID);
  2709. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  2710. DBO_GR_LogonSuccess * pDBOLogonSuccess = *pLogon;
  2711. if (pBindParameter == NULL)
  2712. {
  2713. CTraceService::TraceString(TEXT("pBindParameter == NULL"), TraceLevel_Warning);
  2714. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2715. return false;
  2716. }
  2717. //废弃判断
  2718. if ((pBindParameter->pIServerUserItem != NULL) || (pBindParameter->dwSocketID != dwContextID))
  2719. {
  2720. CTraceService::TraceString(TEXT("(pBindParameter->pIServerUserItem != NULL) || (pBindParameter->dwSocketID != dwContextID)"), TraceLevel_Warning);
  2721. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2722. return false;
  2723. }
  2724. //解除锁定
  2725. //PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_NORMAL);
  2726. //变量定义
  2727. bool bAndroidUser = (wBindIndex >= INDEX_ANDROID);
  2728. bool bMobileUser = (pBindParameter->cbClientKind == CLIENT_KIND_MOBILE);
  2729. //切换判断
  2730. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pDBOLogonSuccess->dwUserID);
  2731. if (pIServerUserItem != NULL)
  2732. {
  2733. CTraceService::TraceString(TEXT("pIServerUserItem != NULL 切换判断"), TraceLevel_Warning);
  2734. auto _iter = Socket_2_UserID.find(dwContextID);
  2735. if (_iter != Socket_2_UserID.end() && pDBOLogonSuccess->dwUserID != _iter->second)
  2736. {
  2737. ASSERT(FALSE);
  2738. }
  2739. //切换用户
  2740. SwitchUserItemConnect(pIServerUserItem, pDBOLogonSuccess->szMachineID, wBindIndex, pDBOLogonSuccess->cbDeviceType, pDBOLogonSuccess->wBehaviorFlags, pDBOLogonSuccess->wPageTableCount);
  2741. //解除锁定
  2742. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_USER_IMPACT);
  2743. //需要补发房间列表
  2744. DWORD dwUserID = pDBOLogonSuccess->dwUserID;
  2745. //清空本地的缓存
  2746. auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID);
  2747. if (iter != m_UserID_2_PriTableIDGROUP.end())
  2748. {
  2749. m_UserID_2_PriTableIDGROUP.erase(dwUserID);
  2750. }
  2751. //汇总用户(所有数据从协调拉取)
  2752. if (m_bCollectUser == true)
  2753. {
  2754. //变量定义
  2755. CMD_CS_C_UserEnter UserEnter;
  2756. ZeroMemory(&UserEnter, sizeof(UserEnter));
  2757. //设置变量
  2758. UserEnter.dwUserID = pIServerUserItem->GetUserID();
  2759. UserEnter.dwGameID = pIServerUserItem->GetGameID();
  2760. //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName));
  2761. //辅助信息
  2762. UserEnter.cbGender = pIServerUserItem->GetGender();
  2763. UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder();
  2764. UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder();
  2765. //发送消息
  2766. ASSERT(m_pITCPSocketService != NULL);
  2767. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, &UserEnter, sizeof(UserEnter));
  2768. //MessageDef::PB_CS_C_UserEnter pUserEnter;
  2769. //pUserEnter.set_dwuserid(pIServerUserItem->GetUserID());
  2770. //pUserEnter.set_dwgameid(pIServerUserItem->GetGameID());
  2771. //pUserEnter.set_cbgender(pIServerUserItem->GetGender());
  2772. //pUserEnter.set_cbmemberorder(pIServerUserItem->GetMemberOrder());
  2773. //pUserEnter.set_cbmasterorder(pIServerUserItem->GetMasterOrder());
  2774. //std::string pbdata = pUserEnter.SerializePartialAsString();
  2775. ////unsigned char* raw_data = ;
  2776. //m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  2777. }
  2778. //从新申请列表
  2779. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2780. return true;
  2781. }
  2782. //维护判断
  2783. if ((CServerRule::IsForfendRoomEnter(m_pGameServiceOption->dwServerRule) == true) && (pDBOLogonSuccess->cbMasterOrder == 0))
  2784. {
  2785. CTraceService::TraceString(TEXT("维护判断"), TraceLevel_Warning);
  2786. //发送失败
  2787. SendLogonFailure(TEXT("抱歉,由于系统维护的原因,当前游戏房间禁止用户进入!"), 0, pBindParameter->dwSocketID);
  2788. //解除锁定
  2789. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SYSTEM);
  2790. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2791. return true;
  2792. }
  2793. //查找机器
  2794. //if (bAndroidUser == true && m_pGameServiceOption->wServerType != GAME_GENRE_MATCH)
  2795. //{
  2796. // CTraceService::TraceString(TEXT("查找机器"), TraceLevel_Warning);
  2797. // //查找机器
  2798. // DWORD dwUserID = pDBOLogonSuccess->dwUserID;
  2799. // IAndroidUserItem * pIAndroidUserItem = m_AndroidUserManager.SearchAndroidUserItem(dwUserID, dwContextID);
  2800. // //修改积分
  2801. // if (pIAndroidUserItem != NULL)
  2802. // {
  2803. // //获取配置
  2804. // tagAndroidParameter * pAndroidParameter = pIAndroidUserItem->GetAndroidParameter();
  2805. // //调整积分
  2806. // if ((pAndroidParameter->lTakeMinScore != 0L) && (pAndroidParameter->lTakeMaxScore != 0L))
  2807. // {
  2808. // //变量定义
  2809. // SCORE lTakeMinScore = (SCORE)pAndroidParameter->lTakeMinScore;
  2810. // SCORE lTakeMaxScore = (SCORE)__max(pAndroidParameter->lTakeMaxScore, pAndroidParameter->lTakeMinScore);
  2811. // //调整积分
  2812. // if ((lTakeMaxScore - lTakeMinScore) > 0L)
  2813. // {
  2814. // SCORE lTakeScore = (lTakeMaxScore - lTakeMinScore) / 10;
  2815. // pDBOLogonSuccess->lScore = (SCORE)(lTakeMinScore + (rand() % 10)*lTakeScore + rand() % lTakeScore);
  2816. // }
  2817. // else
  2818. // {
  2819. // pDBOLogonSuccess->lScore = (SCORE)lTakeMaxScore;
  2820. // }
  2821. // }
  2822. // }
  2823. //}
  2824. //最低分数
  2825. if ((m_pGameServiceOption->lMinEnterScore != 0L) && (pDBOLogonSuccess->lScore < m_pGameServiceOption->lMinEnterScore))
  2826. {
  2827. CTraceService::TraceString(TEXT("最低分数"), TraceLevel_Warning);
  2828. //发送失败
  2829. TCHAR szMsg[128] = TEXT("");
  2830. _sntprintf(szMsg, CountArray(szMsg), TEXT("抱歉,您的游戏成绩低于当前游戏房间的最低进入成绩%I64d,不能进入当前游戏房间!"), m_pGameServiceOption->lMinEnterScore);
  2831. SendLogonFailure(szMsg, 0, pBindParameter->dwSocketID);
  2832. //解除锁定
  2833. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS);
  2834. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2835. return true;
  2836. }
  2837. //最高分数
  2838. if ((m_pGameServiceOption->lMaxEnterScore != 0L) && (pDBOLogonSuccess->lScore > m_pGameServiceOption->lMaxEnterScore))
  2839. {
  2840. CTraceService::TraceString(TEXT("最高分数"), TraceLevel_Warning);
  2841. //发送失败
  2842. TCHAR szMsg[128] = TEXT("");
  2843. _sntprintf(szMsg, CountArray(szMsg), TEXT("抱歉,您的游戏成绩高于当前游戏房间的最高进入成绩%I64d,不能进入当前游戏房间!"), m_pGameServiceOption->lMaxEnterScore);
  2844. SendLogonFailure(szMsg, 0, pBindParameter->dwSocketID);
  2845. //解除锁定
  2846. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS);
  2847. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2848. return true;
  2849. }
  2850. //会员判断
  2851. if (m_pGameServiceOption->cbMinEnterMember != 0 && pDBOLogonSuccess->cbMemberOrder < m_pGameServiceOption->cbMinEnterMember && (pDBOLogonSuccess->cbMasterOrder == 0))
  2852. {
  2853. CTraceService::TraceString(TEXT("会员判断"), TraceLevel_Warning);
  2854. //发送失败
  2855. SendLogonFailure(TEXT("抱歉,您的会员级别低于当前游戏房间的最低进入会员条件,不能进入当前游戏房间!"), 0, pBindParameter->dwSocketID);
  2856. //解除锁定
  2857. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS);
  2858. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2859. return true;
  2860. }
  2861. //会员判断
  2862. if (m_pGameServiceOption->cbMaxEnterMember != 0 && pDBOLogonSuccess->cbMemberOrder > m_pGameServiceOption->cbMaxEnterMember && (pDBOLogonSuccess->cbMasterOrder == 0))
  2863. {
  2864. CTraceService::TraceString(TEXT("会员判断"), TraceLevel_Warning);
  2865. //发送失败
  2866. SendLogonFailure(TEXT("抱歉,您的会员级别高于当前游戏房间的最高进入会员条件,不能进入当前游戏房间!"), 0, pBindParameter->dwSocketID);
  2867. //解除锁定
  2868. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_CONDITIONS);
  2869. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2870. return true;
  2871. }
  2872. //满人判断
  2873. WORD wMaxPlayer = m_pGameServiceOption->wMaxPlayer;
  2874. DWORD dwOnlineCount = m_ServerUserManager.GetUserItemCount();
  2875. if ((pDBOLogonSuccess->cbMasterOrder == 0) && (dwOnlineCount > (DWORD)(wMaxPlayer - RESERVE_USER_COUNT)))
  2876. {
  2877. //发送失败
  2878. SendLogonFailure(TEXT("抱歉,此房间已经人满啦!"), 66, pBindParameter->dwSocketID);
  2879. //解除锁定
  2880. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_FULL);
  2881. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2882. return true;
  2883. }
  2884. //用户变量
  2885. tagUserInfo UserInfo;
  2886. tagUserInfoPlus UserInfoPlus;
  2887. ZeroMemory(&UserInfo, sizeof(UserInfo));
  2888. ZeroMemory(&UserInfoPlus, sizeof(UserInfoPlus));
  2889. //属性资料
  2890. UserInfo.llJiePing = pDBOLogonSuccess->llJiePing;
  2891. UserInfo.iXinYong = pDBOLogonSuccess->iXinYong;
  2892. UserInfo.wFaceID = pDBOLogonSuccess->wFaceID;
  2893. UserInfo.dwUserID = pDBOLogonSuccess->dwUserID;
  2894. UserInfo.dwGameID = 305;// pDBOLogonSuccess->dwGameID;
  2895. UserInfo.dwGroupID = pDBOLogonSuccess->dwGroupID;
  2896. UserInfo.dwCustomID = pDBOLogonSuccess->dwCustomID;
  2897. lstrcpyn(UserInfo.RegisterDate, pDBOLogonSuccess->RegTime, CountArray(UserInfo.RegisterDate));
  2898. lstrcpyn(UserInfo.szNickName, pDBOLogonSuccess->szNickName, CountArray(UserInfo.szNickName));
  2899. UserInfo.szNickName[31] = 0;
  2900. lstrcpyn(UserInfo.szUnionID, pDBOLogonSuccess->szUnionID, CountArray(UserInfo.szUnionID));
  2901. UserInfo.dDaiLi = pDBOLogonSuccess->dDaiLi;
  2902. lstrcpyn(UserInfo.szUnionID, pDBOLogonSuccess->szUnionID, CountArray(UserInfo.szUnionID));
  2903. //用户资料
  2904. UserInfo.cbGender = pDBOLogonSuccess->cbGender;
  2905. UserInfo.cbMemberOrder = pDBOLogonSuccess->cbMemberOrder;
  2906. UserInfo.cbMasterOrder = pDBOLogonSuccess->cbMasterOrder;
  2907. //lstrcpyn(UserInfo.szGroupName, pDBOLogonSuccess->szGroupName, CountArray(UserInfo.szGroupName));
  2908. //lstrcpyn(UserInfo.szUnderWrite, pDBOLogonSuccess->szUnderWrite, CountArray(UserInfo.szUnderWrite));
  2909. UserInfo.llJuLi = _wtoll(pDBOLogonSuccess->szDescribeString);
  2910. //状态设置
  2911. UserInfo.cbUserStatus = US_FREE;
  2912. UserInfo.wTableID = INVALID_TABLE;
  2913. UserInfo.wChairID = INVALID_CHAIR;
  2914. //积分信息
  2915. UserInfo.lScore = pDBOLogonSuccess->lScore;
  2916. UserInfo.dwBean = pDBOLogonSuccess->dwBean;
  2917. UserInfo.lGrade = pDBOLogonSuccess->lGrade;
  2918. //UserInfo.lIngot = pDBOLogonSuccess->lIngot;
  2919. UserInfo.lInsure = pDBOLogonSuccess->lInsure;
  2920. UserInfo.dwWinCount = pDBOLogonSuccess->dwWinCount;
  2921. UserInfo.dwLostCount = pDBOLogonSuccess->dwLostCount;
  2922. UserInfo.dwDrawCount = pDBOLogonSuccess->dwDrawCount;
  2923. UserInfo.dwFleeCount = pDBOLogonSuccess->dwFleeCount;
  2924. UserInfo.dwExperience = pDBOLogonSuccess->dwExperience;
  2925. UserInfo.lLoveLiness = pDBOLogonSuccess->lLoveLiness;
  2926. UserInfo.dDingWeiX = pDBOLogonSuccess->dX;
  2927. UserInfo.dDingWeiY = pDBOLogonSuccess->dY;
  2928. lstrcpyn(UserInfo.szChengShi, pDBOLogonSuccess->szChengShi, CountArray(pDBOLogonSuccess->szChengShi));
  2929. lstrcpyn(UserInfo.szHeadUrl, pDBOLogonSuccess->szHeadUrl, CountArray(pDBOLogonSuccess->szHeadUrl));
  2930. UserInfo.LeiJiZuanShi = pDBOLogonSuccess->LeiJiZuanShi;
  2931. UserInfo.GouMaiZuanShi = pDBOLogonSuccess->GouMaiZuanShi;
  2932. //俱乐部信息
  2933. CopyMemory(UserInfo.dwClubID, pDBOLogonSuccess->dwClubID, sizeof(pDBOLogonSuccess->dwClubID));
  2934. if (IsJC(UserInfo.dwUserID))
  2935. {
  2936. CString csTestB;
  2937. csTestB.Format(_T("登陆获取以钻石信息 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), UserInfo.GouMaiZuanShi, UserInfo.LeiJiZuanShi, UserInfo.dwUserID);
  2938. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  2939. }
  2940. //登录信息
  2941. UserInfoPlus.dwLogonTime = (DWORD)time(NULL);
  2942. UserInfoPlus.dwInoutIndex = pDBOLogonSuccess->dwInoutIndex;
  2943. //用户权限
  2944. UserInfoPlus.dwUserRight = pDBOLogonSuccess->dwUserRight;
  2945. UserInfoPlus.dwMasterRight = pDBOLogonSuccess->dwMasterRight;
  2946. //辅助变量
  2947. UserInfoPlus.bMobileUser = bMobileUser;
  2948. UserInfoPlus.bAndroidUser = bAndroidUser;
  2949. UserInfoPlus.lRestrictScore = m_pGameServiceOption->lRestrictScore;
  2950. lstrcpyn(UserInfoPlus.szPassword, pDBOLogonSuccess->szPassword, CountArray(UserInfoPlus.szPassword));
  2951. //连接信息
  2952. UserInfoPlus.wBindIndex = wBindIndex;
  2953. UserInfoPlus.dwClientAddr = pBindParameter->dwClientAddr;
  2954. lstrcpyn(UserInfoPlus.szMachineID, pDBOLogonSuccess->szMachineID, CountArray(UserInfoPlus.szMachineID));
  2955. lstrcpyn(UserInfo.szName, pDBOLogonSuccess->DaiLiName, CountArray(UserInfo.szName));
  2956. lstrcpyn(UserInfo.szWx, pDBOLogonSuccess->DaiLiWX, CountArray(UserInfo.szWx));
  2957. lstrcpyn(UserInfo.szQQ, pDBOLogonSuccess->DaiLiQQ, CountArray(UserInfo.szQQ));
  2958. //激活用户
  2959. m_ServerUserManager.InsertUserItem(&pIServerUserItem, UserInfo, UserInfoPlus);
  2960. auto _iter = Socket_2_UserID.find(dwContextID);
  2961. if (_iter == Socket_2_UserID.end())
  2962. {
  2963. std::pair<DWORD, DWORD> Sub(dwContextID, pDBOLogonSuccess->dwUserID);
  2964. Socket_2_UserID.insert(Sub);
  2965. }
  2966. else
  2967. {
  2968. Socket_2_UserID[dwContextID] = pDBOLogonSuccess->dwUserID;
  2969. }
  2970. //用户任务
  2971. //if (pDBOLogonSuccess->wTaskCount > 0)
  2972. //{
  2973. // m_UserTaskManager.SetUserTaskInfo(pIServerUserItem->GetUserID(), pDBOLogonSuccess->UserTaskInfo, pDBOLogonSuccess->wTaskCount);
  2974. //}
  2975. //错误判断
  2976. if (pIServerUserItem == NULL)
  2977. {
  2978. //错误断言
  2979. ASSERT(FALSE);
  2980. //解除锁定
  2981. PerformUnlockScore(pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->dwInoutIndex, LER_SERVER_FULL);
  2982. //断开用户
  2983. if (bAndroidUser == true)
  2984. {
  2985. //m_AndroidUserManager.DeleteAndroidUserItem(dwContextID, true);
  2986. }
  2987. else
  2988. {
  2989. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  2990. }
  2991. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  2992. return true;
  2993. }
  2994. //设置用户
  2995. pBindParameter->pIServerUserItem = pIServerUserItem;
  2996. //修改参数
  2997. if (pIServerUserItem->IsMobileUser())
  2998. {
  2999. SetMobileUserParameter(pIServerUserItem, pDBOLogonSuccess->cbDeviceType, pDBOLogonSuccess->wBehaviorFlags, pDBOLogonSuccess->wPageTableCount);
  3000. }
  3001. DWORD dwUserID = pDBOLogonSuccess->dwUserID;
  3002. auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID);
  3003. //if (iter == m_UserID_2_PriTableIDGROUP.end())
  3004. //{
  3005. // JN_GR_RoomListGroup Temp;
  3006. // ZeroMemory(&Temp, sizeof(Temp));
  3007. // std::pair<DWORD, JN_GR_RoomListGroup> Sub(dwUserID, Temp);
  3008. // m_UserID_2_PriTableIDGROUP.insert(Sub);
  3009. // UserInfo::PB_CS_S_RoomListGroupSend GroupSend;
  3010. // for (WORD i = 0; i < Temp.Num; i++)
  3011. // {
  3012. // if (Temp.jgrDate[i].dwRoomNumber == 0)break;
  3013. // UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate();
  3014. // RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID);
  3015. // RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID);
  3016. // RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber);
  3017. // RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del);
  3018. // RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen);
  3019. // RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu);
  3020. // RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody);
  3021. // RoomList->set_dwbody(Temp.jgrDate[i].dwBody);
  3022. // RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa);
  3023. // std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz;
  3024. // RoomList->set_szip(szIp);
  3025. // RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai);
  3026. // RoomList->set_tmp1(Temp.jgrDate[i].tmp1);
  3027. // RoomList->set_tmp2(Temp.jgrDate[i].tmp2);
  3028. // RoomList->set_tmp3(Temp.jgrDate[i].tmp3);
  3029. // RoomList->set_tmp4(Temp.jgrDate[i].tmp4);
  3030. // RoomList->set_tmp5(Temp.jgrDate[i].tmp5);
  3031. // for (WORD i = 0; i < 4; i++)
  3032. // {
  3033. // RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]);
  3034. // }
  3035. // RoomList->set_wport(Temp.jgrDate[i].wPort);
  3036. // }
  3037. // GroupSend.set_num(Temp.Num);
  3038. // //发送数据
  3039. // std::string pbdata = GroupSend.SerializePartialAsString();
  3040. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length());
  3041. //}
  3042. //else
  3043. //{
  3044. // JN_GR_RoomListGroupSend Temp;
  3045. // ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroupSend));
  3046. // for (int i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++)
  3047. // {
  3048. // CopyMemory(&(Temp.jgrDate[i]), &(m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i]), sizeof(JN_GR_RoomList));
  3049. // //纠正
  3050. // Temp.jgrDate[i].tmp1 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].bRoomCreatePay;
  3051. // Temp.jgrDate[i].tmp2 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp1;
  3052. // Temp.jgrDate[i].tmp3 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp2;
  3053. // }
  3054. // UserInfo::PB_CS_S_RoomListGroupSend GroupSend;
  3055. // for (WORD i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++)
  3056. // {
  3057. // UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate();
  3058. // RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID);
  3059. // RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID);
  3060. // RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber);
  3061. // RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del);
  3062. // RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen);
  3063. // RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu);
  3064. // RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody);
  3065. // RoomList->set_dwbody(Temp.jgrDate[i].dwBody);
  3066. // RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa);
  3067. // std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz;
  3068. // RoomList->set_szip(szIp);
  3069. // RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai);
  3070. // RoomList->set_tmp1(Temp.jgrDate[i].tmp1);
  3071. // RoomList->set_tmp2(Temp.jgrDate[i].tmp2);
  3072. // RoomList->set_tmp3(Temp.jgrDate[i].tmp3);
  3073. // RoomList->set_tmp4(Temp.jgrDate[i].tmp4);
  3074. // RoomList->set_tmp5(Temp.jgrDate[i].tmp5);
  3075. // for (WORD i = 0; i < 4; i++)
  3076. // {
  3077. // RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]);
  3078. // }
  3079. // RoomList->set_wport(Temp.jgrDate[i].wPort);
  3080. // }
  3081. // GroupSend.set_num(m_UserID_2_PriTableIDGROUP[dwUserID].Num);
  3082. // //发送数据
  3083. // std::string pbdata = GroupSend.SerializePartialAsString();
  3084. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length());
  3085. //}
  3086. if (IsJC(pIServerUserItem->GetUserID()))
  3087. {
  3088. CString csTestB;
  3089. csTestB.Format(_T("通知创建的所有房间列表 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID());
  3090. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  3091. }
  3092. //登录事件
  3093. OnEventUserLogon(pIServerUserItem, false);
  3094. //汇总用户
  3095. if (m_bCollectUser == true)
  3096. {
  3097. //变量定义
  3098. CMD_CS_C_UserEnter UserEnter;
  3099. ZeroMemory(&UserEnter, sizeof(UserEnter));
  3100. //设置变量
  3101. UserEnter.dwUserID = pIServerUserItem->GetUserID();
  3102. UserEnter.dwGameID = pIServerUserItem->GetGameID();
  3103. //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName));
  3104. //辅助信息
  3105. UserEnter.cbGender = pIServerUserItem->GetGender();
  3106. UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder();
  3107. UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder();
  3108. /*DWORD dTableNum = 0;*/
  3109. if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  3110. {
  3111. auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  3112. TCHAR szTemp[32] = { 0 };
  3113. if (pat) pat->GetPrivateTableID(szTemp, 32);
  3114. CString csTemp = szTemp;
  3115. /*if (pat != nullptr && !csTemp.IsEmpty())
  3116. {
  3117. dTableNum = _wtol(csTemp);
  3118. }*/
  3119. }
  3120. //发送消息
  3121. ASSERT(m_pITCPSocketService != NULL);
  3122. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_ENTER, &UserEnter, sizeof(UserEnter));
  3123. }
  3124. if (IsJC(pIServerUserItem->GetUserID()))
  3125. {
  3126. CString csTestB;
  3127. csTestB.Format(_T("游戏登陆完成 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID());
  3128. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  3129. }
  3130. if (pDBOLogonSuccess) free(pDBOLogonSuccess);
  3131. return true;
  3132. }
  3133. //登录成功
  3134. bool CAttemperEngineSink::OnDBLogonSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3135. {
  3136. if (!m_pITCPNetworkEngine) return false;
  3137. void *pBuffer = malloc(wDataSize);
  3138. CopyMemory(pBuffer, pData, wDataSize);
  3139. PVOID pLogon = pBuffer;
  3140. return m_pITCPNetworkEngine->OnTBDataEvent(TB_LOGINOK, dwContextID, &pLogon, sizeof(PVOID));
  3141. }
  3142. //登录失败
  3143. bool CAttemperEngineSink::OnDBLogonFailure(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3144. {
  3145. //判断在线
  3146. tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3147. if (NULL == pBindParameter)
  3148. {
  3149. CString strTip;
  3150. strTip.Format(L"Fun=[%hs] 登录失败 pBindParameter为NULL", __FUNCTION__);
  3151. CTraceService::TraceString(strTip, TraceLevel_Exception);
  3152. return true;
  3153. }
  3154. TCHAR szClientAddr[16] = TEXT("");
  3155. BYTE * pClientAddr = (BYTE *)&pBindParameter->dwClientAddr;
  3156. _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  3157. if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem != NULL))
  3158. {
  3159. CString csTest;
  3160. csTest.Format(_T("登录失败 OnDBLogonFailure, SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s ")
  3161. , LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr);
  3162. if (pBindParameter->pIServerUserItem != NULL)
  3163. {
  3164. csTest.Format(_T("登录失败 OnDBLogonFailure, SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s,数组记录uid=%d")
  3165. , LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr, pBindParameter->pIServerUserItem->GetUserID());
  3166. }
  3167. CTraceService::TraceString(csTest, TraceLevel_Exception);
  3168. return true;
  3169. }
  3170. //发送错误
  3171. DBO_GR_LogonFailure * pLogonFailure = (DBO_GR_LogonFailure *)pData;
  3172. SendLogonFailure(pLogonFailure->szDescribeString, pLogonFailure->lResultCode, dwContextID);
  3173. CString str;
  3174. str.Format(TEXT("登录失败 OnDBLogonFailure 失败原因:%s , SOCKET数组下标=%d, 数组记录SOCKET=%d, 当前SOCKET=%d, 数组记录pIServerUserItem=%p,数组记录IP=%s ")
  3175. , pLogonFailure->szDescribeString, LOWORD(dwContextID), pBindParameter->dwSocketID, dwContextID, pBindParameter->pIServerUserItem, szClientAddr);
  3176. CTraceService::TraceString(str, TraceLevel_Normal);
  3177. //断开连接
  3178. if (LOWORD(dwContextID) >= INDEX_ANDROID)
  3179. {
  3180. //m_AndroidUserManager.DeleteAndroidUserItem(dwContextID, true);
  3181. }
  3182. else
  3183. {
  3184. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  3185. }
  3186. return true;
  3187. }
  3188. bool CAttemperEngineSink::OnDBGetUserGameScoreList(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3189. {
  3190. WORD wBindIndex = LOWORD(dwContextID);
  3191. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3192. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3193. ASSERT(pIServerUserItem != NULL);
  3194. if (pIServerUserItem == NULL) return false;
  3195. if (pBindParameter->dwSocketID != dwContextID)
  3196. {
  3197. return true;
  3198. }
  3199. //变量定义
  3200. CMD_GR_GetUserScoreRecordListResp * pGameRecords = (CMD_GR_GetUserScoreRecordListResp *)pData;
  3201. UserInfo::PB_CS_S_GetUserScoreRecordListResp ListResp;
  3202. ListResp.set_wparentrecordid(pGameRecords->wParentRecordID);
  3203. ListResp.set_wrecordcount(pGameRecords->wRecordCount);
  3204. for (WORD i = 0; i < pGameRecords->wRecordCount; i++)
  3205. {
  3206. UserInfo::pb_tagGameRecordDrawInfo* GameScoreRecord = ListResp.add_gamescorerecord();
  3207. GameScoreRecord->set_dwdrawid(pGameRecords->GameScoreRecord[i].dwDrawID);
  3208. GameScoreRecord->set_wtableid(pGameRecords->GameScoreRecord[i].wTableID);
  3209. GameScoreRecord->set_wusermedal(pGameRecords->GameScoreRecord[i].wUserMedal);
  3210. GameScoreRecord->set_wusercount(pGameRecords->GameScoreRecord[i].wUserCount);
  3211. GameScoreRecord->set_wparentid(pGameRecords->GameScoreRecord[i].wParentID);
  3212. std::string szPrivateTableID = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].szPrivateTableID, CP_UTF8).m_psz;
  3213. GameScoreRecord->set_szprivatetableid(szPrivateTableID);
  3214. GameScoreRecord->set_systemtimestart(pGameRecords->GameScoreRecord[i].SystemTimeStart);
  3215. GameScoreRecord->set_systemtimeconclude(pGameRecords->GameScoreRecord[i].SystemTimeConclude);
  3216. GameScoreRecord->set_wwanfa(pGameRecords->GameScoreRecord[i].wWanFa % 256);
  3217. GameScoreRecord->set_wplaycount(pGameRecords->GameScoreRecord[i].wWanFa / 256);
  3218. for (WORD j = 0; j < 4; j++)
  3219. {
  3220. UserInfo::pb_tagGameRecordDrawScore* GameChairScore = GameScoreRecord->add_gamechairscore();
  3221. GameChairScore->set_dwdrawid(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwDrawID);
  3222. GameChairScore->set_dwuserid(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwUserID);
  3223. GameChairScore->set_wchairid(pGameRecords->GameScoreRecord[i].GameChairScore[j].wChairID);
  3224. GameChairScore->set_lscore(pGameRecords->GameScoreRecord[i].GameChairScore[j].lScore);
  3225. GameChairScore->set_lgrade(pGameRecords->GameScoreRecord[i].GameChairScore[j].lGrade);
  3226. GameChairScore->set_dwusermedal(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwUserMedal);
  3227. GameChairScore->set_dwplaytimecount(pGameRecords->GameScoreRecord[i].GameChairScore[j].dwPlayTimeCount);
  3228. std::string szUserName = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].GameChairScore[j].szUserName, CP_UTF8).m_psz;
  3229. std::string szHeadImg = CW2AEX<1024>(pGameRecords->GameScoreRecord[i].GameChairScore[j].szHeadImg, CP_UTF8).m_psz;
  3230. GameChairScore->set_szusername(szUserName);
  3231. GameChairScore->set_szheadimg(szHeadImg);
  3232. GameChairScore->set_wwanfa(pGameRecords->GameScoreRecord[i].wWanFa % 256);
  3233. GameChairScore->set_wplaycount(pGameRecords->GameScoreRecord[i].wUserCount / 256);
  3234. }
  3235. }
  3236. //发送数据
  3237. std::string pbdata = ListResp.SerializePartialAsString();
  3238. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_LISTACK, (void*)pbdata.c_str(), pbdata.length());
  3239. return true;
  3240. }
  3241. //插入父节点房间的返回
  3242. bool CAttemperEngineSink::OnDBO_GR_GameScoreRecord_RESULT(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3243. {
  3244. //效验参数
  3245. ASSERT(wDataSize == sizeof(DBR_GR_GameScoreRecordResult));
  3246. if (wDataSize != sizeof(DBR_GR_GameScoreRecordResult)) return false;
  3247. //变量定义
  3248. DBR_GR_GameScoreRecordResult * pInfo = (DBR_GR_GameScoreRecordResult *)pData;
  3249. auto pTableFrame = GetTableFrame(pInfo->wTableID);
  3250. ASSERT(pTableFrame);
  3251. if (pTableFrame)
  3252. {
  3253. pTableFrame->SetPrivateTableParentNodeID(pInfo->wPrivateTableParentNodeID);
  3254. }
  3255. return true;
  3256. }
  3257. //获取刷新元宝
  3258. bool CAttemperEngineSink::OnDBO_GR_GetBearnSEND(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3259. {
  3260. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnDBO_GR_GetBearnSEND"), TraceLevel_Debug);
  3261. //效验参数
  3262. ASSERT(wDataSize == sizeof(DBR_GR_GetBearn));
  3263. if (wDataSize < sizeof(DBR_GR_GetBearn)) return false;
  3264. DBR_GR_GetBearn *pGet = (DBR_GR_GetBearn *)pData;
  3265. WORD wBindIndex = LOWORD(dwContextID);
  3266. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3267. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3268. //ASSERT(pIServerUserItem != NULL);
  3269. if (pIServerUserItem == NULL) return false;
  3270. if (pBindParameter->dwSocketID != dwContextID)
  3271. {
  3272. return true;
  3273. }
  3274. if (pGet->lResultCode == 0)
  3275. {
  3276. CString csTest;
  3277. csTest.Format(_T("%s%s"), _T("CAttemperEngineSink::OnDBO_GR_GetBearnSEND->"), pGet->strErrorDescribe);
  3278. //数据库查询失败。
  3279. CTraceService::TraceString(csTest, TraceLevel_Warning);
  3280. return true;
  3281. }
  3282. if (IsJC(pGet->dwUserID) && pGet->GouMaiZuanShi == 0)
  3283. {
  3284. CString csTestB;
  3285. csTestB.Format(_T("OnDBO_GR_GetBearnSEND钻石信息变化 -> 原 GouMaiZuanShi:%d变%d, LeiJiZuanShiID:%d变%d,UserID=%d")
  3286. , pIServerUserItem->GetUserInfo()->GouMaiZuanShi
  3287. , pGet->GouMaiZuanShi
  3288. , pIServerUserItem->GetUserInfo()->LeiJiZuanShi
  3289. , pGet->LeiJiZuanShi
  3290. , pIServerUserItem->GetUserID());
  3291. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  3292. }
  3293. pIServerUserItem->GetUserInfo()->dwBean = pGet->Currency;
  3294. pIServerUserItem->GetUserInfo()->GouMaiZuanShi = pGet->GouMaiZuanShi;
  3295. pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pGet->LeiJiZuanShi;
  3296. UserInfo::PB_CS_S_UserBean Bean;
  3297. Bean.set_dwcurrbeans(pGet->Currency);
  3298. //发送数据
  3299. std::string pbdata = Bean.SerializePartialAsString();
  3300. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  3301. return true;
  3302. }
  3303. //获取刷新元宝
  3304. bool CAttemperEngineSink::OnDBO_GR_GetBearn(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3305. {
  3306. if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_UPDATA, dwContextID, pData, wDataSize);
  3307. return true;
  3308. }
  3309. //手机重复绑定查询
  3310. bool CAttemperEngineSink::OnDBO_GR_GetVerifCode(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3311. {
  3312. //效验参数
  3313. WORD wBindIndex = LOWORD(dwContextID);
  3314. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3315. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3316. ASSERT(pIServerUserItem != NULL);
  3317. if (pIServerUserItem == NULL) return false;
  3318. if (pBindParameter->dwSocketID != dwContextID)
  3319. {
  3320. return true;
  3321. }
  3322. CMD_GR_GetVerifCode* pGetVerifCode = (CMD_GR_GetVerifCode*)pData;
  3323. if (pGetVerifCode->IsRepeat == 0)
  3324. {
  3325. //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484"));
  3326. DWORD dUserID = pIServerUserItem->GetUserID();
  3327. GETDUILIEBASE Temp;
  3328. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  3329. StringCchCat(Temp.szUnionID, 12, pGetVerifCode->PhoneNum);
  3330. Temp.dUserID = dUserID;
  3331. Temp.CommendID = 8; //获取手机验证码(只作透传)
  3332. Temp.dwSocketID = dwContextID;
  3333. CHttpClient::AddLog(dwContextID, Temp);
  3334. return true;
  3335. }
  3336. else
  3337. {
  3338. CMD_GR_RequestFailure RequestFailure;
  3339. ZeroMemory(&RequestFailure, sizeof(RequestFailure));
  3340. //设置变量
  3341. RequestFailure.lErrorCode = -8;
  3342. lstrcpyn(RequestFailure.szDescribeString, pGetVerifCode->szDescribeString, CountArray(RequestFailure.szDescribeString));
  3343. //获取用户
  3344. WORD wBindIndexT = LOWORD(dwContextID);
  3345. IServerUserItem * p_server_user_itemEx = GetBindUserItem(wBindIndexT);
  3346. if (p_server_user_itemEx == NULL) return false;
  3347. UserInfo::PB_CS_S_RequestFailure Failure;
  3348. Failure.set_lerrorcode(RequestFailure.lErrorCode);
  3349. std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz;
  3350. Failure.set_szdescribestring(szDescribeString);
  3351. //发送数据
  3352. std::string pbdata = Failure.SerializePartialAsString();
  3353. SendData(p_server_user_itemEx, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  3354. }
  3355. //SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE_QUERY, pReq, wDataSize);
  3356. return true;
  3357. }
  3358. //手机绑定查询
  3359. bool CAttemperEngineSink::OnDBO_GR_CheckIphoneQuery(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3360. {
  3361. //效验参数
  3362. WORD wBindIndex = LOWORD(dwContextID);
  3363. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3364. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3365. ASSERT(pIServerUserItem != NULL);
  3366. if (pIServerUserItem == NULL) return false;
  3367. if (pBindParameter->dwSocketID != dwContextID)
  3368. {
  3369. return true;
  3370. }
  3371. CMD_GR_CheckIphone_Query* pReq = (CMD_GR_CheckIphone_Query*)pData;
  3372. UserInfo::PB_CS_S_CheckIphone_Query CheckIphone;
  3373. CheckIphone.set_isbingnum(pReq->IsBingNum);
  3374. CheckIphone.set_dwcurrency(pReq->dwCurrency);
  3375. std::string PhoneNum = CW2AEX<1024>(pReq->PhoneNum, CP_UTF8).m_psz;
  3376. CheckIphone.set_phonenum(PhoneNum);
  3377. CheckIphone.set_isbingxianliao(pReq->IsBingXianLiao);
  3378. //发送数据
  3379. std::string pbdata = CheckIphone.SerializePartialAsString();
  3380. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE_QUERY, (void*)pbdata.c_str(), pbdata.length());
  3381. return true;
  3382. }
  3383. //手机绑定
  3384. bool CAttemperEngineSink::OnDBO_GR_CheckIphone(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3385. {
  3386. //效验参数
  3387. WORD wBindIndex = LOWORD(dwContextID);
  3388. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3389. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3390. ASSERT(pIServerUserItem != NULL);
  3391. if (pIServerUserItem == NULL) return false;
  3392. if (pBindParameter->dwSocketID != dwContextID)
  3393. {
  3394. return true;
  3395. }
  3396. CMD_GR_CheckIphone* pReq = (CMD_GR_CheckIphone*)pData;
  3397. if (pReq->IsBingNum == 0)
  3398. {
  3399. CMD_GR_RequestFailure RequestFailure;
  3400. ZeroMemory(&RequestFailure, sizeof(RequestFailure));
  3401. //设置变量
  3402. RequestFailure.lErrorCode = 2;
  3403. lstrcpyn(RequestFailure.szDescribeString, pReq->PhoneNum, CountArray(pReq->PhoneNum));
  3404. //发送数据
  3405. WORD wDataSizeT = CountStringBuffer(RequestFailure.szDescribeString);
  3406. WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString);
  3407. if (pIServerUserItem == NULL) return true;
  3408. UserInfo::PB_CS_S_RequestFailure Failure;
  3409. Failure.set_lerrorcode(RequestFailure.lErrorCode);
  3410. std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz;
  3411. Failure.set_szdescribestring(szDescribeString);
  3412. //发送数据
  3413. std::string pbdata = Failure.SerializePartialAsString();
  3414. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  3415. return true;
  3416. }
  3417. UserInfo::PB_CS_C_CheckIphone CheckIphone;
  3418. CheckIphone.set_isbingnum(pReq->IsBingNum);
  3419. CheckIphone.set_dwcurrency(pReq->dwCurrency);
  3420. std::string PhoneNum = CW2AEX<1024>(pReq->PhoneNum, CP_UTF8).m_psz;
  3421. CheckIphone.set_phonenum(PhoneNum);
  3422. //发送数据
  3423. std::string pbdata = CheckIphone.SerializePartialAsString();
  3424. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_IPHONE, (void*)pbdata.c_str(), pbdata.length());
  3425. return true;
  3426. }
  3427. //实名认证查询
  3428. bool CAttemperEngineSink::OnDBO_GR_CheckNameQuery(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3429. {
  3430. //效验参数
  3431. WORD wBindIndex = LOWORD(dwContextID);
  3432. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3433. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3434. ASSERT(pIServerUserItem != NULL);
  3435. if (pIServerUserItem == NULL) return false;
  3436. if (pBindParameter->dwSocketID != dwContextID)
  3437. {
  3438. return true;
  3439. }
  3440. DBR_GR_GetCheckName* pReq = (DBR_GR_GetCheckName*)pData;
  3441. UserInfo::PB_CS_S_CheckNameEx NameEx;
  3442. std::string userName = CW2AEX<1024>(pReq->userName, CP_UTF8).m_psz;
  3443. std::string userCard = CW2AEX<1024>(pReq->userCard, CP_UTF8).m_psz;
  3444. std::string userPhoneNum = CW2AEX<1024>(pReq->userPhoneNum, CP_UTF8).m_psz;
  3445. std::string userAddr = CW2AEX<1024>(pReq->userAddr, CP_UTF8).m_psz;
  3446. NameEx.set_name(userName);
  3447. NameEx.set_idcard(userCard);
  3448. NameEx.set_phonenum(userPhoneNum);
  3449. NameEx.set_addr(userAddr);
  3450. //发送数据
  3451. std::string pbdata = NameEx.SerializePartialAsString();
  3452. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_CHECK_NAME_QUERY, (void*)pbdata.c_str(), pbdata.length());
  3453. return true;
  3454. }
  3455. //修改地址应答
  3456. bool CAttemperEngineSink::OnDBO_GR_UpdateAddr(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3457. {
  3458. //效验参数
  3459. WORD wBindIndex = LOWORD(dwContextID);
  3460. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3461. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3462. ASSERT(pIServerUserItem != NULL);
  3463. if (pIServerUserItem == NULL) return false;
  3464. if (pBindParameter->dwSocketID != dwContextID)
  3465. {
  3466. return true;
  3467. }
  3468. BYTE* pReq = (BYTE*)pData;//0表示成功,1表示失败
  3469. TurntableLogon::PB_CS_LotteryAddr LotteryAddr;
  3470. LotteryAddr.set_preq(*pReq);
  3471. //发送数据
  3472. std::string pbdata = LotteryAddr.SerializePartialAsString();
  3473. SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_ADDRESS, (void*)pbdata.c_str(), pbdata.length());
  3474. return true;
  3475. }
  3476. //获取临时积分排行榜
  3477. bool CAttemperEngineSink::OnDBO_GR_GameTmpScoreRankListResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3478. {
  3479. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnDBO_GR_GameTmpScoreRankListResult"), TraceLevel_Debug);
  3480. //效验参数
  3481. ASSERT(wDataSize >= sizeof(CMD_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT));
  3482. if (wDataSize < sizeof(CMD_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT)) return false;
  3483. WORD wBindIndex = LOWORD(dwContextID);
  3484. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3485. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3486. ASSERT(pIServerUserItem != NULL);
  3487. if (pIServerUserItem == NULL) return false;
  3488. if (pBindParameter->dwSocketID != dwContextID)
  3489. {
  3490. return true;
  3491. }
  3492. //变量定义
  3493. if (m_pRankListData)
  3494. {
  3495. delete[] m_pRankListData;
  3496. m_pRankListData = nullptr;
  3497. m_pRankListDataSize = 0;
  3498. }
  3499. m_pRankListData = new char[wDataSize];
  3500. CopyMemory(m_pRankListData, pData, wDataSize);
  3501. m_pRankListDataSize = wDataSize;
  3502. m_lastRankListTime = time(0);
  3503. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT, pData, wDataSize);
  3504. return true;
  3505. }
  3506. //获取游戏积分记录详情
  3507. bool CAttemperEngineSink::OnDBGetUserGameScoreReplayRecord(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3508. {
  3509. //效验参数
  3510. WORD wBindIndex = LOWORD(dwContextID);
  3511. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3512. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3513. ASSERT(pIServerUserItem != NULL);
  3514. if (pIServerUserItem == NULL) return false;
  3515. if (pBindParameter->dwSocketID != dwContextID)
  3516. {
  3517. return true;
  3518. }
  3519. /*Replay::PB_CS_RECORD_REPLAY aa;
  3520. aa.set_aa((char*)pData);
  3521. std::string pbdata = aa.SerializePartialAsString();
  3522. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY, (void*)pbdata.c_str(), pbdata.length());*/
  3523. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAYACK, pData, wDataSize);
  3524. return true;
  3525. }
  3526. //获取游戏积分记录详情
  3527. bool CAttemperEngineSink::OnDBGetUserGameScoreRecordDetail(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3528. {
  3529. //效验参数
  3530. ASSERT(wDataSize <= sizeof(CMD_GR_GetUserScoreRecordDetail));
  3531. if (wDataSize >= sizeof(CMD_GR_GetUserScoreRecordDetail)) return false;
  3532. WORD wBindIndex = LOWORD(dwContextID);
  3533. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  3534. auto pIServerUserItem = pBindParameter->pIServerUserItem;
  3535. ASSERT(pIServerUserItem != NULL);
  3536. if (pIServerUserItem == NULL) return false;
  3537. if (pBindParameter->dwSocketID != dwContextID)
  3538. {
  3539. return true;
  3540. }
  3541. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_SCORE_RECORD_DETAIL_INFO, pData, wDataSize);
  3542. return true;
  3543. }
  3544. //配置信息
  3545. bool CAttemperEngineSink::OnDBGameParameter(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3546. {
  3547. //效验参数
  3548. ASSERT(wDataSize == sizeof(DBO_GR_GameParameter));
  3549. if (wDataSize != sizeof(DBO_GR_GameParameter)) return false;
  3550. //变量定义
  3551. DBO_GR_GameParameter * pGameParameter = (DBO_GR_GameParameter *)pData;
  3552. //汇率信息
  3553. m_pGameParameter->wMedalRate = pGameParameter->wMedalRate;
  3554. m_pGameParameter->wRevenueRate = pGameParameter->wRevenueRate;
  3555. m_pGameParameter->wExchangeRate = pGameParameter->wExchangeRate;
  3556. //经验奖励
  3557. m_pGameParameter->dwWinExperience = pGameParameter->dwWinExperience;
  3558. //版本信息
  3559. m_pGameParameter->dwClientVersion = pGameParameter->dwClientVersion;
  3560. m_pGameParameter->dwServerVersion = pGameParameter->dwServerVersion;
  3561. int i = 0;//序号索引
  3562. for each (MyStructParameter var in pGameParameter->msParameter)
  3563. {
  3564. i = var.idNum - 1;//下标与序号的关系idNUM固定相差1,数据库取值决定的
  3565. StringCchCopy(m_pGameParameter->msParameter[i].szgameTypeCfg, _countof(m_pGameParameter->msParameter[i].szgameTypeCfg), var.szgameTypeCfg);
  3566. StringCchCopy(m_pGameParameter->msParameter[i].diJinCfg, _countof(m_pGameParameter->msParameter[i].diJinCfg), var.diJinCfg);
  3567. StringCchCopy(m_pGameParameter->msParameter[i].payTypeCfg, _countof(m_pGameParameter->msParameter[i].payTypeCfg), var.payTypeCfg);
  3568. StringCchCopy(m_pGameParameter->msParameter[i].juShuCfg, _countof(m_pGameParameter->msParameter[i].juShuCfg), var.juShuCfg);
  3569. StringCchCopy(m_pGameParameter->msParameter[i].payCoinCfg, _countof(m_pGameParameter->msParameter[i].payCoinCfg), var.payCoinCfg);
  3570. StringCchCopy(m_pGameParameter->msParameter[i].ipLimitCfg, _countof(m_pGameParameter->msParameter[i].ipLimitCfg), var.ipLimitCfg);
  3571. StringCchCopy(m_pGameParameter->msParameter[i].defaultDeskCfg, _countof(m_pGameParameter->msParameter[i].defaultDeskCfg), var.defaultDeskCfg);
  3572. m_pGameParameter->msParameter[i].idNum = var.idNum;
  3573. }
  3574. /*StringCchCopy(m_pGameParameter->msParameter[0].szgameTypeCfg, _countof(m_pGameParameter->msParameter[0].szgameTypeCfg), pGameParameter->msParameter[0].szgameTypeCfg);
  3575. StringCchCopy(m_pGameParameter->msParameter[0].diJinCfg, _countof(m_pGameParameter->msParameter[0].diJinCfg), pGameParameter->msParameter[0].diJinCfg);
  3576. StringCchCopy(m_pGameParameter->msParameter[0].payTypeCfg, _countof(m_pGameParameter->msParameter[0].payTypeCfg), pGameParameter->msParameter[0].payTypeCfg);
  3577. StringCchCopy(m_pGameParameter->msParameter[0].juShuCfg, _countof(m_pGameParameter->msParameter[0].juShuCfg), pGameParameter->msParameter[0].juShuCfg);
  3578. StringCchCopy(m_pGameParameter->msParameter[0].payCoinCfg, _countof(m_pGameParameter->msParameter[0].payCoinCfg), pGameParameter->msParameter[0].payCoinCfg);
  3579. StringCchCopy(m_pGameParameter->msParameter[0].ipLimitCfg, _countof(m_pGameParameter->msParameter[0].ipLimitCfg), pGameParameter->msParameter[0].ipLimitCfg);
  3580. StringCchCopy(m_pGameParameter->msParameter[0].defaultDeskCfg, _countof(m_pGameParameter->msParameter[0].defaultDeskCfg), pGameParameter->msParameter[0].defaultDeskCfg);
  3581. m_pGameParameter->msParameter[0].idNum = pGameParameter->msParameter[0].idNum;
  3582. StringCchCopy(m_pGameParameter->msParameter[1].szgameTypeCfg, _countof(m_pGameParameter->msParameter[1].szgameTypeCfg), pGameParameter->msParameter[1].szgameTypeCfg);
  3583. StringCchCopy(m_pGameParameter->msParameter[1].diJinCfg, _countof(m_pGameParameter->msParameter[1].diJinCfg), pGameParameter->msParameter[1].diJinCfg);
  3584. StringCchCopy(m_pGameParameter->msParameter[1].payTypeCfg, _countof(m_pGameParameter->msParameter[1].payTypeCfg), pGameParameter->msParameter[1].payTypeCfg);
  3585. StringCchCopy(m_pGameParameter->msParameter[1].juShuCfg, _countof(m_pGameParameter->msParameter[1].juShuCfg), pGameParameter->msParameter[1].juShuCfg);
  3586. StringCchCopy(m_pGameParameter->msParameter[1].payCoinCfg, _countof(m_pGameParameter->msParameter[1].payCoinCfg), pGameParameter->msParameter[1].payCoinCfg);
  3587. StringCchCopy(m_pGameParameter->msParameter[1].ipLimitCfg, _countof(m_pGameParameter->msParameter[1].ipLimitCfg), pGameParameter->msParameter[1].ipLimitCfg);
  3588. StringCchCopy(m_pGameParameter->msParameter[1].defaultDeskCfg, _countof(m_pGameParameter->msParameter[1].defaultDeskCfg), pGameParameter->msParameter[1].defaultDeskCfg);
  3589. m_pGameParameter->msParameter[1].idNum = pGameParameter->msParameter[1].idNum;
  3590. StringCchCopy(m_pGameParameter->msParameter[2].szgameTypeCfg, _countof(m_pGameParameter->msParameter[2].szgameTypeCfg), pGameParameter->msParameter[2].szgameTypeCfg);
  3591. StringCchCopy(m_pGameParameter->msParameter[2].diJinCfg, _countof(m_pGameParameter->msParameter[2].diJinCfg), pGameParameter->msParameter[2].diJinCfg);
  3592. StringCchCopy(m_pGameParameter->msParameter[2].payTypeCfg, _countof(m_pGameParameter->msParameter[2].payTypeCfg), pGameParameter->msParameter[2].payTypeCfg);
  3593. StringCchCopy(m_pGameParameter->msParameter[2].juShuCfg, _countof(m_pGameParameter->msParameter[2].juShuCfg), pGameParameter->msParameter[2].juShuCfg);
  3594. StringCchCopy(m_pGameParameter->msParameter[2].payCoinCfg, _countof(m_pGameParameter->msParameter[2].payCoinCfg), pGameParameter->msParameter[2].payCoinCfg);
  3595. StringCchCopy(m_pGameParameter->msParameter[2].ipLimitCfg, _countof(m_pGameParameter->msParameter[2].ipLimitCfg), pGameParameter->msParameter[2].ipLimitCfg);
  3596. StringCchCopy(m_pGameParameter->msParameter[2].defaultDeskCfg, _countof(m_pGameParameter->msParameter[2].defaultDeskCfg), pGameParameter->msParameter[2].defaultDeskCfg);
  3597. m_pGameParameter->msParameter[2].idNum = pGameParameter->msParameter[2].idNum;
  3598. StringCchCopy(m_pGameParameter->msParameter[3].szgameTypeCfg, _countof(m_pGameParameter->msParameter[3].szgameTypeCfg), pGameParameter->msParameter[3].szgameTypeCfg);
  3599. StringCchCopy(m_pGameParameter->msParameter[3].diJinCfg, _countof(m_pGameParameter->msParameter[3].diJinCfg), pGameParameter->msParameter[3].diJinCfg);
  3600. StringCchCopy(m_pGameParameter->msParameter[3].payTypeCfg, _countof(m_pGameParameter->msParameter[3].payTypeCfg), pGameParameter->msParameter[3].payTypeCfg);
  3601. StringCchCopy(m_pGameParameter->msParameter[3].juShuCfg, _countof(m_pGameParameter->msParameter[3].juShuCfg), pGameParameter->msParameter[3].juShuCfg);
  3602. StringCchCopy(m_pGameParameter->msParameter[3].payCoinCfg, _countof(m_pGameParameter->msParameter[3].payCoinCfg), pGameParameter->msParameter[3].payCoinCfg);
  3603. StringCchCopy(m_pGameParameter->msParameter[3].ipLimitCfg, _countof(m_pGameParameter->msParameter[3].ipLimitCfg), pGameParameter->msParameter[3].ipLimitCfg);
  3604. StringCchCopy(m_pGameParameter->msParameter[3].defaultDeskCfg, _countof(m_pGameParameter->msParameter[3].defaultDeskCfg), pGameParameter->msParameter[3].defaultDeskCfg);
  3605. m_pGameParameter->msParameter[3].idNum = pGameParameter->msParameter[3].idNum;*/
  3606. ////版本效验
  3607. //if (VERSION_EFFICACY == TRUE)
  3608. //{
  3609. // //版本判断
  3610. // bool bVersionInvalid = false;
  3611. // if (m_pGameParameter->dwClientVersion != m_pGameServiceAttrib->dwClientVersion) bVersionInvalid = true;
  3612. // if (m_pGameParameter->dwServerVersion != m_pGameServiceAttrib->dwServerVersion) bVersionInvalid = true;
  3613. // //提示信息
  3614. // if (bVersionInvalid == true)
  3615. // {
  3616. // CTraceService::TraceString(TEXT("平台数据库服务组件版本注册信息与当前组件版本信息不一致"), TraceLevel_Warning);
  3617. // }
  3618. //}
  3619. //获取状态
  3620. CServiceUnits* pServiceUnits = CServiceUnits::g_pServiceUnits;
  3621. enServiceStatus ServiceStatus = pServiceUnits->GetServiceStatus();
  3622. //事件通知
  3623. if (ServiceStatus != ServiceStatus_Service)
  3624. {
  3625. CP_ControlResult ControlResult;
  3626. ControlResult.cbSuccess = ER_SUCCESS;
  3627. SendUIControlPacket(UI_SERVICE_CONFIG_RESULT, &ControlResult, sizeof(ControlResult));
  3628. }
  3629. return true;
  3630. }
  3631. //列表信息
  3632. //bool CAttemperEngineSink::OnDBGameColumnInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3633. //{
  3634. // //变量定义
  3635. // DBO_GR_GameColumnInfo * pGameColumnInfo = (DBO_GR_GameColumnInfo *)pData;
  3636. // WORD wHeadSize = sizeof(DBO_GR_GameColumnInfo) - sizeof(pGameColumnInfo->ColumnItemInfo);
  3637. //
  3638. // //效验参数
  3639. // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0]))));
  3640. // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0])))) return false;
  3641. //
  3642. // //数据处理
  3643. // if (pGameColumnInfo->cbColumnCount == 0)
  3644. // {
  3645. // //默认列表
  3646. // }
  3647. // else
  3648. // {
  3649. // //拷贝数据
  3650. // m_DataConfigColumn.cbColumnCount = pGameColumnInfo->cbColumnCount;
  3651. // CopyMemory(m_DataConfigColumn.ColumnItem, pGameColumnInfo->ColumnItemInfo, pGameColumnInfo->cbColumnCount * sizeof(pGameColumnInfo->ColumnItemInfo[0]));
  3652. // }
  3653. //
  3654. // return true;
  3655. //}
  3656. ////机器信息
  3657. //bool CAttemperEngineSink::OnDBGameAndroidInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3658. //{
  3659. // //变量定义
  3660. // DBO_GR_GameAndroidInfo * pGameAndroidInfo = (DBO_GR_GameAndroidInfo *)pData;
  3661. // WORD wHeadSize = sizeof(DBO_GR_GameAndroidInfo) - sizeof(pGameAndroidInfo->AndroidAccountsInfo);
  3662. //
  3663. // //效验参数
  3664. // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameAndroidInfo->wAndroidCount * sizeof(pGameAndroidInfo->AndroidAccountsInfo[0]))));
  3665. // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameAndroidInfo->wAndroidCount * sizeof(pGameAndroidInfo->AndroidAccountsInfo[0])))) return false;
  3666. //
  3667. // //设置机器
  3668. // if (pGameAndroidInfo->lResultCode == DB_SUCCESS)
  3669. // {
  3670. // m_AndroidUserManager.InsertAndroidInfo(pGameAndroidInfo->AndroidAccountsInfo, pGameAndroidInfo->wAndroidCount, pGameAndroidInfo->dwBatchID);
  3671. // }
  3672. //
  3673. // return true;
  3674. //}
  3675. //
  3676. ////机器参数
  3677. //bool CAttemperEngineSink::OnDBGameAndroidParameter(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3678. //{
  3679. // //变量定义
  3680. // DBO_GR_GameAndroidParameter * pGameAndroidParameter = (DBO_GR_GameAndroidParameter *)pData;
  3681. // WORD wHeadSize = sizeof(DBO_GR_GameAndroidParameter) - sizeof(pGameAndroidParameter->AndroidParameter);
  3682. //
  3683. // //效验参数
  3684. // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGameAndroidParameter->wParameterCount * sizeof(pGameAndroidParameter->AndroidParameter[0]))));
  3685. // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGameAndroidParameter->wParameterCount * sizeof(pGameAndroidParameter->AndroidParameter[0])))) return false;
  3686. //
  3687. // //设置机器
  3688. // if (pGameAndroidParameter->lResultCode == DB_SUCCESS)
  3689. // {
  3690. // m_AndroidUserManager.AddAndroidParameter(pGameAndroidParameter->AndroidParameter, pGameAndroidParameter->wParameterCount);
  3691. // }
  3692. //
  3693. // return true;
  3694. //}
  3695. //
  3696. //道具信息
  3697. //bool CAttemperEngineSink::OnDBGamePropertyInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3698. //{
  3699. // //变量定义
  3700. // DBO_GR_GamePropertyInfo * pGamePropertyInfo = (DBO_GR_GamePropertyInfo *)pData;
  3701. // WORD wHeadSize = sizeof(DBO_GR_GamePropertyInfo) - sizeof(pGamePropertyInfo->PropertyInfo);
  3702. //
  3703. // //效验参数
  3704. // ASSERT((wDataSize >= wHeadSize) && (wDataSize == (wHeadSize + pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0]))));
  3705. // if ((wDataSize < wHeadSize) || (wDataSize != (wHeadSize + pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0])))) return false;
  3706. //
  3707. // //获取状态
  3708. // CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  3709. // enServiceStatus ServiceStatus = pServiceUnits->GetServiceStatus();
  3710. //
  3711. // //设置道具
  3712. // if (pGamePropertyInfo->lResultCode == DB_SUCCESS)
  3713. // {
  3714. // //设置管理
  3715. // m_GamePropertyManager.SetGamePropertyInfo(pGamePropertyInfo->PropertyInfo, pGamePropertyInfo->cbPropertyCount);
  3716. //
  3717. // //拷贝数据
  3718. // //m_DataConfigProperty.cbPropertyCount = pGamePropertyInfo->cbPropertyCount;
  3719. // //CopyMemory(m_DataConfigProperty.PropertyInfo, pGamePropertyInfo->PropertyInfo, pGamePropertyInfo->cbPropertyCount * sizeof(pGamePropertyInfo->PropertyInfo[0]));
  3720. // }
  3721. //
  3722. // //事件通知
  3723. // if (ServiceStatus != ServiceStatus_Service)
  3724. // {
  3725. // CP_ControlResult ControlResult;
  3726. // ControlResult.cbSuccess = ER_SUCCESS;
  3727. // SendUIControlPacket(UI_SERVICE_CONFIG_RESULT, &ControlResult, sizeof(ControlResult));
  3728. // }
  3729. //
  3730. // return true;
  3731. //}
  3732. ////会员参数
  3733. //bool CAttemperEngineSink::OnDBGameMemberParameter(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3734. //{
  3735. // //变量定义
  3736. // DBO_GR_MemberParameter * pMemberParameter = (DBO_GR_MemberParameter *)pData;
  3737. //
  3738. // //拷贝数据
  3739. // m_wMemberCount = pMemberParameter->wMemberCount;
  3740. // CopyMemory(m_MemberParameter, pMemberParameter->MemberParameter, sizeof(tagMemberParameter)*m_wMemberCount);
  3741. //
  3742. // return true;
  3743. //}
  3744. //
  3745. ////银行信息
  3746. //bool CAttemperEngineSink::OnDBUserInsureInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3747. //{
  3748. // //判断在线
  3749. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3750. // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true;
  3751. //
  3752. // //获取用户
  3753. // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL);
  3754. // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID));
  3755. //
  3756. // //变量定义
  3757. // DBO_GR_UserInsureInfo * pUserInsureInfo = (DBO_GR_UserInsureInfo *)pData;
  3758. //
  3759. // //变量定义
  3760. // CMD_GR_S_UserInsureInfo UserInsureInfo;
  3761. // ZeroMemory(&UserInsureInfo, sizeof(UserInsureInfo));
  3762. //
  3763. // //构造数据
  3764. // UserInsureInfo.cbActivityGame = pUserInsureInfo->cbActivityGame;
  3765. // UserInsureInfo.cbEnjoinTransfer = pUserInsureInfo->cbEnjoinTransfer;
  3766. // UserInsureInfo.wRevenueTake = pUserInsureInfo->wRevenueTake;
  3767. // UserInsureInfo.wRevenueTransfer = pUserInsureInfo->wRevenueTransfer;
  3768. // UserInsureInfo.wRevenueTransferMember = pUserInsureInfo->wRevenueTransferMember;
  3769. // UserInsureInfo.wServerID = pUserInsureInfo->wServerID;
  3770. // UserInsureInfo.lUserInsure = pUserInsureInfo->lUserInsure;
  3771. // UserInsureInfo.lUserScore += pIServerUserItem->GetUserScore();
  3772. // UserInsureInfo.lUserScore += pIServerUserItem->GetTrusteeScore();
  3773. // UserInsureInfo.lUserScore += pIServerUserItem->GetFrozenedScore();
  3774. // UserInsureInfo.lTransferPrerequisite = pUserInsureInfo->lTransferPrerequisite;
  3775. //
  3776. // DWORD dTableNum = 0;
  3777. // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  3778. // {
  3779. // auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  3780. //
  3781. // TCHAR szTemp[32] = { 0 };
  3782. // if (pat) pat->GetPrivateTableID(szTemp, 32);
  3783. // CString csTemp = szTemp;
  3784. //
  3785. // if (pat != nullptr && !csTemp.IsEmpty())
  3786. // {
  3787. // dTableNum = _wtol(csTemp);
  3788. // }
  3789. // }
  3790. //
  3791. // CString csSend;
  3792. // CString csTest = AfxGetAppName();
  3793. //
  3794. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_INSURE, SUB_GR_USER_INSURE_INFO);
  3795. // //OutputDebugString(csSend);
  3796. //
  3797. // 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());
  3798. //
  3799. //
  3800. // //发送数据
  3801. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_INSURE, SUB_GR_USER_INSURE_INFO, &UserInsureInfo, sizeof(UserInsureInfo));
  3802. //
  3803. // return true;
  3804. //}
  3805. //
  3806. ////银行成功
  3807. //bool CAttemperEngineSink::OnDBUserInsureSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3808. //{
  3809. // //判断在线
  3810. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3811. // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true;
  3812. //
  3813. // //获取用户
  3814. // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL);
  3815. // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID));
  3816. //
  3817. // //变量定义
  3818. // DBO_GR_UserInsureSuccess * pUserInsureSuccess = (DBO_GR_UserInsureSuccess *)pData;
  3819. //
  3820. // //变量定义
  3821. // SCORE lFrozenedScore = pUserInsureSuccess->lFrozenedScore;
  3822. // SCORE lInsureRevenue = pUserInsureSuccess->lInsureRevenue;
  3823. // SCORE lVariationScore = pUserInsureSuccess->lVariationScore;
  3824. // SCORE lVariationInsure = pUserInsureSuccess->lVariationInsure;
  3825. //
  3826. // //解冻积分
  3827. // if ((lFrozenedScore > 0L) && (pIServerUserItem->UnFrozenedUserScore(lFrozenedScore) == false))
  3828. // {
  3829. // ASSERT(FALSE);
  3830. // return false;
  3831. // }
  3832. //
  3833. // //银行操作
  3834. // if (pIServerUserItem->ModifyUserInsure(lVariationScore, lVariationInsure, lInsureRevenue) == false)
  3835. // {
  3836. // ASSERT(FALSE);
  3837. // return false;
  3838. // }
  3839. //
  3840. // //变量定义
  3841. // CMD_GR_S_UserInsureSuccess UserInsureSuccess;
  3842. // ZeroMemory(&UserInsureSuccess, sizeof(UserInsureSuccess));
  3843. //
  3844. // //构造变量
  3845. // UserInsureSuccess.cbActivityGame = pUserInsureSuccess->cbActivityGame;
  3846. // UserInsureSuccess.lUserScore = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore();
  3847. // UserInsureSuccess.lUserInsure = pUserInsureSuccess->lSourceInsure + pUserInsureSuccess->lVariationInsure;
  3848. // lstrcpyn(UserInsureSuccess.szDescribeString, pUserInsureSuccess->szDescribeString, CountArray(UserInsureSuccess.szDescribeString));
  3849. //
  3850. // //发送数据
  3851. // WORD wDescribe = CountStringBuffer(UserInsureSuccess.szDescribeString);
  3852. // WORD wHeadSize = sizeof(UserInsureSuccess) - sizeof(UserInsureSuccess.szDescribeString);
  3853. // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_SUCCESS, &UserInsureSuccess, wHeadSize + wDescribe);
  3854. //
  3855. // return true;
  3856. //}
  3857. //
  3858. ////操作失败
  3859. //bool CAttemperEngineSink::OnDBUserInsureFailure(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3860. //{
  3861. // //判断在线
  3862. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3863. // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true;
  3864. //
  3865. // //获取用户
  3866. // WORD wBindIndex = LOWORD(dwContextID);
  3867. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  3868. //
  3869. // //用户效验
  3870. // ASSERT(pIServerUserItem != NULL);
  3871. // if (pIServerUserItem == NULL) return false;
  3872. //
  3873. // //发送错误
  3874. // DBO_GR_UserInsureFailure * pUserInsureFailure = (DBO_GR_UserInsureFailure *)pData;
  3875. // SendInsureFailure(pIServerUserItem, pUserInsureFailure->szDescribeString, pUserInsureFailure->lResultCode, pUserInsureFailure->cbActivityGame);
  3876. //
  3877. // //解冻积分
  3878. // if ((pUserInsureFailure->lFrozenedScore > 0L) && (pIServerUserItem->UnFrozenedUserScore(pUserInsureFailure->lFrozenedScore) == false))
  3879. // {
  3880. // ASSERT(FALSE);
  3881. // return false;
  3882. // }
  3883. //
  3884. // return true;
  3885. //}
  3886. //
  3887. ////用户信息
  3888. //bool CAttemperEngineSink::OnDBUserInsureUserInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3889. //{
  3890. // //判断在线
  3891. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3892. // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true;
  3893. //
  3894. // //获取用户
  3895. // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL);
  3896. // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID));
  3897. //
  3898. // //变量定义
  3899. // DBO_GR_UserTransferUserInfo * pTransferUserInfo = (DBO_GR_UserTransferUserInfo *)pData;
  3900. //
  3901. // //变量定义
  3902. // CMD_GR_S_UserTransferUserInfo UserTransferUserInfo;
  3903. // ZeroMemory(&UserTransferUserInfo, sizeof(UserTransferUserInfo));
  3904. //
  3905. // //构造变量
  3906. // UserTransferUserInfo.cbActivityGame = pTransferUserInfo->cbActivityGame;
  3907. // UserTransferUserInfo.dwTargetGameID = pTransferUserInfo->dwGameID;
  3908. // lstrcpyn(UserTransferUserInfo.szAccounts, pTransferUserInfo->szAccounts, CountArray(UserTransferUserInfo.szAccounts));
  3909. //
  3910. // //发送数据
  3911. // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_TRANSFER_USER_INFO, &UserTransferUserInfo, sizeof(UserTransferUserInfo));
  3912. //
  3913. // return true;
  3914. //}
  3915. //
  3916. ////开通结果
  3917. //bool CAttemperEngineSink::OnDBUserInsureEnableResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3918. //{
  3919. // //判断在线
  3920. // tagBindParameter * pBindParameter = GetBindParameter(LOWORD(dwContextID));
  3921. // if ((pBindParameter->dwSocketID != dwContextID) || (pBindParameter->pIServerUserItem == NULL)) return true;
  3922. //
  3923. // //获取用户
  3924. // ASSERT(GetBindUserItem(LOWORD(dwContextID)) != NULL);
  3925. // IServerUserItem * pIServerUserItem = GetBindUserItem(LOWORD(dwContextID));
  3926. //
  3927. // //变量定义
  3928. // DBO_GR_UserInsureEnableResult * pUserInsureEnableResult = (DBO_GR_UserInsureEnableResult *)pData;
  3929. //
  3930. // //变量定义
  3931. // CMD_GR_S_UserInsureEnableResult UserInsureEnableResult;
  3932. // ZeroMemory(&UserInsureEnableResult, sizeof(UserInsureEnableResult));
  3933. //
  3934. // //构造变量
  3935. // UserInsureEnableResult.cbInsureEnabled = pUserInsureEnableResult->cbInsureEnabled;
  3936. // lstrcpyn(UserInsureEnableResult.szDescribeString, pUserInsureEnableResult->szDescribeString, CountArray(UserInsureEnableResult.szDescribeString));
  3937. //
  3938. // //计算大小
  3939. // WORD wHeadSize = CountStringBuffer(UserInsureEnableResult.szDescribeString);
  3940. // wHeadSize += sizeof(UserInsureEnableResult) - sizeof(UserInsureEnableResult.szDescribeString);
  3941. //
  3942. // //发送数据
  3943. // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_ENABLE_RESULT, &UserInsureEnableResult, wHeadSize);
  3944. //
  3945. // return true;
  3946. //}
  3947. //直接扣除游戏豆
  3948. bool CAttemperEngineSink::OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3949. {
  3950. DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData;
  3951. IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID);
  3952. if (pIServerUserItem == NULL)
  3953. {
  3954. //用户不在此服务器上,上报中央服务器。
  3955. return false;
  3956. }
  3957. if (0 != pInfo->result)
  3958. {
  3959. //扣款失败,应该退出或删除创建的房间。此处尚未处理
  3960. SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result);
  3961. return true;
  3962. }
  3963. if (IsJC(pIServerUserItem->GetUserID()))
  3964. {
  3965. CString csTestB;
  3966. csTestB.Format(_T("OnDBR_GR_USER_ZHIJIE_BEANS_RETURNSEND钻石信息变化 -> 原 LeiJiZuanShiID:%d变%d,UserID=%d")
  3967. , pIServerUserItem->GetUserInfo()->LeiJiZuanShi
  3968. , pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans
  3969. , pIServerUserItem->GetUserID());
  3970. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  3971. }
  3972. pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans;
  3973. pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans;
  3974. //变量定义
  3975. CMD_GR_UserBean UserBeans;
  3976. ZeroMemory(&UserBeans, sizeof(UserBeans));
  3977. //构造变量
  3978. UserBeans.dwCurrBeans = pInfo->dwCurrBeans;
  3979. UserInfo::PB_CS_S_UserBean Bean;
  3980. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  3981. //发送数据
  3982. std::string pbdata = Bean.SerializePartialAsString();
  3983. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  3984. return true;
  3985. }
  3986. //直接扣除游戏豆
  3987. bool CAttemperEngineSink::OnDBR_GR_USER_ZHIJIE_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3988. {
  3989. if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_ZJXF, dwContextID, pData, wDataSize);
  3990. return true;
  3991. }
  3992. //消耗元宝不需要通知客户
  3993. bool CAttemperEngineSink::OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize)
  3994. {
  3995. DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData;
  3996. IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID);
  3997. if (pIServerUserItem == NULL)
  3998. {
  3999. //更新房间内元宝冻结值
  4000. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4001. if (0 == pInfo->result && pTableFrame)
  4002. {
  4003. if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true;
  4004. }
  4005. return false;
  4006. }
  4007. if (0 != pInfo->result)
  4008. {
  4009. //消耗失败,此处需要记录日志
  4010. SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result);
  4011. return true;
  4012. }
  4013. pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans;
  4014. //变量定义
  4015. CMD_GR_UserBean UserBeans;
  4016. ZeroMemory(&UserBeans, sizeof(UserBeans));
  4017. if (IsJC(pIServerUserItem->GetUserID()) && pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans == 0)
  4018. {
  4019. CString csTestB;
  4020. csTestB.Format(_T("OnDBR_GR_USER_REDUCE_BEANS_RETURNSEND钻石信息变化 -> 原 LeiJiZuanShiID:%d变%d,UserID=%d")
  4021. , pIServerUserItem->GetUserInfo()->LeiJiZuanShi
  4022. , pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans
  4023. , pIServerUserItem->GetUserID());
  4024. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  4025. }
  4026. //构造变量
  4027. UserBeans.dwCurrBeans = pInfo->dwCurrBeans;
  4028. pIServerUserItem->GetUserInfo()->LeiJiZuanShi = pIServerUserItem->GetUserInfo()->LeiJiZuanShi + pInfo->dwCurrBeans;
  4029. //发送数据
  4030. //SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, &UserBeans, sizeof(UserBeans));
  4031. //更新房间内元宝冻结值
  4032. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4033. if (pTableFrame)
  4034. {
  4035. if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true;
  4036. }
  4037. return true;
  4038. }
  4039. //消耗元宝不需要通知
  4040. bool CAttemperEngineSink::OnDBR_GR_USER_REDUCE_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4041. {
  4042. if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_XF, dwContextID, pData, wDataSize);
  4043. return true;
  4044. }
  4045. //冻结执行
  4046. bool CAttemperEngineSink::OnDBR_GR_USER_LOCK_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4047. {
  4048. DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData;
  4049. IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID);
  4050. if (0 != pInfo->result)
  4051. {
  4052. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4053. if (pTableFrame == nullptr)
  4054. {
  4055. return false;
  4056. }
  4057. pTableFrame->DeletePrivateTableNow();
  4058. return true;
  4059. }
  4060. if (pIServerUserItem == NULL)
  4061. {
  4062. //用户不在此服务器上,上报中央服务器。
  4063. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_LOCK, pData, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  4064. //更新房间内元宝冻结值
  4065. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4066. if (0 == pInfo->result && pTableFrame)
  4067. {
  4068. if (pTableFrame->SetUserLockData(pInfo->dwUserID, pInfo->dwActiveBeans) == true) return true;
  4069. }
  4070. return false;
  4071. }
  4072. pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans;
  4073. //变量定义
  4074. CMD_GR_UserBean UserBeans;
  4075. ZeroMemory(&UserBeans, sizeof(UserBeans));
  4076. //构造变量
  4077. UserBeans.dwCurrBeans = pInfo->dwCurrBeans;
  4078. UserInfo::PB_CS_S_UserBean Bean;
  4079. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  4080. //发送数据
  4081. std::string pbdata = Bean.SerializePartialAsString();
  4082. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  4083. //更新房间内元宝冻结值
  4084. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4085. if (pTableFrame)
  4086. {
  4087. if (pTableFrame->SetUserLockData(pIServerUserItem->GetUserID(), pInfo->dwActiveBeans) == true) return true;
  4088. }
  4089. return true;
  4090. }
  4091. //冻结元宝通知客户
  4092. bool CAttemperEngineSink::OnDBR_GR_USER_LOCK_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4093. {
  4094. if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_LOCK, dwContextID, pData, wDataSize);
  4095. return true;
  4096. }
  4097. //解冻元宝通知客户
  4098. bool CAttemperEngineSink::OnDBR_GR_USER_UNLOCK_BEANS_RETURN(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4099. {
  4100. if (m_pITCPNetworkEngine) m_pITCPNetworkEngine->OnTBDataEvent(TB_GR_UNLOCK, dwContextID, pData, wDataSize);
  4101. return true;
  4102. }
  4103. //解冻执行
  4104. bool CAttemperEngineSink::OnDBR_GR_USER_UNLOCK_BEANS_RETURNSEND(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4105. {
  4106. DBO_GR_UserReduceResult* pInfo = (DBO_GR_UserReduceResult*)pData;
  4107. IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID);
  4108. if (pIServerUserItem == NULL)
  4109. {
  4110. //用户不在此服务器上,上报中央服务器。
  4111. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_UNLOCK, pData, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  4112. //更新房间内元宝冻结值
  4113. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4114. if (0 == pInfo->result && pTableFrame)
  4115. {
  4116. if (pTableFrame->SetUserLockData(pInfo->dwUserID, 0) == true) return true;
  4117. }
  4118. return false;
  4119. }
  4120. if (0 != pInfo->result)
  4121. {
  4122. //解冻失败,此处需要记录日志
  4123. SendRequestFailure(pIServerUserItem, pInfo->szDescribeString, pInfo->result);
  4124. return true;
  4125. }
  4126. pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwCurrBeans;
  4127. //变量定义
  4128. CMD_GR_UserBean UserBeans;
  4129. ZeroMemory(&UserBeans, sizeof(UserBeans));
  4130. //构造变量
  4131. UserBeans.dwCurrBeans = pInfo->dwCurrBeans;
  4132. UserInfo::PB_CS_S_UserBean Bean;
  4133. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  4134. //发送数据
  4135. std::string pbdata = Bean.SerializePartialAsString();
  4136. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  4137. //更新房间内元宝冻结值
  4138. auto pTableFrame = GetTableFrame(pInfo->dwTable);
  4139. if (pTableFrame)
  4140. {
  4141. if (pTableFrame->SetUserLockData(pIServerUserItem->GetUserID(), 0) == true) return true;
  4142. }
  4143. return true;
  4144. }
  4145. //道具成功
  4146. //bool CAttemperEngineSink::OnDBPropertySuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4147. //{
  4148. // //变量定义
  4149. // DBO_GR_S_PropertySuccess * pPropertySuccess = (DBO_GR_S_PropertySuccess *)pData;
  4150. //
  4151. // //获取用户
  4152. // IServerUserItem * pISourceUserItem = m_ServerUserManager.SearchUserItem(pPropertySuccess->dwSourceUserID);
  4153. // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pPropertySuccess->dwTargetUserID);
  4154. //
  4155. // //赠送用户
  4156. // if (pISourceUserItem != NULL)
  4157. // {
  4158. // //变量定义
  4159. // SCORE lFrozenedScore = pPropertySuccess->lFrozenedScore;
  4160. //
  4161. // //解冻积分
  4162. // if ((lFrozenedScore > 0L) && (pISourceUserItem->UnFrozenedUserScore(lFrozenedScore) == false))
  4163. // {
  4164. // ASSERT(FALSE);
  4165. // return false;
  4166. // }
  4167. // }
  4168. //
  4169. // //更新魅力
  4170. // if (pISourceUserItem != NULL)
  4171. // {
  4172. // pISourceUserItem->ModifyUserProperty(0, pPropertySuccess->lSendLoveLiness);
  4173. // }
  4174. //
  4175. // //更新魅力
  4176. // if (pITargetUserItem != NULL)
  4177. // {
  4178. // pITargetUserItem->ModifyUserProperty(0, pPropertySuccess->lRecvLoveLiness);
  4179. // }
  4180. //
  4181. // //变量定义
  4182. // DWORD dwCurrentTime = (DWORD)time(NULL);
  4183. // tagUserProperty * pUserProperty = pITargetUserItem->GetUserProperty();
  4184. //
  4185. // //道具处理
  4186. // switch (pPropertySuccess->wPropertyIndex)
  4187. // {
  4188. // case PROPERTY_ID_TWO_CARD: //双倍积分
  4189. // {
  4190. // //使用判断
  4191. // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_DOUBLE_SCORE) != 0)
  4192. // {
  4193. // //变量定义
  4194. // DWORD dwValidTime = pUserProperty->PropertyInfo[0].wPropertyCount*pUserProperty->PropertyInfo[0].dwValidNum;
  4195. // if (pUserProperty->PropertyInfo[0].dwEffectTime + dwValidTime < dwCurrentTime)
  4196. // {
  4197. // pUserProperty->PropertyInfo[0].dwEffectTime = dwCurrentTime;
  4198. // pUserProperty->PropertyInfo[0].wPropertyCount = pPropertySuccess->wItemCount;
  4199. // pUserProperty->PropertyInfo[0].dwValidNum = VALID_TIME_DOUBLE_SCORE;
  4200. // }
  4201. // else
  4202. // {
  4203. // //数目累加
  4204. // pUserProperty->PropertyInfo[0].wPropertyCount += pPropertySuccess->wItemCount;
  4205. // }
  4206. // }
  4207. // else
  4208. // {
  4209. // //设置信息
  4210. // pUserProperty->PropertyInfo[0].dwEffectTime = dwCurrentTime;
  4211. // pUserProperty->PropertyInfo[0].wPropertyCount = pPropertySuccess->wItemCount;
  4212. // pUserProperty->PropertyInfo[0].dwValidNum = VALID_TIME_DOUBLE_SCORE;
  4213. // pUserProperty->wPropertyUseMark |= PT_USE_MARK_DOUBLE_SCORE;
  4214. // }
  4215. //
  4216. // break;
  4217. // }
  4218. // case PROPERTY_ID_FOUR_CARD: //四倍积分
  4219. // {
  4220. // //使用判断
  4221. // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_FOURE_SCORE) != 0)
  4222. // {
  4223. // //变量定义
  4224. // DWORD dwValidTime = pUserProperty->PropertyInfo[1].wPropertyCount*pUserProperty->PropertyInfo[1].dwValidNum;
  4225. // if (pUserProperty->PropertyInfo[1].dwEffectTime + dwValidTime < dwCurrentTime)
  4226. // {
  4227. // pUserProperty->PropertyInfo[1].dwEffectTime = dwCurrentTime;
  4228. // pUserProperty->PropertyInfo[1].wPropertyCount = pPropertySuccess->wItemCount;
  4229. // pUserProperty->PropertyInfo[1].dwValidNum = VALID_TIME_FOUR_SCORE;
  4230. // }
  4231. // else
  4232. // {
  4233. // //数目累加
  4234. // pUserProperty->PropertyInfo[1].wPropertyCount += pPropertySuccess->wItemCount;
  4235. // }
  4236. // }
  4237. // else
  4238. // {
  4239. // //设置信息
  4240. // pUserProperty->PropertyInfo[1].dwEffectTime = dwCurrentTime;
  4241. // pUserProperty->PropertyInfo[1].wPropertyCount = pPropertySuccess->wItemCount;
  4242. // pUserProperty->PropertyInfo[1].dwValidNum = VALID_TIME_FOUR_SCORE;
  4243. // pUserProperty->wPropertyUseMark |= PT_USE_MARK_FOURE_SCORE;
  4244. // }
  4245. // break;
  4246. // }
  4247. // case PROPERTY_ID_SCORE_CLEAR: //负分清零
  4248. // {
  4249. // //变量定义
  4250. // SCORE lCurrScore = pITargetUserItem->GetUserScore();
  4251. // if (lCurrScore < 0)
  4252. // {
  4253. // //用户信息
  4254. // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo();
  4255. // if (pUserInfo == NULL) return true;
  4256. //
  4257. // //修改积分
  4258. // pUserInfo->lScore = 0;
  4259. // }
  4260. // break;
  4261. // }
  4262. // case PROPERTY_ID_ESCAPE_CLEAR: //逃跑清零
  4263. // {
  4264. // //用户信息
  4265. // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo();
  4266. // if (pUserInfo == NULL) return true;
  4267. //
  4268. // //修改逃跑率
  4269. // if (pUserInfo->dwFleeCount > 0)
  4270. // {
  4271. // pUserInfo->dwFleeCount = 0;
  4272. // }
  4273. //
  4274. // break;
  4275. // }
  4276. // case PROPERTY_ID_GUARDKICK_CARD: //防踢卡
  4277. // {
  4278. // //使用判断
  4279. // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_GUARDKICK_CARD) != 0)
  4280. // {
  4281. // //变量定义
  4282. // DWORD dwValidTime = pUserProperty->PropertyInfo[2].wPropertyCount*pUserProperty->PropertyInfo[2].dwValidNum;
  4283. // if (pUserProperty->PropertyInfo[2].dwEffectTime + dwValidTime < dwCurrentTime)
  4284. // {
  4285. // pUserProperty->PropertyInfo[2].dwEffectTime = dwCurrentTime;
  4286. // pUserProperty->PropertyInfo[2].wPropertyCount = pPropertySuccess->wItemCount;
  4287. // pUserProperty->PropertyInfo[2].dwValidNum = VALID_TIME_GUARDKICK_CARD;
  4288. // }
  4289. // else
  4290. // {
  4291. // //数目累加
  4292. // pUserProperty->PropertyInfo[2].wPropertyCount += pPropertySuccess->wItemCount;
  4293. // }
  4294. // }
  4295. // else
  4296. // {
  4297. // //设置信息
  4298. // pUserProperty->PropertyInfo[2].dwEffectTime = dwCurrentTime;
  4299. // pUserProperty->PropertyInfo[2].wPropertyCount = pPropertySuccess->wItemCount;
  4300. // pUserProperty->PropertyInfo[2].dwValidNum = VALID_TIME_GUARDKICK_CARD;
  4301. // pUserProperty->wPropertyUseMark |= PT_USE_MARK_GUARDKICK_CARD;
  4302. // }
  4303. //
  4304. // break;
  4305. // }
  4306. // case PROPERTY_ID_POSSESS: //附身符
  4307. // {
  4308. // //使用判断
  4309. // if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_POSSESS) != 0)
  4310. // {
  4311. // //变量定义
  4312. // DWORD dwValidTime = pUserProperty->PropertyInfo[3].wPropertyCount*pUserProperty->PropertyInfo[3].dwValidNum;
  4313. // if (pUserProperty->PropertyInfo[3].dwEffectTime + dwValidTime < dwCurrentTime)
  4314. // {
  4315. // pUserProperty->PropertyInfo[3].dwEffectTime = dwCurrentTime;
  4316. // pUserProperty->PropertyInfo[3].wPropertyCount = pPropertySuccess->wItemCount;
  4317. // pUserProperty->PropertyInfo[3].dwValidNum = VALID_TIME_POSSESS;
  4318. // }
  4319. // else
  4320. // {
  4321. // //数目累加
  4322. // pUserProperty->PropertyInfo[3].wPropertyCount += pPropertySuccess->wItemCount;
  4323. // }
  4324. // }
  4325. // else
  4326. // {
  4327. // //设置信息
  4328. // pUserProperty->PropertyInfo[3].dwEffectTime = dwCurrentTime;
  4329. // pUserProperty->PropertyInfo[3].wPropertyCount = pPropertySuccess->wItemCount;
  4330. // pUserProperty->PropertyInfo[3].dwValidNum = VALID_TIME_POSSESS;
  4331. // pUserProperty->wPropertyUseMark |= PT_USE_MARK_POSSESS;
  4332. // }
  4333. //
  4334. // break;
  4335. // }
  4336. // case PROPERTY_ID_BLUERING_CARD: //蓝钻会员
  4337. // case PROPERTY_ID_YELLOWRING_CARD://黄钻会员
  4338. // case PROPERTY_ID_WHITERING_CARD: //白钻会员
  4339. // case PROPERTY_ID_REDRING_CARD: //红钻会员
  4340. // case PROPERTY_ID_VIPROOM_CARD: //VIP会员
  4341. // {
  4342. // //用户信息
  4343. // tagUserInfo * pUserInfo = pITargetUserItem->GetUserInfo();
  4344. // if (pUserInfo == NULL) return true;
  4345. //
  4346. // //更新会员
  4347. // pUserInfo->cbMemberOrder = pPropertySuccess->cbMemberOrder;
  4348. //
  4349. // //修改权限
  4350. // pITargetUserItem->ModifyUserRight(pPropertySuccess->dwUserRight, 0);
  4351. //
  4352. // //发送消息
  4353. // SendPropertyEffect(pITargetUserItem);
  4354. //
  4355. // break;
  4356. // }
  4357. // default: // 全部礼物
  4358. // {
  4359. // break;
  4360. // }
  4361. // }
  4362. //
  4363. // //消费方式
  4364. // if (pPropertySuccess->cbConsumeScore == FALSE)
  4365. // {
  4366. // pISourceUserItem->ModifyUserInsure(0, -pPropertySuccess->lConsumeGold, 0);
  4367. // }
  4368. //
  4369. // //喇叭判断
  4370. // if (pPropertySuccess->wPropertyIndex == PROPERTY_ID_TRUMPET || pPropertySuccess->wPropertyIndex == PROPERTY_ID_TYPHON)
  4371. // return true;
  4372. //
  4373. // //变量定义
  4374. // CMD_GR_S_PropertySuccess PropertySuccess;
  4375. // ZeroMemory(&PropertySuccess, sizeof(PropertySuccess));
  4376. //
  4377. // //设置变量
  4378. // PropertySuccess.cbRequestArea = pPropertySuccess->cbRequestArea;
  4379. // PropertySuccess.wItemCount = pPropertySuccess->wItemCount;
  4380. // PropertySuccess.wPropertyIndex = pPropertySuccess->wPropertyIndex;
  4381. // PropertySuccess.dwSourceUserID = pPropertySuccess->dwSourceUserID;
  4382. // PropertySuccess.dwTargetUserID = pPropertySuccess->dwTargetUserID;
  4383. //
  4384. // //发送消息
  4385. // if (pISourceUserItem != NULL)
  4386. // {
  4387. // SendData(pISourceUserItem, MDM_GR_USER, SUB_GR_PROPERTY_SUCCESS, &PropertySuccess, sizeof(PropertySuccess));
  4388. // }
  4389. //
  4390. // //发送消息
  4391. // if (pITargetUserItem != NULL && pITargetUserItem != pISourceUserItem)
  4392. // {
  4393. // SendData(pITargetUserItem, MDM_GR_USER, SUB_GR_PROPERTY_SUCCESS, &PropertySuccess, sizeof(PropertySuccess));
  4394. // }
  4395. //
  4396. // //广播礼物
  4397. // if (GetPropertyType(pPropertySuccess->wPropertyIndex) == PT_TYPE_PRESENT)
  4398. // SendPropertyMessage(PropertySuccess.dwSourceUserID, PropertySuccess.dwTargetUserID, PropertySuccess.wPropertyIndex,
  4399. // PropertySuccess.wItemCount);
  4400. //
  4401. // return true;
  4402. //}
  4403. //
  4404. ////道具失败
  4405. //bool CAttemperEngineSink::OnDBPropertyFailure(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4406. //{
  4407. // //参数校验
  4408. // ASSERT(wDataSize == sizeof(DBO_GR_PropertyFailure));
  4409. // if (wDataSize != sizeof(DBO_GR_PropertyFailure)) return false;
  4410. //
  4411. // //提取数据
  4412. // DBO_GR_PropertyFailure * pPropertyFailure = (DBO_GR_PropertyFailure *)pData;
  4413. // if (pPropertyFailure == NULL) return false;
  4414. //
  4415. // //变量定义
  4416. // WORD wBindIndex = LOWORD(dwContextID);
  4417. // tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  4418. // if (pBindParameter == NULL) return false;
  4419. // if (pBindParameter->pIServerUserItem == NULL) return false;
  4420. //
  4421. // //发送消息
  4422. // return SendPropertyFailure(pBindParameter->pIServerUserItem, pPropertyFailure->szDescribeString, 0L, pPropertyFailure->cbRequestArea);
  4423. //}
  4424. //
  4425. ////购买结果
  4426. //bool CAttemperEngineSink::OnDBPurchaseResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4427. //{
  4428. // //获取用户
  4429. // WORD wBindIndex = LOWORD(dwContextID);
  4430. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  4431. //
  4432. // //用户效验
  4433. // ASSERT(pIServerUserItem != NULL);
  4434. // if (pIServerUserItem == NULL) return false;
  4435. //
  4436. // //提取数据
  4437. // DBO_GR_PurchaseResult * pPurchaseResult = (DBO_GR_PurchaseResult *)pData;
  4438. //
  4439. // //构造结构
  4440. // CMD_GR_PurchaseResult PurchaseResult;
  4441. // ZeroMemory(&PurchaseResult, sizeof(PurchaseResult));
  4442. //
  4443. // //设置变量
  4444. // PurchaseResult.bSuccessed = pPurchaseResult->bSuccessed;
  4445. // PurchaseResult.lCurrScore = pPurchaseResult->lCurrScore;
  4446. // PurchaseResult.cbMemberOrder = pPurchaseResult->cbMemberOrder;
  4447. // lstrcpyn(PurchaseResult.szNotifyContent, pPurchaseResult->szNotifyContent, CountArray(PurchaseResult.szNotifyContent));
  4448. //
  4449. // //发送数据
  4450. // WORD wSendDataSize = sizeof(PurchaseResult) - sizeof(PurchaseResult.szNotifyContent);
  4451. // wSendDataSize += CountStringBuffer(PurchaseResult.szNotifyContent);
  4452. //
  4453. // DWORD dTableNum = 0;
  4454. // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  4455. // {
  4456. // auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  4457. //
  4458. // TCHAR szTemp[32] = { 0 };
  4459. // if (pat) pat->GetPrivateTableID(szTemp, 32);
  4460. // CString csTemp = szTemp;
  4461. //
  4462. // if (pat != nullptr && !csTemp.IsEmpty())
  4463. // {
  4464. // dTableNum = _wtol(csTemp);
  4465. // }
  4466. // }
  4467. //
  4468. // CString csSend;
  4469. // CString csTest = AfxGetAppName();
  4470. //
  4471. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_EXCHANGE, SUB_GR_PURCHASE_RESULT);
  4472. // //OutputDebugString(csSend);
  4473. // 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());
  4474. //
  4475. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_PURCHASE_RESULT, &PurchaseResult, wSendDataSize);
  4476. //
  4477. // //结果判断
  4478. // if (PurchaseResult.bSuccessed == true)
  4479. // {
  4480. // //设置权限
  4481. // pIServerUserItem->ModifyUserRight(pPurchaseResult->dwUserRight, 0, UR_KIND_SERVER);
  4482. //
  4483. // //更新游戏币
  4484. // if (m_pGameServiceOption->wServerType == GAME_GENRE_GOLD)
  4485. // {
  4486. // pIServerUserItem->ModifyUserInsure(PurchaseResult.lCurrScore - pIServerUserItem->GetUserScore(), 0, 0);
  4487. // }
  4488. // }
  4489. //
  4490. // return true;
  4491. //}
  4492. //
  4493. ////兑换结果(钻石交换金币的结果)
  4494. //bool CAttemperEngineSink::OnDBExChangeResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4495. //{
  4496. // //获取用户
  4497. // WORD wBindIndex = LOWORD(dwContextID);
  4498. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  4499. //
  4500. // //用户效验
  4501. // ASSERT(pIServerUserItem != NULL);
  4502. // if (pIServerUserItem == NULL) return false;
  4503. //
  4504. // //提取数据
  4505. // DBO_GR_ExchangeResult * pExchangeResult = (DBO_GR_ExchangeResult *)pData;
  4506. //
  4507. // //构造结构
  4508. // //CMD_GP_ExchangeResult ExchangeResult;
  4509. // //ZeroMemory(&ExchangeResult, sizeof(ExchangeResult));
  4510. //
  4511. // ////设置变量
  4512. // //ExchangeResult.bSuccessed = pExchangeResult->bSuccessed;
  4513. // //ExchangeResult.lCurrScore = pExchangeResult->lCurrScore;
  4514. // //ExchangeResult.lCurrIngot = pExchangeResult->lCurrIngot;
  4515. // //lstrcpyn(ExchangeResult.szNotifyContent, pExchangeResult->szNotifyContent, CountArray(ExchangeResult.szNotifyContent));
  4516. //
  4517. // //TRACE(L"\n***兑换结果 UserID=%d lCurrIngot=%lld lCurrScore=%llld\n", pIServerUserItem->GetUserID(), ExchangeResult.lCurrIngot, ExchangeResult.lCurrScore);
  4518. //
  4519. // ////发送数据
  4520. // //WORD wSendDataSize = sizeof(ExchangeResult) - sizeof(ExchangeResult.szNotifyContent);
  4521. // //wSendDataSize += CountStringBuffer(ExchangeResult.szNotifyContent);
  4522. //
  4523. // DWORD dTableNum = 0;
  4524. // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  4525. // {
  4526. // auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  4527. // if (pat != nullptr && !pat->GetPrivateTableID().empty())
  4528. // {
  4529. // dTableNum = _wtol(pat->GetPrivateTableID().c_str());
  4530. // }
  4531. // }
  4532. //
  4533. // CString csSend;
  4534. // CString csTest = AfxGetAppName();
  4535. //
  4536. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_RESULT);
  4537. // //OutputDebugString(csSend);
  4538. // 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());
  4539. //
  4540. // //m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_RESULT, &ExchangeResult, sizeof(ExchangeResult));
  4541. //
  4542. // //TRACE(L"\n***sizeof(ExchangeResult)=%d, sizeof(SCORE)=%d \n", sizeof(ExchangeResult), sizeof(SCORE));
  4543. //
  4544. // /////[+++兑换成功,更新下
  4545. // //if (ExchangeResult.bSuccessed)
  4546. // //{
  4547. // // pIServerUserItem->GetUserInfo()->lScore = ExchangeResult.lCurrScore;
  4548. // // pIServerUserItem->GetUserInfo()->dwBean = ExchangeResult.lCurrIngot;
  4549. // //}
  4550. // ///+++]
  4551. //
  4552. // //更新游戏币 ---好友场也会兑换的
  4553. // ////if (ExchangeResult.bSuccessed == true)
  4554. // ////{ ///差值即是兑换产生的金币
  4555. // //// pIServerUserItem->ModifyUserInsure(ExchangeResult.lCurrScore - pIServerUserItem->GetUserScore(), 0, 0);
  4556. // ////}
  4557. //
  4558. // return true;
  4559. //}
  4560. //
  4561. ////任务列表
  4562. //bool CAttemperEngineSink::OnDBUserTaskList(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4563. //{
  4564. // //变量定义
  4565. // DBO_GR_TaskListInfo * pTaskListInfo = (DBO_GR_TaskListInfo *)pData;
  4566. //
  4567. // //拷贝数据
  4568. // WORD wTaskCount = __min(pTaskListInfo->wTaskCount, CountArray(m_TaskParameter) - m_wTaskCount);
  4569. // CopyMemory(m_TaskParameter + m_wTaskCount, ++pTaskListInfo, sizeof(tagTaskParameter)*wTaskCount);
  4570. //
  4571. // //设置变量
  4572. // m_wTaskCount += wTaskCount;
  4573. //
  4574. // return true;
  4575. //}
  4576. //
  4577. ////任务结束
  4578. //bool CAttemperEngineSink::OnDBUserTaskListEnd(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4579. //{
  4580. // //移除任务
  4581. // m_UserTaskManager.RemoveTaskParameter();
  4582. //
  4583. // //添加任务
  4584. // m_UserTaskManager.AddTaskParameter(m_TaskParameter, m_wTaskCount);
  4585. //
  4586. // return true;
  4587. //}
  4588. //
  4589. ////任务信息
  4590. //bool CAttemperEngineSink::OnDBUserTaskInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4591. //{
  4592. // //判断在线
  4593. // ASSERT(wDataSize <= sizeof(DBO_GR_TaskInfo));
  4594. // if (wDataSize > sizeof(DBO_GR_TaskInfo)) return false;
  4595. //
  4596. // //变量定义
  4597. // DBO_GR_TaskInfo * pTaskInfo = (DBO_GR_TaskInfo *)pData;
  4598. //
  4599. // //网络数据
  4600. // WORD wTaskCount = 0;
  4601. // BYTE cbDataBuffer[SOCKET_TCP_PACKET];
  4602. // LPBYTE pDataBuffer = cbDataBuffer;
  4603. //
  4604. // //设置数量
  4605. // pDataBuffer += sizeof(wTaskCount);
  4606. // WORD wSendSize = sizeof(wTaskCount);
  4607. //
  4608. // //变量定义
  4609. // POSITION Position = NULL;
  4610. // do
  4611. // {
  4612. // tagTaskParameter * pTaskParameter = m_UserTaskManager.EnumTaskParameter(Position);
  4613. // if (pTaskParameter != NULL)
  4614. // {
  4615. // //越界判断
  4616. // if (wSendSize + sizeof(tagTaskParameter) > SOCKET_TCP_PACKET)
  4617. // {
  4618. // //重置变量
  4619. // pDataBuffer = cbDataBuffer;
  4620. // *(WORD*)pDataBuffer = wTaskCount;
  4621. //
  4622. // CString csSend;
  4623. // CString csTest = AfxGetAppName();
  4624. //
  4625. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_LIST);
  4626. // //OutputDebugString(csSend);
  4627. // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_LIST, pData, wDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  4628. //
  4629. // //发送数据
  4630. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_LIST, pDataBuffer, wSendSize);
  4631. //
  4632. // //重置变量
  4633. // wTaskCount = 0;
  4634. // pDataBuffer += sizeof(wSendSize);
  4635. // wSendSize = sizeof(wSendSize);
  4636. // }
  4637. //
  4638. // //计算大小
  4639. // WORD wParameterSize = sizeof(tagTaskParameter) - sizeof(pTaskParameter->szTaskDescribe) + CountStringBuffer(pTaskParameter->szTaskDescribe);
  4640. // *(WORD *)pDataBuffer = wParameterSize;
  4641. // pDataBuffer += sizeof(wParameterSize);
  4642. // wSendSize += sizeof(wParameterSize);
  4643. //
  4644. // //拷贝数据
  4645. // CopyMemory(pDataBuffer, pTaskParameter, wParameterSize);
  4646. //
  4647. // //推进指针
  4648. // wTaskCount++;
  4649. // pDataBuffer += wParameterSize;
  4650. // wSendSize += wParameterSize;
  4651. // }
  4652. // } while (Position != NULL);
  4653. //
  4654. // //剩余发送
  4655. // if (wTaskCount > 0 && wSendSize)
  4656. // {
  4657. // //重置变量
  4658. // pDataBuffer = cbDataBuffer;
  4659. // *(WORD *)pDataBuffer = wTaskCount;
  4660. //
  4661. // CString csSend;
  4662. // CString csTest = AfxGetAppName();
  4663. //
  4664. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_LIST);
  4665. // //OutputDebugString(csSend);
  4666. // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_LIST, pData, wDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  4667. //
  4668. // //发送数据
  4669. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_LIST, pDataBuffer, wSendSize);
  4670. // }
  4671. //
  4672. // //构造结构
  4673. // CMD_GR_S_TaskInfo TaskInfo;
  4674. // TaskInfo.wTaskCount = pTaskInfo->wTaskCount;
  4675. // CopyMemory(TaskInfo.TaskStatus, pTaskInfo->TaskStatus, sizeof(TaskInfo.TaskStatus[0])*pTaskInfo->wTaskCount);
  4676. //
  4677. // //发送数据
  4678. // WORD wSendDataSize = sizeof(TaskInfo) - sizeof(TaskInfo.TaskStatus);
  4679. // wSendDataSize += sizeof(TaskInfo.TaskStatus[0])*TaskInfo.wTaskCount;
  4680. //
  4681. // CString csSend;
  4682. // CString csTest = AfxGetAppName();
  4683. //
  4684. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_INFO);
  4685. // //OutputDebugString(csSend);
  4686. // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_INFO, &TaskInfo, wSendDataSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  4687. //
  4688. //
  4689. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_INFO, &TaskInfo, wSendDataSize);
  4690. //
  4691. // return true;
  4692. //}
  4693. //
  4694. ////任务结果
  4695. //bool CAttemperEngineSink::OnDBUserTaskResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4696. //{
  4697. // //判断在线
  4698. // ASSERT(wDataSize <= sizeof(DBO_GR_TaskResult));
  4699. // if (wDataSize > sizeof(DBO_GR_TaskResult)) return false;
  4700. //
  4701. // //获取用户
  4702. // WORD wBindIndex = LOWORD(dwContextID);
  4703. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  4704. //
  4705. // //用户效验
  4706. // ASSERT(pIServerUserItem != NULL);
  4707. // if (pIServerUserItem == NULL) return false;
  4708. //
  4709. // //变量定义
  4710. // DBO_GR_TaskResult * pTaskResult = (DBO_GR_TaskResult *)pData;
  4711. //
  4712. // //变量定义
  4713. // CMD_GR_S_TaskResult TaskResult;
  4714. // ZeroMemory(&TaskResult, sizeof(TaskResult));
  4715. //
  4716. // //构造变量
  4717. // TaskResult.wCommandID = pTaskResult->wCommandID;
  4718. // TaskResult.bSuccessed = pTaskResult->bSuccessed;
  4719. // TaskResult.lCurrScore = pTaskResult->lCurrScore;
  4720. // TaskResult.lCurrIngot = pTaskResult->lCurrIngot;
  4721. // lstrcpyn(TaskResult.szNotifyContent, pTaskResult->szNotifyContent, CountArray(TaskResult.szNotifyContent));
  4722. //
  4723. // //发送数据
  4724. // WORD wSendSize = sizeof(TaskResult) - sizeof(TaskResult.szNotifyContent) + CountStringBuffer(TaskResult.szNotifyContent);
  4725. //
  4726. // CString csSend;
  4727. // CString csTest = AfxGetAppName();
  4728. //
  4729. // csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_RESULT);
  4730. // //OutputDebugString(csSend);
  4731. // Commend::ToShow(this, MDM_GR_TASK, SUB_GR_TASK_RESULT, &TaskResult, wSendSize, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString());
  4732. //
  4733. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_TASK, SUB_GR_TASK_RESULT, &TaskResult, wSendSize);
  4734. //
  4735. // //设置任务
  4736. // if (TaskResult.bSuccessed == true && TaskResult.wCommandID == SUB_GR_TASK_TAKE)
  4737. // {
  4738. // tagTaskParameter * pTaskParameter = m_UserTaskManager.SearchTaskParameter(pTaskResult->wCurrTaskID);
  4739. // if (pTaskParameter != NULL && pTaskParameter->wKindID == m_pGameServiceOption->wKindID)
  4740. // {
  4741. // //变量定义
  4742. // tagUserTaskInfo UserTaskInfo;
  4743. //
  4744. // //设置任务
  4745. // UserTaskInfo.wTaskProgress = 0;
  4746. // UserTaskInfo.cbTaskStatus = TASK_STATUS_UNFINISH;
  4747. // UserTaskInfo.wTaskID = pTaskResult->wCurrTaskID;
  4748. // UserTaskInfo.dwResidueTime = pTaskParameter->dwTimeLimit;
  4749. // UserTaskInfo.dwLastUpdateTime = (DWORD)time(NULL);
  4750. //
  4751. // //设置任务
  4752. // m_UserTaskManager.SetUserTaskInfo(pIServerUserItem->GetUserID(), &UserTaskInfo, 1);
  4753. // }
  4754. // }
  4755. //
  4756. // return true;
  4757. //}
  4758. //
  4759. //系统消息
  4760. //bool CAttemperEngineSink::OnDBSystemMessage(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4761. //{
  4762. // //参数校验
  4763. // ASSERT(wDataSize == sizeof(DBR_GR_SystemMessage));
  4764. // if (wDataSize != sizeof(DBR_GR_SystemMessage)) return false;
  4765. //
  4766. // //提取数据
  4767. // DBR_GR_SystemMessage * pSystemMessage = (DBR_GR_SystemMessage *)pData;
  4768. // if (pSystemMessage == NULL) return false;
  4769. //
  4770. // for (INT_PTR nIndex = m_SystemMessageBuffer.GetCount() - 1; nIndex >= 0; nIndex--)
  4771. // {
  4772. // tagSystemMessage *pTagSystemMessage = m_SystemMessageBuffer[nIndex];
  4773. // if (pTagSystemMessage && pTagSystemMessage->SystemMessage.dwMessageID == pSystemMessage->dwMessageID)
  4774. // {
  4775. // CopyMemory(&pTagSystemMessage->SystemMessage, pSystemMessage, sizeof(DBR_GR_SystemMessage));
  4776. // m_SystemMessageActive.Add(pTagSystemMessage);
  4777. // m_SystemMessageBuffer.RemoveAt(nIndex);
  4778. //
  4779. // return true;
  4780. // }
  4781. // }
  4782. //
  4783. // //定义变量
  4784. // tagSystemMessage *pSendMessage = new tagSystemMessage;
  4785. // ZeroMemory(pSendMessage, sizeof(tagSystemMessage));
  4786. //
  4787. // //设置变量
  4788. // pSendMessage->dwLastTime = (DWORD)pSystemMessage->tStartTime;
  4789. // CopyMemory(&pSendMessage->SystemMessage, pSystemMessage, sizeof(DBR_GR_SystemMessage));
  4790. //
  4791. // //记录消息
  4792. // m_SystemMessageActive.Add(pSendMessage);
  4793. //
  4794. // return true;
  4795. //}
  4796. //
  4797. //
  4798. ////加载完成
  4799. //bool CAttemperEngineSink::OnDBSystemMessageFinish(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4800. //{
  4801. // //处理临时消息
  4802. // if (m_SystemMessageBuffer.GetCount() > 0)
  4803. // {
  4804. // //变量定义
  4805. // tagSystemMessage *pTagSystemMessage = NULL;
  4806. //
  4807. // for (INT_PTR nIndex = m_SystemMessageBuffer.GetCount() - 1; nIndex >= 0; nIndex--)
  4808. // {
  4809. // pTagSystemMessage = m_SystemMessageBuffer[nIndex];
  4810. // if (pTagSystemMessage && pTagSystemMessage->SystemMessage.dwMessageID == TEMP_MESSAGE_ID)
  4811. // {
  4812. // m_SystemMessageActive.Add(pTagSystemMessage);
  4813. // m_SystemMessageBuffer.RemoveAt(nIndex);
  4814. // }
  4815. // }
  4816. // }
  4817. //
  4818. // return true;
  4819. //}
  4820. //加载敏感词
  4821. //bool CAttemperEngineSink::OnDBSensitiveWords(DWORD dwContextID, VOID * pData, WORD wDataSize)
  4822. //{
  4823. // //开始加载
  4824. // if (dwContextID == 0xfffe)
  4825. // {
  4826. // m_WordsFilter.ResetSensitiveWordArray();
  4827. // m_pITimerEngine->KillTimer(IDI_LOAD_SENSITIVE_WORD);
  4828. // return true;
  4829. // }
  4830. //
  4831. // //加载完成
  4832. // if (dwContextID == 0xffff)
  4833. // {
  4834. // m_WordsFilter.FinishAdd();
  4835. // return true;
  4836. // }
  4837. //
  4838. // //加载敏感词
  4839. // const TCHAR *pWords = (const TCHAR*)pData;
  4840. // m_WordsFilter.AddSensitiveWords(pWords);
  4841. // return true;
  4842. //}
  4843. //注册事件
  4844. bool CAttemperEngineSink::OnTCPSocketMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  4845. {
  4846. switch (wSubCmdID)
  4847. {
  4848. case SUB_CS_S_REGISTER_FAILURE: //注册失败
  4849. {
  4850. //变量定义
  4851. CMD_CS_S_RegisterFailure * pRegisterFailure = (CMD_CS_S_RegisterFailure *)pData;
  4852. //效验参数
  4853. ASSERT(wDataSize >= (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString)));
  4854. if (wDataSize < (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString))) return false;
  4855. //关闭处理
  4856. m_bNeekCorrespond = false;
  4857. m_pITCPSocketService->CloseSocket();
  4858. //显示消息
  4859. if (lstrlen(pRegisterFailure->szDescribeString) > 0)
  4860. {
  4861. CTraceService::TraceString(pRegisterFailure->szDescribeString, TraceLevel_Exception);
  4862. }
  4863. //事件通知
  4864. CP_ControlResult ControlResult;
  4865. ControlResult.cbSuccess = ER_FAILURE;
  4866. SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult));
  4867. return true;
  4868. }
  4869. default: break;
  4870. }
  4871. return true;
  4872. }
  4873. //列表事件
  4874. bool CAttemperEngineSink::OnTCPSocketMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  4875. {
  4876. switch (wSubCmdID)
  4877. {
  4878. case SUB_CS_S_SERVER_INFO: //房间信息
  4879. {
  4880. //废弃列表
  4881. m_ServerListManager.DisuseServerItem();
  4882. //注册比赛
  4883. if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH)
  4884. {
  4885. //构造结构
  4886. CMD_CS_C_RegisterMatch RegitsterMatch;
  4887. ZeroMemory(&RegitsterMatch, sizeof(RegitsterMatch));
  4888. //设置结构
  4889. RegitsterMatch.wServerID = m_pGameServiceOption->wServerID;
  4890. RegitsterMatch.dwMatchID = m_pGameMatchOption->dwMatchID;
  4891. RegitsterMatch.dwMatchNO = m_pGameMatchOption->dwMatchNO;
  4892. RegitsterMatch.cbMatchType = m_pGameMatchOption->cbMatchType;
  4893. RegitsterMatch.lMatchFee = m_pGameMatchOption->lMatchFee;
  4894. RegitsterMatch.cbMatchFeeType = m_pGameMatchOption->cbMatchFeeType;
  4895. RegitsterMatch.cbMemberOrder = m_pGameMatchOption->cbMemberOrder;
  4896. RegitsterMatch.wRewardCount = m_pGameMatchOption->wRewardCount;
  4897. //拷贝信息
  4898. lstrcpyn(RegitsterMatch.szMatchName, m_pGameMatchOption->szMatchName, CountArray(RegitsterMatch.szMatchName));
  4899. //定时赛制
  4900. if (m_pGameMatchOption->cbMatchType == MATCH_TYPE_LOCKTIME)
  4901. {
  4902. RegitsterMatch.MatchEndTime = m_pGameMatchOption->MatchType.LockTime.MatchEndTime;
  4903. RegitsterMatch.MatchStartTime = m_pGameMatchOption->MatchType.LockTime.MatchStartTime;
  4904. RegitsterMatch.wMatchPlayCount = m_pGameMatchOption->MatchType.LockTime.wMatchPlayCount;
  4905. }
  4906. //即时赛制
  4907. if (m_pGameMatchOption->cbMatchType == MATCH_TYPE_IMMEDIATE)
  4908. {
  4909. RegitsterMatch.wMatchPlayCount = m_pGameMatchOption->MatchType.Immediate.cbPlayCount;
  4910. RegitsterMatch.wStartUserCount = m_pGameMatchOption->MatchType.Immediate.wStartUserCount;
  4911. }
  4912. //发送数据
  4913. ASSERT(m_pITCPSocketService != NULL);
  4914. m_pITCPSocketService->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_MATCH, &RegitsterMatch, sizeof(RegitsterMatch)/*,0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  4915. }
  4916. return true;
  4917. }
  4918. case SUB_CS_S_SERVER_STAT:
  4919. {
  4920. //游戏节点状态改变
  4921. //效验参数
  4922. ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT));
  4923. if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false;
  4924. //变量定义
  4925. JN_GR_SERVICESTAT * pServerModify = (JN_GR_SERVICESTAT *)pData;
  4926. //查找房间
  4927. ASSERT(m_ServerListManager.SearchGameServer(pServerModify->dwServerID));
  4928. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->dwServerID);
  4929. //设置房间
  4930. if (pGameServerItem != NULL)
  4931. {
  4932. //修改房间信息
  4933. pGameServerItem->m_GameServer.bService = pServerModify->bService;
  4934. }
  4935. return true;
  4936. }
  4937. case SUB_CS_S_SERVER_ONLINE: //房间人数
  4938. {
  4939. //效验参数
  4940. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerOnLine));
  4941. if (wDataSize != sizeof(CMD_CS_S_ServerOnLine)) return false;
  4942. //变量定义
  4943. CMD_CS_S_ServerOnLine * pServerOnLine = (CMD_CS_S_ServerOnLine *)pData;
  4944. //查找房间
  4945. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerOnLine->wServerID);
  4946. //设置人数
  4947. if (pGameServerItem != NULL)
  4948. {
  4949. pGameServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount;
  4950. pGameServerItem->m_GameServer.wTableFullCount = pServerOnLine->wTableFullCount;
  4951. pGameServerItem->m_GameServer.wTableOnlineCount = pServerOnLine->wTableOnlineCount;
  4952. ///汇总同一场馆的人数
  4953. //SumOnlineCount(pGameServerItem->m_GameServer.wNodeID);
  4954. }
  4955. return true;
  4956. }
  4957. case SUB_CS_S_SERVER_INSERT: //房间插入
  4958. {
  4959. //效验参数
  4960. ASSERT(wDataSize % sizeof(tagGameServer) == 0);
  4961. if (wDataSize % sizeof(tagGameServer) != 0) return false;
  4962. //变量定义
  4963. WORD wItemCount = wDataSize / sizeof(tagGameServer);
  4964. tagGameServer * pGameServer = (tagGameServer *)pData;
  4965. //更新数据
  4966. for (WORD i = 0; i < wItemCount; i++)
  4967. {
  4968. CString csTestB;
  4969. csTestB.Format(_T("房间插入[%d] -> %s:%d "), pGameServer->wServerID , pGameServer->szServerAddr, pGameServer->wServerPort);
  4970. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  4971. m_ServerListManager.InsertGameServer(pGameServer++);
  4972. }
  4973. //更新加载通道
  4974. UpDataTongDao();
  4975. return true;
  4976. }
  4977. case SUB_CS_S_SERVER_MODIFY: //房间修改
  4978. {
  4979. //效验参数
  4980. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerModify));
  4981. if (wDataSize != sizeof(CMD_CS_S_ServerModify)) return false;
  4982. //变量定义
  4983. CMD_CS_S_ServerModify * pServerModify = (CMD_CS_S_ServerModify *)pData;
  4984. //查找房间
  4985. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->wServerID);
  4986. //设置房间
  4987. if (pGameServerItem != NULL)
  4988. {
  4989. pGameServerItem->m_GameServer.wNodeID = pServerModify->wNodeID;
  4990. pGameServerItem->m_GameServer.wSortID = pServerModify->wSortID;
  4991. pGameServerItem->m_GameServer.wServerPort = pServerModify->wServerPort;
  4992. pGameServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount;
  4993. pGameServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount;
  4994. lstrcpyn(pGameServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGameServerItem->m_GameServer.szServerName));
  4995. lstrcpyn(pGameServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGameServerItem->m_GameServer.szServerAddr));
  4996. }
  4997. return true;
  4998. }
  4999. case SUB_CS_S_SERVER_REMOVE: //房间删除
  5000. {
  5001. //效验参数
  5002. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerRemove));
  5003. if (wDataSize != sizeof(CMD_CS_S_ServerRemove)) return false;
  5004. //变量定义
  5005. CMD_CS_S_ServerRemove * pServerRemove = (CMD_CS_S_ServerRemove *)pData;
  5006. //变量定义
  5007. m_ServerListManager.DeleteGameServer(pServerRemove->wServerID);
  5008. return true;
  5009. }
  5010. case SUB_CS_S_SERVER_FINISH: //房间完成
  5011. {
  5012. //清理列表
  5013. m_ServerListManager.CleanServerItem();
  5014. //事件处理
  5015. CP_ControlResult ControlResult;
  5016. ControlResult.cbSuccess = ER_SUCCESS;
  5017. SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult));
  5018. return true;
  5019. }
  5020. case SUB_CS_S_SERVER_USER_INFO: //用户房间信息
  5021. {
  5022. return true;
  5023. }
  5024. case SUB_CS_C_SERVER_JULI_ACK:
  5025. {
  5026. ASSERT(wDataSize == sizeof(CMD_CS_C_JULI));
  5027. if (wDataSize != sizeof(CMD_CS_C_JULI)) return true;
  5028. CMD_CS_C_JULI *p = (CMD_CS_C_JULI*)pData;
  5029. m_MapUserIDJuli[p->dUserID] = p->llJuLi;
  5030. return true;
  5031. }
  5032. default: break;
  5033. }
  5034. return true;
  5035. }
  5036. //汇总事件
  5037. bool CAttemperEngineSink::OnTCPSocketMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  5038. {
  5039. switch (wSubCmdID)
  5040. {
  5041. case SUB_CS_DISSOLVEROOM:
  5042. {
  5043. //群主解散俱乐部房间
  5044. ASSERT(wDataSize == sizeof(DWORD));
  5045. if (wDataSize != sizeof(DWORD)) return false;
  5046. DWORD *dwRoomID = (DWORD *)pData;
  5047. GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSROOM, 0, dwRoomID, sizeof(DWORD));
  5048. break;
  5049. }
  5050. case SUB_CS_ChangServer:
  5051. {
  5052. //自动创房
  5053. ASSERT(wDataSize == sizeof(CMD_GR_ClubAction2_XT));
  5054. if (wDataSize != sizeof(CMD_GR_ClubAction2_XT)) return false;
  5055. CMD_GR_ClubAction2_XT * pClubAction = (CMD_GR_ClubAction2_XT *)pData;
  5056. this->OnAutoCreateRoomToDB(pClubAction->dwClubID, 0, pClubAction->wWanFa);
  5057. //m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, 0, pData, wDataSize);
  5058. break;
  5059. }
  5060. case SUB_CS_C_USER_ONLINE:
  5061. {
  5062. //OutputDebugStringA("收到用户上线相通知");
  5063. CMD_CS_C_UserEnter * pUserChat = (CMD_CS_C_UserEnter *)pData;
  5064. //效验参数
  5065. ASSERT(wDataSize == sizeof(CMD_CS_C_UserEnter));
  5066. //效验参数
  5067. if (wDataSize != sizeof(CMD_CS_C_UserEnter)) return false;
  5068. auto iter = m_OnLineUserAll.find(pUserChat->dwUserID);
  5069. if (iter != m_OnLineUserAll.end())
  5070. {
  5071. m_OnLineUserAll.erase(iter);
  5072. }
  5073. m_OnLineUserAll[pUserChat->dwUserID] = *pUserChat;
  5074. break;
  5075. }
  5076. case SUB_CS_C_USER_OFFLINE:
  5077. {
  5078. //OutputDebugStringA("收到用户离线通知");
  5079. CMD_CS_C_UserLeave * pUserChat = (CMD_CS_C_UserLeave *)pData;
  5080. //效验参数
  5081. ASSERT(wDataSize == sizeof(CMD_CS_C_UserLeave));
  5082. //效验参数
  5083. if (wDataSize != sizeof(CMD_CS_C_UserLeave)) return false;
  5084. auto iter = m_OnLineUserAll.find(pUserChat->dwUserID);
  5085. if (iter != m_OnLineUserAll.end())
  5086. {
  5087. m_OnLineUserAll.erase(iter);
  5088. }
  5089. break;
  5090. }
  5091. case SUB_CS_C_USER_DisCONN:
  5092. {
  5093. //OutputDebugStringA("强行断开某用户通知");
  5094. //DWORD *pUserID = (DWORD*)pData;
  5095. //IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(*pUserID);
  5096. ////断开用户
  5097. //if (pIServerUserItem && pIServerUserItem->GetBindIndex() != INVALID_WORD)
  5098. //{
  5099. // //发送通知
  5100. // LPCTSTR pszMessage = TEXT("网络连接不稳定,请重试.");
  5101. // SendRoomMessage(pIServerUserItem, pszMessage, SMT_CLOSE_SEND);
  5102. // //绑定参数
  5103. // WORD wSourceIndex = pIServerUserItem->GetBindIndex();
  5104. // tagBindParameter * pSourceParameter = GetBindParameter(wSourceIndex);
  5105. // //解除绑定
  5106. // ASSERT((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem));
  5107. // if ((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem))
  5108. // {
  5109. // pSourceParameter->pIServerUserItem = NULL;
  5110. // }
  5111. // //断开用户
  5112. // if (pIServerUserItem->IsAndroidUser() == true)
  5113. // {
  5114. // m_AndroidUserManager.DeleteAndroidUserItem(pSourceParameter->dwSocketID, true);
  5115. // }
  5116. // else
  5117. // {
  5118. // m_pITCPNetworkEngine->ShutDownSocket(pSourceParameter->dwSocketID);
  5119. // }
  5120. // m_ServerUserManager.DeleteUserItem(pIServerUserItem);
  5121. //}
  5122. break;
  5123. }
  5124. case SUB_CS_C_USER_SendMessage:
  5125. {
  5126. CMD_GR_Club_NotifyEX_ACK * pUserChat = (CMD_GR_Club_NotifyEX_ACK *)pData;
  5127. //效验参数
  5128. ASSERT(wDataSize == sizeof(CMD_GR_Club_NotifyEX_ACK));
  5129. //效验参数
  5130. if (wDataSize != sizeof(CMD_GR_Club_NotifyEX_ACK)) return false;
  5131. if ((pUserChat->Notify.newsFalg == 99) || (pUserChat->Notify.newsFalg == 100))
  5132. {
  5133. CMD_GR_Club_Make_A_Sample Sample;
  5134. ZeroMemory(&Sample, sizeof(Sample));
  5135. Sample.dwClubID = pUserChat->Notify.dwClubID;
  5136. if (pUserChat->Notify.newsFalg == 99)
  5137. {
  5138. Sample.IsSample = 0;
  5139. }
  5140. else
  5141. {
  5142. Sample.IsSample = 1;
  5143. }
  5144. //本地在线用户
  5145. WORD wUserIndex = 0;
  5146. IServerUserItem * pIServerUserItemSend = NULL;
  5147. while (true)
  5148. {
  5149. pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  5150. if (pIServerUserItemSend == NULL) break;
  5151. if (pIServerUserItemSend->GetUserID() == pUserChat->dwUserId)
  5152. {
  5153. tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex());
  5154. //发送数据
  5155. if (pBindParameter != NULL)
  5156. {
  5157. Club::PB_CS_Club_Make_A_Sample MakeSample;
  5158. MakeSample.set_dwclubid(Sample.dwClubID);
  5159. MakeSample.set_issample(Sample.IsSample);
  5160. //发送数据
  5161. std::string pbdata = MakeSample.SerializePartialAsString();
  5162. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_CLUB_GET_MAKEA_SAMPLE_ACK, (void*)pbdata.c_str(), pbdata.length());
  5163. break;
  5164. }
  5165. }
  5166. }
  5167. }
  5168. else
  5169. {
  5170. CMD_GR_Club_Notify_ACKEX NotifyAck;
  5171. ZeroMemory(&NotifyAck, sizeof(NotifyAck));
  5172. NotifyAck.newsFalg = pUserChat->Notify.newsFalg;
  5173. NotifyAck.dwClubID = pUserChat->Notify.dwClubID;
  5174. NotifyAck.dwUserCount = pUserChat->Notify.dwUserCount;
  5175. CopyMemory(NotifyAck.Message, pUserChat->Notify.Message, sizeof(NotifyAck.Message));
  5176. //本地在线用户
  5177. WORD wUserIndex = 0;
  5178. while (true)
  5179. {
  5180. IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  5181. if (pIServerUserItemSend == NULL) break;
  5182. if (pIServerUserItemSend->GetUserID() == pUserChat->dwUserId)
  5183. {
  5184. tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex());
  5185. //发送数据
  5186. if (pBindParameter != NULL)
  5187. {
  5188. //广播新申请用户
  5189. if (pUserChat->Notify.newsFalg == 3)
  5190. {
  5191. CMD_GR_TableOtherInfo_Notify TableOtherInfo;
  5192. ZeroMemory(&TableOtherInfo, sizeof(TableOtherInfo));
  5193. TableOtherInfo.ClubID = pUserChat->Notify.dwClubID;
  5194. TableOtherInfo.Type = 16;
  5195. TableOtherInfo.newUserNum = pUserChat->Notify.dwUserCount;
  5196. Club::PB_CS_S_TableOtherInfo_Notify Notify;
  5197. Notify.set_clubid(TableOtherInfo.ClubID);
  5198. Notify.set_newmsgnum(TableOtherInfo.newMsgNum);
  5199. Notify.set_newusernum(TableOtherInfo.newUserNum);
  5200. Notify.set_onlineusernum(TableOtherInfo.onlineUserNum);
  5201. Notify.set_playtablenum(TableOtherInfo.playTableNum);
  5202. Notify.set_totaltablenum(TableOtherInfo.totalTableNum);
  5203. Notify.set_totalusernum(TableOtherInfo.totalUserNum);
  5204. Notify.set_type(TableOtherInfo.Type);
  5205. Notify.set_waittablenum(TableOtherInfo.waitTableNum);
  5206. //发送数据
  5207. std::string pbdata = Notify.SerializePartialAsString();
  5208. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_CLUBCHANGE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length());
  5209. }
  5210. Club::PB_CS_S_Club_Notify_ACKEX NotifyACK;
  5211. NotifyACK.set_newsfalg(NotifyAck.newsFalg);
  5212. NotifyACK.set_temp(NotifyAck.Temp);
  5213. std::string Message = CW2AEX<1024>(NotifyAck.Message, CP_UTF8).m_psz;
  5214. NotifyACK.set_message(Message);
  5215. NotifyACK.set_dwclubid(NotifyAck.dwClubID);
  5216. NotifyACK.set_dwusercount(NotifyAck.dwUserCount);
  5217. //发送数据
  5218. std::string pbdata = NotifyACK.SerializePartialAsString();
  5219. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length());
  5220. break;
  5221. }
  5222. }
  5223. }
  5224. }
  5225. break;
  5226. }
  5227. case SUB_CS_C_GET_ROOMID:
  5228. {
  5229. //效验参数
  5230. ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx));
  5231. if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false;
  5232. CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pData;
  5233. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pEx->dwUserID);
  5234. if (pIServerUserItem && pIServerUserItem->GetBindIndex() != INVALID_WORD && pEx->cbAuto == 0 && pEx->dwUserID>=100000)
  5235. {
  5236. tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItem->GetBindIndex());
  5237. OnTCPNetworkSubUserCreateRoomEx(pData, wDataSize, pBindParameter->dwSocketID);
  5238. }
  5239. else
  5240. {
  5241. //自动开房
  5242. OnTCPNetworkSubUserCreateRoomEx2(pData, wDataSize, 0);
  5243. }
  5244. break;
  5245. }
  5246. case SUB_CS_UPDATAOWNROOMLIST://个人创建房间的总列表
  5247. {
  5248. JN_GR_RoomListGroupSend * pUserChat = (JN_GR_RoomListGroupSend *)pData;
  5249. //效验参数
  5250. ASSERT(wDataSize == sizeof(JN_GR_RoomListGroupSend));
  5251. if (wDataSize != sizeof(JN_GR_RoomListGroupSend)) return false;
  5252. //找到他的连接
  5253. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->jgrDate[0].dwUserID);
  5254. if (pIServerUserItem != NULL)
  5255. {
  5256. UserInfo::PB_CS_S_RoomListGroupSend GroupSend;
  5257. for (WORD i = 0; i < pUserChat->Num; i++)
  5258. {
  5259. if (pUserChat->jgrDate[i].dwRoomNumber == 0)break;
  5260. UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate();
  5261. RoomList->set_dwuserid(pUserChat->jgrDate[i].dwUserID);
  5262. RoomList->set_dwserverid(pUserChat->jgrDate[i].dwServerID);
  5263. RoomList->set_dwroomnumber(pUserChat->jgrDate[i].dwRoomNumber);
  5264. RoomList->set_dwinsert_updata_del(pUserChat->jgrDate[i].dwInsert_UpData_Del);
  5265. RoomList->set_dwdifen(pUserChat->jgrDate[i].dwDiFen);
  5266. RoomList->set_dwjushu(pUserChat->jgrDate[i].dwJuShu);
  5267. RoomList->set_dwreadybody(pUserChat->jgrDate[i].dwReadyBody);
  5268. RoomList->set_dwbody(pUserChat->jgrDate[i].dwBody);
  5269. RoomList->set_bwanfa(pUserChat->jgrDate[i].bWanFa);
  5270. std::string szIp = CW2AEX<1024>(pUserChat->jgrDate[i].szIp, CP_UTF8).m_psz;
  5271. RoomList->set_szip(szIp);
  5272. RoomList->set_bduolai(pUserChat->jgrDate[i].bDuoLai);
  5273. RoomList->set_wfengding(pUserChat->jgrDate[i].wFengDing);
  5274. RoomList->set_tmp1(pUserChat->jgrDate[i].tmp1);
  5275. RoomList->set_tmp2(pUserChat->jgrDate[i].tmp2);
  5276. RoomList->set_tmp3(pUserChat->jgrDate[i].tmp3);
  5277. RoomList->set_tmp4(pUserChat->jgrDate[i].tmp4);
  5278. RoomList->set_tmp5(pUserChat->jgrDate[i].tmp5);
  5279. for (WORD i = 0; i < 4; i++)
  5280. {
  5281. RoomList->add_tmp6(pUserChat->jgrDate[i].tmp6[i]);
  5282. }
  5283. RoomList->set_wport(pUserChat->jgrDate[i].wPort);
  5284. }
  5285. GroupSend.set_num(pUserChat->Num);
  5286. //发送数据
  5287. std::string pbdata = GroupSend.SerializePartialAsString();
  5288. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length());
  5289. return true;
  5290. }
  5291. break;
  5292. }
  5293. case SUB_CS_UPDATAOTHERROOM: //更新其他服务器私有房间
  5294. {
  5295. OnUpdataBodyOtherRoom(pData, wDataSize);
  5296. break;
  5297. }
  5298. case SUB_CS_UPDATAOWNROOM://房间动态信息
  5299. {
  5300. OnUpdataBodyOwnRoom(pData, wDataSize);
  5301. break;
  5302. }
  5303. case SUB_CS_UPDATAOWNBEANS_UNLOCK:
  5304. {
  5305. DBO_GR_UserReduceResult * pUserChat = (DBO_GR_UserReduceResult *)pData;
  5306. //效验参数
  5307. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResult));
  5308. if (wDataSize != sizeof(DBO_GR_UserReduceResult)) return false;
  5309. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwUserID);
  5310. if (pIServerUserItem)
  5311. {
  5312. auto UserInfo = pIServerUserItem->GetUserInfo();
  5313. if (UserInfo)
  5314. {
  5315. UserInfo->dwBean = pUserChat->dwCurrBeans;
  5316. }
  5317. //变量定义
  5318. CMD_GR_UserBean UserBeans;
  5319. ZeroMemory(&UserBeans, sizeof(UserBeans));
  5320. //构造变量
  5321. UserBeans.dwCurrBeans = pUserChat->dwCurrBeans;
  5322. UserInfo::PB_CS_S_UserBean Bean;
  5323. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  5324. //发送数据
  5325. std::string pbdata = Bean.SerializePartialAsString();
  5326. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  5327. }
  5328. break;
  5329. }
  5330. case SUB_CS_UPDATAOWNBEANS_LOCK:
  5331. {
  5332. DBO_GR_UserReduceResult * pUserChat = (DBO_GR_UserReduceResult *)pData;
  5333. //效验参数
  5334. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResult));
  5335. if (wDataSize != sizeof(DBO_GR_UserReduceResult)) return false;
  5336. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwUserID);
  5337. if (pIServerUserItem)
  5338. {
  5339. auto UserInfo = pIServerUserItem->GetUserInfo();
  5340. if (UserInfo)
  5341. {
  5342. UserInfo->dwBean = pUserChat->dwCurrBeans;
  5343. }
  5344. //变量定义
  5345. CMD_GR_UserBean UserBeans;
  5346. ZeroMemory(&UserBeans, sizeof(UserBeans));
  5347. //构造变量
  5348. UserBeans.dwCurrBeans = pUserChat->dwCurrBeans;
  5349. UserInfo::PB_CS_S_UserBean Bean;
  5350. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  5351. //发送数据
  5352. std::string pbdata = Bean.SerializePartialAsString();
  5353. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  5354. }
  5355. break;
  5356. }
  5357. case SUB_CS_S_COLLECT_REQUEST: //用户汇总
  5358. {
  5359. //变量定义
  5360. CMD_CS_C_UserEnter UserEnter;
  5361. ZeroMemory(&UserEnter, sizeof(UserEnter));
  5362. //发送用户
  5363. WORD wIndex = 0;
  5364. do
  5365. {
  5366. //获取用户
  5367. IServerUserItem * pIServerUserItem = m_ServerUserManager.EnumUserItem(wIndex++);
  5368. if (pIServerUserItem == NULL) break;
  5369. //设置变量
  5370. UserEnter.dwUserID = pIServerUserItem->GetUserID();
  5371. UserEnter.dwGameID = pIServerUserItem->GetGameID();
  5372. //lstrcpyn(UserEnter.szNickName, pIServerUserItem->GetNickName(), CountArray(UserEnter.szNickName));
  5373. //辅助信息
  5374. UserEnter.cbGender = pIServerUserItem->GetGender();
  5375. UserEnter.cbMemberOrder = pIServerUserItem->GetMemberOrder();
  5376. UserEnter.cbMasterOrder = pIServerUserItem->GetMasterOrder();
  5377. /*DWORD dTableNum = 0;*/
  5378. if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  5379. {
  5380. auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  5381. TCHAR szTemp[32] = { 0 };
  5382. if (pat) pat->GetPrivateTableID(szTemp, 32);
  5383. CString csTemp = szTemp;
  5384. /*if (pat != nullptr && !csTemp.IsEmpty())
  5385. {
  5386. dTableNum = _wtol(csTemp);
  5387. }*/
  5388. }
  5389. //发送数据
  5390. ASSERT(m_pITCPSocketService != NULL);
  5391. 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()*/);
  5392. } while (true);
  5393. //汇报完成
  5394. m_bCollectUser = true;
  5395. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_FINISH/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  5396. return true;
  5397. }
  5398. default: break;
  5399. }
  5400. return true;
  5401. }
  5402. //管理服务
  5403. bool CAttemperEngineSink::OnTCPSocketMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  5404. {
  5405. switch (wSubCmdID)
  5406. {
  5407. case SUB_CS_S_SYSTEM_MESSAGE: //系统消息
  5408. {
  5409. CTraceService::TraceString(TEXT("系统消息已屏蔽 SUB_CS_S_SYSTEM_MESSAGE"), TraceLevel_Warning);
  5410. //消息处理
  5411. //SendSystemMessage((CMD_GR_SendMessage *)pData, wDataSize);
  5412. return true;
  5413. }
  5414. case SUB_CS_S_PROPERTY_TRUMPET: //喇叭消息
  5415. {
  5416. CString csSend;
  5417. CString csTest = AfxGetAppName();
  5418. csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET);
  5419. //OutputDebugString(csSend);
  5420. //Commend::ToShow(this, MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, pData, wDataSize, 0, 0, m_pIGameServiceManager->GetDataString());
  5421. CTraceService::TraceString(TEXT("喇叭消息 SUB_CS_S_PROPERTY_TRUMPET"), TraceLevel_Warning);
  5422. //发送数据
  5423. m_pITCPNetworkEngine->SendDataBatch(MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, pData, wDataSize, BG_COMPUTER);
  5424. return true;
  5425. }
  5426. case SUB_CS_S_PLATFORM_PARAMETER: //平台参数
  5427. {
  5428. //清除任务
  5429. m_wTaskCount = 0;
  5430. ZeroMemory(m_TaskParameter, sizeof(m_TaskParameter));
  5431. //CTraceService::TraceString(TEXT("平台参数 加载配置已屏蔽 SUB_CS_S_PLATFORM_PARAMETER"), TraceLevel_Warning);
  5432. //加载配置
  5433. m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_PARAMETER, 0L, NULL, 0L);
  5434. //加载任务
  5435. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_TASK_LOAD_LIST, 0L, NULL, 0L);
  5436. //会员参数
  5437. //CTraceService::TraceString(TEXT("会员参数已屏蔽 DBR_GR_LOAD_MEMBER_PARAMETER"), TraceLevel_Warning);
  5438. //m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOAD_MEMBER_PARAMETER, 0, NULL, 0);
  5439. return true;
  5440. }
  5441. default: break;
  5442. }
  5443. return true;
  5444. }
  5445. //机器服务
  5446. //bool CAttemperEngineSink::OnTCPSocketMainAndroidService(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  5447. //{
  5448. // switch (wSubCmdID)
  5449. // {
  5450. // case SUB_CS_S_ADDPARAMETER: //添加参数
  5451. // {
  5452. // //参数校验
  5453. // ASSERT(sizeof(CMD_CS_S_AddParameter) == wDataSize);
  5454. // if (sizeof(CMD_CS_S_AddParameter) != wDataSize) return false;
  5455. //
  5456. // //提取数据
  5457. // CMD_CS_S_AddParameter * pAddParameter = (CMD_CS_S_AddParameter *)pData;
  5458. //
  5459. // //添加参数
  5460. // //m_AndroidUserManager.AddAndroidParameter(&pAddParameter->AndroidParameter, 1);
  5461. //
  5462. // return true;
  5463. // }
  5464. // case SUB_CS_S_MODIFYPARAMETER: //修改参数
  5465. // {
  5466. // //参数校验
  5467. // ASSERT(sizeof(CMD_CS_S_ModifyParameter) == wDataSize);
  5468. // if (sizeof(CMD_CS_S_ModifyParameter) != wDataSize) return false;
  5469. //
  5470. // //提取数据
  5471. // CMD_CS_S_ModifyParameter * pModifyParameter = (CMD_CS_S_ModifyParameter *)pData;
  5472. //
  5473. // //修改参数
  5474. // //m_AndroidUserManager.AddAndroidParameter(&pModifyParameter->AndroidParameter, 1);
  5475. //
  5476. // return true;
  5477. // }
  5478. // case SUB_CS_S_DELETEPARAMETER: //删除参数
  5479. // {
  5480. // //参数校验
  5481. // ASSERT(sizeof(CMD_CS_S_DeleteParameter) == wDataSize);
  5482. // if (sizeof(CMD_CS_S_DeleteParameter) != wDataSize) return false;
  5483. //
  5484. // //提取数据
  5485. // CMD_CS_S_DeleteParameter * pDeleteParameter = (CMD_CS_S_DeleteParameter *)pData;
  5486. //
  5487. // //删除参数
  5488. // //m_AndroidUserManager.RemoveAndroidParameter(pDeleteParameter->dwBatchID);
  5489. //
  5490. // return true;
  5491. // }
  5492. // default: break;
  5493. // }
  5494. //
  5495. // return true;
  5496. //}
  5497. //登录处理
  5498. bool CAttemperEngineSink::OnTCPNetworkMainLogon(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5499. {
  5500. switch (wSubCmdID)
  5501. {
  5502. //case SUB_GR_LOGON_USERID: //I D 登录
  5503. //{
  5504. // return OnTCPNetworkSubLogonUserID(pData, wDataSize, dwSocketID);
  5505. //}
  5506. case SUB_GR_LOGON_MOBILE: //手机登录
  5507. {
  5508. m_Data.dLoginQ++;
  5509. return OnTCPNetworkSubLogonMobile(pData, wDataSize, dwSocketID);
  5510. }
  5511. default: break;
  5512. //case SUB_GR_LOGON_ACCOUNTS: //帐号登录
  5513. //{
  5514. // return OnTCPNetworkSubLogonAccounts(pData, wDataSize, dwSocketID);
  5515. //}
  5516. }
  5517. return false;
  5518. }
  5519. //用户处理
  5520. bool CAttemperEngineSink::OnTCPNetworkMainUser(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5521. {
  5522. ///for test
  5523. //if (SUB_GR_USER_CREATE == wSubCmdID)
  5524. //{
  5525. // OnTCPNetworkShareInfo(pData, wDataSize, dwSocketID);
  5526. // OnTCPNetworkShareAwardBean(pData, wDataSize, dwSocketID);
  5527. //}
  5528. switch (wSubCmdID)
  5529. {
  5530. case SUB_GP_WELFARE_INFO: ///===福利领取信息
  5531. {
  5532. return OnTCPNetworkWelfareInfo(pData, wDataSize, dwSocketID);
  5533. }
  5534. case SUB_GP_CHECKIN_REWARD2: //签到奖品
  5535. {
  5536. return OnTCPNetworkCheckinReward(pData, wDataSize, dwSocketID);
  5537. }
  5538. case SUB_GP_CHECKIN_INFO2: //查询签到
  5539. {
  5540. return OnTCPNetworkCheckinQuery(pData, wDataSize, dwSocketID);
  5541. }
  5542. case SUB_GP_CHECKIN_DONE2: //执行签到
  5543. {
  5544. return OnTCPNetworkCheckinDone(pData, wDataSize, dwSocketID);
  5545. }
  5546. //case SUB_GR_USER_PRIVATE_GAME_SVR: ///+++拉取好友房服务器
  5547. //{
  5548. // return OnTCPNetworkPrivateGameSvr(pData, wDataSize, dwSocketID);
  5549. //}
  5550. //case SUB_GR_USER_GET_RELIEF: //领取破产补助
  5551. //{
  5552. // return OnTCPNetworkGetRelief(pData, wDataSize, dwSocketID);
  5553. //}
  5554. //case SUB_GR_USER_TOP_WIN_LIST: //胜局榜(战神列表)
  5555. //{
  5556. // return OnTCPNetworkTopWinList(pData, wDataSize, dwSocketID);
  5557. //}
  5558. case SUB_GR_USER_SHRAE_INFO: //分享奖励钻石
  5559. {
  5560. return OnTCPNetworkShareInfo(pData, wDataSize, dwSocketID);
  5561. }
  5562. case SUB_GR_USER_SHRAE_AWARD_BEAN: //分享奖励钻石
  5563. {
  5564. return OnTCPNetworkShareAwardBean(pData, wDataSize, dwSocketID);
  5565. }
  5566. case SUB_GR_USER_GET_BEAN: //请求元宝
  5567. {
  5568. return OnTCPNetworkGetBearn(pData, wDataSize, dwSocketID);
  5569. }
  5570. case SUB_GR_USER_QINGQIUJIESAN: //房主请求解散
  5571. {
  5572. return OnTCPNetworkFangZhuJieSan(pData, wDataSize, dwSocketID);
  5573. }
  5574. case SUB_GR_DELETE_PRIVATE_TABLE_REQ: //申请解散
  5575. {
  5576. return OnTCPNetworkSubDeletePrivateTableReq(pData, wDataSize, dwSocketID);
  5577. }
  5578. case SUB_GR_DELETE_PRIVATE_TABLE_RESP: //个人投票表决
  5579. {
  5580. return OnTCPNetworkSubDeletePrivateTableResp(pData, wDataSize, dwSocketID);
  5581. }
  5582. case SUB_GR_USER_RULE: //用户规则
  5583. {
  5584. return OnTCPNetworkSubUserRule(pData, wDataSize, dwSocketID);
  5585. }
  5586. case SUB_GR_USER_LOOKON: //用户旁观
  5587. {
  5588. return OnTCPNetworkSubUserLookon(pData, wDataSize, dwSocketID);
  5589. }
  5590. case SUB_GR_USER_STANDUP: //用户起立
  5591. {
  5592. return OnTCPNetworkSubUserStandUp(pData, wDataSize, dwSocketID);
  5593. }
  5594. case SUB_GR_USER_CHAT: //用户聊天
  5595. {
  5596. return OnTCPNetworkSubUserChat(pData, wDataSize, dwSocketID);
  5597. }
  5598. case SUB_GR_USER_EXPRESSION: //用户表情
  5599. {
  5600. return OnTCPNetworkSubUserExpression(pData, wDataSize, dwSocketID);
  5601. }
  5602. case SUB_GR_WISPER_CHAT: //用户私聊
  5603. {
  5604. return OnTCPNetworkSubWisperChat(pData, wDataSize, dwSocketID);
  5605. }
  5606. case SUB_GR_WISPER_EXPRESSION: //私聊表情
  5607. {
  5608. return OnTCPNetworkSubWisperExpression(pData, wDataSize, dwSocketID);
  5609. }
  5610. //case SUB_GR_PROPERTY_BUY: //购买道具
  5611. //{
  5612. // return OnTCPNetworkSubPropertyBuy(pData, wDataSize, dwSocketID);
  5613. //}
  5614. //case SUB_GR_PROPERTY_TRUMPET: //喇叭道具
  5615. //{
  5616. // return OnTCPNetwordSubSendTrumpet(pData, wDataSize, dwSocketID);
  5617. //}
  5618. //case SUB_GR_USER_INVITE_REQ: //邀请用户
  5619. //{
  5620. // return OnTCPNetworkSubUserInviteReq(pData, wDataSize, dwSocketID);
  5621. //}
  5622. //case SUB_GR_USER_REPULSE_SIT: //拒绝厌友
  5623. //{
  5624. // return OnTCPNetworkSubUserRepulseSit(pData, wDataSize, dwSocketID);
  5625. //}
  5626. //case SUB_GR_USER_KICK_USER: //踢出用户
  5627. //{
  5628. // return OnTCPNetworkSubMemberKickUser(pData, wDataSize, dwSocketID);
  5629. //}
  5630. case SUB_GR_USER_INFO_REQ: //请求用户信息
  5631. {
  5632. return OnTCPNetworkSubUserInfoReq(pData, wDataSize, dwSocketID);
  5633. }
  5634. case SUB_GR_USER_CHAIR_REQ: //请求更换位置
  5635. {
  5636. return OnTCPNetworkSubUserChairReq(pData, wDataSize, dwSocketID);
  5637. }
  5638. case SUB_GR_USER_CHAIR_INFO_REQ: //请求椅子用户信息
  5639. {
  5640. return OnTCPNetworkSubChairUserInfoReq(pData, wDataSize, dwSocketID);
  5641. }
  5642. case SUB_GR_USER_GET_GAME_SCORE_RECORD_LIST://获取牌桌游戏数据简要列表
  5643. {
  5644. return OnTCPSocketGetUserGameScoreRecordList(pData, wDataSize, dwSocketID);
  5645. }
  5646. case SUB_GR_USER_GET_GAME_SCORE_RECORD_DETAIL_INFO:
  5647. {
  5648. return OnTCPSocketGetUserGameScoreRecordDetail(pData, wDataSize, dwSocketID);
  5649. }
  5650. case SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY: //获取回放记录
  5651. {
  5652. return OnTCPSocketGetUserGameReplayRecord(pData, wDataSize, dwSocketID);
  5653. }
  5654. case SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST: //获取临时积分排行榜
  5655. {
  5656. return OnTCPSocketGetUserGameTempScoreRankList(pData, wDataSize, dwSocketID);
  5657. }
  5658. case SUB_GR_USER_CREATE://创建房间
  5659. {
  5660. return OnTCPNetworkSubUserCreateRoom(pData, wDataSize, dwSocketID);
  5661. }
  5662. case SUB_GR_USER_GETADD_INFO://获取加入房间的信息
  5663. {
  5664. return OnTCPNetworkSubUserJoinRoomInfo(pData, wDataSize, dwSocketID);
  5665. }
  5666. case SUB_GR_USER_ADD: //加入房间
  5667. {
  5668. return OnTCPNetworkSubUserJoinRoom(pData, wDataSize, dwSocketID);
  5669. }
  5670. case SUB_GR_USER_SEAT: //玩家坐下请求
  5671. {
  5672. return OnTCPNetworkSubUserDown(pData, wDataSize, dwSocketID);
  5673. }
  5674. case SUB_GR_USER_GET_DINGDAN: //请求订单
  5675. {
  5676. return OnTCPNetworkSubUserGetDingdan(pData, wDataSize, dwSocketID);
  5677. }
  5678. case SUB_GR_USER_GET_DINGDAN_NEW: //请求订单
  5679. {
  5680. return OnTCPNetworkSubUserGetDingdanNew(pData, wDataSize, dwSocketID);
  5681. }
  5682. case SUB_GR_USER_GET_VERIF_CODE: //获取手机验证码
  5683. {
  5684. return OnTCPNetworkSubUserCheckVerifCode(pData, wDataSize, dwSocketID);
  5685. }
  5686. case SUB_GR_USER_CHECK_IPHONE: //绑定手机
  5687. {
  5688. return OnTCPNetworkSubUserCheckIphone(pData, wDataSize, dwSocketID);
  5689. }
  5690. case SUB_GR_USER_CHECK_IPHONE_QUERY: //绑定手机查询
  5691. {
  5692. return OnTCPNetworkSubUserCheckIphoneQuery(pData, wDataSize, dwSocketID);
  5693. }
  5694. case SUB_GR_USER_CHECK_XIANLIAO: //绑定闲聊
  5695. {
  5696. return OnTCPNetworkSubUserXianLiao(pData, wDataSize, dwSocketID);
  5697. }
  5698. case SUB_GR_USER_CHECK_NAME: //实名认证
  5699. {
  5700. return OnTCPNetworkSubUserCheckName(pData, wDataSize, dwSocketID);
  5701. }
  5702. case SUB_GR_USER_CHECK_NAME_QUERY:
  5703. {
  5704. return OnTCPNetworkSubUserCheckNameQuery(pData, wDataSize, dwSocketID);
  5705. }
  5706. case SUB_GR_USER_GET_DINGDANLIST: //获取购买记录
  5707. {
  5708. return OnTCPNetworkSubUserGetDingdanList(pData, wDataSize, dwSocketID);
  5709. }
  5710. case SUB_GR_USER_GET_BANGDING: //绑定代理
  5711. {
  5712. return OnTCPNetworkSubUseBangDing(pData, wDataSize, dwSocketID);
  5713. }
  5714. case SUB_GR_USER_DAILI_INFO: //获取绑定代理信息
  5715. {
  5716. return OnTCPNetworkSubUseGetDaiLiInfo(pData, wDataSize, dwSocketID);
  5717. }
  5718. case SUB_GR_USER_APPLY_UNTIE_AGENT: //玩家自主申请解绑
  5719. {
  5720. return OnTCPNetworkSubUserUntieAgent(pData, wDataSize, dwSocketID);
  5721. }
  5722. case SUB_GR_USER_GET_UNTIE_AGENT_INFO: //用户获得代理解绑相关信息
  5723. {
  5724. return OnTCPNetworkSubUserAgentInfo(pData, wDataSize, dwSocketID);
  5725. }
  5726. case SUB_GP_WENLIN_SHUFFLE: //温岭洗牌动画
  5727. {
  5728. return OnWlShuffleGameHandle(pData, wDataSize, dwSocketID);
  5729. }
  5730. default: break;
  5731. }
  5732. return false;
  5733. }
  5734. //银行处理
  5735. //bool CAttemperEngineSink::OnTCPNetworkMainInsure(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5736. //{
  5737. // switch (wSubCmdID)
  5738. // {
  5739. // case SUB_GR_ENABLE_INSURE_REQUEST: //开通银行
  5740. // {
  5741. // return OnTCPNetworkSubEnableInsureRequest(pData, wDataSize, dwSocketID);
  5742. // }
  5743. // case SUB_GR_QUERY_INSURE_INFO: //银行查询
  5744. // {
  5745. // return OnTCPNetworkSubQueryInsureInfo(pData, wDataSize, dwSocketID);
  5746. // }
  5747. // case SUB_GR_SAVE_SCORE_REQUEST: //存款请求
  5748. // {
  5749. // return OnTCPNetworkSubSaveScoreRequest(pData, wDataSize, dwSocketID);
  5750. // }
  5751. // case SUB_GR_TAKE_SCORE_REQUEST: //取款请求
  5752. // {
  5753. // return OnTCPNetworkSubTakeScoreRequest(pData, wDataSize, dwSocketID);
  5754. // }
  5755. // case SUB_GR_TRANSFER_SCORE_REQUEST: //转帐请求
  5756. // {
  5757. // return OnTCPNetworkSubTransferScoreRequest(pData, wDataSize, dwSocketID);
  5758. // }
  5759. // case SUB_GR_QUERY_USER_INFO_REQUEST://查询用户
  5760. // {
  5761. // return OnTCPNetworkSubQueryUserInfoRequest(pData, wDataSize, dwSocketID);
  5762. // }
  5763. // default: break;
  5764. // }
  5765. //
  5766. // return false;
  5767. //}
  5768. //任务处理
  5769. //bool CAttemperEngineSink::OnTCPNetworkMainTask(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5770. //{
  5771. // switch (wSubCmdID)
  5772. // {
  5773. // case SUB_GR_TASK_TAKE: //领取任务
  5774. // {
  5775. // return OnTCPNetworkSubTakeTaskRequest(pData, wDataSize, dwSocketID);
  5776. // }
  5777. // case SUB_GR_TASK_REWARD: //领取奖励
  5778. // {
  5779. // return OnTCPNetworkSubTaskRewardRequest(pData, wDataSize, dwSocketID);
  5780. // }
  5781. // case SUB_GR_TASK_LOAD_INFO: //加载任务
  5782. // {
  5783. // return OnTCPNetworkSubLoadTaskInfoRequest(pData, wDataSize, dwSocketID);
  5784. // }
  5785. // default: break;
  5786. // }
  5787. //
  5788. // return false;
  5789. //}
  5790. //兑换处理
  5791. //bool CAttemperEngineSink::OnTCPNetworkMainExchange(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5792. //{
  5793. // switch (wSubCmdID)
  5794. // {
  5795. // case SUB_GR_EXCHANGE_LOAD_INFO: //查询信息
  5796. // {
  5797. // return OnTCPNetworkSubQueryExchangeInfo(pData, wDataSize, dwSocketID);
  5798. // }
  5799. // /*case SUB_GR_PURCHASE_MEMBER: //购买会员
  5800. // {
  5801. // return OnTCPNetworkSubPurchaseMember(pData, wDataSize, dwSocketID);
  5802. // }*/
  5803. // case SUB_GR_EXCHANGE_SCORE: //兑换游戏币
  5804. // {
  5805. // return OnTCPNetworkSubExchangeScore(pData, wDataSize, dwSocketID);
  5806. // }
  5807. // default: break;
  5808. // }
  5809. //
  5810. // return false;
  5811. //}
  5812. //俱乐部处理
  5813. bool CAttemperEngineSink::OnTCPNetworkMainClub(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5814. {
  5815. switch (wSubCmdID)
  5816. {
  5817. case SUB_GR_USER_GET_CLUBLIST: //获取俱乐部列表
  5818. {
  5819. return OnTCPNetworkSubGetClubList(pData, wDataSize, dwSocketID);
  5820. }
  5821. case SUB_GR_USER_GET_CLUBUSER: //获取俱乐部会员
  5822. {
  5823. return OnTCPNetworkSubGetClubUser(pData, wDataSize, dwSocketID);
  5824. }
  5825. case SUB_GR_USER_GET_CLUBUSE_EX:
  5826. {
  5827. return OnTCPNetworkSubGetClubUserEx(pData, wDataSize, dwSocketID);
  5828. }
  5829. case SUB_GR_USER_GET_CLUBMESSAGE://获取俱乐部消息
  5830. {
  5831. return OnTCPNetworkSubGetClubMessage(pData, wDataSize, dwSocketID);
  5832. }
  5833. case SUB_GR_USER_GET_CLUBRECORD://获取俱乐部记录
  5834. {
  5835. return OnTCPNetworkSubGetClubRecord(pData, wDataSize, dwSocketID);
  5836. }
  5837. case SUB_GR_USER_CREATE_CLUB://创建俱乐部
  5838. {
  5839. return OnTCPNetworkSubCreateClub(pData, wDataSize, dwSocketID);
  5840. }
  5841. case SUB_GR_USER_UPDATE_CLUB://修改俱乐部
  5842. {
  5843. return OnTCPNetworkSubUpdateClub(pData, wDataSize, dwSocketID);
  5844. }
  5845. case SUB_GR_USER_DELETE_CLUB://删除俱乐部
  5846. {
  5847. return OnTCPNetworkSubDeleteClub(pData, wDataSize, dwSocketID);
  5848. }
  5849. case SUB_GR_USER_GET_CLUB://查看俱乐部
  5850. {
  5851. return OnTCPNetworkSubGetClub(pData, wDataSize, dwSocketID);
  5852. }
  5853. case SUB_GR_USER_JOIN_CLUB://加入俱乐部
  5854. {
  5855. return OnTCPNetworkSubJoinClub(pData, wDataSize, dwSocketID);
  5856. }
  5857. case SUB_GR_USER_QUIT_CLUB://退出俱乐部
  5858. {
  5859. return OnTCPNetworkSubQuitClub(pData, wDataSize, dwSocketID);
  5860. }
  5861. case SUB_GR_USER_ISAGREE_CLUB: //同意加入俱乐部
  5862. {
  5863. return OnTCPNetworkSubAgreeClub(pData, wDataSize, dwSocketID);
  5864. }
  5865. //case SUB_GR_USER_GET_CLUBONLINE://获取俱乐部在线信息
  5866. //{
  5867. // return OnTCPNetworkSubGetClubOnLine(pData, wDataSize, dwSocketID);
  5868. //}
  5869. case SUB_GR_USER_GET_CLUBONLINE_EX://获取在线信息
  5870. {
  5871. return OnTCPNetworkSubGetClubOnLineEx(pData, wDataSize, dwSocketID);
  5872. }
  5873. case SUB_GR_USER_GET_CLUBBLACKUSER://获取黑名单和管理员名单
  5874. {
  5875. return OnTCPNetworkSubGetClubBlackUser(pData,wDataSize,dwSocketID);
  5876. }
  5877. case SUB_GR_USER_GET_PROTOLCOL://获取协议
  5878. {
  5879. return OnTCPNetworkSubGetClubProtocol(pData,wDataSize,dwSocketID);
  5880. }
  5881. case SUB_GR_USER_GET_PROTOLCOLAGREE://同意协议
  5882. {
  5883. return OnTCPNetworkSubAgreeClubProtocol(pData,wDataSize,dwSocketID);
  5884. }
  5885. case SUB_GR_USER_GET_NOTICE://获取公告
  5886. {
  5887. return OnTCPNetworkSubGetClubNotice(pData, wDataSize, dwSocketID);
  5888. }
  5889. case SUB_GR_USER_GET_CLUBONLINE_TABLE://获取在线桌子
  5890. {
  5891. return OnTCPNetworkSubGetClubTable(pData, wDataSize, dwSocketID);
  5892. }
  5893. case SUB_GR_USER_DISSOLVE_ROOM://群主解散俱乐部房间
  5894. {
  5895. return OnTCPNetworkSubDissolveRoom(pData, wDataSize, dwSocketID);
  5896. }
  5897. case SUB_GR_USER_GET_SAVE_MORE_WANFA:// 额外玩法修改请求
  5898. {
  5899. return OnTCPNetworkSubUpdateAddClub(pData, wDataSize, dwSocketID);
  5900. }
  5901. case SUB_GR_USER_GET_MORE_WANFA://获取额外玩法
  5902. {
  5903. return OnTCPNetworkSubUpdateAddClub(pData, wDataSize, dwSocketID);
  5904. }
  5905. case SUB_GR_CLUB_GET_COUNT_EXPLOITS: //俱乐部统计该俱乐部战绩
  5906. {
  5907. return OnTCPNetworkSubGetClubCountExploits(pData, wDataSize, dwSocketID);
  5908. }
  5909. case SUB_GR_CLUB_GET_COUNT_PLAYGAEMS: //俱乐部统计对局数
  5910. {
  5911. return OnTCPNetworkSubGetClubCountPlaygames(pData, wDataSize, dwSocketID);
  5912. }
  5913. case SUB_GR_CLUB_GET_COUNT_INTEGRAL: //俱乐部统计积分数
  5914. {
  5915. return OnTCPNetworkSubGetClubCountIntegral(pData, wDataSize, dwSocketID);
  5916. }
  5917. case SUB_GR_CLUB_GET_MAKEA_SAMPLE: //俱乐部打样
  5918. {
  5919. return OnTCPNetworkSubGetClubSample(pData, wDataSize, dwSocketID);
  5920. }
  5921. default: break;
  5922. }
  5923. return false;
  5924. }
  5925. //管理处理
  5926. bool CAttemperEngineSink::OnTCPNetworkMainManage(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5927. {
  5928. //switch (wSubCmdID)
  5929. //{
  5930. //case SUB_GR_QUERY_OPTION: //查询设置
  5931. //{
  5932. // return OnTCPNetworkSubQueryOption(pData, wDataSize, dwSocketID);
  5933. //}
  5934. //case SUB_GR_OPTION_SERVER: //房间设置
  5935. //{
  5936. // return OnTCPNetworkSubOptionServer(pData, wDataSize, dwSocketID);
  5937. //}
  5938. //case SUB_GR_KILL_USER: //踢出用户
  5939. //{
  5940. // return OnTCPNetworkSubManagerKickUser(pData, wDataSize, dwSocketID);
  5941. //}
  5942. //case SUB_GR_LIMIT_USER_CHAT: //限制聊天
  5943. //{
  5944. // return true;//OnTCPNetworkSubLimitUserChat(pData, wDataSize, dwSocketID);
  5945. //}
  5946. //case SUB_GR_KICK_ALL_USER: //踢出用户
  5947. //{
  5948. // return OnTCPNetworkSubKickAllUser(pData, wDataSize, dwSocketID);
  5949. //}
  5950. //case SUB_GR_SEND_MESSAGE: //发布消息
  5951. //{
  5952. // return false;//OnTCPNetworkSubSendMessage(pData, wDataSize, dwSocketID);
  5953. //}
  5954. //case SUB_GR_DISMISSGAME: //管理员强制解散游戏
  5955. //{
  5956. // return OnTCPNetworkSubDismissGame(pData, wDataSize, dwSocketID);
  5957. //}
  5958. //case SUB_GR_SEND_WARNING: //警告用户
  5959. //{
  5960. // return OnTCPNetworkSubWarningUser(pData, wDataSize, dwSocketID);
  5961. //}
  5962. //}
  5963. return false;
  5964. }
  5965. //比赛命令
  5966. //bool CAttemperEngineSink::OnTCPNetworkMainMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5967. //{
  5968. // //获取信息
  5969. // WORD wBindIndex = LOWORD(dwSocketID);
  5970. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  5971. //
  5972. // //用户效验
  5973. // ASSERT(pIServerUserItem != NULL);
  5974. // if (pIServerUserItem == NULL) return false;
  5975. //
  5976. // //效验接口
  5977. // ASSERT(m_pIMatchServiceManager != NULL);
  5978. // if (m_pIMatchServiceManager == NULL) return false;
  5979. //
  5980. // //消息处理
  5981. // return m_pIMatchServiceManager->OnEventSocketMatch(wSubCmdID, pData, wDataSize, pIServerUserItem, dwSocketID);
  5982. //}
  5983. //游戏处理
  5984. bool CAttemperEngineSink::OnTCPNetworkMainGame(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  5985. {
  5986. //获取信息
  5987. WORD wBindIndex = LOWORD(dwSocketID);
  5988. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  5989. //用户效验
  5990. ASSERT(pIServerUserItem != NULL);
  5991. if (pIServerUserItem == NULL) return false;
  5992. //处理过虑
  5993. WORD wTableID = pIServerUserItem->GetTableID();
  5994. WORD wChairID = pIServerUserItem->GetChairID();
  5995. if ((wTableID == INVALID_TABLE) || (wChairID == INVALID_CHAIR)) return true;
  5996. //消息处理
  5997. auto pTableFrame = GetTableFrame(wTableID);
  5998. if (!pTableFrame)
  5999. return false;
  6000. return pTableFrame->OnEventSocketGame(wSubCmdID, pData, wDataSize, pIServerUserItem);
  6001. }
  6002. //框架处理
  6003. bool CAttemperEngineSink::OnTCPNetworkMainFrame(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6004. {
  6005. //获取信息
  6006. WORD wBindIndex = LOWORD(dwSocketID);
  6007. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  6008. //用户效验
  6009. ASSERT(pIServerUserItem != NULL);
  6010. if (pIServerUserItem == NULL) return false;
  6011. //处理过虑
  6012. WORD wTableID = pIServerUserItem->GetTableID();
  6013. //WORD wChairID = pIServerUserItem->GetChairID();
  6014. if ((wTableID == INVALID_TABLE)) return true;
  6015. //消息处理
  6016. auto pTableFrame = GetTableFrame(wTableID);
  6017. if (!pTableFrame)
  6018. return false;
  6019. return pTableFrame->OnEventSocketFrame(wSubCmdID, pData, wDataSize, pIServerUserItem);
  6020. }
  6021. //手机登录
  6022. bool CAttemperEngineSink::OnTCPNetworkSubLogonMobile(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6023. {
  6024. TurntableLogon::PB_CS_C_LogonMobile pLogonMobile;
  6025. pLogonMobile.ParseFromArray(pData, wDataSize);
  6026. //处理消息
  6027. CMD_GR_LogonMobile LogonMobile;
  6028. ZeroMemory(&LogonMobile, sizeof(LogonMobile));
  6029. LogonMobile.wGameID = pLogonMobile.wgameid();
  6030. LogonMobile.dwProcessVersion = pLogonMobile.dwprocessversion();
  6031. LogonMobile.cbDeviceType = pLogonMobile.cbdevicetype();
  6032. LogonMobile.wPageTableCount = pLogonMobile.wgameid();
  6033. LogonMobile.dwUserID = pLogonMobile.dwuserid();
  6034. CString szpassword = (CA2CTEX<2048>(pLogonMobile.szpassword().c_str(), CP_UTF8)).m_szBuffer;
  6035. CString szmachineid = (CA2CTEX<2048>(pLogonMobile.szmachineid().c_str(), CP_UTF8)).m_szBuffer;
  6036. _sntprintf(LogonMobile.szPassword, CountArray(LogonMobile.szPassword), TEXT("%s"), szpassword);
  6037. _sntprintf(LogonMobile.szMachineID, CountArray(LogonMobile.szMachineID), TEXT("%s"), szmachineid);
  6038. LogonMobile.dX = pLogonMobile.dx();
  6039. LogonMobile.dY = pLogonMobile.dy();
  6040. CString szchengshi = (CA2CTEX<2048>(pLogonMobile.szchengshi().c_str(), CP_UTF8)).m_szBuffer;
  6041. _sntprintf(LogonMobile.szChengShi, CountArray(LogonMobile.szChengShi), TEXT("%s"), szchengshi);
  6042. LogonMobile.szPassword[CountArray(LogonMobile.szPassword) - 1] = 0;
  6043. LogonMobile.szMachineID[CountArray(LogonMobile.szMachineID) - 1] = 0;
  6044. //绑定信息
  6045. WORD wBindIndex = LOWORD(dwSocketID);
  6046. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  6047. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  6048. ///---用户信息置空 yd 2017-11-15
  6049. /*if (pIBindUserItem != NULL)
  6050. {
  6051. pIBindUserItem = NULL;
  6052. }*/
  6053. //重复判断 判断分配的tagBindParameter 是否是没有人用过的
  6054. if ((pBindParameter == NULL) || (pIBindUserItem != NULL))
  6055. {
  6056. if (pIBindUserItem != NULL)
  6057. {
  6058. CString strErr;
  6059. strErr.Format(_T("绑定用户失败 wBindIndex=%d,pBindParameter->pIServerUserItem != NULL"), wBindIndex);
  6060. CTraceService::TraceString(strErr, TraceLevel_Normal);
  6061. }
  6062. else
  6063. {
  6064. CString strErr;
  6065. strErr.Format(_T("重复判断,登录失败 wBindIndex=%d,pBindParameter=NULL"), wBindIndex);
  6066. CTraceService::TraceString(strErr, TraceLevel_Normal);
  6067. ASSERT(FALSE);
  6068. }
  6069. ///---add by yd
  6070. //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  6071. return false;
  6072. }
  6073. //机器人和真人不许互踢
  6074. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(LogonMobile.dwUserID);
  6075. //密码判断
  6076. CString strPassword = LogonMobile.szPassword;
  6077. strPassword.Trim();
  6078. if (pBindParameter->dwClientAddr != 0L && strPassword.GetLength() == 0)
  6079. {
  6080. //发送失败
  6081. CString csTest;
  6082. csTest.Format(_T("客户端登录失败。原因:很抱歉,您的登录密码为0,不允许继续进入!"));
  6083. CTraceService::TraceString(csTest, TraceLevel_Normal);
  6084. return true;
  6085. }
  6086. //版本信息
  6087. pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  6088. pBindParameter->dwProcessVersion = LogonMobile.dwProcessVersion;
  6089. //大厅版本
  6090. //DWORD dwClientVersion = pLogonMobile->dwProcessVersion;
  6091. //if (PerformCheckVersion(0L, 0L, dwClientVersion, dwSocketID) == false)
  6092. //{
  6093. // CString csTest;
  6094. // csTest.Format(_T("客户端[%d]登录失败。原因:大厅版本校验失败!"), pIServerUserItem->GetUserID());
  6095. // CTraceService::TraceString(csTest, TraceLevel_Normal);
  6096. //发送失败
  6097. // SendRequestFailure(pIServerUserItem, TEXT("客户端[%d]登录失败。原因:大厅版本校验失败!"), 0);
  6098. // return true;
  6099. //}
  6100. //切换判断
  6101. if ((pIServerUserItem != NULL) && (pIServerUserItem->ContrastLogonPass(LogonMobile.szPassword) == true))
  6102. {
  6103. auto _iter = Socket_2_UserID.find(dwSocketID);
  6104. if (_iter != Socket_2_UserID.end() && LogonMobile.dwUserID != _iter->second)
  6105. {
  6106. CString csTest1;
  6107. csTest1.Format(_T("断线重连,dwSocketID变化了,userid和dwSocketID绑定和之前不一样了!"));
  6108. CTraceService::TraceString(csTest1, TraceLevel_Warning);
  6109. ASSERT(FALSE);
  6110. }
  6111. SwitchUserItemConnect(pIServerUserItem, LogonMobile.szMachineID, wBindIndex, LogonMobile.cbDeviceType, LogonMobile.wBehaviorFlags, LogonMobile.wPageTableCount);
  6112. return true;
  6113. }
  6114. //比赛效验
  6115. //if (m_pIMatchServiceManager != NULL&&m_pIMatchServiceManager->OnEventEnterMatch(dwSocketID, pData, pBindParameter->dwClientAddr, true))
  6116. //{
  6117. // return true;
  6118. //}
  6119. if (IsJC(7777))
  6120. {
  6121. TCHAR szString[512] = TEXT("");
  6122. _sntprintf(szString, CountArray(szString), TEXT("用户 (%d) 数据库登录"), LogonMobile.dwUserID);
  6123. CTraceService::TraceString(szString, TraceLevel_Normal);
  6124. }
  6125. //变量定义
  6126. DBR_GR_LogonMobile LogonMobiles;
  6127. ZeroMemory(&LogonMobiles, sizeof(LogonMobiles));
  6128. //构造数据
  6129. LogonMobiles.dwUserID = LogonMobile.dwUserID;
  6130. LogonMobiles.dwClientAddr = pBindParameter->dwClientAddr;
  6131. lstrcpyn(LogonMobiles.szPassword, LogonMobile.szPassword, CountArray(LogonMobiles.szPassword));
  6132. lstrcpyn(LogonMobiles.szMachineID, LogonMobile.szMachineID, CountArray(LogonMobiles.szMachineID));
  6133. LogonMobiles.cbDeviceType = LogonMobile.cbDeviceType;
  6134. LogonMobiles.wBehaviorFlags = LogonMobile.wBehaviorFlags;
  6135. LogonMobiles.wPageTableCount = LogonMobile.wPageTableCount;
  6136. LogonMobiles.dX = LogonMobile.dX;
  6137. LogonMobiles.dY = LogonMobile.dY;
  6138. lstrcpyn(LogonMobiles.szChengShi, LogonMobile.szChengShi, CountArray(LogonMobiles.szChengShi));
  6139. //投递请求
  6140. m_pIDBCorrespondManager->PostDataBaseRequest(LogonMobiles.dwUserID, DBR_GR_LOGON_MOBILE, dwSocketID, &LogonMobiles, sizeof(LogonMobiles));
  6141. return true;
  6142. }
  6143. //帐号登录
  6144. bool CAttemperEngineSink::OnTCPNetworkSubLogonAccounts(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6145. {
  6146. CTraceService::TraceString(TEXT("帐号登录 OnTCPNetworkSubLogonAccounts"), TraceLevel_Debug);
  6147. //效验参数
  6148. ASSERT(wDataSize >= sizeof(CMD_GR_LogonAccounts));
  6149. if (wDataSize <= sizeof(CMD_GR_LogonAccounts)) return false;
  6150. //处理消息
  6151. CMD_GR_LogonAccounts * pLogonAccounts = (CMD_GR_LogonAccounts *)pData;
  6152. pLogonAccounts->szPassword[CountArray(pLogonAccounts->szPassword) - 1] = 0;
  6153. pLogonAccounts->szAccounts[CountArray(pLogonAccounts->szAccounts) - 1] = 0;
  6154. pLogonAccounts->szMachineID[CountArray(pLogonAccounts->szMachineID) - 1] = 0;
  6155. //绑定信息
  6156. WORD wBindIndex = LOWORD(dwSocketID);
  6157. IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  6158. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  6159. //重复判断
  6160. if (pIBindUserItem != NULL)
  6161. {
  6162. ASSERT(FALSE);
  6163. return false;
  6164. }
  6165. //机器人和真人不许互踢
  6166. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pLogonAccounts->szAccounts);
  6167. if (pIServerUserItem != NULL)
  6168. {
  6169. if ((pIServerUserItem->IsAndroidUser() && (pBindParameter->dwClientAddr != 0L))
  6170. || (!pIServerUserItem->IsAndroidUser() && (pBindParameter->dwClientAddr == 0L)))
  6171. {
  6172. SendRequestFailure(pIServerUserItem, TEXT("该帐号已在此房间游戏,且不允许踢出,请咨询管理员!"), 0);
  6173. //SendRoomMessage(dwSocketID, TEXT("该帐号已在此房间游戏,且不允许踢出,请咨询管理员!"), SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_ROOM, (pBindParameter->dwClientAddr == 0L));
  6174. return false;
  6175. }
  6176. }
  6177. //密码判断
  6178. CString strPassword = pLogonAccounts->szPassword;
  6179. strPassword.Trim();
  6180. if (pBindParameter->dwClientAddr != 0L && strPassword.GetLength() == 0)
  6181. {
  6182. //发送失败
  6183. SendLogonFailure(TEXT("很抱歉,您的登录密码错误,不允许继续进入!"), LOGON_FAIL_SERVER_INVALIDATION, dwSocketID);
  6184. return true;
  6185. }
  6186. //版本信息
  6187. pBindParameter->cbClientKind = CLIENT_KIND_COMPUTER;
  6188. pBindParameter->dwPlazaVersion = pLogonAccounts->dwPlazaVersion;
  6189. pBindParameter->dwFrameVersion = pLogonAccounts->dwFrameVersion;
  6190. pBindParameter->dwProcessVersion = pLogonAccounts->dwProcessVersion;
  6191. //大厅版本
  6192. DWORD dwPlazaVersion = pLogonAccounts->dwPlazaVersion;
  6193. DWORD dwFrameVersion = pLogonAccounts->dwFrameVersion;
  6194. DWORD dwClientVersion = pLogonAccounts->dwProcessVersion;
  6195. if (PerformCheckVersion(dwPlazaVersion, dwFrameVersion, dwClientVersion, dwSocketID) == false) return true;
  6196. //切换判断
  6197. if ((pIServerUserItem != NULL) && (pIServerUserItem->ContrastLogonPass(pLogonAccounts->szPassword) == true))
  6198. {
  6199. SwitchUserItemConnect(pIServerUserItem, pLogonAccounts->szMachineID, wBindIndex);
  6200. return true;
  6201. }
  6202. //变量定义
  6203. DBR_GR_LogonAccounts LogonAccounts;
  6204. ZeroMemory(&LogonAccounts, sizeof(LogonAccounts));
  6205. //构造数据
  6206. LogonAccounts.dwClientAddr = pBindParameter->dwClientAddr;
  6207. lstrcpyn(LogonAccounts.szAccounts, pLogonAccounts->szAccounts, CountArray(LogonAccounts.szAccounts));
  6208. lstrcpyn(LogonAccounts.szPassword, pLogonAccounts->szPassword, CountArray(LogonAccounts.szPassword));
  6209. lstrcpyn(LogonAccounts.szMachineID, pLogonAccounts->szMachineID, CountArray(LogonAccounts.szMachineID));
  6210. //投递请求
  6211. m_pIDBCorrespondManager->PostDataBaseRequest(0L, DBR_GR_LOGON_ACCOUNTS, dwSocketID, &LogonAccounts, sizeof(LogonAccounts));
  6212. return true;
  6213. }
  6214. //用户规则
  6215. bool CAttemperEngineSink::OnTCPNetworkSubUserRule(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6216. {
  6217. //效验参数
  6218. ASSERT(wDataSize >= sizeof(CMD_GR_UserRule));
  6219. if (wDataSize < sizeof(CMD_GR_UserRule)) return false;
  6220. //获取用户
  6221. WORD wBindIndex = LOWORD(dwSocketID);
  6222. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  6223. //用户效验
  6224. ASSERT(pIServerUserItem != NULL);
  6225. if (pIServerUserItem == NULL) return false;
  6226. //规则判断
  6227. //ASSERT(CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule)==false);
  6228. if (CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule) == true || m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) return true;
  6229. //消息处理
  6230. tagUserRule * pUserRule = pIServerUserItem->GetUserRule();
  6231. CMD_GR_UserRule * pCMDUserRule = (CMD_GR_UserRule *)pData;
  6232. //规则标志
  6233. pUserRule->bLimitSameIP = ((pCMDUserRule->cbRuleMask&UR_LIMIT_SAME_IP) > 0);
  6234. pUserRule->bLimitWinRate = ((pCMDUserRule->cbRuleMask&UR_LIMIT_WIN_RATE) > 0);
  6235. pUserRule->bLimitFleeRate = ((pCMDUserRule->cbRuleMask&UR_LIMIT_FLEE_RATE) > 0);
  6236. pUserRule->bLimitGameScore = ((pCMDUserRule->cbRuleMask&UR_LIMIT_GAME_SCORE) > 0);
  6237. //规则属性
  6238. pUserRule->szPassword[0] = 0;
  6239. pUserRule->wMinWinRate = pCMDUserRule->wMinWinRate;
  6240. pUserRule->wMaxFleeRate = pCMDUserRule->wMaxFleeRate;
  6241. pUserRule->lMaxGameScore = pCMDUserRule->lMaxGameScore;
  6242. pUserRule->lMinGameScore = pCMDUserRule->lMinGameScore;
  6243. //桌子密码
  6244. if (wDataSize > sizeof(CMD_GR_UserRule))
  6245. {
  6246. tagDataDescribe DataDescribe;
  6247. CRecvPacketHelper RecvPacket(pCMDUserRule + 1, wDataSize - sizeof(CMD_GR_UserRule));
  6248. //提取处理
  6249. while (true)
  6250. {
  6251. //提取数据
  6252. auto pDataBuffer = RecvPacket.GetData(DataDescribe);
  6253. if (DataDescribe.wDataDescribe == DTP_NULL) break;
  6254. //数据分析
  6255. switch (DataDescribe.wDataDescribe)
  6256. {
  6257. case DTP_GR_TABLE_PASSWORD: //桌子密码
  6258. {
  6259. //效验数据
  6260. ASSERT(pDataBuffer != NULL);
  6261. ASSERT(DataDescribe.wDataSize <= sizeof(pUserRule->szPassword));
  6262. //规则判断
  6263. ASSERT(CServerRule::IsForfendLockTable(m_pGameServiceOption->dwServerRule) == false);
  6264. if (CServerRule::IsForfendLockTable(m_pGameServiceOption->dwServerRule) == true) break;
  6265. //设置数据
  6266. if (DataDescribe.wDataSize <= sizeof(pUserRule->szPassword))
  6267. {
  6268. CopyMemory(&pUserRule->szPassword, pDataBuffer, DataDescribe.wDataSize);
  6269. pUserRule->szPassword[CountArray(pUserRule->szPassword) - 1] = 0;
  6270. }
  6271. break;
  6272. }
  6273. default: break;
  6274. }
  6275. }
  6276. }
  6277. return true;
  6278. }
  6279. //用户旁观
  6280. bool CAttemperEngineSink::OnTCPNetworkSubUserLookon(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6281. {
  6282. UserInfo::PB_CS_C_UserLookon Lookon;
  6283. Lookon.ParseFromArray(pData, wDataSize);
  6284. //处理消息
  6285. CMD_GR_UserLookon pUserLookon;
  6286. ZeroMemory(&pUserLookon, sizeof(pUserLookon));
  6287. pUserLookon.wTableID = Lookon.wtableid();
  6288. CString szprivtetableid = (CA2CTEX<2048>(Lookon.szprivtetableid().c_str(), CP_UTF8)).m_szBuffer;
  6289. _sntprintf(pUserLookon.szPrivteTableID, CountArray(pUserLookon.szPrivteTableID), TEXT("%s"), szprivtetableid);
  6290. //获取用户
  6291. WORD wBindIndex = LOWORD(dwSocketID);
  6292. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  6293. //用户效验
  6294. ASSERT(pIServerUserItem != NULL);
  6295. if (pIServerUserItem == NULL) return false;
  6296. //消息处理
  6297. WORD wTableID = pIServerUserItem->GetTableID();
  6298. //WORD wChairID = pIServerUserItem->GetChairID();
  6299. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  6300. if ((wTableID == pUserLookon.wTableID) && (cbUserStatus == US_LOOKON)) return true;
  6301. //用户判断
  6302. if (cbUserStatus == US_PLAYING)
  6303. {
  6304. SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0);
  6305. if (IsJC(1234))
  6306. {
  6307. CString csTestB;
  6308. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserLookon", pIServerUserItem->GetUserID()
  6309. , pIServerUserItem->GetUserInfo()->szPrivateTableID
  6310. , cbUserStatus);
  6311. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  6312. }
  6313. return true;
  6314. }
  6315. //离开处理
  6316. if (wTableID != INVALID_TABLE)
  6317. {
  6318. std::shared_ptr<CTableFrame> pTableFrame = GetTableFrame(wTableID);
  6319. if (!pTableFrame)
  6320. return false;
  6321. if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  6322. }
  6323. if (pUserLookon.wTableID != 0 && pUserLookon.wTableID != INVALID_TABLE)
  6324. {
  6325. //坐下处理
  6326. std::shared_ptr<CTableFrame> pTableFrame = GetTableFrame(pUserLookon.wTableID);
  6327. if (!pTableFrame)
  6328. {
  6329. return false;
  6330. //SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0);
  6331. }
  6332. pTableFrame->PerformLookonAction(pIServerUserItem);
  6333. }
  6334. else
  6335. {
  6336. std::shared_ptr<CTableFrame> pTableFrame = GetPriTableFrame(pUserLookon.szPrivteTableID);
  6337. if (!pTableFrame)
  6338. {
  6339. SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0);
  6340. return true;
  6341. }
  6342. pTableFrame->PerformLookonAction(pIServerUserItem);
  6343. }
  6344. return true;
  6345. }
  6346. //字牌检测
  6347. bool CAttemperEngineSink::CheckConfigZiPai(tagGameConfig UserSitDown)
  6348. {
  6349. CString juShuCfg;
  6350. CString gameTypeCfg;
  6351. CString diJinCfg;
  6352. CString payTypeCfg;
  6353. juShuCfg = m_pGameParameter->msParameter[3].juShuCfg;
  6354. gameTypeCfg = m_pGameParameter->msParameter[3].szgameTypeCfg;
  6355. diJinCfg = m_pGameParameter->msParameter[3].diJinCfg;
  6356. payTypeCfg = m_pGameParameter->msParameter[3].payTypeCfg;
  6357. CList<int> list1;
  6358. CList<int> list2;
  6359. CList<int> list3;
  6360. CList<int> list4;
  6361. int pos = juShuCfg.Find(_T('#'));
  6362. int i = 0;
  6363. while (pos != -1)
  6364. {
  6365. CString field = juShuCfg.Left(pos);
  6366. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6367. list1.AddTail(iRet);
  6368. juShuCfg.ReleaseBuffer();
  6369. i++;
  6370. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  6371. pos = juShuCfg.Find(_T('#'));
  6372. }
  6373. if (juShuCfg.GetLength() > 0)
  6374. {
  6375. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6376. list1.AddTail(iRet);
  6377. juShuCfg.ReleaseBuffer();
  6378. }
  6379. pos = gameTypeCfg.Find(_T('#'));
  6380. i = 0;
  6381. while (pos != -1)
  6382. {
  6383. CString field = gameTypeCfg.Left(pos);
  6384. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6385. list2.AddTail(iRet);
  6386. gameTypeCfg.ReleaseBuffer();
  6387. i++;
  6388. gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1);
  6389. pos = gameTypeCfg.Find(_T('#'));
  6390. }
  6391. if (gameTypeCfg.GetLength() > 0)
  6392. {
  6393. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6394. list2.AddTail(iRet);
  6395. gameTypeCfg.ReleaseBuffer();
  6396. }
  6397. pos = diJinCfg.Find(_T('#'));
  6398. i = 0;
  6399. while (pos != -1)
  6400. {
  6401. CString field = diJinCfg.Left(pos);
  6402. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6403. list3.AddTail(iRet);
  6404. diJinCfg.ReleaseBuffer();
  6405. i++;
  6406. diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1);
  6407. pos = diJinCfg.Find(_T('#'));
  6408. }
  6409. if (diJinCfg.GetLength() > 0)
  6410. {
  6411. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6412. list3.AddTail(iRet);
  6413. diJinCfg.ReleaseBuffer();
  6414. }
  6415. pos = payTypeCfg.Find(_T('#'));
  6416. i = 0;
  6417. while (pos != -1)
  6418. {
  6419. CString field = payTypeCfg.Left(pos);
  6420. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6421. list4.AddTail(iRet);
  6422. payTypeCfg.ReleaseBuffer();
  6423. i++;
  6424. payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1);
  6425. pos = payTypeCfg.Find(_T('#'));
  6426. }
  6427. if (payTypeCfg.GetLength() > 0)
  6428. {
  6429. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6430. list4.AddTail(iRet);
  6431. payTypeCfg.ReleaseBuffer();
  6432. }
  6433. bool bFind = false;
  6434. int iCount = list1.GetCount();
  6435. for (int var = 0; var < iCount; var++)
  6436. {
  6437. int iRet = list1.GetAt(list1.FindIndex(var));
  6438. if (iRet == UserSitDown.wPlayCountRule)
  6439. {
  6440. bFind = true;
  6441. break;
  6442. }
  6443. }
  6444. if (!bFind)
  6445. {
  6446. return false;
  6447. }
  6448. bFind = false;
  6449. iCount = list2.GetCount();
  6450. for (int var = 0; var < iCount; var++)
  6451. {
  6452. int iRet = list2.GetAt(list2.FindIndex(var));
  6453. if (iRet == UserSitDown.wSubGameID)
  6454. {
  6455. bFind = true;
  6456. break;
  6457. }
  6458. }
  6459. if (!bFind)
  6460. {
  6461. return false;
  6462. }
  6463. bFind = false;
  6464. iCount = list3.GetCount();
  6465. for (int var = 0; var < iCount; var++)
  6466. {
  6467. int iRet = list3.GetAt(list3.FindIndex(var));
  6468. if (iRet == UserSitDown.wPlayRule)
  6469. {
  6470. bFind = true;
  6471. break;
  6472. }
  6473. }
  6474. if (!bFind)
  6475. {
  6476. return false;
  6477. }
  6478. bFind = false;
  6479. iCount = list4.GetCount();
  6480. for (int var = 0; var < iCount; var++)
  6481. {
  6482. int iRet = list4.GetAt(list4.FindIndex(var));
  6483. if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule)
  6484. {
  6485. bFind = true;
  6486. break;
  6487. }
  6488. }
  6489. if (!bFind)
  6490. {
  6491. return false;
  6492. }
  6493. return true;
  6494. }
  6495. //戳瞎子检测
  6496. bool CAttemperEngineSink::CheckConfigXiaZi(tagGameConfig UserSitDown)
  6497. {
  6498. CString juShuCfg;
  6499. CString gameTypeCfg;
  6500. CString diJinCfg;
  6501. CString payTypeCfg;
  6502. juShuCfg = m_pGameParameter->msParameter[2].juShuCfg;
  6503. gameTypeCfg = m_pGameParameter->msParameter[2].szgameTypeCfg;
  6504. diJinCfg = m_pGameParameter->msParameter[2].diJinCfg;
  6505. payTypeCfg = m_pGameParameter->msParameter[2].payTypeCfg;
  6506. CList<int> list1;
  6507. CList<int> list2;
  6508. CList<int> list3;
  6509. CList<int> list4;
  6510. int pos = juShuCfg.Find(_T('#'));
  6511. int i = 0;
  6512. while (pos != -1)
  6513. {
  6514. CString field = juShuCfg.Left(pos);
  6515. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6516. list1.AddTail(iRet);
  6517. juShuCfg.ReleaseBuffer();
  6518. i++;
  6519. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  6520. pos = juShuCfg.Find(_T('#'));
  6521. }
  6522. if (juShuCfg.GetLength() > 0)
  6523. {
  6524. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6525. list1.AddTail(iRet);
  6526. juShuCfg.ReleaseBuffer();
  6527. }
  6528. pos = gameTypeCfg.Find(_T('#'));
  6529. i = 0;
  6530. while (pos != -1)
  6531. {
  6532. CString field = gameTypeCfg.Left(pos);
  6533. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6534. list2.AddTail(iRet);
  6535. gameTypeCfg.ReleaseBuffer();
  6536. i++;
  6537. gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1);
  6538. pos = gameTypeCfg.Find(_T('#'));
  6539. }
  6540. if (gameTypeCfg.GetLength() > 0)
  6541. {
  6542. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6543. list2.AddTail(iRet);
  6544. gameTypeCfg.ReleaseBuffer();
  6545. }
  6546. pos = diJinCfg.Find(_T('#'));
  6547. i = 0;
  6548. while (pos != -1)
  6549. {
  6550. CString field = diJinCfg.Left(pos);
  6551. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6552. list3.AddTail(iRet);
  6553. diJinCfg.ReleaseBuffer();
  6554. i++;
  6555. diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1);
  6556. pos = diJinCfg.Find(_T('#'));
  6557. }
  6558. if (diJinCfg.GetLength() > 0)
  6559. {
  6560. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6561. list3.AddTail(iRet);
  6562. diJinCfg.ReleaseBuffer();
  6563. }
  6564. pos = payTypeCfg.Find(_T('#'));
  6565. i = 0;
  6566. while (pos != -1)
  6567. {
  6568. CString field = payTypeCfg.Left(pos);
  6569. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6570. list4.AddTail(iRet);
  6571. payTypeCfg.ReleaseBuffer();
  6572. i++;
  6573. payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1);
  6574. pos = payTypeCfg.Find(_T('#'));
  6575. }
  6576. if (payTypeCfg.GetLength() > 0)
  6577. {
  6578. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6579. list4.AddTail(iRet);
  6580. payTypeCfg.ReleaseBuffer();
  6581. }
  6582. bool bFind = false;
  6583. int iCount = list1.GetCount();
  6584. for (int var = 0; var < iCount; var++)
  6585. {
  6586. int iRet = list1.GetAt(list1.FindIndex(var));
  6587. if (iRet == UserSitDown.wPlayCountRule)
  6588. {
  6589. bFind = true;
  6590. break;
  6591. }
  6592. }
  6593. if (!bFind)
  6594. {
  6595. return false;
  6596. }
  6597. bFind = false;
  6598. iCount = list2.GetCount();
  6599. for (int var = 0; var < iCount; var++)
  6600. {
  6601. int iRet = list2.GetAt(list2.FindIndex(var));
  6602. if (iRet == UserSitDown.wSubGameID)
  6603. {
  6604. bFind = true;
  6605. break;
  6606. }
  6607. }
  6608. if (!bFind)
  6609. {
  6610. return false;
  6611. }
  6612. bFind = false;
  6613. iCount = list3.GetCount();
  6614. for (int var = 0; var < iCount; var++)
  6615. {
  6616. int iRet = list3.GetAt(list3.FindIndex(var));
  6617. if (iRet == UserSitDown.wPlayRule)
  6618. {
  6619. bFind = true;
  6620. break;
  6621. }
  6622. }
  6623. if (!bFind)
  6624. {
  6625. return false;
  6626. }
  6627. bFind = false;
  6628. iCount = list4.GetCount();
  6629. for (int var = 0; var < iCount; var++)
  6630. {
  6631. int iRet = list4.GetAt(list4.FindIndex(var));
  6632. if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule)
  6633. {
  6634. bFind = true;
  6635. break;
  6636. }
  6637. }
  6638. if (!bFind)
  6639. {
  6640. return false;
  6641. }
  6642. return true;
  6643. }
  6644. bool CAttemperEngineSink::CheckConfig(tagGameConfig UserSitDown)
  6645. {
  6646. CString juShuCfg;
  6647. CString gameTypeCfg;
  6648. CString diJinCfg;
  6649. CString payTypeCfg;
  6650. juShuCfg = m_pGameParameter->msParameter[0].juShuCfg;
  6651. gameTypeCfg = m_pGameParameter->msParameter[0].szgameTypeCfg;
  6652. diJinCfg = m_pGameParameter->msParameter[0].diJinCfg;
  6653. payTypeCfg = m_pGameParameter->msParameter[0].payTypeCfg;
  6654. CList<int> list1;
  6655. CList<int> list2;
  6656. CList<int> list3;
  6657. CList<int> list4;
  6658. int pos = juShuCfg.Find(_T('#'));
  6659. int i = 0;
  6660. while (pos != -1)
  6661. {
  6662. CString field = juShuCfg.Left(pos);
  6663. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6664. list1.AddTail(iRet);
  6665. juShuCfg.ReleaseBuffer();
  6666. i++;
  6667. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  6668. pos = juShuCfg.Find(_T('#'));
  6669. }
  6670. if (juShuCfg.GetLength() > 0)
  6671. {
  6672. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6673. list1.AddTail(iRet);
  6674. juShuCfg.ReleaseBuffer();
  6675. }
  6676. pos = gameTypeCfg.Find(_T('#'));
  6677. i = 0;
  6678. while (pos != -1)
  6679. {
  6680. CString field = gameTypeCfg.Left(pos);
  6681. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6682. list2.AddTail(iRet);
  6683. gameTypeCfg.ReleaseBuffer();
  6684. i++;
  6685. gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1);
  6686. pos = gameTypeCfg.Find(_T('#'));
  6687. }
  6688. if (gameTypeCfg.GetLength() > 0)
  6689. {
  6690. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6691. list2.AddTail(iRet);
  6692. gameTypeCfg.ReleaseBuffer();
  6693. }
  6694. pos = diJinCfg.Find(_T('#'));
  6695. i = 0;
  6696. while (pos != -1)
  6697. {
  6698. CString field = diJinCfg.Left(pos);
  6699. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6700. list3.AddTail(iRet);
  6701. diJinCfg.ReleaseBuffer();
  6702. i++;
  6703. diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1);
  6704. pos = diJinCfg.Find(_T('#'));
  6705. }
  6706. if (diJinCfg.GetLength() > 0)
  6707. {
  6708. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6709. list3.AddTail(iRet);
  6710. diJinCfg.ReleaseBuffer();
  6711. }
  6712. pos = payTypeCfg.Find(_T('#'));
  6713. i = 0;
  6714. while (pos != -1)
  6715. {
  6716. CString field = payTypeCfg.Left(pos);
  6717. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6718. list4.AddTail(iRet);
  6719. payTypeCfg.ReleaseBuffer();
  6720. i++;
  6721. payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1);
  6722. pos = payTypeCfg.Find(_T('#'));
  6723. }
  6724. if (payTypeCfg.GetLength() > 0)
  6725. {
  6726. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6727. list4.AddTail(iRet);
  6728. payTypeCfg.ReleaseBuffer();
  6729. }
  6730. bool bFind = false;
  6731. int iCount = list1.GetCount();
  6732. for (int var = 0; var < iCount; var++)
  6733. {
  6734. int iRet = list1.GetAt(list1.FindIndex(var));
  6735. if (iRet == UserSitDown.wPlayCountRule)
  6736. {
  6737. bFind = true;
  6738. break;
  6739. }
  6740. }
  6741. if (!bFind)
  6742. {
  6743. return false;
  6744. }
  6745. bFind = false;
  6746. iCount = list2.GetCount();
  6747. for (int var = 0; var < iCount; var++)
  6748. {
  6749. int iRet = list2.GetAt(list2.FindIndex(var));
  6750. if (iRet == UserSitDown.wSubGameID)
  6751. {
  6752. bFind = true;
  6753. break;
  6754. }
  6755. }
  6756. if (!bFind)
  6757. {
  6758. return false;
  6759. }
  6760. bFind = false;
  6761. iCount = list3.GetCount();
  6762. for (int var = 0; var < iCount; var++)
  6763. {
  6764. int iRet = list3.GetAt(list3.FindIndex(var));
  6765. if (iRet == UserSitDown.wPlayRule)
  6766. {
  6767. bFind = true;
  6768. break;
  6769. }
  6770. }
  6771. if (!bFind)
  6772. {
  6773. return false;
  6774. }
  6775. bFind = false;
  6776. iCount = list4.GetCount();
  6777. for (int var = 0; var < iCount; var++)
  6778. {
  6779. int iRet = list4.GetAt(list4.FindIndex(var));
  6780. if (iRet == UserSitDown.wMaxFanRule || iRet + 10 == UserSitDown.wMaxFanRule)
  6781. {
  6782. bFind = true;
  6783. break;
  6784. }
  6785. }
  6786. if (!bFind)
  6787. {
  6788. return false;
  6789. }
  6790. return true;
  6791. }
  6792. bool CAttemperEngineSink::CheckConfigXueLiu(tagGameConfig UserSitDown)
  6793. {
  6794. CString juShuCfg;
  6795. CString gameTypeCfg;
  6796. CString diJinCfg;
  6797. CString payTypeCfg;
  6798. juShuCfg = m_pGameParameter->msParameter[1].juShuCfg;
  6799. gameTypeCfg = m_pGameParameter->msParameter[1].szgameTypeCfg;
  6800. diJinCfg = m_pGameParameter->msParameter[1].diJinCfg;
  6801. payTypeCfg = m_pGameParameter->msParameter[1].payTypeCfg;
  6802. CList<int> list1;
  6803. CList<int> list2;
  6804. CList<int> list3;
  6805. CList<int> list4;
  6806. int pos = juShuCfg.Find(_T('#'));
  6807. int i = 0;
  6808. while (pos != -1)
  6809. {
  6810. CString field = juShuCfg.Left(pos);
  6811. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6812. list1.AddTail(iRet);
  6813. juShuCfg.ReleaseBuffer();
  6814. i++;
  6815. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  6816. pos = juShuCfg.Find(_T('#'));
  6817. }
  6818. if (juShuCfg.GetLength() > 0)
  6819. {
  6820. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  6821. list1.AddTail(iRet);
  6822. juShuCfg.ReleaseBuffer();
  6823. }
  6824. pos = gameTypeCfg.Find(_T('#'));
  6825. i = 0;
  6826. while (pos != -1)
  6827. {
  6828. CString field = gameTypeCfg.Left(pos);
  6829. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6830. list2.AddTail(iRet);
  6831. gameTypeCfg.ReleaseBuffer();
  6832. i++;
  6833. gameTypeCfg = gameTypeCfg.Right(gameTypeCfg.GetLength() - pos - 1);
  6834. pos = gameTypeCfg.Find(_T('#'));
  6835. }
  6836. if (gameTypeCfg.GetLength() > 0)
  6837. {
  6838. int iRet = _wtoi(gameTypeCfg.GetBuffer(0));
  6839. list2.AddTail(iRet);
  6840. gameTypeCfg.ReleaseBuffer();
  6841. }
  6842. pos = diJinCfg.Find(_T('#'));
  6843. i = 0;
  6844. while (pos != -1)
  6845. {
  6846. CString field = diJinCfg.Left(pos);
  6847. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6848. list3.AddTail(iRet);
  6849. diJinCfg.ReleaseBuffer();
  6850. i++;
  6851. diJinCfg = diJinCfg.Right(diJinCfg.GetLength() - pos - 1);
  6852. pos = diJinCfg.Find(_T('#'));
  6853. }
  6854. if (diJinCfg.GetLength() > 0)
  6855. {
  6856. int iRet = _wtoi(diJinCfg.GetBuffer(0));
  6857. list3.AddTail(iRet);
  6858. diJinCfg.ReleaseBuffer();
  6859. }
  6860. pos = payTypeCfg.Find(_T('#'));
  6861. i = 0;
  6862. while (pos != -1)
  6863. {
  6864. CString field = payTypeCfg.Left(pos);
  6865. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6866. list4.AddTail(iRet);
  6867. payTypeCfg.ReleaseBuffer();
  6868. i++;
  6869. payTypeCfg = payTypeCfg.Right(payTypeCfg.GetLength() - pos - 1);
  6870. pos = payTypeCfg.Find(_T('#'));
  6871. }
  6872. if (payTypeCfg.GetLength() > 0)
  6873. {
  6874. int iRet = _wtoi(payTypeCfg.GetBuffer(0));
  6875. list4.AddTail(iRet);
  6876. payTypeCfg.ReleaseBuffer();
  6877. }
  6878. bool bFind = false;
  6879. int iCount = list1.GetCount();
  6880. for (int var = 0; var < iCount; var++)
  6881. {
  6882. int iRet = list1.GetAt(list1.FindIndex(var));
  6883. if (iRet == UserSitDown.wPlayCountRule)
  6884. {
  6885. bFind = true;
  6886. break;
  6887. }
  6888. }
  6889. if (!bFind)
  6890. {
  6891. return false;
  6892. }
  6893. bFind = false;
  6894. iCount = list2.GetCount();
  6895. for (int var = 0; var < iCount; var++)
  6896. {
  6897. int iRet = list2.GetAt(list2.FindIndex(var));
  6898. if (iRet == UserSitDown.wSubGameID)
  6899. {
  6900. bFind = true;
  6901. break;
  6902. }
  6903. }
  6904. if (!bFind)
  6905. {
  6906. return false;
  6907. }
  6908. bFind = false;
  6909. iCount = list3.GetCount();
  6910. for (int var = 0; var < iCount; var++)
  6911. {
  6912. int iRet = list3.GetAt(list3.FindIndex(var));
  6913. if (iRet == UserSitDown.wPlayRule)
  6914. {
  6915. bFind = true;
  6916. break;
  6917. }
  6918. }
  6919. if (!bFind)
  6920. {
  6921. return false;
  6922. }
  6923. bFind = false;
  6924. iCount = list4.GetCount();
  6925. for (int var = 0; var < iCount; var++)
  6926. {
  6927. int iRet = list4.GetAt(list4.FindIndex(var));
  6928. if (iRet == UserSitDown.wMaxFanRule || iRet+10 == UserSitDown.wMaxFanRule)
  6929. {
  6930. bFind = true;
  6931. break;
  6932. }
  6933. }
  6934. if (!bFind)
  6935. {
  6936. return false;
  6937. }
  6938. return true;
  6939. }
  6940. //用户创建私有房间第二步
  6941. bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoomEx(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  6942. {
  6943. //效验参数
  6944. ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx));
  6945. if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false;
  6946. //效验数据
  6947. CMD_GR_UserSitDownEx * pUserSitDown = (CMD_GR_UserSitDownEx *)pData;
  6948. //获取用户
  6949. WORD wBindIndex = LOWORD(dwSocketID);
  6950. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  6951. //用户效验
  6952. //ASSERT(pIServerUserItem != NULL);
  6953. if (pIServerUserItem == NULL) return false;
  6954. if (1 != pUserSitDown->data.cbCreateTable)
  6955. {
  6956. CMD_GR_UserSitDownAck req;
  6957. ZeroMemory(&req, sizeof(req));
  6958. req.cbRet = 1;
  6959. StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误"));
  6960. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  6961. SitDownAck.set_cbret(req.cbRet);
  6962. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  6963. SitDownAck.set_sztext(szText);
  6964. //发送数据
  6965. std::string pbdata = SitDownAck.SerializePartialAsString();
  6966. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  6967. return true;
  6968. }
  6969. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  6970. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断
  6971. {
  6972. CMD_GR_UserSitDownAck req;
  6973. ZeroMemory(&req, sizeof(req));
  6974. req.cbRet = 1;
  6975. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!"));
  6976. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  6977. SitDownAck.set_cbret(req.cbRet);
  6978. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  6979. SitDownAck.set_sztext(szText);
  6980. //发送数据
  6981. std::string pbdata = SitDownAck.SerializePartialAsString();
  6982. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  6983. if (IsJC(1234))
  6984. {
  6985. CString csTestB;
  6986. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d"), L"OnTCPNetworkSubUserCreateRoomEx", pIServerUserItem->GetUserID()
  6987. , pIServerUserItem->GetUserInfo()->wTableID
  6988. , cbUserStatus);
  6989. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  6990. }
  6991. //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0);
  6992. return true;
  6993. }
  6994. if (cbUserStatus == US_SIT
  6995. || US_READY == cbUserStatus
  6996. || US_LOOKON == cbUserStatus)//用户判断
  6997. {
  6998. //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,不允许创建!"), 0);
  6999. CMD_GR_UserSitDownAck req;
  7000. ZeroMemory(&req, sizeof(req));
  7001. req.cbRet = 1;
  7002. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,不允许创建!"));
  7003. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7004. SitDownAck.set_cbret(req.cbRet);
  7005. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7006. SitDownAck.set_sztext(szText);
  7007. //发送数据
  7008. std::string pbdata = SitDownAck.SerializePartialAsString();
  7009. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7010. return true;
  7011. }
  7012. WORD wTableID = pIServerUserItem->GetTableID();
  7013. if (wTableID != INVALID_TABLE)
  7014. {
  7015. //如果还在哪桌打麻将呢,则先离开处理
  7016. auto pTableFrame = GetTableFrame(wTableID);
  7017. if (!pTableFrame)
  7018. return false;
  7019. if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  7020. }
  7021. tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->data.TableConfig;
  7022. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  7023. {
  7024. //新版本 血流
  7025. if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7026. {
  7027. CMD_GR_UserSitDownAck req;
  7028. ZeroMemory(&req, sizeof(req));
  7029. req.cbRet = 1;
  7030. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7031. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7032. SitDownAck.set_cbret(req.cbRet);
  7033. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7034. SitDownAck.set_sztext(szText);
  7035. //发送数据
  7036. std::string pbdata = SitDownAck.SerializePartialAsString();
  7037. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7038. return true;
  7039. }
  7040. }
  7041. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7042. {
  7043. //纸牌
  7044. if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7045. {
  7046. CMD_GR_UserSitDownAck req;
  7047. ZeroMemory(&req, sizeof(req));
  7048. req.cbRet = 1;
  7049. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7050. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7051. SitDownAck.set_cbret(req.cbRet);
  7052. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7053. SitDownAck.set_sztext(szText);
  7054. //发送数据
  7055. std::string pbdata = SitDownAck.SerializePartialAsString();
  7056. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7057. return true;
  7058. }
  7059. }
  7060. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7061. {
  7062. //戳瞎子
  7063. if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7064. {
  7065. CMD_GR_UserSitDownAck req;
  7066. ZeroMemory(&req, sizeof(req));
  7067. req.cbRet = 1;
  7068. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7069. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7070. SitDownAck.set_cbret(req.cbRet);
  7071. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7072. SitDownAck.set_sztext(szText);
  7073. //发送数据
  7074. std::string pbdata = SitDownAck.SerializePartialAsString();
  7075. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7076. return true;
  7077. }
  7078. }
  7079. else if (ptagGameConfig->wSubGameID < 3)
  7080. {
  7081. //检验房间参数
  7082. if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7083. {
  7084. CMD_GR_UserSitDownAck req;
  7085. ZeroMemory(&req, sizeof(req));
  7086. req.cbRet = 1;
  7087. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7088. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7089. SitDownAck.set_cbret(req.cbRet);
  7090. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7091. SitDownAck.set_sztext(szText);
  7092. //发送数据
  7093. std::string pbdata = SitDownAck.SerializePartialAsString();
  7094. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7095. return true;
  7096. }
  7097. }
  7098. else if (ptagGameConfig->wSubGameID >= 20)
  7099. {
  7100. //检验房间参数
  7101. /*if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7102. {
  7103. CMD_GR_UserSitDownAck req;
  7104. req.cbRet = 1;
  7105. req.szText;
  7106. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7107. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  7108. return true;
  7109. }*/
  7110. }
  7111. JN_GR_RoomListGroup sPrivateTableID;
  7112. ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup));
  7113. std::shared_ptr<CTableFrame> pTableFrame;
  7114. std::wstring str;
  7115. //查看自己创建的房间
  7116. auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID());
  7117. if (iter != m_UserID_2_PriTableIDGROUP.end())
  7118. {
  7119. sPrivateTableID = iter->second;
  7120. if (sPrivateTableID.Num > 29)
  7121. {
  7122. //SendRequestFailure(pIServerUserItem, TEXT("创建房间数超限,请先解散当前房间!"), 0);
  7123. CMD_GR_UserSitDownAck req;
  7124. ZeroMemory(&req, sizeof(req));
  7125. req.cbRet = 1;
  7126. StringCchCopy(req.szText, _countof(req.szText), _T("当前状态不允许创建!"));
  7127. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7128. SitDownAck.set_cbret(req.cbRet);
  7129. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7130. SitDownAck.set_sztext(szText);
  7131. //发送数据
  7132. std::string pbdata = SitDownAck.SerializePartialAsString();
  7133. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7134. return true;
  7135. }
  7136. }
  7137. else
  7138. {
  7139. std::pair<DWORD, JN_GR_RoomListGroup> temp(pIServerUserItem->GetUserID(), sPrivateTableID);
  7140. m_UserID_2_PriTableIDGROUP.insert(temp);
  7141. }
  7142. //添加房间信息
  7143. tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown->data.TableConfig;
  7144. UINT wReduceBeans = 0;
  7145. UINT wBean = 0;
  7146. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  7147. {
  7148. //新版本 血流
  7149. wBean = GetNeedPayEx(pConfig->wPlayCountRule);
  7150. }
  7151. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7152. {
  7153. //纸牌
  7154. wBean = GetNeedPayZhiP(pConfig->wPlayCountRule);
  7155. }
  7156. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7157. {
  7158. //戳瞎子
  7159. wBean = GetNeedPayCxz(pConfig->wPlayCountRule);
  7160. }
  7161. else if (ptagGameConfig->wSubGameID < 3)
  7162. {
  7163. //检验房间参数
  7164. wBean = GetNeedPay(pConfig->wPlayCountRule);
  7165. }
  7166. else if (ptagGameConfig->wSubGameID >= 20)
  7167. {
  7168. wBean = GetNeedPay(pConfig->wPlayCountRule);
  7169. }
  7170. if (wBean == 0xff)
  7171. {
  7172. CMD_GR_UserSitDownAck req;
  7173. ZeroMemory(&req, sizeof(req));
  7174. req.cbRet = 1;
  7175. StringCchCopy(req.szText, _countof(req.szText), _T("创建规则校验失败!"));
  7176. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7177. SitDownAck.set_cbret(req.cbRet);
  7178. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7179. SitDownAck.set_sztext(szText);
  7180. //发送数据
  7181. std::string pbdata = SitDownAck.SerializePartialAsString();
  7182. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7183. return true;
  7184. }
  7185. if (pConfig->wMaxFanRule == 0)
  7186. {
  7187. //房主支付
  7188. wReduceBeans = wBean;
  7189. int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi;
  7190. if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20)
  7191. {
  7192. //使用的是赠送的钻石,限制其房主支付
  7193. CMD_GR_UserSitDownAck req;
  7194. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7195. req.cbRet = 1;
  7196. StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。"));
  7197. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7198. SitDownAck.set_cbret(req.cbRet);
  7199. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7200. SitDownAck.set_sztext(szText);
  7201. //发送数据
  7202. std::string pbdata = SitDownAck.SerializePartialAsString();
  7203. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7204. return true;
  7205. }
  7206. }
  7207. else if (pConfig->wMaxFanRule >= 10)
  7208. {
  7209. //群主支付
  7210. wReduceBeans = wBean;
  7211. }
  7212. else
  7213. {
  7214. if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7215. {
  7216. wReduceBeans = wBean / 3;
  7217. }
  7218. else if(ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7219. {
  7220. wReduceBeans = wBean / 3;
  7221. }
  7222. else
  7223. {
  7224. wReduceBeans = wBean / MAX_CHAIR;
  7225. }
  7226. }
  7227. if (wReduceBeans > 24)
  7228. {
  7229. CMD_GR_UserSitDownAck req;
  7230. ZeroMemory(&req, sizeof(req));
  7231. req.cbRet = 1;
  7232. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置错误,请确认后再试!"));
  7233. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7234. SitDownAck.set_cbret(req.cbRet);
  7235. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7236. SitDownAck.set_sztext(szText);
  7237. //发送数据
  7238. std::string pbdata = SitDownAck.SerializePartialAsString();
  7239. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7240. return true;
  7241. }
  7242. auto UserInfo = pIServerUserItem->GetUserInfo();
  7243. if (pConfig->wMaxFanRule < 10 && UserInfo->dwBean < wReduceBeans)
  7244. {
  7245. CMD_GR_UserSitDownAck req;
  7246. ZeroMemory(&req, sizeof(req));
  7247. req.cbRet = 1;
  7248. StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!")); ///---元宝改钻石 2017-8-3
  7249. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7250. SitDownAck.set_cbret(req.cbRet);
  7251. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7252. SitDownAck.set_sztext(szText);
  7253. //发送数据
  7254. std::string pbdata = SitDownAck.SerializePartialAsString();
  7255. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7256. return true;
  7257. }
  7258. if (pUserSitDown->data.tableType == 1/*pConfig->wMaxFanRule >= 10*/)
  7259. {
  7260. //返回数据
  7261. void * pBuffer = NULL;
  7262. try
  7263. {
  7264. pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7265. ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7266. CMD_GR_UserSitDownEx2 * pEx = (CMD_GR_UserSitDownEx2 *)pBuffer;
  7267. CopyMemory(&(pEx->hostInfo), &(pUserSitDown->hostInfo), sizeof(CMD_GR_UserInfo));
  7268. CopyMemory(&(pEx->data), &(pUserSitDown->data), sizeof(CMD_GR_UserSitDown));
  7269. CopyMemory(&(pEx->data.TableConfig), pUserSitDown->data.TableConfig, sizeof(tagGameConfig));
  7270. pEx->cbWanFa = pUserSitDown->cbWanFa;
  7271. pEx->RoomID = pUserSitDown->RoomID;
  7272. pEx->ReduceBeans = wReduceBeans;
  7273. //返回数据
  7274. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_HOSTINFO, dwSocketID, pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7275. if (pBuffer) free(pBuffer);
  7276. pBuffer = NULL;
  7277. }
  7278. catch (...)
  7279. {
  7280. if (pBuffer) free(pBuffer);
  7281. }
  7282. return true;
  7283. }
  7284. else
  7285. {
  7286. if (UserInfo->dwBean < wReduceBeans)
  7287. {
  7288. CMD_GR_UserSitDownAck req;
  7289. ZeroMemory(&req, sizeof(req));
  7290. req.cbRet = 1;
  7291. StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!")); ///---元宝改钻石 2017-8-3
  7292. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7293. SitDownAck.set_cbret(req.cbRet);
  7294. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7295. SitDownAck.set_sztext(szText);
  7296. //发送数据
  7297. std::string pbdata = SitDownAck.SerializePartialAsString();
  7298. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7299. return true;
  7300. }
  7301. }
  7302. //俱乐部房间
  7303. if (pUserSitDown->data.tableType == 1)
  7304. {
  7305. int count = 0;
  7306. //从全局服务器上找
  7307. int flag = 1;
  7308. CWHDataLocker DataLocker(m_CriticalSection);
  7309. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it1 = m_PrivateRoomAll.begin();
  7310. while (it1 != m_PrivateRoomAll.end() && flag)
  7311. {
  7312. JN_GR_RoomListBig rooms = it1->second;
  7313. if (rooms.roomType == 1 && rooms.tmp6[0] == pUserSitDown->data.clubID)
  7314. {
  7315. //如果房间是自动开房(新老版本兼容)
  7316. if (rooms.tmp5 == 1)
  7317. {
  7318. CMD_GR_UserSitDownAck req;
  7319. ZeroMemory(&req, sizeof(req));
  7320. req.cbRet = 1;
  7321. StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈属于自动开房,不能手动创建房间"));
  7322. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7323. SitDownAck.set_cbret(req.cbRet);
  7324. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7325. SitDownAck.set_sztext(szText);
  7326. //发送数据
  7327. std::string pbdata = SitDownAck.SerializePartialAsString();
  7328. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7329. return true;
  7330. }
  7331. if (rooms.roomStatus == 0)
  7332. {
  7333. count++;
  7334. if (count == 10)
  7335. {
  7336. flag = 0;
  7337. break;
  7338. }
  7339. }
  7340. }
  7341. it1++;
  7342. }
  7343. if (count >= 10)
  7344. {
  7345. CMD_GR_UserSitDownAck req;
  7346. ZeroMemory(&req, sizeof(req));
  7347. req.cbRet = 1;
  7348. StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈还有10桌未开始,请稍后再试!"));
  7349. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7350. SitDownAck.set_cbret(req.cbRet);
  7351. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7352. SitDownAck.set_sztext(szText);
  7353. //发送数据
  7354. std::string pbdata = SitDownAck.SerializePartialAsString();
  7355. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7356. return true;
  7357. }
  7358. }
  7359. pTableFrame = CreatePrivateTable(pUserSitDown->RoomID, pConfig->wSubGameID);
  7360. if (nullptr == pTableFrame)
  7361. {
  7362. CMD_GR_UserSitDownAck req;
  7363. ZeroMemory(&req, sizeof(req));
  7364. req.cbRet = 1;
  7365. StringCchCopy(req.szText, _countof(req.szText), _T("当前游戏房间已经人满为患了,请稍后再试!"));
  7366. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7367. SitDownAck.set_cbret(req.cbRet);
  7368. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7369. SitDownAck.set_sztext(szText);
  7370. //发送数据
  7371. std::string pbdata = SitDownAck.SerializePartialAsString();
  7372. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7373. return true;
  7374. }
  7375. TCHAR szTemp[32] = { 0 };
  7376. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  7377. str = szTemp;
  7378. m_PriTableID_2_TableID[str] = pTableFrame->GetTableID();
  7379. pConfig->wHadPlayCount = pTableFrame->GetTableID();
  7380. pConfig->zmExtraRule = 1;
  7381. StringCchCat(pConfig->sPrivateTableID, 7, str.c_str());
  7382. pTableFrame->OnEventSetGameConfig((void*)pUserSitDown->data.TableConfig, wDataSize - sizeof(CMD_GR_UserSitDown), str);
  7383. pTableFrame->SetPrivateTableOwnerID(pIServerUserItem->GetUserID());
  7384. pTableFrame->SetGameConfig(*pConfig, pUserSitDown->data.WXianZhi);
  7385. //俱乐部房间和好友房间的区分
  7386. pTableFrame->SetTableKind(pUserSitDown->data.tableType);
  7387. pTableFrame->SetTableClub(pUserSitDown->data.clubID);
  7388. sPrivateTableID.jgrDate[sPrivateTableID.Num].roomType = pUserSitDown->data.tableType;
  7389. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6[0] = pUserSitDown->data.clubID;
  7390. //头像
  7391. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl), pIServerUserItem->GetUserInfo()->szHeadUrl);
  7392. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwUserID = pIServerUserItem->GetUserID();
  7393. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwServerID = m_pGameServiceOption->wServerID;
  7394. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwRoomNumber = _ttol(str.c_str());
  7395. if (pTableFrame->GetStartMode() == START_MODE_ALL_READY)
  7396. {
  7397. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = 2;
  7398. }
  7399. else
  7400. {
  7401. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = pTableFrame->GetChairCount();
  7402. }
  7403. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwDiFen = pConfig->wPlayRule;
  7404. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwJuShu = pConfig->wPlayCountRule;
  7405. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwReadyBody = 0;
  7406. sPrivateTableID.jgrDate[sPrivateTableID.Num].bWanFa = pConfig->wSubGameID;
  7407. sPrivateTableID.jgrDate[sPrivateTableID.Num].bDuoLai = pConfig->bDuoLai; //多癞子可平胡,0可以 1不可以
  7408. sPrivateTableID.jgrDate[sPrivateTableID.Num].wFengDing = pConfig->wFengDing; //封顶值
  7409. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp1 = pConfig->tmp1; //备用字段
  7410. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp2 = pConfig->tmp2; //备用字段
  7411. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp3 = pConfig->tmp3;
  7412. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName), pIServerUserItem->GetUserInfo()->szNickName);
  7413. sPrivateTableID.jgrDate[sPrivateTableID.Num].bFanGua = pConfig->wMaxScore;
  7414. sPrivateTableID.jgrDate[sPrivateTableID.Num].bRoomCreatePay = pConfig->wMaxFanRule;
  7415. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwInsert_UpData_Del = 0;
  7416. CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID);
  7417. if (pCGameServerItem)
  7418. {
  7419. //计算距离排名
  7420. int iPaiMing = 0; int iCountMax = 1;
  7421. GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  7422. std::wstring ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax);
  7423. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), ip.c_str());
  7424. sPrivateTableID.jgrDate[sPrivateTableID.Num].wPort = pCGameServerItem->m_GameServer.wServerPort;
  7425. }
  7426. //同步到中心服务器
  7427. JN_GR_RoomListBig UserChat = sPrivateTableID.jgrDate[sPrivateTableID.Num];
  7428. UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat));
  7429. sPrivateTableID.Num++;
  7430. m_UserID_2_PriTableIDGROUP[pIServerUserItem->GetUserID()] = sPrivateTableID;
  7431. ///[+++支付修正下,根据玩法人数扣(修改3人玩法的BUG)2018-1-11
  7432. WORD wChairCount = pTableFrame->GetChairCount();
  7433. if (pConfig->wMaxFanRule == 0 || pConfig->wMaxFanRule >=10)
  7434. {
  7435. ///房主支付
  7436. wReduceBeans = wBean / wChairCount * wChairCount;
  7437. //强制转换对于特定2人
  7438. if (pTableFrame->GetStartMode() == START_MODE_ALL_READY)
  7439. {
  7440. wReduceBeans = 2 * (pConfig->wPlayCountRule / 8);
  7441. }
  7442. CString strHint;
  7443. strHint.Format(L"房主支付,以前支付=%d,现在支付=%d", wBean, wReduceBeans);
  7444. CTraceService::TraceString(strHint, TraceLevel_Normal);
  7445. }
  7446. ///---]
  7447. UserInfo->dwBean = UserInfo->dwBean - wReduceBeans;
  7448. //锁定元宝
  7449. pTableFrame->LockBeans(pIServerUserItem->GetUserID(), wReduceBeans);
  7450. //加入旁观
  7451. if (pTableFrame->PerformLookonAction(pIServerUserItem))
  7452. {
  7453. pTableFrame->OnTCPNetworkSubUserCreateRoom(pIServerUserItem);
  7454. m_Data.dCreateTable++;
  7455. //进入房间旁观
  7456. CMD_GR_UserSitDownAckEx req;
  7457. ZeroMemory(&req, sizeof(req));
  7458. memset(szTemp, 0, sizeof(szTemp));
  7459. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  7460. lstrcpy(req.szPrivateTableID, szTemp);
  7461. req.cbRet = 0;
  7462. req.dijin = pConfig->wPlayRule;
  7463. req.paytype = pConfig->wMaxFanRule;
  7464. req.desktype = pUserSitDown->data.tableType;
  7465. req.playtype = pConfig->wSubGameID;
  7466. req.totalplay = pConfig->wPlayCountRule;
  7467. req.bDuoLai = pConfig->bDuoLai;
  7468. req.wFengDing = pConfig->wFengDing;
  7469. req.ipLimit = pConfig->wMaxScore;
  7470. req.playnum = pConfig->tmp1;
  7471. req.tmp3 = pConfig->tmp2;
  7472. req.isowner = 1;
  7473. req.roomId = pTableFrame->GetTableID();
  7474. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7475. std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz;
  7476. SitDownAck.set_szprivatetableid(szPrivateTableID);
  7477. SitDownAck.set_cbret(req.cbRet);
  7478. SitDownAck.set_dijin(req.dijin);
  7479. SitDownAck.set_paytype(req.paytype);
  7480. SitDownAck.set_desktype(req.desktype);
  7481. SitDownAck.set_playtype(req.playtype);
  7482. SitDownAck.set_totalplay(req.totalplay);
  7483. SitDownAck.set_bduolai(req.bDuoLai);
  7484. SitDownAck.set_wfengding(req.wFengDing);
  7485. SitDownAck.set_iplimit(req.ipLimit);
  7486. SitDownAck.set_playnum(req.playnum);
  7487. SitDownAck.set_tmp3(req.tmp3);
  7488. SitDownAck.set_isowner(req.isowner);
  7489. SitDownAck.set_roomid(req.roomId);
  7490. //发送数据
  7491. std::string pbdata = SitDownAck.SerializePartialAsString();
  7492. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7493. //用户状态
  7494. pIServerUserItem->SetClientReady(true);
  7495. pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR);
  7496. }
  7497. //俱乐部创建房间广播
  7498. if (pUserSitDown->data.tableType == 1 && pUserSitDown->data.clubID != 0)
  7499. {
  7500. CMD_GR_UserData UserData;
  7501. ZeroMemory(&UserData, sizeof(UserData));
  7502. UserData.dwClubID = pUserSitDown->data.clubID;
  7503. UserData.newsFlag = 2;
  7504. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  7505. }
  7506. return true;
  7507. }
  7508. //用户创建私有房间第二步自动创房
  7509. bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoomEx2(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  7510. {
  7511. OutputDebugStringA("自动开房OnTCPNetworkSubUserCreateRoomEx2---");
  7512. //效验参数
  7513. ASSERT(wDataSize >= sizeof(CMD_GR_UserSitDownEx));
  7514. if (wDataSize < sizeof(CMD_GR_UserSitDownEx)) return false;
  7515. //效验数据
  7516. CMD_GR_UserSitDownEx * pUserSitDown = (CMD_GR_UserSitDownEx *)pData;
  7517. tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->data.TableConfig;
  7518. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  7519. {
  7520. //新版本 血流
  7521. if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7522. {
  7523. //检验失败
  7524. return true;
  7525. }
  7526. }
  7527. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7528. {
  7529. //纸牌
  7530. if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7531. {
  7532. //检验失败
  7533. return true;
  7534. }
  7535. }
  7536. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7537. {
  7538. //戳瞎子
  7539. if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7540. {
  7541. //检验失败
  7542. return true;
  7543. }
  7544. }
  7545. else if (ptagGameConfig->wSubGameID < 3)
  7546. {
  7547. //检验房间参数
  7548. if (!CheckConfig(*(tagGameConfig*)pUserSitDown->data.TableConfig))
  7549. {
  7550. return true;
  7551. }
  7552. }
  7553. else if (ptagGameConfig->wSubGameID >= 20)
  7554. {
  7555. }
  7556. JN_GR_RoomListGroup sPrivateTableID;
  7557. ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup));
  7558. std::shared_ptr<CTableFrame> pTableFrame;
  7559. std::wstring str;
  7560. if (pUserSitDown->cbAuto == 1)
  7561. {
  7562. //查看群主创建的房间是否超过十个(全局校验)改为30
  7563. int count = 0;
  7564. CWHDataLocker DataLocker(m_CriticalSection);
  7565. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  7566. while (it != m_PrivateRoomAll.end())
  7567. {
  7568. JN_GR_RoomListBig rooms = it->second;
  7569. if (rooms.dwUserID == pUserSitDown->hostInfo.dwOwnerID)
  7570. {
  7571. count++;
  7572. }
  7573. it++;
  7574. }
  7575. if (count >= 30)
  7576. {
  7577. TCHAR szString[512] = { 0 };
  7578. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败,群主房间已满30个,俱乐部 [ ClubID=%ld ]"), pUserSitDown->data.clubID);
  7579. CTraceService::TraceString(szString, TraceLevel_Normal);
  7580. return true;
  7581. }
  7582. }
  7583. //查看群主创建的房间是否超过十个 改为30
  7584. auto iter = m_UserID_2_PriTableIDGROUP.find(pUserSitDown->hostInfo.dwOwnerID);
  7585. if (iter != m_UserID_2_PriTableIDGROUP.end())
  7586. {
  7587. sPrivateTableID = iter->second;
  7588. if (sPrivateTableID.Num > 29)
  7589. {
  7590. return true;
  7591. }
  7592. }
  7593. else
  7594. {
  7595. std::pair<DWORD, JN_GR_RoomListGroup> temp(pUserSitDown->hostInfo.dwOwnerID, sPrivateTableID);
  7596. m_UserID_2_PriTableIDGROUP.insert(temp);
  7597. }
  7598. //添加房间信息
  7599. tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown->data.TableConfig;
  7600. UINT wReduceBeans;
  7601. UINT wBean = 0;
  7602. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  7603. {
  7604. //新版本 血流
  7605. wBean = GetNeedPayEx(ptagGameConfig->wPlayCountRule);
  7606. }
  7607. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7608. {
  7609. wBean = GetNeedPayZhiP(pConfig->wPlayCountRule);
  7610. //纸牌=
  7611. }
  7612. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7613. {
  7614. //戳瞎子
  7615. wBean = GetNeedPayCxz(pConfig->wPlayCountRule);
  7616. }
  7617. else if (ptagGameConfig->wSubGameID < 3)
  7618. {
  7619. //检验房间参数
  7620. wBean = GetNeedPay(pConfig->wPlayCountRule);
  7621. }
  7622. else if (ptagGameConfig->wSubGameID >= 20)
  7623. {
  7624. wBean = GetNeedPay(pConfig->wPlayCountRule);
  7625. }
  7626. if (wBean == 0xff)
  7627. {
  7628. //校验失败
  7629. return true;
  7630. }
  7631. if (pConfig->wMaxFanRule == 0)
  7632. {
  7633. //房主支付
  7634. wReduceBeans = wBean;
  7635. //int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi;
  7636. //if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20)
  7637. //{
  7638. // //使用的是赠送的钻石,限制其房主支付
  7639. // CMD_GR_UserSitDownAck req;
  7640. // ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7641. // req.cbRet = 1;
  7642. // req.szText;
  7643. // StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。"));
  7644. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  7645. // return true;
  7646. //}
  7647. }
  7648. else if (pConfig->wMaxFanRule >= 10)
  7649. {
  7650. //群主支付
  7651. wReduceBeans = wBean;
  7652. }
  7653. else
  7654. {
  7655. if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7656. {
  7657. wReduceBeans = wBean / 3;
  7658. }
  7659. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7660. {
  7661. wReduceBeans = wBean / 3;
  7662. }
  7663. else
  7664. {
  7665. wReduceBeans = wBean / MAX_CHAIR;
  7666. }
  7667. }
  7668. if (wReduceBeans > 24)
  7669. {
  7670. //校验失败
  7671. return true;
  7672. }
  7673. //返回数据
  7674. void * pBuffer = NULL;
  7675. try
  7676. {
  7677. pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7678. ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7679. CMD_GR_UserSitDownEx2 * pEx = (CMD_GR_UserSitDownEx2 *)pBuffer;
  7680. CopyMemory(&(pEx->hostInfo), &(pUserSitDown->hostInfo), sizeof(CMD_GR_UserInfo));
  7681. CopyMemory(&(pEx->data), &(pUserSitDown->data), sizeof(CMD_GR_UserSitDown));
  7682. CopyMemory(&(pEx->data.TableConfig), pUserSitDown->data.TableConfig, sizeof(tagGameConfig));
  7683. pEx->cbAuto = 1;
  7684. pEx->cbWanFa = pUserSitDown->cbWanFa;
  7685. pEx->RoomID = pUserSitDown->RoomID;
  7686. pEx->dwUesrID = pUserSitDown->dwUserID;
  7687. pEx->ReduceBeans = wReduceBeans;
  7688. //返回数据
  7689. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_HOSTINFO, dwSocketID, pBuffer, sizeof(CMD_GR_UserSitDownEx2) + sizeof(tagGameConfig));
  7690. if (pBuffer) free(pBuffer);
  7691. pBuffer = NULL;
  7692. }
  7693. catch (...)
  7694. {
  7695. if (pBuffer) free(pBuffer);
  7696. }
  7697. return true;
  7698. }
  7699. //用户创建私有房间
  7700. bool CAttemperEngineSink::OnTCPNetworkSubUserCreateRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  7701. {
  7702. //效验参数
  7703. UserInfo::PB_CS_C_GR_UserSitDown SitDown;
  7704. SitDown.ParseFromArray(pData, wDataSize);
  7705. //处理消息
  7706. CMD_GR_UserSitDown pUserSitDown;
  7707. ZeroMemory(&pUserSitDown, sizeof(pUserSitDown));
  7708. pUserSitDown.WXianZhi = SitDown.wxianzhi();
  7709. pUserSitDown.Wsocket = SitDown.wsocket();
  7710. CString szpassword = (CA2CTEX<2048>(SitDown.szpassword().c_str(), CP_UTF8)).m_szBuffer;
  7711. _sntprintf(pUserSitDown.szPassword, CountArray(pUserSitDown.szPassword), TEXT("%s"), szpassword);
  7712. pUserSitDown.cbCreateTable = SitDown.cbcreatetable();
  7713. CString szprivatetableid = (CA2CTEX<2048>(SitDown.szprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  7714. _sntprintf(pUserSitDown.szPrivateTableID, CountArray(pUserSitDown.szPrivateTableID), TEXT("%s"), szprivatetableid);
  7715. pUserSitDown.bDuoLai = SitDown.bduolai();
  7716. pUserSitDown.wFengDing = SitDown.wfengding();
  7717. pUserSitDown.tableType = SitDown.tabletype();
  7718. pUserSitDown.clubID = SitDown.clubid();
  7719. for (WORD i = 0; i < SitDown.tableconfig_size(); i++)
  7720. {
  7721. const UserInfo::PB_CS_C_tagGameConfig & tableconfig = SitDown.tableconfig(i);
  7722. pUserSitDown.TableConfig[i].wSubGameID = SitDown.tableconfig(i).wsubgameid();
  7723. pUserSitDown.TableConfig[i].wPlayRule = SitDown.tableconfig(i).wplayrule();
  7724. pUserSitDown.TableConfig[i].wMaxFanRule = SitDown.tableconfig(i).wmaxfanrule();
  7725. pUserSitDown.TableConfig[i].wMaxScore = SitDown.tableconfig(i).wmaxscore();
  7726. pUserSitDown.TableConfig[i].wPlayCountRule = SitDown.tableconfig(i).wplaycountrule();
  7727. pUserSitDown.TableConfig[i].wHadPlayCount = SitDown.tableconfig(i).whadplaycount();
  7728. pUserSitDown.TableConfig[i].zmExtraRule = SitDown.tableconfig(i).zmextrarule();
  7729. pUserSitDown.TableConfig[i].dghRule = SitDown.tableconfig(i).dghrule();
  7730. CString sprivatetableid = (CA2CTEX<2048>(SitDown.tableconfig(i).sprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  7731. _sntprintf(pUserSitDown.TableConfig[i].sPrivateTableID, CountArray(pUserSitDown.TableConfig[i].sPrivateTableID), TEXT("%s"), sprivatetableid);
  7732. pUserSitDown.TableConfig[i].bDuoLai = SitDown.tableconfig(i).bduolai();
  7733. pUserSitDown.TableConfig[i].wFengDing = SitDown.tableconfig(i).wfengding();
  7734. pUserSitDown.TableConfig[i].tmp1 = SitDown.tableconfig(i).tmp1();
  7735. pUserSitDown.TableConfig[i].tmp2 = SitDown.tableconfig(i).tmp2();
  7736. pUserSitDown.TableConfig[i].tmp3 = SitDown.tableconfig(i).tmp3();
  7737. pUserSitDown.TableConfig[i].tmp4 = SitDown.tableconfig(i).tmp4();
  7738. pUserSitDown.TableConfig[i].tmp5 = SitDown.tableconfig(i).tmp5();
  7739. }
  7740. //效验数据
  7741. pUserSitDown.Wsocket = dwSocketID;
  7742. //获取用户
  7743. WORD wBindIndex = LOWORD(dwSocketID);
  7744. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  7745. //用户效验
  7746. if (pIServerUserItem == NULL) return false;
  7747. if (IsJC(pIServerUserItem->GetUserID()))
  7748. {
  7749. CString csTestB;
  7750. csTestB.Format(_T("创建房间 -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID());
  7751. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  7752. }
  7753. if (1 != pUserSitDown.cbCreateTable)
  7754. {
  7755. CMD_GR_UserSitDownAck req;
  7756. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7757. req.cbRet = 1;
  7758. StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误"));
  7759. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7760. SitDownAck.set_cbret(req.cbRet);
  7761. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7762. SitDownAck.set_sztext(szText);
  7763. //发送数据
  7764. std::string pbdata = SitDownAck.SerializePartialAsString();
  7765. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7766. return true;
  7767. }
  7768. if (!m_BCreate)
  7769. {
  7770. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID);
  7771. //推荐可以创建桌子的服务器
  7772. if (pCGameServerItem == NULL)
  7773. {
  7774. CMD_GR_UserSitDownAck req;
  7775. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7776. req.cbRet = 1;
  7777. StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!"));
  7778. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7779. SitDownAck.set_cbret(req.cbRet);
  7780. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7781. SitDownAck.set_sztext(szText);
  7782. //发送数据
  7783. std::string pbdata = SitDownAck.SerializePartialAsString();
  7784. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7785. return true;
  7786. }
  7787. CMD_GR_TJROOM req;
  7788. ZeroMemory(&req, sizeof(CMD_GR_TJROOM));
  7789. req.cbRet = 2;
  7790. StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr);
  7791. req.wPort = pCGameServerItem->wServerPort;
  7792. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7793. SitDownAck.set_cbret(req.cbRet);
  7794. std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz;
  7795. SitDownAck.set_sztext(szIp);
  7796. SitDownAck.set_bduolai(req.wPort);
  7797. //发送数据
  7798. std::string pbdata = SitDownAck.SerializePartialAsString();
  7799. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7800. return true;
  7801. }
  7802. BOOL bCreateHuaPai = FALSE;
  7803. tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown.TableConfig;
  7804. if (ptagGameConfig != NULL)
  7805. {
  7806. bCreateHuaPai = (3 == ptagGameConfig->wSubGameID);
  7807. }
  7808. if (!m_BCreate_Hua && bCreateHuaPai)
  7809. {
  7810. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID);
  7811. //推荐可以创建桌子的服务器
  7812. if (pCGameServerItem == NULL)
  7813. {
  7814. CMD_GR_UserSitDownAck req;
  7815. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7816. req.cbRet = 1;
  7817. StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!"));
  7818. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7819. SitDownAck.set_cbret(req.cbRet);
  7820. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7821. SitDownAck.set_sztext(szText);
  7822. //发送数据
  7823. std::string pbdata = SitDownAck.SerializePartialAsString();
  7824. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7825. return true;
  7826. }
  7827. CMD_GR_TJROOM req;
  7828. ZeroMemory(&req, sizeof(CMD_GR_TJROOM));
  7829. req.cbRet = 2;
  7830. StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr);
  7831. req.wPort = pCGameServerItem->wServerPort;
  7832. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7833. SitDownAck.set_cbret(req.cbRet);
  7834. std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz;
  7835. SitDownAck.set_sztext(szIp);
  7836. SitDownAck.set_bduolai(req.wPort);
  7837. //发送数据
  7838. std::string pbdata = SitDownAck.SerializePartialAsString();
  7839. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7840. return true;
  7841. }
  7842. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  7843. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断
  7844. {
  7845. CMD_GR_UserSitDownAck req;
  7846. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7847. req.cbRet = 1;
  7848. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!"));
  7849. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  7850. if (IsJC(1234))
  7851. {
  7852. CString csTestB;
  7853. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d"), L"OnTCPNetworkSubUserCreateRoom", pIServerUserItem->GetUserID()
  7854. , pIServerUserItem->GetUserInfo()->wTableID
  7855. , cbUserStatus);
  7856. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  7857. }
  7858. //SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0);
  7859. return true;
  7860. }
  7861. WORD wTableID = pIServerUserItem->GetTableID();
  7862. if (wTableID != INVALID_TABLE)
  7863. {
  7864. //如果还在哪桌打麻将呢,则先离开处理
  7865. auto pTableFrame = GetTableFrame(wTableID);
  7866. if (!pTableFrame)
  7867. return false;
  7868. if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  7869. }
  7870. //tagGameConfig* ptagGameConfig = (tagGameConfig*)pUserSitDown->TableConfig;
  7871. /////[+++ for test
  7872. //CString csTestB;
  7873. //csTestB.Format(_T("创建房间wSubGameID=%d"), ptagGameConfig->wSubGameID);
  7874. //CTraceService::TraceString(csTestB, TraceLevel_Normal);
  7875. /////+++]
  7876. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  7877. {
  7878. //新版本 血流
  7879. if (!CheckConfigXueLiu(*(tagGameConfig*)pUserSitDown.TableConfig))
  7880. {
  7881. CMD_GR_UserSitDownAck req;
  7882. req.cbRet = 1;
  7883. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7884. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7885. SitDownAck.set_cbret(req.cbRet);
  7886. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7887. SitDownAck.set_sztext(szText);
  7888. //发送数据
  7889. std::string pbdata = SitDownAck.SerializePartialAsString();
  7890. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7891. return true;
  7892. }
  7893. }
  7894. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  7895. {
  7896. //纸牌
  7897. if (!CheckConfigZiPai(*(tagGameConfig*)pUserSitDown.TableConfig))
  7898. {
  7899. CMD_GR_UserSitDownAck req;
  7900. req.cbRet = 1;
  7901. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7902. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7903. SitDownAck.set_cbret(req.cbRet);
  7904. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7905. SitDownAck.set_sztext(szText);
  7906. //发送数据
  7907. std::string pbdata = SitDownAck.SerializePartialAsString();
  7908. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7909. return true;
  7910. }
  7911. }
  7912. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  7913. {
  7914. //戳瞎子
  7915. if (!CheckConfigXiaZi(*(tagGameConfig*)pUserSitDown.TableConfig))
  7916. {
  7917. CMD_GR_UserSitDownAck req;
  7918. req.cbRet = 1;
  7919. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7920. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7921. SitDownAck.set_cbret(req.cbRet);
  7922. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7923. SitDownAck.set_sztext(szText);
  7924. //发送数据
  7925. std::string pbdata = SitDownAck.SerializePartialAsString();
  7926. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7927. return true;
  7928. }
  7929. }
  7930. else if (ptagGameConfig->wSubGameID < 3)
  7931. {
  7932. //一脚赖油
  7933. if (!CheckConfig(*(tagGameConfig*)pUserSitDown.TableConfig))
  7934. {
  7935. CMD_GR_UserSitDownAck req;
  7936. req.cbRet = 1;
  7937. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7938. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7939. SitDownAck.set_cbret(req.cbRet);
  7940. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7941. SitDownAck.set_sztext(szText);
  7942. //发送数据
  7943. std::string pbdata = SitDownAck.SerializePartialAsString();
  7944. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7945. return true;
  7946. }
  7947. }
  7948. else if(ptagGameConfig->wSubGameID >= 20)
  7949. {
  7950. //黄石晃晃
  7951. //if (!CheckConfig(*(tagGameConfig*)pUserSitDown->TableConfig))
  7952. //{
  7953. // CMD_GR_UserSitDownAck req;
  7954. // req.cbRet = 1;
  7955. // req.szText;
  7956. // StringCchCopy(req.szText, _countof(req.szText), _T("房间配置校验失败!"));
  7957. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  7958. // return true;
  7959. //}
  7960. }
  7961. //当前服务器桌子上限判断
  7962. DWORD wMaxTable = m_pGameServiceOption->wTableCount;
  7963. DWORD dwOnlineTableCount = m_PriTableID_2_TableID.size();
  7964. if (dwOnlineTableCount >= (wMaxTable - 1))
  7965. {
  7966. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(pIServerUserItem->GetUserInfo()->iXinYong, m_pGameServiceOption->wServerID);
  7967. //推荐可以创建桌子的服务器
  7968. if (pCGameServerItem == NULL)
  7969. {
  7970. CMD_GR_UserSitDownAck req;
  7971. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  7972. req.cbRet = 1;
  7973. StringCchCopy(req.szText, _countof(req.szText), _T("当前无可用房间服务!"));
  7974. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7975. SitDownAck.set_cbret(req.cbRet);
  7976. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  7977. SitDownAck.set_sztext(szText);
  7978. //发送数据
  7979. std::string pbdata = SitDownAck.SerializePartialAsString();
  7980. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7981. return true;
  7982. }
  7983. CMD_GR_TJROOM req;
  7984. ZeroMemory(&req, sizeof(CMD_GR_TJROOM));
  7985. req.cbRet = 2;
  7986. StringCchCopy(req.szIp, _countof(req.szIp), pCGameServerItem->szServerAddr);
  7987. req.wPort = pCGameServerItem->wServerPort;
  7988. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  7989. SitDownAck.set_cbret(req.cbRet);
  7990. std::string szIp = CW2AEX<1024>(req.szIp, CP_UTF8).m_psz;
  7991. SitDownAck.set_sztext(szIp);
  7992. SitDownAck.set_bduolai(req.wPort);
  7993. //发送数据
  7994. std::string pbdata = SitDownAck.SerializePartialAsString();
  7995. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  7996. return true;
  7997. }
  7998. JN_GR_RoomListGroup sPrivateTableID;
  7999. ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup));
  8000. std::shared_ptr<CTableFrame> pTableFrame;
  8001. std::wstring str ;
  8002. //查看自己创建的房间
  8003. auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID());
  8004. if (iter != m_UserID_2_PriTableIDGROUP.end())
  8005. {
  8006. sPrivateTableID = iter->second;
  8007. if (sPrivateTableID.Num > 29)
  8008. {
  8009. CMD_GR_UserSitDownAck req;
  8010. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  8011. req.cbRet = 1;
  8012. StringCchCopy(req.szText, _countof(req.szText), _T("最多只能创建三十个房间!"));
  8013. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8014. SitDownAck.set_cbret(req.cbRet);
  8015. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8016. SitDownAck.set_sztext(szText);
  8017. //发送数据
  8018. std::string pbdata = SitDownAck.SerializePartialAsString();
  8019. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8020. return true;
  8021. }
  8022. }
  8023. else
  8024. {
  8025. std::pair<DWORD, JN_GR_RoomListGroup> temp(pIServerUserItem->GetUserID(), sPrivateTableID);
  8026. m_UserID_2_PriTableIDGROUP.insert(temp);
  8027. }
  8028. //添加房间信息
  8029. tagGameConfig* pConfig = (tagGameConfig*)pUserSitDown.TableConfig;
  8030. UINT wReduceBeans = 0;
  8031. UINT wBean = 0;
  8032. if (ptagGameConfig->wSubGameID >= 10 && ptagGameConfig->wSubGameID < 14)
  8033. {
  8034. //新版本 血流
  8035. wBean = GetNeedPayEx(pConfig->wPlayCountRule);
  8036. }
  8037. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  8038. {
  8039. //纸牌
  8040. wBean = GetNeedPayZhiP(pConfig->wPlayCountRule);
  8041. }
  8042. else if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  8043. {
  8044. //戳瞎子
  8045. wBean = GetNeedPayCxz(pConfig->wPlayCountRule);
  8046. }
  8047. else if (ptagGameConfig->wSubGameID < 3 )
  8048. {
  8049. //检验房间参数
  8050. wBean = GetNeedPay(pConfig->wPlayCountRule);
  8051. }
  8052. else if (ptagGameConfig->wSubGameID >= 20)
  8053. {
  8054. //黄石晃晃
  8055. wBean = GetNeedPay(pConfig->wPlayCountRule);
  8056. }
  8057. if (wBean == 0xff)
  8058. {
  8059. CMD_GR_UserSitDownAck req;
  8060. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  8061. req.cbRet = 1;
  8062. StringCchCopy(req.szText, _countof(req.szText), _T("创建规则校验失败!"));
  8063. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8064. SitDownAck.set_cbret(req.cbRet);
  8065. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8066. SitDownAck.set_sztext(szText);
  8067. //发送数据
  8068. std::string pbdata = SitDownAck.SerializePartialAsString();
  8069. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8070. return true;
  8071. }
  8072. if (pConfig->wMaxFanRule == 0)
  8073. {
  8074. //房主支付
  8075. wReduceBeans = wBean;
  8076. //检测钻石来源,如果在免费区域则拒绝。
  8077. int iRet = pIServerUserItem->GetUserInfo()->GouMaiZuanShi - pIServerUserItem->GetUserInfo()->LeiJiZuanShi;
  8078. if (iRet <= 0 && pIServerUserItem->GetUserInfo()->GouMaiZuanShi < 20)
  8079. {
  8080. //使用的是赠送的钻石,限制其房主支付
  8081. CMD_GR_UserSitDownAck req;
  8082. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  8083. req.cbRet = 1;
  8084. StringCchCopy(req.szText, _countof(req.szText), _T("免费赠送钻石,不能用于房主开房。如需房主开房,请充值。"));
  8085. //CString csTestB;
  8086. //csTestB.Format(_T("免费赠送钻石,不能用于房主开房. -> GouMaiZuanShi:%d, LeiJiZuanShiID:%d,UserID=%d"), pIServerUserItem->GetUserInfo()->GouMaiZuanShi, pIServerUserItem->GetUserInfo()->LeiJiZuanShi, pIServerUserItem->GetUserID());
  8087. //CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8088. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8089. SitDownAck.set_cbret(req.cbRet);
  8090. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8091. SitDownAck.set_sztext(szText);
  8092. //发送数据
  8093. std::string pbdata = SitDownAck.SerializePartialAsString();
  8094. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8095. return true;
  8096. }
  8097. }
  8098. else if (pConfig->wMaxFanRule >= 10)
  8099. {
  8100. //俱乐部群主支付
  8101. wReduceBeans = wBean;
  8102. }
  8103. else
  8104. {
  8105. if (ptagGameConfig->wSubGameID >= 3 && ptagGameConfig->wSubGameID <= 5)
  8106. {
  8107. //戳瞎子
  8108. wReduceBeans = wBean / 3;
  8109. }
  8110. else if (ptagGameConfig->wSubGameID >= 14 && ptagGameConfig->wSubGameID <= 16)
  8111. {
  8112. //纸牌
  8113. wReduceBeans = wBean / 3;
  8114. }
  8115. else
  8116. {
  8117. wReduceBeans = wBean / MAX_CHAIR;
  8118. }
  8119. }
  8120. if (wReduceBeans > 24)
  8121. {
  8122. CMD_GR_UserSitDownAck req;
  8123. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  8124. req.cbRet = 1;
  8125. StringCchCopy(req.szText, _countof(req.szText), _T("房间配置错误,请确认后再试!"));
  8126. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8127. SitDownAck.set_cbret(req.cbRet);
  8128. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8129. SitDownAck.set_sztext(szText);
  8130. //发送数据
  8131. std::string pbdata = SitDownAck.SerializePartialAsString();
  8132. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8133. return true;
  8134. }
  8135. auto UserInfo = pIServerUserItem->GetUserInfo();
  8136. if (UserInfo->dwBean < wReduceBeans && pConfig->wMaxFanRule <10)
  8137. {
  8138. CMD_GR_UserSitDownAck req;
  8139. ZeroMemory(&req, sizeof(CMD_GR_UserSitDownAck));
  8140. req.cbRet = 1;
  8141. StringCchCopy(req.szText, _countof(req.szText), _T("钻石不足,不能创建房间!"));
  8142. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8143. SitDownAck.set_cbret(req.cbRet);
  8144. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8145. SitDownAck.set_sztext(szText);
  8146. //发送数据
  8147. std::string pbdata = SitDownAck.SerializePartialAsString();
  8148. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8149. return true;
  8150. }
  8151. void * pBuffer = NULL;
  8152. try
  8153. {
  8154. pBuffer = malloc(sizeof(CMD_GR_UserSitDown) + 2*sizeof(DWORD) + sizeof(byte)*2 + sizeof(CMD_GR_UserInfo));
  8155. ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDown) + 2 * sizeof(DWORD) + sizeof(byte)*2 + sizeof(CMD_GR_UserInfo));
  8156. CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pBuffer;
  8157. memcpy(&(pEx->data), &pUserSitDown, sizeof(CMD_GR_UserSitDown));
  8158. pEx->dwUserID = pIServerUserItem->GetUserID();
  8159. //获取私有房间随机号码
  8160. ASSERT(m_pITCPSocketService != NULL);
  8161. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pBuffer, sizeof(CMD_GR_UserSitDownEx));
  8162. if (pBuffer) free(pBuffer);
  8163. pBuffer = NULL;
  8164. }
  8165. catch (...)
  8166. {
  8167. if (pBuffer) free(pBuffer);
  8168. }
  8169. return true;
  8170. }
  8171. //戳瞎子需要多少元宝
  8172. USHORT CAttemperEngineSink::GetNeedPayCxz(WORD wPlayCountRule)
  8173. {
  8174. //USHORT uRet = 0;
  8175. CString juShuCfg;
  8176. CString payCoinCfg;
  8177. juShuCfg = m_pGameParameter->msParameter[2].juShuCfg;
  8178. payCoinCfg = m_pGameParameter->msParameter[2].payCoinCfg;
  8179. CList<int> list1;
  8180. CList<int> list2;
  8181. int pos = juShuCfg.Find(_T('#'));
  8182. int i = 0;
  8183. while (pos != -1)
  8184. {
  8185. CString field = juShuCfg.Left(pos);
  8186. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8187. list1.AddTail(iRet);
  8188. juShuCfg.ReleaseBuffer();
  8189. i++;
  8190. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  8191. pos = juShuCfg.Find(_T('#'));
  8192. }
  8193. if (juShuCfg.GetLength() > 0)
  8194. {
  8195. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8196. list1.AddTail(iRet);
  8197. juShuCfg.ReleaseBuffer();
  8198. }
  8199. pos = payCoinCfg.Find(_T('#'));
  8200. i = 0;
  8201. while (pos != -1)
  8202. {
  8203. CString field = payCoinCfg.Left(pos);
  8204. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8205. list2.AddTail(iRet);
  8206. payCoinCfg.ReleaseBuffer();
  8207. i++;
  8208. payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1);
  8209. pos = payCoinCfg.Find(_T('#'));
  8210. }
  8211. if (payCoinCfg.GetLength() > 0)
  8212. {
  8213. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8214. list2.AddTail(iRet);
  8215. payCoinCfg.ReleaseBuffer();
  8216. }
  8217. bool bFind = false;
  8218. int iNum = 0;
  8219. int iCount = list1.GetCount();
  8220. for (int var = 0; var < iCount; var++)
  8221. {
  8222. int iRet = list1.GetAt(list1.FindIndex(var));
  8223. if (iRet == wPlayCountRule)
  8224. {
  8225. bFind = true;
  8226. iNum = var;
  8227. break;
  8228. }
  8229. }
  8230. if (!bFind)
  8231. {
  8232. return 0XFF;
  8233. }
  8234. if (NULL == list2.FindIndex(iNum))
  8235. {
  8236. return 0XFF;
  8237. }
  8238. int iBao = list2.GetAt(list2.FindIndex(iNum));
  8239. return iBao;
  8240. }
  8241. //纸牌
  8242. USHORT CAttemperEngineSink::GetNeedPayZhiP(WORD wPlayCountRule)
  8243. {
  8244. //USHORT uRet = 0;
  8245. CString juShuCfg;
  8246. CString payCoinCfg;
  8247. juShuCfg = m_pGameParameter->msParameter[3].juShuCfg;
  8248. payCoinCfg = m_pGameParameter->msParameter[3].payCoinCfg;
  8249. CList<int> list1;
  8250. CList<int> list2;
  8251. int pos = juShuCfg.Find(_T('#'));
  8252. int i = 0;
  8253. while (pos != -1)
  8254. {
  8255. CString field = juShuCfg.Left(pos);
  8256. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8257. list1.AddTail(iRet);
  8258. juShuCfg.ReleaseBuffer();
  8259. i++;
  8260. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  8261. pos = juShuCfg.Find(_T('#'));
  8262. }
  8263. if (juShuCfg.GetLength() > 0)
  8264. {
  8265. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8266. list1.AddTail(iRet);
  8267. juShuCfg.ReleaseBuffer();
  8268. }
  8269. pos = payCoinCfg.Find(_T('#'));
  8270. i = 0;
  8271. while (pos != -1)
  8272. {
  8273. CString field = payCoinCfg.Left(pos);
  8274. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8275. list2.AddTail(iRet);
  8276. payCoinCfg.ReleaseBuffer();
  8277. i++;
  8278. payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1);
  8279. pos = payCoinCfg.Find(_T('#'));
  8280. }
  8281. if (payCoinCfg.GetLength() > 0)
  8282. {
  8283. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8284. list2.AddTail(iRet);
  8285. payCoinCfg.ReleaseBuffer();
  8286. }
  8287. bool bFind = false;
  8288. int iNum = 0;
  8289. int iCount = list1.GetCount();
  8290. for (int var = 0; var < iCount; var++)
  8291. {
  8292. int iRet = list1.GetAt(list1.FindIndex(var));
  8293. if (iRet == wPlayCountRule)
  8294. {
  8295. bFind = true;
  8296. iNum = var;
  8297. break;
  8298. }
  8299. }
  8300. if (!bFind)
  8301. {
  8302. return 0XFF;
  8303. }
  8304. if (NULL == list2.FindIndex(iNum))
  8305. {
  8306. return 0XFF;
  8307. }
  8308. int iBao = list2.GetAt(list2.FindIndex(iNum));
  8309. return iBao;
  8310. }
  8311. //一脚赖油此局总共需要多少元宝
  8312. USHORT CAttemperEngineSink::GetNeedPay(WORD wPlayCountRule)
  8313. {
  8314. CString juShuCfg;
  8315. CString payCoinCfg;
  8316. juShuCfg = m_pGameParameter->msParameter[0].juShuCfg;
  8317. payCoinCfg = m_pGameParameter->msParameter[0].payCoinCfg;
  8318. CList<int> list1;
  8319. CList<int> list2;
  8320. int pos = juShuCfg.Find(_T('#'));
  8321. int i = 0;
  8322. while (pos != -1)
  8323. {
  8324. CString field = juShuCfg.Left(pos);
  8325. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8326. list1.AddTail(iRet);
  8327. juShuCfg.ReleaseBuffer();
  8328. i++;
  8329. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  8330. pos = juShuCfg.Find(_T('#'));
  8331. }
  8332. if (juShuCfg.GetLength() > 0)
  8333. {
  8334. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8335. list1.AddTail(iRet);
  8336. juShuCfg.ReleaseBuffer();
  8337. }
  8338. pos = payCoinCfg.Find(_T('#'));
  8339. i = 0;
  8340. while (pos != -1)
  8341. {
  8342. CString field = payCoinCfg.Left(pos);
  8343. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8344. list2.AddTail(iRet);
  8345. payCoinCfg.ReleaseBuffer();
  8346. i++;
  8347. payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1);
  8348. pos = payCoinCfg.Find(_T('#'));
  8349. }
  8350. if (payCoinCfg.GetLength() > 0)
  8351. {
  8352. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8353. list2.AddTail(iRet);
  8354. payCoinCfg.ReleaseBuffer();
  8355. }
  8356. bool bFind = false;
  8357. int iNum = 0;
  8358. int iCount = list1.GetCount();
  8359. for (int var = 0; var < iCount; var++)
  8360. {
  8361. int iRet = list1.GetAt(list1.FindIndex(var));
  8362. if (iRet == wPlayCountRule)
  8363. {
  8364. bFind = true;
  8365. iNum = var;
  8366. break;
  8367. }
  8368. }
  8369. if (!bFind)
  8370. {
  8371. return 0XFF;
  8372. }
  8373. if (NULL == list2.FindIndex(iNum))
  8374. {
  8375. return 0XFF;
  8376. }
  8377. int iBao = list2.GetAt(list2.FindIndex(iNum));
  8378. return iBao;
  8379. }
  8380. //血流此局总共需要多少元宝
  8381. USHORT CAttemperEngineSink::GetNeedPayEx(WORD wPlayCountRule)
  8382. {
  8383. CString juShuCfg;
  8384. CString payCoinCfg;
  8385. juShuCfg = m_pGameParameter->msParameter[1].juShuCfg;
  8386. payCoinCfg = m_pGameParameter->msParameter[1].payCoinCfg;
  8387. CList<int> list1;
  8388. CList<int> list2;
  8389. int pos = juShuCfg.Find(_T('#'));
  8390. int i = 0;
  8391. while (pos != -1)
  8392. {
  8393. CString field = juShuCfg.Left(pos);
  8394. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8395. list1.AddTail(iRet);
  8396. juShuCfg.ReleaseBuffer();
  8397. i++;
  8398. juShuCfg = juShuCfg.Right(juShuCfg.GetLength() - pos - 1);
  8399. pos = juShuCfg.Find(_T('#'));
  8400. }
  8401. if (juShuCfg.GetLength() > 0)
  8402. {
  8403. int iRet = _wtoi(juShuCfg.GetBuffer(0));
  8404. list1.AddTail(iRet);
  8405. juShuCfg.ReleaseBuffer();
  8406. }
  8407. pos = payCoinCfg.Find(_T('#'));
  8408. i = 0;
  8409. while (pos != -1)
  8410. {
  8411. CString field = payCoinCfg.Left(pos);
  8412. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8413. list2.AddTail(iRet);
  8414. payCoinCfg.ReleaseBuffer();
  8415. i++;
  8416. payCoinCfg = payCoinCfg.Right(payCoinCfg.GetLength() - pos - 1);
  8417. pos = payCoinCfg.Find(_T('#'));
  8418. }
  8419. if (payCoinCfg.GetLength() > 0)
  8420. {
  8421. int iRet = _wtoi(payCoinCfg.GetBuffer(0));
  8422. list2.AddTail(iRet);
  8423. payCoinCfg.ReleaseBuffer();
  8424. }
  8425. bool bFind = false;
  8426. int iNum = 0;
  8427. int iCount = list1.GetCount();
  8428. for (int var = 0; var < iCount; var++)
  8429. {
  8430. int iRet = list1.GetAt(list1.FindIndex(var));
  8431. if (iRet == wPlayCountRule)
  8432. {
  8433. bFind = true;
  8434. iNum = var;
  8435. break;
  8436. }
  8437. }
  8438. if (!bFind)
  8439. {
  8440. return 0XFF;
  8441. }
  8442. if (NULL == list2.FindIndex(iNum))
  8443. {
  8444. return 0XFF;
  8445. }
  8446. int iBao = list2.GetAt(list2.FindIndex(iNum));
  8447. return iBao;
  8448. }
  8449. // 函数对象
  8450. class SortByLineCountFunc
  8451. {
  8452. public:
  8453. int operator()(CGameServerItem* l, CGameServerItem* r)
  8454. {
  8455. return l->m_GameServer.dwOnLineCount < r->m_GameServer.dwOnLineCount;
  8456. }
  8457. };
  8458. class SortCountFunc
  8459. {
  8460. public:
  8461. int operator()(LONGLONG l, LONGLONG r)
  8462. {
  8463. return l< r;
  8464. }
  8465. };
  8466. //获取距离排名
  8467. bool CAttemperEngineSink::GetPaiMing(DWORD dUserID, LONGLONG JuLi, int& iPaiMing, int& iCount)
  8468. {
  8469. iPaiMing = 0;
  8470. iCount = 1;
  8471. //枚举数据
  8472. m_MapUserIDJuli[dUserID] = JuLi;
  8473. std::vector<LONGLONG> vecJuLi;
  8474. DWORD dUser;
  8475. LONGLONG llJuLi;
  8476. POSITION pos = m_MapUserIDJuli.GetStartPosition();
  8477. while (pos)
  8478. {
  8479. m_MapUserIDJuli.GetNextAssoc(pos, dUser, llJuLi);
  8480. vecJuLi.push_back(llJuLi);
  8481. }
  8482. iCount = vecJuLi.size();
  8483. std::sort(vecJuLi.begin(), vecJuLi.end(), SortCountFunc());
  8484. int count = vecJuLi.size();
  8485. for (int i = 0; i < count; i++)
  8486. {
  8487. if (vecJuLi[i] == JuLi)
  8488. {
  8489. iPaiMing = i;
  8490. break;
  8491. }
  8492. }
  8493. vecJuLi.clear();
  8494. return true;
  8495. }
  8496. std::string WStringToString(const std::wstring& wstr)
  8497. {
  8498. std::string str;
  8499. int nLen = (int)wstr.length();
  8500. str.resize(nLen, ' ');
  8501. int nResult = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wstr.c_str(), nLen, (LPSTR)str.c_str(), nLen, NULL, NULL);
  8502. if (nResult == 0)
  8503. {
  8504. return "";
  8505. }
  8506. return str;
  8507. }
  8508. //获取加入私有房间信息
  8509. bool CAttemperEngineSink::OnTCPNetworkSubUserJoinRoomInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  8510. {
  8511. UserInfo::PB_CS_C_GetPrivateRoomInfo PrivateRoomInfo;
  8512. PrivateRoomInfo.ParseFromArray(pData, wDataSize);
  8513. //处理消息
  8514. CMD_GR_GetPrivateRoomInfo pUserSitDown;
  8515. ZeroMemory(&pUserSitDown, sizeof(pUserSitDown));
  8516. pUserSitDown.RoomID = PrivateRoomInfo.roomid();
  8517. //获取用户
  8518. WORD wBindIndex = LOWORD(dwSocketID);
  8519. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  8520. //用户效验
  8521. //ASSERT(pIServerUserItem != NULL);
  8522. if (pIServerUserItem == NULL) return false;
  8523. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  8524. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断
  8525. {
  8526. CMD_GR_UserSitDownAck req;
  8527. ZeroMemory(&req, sizeof(req));
  8528. req.cbRet = 1;
  8529. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能加入房间,请先结束当前游戏!"));
  8530. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8531. SitDownAck.set_cbret(req.cbRet);
  8532. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8533. SitDownAck.set_sztext(szText);
  8534. //发送数据
  8535. std::string pbdata = SitDownAck.SerializePartialAsString();
  8536. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8537. return true;
  8538. }
  8539. WORD wTableID = pIServerUserItem->GetTableID();
  8540. if (wTableID != INVALID_TABLE)
  8541. {//离开处理
  8542. auto pTableFrame = GetTableFrame(wTableID);
  8543. if (!pTableFrame)
  8544. return false;
  8545. if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  8546. }
  8547. std::shared_ptr<CTableFrame> pTableFrame;
  8548. CString csTest;
  8549. csTest.Format(_T("%d"), pUserSitDown.RoomID);
  8550. std::wstring str = csTest.GetBuffer();
  8551. csTest.ReleaseBuffer();
  8552. std::wstring ip;
  8553. int iPaiMing = 0; int iCountMax = 1;
  8554. pTableFrame = GetPriTableFrame(str);
  8555. if (pTableFrame)
  8556. {
  8557. //此房间在本服务器上
  8558. JN_GR_RoomListInfo RoomInfo;
  8559. ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo));
  8560. RoomInfo.dwDiFen = (pTableFrame->GetGameConfig()).wPlayRule;
  8561. RoomInfo.dwJuShu = (pTableFrame->GetGameConfig()).wPlayCountRule;
  8562. RoomInfo.bRoomCreatePay = (pTableFrame->GetGameConfig()).wMaxFanRule;
  8563. RoomInfo.dwRoomNumber = pUserSitDown.RoomID;
  8564. RoomInfo.dwServerID = m_pGameServiceOption->wServerID;
  8565. RoomInfo.bFanGua = (pTableFrame->GetGameConfig()).wMaxScore;
  8566. RoomInfo.bWanFa = (pTableFrame->GetGameConfig()).wSubGameID;
  8567. RoomInfo.bDuoLai = (pTableFrame->GetGameConfig()).bDuoLai; //多癞子可平胡,0可以 1不可以
  8568. RoomInfo.wFengDing = (pTableFrame->GetGameConfig()).wFengDing; //封顶值
  8569. RoomInfo.tmp1 = (pTableFrame->GetGameConfig()).tmp1; //备用字段
  8570. RoomInfo.tmp2 = (pTableFrame->GetGameConfig()).tmp2; //备用字段
  8571. // to do 判断用户版本号
  8572. TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  8573. memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  8574. del_char(szMachineID, L'.');
  8575. __int64 iMachineID = StrToNmuber(szMachineID);
  8576. //--最低要求的版本号
  8577. TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 };
  8578. memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer));
  8579. del_char(szMinClientVer, L'.');
  8580. __int64 iMinClientVer = StrToNmuber(szMinClientVer);
  8581. //if (iMachineID < iMinClientVer && (RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2))
  8582. //{
  8583. // CString str;
  8584. // str.Format(_T("请下载最新版本,才能玩双扣 UserId=%d iMachineID=%d"), pIServerUserItem->GetUserID(), iMachineID);
  8585. // CTraceService::TraceString(str, TraceLevel_Warning);
  8586. // CMD_GR_UserSitDownAck req;
  8587. // req.cbRet = 1;
  8588. // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!"));
  8589. // UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8590. // SitDownAck.set_cbret(req.cbRet);
  8591. // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8592. // SitDownAck.set_sztext(szText);
  8593. // //发送数据
  8594. // std::string pbdata = SitDownAck.SerializePartialAsString();
  8595. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8596. // return true;
  8597. //}
  8598. CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID);
  8599. if (pCGameServerItem)
  8600. {
  8601. //计算距离排名
  8602. GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  8603. ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax);
  8604. StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str());
  8605. RoomInfo.wPort = pCGameServerItem->m_GameServer.wServerPort;
  8606. }
  8607. if (ip == L"")
  8608. {
  8609. CMD_GR_UserSitDownAck req;
  8610. req.cbRet = 1;
  8611. StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!"));
  8612. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8613. SitDownAck.set_cbret(req.cbRet);
  8614. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8615. SitDownAck.set_sztext(szText);
  8616. //发送数据
  8617. std::string pbdata = SitDownAck.SerializePartialAsString();
  8618. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8619. return true;
  8620. }
  8621. IServerUserItem * pIUserItem = m_ServerUserManager.SearchUserItem(pTableFrame->GetPrivateTableOwnerID());
  8622. if (pIUserItem)
  8623. {
  8624. StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), pIUserItem->GetNickName());
  8625. }
  8626. m_Data.dAddRoom++;
  8627. if (pCGameServerItem != NULL)
  8628. {
  8629. if (IsJC(9999))
  8630. {
  8631. CString csTestB;
  8632. csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d")
  8633. , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort
  8634. , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  8635. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8636. }
  8637. }
  8638. else
  8639. {
  8640. CString csTestB;
  8641. csTestB.Format(_T("未找到游戏节点 %d"), m_pGameServiceOption->wServerID);
  8642. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8643. }
  8644. UserInfo::PB_CS_S_RoomListInfo RoomListInfo;
  8645. std::string szName = CW2AEX<1024>(RoomInfo.szName, CP_UTF8).m_psz;
  8646. std::string szIp = CW2AEX<1024>(RoomInfo.szIp, CP_UTF8).m_psz;
  8647. RoomListInfo.set_szname(szName);
  8648. RoomListInfo.set_dwserverid(RoomInfo.dwServerID);
  8649. RoomListInfo.set_szip(szIp);
  8650. RoomListInfo.set_bduolai(RoomInfo.bDuoLai);
  8651. RoomListInfo.set_wfengding(RoomInfo.wFengDing);
  8652. RoomListInfo.set_tmp1(RoomInfo.tmp1);
  8653. RoomListInfo.set_tmp2(RoomInfo.tmp2);
  8654. RoomListInfo.set_tmp3(RoomInfo.tmp3);
  8655. RoomListInfo.set_tmp4(RoomInfo.tmp4);
  8656. RoomListInfo.set_tmp5(RoomInfo.tmp5);
  8657. for (WORD i = 0; i < 4; i++)
  8658. {
  8659. RoomListInfo.add_tmp6(RoomInfo.tmp6[i]);
  8660. }
  8661. RoomListInfo.set_wport(RoomInfo.wPort);
  8662. RoomListInfo.set_dwroomnumber(RoomInfo.dwRoomNumber);
  8663. RoomListInfo.set_dwdifen(RoomInfo.dwDiFen);
  8664. RoomListInfo.set_dwjushu(RoomInfo.dwJuShu);
  8665. RoomListInfo.set_broomcreatepay(RoomInfo.bRoomCreatePay);
  8666. RoomListInfo.set_bfangua(RoomInfo.bFanGua);
  8667. RoomListInfo.set_bwanfa(RoomInfo.bWanFa);
  8668. //发送数据
  8669. std::string pbdata = RoomListInfo.SerializePartialAsString();
  8670. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GETADD_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  8671. return true;
  8672. }
  8673. //从全局服务器查找
  8674. JN_GR_RoomListBig Temp;
  8675. ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  8676. {
  8677. CWHDataLocker DataLocker(m_CriticalSection);
  8678. auto iter = m_PrivateRoomAll.find(pUserSitDown.RoomID);
  8679. if (iter == m_PrivateRoomAll.end())
  8680. {
  8681. //没找到
  8682. CMD_GR_UserSitDownAck req;
  8683. req.cbRet = 1;
  8684. StringCchCopy(req.szText, _countof(req.szText), _T("没有这个房间,请确认后再试!"));
  8685. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8686. SitDownAck.set_cbret(req.cbRet);
  8687. //std::string szPrivateTableID = CW2AEX<1024>(pUserSitDown.RoomID, CP_UTF8).m_psz;
  8688. /*std::string pRoomID = WStringToString(str);
  8689. SitDownAck.set_szprivatetableid(pRoomID);*/
  8690. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8691. SitDownAck.set_sztext(szText);
  8692. //发送数据
  8693. std::string pbdata = SitDownAck.SerializePartialAsString();
  8694. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8695. return true;
  8696. }
  8697. Temp = iter->second;
  8698. }
  8699. JN_GR_RoomListInfo RoomInfo;
  8700. ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo));
  8701. RoomInfo.dwDiFen = Temp.dwDiFen;
  8702. RoomInfo.dwJuShu = Temp.dwJuShu;
  8703. RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay;
  8704. RoomInfo.dwRoomNumber = Temp.dwRoomNumber;
  8705. RoomInfo.dwServerID = Temp.dwServerID;
  8706. RoomInfo.bFanGua = Temp.bFanGua;
  8707. RoomInfo.bWanFa = Temp.bWanFa;
  8708. RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以
  8709. RoomInfo.wFengDing = Temp.wFengDing; //封顶值
  8710. RoomInfo.tmp1 = Temp.tmp1; //备用字段
  8711. RoomInfo.tmp2 = Temp.tmp2; //备用字段
  8712. // to do 判断用户版本号
  8713. TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  8714. memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  8715. del_char(szMachineID, L'.');
  8716. __int64 iMachineID = StrToNmuber(szMachineID);
  8717. //--最低要求的版本号
  8718. TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 };
  8719. memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer));
  8720. del_char(szMinClientVer, L'.');
  8721. __int64 iMinClientVer = StrToNmuber(szMinClientVer);
  8722. //if (iMachineID < iMinClientVer && (RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2))
  8723. //{
  8724. // CString str;
  8725. // str.Format(_T("请下载最新版本,才能玩新定财神玩法 UserId=%d iMachineID=%d"), pIServerUserItem->GetUserID(), iMachineID);
  8726. // CTraceService::TraceString(str, TraceLevel_Warning);
  8727. // CMD_GR_UserSitDownAck req;
  8728. // req.cbRet = 1;
  8729. // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!"));
  8730. // UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8731. // SitDownAck.set_cbret(req.cbRet);
  8732. // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8733. // SitDownAck.set_sztext(szText);
  8734. // //发送数据
  8735. // std::string pbdata = SitDownAck.SerializePartialAsString();
  8736. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8737. // return true;
  8738. //}
  8739. StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName);
  8740. CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(Temp.dwServerID);
  8741. if (pCGameServerItem)
  8742. {
  8743. if (pIServerUserItem->GetUserInfo()->iXinYong == 1 &&
  8744. pCGameServerItem->m_GameServer.wServerLevel > 2)
  8745. {
  8746. CMD_GR_UserSitDownAck req;
  8747. req.cbRet = 1;
  8748. StringCchCopy(req.szText, _countof(req.szText), _T("此房间不可用,请自行建房."));
  8749. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8750. SitDownAck.set_cbret(req.cbRet);
  8751. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8752. SitDownAck.set_sztext(szText);
  8753. //发送数据
  8754. std::string pbdata = SitDownAck.SerializePartialAsString();
  8755. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8756. return true;
  8757. }
  8758. //计算距离排名
  8759. iPaiMing = 0; iCountMax = 1;
  8760. GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  8761. ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax);
  8762. StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str());
  8763. }
  8764. if (ip == L"")
  8765. {
  8766. CMD_GR_UserSitDownAck req;
  8767. req.cbRet = 1;
  8768. StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!"));
  8769. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8770. SitDownAck.set_cbret(req.cbRet);
  8771. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8772. SitDownAck.set_sztext(szText);
  8773. //发送数据
  8774. std::string pbdata = SitDownAck.SerializePartialAsString();
  8775. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8776. return true;
  8777. }
  8778. RoomInfo.wPort = Temp.wPort;
  8779. m_Data.dAddRoomChange++;
  8780. if (pCGameServerItem != NULL)
  8781. {
  8782. if (IsJC(9999))
  8783. {
  8784. CString csTestB;
  8785. csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d")
  8786. , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort
  8787. , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  8788. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8789. }
  8790. }
  8791. else
  8792. {
  8793. CString csTestB;
  8794. csTestB.Format(_T("未找到游戏节点 %d"), Temp.dwServerID);
  8795. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8796. }
  8797. UserInfo::PB_CS_S_RoomListInfo RoomListInfo;
  8798. std::string szName = CW2AEX<1024>(RoomInfo.szName, CP_UTF8).m_psz;
  8799. RoomListInfo.set_szname(szName);
  8800. RoomListInfo.set_dwserverid(RoomInfo.dwServerID);
  8801. std::string szIp = CW2AEX<1024>(RoomInfo.szIp, CP_UTF8).m_psz;
  8802. RoomListInfo.set_szip(szIp);
  8803. RoomListInfo.set_bduolai(RoomInfo.bDuoLai);
  8804. RoomListInfo.set_wfengding(RoomInfo.wFengDing);
  8805. RoomListInfo.set_tmp1(RoomInfo.tmp1);
  8806. RoomListInfo.set_tmp2(RoomInfo.tmp2);
  8807. RoomListInfo.set_tmp3(RoomInfo.tmp3);
  8808. RoomListInfo.set_tmp4(RoomInfo.tmp4);
  8809. RoomListInfo.set_tmp5(RoomInfo.tmp5);
  8810. for (WORD i = 0; i < 4; i++)
  8811. {
  8812. RoomListInfo.add_tmp6(RoomInfo.tmp6[i]);
  8813. }
  8814. RoomListInfo.set_wport(RoomInfo.wPort);
  8815. RoomListInfo.set_dwroomnumber(RoomInfo.dwRoomNumber);
  8816. RoomListInfo.set_dwdifen(RoomInfo.dwDiFen);
  8817. RoomListInfo.set_dwjushu(RoomInfo.dwJuShu);
  8818. RoomListInfo.set_broomcreatepay(RoomInfo.bRoomCreatePay);
  8819. RoomListInfo.set_bfangua(RoomInfo.bFanGua);
  8820. RoomListInfo.set_bwanfa(RoomInfo.bWanFa);
  8821. //发送数据
  8822. std::string pbdata = RoomListInfo.SerializePartialAsString();
  8823. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GETADD_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  8824. return true;
  8825. }
  8826. //用户加入私有房间
  8827. bool CAttemperEngineSink::OnTCPNetworkSubUserJoinRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  8828. {
  8829. //效验参数
  8830. UserInfo::PB_CS_C_GR_UserSitDown SitDown;
  8831. SitDown.ParseFromArray(pData, wDataSize);
  8832. //处理消息
  8833. CMD_GR_UserSitDown pUserSitDown;
  8834. ZeroMemory(&pUserSitDown, sizeof(pUserSitDown));
  8835. pUserSitDown.WXianZhi = SitDown.wxianzhi();
  8836. pUserSitDown.Wsocket = SitDown.wsocket();
  8837. CString szpassword = (CA2CTEX<2048>(SitDown.szpassword().c_str(), CP_UTF8)).m_szBuffer;
  8838. CopyMemory(pUserSitDown.szPassword, szpassword, sizeof(pUserSitDown.szPassword));
  8839. _sntprintf(pUserSitDown.szPassword, CountArray(pUserSitDown.szPassword), TEXT("%s"), szpassword);
  8840. pUserSitDown.cbCreateTable = SitDown.cbcreatetable();
  8841. CString szprivatetableid = (CA2CTEX<2048>(SitDown.szprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  8842. CopyMemory(pUserSitDown.szPrivateTableID, szprivatetableid, sizeof(pUserSitDown.szPrivateTableID));
  8843. pUserSitDown.bDuoLai = SitDown.bduolai();
  8844. pUserSitDown.wFengDing = SitDown.wfengding();
  8845. pUserSitDown.tableType = SitDown.tabletype();
  8846. pUserSitDown.clubID = SitDown.clubid();
  8847. for (WORD i = 0; i < SitDown.tableconfig_size(); i++)
  8848. {
  8849. if (SitDown.tableconfig(i).whadplaycount())continue;
  8850. pUserSitDown.TableConfig[i].wSubGameID = SitDown.tableconfig(i).wsubgameid();
  8851. pUserSitDown.TableConfig[i].wPlayRule = SitDown.tableconfig(i).wplayrule();
  8852. pUserSitDown.TableConfig[i].wMaxFanRule = SitDown.tableconfig(i).wmaxfanrule();
  8853. pUserSitDown.TableConfig[i].wMaxScore = SitDown.tableconfig(i).wmaxscore();
  8854. pUserSitDown.TableConfig[i].wPlayCountRule = SitDown.tableconfig(i).wplaycountrule();
  8855. pUserSitDown.TableConfig[i].wHadPlayCount = SitDown.tableconfig(i).whadplaycount();
  8856. pUserSitDown.TableConfig[i].zmExtraRule = SitDown.tableconfig(i).zmextrarule();
  8857. pUserSitDown.TableConfig[i].dghRule = SitDown.tableconfig(i).dghrule();
  8858. CString sprivatetableid = (CA2CTEX<2048>(SitDown.tableconfig(i).sprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  8859. _sntprintf(pUserSitDown.TableConfig[i].sPrivateTableID, CountArray(pUserSitDown.TableConfig[i].sPrivateTableID), TEXT("%s"), sprivatetableid);
  8860. pUserSitDown.TableConfig[i].bDuoLai = SitDown.tableconfig(i).bduolai();
  8861. pUserSitDown.TableConfig[i].wFengDing = SitDown.tableconfig(i).wfengding();
  8862. pUserSitDown.TableConfig[i].tmp1 = SitDown.tableconfig(i).tmp1();
  8863. pUserSitDown.TableConfig[i].tmp2 = SitDown.tableconfig(i).tmp2();
  8864. pUserSitDown.TableConfig[i].tmp3 = SitDown.tableconfig(i).tmp3();
  8865. pUserSitDown.TableConfig[i].tmp4 = SitDown.tableconfig(i).tmp4();
  8866. pUserSitDown.TableConfig[i].tmp5 = SitDown.tableconfig(i).tmp5();
  8867. }
  8868. //获取用户
  8869. WORD wBindIndex = LOWORD(dwSocketID);
  8870. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  8871. if (2 != pUserSitDown.cbCreateTable)
  8872. {
  8873. //SendRequestFailure(pIServerUserItem, TEXT("请求协议错误!"), 0);
  8874. CMD_GR_UserSitDownAck req;
  8875. req.cbRet = 1;
  8876. StringCchCopy(req.szText, _countof(req.szText), _T("请求协议错误!"));
  8877. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8878. SitDownAck.set_cbret(req.cbRet);
  8879. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8880. SitDownAck.set_sztext(szText);
  8881. //发送数据
  8882. std::string pbdata = SitDownAck.SerializePartialAsString();
  8883. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8884. return true;
  8885. }
  8886. //用户效验
  8887. //ASSERT(pIServerUserItem != NULL);
  8888. if (pIServerUserItem == NULL) return false;
  8889. if (!m_BAddCreate)
  8890. {
  8891. CMD_GR_UserSitDownAck req;
  8892. req.cbRet = 1;
  8893. StringCchCopy(req.szText, _countof(req.szText), _T("服务器即将维护,暂时不能加入房间!"));
  8894. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8895. SitDownAck.set_cbret(req.cbRet);
  8896. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8897. SitDownAck.set_sztext(szText);
  8898. //发送数据
  8899. std::string pbdata = SitDownAck.SerializePartialAsString();
  8900. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8901. return true;
  8902. }
  8903. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  8904. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断
  8905. {
  8906. if (pIServerUserItem->GetTableID() == INVALID_TABLE)
  8907. {
  8908. CMD_GR_UserSitDownAck req;
  8909. req.cbRet = 1;
  8910. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!"));
  8911. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8912. SitDownAck.set_cbret(req.cbRet);
  8913. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8914. SitDownAck.set_sztext(szText);
  8915. //发送数据
  8916. std::string pbdata = SitDownAck.SerializePartialAsString();
  8917. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8918. CString csTestB;
  8919. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,桌号与状态不一致"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID()
  8920. , pIServerUserItem->GetUserInfo()->wTableID
  8921. , cbUserStatus);
  8922. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  8923. }
  8924. //登录成功 断线重连
  8925. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  8926. if (pTableFrame)
  8927. {
  8928. pTableFrame->OnEventUserOnLine(pIServerUserItem);
  8929. if (IsJC(1234))
  8930. {
  8931. CString csTestB;
  8932. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,模拟断线重练。"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID()
  8933. , pIServerUserItem->GetUserInfo()->wTableID
  8934. , cbUserStatus);
  8935. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  8936. }
  8937. }
  8938. else
  8939. {
  8940. CMD_GR_UserSitDownAck req;
  8941. req.cbRet = 1;
  8942. StringCchCopy(req.szText, _countof(req.szText), _T("您正在游戏中,暂时不能离开,请先结束当前游戏!"));
  8943. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8944. SitDownAck.set_cbret(req.cbRet);
  8945. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  8946. SitDownAck.set_sztext(szText);
  8947. //发送数据
  8948. std::string pbdata = SitDownAck.SerializePartialAsString();
  8949. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  8950. CString csTestB;
  8951. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%d,状态:%d,查找桌子实体失败"), L"OnTCPNetworkSubUserJoinRoom", pIServerUserItem->GetUserID()
  8952. , pIServerUserItem->GetUserInfo()->wTableID
  8953. , cbUserStatus);
  8954. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  8955. }
  8956. return true;
  8957. }
  8958. //请求调整
  8959. //WORD wRequestTableID = pUserSitDown->wTableID;
  8960. //WORD wRequestChairID = pUserSitDown->wChairID;
  8961. WORD wTableID = pIServerUserItem->GetTableID();
  8962. if (wTableID != INVALID_TABLE)
  8963. {//离开处理
  8964. auto pTableFrame = GetTableFrame(wTableID);
  8965. if (!pTableFrame)
  8966. return false;
  8967. CString csTestB;
  8968. csTestB.Format(_T("表示玩家%d有桌子号%d信息了,又来加入旁观"), pIServerUserItem->GetUserID()
  8969. , pIServerUserItem->GetUserInfo()->wTableID);
  8970. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  8971. std::shared_ptr<CTableFrame> pTempTableFrame;
  8972. pTempTableFrame = GetPriTableFrame(pUserSitDown.szPrivateTableID);
  8973. if (pTempTableFrame == NULL)return true;
  8974. WORD wTempTableID = pTempTableFrame->GetTableID();
  8975. if (wTableID != wTempTableID)
  8976. {
  8977. CString csT;
  8978. csT.Format(_T("表示内存玩家%d有桌子索引%d桌子号%s信息了,又来加入旁观%d,%s"), pIServerUserItem->GetUserID()
  8979. , pIServerUserItem->GetUserInfo()->wTableID, pIServerUserItem->GetUserInfo()->szPrivateTableID, pTempTableFrame->GetTableID(), pUserSitDown.szPrivateTableID);
  8980. CTraceService::TraceString(csT, TraceLevel_Warning);
  8981. return false;
  8982. //if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  8983. }
  8984. else
  8985. {
  8986. return true;
  8987. }
  8988. //if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  8989. }
  8990. std::shared_ptr<CTableFrame> pTableFrame;
  8991. pTableFrame = GetPriTableFrame(pUserSitDown.szPrivateTableID);
  8992. if (!pTableFrame)
  8993. {
  8994. CMD_GR_UserSitDownAck req;
  8995. req.cbRet = 1;
  8996. StringCchCopy(req.szText, _countof(req.szText), _T("没有这个房间,请确认后再试!"));
  8997. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  8998. SitDownAck.set_cbret(req.cbRet);
  8999. std::string szPrivateTableID = CW2AEX<1024>(pUserSitDown.szPrivateTableID, CP_UTF8).m_psz;
  9000. SitDownAck.set_szprivatetableid(szPrivateTableID);
  9001. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  9002. SitDownAck.set_sztext(szText);
  9003. //发送数据
  9004. std::string pbdata = SitDownAck.SerializePartialAsString();
  9005. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  9006. OutputDebugStringA("无条件上报删除该桌子");
  9007. CWHDataLocker DataLocker(m_CriticalSection);
  9008. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  9009. while (it != m_PrivateRoomAll.end())
  9010. {
  9011. JN_GR_RoomListBig Temp = it->second;
  9012. if (Temp.dwRoomNumber == _ttol(pUserSitDown.szPrivateTableID))
  9013. {
  9014. Temp.dwInsert_UpData_Del = 2;
  9015. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  9016. break;
  9017. }
  9018. it++;
  9019. }
  9020. //SendRequestFailure(pIServerUserItem, TEXT("没有这个房间,请确认后再试!"), 0);
  9021. return true;
  9022. }
  9023. ///+++新需求:红名的玩家不能进入正常玩家开的房间,只能在自己开的房间里玩 add by 2017-12-15
  9024. if (pIServerUserItem != NULL
  9025. && pIServerUserItem->GetUserInfo() != NULL
  9026. && 1 == pIServerUserItem->GetUserInfo()->iXinYong)
  9027. {
  9028. BOOL bSelfRoom = FALSE; ///--是否为自己创建的房间
  9029. auto iter = m_UserID_2_PriTableIDGROUP.find(pIServerUserItem->GetUserID());
  9030. if (iter != m_UserID_2_PriTableIDGROUP.end())
  9031. {
  9032. JN_GR_RoomListGroup rooms = iter->second;
  9033. for (int i = 0; i < (rooms.Num > 30 ? 30 : rooms.Num); i++)
  9034. {
  9035. if (rooms.jgrDate->dwRoomNumber == _wtoi(pUserSitDown.szPrivateTableID))
  9036. {
  9037. bSelfRoom = TRUE;
  9038. break;
  9039. }
  9040. }
  9041. }
  9042. if (!bSelfRoom)
  9043. {
  9044. CMD_GR_UserSitDownAck req;
  9045. req.cbRet = 1;
  9046. StringCchCopy(req.szText, _countof(req.szText), _T("对不起,您是异常用户,只能进入自己创建的房间"));
  9047. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  9048. SitDownAck.set_cbret(req.cbRet);
  9049. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  9050. SitDownAck.set_sztext(szText);
  9051. //发送数据
  9052. std::string pbdata = SitDownAck.SerializePartialAsString();
  9053. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  9054. return true;
  9055. }
  9056. }
  9057. //俱乐部加入限制
  9058. if (pUserSitDown.tableType == 0 && pTableFrame->GetTableKind())
  9059. {
  9060. int dwClubID = (int)pTableFrame->GetTableClub();
  9061. bool bClubflag = true;
  9062. for (int k = 0; k < 20; k++) //这个20循环是什么意思
  9063. {
  9064. if (pIServerUserItem->GetUserInfo()->dwClubID[k] == dwClubID)
  9065. {
  9066. bClubflag = false;
  9067. break;
  9068. }
  9069. }
  9070. if (bClubflag)
  9071. {
  9072. CMD_GR_UserSitDownAck req;
  9073. req.cbRet = 1;
  9074. CString text = _T("对不起,您不能加入,该房间属于牌友圈:");
  9075. TCHAR tID[10];
  9076. _itow(dwClubID, tID, 10);
  9077. text.Append(tID);
  9078. StringCchCopy(req.szText, _countof(req.szText), text);
  9079. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  9080. SitDownAck.set_cbret(req.cbRet);
  9081. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  9082. SitDownAck.set_sztext(szText);
  9083. //发送数据
  9084. std::string pbdata = SitDownAck.SerializePartialAsString();
  9085. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  9086. return true;
  9087. }
  9088. }
  9089. // to do 判断用户版本号
  9090. TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  9091. memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  9092. del_char(szMachineID, L'.');
  9093. __int64 iMachineID = StrToNmuber(szMachineID);
  9094. //--最低要求的版本号
  9095. TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 };
  9096. memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer));
  9097. del_char(szMinClientVer, L'.');
  9098. __int64 iMinClientVer = StrToNmuber(szMinClientVer);
  9099. //if (iMachineID < iMinClientVer && (pTableFrame->GetGameConfig().wSubGameID == 14 || pTableFrame->GetGameConfig().tmp1 == 2))
  9100. //{
  9101. // CString str;
  9102. // str.Format(_T("请下载最新版本,才能玩百变双扣。 iMachineID=%I64u userID=%d"), iMachineID, pIServerUserItem->GetUserID());
  9103. // CTraceService::TraceString(str, TraceLevel_Warning);
  9104. // CMD_GR_UserSitDownAck req;
  9105. // req.cbRet = 1;
  9106. // StringCchCopy(req.szText, _countof(req.szText), _T("请下载最新版本,才能玩该玩法!"));
  9107. // UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  9108. // SitDownAck.set_cbret(req.cbRet);
  9109. // std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  9110. // SitDownAck.set_sztext(szText);
  9111. // //发送数据
  9112. // std::string pbdata = SitDownAck.SerializePartialAsString();
  9113. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  9114. // return true;
  9115. //}
  9116. //加入旁观
  9117. if (pTableFrame->PerformLookonAction(pIServerUserItem))
  9118. {
  9119. //进入房间旁观
  9120. CMD_GR_UserSitDownAckEx req;
  9121. TCHAR szTemp[32] = { 0 };
  9122. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  9123. lstrcpy(req.szPrivateTableID, szTemp);
  9124. req.cbRet = 0;
  9125. req.dijin = pTableFrame->GetGameConfig().wPlayRule;
  9126. req.paytype = pTableFrame->GetGameConfig().wMaxFanRule;
  9127. req.desktype = pTableFrame->GetTableKind();// pTableFrame->GetGameConfig().wSubGameID;
  9128. req.playtype = pTableFrame->GetGameConfig().wSubGameID;
  9129. req.totalplay = pTableFrame->GetGameConfig().wPlayCountRule;
  9130. req.bDuoLai = pTableFrame->GetGameConfig().bDuoLai; //多癞子可平胡,0可以 1不可以
  9131. req.wFengDing = pTableFrame->GetGameConfig().wFengDing; //封顶值
  9132. req.ipLimit = pTableFrame->GetGameConfig().wMaxScore; //备用字段
  9133. req.playnum = pTableFrame->GetGameConfig().tmp1; //备用字段
  9134. req.tmp3 = pTableFrame->GetGameConfig().tmp2; //备用字段
  9135. req.isowner = pTableFrame->GetPrivateTableOwnerID() == pIServerUserItem->GetUserID() ? 1 : 0;
  9136. req.roomId = pTableFrame->GetTableID();
  9137. pIServerUserItem->GetUserInfo()->wTableID = req.roomId; //先设置好状态再发协议给前端
  9138. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  9139. std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz;
  9140. SitDownAck.set_szprivatetableid(szPrivateTableID);
  9141. SitDownAck.set_cbret(req.cbRet);
  9142. SitDownAck.set_dijin(req.dijin);
  9143. SitDownAck.set_paytype(req.paytype);
  9144. SitDownAck.set_desktype(req.desktype);
  9145. SitDownAck.set_playtype(req.playtype);
  9146. SitDownAck.set_totalplay(req.totalplay);
  9147. SitDownAck.set_bduolai(req.bDuoLai);
  9148. SitDownAck.set_wfengding(req.wFengDing);
  9149. SitDownAck.set_iplimit(req.ipLimit);
  9150. SitDownAck.set_playnum(req.playnum);
  9151. SitDownAck.set_tmp3(req.tmp3);
  9152. SitDownAck.set_isowner(req.isowner);
  9153. SitDownAck.set_roomid(req.roomId);
  9154. //发送数据
  9155. std::string pbdata = SitDownAck.SerializePartialAsString();
  9156. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  9157. //用户状态
  9158. pIServerUserItem->SetClientReady(true);
  9159. pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR);
  9160. pTableFrame->SendUserInfoStat(pIServerUserItem);
  9161. }
  9162. return true;
  9163. }
  9164. //请求元宝
  9165. bool CAttemperEngineSink::OnTCPNetworkGetBearn(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9166. {
  9167. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkGetBearn"), TraceLevel_Debug);
  9168. //获取用户
  9169. WORD wBindIndex = LOWORD(dwSocketID);
  9170. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9171. //用户效验
  9172. ASSERT(pIServerUserItem != NULL);
  9173. if (pIServerUserItem == NULL) return false;
  9174. DWORD dUserID = pIServerUserItem->GetUserID();
  9175. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_BEAN, dwSocketID, &dUserID, sizeof(dUserID));
  9176. return true;
  9177. }
  9178. //房主请求解散
  9179. bool CAttemperEngineSink::OnTCPNetworkFangZhuJieSan(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9180. {
  9181. //获取用户
  9182. WORD wBindIndex = LOWORD(dwSocketID);
  9183. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9184. //用户效验
  9185. ASSERT(pIServerUserItem != NULL);
  9186. if (pIServerUserItem == NULL)
  9187. {
  9188. return false;
  9189. }
  9190. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  9191. if (cbUserStatus == US_FREE)//用户判断
  9192. {
  9193. SendRequestFailure(pIServerUserItem, TEXT("您未进入房间,不能解散!"), 0);
  9194. return true;
  9195. }
  9196. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  9197. if (!pTableFrame)
  9198. {
  9199. SendRequestFailure(pIServerUserItem, TEXT("当前房间不存在!"), 0);
  9200. return true;
  9201. }
  9202. //房主检验
  9203. if (pTableFrame->GetPrivateTableOwnerID() != pIServerUserItem->GetUserID())
  9204. {
  9205. SendRequestFailure(pIServerUserItem, TEXT("不是您创建的房间,无法解散!"), 0);
  9206. return true;
  9207. }
  9208. //解散 删除流程
  9209. pTableFrame->SetTableFree();
  9210. return true;
  9211. }
  9212. //请求订单编号
  9213. bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdan(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9214. {
  9215. //效验参数
  9216. ASSERT(wDataSize >= sizeof(CMD_GR_GetDingDan));
  9217. if (wDataSize < sizeof(CMD_GR_GetDingDan)) return false;
  9218. //效验数据
  9219. CMD_GR_GetDingDan * pUser = (CMD_GR_GetDingDan *)pData;
  9220. //获取用户
  9221. WORD wBindIndex = LOWORD(dwSocketID);
  9222. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9223. if (pIServerUserItem == NULL) return false;
  9224. if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0)
  9225. {
  9226. //没有UNIONID
  9227. return false;
  9228. }
  9229. GETDUILIEBASE Base;
  9230. ZeroMemory(&Base, sizeof(GETDUILIEBASE));
  9231. StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID);
  9232. Base.CommendID = 1;//请求订单编号
  9233. Base.dwSocketID = dwSocketID;
  9234. GETDUILIE Temp;
  9235. ZeroMemory(&Temp, sizeof(GETDUILIE));
  9236. Temp.dd.dProductId = pUser->dProductId;
  9237. Temp.dd.jiage = pUser->jiage;
  9238. memcpy(Temp.dd.ProductName, pUser->ProductName, sizeof(pUser->ProductName));
  9239. Temp.dd.payflag = 0;
  9240. //Temp.dd.sdkflag = 0;
  9241. //Temp.dd.tmpflag = 0;
  9242. Temp.ack.dUserID = pIServerUserItem->GetUserID();
  9243. Temp.ack.dDaiLi = pIServerUserItem->GetUserInfo()->dDaiLi;
  9244. //赋值市场测试设为300
  9245. Temp.ack.dwGameID = 305//gameID对应自己市场id;
  9246. /*pIServerUserItem->GetUserInfo()->dwGameID*/;
  9247. //添加地址
  9248. DWORD address = pIServerUserItem->GetClientAddr();
  9249. BYTE * pClientAddr = (BYTE *)&address;
  9250. _sntprintf(Temp.ack.szClientAddr, CountArray(Temp.ack.szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  9251. m_Data.dChongZhi++;
  9252. CopyMemory(Base.szBuffer, &Temp, sizeof(GETDUILIE));
  9253. CHttpClient::AddLog(dwSocketID, Base);
  9254. return true;
  9255. }
  9256. //新方式请求订单编号
  9257. bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanNew(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9258. {
  9259. UserInfo::PB_CS_C_GetDingDanNEW DingDanNEW;
  9260. DingDanNEW.ParseFromArray(pData, wDataSize);
  9261. //处理消息
  9262. CMD_GR_GetDingDanNEW pUser;
  9263. ZeroMemory(&pUser, sizeof(pUser));
  9264. pUser.dProductId = DingDanNEW.dproductid();
  9265. CString productname = (CA2CTEX<2048>(DingDanNEW.productname().c_str(), CP_UTF8)).m_szBuffer;
  9266. _sntprintf(pUser.ProductName, CountArray(pUser.ProductName), TEXT("%s"), productname);
  9267. pUser.jiage = DingDanNEW.jiage();
  9268. pUser.payflag = DingDanNEW.payflag();
  9269. //获取用户
  9270. WORD wBindIndex = LOWORD(dwSocketID);
  9271. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9272. if (pIServerUserItem == NULL) return false;
  9273. if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0)
  9274. {
  9275. //没有UNIONID
  9276. return false;
  9277. }
  9278. GETDUILIEBASE Base;
  9279. ZeroMemory(&Base, sizeof(GETDUILIEBASE));
  9280. StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID);
  9281. Base.CommendID = 1;//请求订单编号
  9282. Base.dwSocketID = dwSocketID;
  9283. GETDUILIE Temp;
  9284. ZeroMemory(&Temp, sizeof(GETDUILIE));
  9285. Temp.dd.dProductId = pUser.dProductId;
  9286. Temp.dd.jiage = pUser.jiage;
  9287. memcpy(Temp.dd.ProductName, pUser.ProductName, sizeof(pUser.ProductName));
  9288. Temp.dd.payflag = pUser.payflag;
  9289. Temp.ack.dUserID = pIServerUserItem->GetUserID();
  9290. Temp.ack.dDaiLi = pIServerUserItem->GetUserInfo()->dDaiLi;
  9291. Temp.ack.dwGameID = 305/*pIServerUserItem->GetUserInfo()->dwGameID*/;
  9292. DWORD address = pIServerUserItem->GetClientAddr();
  9293. BYTE * pClientAddr = (BYTE *)&address;
  9294. _sntprintf(Temp.ack.szClientAddr, CountArray(Temp.ack.szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  9295. m_Data.dChongZhi++;
  9296. CopyMemory(Base.szBuffer, &Temp, sizeof(GETDUILIE));
  9297. CHttpClient::AddLog(dwSocketID, Base);
  9298. return true;
  9299. }
  9300. //用户解绑代理结果回调
  9301. bool CAttemperEngineSink::OnTCPNetworkSubUserUntieAgentCallBack(CString csTest, DWORD dwSocketID)
  9302. {
  9303. ////获取用户
  9304. //WORD wBindIndex = LOWORD(dwSocketID);
  9305. //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9306. //if (pIServerUserItem == NULL) return false;
  9307. //return SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_APPLY_UNTIE_AGENT_ACK, &iRet, sizeof(int));
  9308. TCHAR* pData = NULL;
  9309. try
  9310. {
  9311. pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9312. ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9313. BYTE* pByte = (BYTE*)pData;
  9314. WORD *pTemp = (WORD*)pData;
  9315. pTemp[0] = csTest.GetLength() + 1;
  9316. CopyMemory(pByte + 2, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR));
  9317. csTest.ReleaseBuffer();
  9318. //SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9319. free((void*)pData);
  9320. pData = NULL;
  9321. int iRet = -1;
  9322. if (csTest.Find(_T("<Return>1</Return>")) != -1)
  9323. {
  9324. //成功 更新
  9325. //获取用户
  9326. WORD wBindIndex = LOWORD(dwSocketID);
  9327. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9328. if (pIServerUserItem == NULL) return true;
  9329. if (pIServerUserItem->GetUserInfo())
  9330. {
  9331. pIServerUserItem->GetUserInfo()->dDaiLi = 0;
  9332. }
  9333. iRet = 0;
  9334. }
  9335. int startIndex = csTest.Find(_T("<Text>"));
  9336. DBR_GR_UntieAgentInfo UntieAgentInfo = { 0 };
  9337. UntieAgentInfo.IRet = iRet;
  9338. CString strResult = csTest.Mid(startIndex);
  9339. int endIndex = strResult.Find(_T("</Text>"));
  9340. strResult = strResult.Mid(6, endIndex-6);
  9341. _tcscpy(UntieAgentInfo.szErrorDsc, strResult);
  9342. UserInfo::PB_CS_S_UntieAgentInfo AgentInfo;
  9343. AgentInfo.set_iret(UntieAgentInfo.IRet);
  9344. std::string szErrorDsc = CW2AEX<1024>(UntieAgentInfo.szErrorDsc, CP_UTF8).m_psz;
  9345. AgentInfo.set_szerrordsc(szErrorDsc);
  9346. //发送数据
  9347. std::string pbdata = AgentInfo.SerializePartialAsString();
  9348. return SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_APPLY_UNTIE_AGENT_ACK, (void*)pbdata.c_str(), pbdata.length());
  9349. }
  9350. catch (...)
  9351. {
  9352. if (pData)
  9353. {
  9354. free((void*)pData);
  9355. }
  9356. }
  9357. return true;
  9358. }
  9359. //获取手机验证码,写个线程去调短信接口
  9360. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckVerifCode(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9361. {
  9362. UserInfo::PB_CS_C_CheckVerifCode VerifCode;
  9363. VerifCode.ParseFromArray(pData, wDataSize);
  9364. //处理消息
  9365. CMD_GR_CheckVerifCode pUser;
  9366. ZeroMemory(&pUser, sizeof(pUser));
  9367. CString phonenum = (CA2CTEX<2048>(VerifCode.phonenum().c_str(), CP_UTF8)).m_szBuffer;
  9368. _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum);
  9369. //获取用户
  9370. WORD wBindIndex = LOWORD(dwSocketID);
  9371. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9372. if (pIServerUserItem == NULL) return false;
  9373. /*
  9374. //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484"));
  9375. DWORD dUserID = pIServerUserItem->GetUserID();
  9376. GETDUILIEBASE Temp;
  9377. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  9378. StringCchCat(Temp.szUnionID, 12, pUser->PhoneNum);
  9379. Temp.dUserID = dUserID;
  9380. Temp.CommendID = 8; //获取手机验证码(只作透传)
  9381. Temp.dwSocketID = dwSocketID;
  9382. CHttpClient::AddLog(dwSocketID, Temp);
  9383. return true;
  9384. */
  9385. CMD_GR_GetVerifCode GetVerifCode = { 0 };
  9386. StringCchCat(GetVerifCode.PhoneNum, 12, pUser.PhoneNum);
  9387. GetVerifCode.dUserID = pIServerUserItem->GetUserID();
  9388. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_VERIF_CODE, dwSocketID, &GetVerifCode, sizeof(CMD_GR_GetVerifCode));
  9389. return true;
  9390. }
  9391. //回调短信验证,表示验证通过了,落地绑定关系到数据库
  9392. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckVerifCodeCallBack(CString csIphoneNum, CString strVerfCode, DWORD dwSocketID)
  9393. {
  9394. //获取用户
  9395. WORD wBindIndex = LOWORD(dwSocketID);
  9396. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9397. if (pIServerUserItem == NULL) return false;
  9398. DWORD dUserID = pIServerUserItem->GetUserID();
  9399. if (IsJC(302))
  9400. {
  9401. CString strTip;
  9402. strTip.Format(L"**落地手机号码:%s", csIphoneNum);
  9403. CTraceService::TraceString(strTip, TraceLevel_Normal);
  9404. }
  9405. DBR_GR_GetCheckIphone pData;
  9406. memset(&pData, 0, sizeof(DBR_GR_GetCheckIphone));
  9407. //如果返回的是校验通过,数据落地,然后返回前端
  9408. pData.dwUserID = dUserID;
  9409. _sntprintf(pData.PhoneNum, 12, TEXT("%s"), csIphoneNum);
  9410. _sntprintf(pData.VerfCode, 7, TEXT("%s"), strVerfCode);
  9411. return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_IPHONE, dwSocketID, &pData, sizeof(DBR_GR_GetCheckIphone));
  9412. }
  9413. //绑定手机,前端传来验证码,写个线程去校验验证码
  9414. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckIphone(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9415. {
  9416. UserInfo::PB_CS_C_CheckIphone Iphone;
  9417. Iphone.ParseFromArray(pData, wDataSize);
  9418. //处理消息
  9419. CMD_GR_CheckVerifCode pUser;
  9420. ZeroMemory(&pUser, sizeof(pUser));
  9421. CString phonenum = (CA2CTEX<2048>(Iphone.phonenum().c_str(), CP_UTF8)).m_szBuffer;
  9422. _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum);
  9423. CString verfcode = (CA2CTEX<2048>(Iphone.verfcode().c_str(), CP_UTF8)).m_szBuffer;
  9424. _sntprintf(pUser.VerfCode, CountArray(pUser.VerfCode), TEXT("%s"), verfcode);
  9425. //获取用户
  9426. WORD wBindIndex = LOWORD(dwSocketID);
  9427. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9428. if (pIServerUserItem == NULL) return false;
  9429. //std::string strVerfCode = CW2AEX<1024>(pUser_bak->Name).m_psz;
  9430. //_sntprintf(pUser->PhoneNum, 12, TEXT("18746191484"));
  9431. //pUser->VerfCode = atoi(strVerfCode.c_str());
  9432. GETDUILIEBASE Temp;
  9433. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  9434. StringCchCat(Temp.szUnionID, 12, pUser.PhoneNum);
  9435. //Temp.dUserID = pUser->VerfCode; //用来临时作为验证码
  9436. memcpy(Temp.bb.szName, pUser.VerfCode, 6*sizeof(TCHAR));
  9437. Temp.CommendID = 9; //校验手机验证码(只作透传)
  9438. Temp.dwSocketID = dwSocketID;
  9439. CHttpClient::AddLog(dwSocketID, Temp);
  9440. return true;
  9441. }
  9442. //绑定手机查询
  9443. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckIphoneQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9444. {
  9445. //获取用户
  9446. WORD wBindIndex = LOWORD(dwSocketID);
  9447. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9448. if (pIServerUserItem == NULL) return false;
  9449. DWORD dUserID = pIServerUserItem->GetUserID();
  9450. return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_IPHONE_QUERY, dwSocketID, &dUserID, sizeof(dUserID));
  9451. }
  9452. //绑定闲聊
  9453. bool CAttemperEngineSink::OnTCPNetworkSubUserXianLiao(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9454. {
  9455. UserInfo::PB_CS_C_CheckXiaoLiao XiaoLiao;
  9456. XiaoLiao.ParseFromArray(pData, wDataSize);
  9457. //处理消息
  9458. CMD_GR_CheckXiaoLiao pUser;
  9459. ZeroMemory(&pUser, sizeof(pUser));
  9460. CString openid = (CA2CTEX<2048>(XiaoLiao.openid().c_str(), CP_UTF8)).m_szBuffer;
  9461. _sntprintf(pUser.OpenID, CountArray(pUser.OpenID), TEXT("%s"), openid);
  9462. //获取用户
  9463. WORD wBindIndex = LOWORD(dwSocketID);
  9464. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9465. if (pIServerUserItem == NULL) return false;
  9466. DBR_GR_GetCheckXianLiao XianLiao = { 0 };
  9467. XianLiao.dwUserID = pIServerUserItem->GetUserID();
  9468. lstrcpyn(XianLiao.OpenID, pUser.OpenID, CountArray(pUser.OpenID));
  9469. return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_XIANLIAO, dwSocketID, &XianLiao, sizeof(DBR_GR_GetCheckXianLiao));
  9470. }
  9471. //实名认证
  9472. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckName(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9473. {
  9474. UserInfo::PB_CS_C_CheckName Name;
  9475. Name.ParseFromArray(pData, wDataSize);
  9476. //处理消息
  9477. CMD_GR_CheckName pUser;
  9478. ZeroMemory(&pUser, sizeof(pUser));
  9479. CString name = (CA2CTEX<2048>(Name.name().c_str(), CP_UTF8)).m_szBuffer;
  9480. _sntprintf(pUser.Name, CountArray(pUser.Name), TEXT("%s"), name);
  9481. CString idcard = (CA2CTEX<2048>(Name.idcard().c_str(), CP_UTF8)).m_szBuffer;
  9482. _sntprintf(pUser.IDCard, CountArray(pUser.IDCard), TEXT("%s"), idcard);
  9483. //获取用户
  9484. WORD wBindIndex = LOWORD(dwSocketID);
  9485. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9486. if (pIServerUserItem == NULL) return false;
  9487. DWORD dUserID = pIServerUserItem->GetUserID();
  9488. CHECKNAMEINFO user;
  9489. user.nameInfo = pUser;
  9490. user.dUserID = dUserID;
  9491. return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_NAME, dwSocketID, &user, sizeof(CHECKNAMEINFO));
  9492. }
  9493. bool CAttemperEngineSink::OnTCPNetworkSubUserCheckNameQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9494. {
  9495. //获取用户
  9496. WORD wBindIndex = LOWORD(dwSocketID);
  9497. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9498. if (pIServerUserItem == NULL) return false;
  9499. DWORD dUserID = pIServerUserItem->GetUserID();
  9500. return m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_CHECK_NAME_QUERY, dwSocketID, &dUserID, sizeof(dUserID));
  9501. }
  9502. //订单编号返回应答
  9503. bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanCallBack(GETDUILIE Data, DWORD dwSocketID)
  9504. {
  9505. TCHAR* pData = NULL;
  9506. try
  9507. {
  9508. CString csTest = Data.ack.szRet;
  9509. pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9510. ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9511. BYTE* pByte = (BYTE*)pData;
  9512. WORD* pTemp = (WORD*)pData;
  9513. //pTemp[0] = csTest.GetLength() + 1;
  9514. CopyMemory(pByte, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR));
  9515. csTest.ReleaseBuffer();
  9516. m_Data.dChongZhiOK++;
  9517. CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_DINGDANACK);
  9518. string m_str = "";
  9519. m_str = cjb.string_To_UTF8(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9520. UserInfo::PB_CS_S_GetDingDanACK DingDan;
  9521. DingDan.set_ret(m_str);
  9522. //发送数据
  9523. std::string pbdata = DingDan.SerializePartialAsString();
  9524. SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_DINGDANACK, (void*)pbdata.c_str(), pbdata.length());
  9525. free((void*)pData);
  9526. pData = NULL;
  9527. }
  9528. catch (...)
  9529. {
  9530. if (pData)
  9531. {
  9532. free((void*)pData);
  9533. }
  9534. }
  9535. return true;
  9536. }
  9537. //获取购买记录
  9538. bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9539. {
  9540. //获取用户
  9541. WORD wBindIndex = LOWORD(dwSocketID);
  9542. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9543. if (pIServerUserItem == NULL) return false;
  9544. GETDUILIEBASE Temp;
  9545. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  9546. StringCchCat(Temp.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID);
  9547. Temp.CommendID = 2;//获取购买记录
  9548. Temp.dwSocketID = dwSocketID;
  9549. CHttpClient::AddLog(dwSocketID, Temp);
  9550. return true;
  9551. }
  9552. //获取购买记录返回应答
  9553. bool CAttemperEngineSink::OnTCPNetworkSubUserGetDingdanListCallBack(CString csTest, DWORD dwSocketID)
  9554. {
  9555. TCHAR* pData = NULL;
  9556. try
  9557. {
  9558. pData = (TCHAR*)malloc((csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9559. ZeroMemory(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9560. BYTE* pByte = (BYTE*)pData;
  9561. WORD* pTemp = (WORD*)pData;
  9562. pTemp[0] = csTest.GetLength() + 1;
  9563. CopyMemory(pByte + 2, csTest.GetBuffer(0), csTest.GetLength() * sizeof(TCHAR));
  9564. csTest.ReleaseBuffer();
  9565. CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_DINGDANLISTACK);
  9566. std::string str = cjb.GetInfoJson(pData, (csTest.GetLength() + 1) * sizeof(TCHAR) + sizeof(WORD));
  9567. UserInfo::PB_CS_S_DingdanList DingDanList;
  9568. DingDanList.set_ret(str);
  9569. //发送数据
  9570. std::string pbdata = DingDanList.SerializePartialAsString();
  9571. SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_DINGDANLISTACK, (void*)pbdata.c_str(), pbdata.length());
  9572. free((void*)pData);
  9573. pData = NULL;
  9574. }
  9575. catch (...)
  9576. {
  9577. if (pData)
  9578. {
  9579. free((void*)pData);
  9580. }
  9581. }
  9582. return true;
  9583. }
  9584. //绑定代理信息
  9585. bool CAttemperEngineSink::OnTCPNetworkSubUseGetDaiLiInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9586. {
  9587. //获取用户
  9588. WORD wBindIndex = LOWORD(dwSocketID);
  9589. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9590. if (pIServerUserItem == NULL) return false;
  9591. if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0)
  9592. {
  9593. //没有UNIONID
  9594. return false;
  9595. }
  9596. if (pIServerUserItem->GetUserInfo()->dDaiLi != 0)
  9597. {
  9598. CMD_GR_DaiLiInfo aa;
  9599. ZeroMemory(&aa, sizeof(CMD_GR_DaiLiInfo));
  9600. StringCbCat(aa.szName, 32, pIServerUserItem->GetUserInfo()->szName);
  9601. StringCbCat(aa.szWx, 32, pIServerUserItem->GetUserInfo()->szWx);
  9602. StringCbCat(aa.szQQ, 32, pIServerUserItem->GetUserInfo()->szQQ);
  9603. UserInfo::PB_CS_S_DaiLiInfo DaiLiInfo;
  9604. std::string szName = CW2AEX<1024>(aa.szName, CP_UTF8).m_psz;
  9605. std::string szWx = CW2AEX<1024>(aa.szWx, CP_UTF8).m_psz;
  9606. std::string szQQ = CW2AEX<1024>(aa.szQQ, CP_UTF8).m_psz;
  9607. DaiLiInfo.set_szname(szName);
  9608. DaiLiInfo.set_szwx(szWx);
  9609. DaiLiInfo.set_szqq(szQQ);
  9610. //发送数据
  9611. std::string pbdata = DaiLiInfo.SerializePartialAsString();
  9612. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_DAILI_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  9613. return true;
  9614. }
  9615. return true;
  9616. }
  9617. //绑定代理
  9618. bool CAttemperEngineSink::OnTCPNetworkSubUseBangDing(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9619. {
  9620. UserInfo::PB_CS_C_BangDing Ding;
  9621. Ding.ParseFromArray(pData, wDataSize);
  9622. //处理消息
  9623. CMD_GR_BangDing pUser;
  9624. ZeroMemory(&pUser, sizeof(pUser));
  9625. pUser.dDaiLi = Ding.ddaili();
  9626. //获取用户
  9627. WORD wBindIndex = LOWORD(dwSocketID);
  9628. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9629. if (pIServerUserItem == NULL) return false;
  9630. if (wcslen(pIServerUserItem->GetUserInfo()->szUnionID) == 0)
  9631. {
  9632. //没有UNIONID
  9633. return false;
  9634. }
  9635. if (pIServerUserItem->GetUserInfo()->dDaiLi != 0)
  9636. {
  9637. //已经绑定了代理
  9638. CMD_GR_BangDingACK Temp;
  9639. ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK));
  9640. CString csText = _T("<NewDataSet><Table1><Return>0</Return><Text>您已经绑定过了</Text><HaveSecondRet>0</HaveSecondRet><Value /></Table1></NewDataSet>");
  9641. WORD *pWord = (WORD *)&Temp;
  9642. pWord[0] = csText.GetLength() + 1;
  9643. StringCbCat(Temp.szText, 1024, csText.GetBuffer(0));
  9644. csText.ReleaseBuffer();
  9645. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, &Temp, 2 + pWord[0] * sizeof(TCHAR));
  9646. return true;
  9647. }
  9648. if (pUser.dDaiLi< 10000 || pUser.dDaiLi > 999999)
  9649. {
  9650. //代理值非法
  9651. CMD_GR_BangDingACK Temp;
  9652. ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK));
  9653. Temp.bRet = 0;
  9654. CString csText = _T("<NewDataSet><Table1><Return>0</Return><Text>输入代理编号出错</Text><HaveSecondRet>0</HaveSecondRet><Value /></Table1></NewDataSet>");
  9655. WORD *pWord = (WORD *)&Temp;
  9656. pWord[0] = csText.GetLength() + 1;
  9657. StringCbCat(Temp.szText, 1024, csText.GetBuffer(0));
  9658. csText.ReleaseBuffer();
  9659. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, &Temp, 2 + pWord[0] * sizeof(TCHAR));
  9660. return true;
  9661. }
  9662. GETDUILIEBASE Base;
  9663. ZeroMemory(&Base, sizeof(GETDUILIEBASE));
  9664. StringCchCat(Base.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID);
  9665. Base.CommendID = 3;//绑定代理
  9666. Base.dwSocketID = dwSocketID;
  9667. Base.dUserID = pIServerUserItem->GetUserID();
  9668. CopyMemory(Base.szBuffer, &pUser, sizeof(CMD_GR_BangDing));
  9669. CMD_GR_Info aa;
  9670. ZeroMemory(&aa, sizeof(CMD_GR_Info));
  9671. StringCchCat(aa.szName, 32, pIServerUserItem->GetUserInfo()->szNickName);
  9672. StringCchCat(aa.szImgHead, 256, pIServerUserItem->GetUserInfo()->szHeadUrl);
  9673. Base.bb = aa;
  9674. CHttpClient::AddLog(dwSocketID, Base);
  9675. return true;
  9676. }
  9677. //绑定代理应答
  9678. bool CAttemperEngineSink::OnTCPNetworkSubUserBangDingCallBack(CString csTest, DWORD dwSocketID, DWORD dDaiLi)
  9679. {
  9680. TCHAR* pData = NULL;
  9681. try
  9682. {
  9683. CMD_GR_BangDingACK Temp;
  9684. ZeroMemory(&Temp, sizeof(CMD_GR_BangDingACK));
  9685. Temp.bRet = 0;
  9686. if (csTest.Find(_T("<Return>1</Return>")) != -1)
  9687. {
  9688. //成功 更新
  9689. //获取用户
  9690. WORD wBindIndex = LOWORD(dwSocketID);
  9691. IServerUserItem* pIServerUserItem = GetBindUserItem(wBindIndex);
  9692. if (pIServerUserItem == NULL) return true;
  9693. if (pIServerUserItem->GetUserInfo())
  9694. {
  9695. pIServerUserItem->GetUserInfo()->dDaiLi = dDaiLi;
  9696. }
  9697. Temp.bRet = 1;
  9698. //查询更新数据库
  9699. }
  9700. WORD* pWord = (WORD*)&Temp;
  9701. pWord[0] = csTest.GetLength() + 1;
  9702. StringCbCat(Temp.szText, 1024, csTest.GetBuffer(0));
  9703. CJsonBusiness cjb(MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK);
  9704. std::string str = cjb.GetInfoJson((TCHAR*)&Temp, sizeof(CMD_GR_BangDingACK));
  9705. UserInfo::PB_CS_S_BangDing BangDing;
  9706. BangDing.set_ret(str);
  9707. //发送数据
  9708. std::string pbdata = BangDing.SerializePartialAsString();
  9709. SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_GET_BANGDINGACK, (void*)pbdata.c_str(), pbdata.length());
  9710. }
  9711. catch (...)
  9712. {
  9713. if (pData)
  9714. {
  9715. free((void*)pData);
  9716. }
  9717. }
  9718. return true;
  9719. }
  9720. //用户坐下请求
  9721. bool CAttemperEngineSink::OnTCPNetworkSubUserDown(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9722. {
  9723. UserInfo::PB_CS_C_UserSeatEx SeatEx;
  9724. SeatEx.ParseFromArray(pData, wDataSize);
  9725. //处理消息
  9726. CMD_GR_UserSeatEx pUserSitDown;
  9727. ZeroMemory(&pUserSitDown, sizeof(pUserSitDown));
  9728. pUserSitDown.seatId = SeatEx.seatid();
  9729. pUserSitDown.x = SeatEx.x();
  9730. pUserSitDown.y = SeatEx.y();
  9731. if (pUserSitDown.seatId > 3)
  9732. {
  9733. CString csTestB;
  9734. csTestB.Format(_T("坐下不合法:%d"), pUserSitDown.seatId);
  9735. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  9736. return false;
  9737. }
  9738. //获取用户
  9739. WORD wBindIndex = LOWORD(dwSocketID);
  9740. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9741. //用户效验
  9742. //ASSERT(pIServerUserItem != NULL);
  9743. if (pIServerUserItem == NULL)
  9744. {
  9745. return false;
  9746. }
  9747. pIServerUserItem->GetUserInfo()->dDingWeiX = pUserSitDown.x;
  9748. pIServerUserItem->GetUserInfo()->dDingWeiY = pUserSitDown.y;
  9749. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  9750. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)//用户判断
  9751. {
  9752. SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,不能选择座位!"), 0);
  9753. return true;
  9754. }
  9755. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  9756. if (!pTableFrame)
  9757. {
  9758. SendRequestFailure(pIServerUserItem, TEXT("当前房间不存在!"), 0);
  9759. return true;
  9760. }
  9761. if (pTableFrame->PerformSitDownAction(pUserSitDown.seatId, pIServerUserItem))
  9762. {
  9763. //更新桌子列表
  9764. JN_GR_RoomListGroup Temp;
  9765. auto iter = m_UserID_2_PriTableIDGROUP.find(pTableFrame->GetPrivateTableOwnerID());
  9766. if (iter != std::end(m_UserID_2_PriTableIDGROUP))
  9767. {
  9768. Temp = iter->second;
  9769. //判定有没有找到该房间
  9770. BOOL bFind = false;
  9771. for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++)
  9772. {
  9773. if (Temp.jgrDate[i].dwRoomNumber == _ttol(pTableFrame->GetPrivateTableID().c_str()))
  9774. {
  9775. bFind = true; break;
  9776. }
  9777. }
  9778. //没找到从全局找
  9779. if (bFind == false)
  9780. {
  9781. CWHDataLocker DataLocker(m_CriticalSection);
  9782. auto iterY = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str()));
  9783. if (iterY != m_PrivateRoomAll.end())
  9784. {
  9785. if (Temp.Num < 30)
  9786. {
  9787. Temp.jgrDate[Temp.Num] = iterY->second;
  9788. Temp.Num++;
  9789. }
  9790. }
  9791. else
  9792. {
  9793. return false;
  9794. }
  9795. }
  9796. }
  9797. else
  9798. {
  9799. //由于4点中的清除操作照成房间找不到
  9800. //从全局去找
  9801. CWHDataLocker DataLocker(m_CriticalSection);
  9802. auto aTemp = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str()));
  9803. if (aTemp != m_PrivateRoomAll.end())
  9804. {
  9805. Temp.Num = 1;
  9806. Temp.jgrDate[0] = aTemp->second;
  9807. }
  9808. else
  9809. {
  9810. return false;
  9811. }
  9812. }
  9813. int nflag = 0;//临时变量 LYH 2018-8-28
  9814. TCHAR szTemp[32] = { 0 };
  9815. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  9816. for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++)
  9817. {
  9818. if (Temp.jgrDate[i].dwRoomNumber == _ttol(szTemp))
  9819. {
  9820. nflag = 1;
  9821. /*if (2 == Temp.jgrDate[i].dwReadyBody)break;*/
  9822. Temp.jgrDate[i].dwReadyBody++;
  9823. //添加玩家信息
  9824. Temp.jgrDate[i].player[pUserSitDown.seatId].dwUserID = pIServerUserItem->GetUserID();
  9825. CopyMemory(Temp.jgrDate[i].player[pUserSitDown.seatId].szName, pIServerUserItem->GetNickName(), sizeof(Temp.jgrDate[i].player[pUserSitDown.seatId].szName));
  9826. CopyMemory(Temp.jgrDate[i].player[pUserSitDown.seatId].szHeadUrl, pIServerUserItem->GetUserInfo()->szHeadUrl, sizeof(Temp.jgrDate[i].player[pUserSitDown.seatId].szHeadUrl));
  9827. //同步到中心服务器
  9828. JN_GR_RoomListBig UserChat = Temp.jgrDate[i];
  9829. UserChat.dwInsert_UpData_Del = 1;
  9830. if (pTableFrame->GetNullChairCount() == 0 || (pTableFrame->GetNullChairCount() == 1 && pTableFrame->GetStartMode() == START_MODE_ALL_READY))
  9831. {
  9832. UserChat.roomStatus = 1;
  9833. //自动创房判定
  9834. if (pTableFrame->GetTableKind() == 1 && pTableFrame->GetTableAuto() == 1)
  9835. {
  9836. int FreeTalbe = 0;
  9837. CWHDataLocker DataLocker(m_CriticalSection);
  9838. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  9839. while (it != m_PrivateRoomAll.end())
  9840. {
  9841. JN_GR_RoomListBig TempTemp = it->second;
  9842. if (TempTemp.tmp6[0] == pTableFrame->GetTableClub() && TempTemp.roomStatus == 0 && TempTemp.dwRoomNumber != _ttol(szTemp))
  9843. {
  9844. if (UserChat.tmp4 == TempTemp.tmp4)
  9845. {
  9846. FreeTalbe++;
  9847. }
  9848. }
  9849. it++;
  9850. }
  9851. //没有找到空闲的桌子
  9852. if (FreeTalbe == 0)
  9853. {
  9854. this->OnAutoCreateRoomToDB(pTableFrame->GetTableClub(), pIServerUserItem->GetUserID(), UserChat.tmp4);
  9855. }
  9856. }
  9857. }
  9858. else
  9859. {
  9860. OutputDebugStringA("人员还没有满");
  9861. }
  9862. UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat));
  9863. //俱乐部房间变动广播
  9864. if (UserChat.tmp6[0] != 0 && UserChat.roomType == 1)
  9865. {
  9866. CMD_GR_UserData UserData;
  9867. ZeroMemory(&UserData, sizeof(UserData));
  9868. UserData.dwClubID = UserChat.tmp6[0];
  9869. UserData.newsFlag = 2;
  9870. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  9871. }
  9872. break;
  9873. }
  9874. }
  9875. if (0 == nflag)
  9876. {
  9877. CString csTestB;
  9878. csTestB.Format(_T("创建者ID=%d,该节点m_UserID_2_PriTableIDGROUP数组内未找到房间号【%s】"), pTableFrame->GetPrivateTableOwnerID(), szTemp);
  9879. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  9880. }
  9881. m_UserID_2_PriTableIDGROUP[pTableFrame->GetPrivateTableOwnerID()] = Temp;
  9882. UserInfo::PB_CS_S_UserSitAck SitAck;
  9883. SitAck.set_ret(0);
  9884. //发送数据
  9885. std::string pbdata = SitAck.SerializePartialAsString();
  9886. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_SEAT_ACK, (void*)pbdata.c_str(), pbdata.length());
  9887. }
  9888. return true;
  9889. }
  9890. //用户起立
  9891. bool CAttemperEngineSink::OnTCPNetworkSubUserStandUp(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  9892. {
  9893. UserInfo::PB_CS_C_UserStandUp StandUp;
  9894. StandUp.ParseFromArray(pData, wDataSize);
  9895. //处理消息
  9896. CMD_GR_UserStandUp pUserStandUp;
  9897. ZeroMemory(&pUserStandUp, sizeof(pUserStandUp));
  9898. pUserStandUp.wTableID = StandUp.wtableid();
  9899. pUserStandUp.wChairID = StandUp.wchairid();
  9900. pUserStandUp.cbForceLeave = StandUp.cbforceleave();
  9901. //获取用户
  9902. WORD wBindIndex = LOWORD(dwSocketID);
  9903. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  9904. //用户效验
  9905. ASSERT(pIServerUserItem != NULL);
  9906. if (pIServerUserItem == NULL) return false;
  9907. BYTE iStata = pIServerUserItem->GetUserInfo()->cbUserStatus;//原本状态
  9908. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  9909. if (!pTableFrame)
  9910. return false;
  9911. //用户判断
  9912. if ((pUserStandUp.cbForceLeave == FALSE) && (pIServerUserItem->GetUserStatus() == US_PLAYING || pIServerUserItem->GetUserStatus() == US_PLAYINGWAIT))
  9913. {
  9914. SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0);
  9915. if (IsJC(1234))
  9916. {
  9917. CString csTestB;
  9918. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserStandUp", pIServerUserItem->GetUserID()
  9919. , pIServerUserItem->GetUserInfo()->szPrivateTableID
  9920. , pIServerUserItem->GetUserStatus());
  9921. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  9922. }
  9923. return true;
  9924. }
  9925. //当这个人桌子上游戏开始了,他又不是旁观用户 就不让他走了。
  9926. if (pTableFrame->GetStartCount() >= 1 && pIServerUserItem->GetUserStatus() == US_READY)
  9927. {
  9928. SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), 0);
  9929. if (IsJC(1234))
  9930. {
  9931. CString csTestB;
  9932. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserStandUp2", pIServerUserItem->GetUserID()
  9933. , pIServerUserItem->GetUserInfo()->szPrivateTableID
  9934. , pIServerUserItem->GetUserStatus());
  9935. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  9936. }
  9937. return true;
  9938. }
  9939. //离开处理
  9940. if (pTableFrame->PerformStandUpAction(pIServerUserItem))
  9941. {
  9942. //如果是旁观状态,不用清楚。
  9943. if (iStata == US_SIT || iStata == US_READY)
  9944. {
  9945. //更新桌子列表
  9946. JN_GR_RoomListGroup Temp;
  9947. ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroup));
  9948. auto iter = m_UserID_2_PriTableIDGROUP.find(pTableFrame->GetPrivateTableOwnerID());
  9949. if (iter == std::end(m_UserID_2_PriTableIDGROUP))
  9950. {
  9951. CWHDataLocker DataLocker(m_CriticalSection);
  9952. auto iter2 = m_PrivateRoomAll.find(_ttol(pTableFrame->GetPrivateTableID().c_str()));
  9953. if (iter2 != m_PrivateRoomAll.end())
  9954. {
  9955. Temp.Num = 1;
  9956. Temp.jgrDate[0] = iter2->second;
  9957. }
  9958. else
  9959. {
  9960. return false;
  9961. }
  9962. }
  9963. else
  9964. {
  9965. Temp = iter->second;
  9966. }
  9967. for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++)
  9968. {
  9969. TCHAR szTemp[32] = { 0 };
  9970. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  9971. if (Temp.jgrDate[i].dwRoomNumber == _ttol(szTemp))
  9972. {
  9973. if (Temp.jgrDate[i].dwReadyBody > 0)
  9974. {
  9975. Temp.jgrDate[i].dwReadyBody--;
  9976. for (int j = 0; j < 4; j++)
  9977. {
  9978. if (Temp.jgrDate[i].player[j].dwUserID == pIServerUserItem->GetUserID())
  9979. {
  9980. ZeroMemory(&(Temp.jgrDate[i].player[j]), sizeof(PlayerInfo));
  9981. break;
  9982. }
  9983. }
  9984. }
  9985. //同步到中心服务器
  9986. JN_GR_RoomListBig UserChat = Temp.jgrDate[i];
  9987. UserChat.dwInsert_UpData_Del = 1;
  9988. UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat));
  9989. //俱乐部房间变动广播
  9990. if (UserChat.tmp6[0] != 0 && UserChat.roomType == 1)
  9991. {
  9992. CMD_GR_UserData UserData;
  9993. ZeroMemory(&UserData, sizeof(UserData));
  9994. UserData.dwClubID = UserChat.tmp6[0];
  9995. UserData.newsFlag = 2;
  9996. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  9997. }
  9998. }
  9999. }
  10000. m_UserID_2_PriTableIDGROUP[pTableFrame->GetPrivateTableOwnerID()] = Temp;
  10001. }
  10002. }
  10003. return true;
  10004. }
  10005. bool CAttemperEngineSink::OnTCPSocketGetUserGameScoreRecordList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10006. {
  10007. //获取用户
  10008. WORD wBindIndex = LOWORD(dwSocketID);
  10009. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10010. //用户效验
  10011. ASSERT(pIServerUserItem != NULL);
  10012. if (pIServerUserItem == NULL) return false;
  10013. UserInfo::PB_CS_C_GetUserRecordListReqNew RepulseSit;
  10014. RepulseSit.ParseFromArray(pData, wDataSize);
  10015. //处理消息
  10016. CMD_GR_GetUserRecordListReqNew pRecordList;
  10017. ZeroMemory(&pRecordList, sizeof(pRecordList));
  10018. pRecordList.dwUserID = RepulseSit.dwuserid();
  10019. pRecordList.dwKingID = RepulseSit.dwkingid();
  10020. pRecordList.wParentID = RepulseSit.wparentid();
  10021. pRecordList.wLimitIndex = RepulseSit.wlimitindex();
  10022. pRecordList.wLimitCount = RepulseSit.wlimitcount();
  10023. pRecordList.dwParentID = RepulseSit.dwparentid();
  10024. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_GET_GAME_SCORE_RECORD_LIST, dwSocketID, &pRecordList, sizeof(CMD_GR_GetUserRecordListReqNew));
  10025. return true;
  10026. }
  10027. bool CAttemperEngineSink::OnTCPSocketGetUserGameScoreRecordDetail(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10028. {
  10029. ////效验参数
  10030. //ASSERT(wDataSize == sizeof(CMD_GR_GetUserRecordDetailInfoReq));
  10031. //if (wDataSize != sizeof(CMD_GR_GetUserRecordDetailInfoReq)) return false;
  10032. ////获取用户
  10033. //WORD wBindIndex = LOWORD(dwSocketID);
  10034. //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10035. ////用户效验
  10036. //ASSERT(pIServerUserItem != NULL);
  10037. //if (pIServerUserItem == NULL) return false;
  10038. ////定义变量
  10039. //CMD_GR_GetUserRecordDetailInfoReq * pUserData = (CMD_GR_GetUserRecordDetailInfoReq *)pData;
  10040. //DBR_GR_GetUserGameScoreRecordDetail req;
  10041. //req.dwUserID = pIServerUserItem->GetUserID();
  10042. //req.dwKingID = pUserData->wKindID;
  10043. //req.wRecordID = pUserData->wRecordID;
  10044. //m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_GET_GAME_SCORE_RECORD_DETAIL, dwSocketID, &req, sizeof(req));
  10045. return true;
  10046. }
  10047. bool CAttemperEngineSink::OnTCPSocketGetUserGameReplayRecord(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10048. {
  10049. //获取用户
  10050. WORD wBindIndex = LOWORD(dwSocketID);
  10051. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10052. //用户效验
  10053. ASSERT(pIServerUserItem != NULL);
  10054. if (pIServerUserItem == NULL) return false;
  10055. //定义变量
  10056. UserInfo::PB_CS_C_GR_ReplayRecordReq RecordReq;
  10057. RecordReq.ParseFromArray(pData, wDataSize);
  10058. //处理消息
  10059. CMD_GR_ReplayRecordReq req;
  10060. ZeroMemory(&req, sizeof(req));
  10061. req.dwRecordID = RecordReq.dwrecordid();
  10062. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_GAME_SCORE_RECORD_REPLAY, dwSocketID, &req, sizeof(CMD_GR_ReplayRecordReq));
  10063. return true;
  10064. }
  10065. //获取临时积分排行榜
  10066. bool CAttemperEngineSink::OnTCPSocketGetUserGameTempScoreRankList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10067. {
  10068. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPSocketGetUserGameTempScoreRankList"), TraceLevel_Debug);
  10069. //获取用户
  10070. WORD wBindIndex = LOWORD(dwSocketID);
  10071. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10072. //用户效验
  10073. ASSERT(pIServerUserItem != NULL);
  10074. if (pIServerUserItem == NULL) return false;
  10075. auto now = time(0);
  10076. if (now - m_lastRankListTime < 300 && m_pRankListData && m_pRankListDataSize > 0)
  10077. {
  10078. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST_RESULT, m_pRankListData, m_pRankListDataSize);
  10079. return true;
  10080. }
  10081. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_GET_GAME_TEMP_SCORE_RANKLIST, dwSocketID, 0, 0);
  10082. return true;
  10083. }
  10084. //更新某人拥有的房间状态值
  10085. bool CAttemperEngineSink::UpdataBodyOwnRoom(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
  10086. {
  10087. CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataMyOwnRoom"), TraceLevel_Debug);
  10088. //变量定义
  10089. JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData;
  10090. //效验参数
  10091. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  10092. //效验参数
  10093. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  10094. //用户效验
  10095. ASSERT(pIServerUserItem != NULL);
  10096. if (pIServerUserItem == NULL) return false;
  10097. UserInfo::PB_CS_S_RoomList RoomList;
  10098. RoomList.set_dwuserid(pUserChat->dwUserID);
  10099. RoomList.set_dwserverid(pUserChat->dwServerID);
  10100. RoomList.set_dwroomnumber(pUserChat->dwRoomNumber);
  10101. RoomList.set_dwinsert_updata_del(pUserChat->dwInsert_UpData_Del);
  10102. RoomList.set_dwdifen(pUserChat->dwDiFen);
  10103. RoomList.set_dwjushu(pUserChat->dwJuShu);
  10104. RoomList.set_dwreadybody(pUserChat->dwReadyBody);
  10105. RoomList.set_dwbody(pUserChat->dwBody);
  10106. RoomList.set_bwanfa(pUserChat->bWanFa);
  10107. std::string szIp = CW2AEX<1024>(pUserChat->szIp, CP_UTF8).m_psz;
  10108. RoomList.set_szip(szIp);
  10109. RoomList.set_bduolai(pUserChat->bDuoLai);
  10110. RoomList.set_wfengding(pUserChat->wFengDing);
  10111. RoomList.set_tmp1(pUserChat->bRoomCreatePay);
  10112. RoomList.set_tmp2(pUserChat->tmp1);
  10113. RoomList.set_tmp3(pUserChat->tmp2);
  10114. RoomList.set_tmp4(pUserChat->tmp4);
  10115. RoomList.set_tmp5(pUserChat->tmp5);
  10116. for (WORD i = 0; i < 4; i++)
  10117. {
  10118. RoomList.add_tmp6(pUserChat->tmp6[i]);
  10119. }
  10120. RoomList.set_wport(pUserChat->wPort);
  10121. //发送数据
  10122. std::string pbdata = RoomList.SerializePartialAsString();
  10123. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_MYROOM_UPDATA, (void*)pbdata.c_str(), pbdata.length());
  10124. return true;
  10125. }
  10126. bool CAttemperEngineSink::UpdataServerStata(VOID * pData, WORD wDataSize)
  10127. {
  10128. //变量定义
  10129. JN_GR_SERVICESTAT * pUserChat = (JN_GR_SERVICESTAT *)pData;
  10130. //效验参数
  10131. ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT));
  10132. //效验参数
  10133. if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false;
  10134. m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_UPDATASERVICE, pUserChat, wDataSize/*,0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  10135. return true;
  10136. }
  10137. bool CAttemperEngineSink::UpdataBodyOwnRoomToServer(VOID * pData, WORD wDataSize)
  10138. {
  10139. //变量定义
  10140. JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData;
  10141. //效验参数
  10142. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  10143. //效验参数
  10144. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  10145. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOM, pUserChat, wDataSize);
  10146. return true;
  10147. }
  10148. //发送某人的房间的状态
  10149. bool CAttemperEngineSink::OnUpdataBodyOwnRoom(VOID * pData, WORD wDataSize)
  10150. {
  10151. JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData;
  10152. //效验参数
  10153. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  10154. //效验参数
  10155. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  10156. DWORD dwUserID = pUserChat->dwUserID;
  10157. //找到他的连接
  10158. IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(dwUserID);
  10159. if (pIServerUserItem != NULL)
  10160. {
  10161. UpdataBodyOwnRoom(pIServerUserItem, pData, wDataSize);
  10162. return true;
  10163. }
  10164. return true;
  10165. }
  10166. //发送某人的房间的状态
  10167. bool CAttemperEngineSink::OnUpdataBodyOtherRoom(VOID * pData, WORD wDataSize)
  10168. {
  10169. JN_GR_RoomListBig * pUserChat = (JN_GR_RoomListBig *)pData;
  10170. //效验参数
  10171. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  10172. //效验参数
  10173. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  10174. if (pUserChat->dwInsert_UpData_Del == 0)
  10175. {
  10176. CWHDataLocker DataLocker(m_CriticalSection);
  10177. m_PrivateRoomAll[pUserChat->dwRoomNumber] = *pUserChat;
  10178. }
  10179. else if (pUserChat->dwInsert_UpData_Del == 2)
  10180. {
  10181. CWHDataLocker DataLocker(m_CriticalSection);
  10182. auto iter = m_PrivateRoomAll.find(pUserChat->dwRoomNumber);
  10183. if (iter != m_PrivateRoomAll.end())
  10184. {
  10185. m_PrivateRoomAll.erase(iter);
  10186. }
  10187. }
  10188. else if ((pUserChat->dwInsert_UpData_Del == 1))
  10189. {
  10190. CWHDataLocker DataLocker(m_CriticalSection);
  10191. auto iter = m_PrivateRoomAll.find(pUserChat->dwRoomNumber);
  10192. if (iter != m_PrivateRoomAll.end())
  10193. {
  10194. m_PrivateRoomAll[pUserChat->dwRoomNumber] = *pUserChat;
  10195. }
  10196. //删除俱乐部更新房间类型
  10197. if (0 == pUserChat->tmp6[0])
  10198. {
  10199. CString PrivateTableID;
  10200. PrivateTableID.Format(_T("%d"), pUserChat->dwRoomNumber);
  10201. std::shared_ptr<CTableFrame> pTableFrame = GetPriTableFrame(PrivateTableID.GetBuffer(0));
  10202. if (pTableFrame)pTableFrame->SetTableKind(pUserChat->roomType);
  10203. }
  10204. }
  10205. //广播给当前服务器中该俱乐部玩家
  10206. if (pUserChat->roomType == 1 && pUserChat->tmp6[0])
  10207. {
  10208. CMD_GR_Table_Notify tableNotify;
  10209. ZeroMemory(&tableNotify, sizeof(tableNotify));
  10210. tableNotify.type = pUserChat->dwInsert_UpData_Del;
  10211. tableNotify.tableID = pUserChat->dwRoomNumber;
  10212. tableNotify.clubID = pUserChat->tmp6[0];
  10213. //遍历查找
  10214. WORD wUserIndex = 0;
  10215. while (true)
  10216. {
  10217. IServerUserItem* pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  10218. if (pIServerUserItemSend == NULL) break;
  10219. for (int i = 0; i < 20; i++)
  10220. {
  10221. if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == pUserChat->tmp6[0])
  10222. {
  10223. tagBindParameter * pBindParameter = GetBindParameter(pIServerUserItemSend->GetBindIndex());
  10224. //发送数据
  10225. if (pBindParameter != NULL)
  10226. {
  10227. Club::PB_CS_S_Table_Notify Notify;
  10228. Notify.set_clubid(tableNotify.clubID);
  10229. Notify.set_tableid(tableNotify.tableID);
  10230. Notify.set_type(tableNotify.type);
  10231. //发送数据
  10232. std::string pbdata = Notify.SerializePartialAsString();
  10233. m_pITCPNetworkEngine->SendData(pBindParameter->dwSocketID, MDM_GR_CLUB, SUB_GR_USER_CLUBTABLE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length());
  10234. break;
  10235. }
  10236. }
  10237. }
  10238. }
  10239. }
  10240. return true;
  10241. }
  10242. //更新我拥有的房间状态值
  10243. bool CAttemperEngineSink::UpdataMyOwnRoom(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
  10244. {
  10245. CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataMyOwnRoom"), TraceLevel_Debug);
  10246. //变量定义
  10247. JN_GR_RoomList * pUserChat = (JN_GR_RoomList *)pData;
  10248. //效验参数
  10249. ASSERT(wDataSize == sizeof(JN_GR_RoomList));
  10250. //效验参数
  10251. if (wDataSize != sizeof(JN_GR_RoomList)) return false;
  10252. //用户效验
  10253. ASSERT(pIServerUserItem != NULL);
  10254. if (pIServerUserItem == NULL) return false;
  10255. UserInfo::PB_CS_S_RoomList RoomList;
  10256. RoomList.set_dwuserid(pUserChat->dwUserID);
  10257. RoomList.set_dwserverid(pUserChat->dwServerID);
  10258. RoomList.set_dwroomnumber(pUserChat->dwRoomNumber);
  10259. RoomList.set_dwinsert_updata_del(pUserChat->dwInsert_UpData_Del);
  10260. RoomList.set_dwdifen(pUserChat->dwDiFen);
  10261. RoomList.set_dwjushu(pUserChat->dwJuShu);
  10262. RoomList.set_dwreadybody(pUserChat->dwReadyBody);
  10263. RoomList.set_dwbody(pUserChat->dwBody);
  10264. RoomList.set_bwanfa(pUserChat->bWanFa);
  10265. std::string szIp = CW2AEX<1024>(pUserChat->szIp, CP_UTF8).m_psz;
  10266. RoomList.set_szip(szIp);
  10267. RoomList.set_bduolai(pUserChat->bDuoLai);
  10268. RoomList.set_wfengding(pUserChat->wFengDing);
  10269. RoomList.set_tmp1(pUserChat->tmp1);
  10270. RoomList.set_tmp2(pUserChat->tmp2);
  10271. RoomList.set_tmp3(pUserChat->tmp3);
  10272. RoomList.set_tmp4(pUserChat->tmp4);
  10273. RoomList.set_tmp5(pUserChat->tmp5);
  10274. for (WORD i = 0; i < 4; i++)
  10275. {
  10276. RoomList.add_tmp6(pUserChat->tmp6[i]);
  10277. }
  10278. RoomList.set_wport(pUserChat->wPort);
  10279. //发送数据
  10280. std::string pbdata = RoomList.SerializePartialAsString();
  10281. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_MYROOM_UPDATA, (void*)pbdata.c_str(), pbdata.length());
  10282. return true;
  10283. }
  10284. //更新房间局数
  10285. bool CAttemperEngineSink::UpdataTableJushu(DWORD PrivateTableID,DWORD CurrrentJushu)
  10286. {
  10287. CTraceService::TraceString(TEXT("CAttemperEngineSink::UpdataTableJushu"), TraceLevel_Debug);
  10288. CWHDataLocker DataLocker(m_CriticalSection);
  10289. auto iter = m_PrivateRoomAll.find(PrivateTableID);
  10290. if (iter != m_PrivateRoomAll.end())
  10291. {
  10292. JN_GR_RoomListBig temp;
  10293. temp = iter->second;
  10294. if (temp.tmp6[0] != 0 && temp.roomType == 1)
  10295. {
  10296. temp.dwInsert_UpData_Del = 1;
  10297. temp.currentjushu = CurrrentJushu;
  10298. //上报给协调
  10299. UpdataBodyOwnRoomToServer(&temp, sizeof(temp));
  10300. //通知用户刷新界面
  10301. CMD_GR_UserData UserData;
  10302. ZeroMemory(&UserData, sizeof(UserData));
  10303. UserData.dwClubID = temp.tmp6[0];
  10304. UserData.newsFlag = 2;
  10305. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  10306. }
  10307. }
  10308. return true;
  10309. }
  10310. //用户聊天
  10311. bool CAttemperEngineSink::OnTCPNetworkSubUserChat(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10312. {
  10313. //变量定义
  10314. CMD_GR_C_UserChat * pUserChat = (CMD_GR_C_UserChat *)pData;
  10315. //效验参数
  10316. ASSERT(wDataSize <= sizeof(CMD_GR_C_UserChat));
  10317. ASSERT(wDataSize >= (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString)));
  10318. ASSERT(wDataSize == (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength * sizeof(pUserChat->szChatString[0])));
  10319. //效验参数
  10320. if (wDataSize > sizeof(CMD_GR_C_UserChat)) return false;
  10321. if (wDataSize < (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString))) return false;
  10322. if (wDataSize != (sizeof(CMD_GR_C_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength * sizeof(pUserChat->szChatString[0]))) return false;
  10323. //获取用户
  10324. WORD wBindIndex = LOWORD(dwSocketID);
  10325. IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex);
  10326. //用户效验
  10327. ASSERT(pISendUserItem != NULL);
  10328. if (pISendUserItem == NULL) return false;
  10329. if (pUserChat->dwTargetUserID != 0)
  10330. {
  10331. IServerUserItem* pIRecvUserItem = m_ServerUserManager.SearchUserItem(pUserChat->dwTargetUserID);
  10332. if (pIRecvUserItem == NULL) return true;
  10333. }
  10334. //状态判断
  10335. if ((CServerRule::IsForfendRoomChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10336. {
  10337. SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户大厅聊天!"), 0);
  10338. return true;
  10339. }
  10340. //权限判断
  10341. if (CUserRight::CanRoomChat(pISendUserItem->GetUserRight()) == false)
  10342. {
  10343. //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT);
  10344. SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), 0);
  10345. return true;
  10346. }
  10347. //权限判断
  10348. if (pUserChat->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 ||
  10349. CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false))
  10350. {
  10351. return false;
  10352. }
  10353. //构造消息
  10354. CMD_GR_S_UserChat UserChat;
  10355. ZeroMemory(&UserChat, sizeof(UserChat));
  10356. //字符过滤
  10357. SensitiveWordFilter(pUserChat->szChatString, UserChat.szChatString, CountArray(UserChat.szChatString));
  10358. //构造数据
  10359. UserChat.dwChatColor = pUserChat->dwChatColor;
  10360. UserChat.wChatLength = pUserChat->wChatLength;
  10361. UserChat.dwSendUserID = pUserChat->dwSendUserID;
  10362. UserChat.dwTargetUserID = pUserChat->dwTargetUserID;
  10363. UserChat.wChatLength = CountStringBuffer(UserChat.szChatString);
  10364. //转发消息
  10365. WORD wHeadSize = sizeof(UserChat) - sizeof(UserChat.szChatString);
  10366. SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_CHAT, &UserChat, wHeadSize + UserChat.wChatLength * sizeof(UserChat.szChatString[0]));
  10367. return true;
  10368. }
  10369. //用户表情
  10370. bool CAttemperEngineSink::OnTCPNetworkSubUserExpression(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10371. {
  10372. //效验参数
  10373. ASSERT(wDataSize == sizeof(CMD_GR_C_UserExpression));
  10374. if (wDataSize != sizeof(CMD_GR_C_UserExpression)) return false;
  10375. //变量定义
  10376. CMD_GR_C_UserExpression * pUserExpression = (CMD_GR_C_UserExpression *)pData;
  10377. //获取用户
  10378. WORD wBindIndex = LOWORD(dwSocketID);
  10379. IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex);
  10380. //用户效验
  10381. ASSERT(pISendUserItem != NULL);
  10382. if (pISendUserItem == NULL) return false;
  10383. //寻找用户
  10384. if (pUserExpression->dwTargetUserID != 0)
  10385. {
  10386. IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pUserExpression->dwTargetUserID);
  10387. if (pIRecvUserItem == NULL) return true;
  10388. }
  10389. //状态判断
  10390. if ((CServerRule::IsForfendRoomChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10391. {
  10392. SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户大厅聊天!"), 0);
  10393. return true;
  10394. }
  10395. //权限判断
  10396. if (CUserRight::CanRoomChat(pISendUserItem->GetUserRight()) == false)
  10397. {
  10398. //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT);
  10399. SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有大厅发言的权限,若需要帮助,请联系游戏客服咨询!"), 0);
  10400. return true;
  10401. }
  10402. //权限判断
  10403. if (pUserExpression->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 ||
  10404. CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false))
  10405. {
  10406. return false;
  10407. }
  10408. //构造消息
  10409. CMD_GR_S_UserExpression UserExpression;
  10410. ZeroMemory(&UserExpression, sizeof(UserExpression));
  10411. //构造数据
  10412. UserExpression.wItemIndex = pUserExpression->wItemIndex;
  10413. UserExpression.dwSendUserID = pUserExpression->dwSendUserID;
  10414. UserExpression.dwTargetUserID = pUserExpression->dwTargetUserID;
  10415. //转发消息
  10416. SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_EXPRESSION, &UserExpression, sizeof(UserExpression));
  10417. return true;
  10418. }
  10419. //用户私聊
  10420. bool CAttemperEngineSink::OnTCPNetworkSubWisperChat(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10421. {
  10422. //变量定义
  10423. CMD_GR_C_WisperChat * pWisperChat = (CMD_GR_C_WisperChat *)pData;
  10424. //效验参数
  10425. ASSERT(wDataSize >= (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString)));
  10426. ASSERT(wDataSize == (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString) + pWisperChat->wChatLength * sizeof(pWisperChat->szChatString[0])));
  10427. //效验参数
  10428. if (wDataSize < (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString))) return false;
  10429. if (wDataSize != (sizeof(CMD_GR_C_WisperChat) - sizeof(pWisperChat->szChatString) + pWisperChat->wChatLength * sizeof(pWisperChat->szChatString[0]))) return false;
  10430. //获取用户
  10431. WORD wBindIndex = LOWORD(dwSocketID);
  10432. IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex);
  10433. //用户效验
  10434. ASSERT(pISendUserItem != NULL);
  10435. if (pISendUserItem == NULL) return false;
  10436. //寻找用户
  10437. IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pWisperChat->dwTargetUserID);
  10438. if (pIRecvUserItem == NULL) return true;
  10439. //状态判断
  10440. if ((CServerRule::IsForfendWisperChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10441. {
  10442. SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户私聊!"), 0);
  10443. return true;
  10444. }
  10445. //同桌判断
  10446. if ((CServerRule::IsForfendWisperOnGame(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10447. {
  10448. //变量定义
  10449. bool bForfend = true;
  10450. WORD wTableIDSend = pISendUserItem->GetTableID();
  10451. WORD wTableIDRecv = pIRecvUserItem->GetTableID();
  10452. //规则判断
  10453. if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false;
  10454. if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false;
  10455. if ((bForfend == true) && (pISendUserItem->GetUserStatus() != US_PLAYING)) bForfend = false;
  10456. if ((bForfend == true) && (pIRecvUserItem->GetUserStatus() != US_PLAYING)) bForfend = false;
  10457. if ((bForfend == true) && ((wTableIDSend == INVALID_TABLE) || (wTableIDSend != wTableIDRecv))) bForfend = false;
  10458. //提示消息
  10459. if (bForfend == true)
  10460. {
  10461. SendRequestFailure(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), 0);
  10462. //SendRoomMessage(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), SMT_EJECT | SMT_CHAT);
  10463. return true;
  10464. }
  10465. }
  10466. //权限判断
  10467. if (CUserRight::CanWisper(pISendUserItem->GetUserRight()) == false)
  10468. {
  10469. SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), 0);
  10470. //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT);
  10471. return true;
  10472. }
  10473. //权限判断
  10474. if (pWisperChat->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 ||
  10475. CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false))
  10476. {
  10477. return false;
  10478. }
  10479. //变量定义
  10480. CMD_GR_S_WisperChat WisperChat;
  10481. ZeroMemory(&WisperChat, sizeof(WisperChat));
  10482. //字符过滤
  10483. SensitiveWordFilter(pWisperChat->szChatString, WisperChat.szChatString, CountArray(WisperChat.szChatString));
  10484. //构造数据
  10485. WisperChat.dwChatColor = pWisperChat->dwChatColor;
  10486. WisperChat.wChatLength = pWisperChat->wChatLength;
  10487. WisperChat.dwSendUserID = pISendUserItem->GetUserID();
  10488. WisperChat.dwTargetUserID = pIRecvUserItem->GetUserID();
  10489. WisperChat.wChatLength = CountStringBuffer(WisperChat.szChatString);
  10490. //转发消息
  10491. WORD wHeadSize = sizeof(WisperChat) - sizeof(WisperChat.szChatString);
  10492. SendData(pISendUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0]));
  10493. //转发消息
  10494. WisperChat.dwSendUserID = pWisperChat->dwSendUserID;
  10495. SendData(pIRecvUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0]));
  10496. //机器判断
  10497. if (pIRecvUserItem->IsAndroidUser() == true)
  10498. {
  10499. //枚举用户
  10500. WORD wEnumIndex = 0;
  10501. IServerUserItem * pTempServerUserItem;
  10502. do
  10503. {
  10504. pTempServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  10505. if (pTempServerUserItem != NULL)
  10506. {
  10507. if (pTempServerUserItem == pISendUserItem) continue;
  10508. if (pTempServerUserItem == pIRecvUserItem) continue;
  10509. if (pTempServerUserItem->GetMasterOrder() > 0 &&
  10510. CMasterRight::CanManagerAndroid(pTempServerUserItem->GetMasterRight()) == true)
  10511. {
  10512. SendData(pTempServerUserItem, MDM_GR_USER, SUB_GR_WISPER_CHAT, &WisperChat, wHeadSize + WisperChat.wChatLength * sizeof(WisperChat.szChatString[0]));
  10513. }
  10514. }
  10515. } while (pTempServerUserItem != NULL);
  10516. }
  10517. return true;
  10518. }
  10519. //用户表情
  10520. bool CAttemperEngineSink::OnTCPNetworkSubWisperExpression(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10521. {
  10522. //效验参数
  10523. ASSERT(wDataSize == sizeof(CMD_GR_C_WisperExpression));
  10524. if (wDataSize != sizeof(CMD_GR_C_WisperExpression)) return false;
  10525. //变量定义
  10526. CMD_GR_C_WisperExpression * pWisperExpression = (CMD_GR_C_WisperExpression *)pData;
  10527. //获取用户
  10528. WORD wBindIndex = LOWORD(dwSocketID);
  10529. IServerUserItem * pISendUserItem = GetBindUserItem(wBindIndex);
  10530. //用户效验
  10531. ASSERT(pISendUserItem != NULL);
  10532. if (pISendUserItem == NULL) return false;
  10533. //寻找用户
  10534. IServerUserItem * pIRecvUserItem = m_ServerUserManager.SearchUserItem(pWisperExpression->dwTargetUserID);
  10535. if (pIRecvUserItem == NULL) return true;
  10536. //状态判断
  10537. if ((CServerRule::IsForfendWisperChat(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10538. {
  10539. SendRequestFailure(pISendUserItem, TEXT("抱歉,当前此游戏房间禁止用户私聊!"), 0);
  10540. return true;
  10541. }
  10542. //同桌判断
  10543. if ((CServerRule::IsForfendWisperOnGame(m_pGameServiceOption->dwServerRule) == true) && (pISendUserItem->GetMasterOrder() == 0))
  10544. {
  10545. //变量定义
  10546. bool bForfend = true;
  10547. WORD wTableIDSend = pISendUserItem->GetTableID();
  10548. WORD wTableIDRecv = pIRecvUserItem->GetTableID();
  10549. //规则判断
  10550. if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false;
  10551. if ((bForfend == true) && (pIRecvUserItem->GetMasterOrder() != 0)) bForfend = false;
  10552. if ((bForfend == true) && (pISendUserItem->GetUserStatus() != US_PLAYING)) bForfend = false;
  10553. if ((bForfend == true) && (pIRecvUserItem->GetUserStatus() != US_PLAYING)) bForfend = false;
  10554. if ((bForfend == true) && ((wTableIDSend == INVALID_TABLE) || (wTableIDSend != wTableIDRecv))) bForfend = false;
  10555. //提示消息
  10556. if (bForfend == true)
  10557. {
  10558. SendRequestFailure(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), 0);
  10559. //SendRoomMessage(pISendUserItem, TEXT("抱歉,此游戏房间不允许在游戏中与同桌的玩家私聊!"), SMT_EJECT | SMT_CHAT);
  10560. return true;
  10561. }
  10562. }
  10563. //权限判断
  10564. if (CUserRight::CanWisper(pISendUserItem->GetUserRight()) == false)
  10565. {
  10566. SendRequestFailure(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), 0);
  10567. //SendRoomMessage(pISendUserItem, TEXT("抱歉,您没有发送私聊的权限,若需要帮助,请联系游戏客服咨询!"), SMT_EJECT | SMT_CHAT);
  10568. return true;
  10569. }
  10570. //权限判断
  10571. if (pWisperExpression->dwSendUserID != pISendUserItem->GetUserID() && (pISendUserItem->GetMasterOrder() == 0 ||
  10572. CMasterRight::CanManagerAndroid(pISendUserItem->GetMasterRight()) == false))
  10573. {
  10574. return false;
  10575. }
  10576. //变量定义
  10577. CMD_GR_S_WisperExpression WisperExpression;
  10578. ZeroMemory(&WisperExpression, sizeof(WisperExpression));
  10579. //构造数据
  10580. WisperExpression.wItemIndex = pWisperExpression->wItemIndex;
  10581. WisperExpression.dwSendUserID = pISendUserItem->GetUserID();
  10582. WisperExpression.dwTargetUserID = pWisperExpression->dwTargetUserID;
  10583. //转发消息
  10584. SendData(pISendUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression));
  10585. //转发消息
  10586. WisperExpression.dwSendUserID = pWisperExpression->dwSendUserID;
  10587. SendData(pIRecvUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression));
  10588. //机器判断
  10589. if (pIRecvUserItem->IsAndroidUser() == true)
  10590. {
  10591. //枚举用户
  10592. WORD wEnumIndex = 0;
  10593. IServerUserItem * pTempServerUserItem;
  10594. do
  10595. {
  10596. pTempServerUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  10597. if (pTempServerUserItem != NULL)
  10598. {
  10599. if (pTempServerUserItem == pISendUserItem) continue;
  10600. if (pTempServerUserItem == pIRecvUserItem) continue;
  10601. if (pTempServerUserItem->GetMasterOrder() > 0)
  10602. {
  10603. SendData(pTempServerUserItem, MDM_GR_USER, SUB_GR_WISPER_EXPRESSION, &WisperExpression, sizeof(WisperExpression));
  10604. }
  10605. }
  10606. } while (pTempServerUserItem != NULL);
  10607. }
  10608. return true;
  10609. }
  10610. //购买道具
  10611. //bool CAttemperEngineSink::OnTCPNetworkSubPropertyBuy(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10612. //{
  10613. // //事件处理
  10614. // int cbResult = OnPropertyBuy(pData, wDataSize, dwSocketID);
  10615. //
  10616. // //结果判断
  10617. // if (cbResult == RESULT_ERROR) return false;
  10618. // if (cbResult == RESULT_FAIL) return true;
  10619. // if (cbResult == RESULT_SUCCESS) return true;
  10620. //
  10621. // return true;
  10622. //}
  10623. //购买道具
  10624. //int CAttemperEngineSink::OnPropertyBuy(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10625. //{
  10626. // //效验参数
  10627. // ASSERT(wDataSize == sizeof(CMD_GR_C_PropertyBuy));
  10628. // if (wDataSize != sizeof(CMD_GR_C_PropertyBuy)) return RESULT_ERROR;
  10629. //
  10630. // //变量定义
  10631. // CMD_GR_C_PropertyBuy * pPropertyBuy = (CMD_GR_C_PropertyBuy *)pData;
  10632. //
  10633. // //数据效验
  10634. // ASSERT(pPropertyBuy->wItemCount > 0);
  10635. // if (pPropertyBuy->wItemCount == 0) return RESULT_ERROR;
  10636. //
  10637. // //获取用户
  10638. // WORD wBindIndex = LOWORD(dwSocketID);
  10639. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10640. //
  10641. // //用户效验
  10642. // ASSERT(pIServerUserItem != NULL);
  10643. // if (pIServerUserItem == NULL) return RESULT_ERROR;
  10644. //
  10645. // //目标用户
  10646. // IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pPropertyBuy->dwTargetUserID);
  10647. // if (pITargerUserItem == NULL) return RESULT_ERROR;
  10648. //
  10649. // //比赛房间
  10650. // if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH)
  10651. // {
  10652. // //发送消息
  10653. // SendPropertyFailure(pIServerUserItem, TEXT("比赛房间不可以使用此功能!"), 0L, pPropertyBuy->cbRequestArea);
  10654. //
  10655. // return RESULT_FAIL;
  10656. // }
  10657. //
  10658. // //练习房间
  10659. // if (m_pGameServiceOption->wServerType == GAME_GENRE_EDUCATE)
  10660. // {
  10661. // SendPropertyFailure(pIServerUserItem, TEXT("练习房间不可以使用此功能!"), 0L, pPropertyBuy->cbRequestArea);
  10662. // return RESULT_FAIL;
  10663. // }
  10664. //
  10665. // //购前事件
  10666. // if (OnEventPropertyBuyPrep(pPropertyBuy->cbRequestArea, pPropertyBuy->wPropertyIndex, pIServerUserItem, pITargerUserItem) == false)
  10667. // return RESULT_FAIL;
  10668. //
  10669. // //变量定义
  10670. // DBR_GR_PropertyRequest PropertyRequest;
  10671. // ZeroMemory(&PropertyRequest, sizeof(PropertyRequest));
  10672. //
  10673. // //查找道具
  10674. // tagPropertyInfo * pPropertyInfo = m_GamePropertyManager.SearchPropertyItem(pPropertyBuy->wPropertyIndex);
  10675. // if (pPropertyInfo == NULL)
  10676. // {
  10677. // SendPropertyFailure(pIServerUserItem, TEXT("您购买的道具不存在或在维护中,请与管理员联系!"), 0L, pPropertyBuy->cbRequestArea);
  10678. // return RESULT_FAIL;
  10679. // }
  10680. //
  10681. // //消费方式
  10682. // if (pPropertyBuy->cbConsumeScore == TRUE)
  10683. // {
  10684. // //房间判断
  10685. // ASSERT((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) != 0);
  10686. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return RESULT_FAIL;
  10687. //
  10688. // //锁定计算
  10689. // PropertyRequest.cbConsumeScore = TRUE;
  10690. // PropertyRequest.lFrozenedScore = pPropertyInfo->lPropertyGold*pPropertyBuy->wItemCount;
  10691. //
  10692. // //会员折扣
  10693. // if (pIServerUserItem->GetMemberOrder() > 0)
  10694. // {
  10695. // PropertyRequest.lFrozenedScore = PropertyRequest.lFrozenedScore*pPropertyInfo->wDiscount / 100L;
  10696. // }
  10697. //
  10698. // //锁定积分
  10699. // if (pIServerUserItem->FrozenedUserScore(PropertyRequest.lFrozenedScore) == false)
  10700. // {
  10701. // SendPropertyFailure(pIServerUserItem, TEXT("您的游戏币余额不足,道具购买失败!"), 0L, pPropertyBuy->cbRequestArea);
  10702. // return RESULT_FAIL;
  10703. // }
  10704. // }
  10705. // else
  10706. // {
  10707. // //银行扣费
  10708. // PropertyRequest.lFrozenedScore = 0L;
  10709. // PropertyRequest.cbConsumeScore = FALSE;
  10710. //
  10711. // //变量定义
  10712. // SCORE lInsure = pIServerUserItem->GetUserInsure();
  10713. // SCORE lConsumeScore = pPropertyInfo->lPropertyGold*pPropertyBuy->wItemCount;
  10714. //
  10715. // //会员折扣
  10716. // if (pIServerUserItem->GetMemberOrder() > 0)
  10717. // {
  10718. // lConsumeScore = lConsumeScore*pPropertyInfo->wDiscount / 100L;
  10719. // }
  10720. //
  10721. // //银行校验
  10722. // if (lInsure < lConsumeScore)
  10723. // {
  10724. // SendPropertyFailure(pIServerUserItem, TEXT("您的银行余额不足,请存款后再次购买!"), 0L, pPropertyBuy->cbRequestArea);
  10725. // return RESULT_FAIL;
  10726. // }
  10727. // }
  10728. //
  10729. // //购买信息
  10730. // PropertyRequest.cbRequestArea = pPropertyBuy->cbRequestArea;
  10731. // PropertyRequest.wItemCount = pPropertyBuy->wItemCount;
  10732. // PropertyRequest.wPropertyIndex = pPropertyBuy->wPropertyIndex;
  10733. // PropertyRequest.dwSourceUserID = pIServerUserItem->GetUserID();
  10734. // PropertyRequest.dwTargetUserID = pITargerUserItem->GetUserID();
  10735. //
  10736. // //设置权限
  10737. // if (PropertyRequest.wPropertyIndex == PROPERTY_ID_VIPROOM_CARD)
  10738. // PropertyRequest.dwUserRight |= UR_GAME_KICK_OUT_USER | UR_GAME_ENTER_VIP_ROOM;
  10739. // else if (PropertyRequest.wPropertyIndex >= PROPERTY_ID_BLUERING_CARD && PropertyRequest.wPropertyIndex <= PROPERTY_ID_REDRING_CARD)
  10740. // PropertyRequest.dwUserRight |= UR_GAME_KICK_OUT_USER;
  10741. // else
  10742. // PropertyRequest.dwUserRight = 0;
  10743. //
  10744. // //系统信息
  10745. // PropertyRequest.wTableID = INVALID_TABLE;
  10746. // PropertyRequest.dwInoutIndex = pIServerUserItem->GetInoutIndex();
  10747. // PropertyRequest.dwClientAddr = pIServerUserItem->GetClientAddr();
  10748. // lstrcpyn(PropertyRequest.szMachineID, pIServerUserItem->GetMachineID(), CountArray(PropertyRequest.szMachineID));
  10749. //
  10750. // //投递数据
  10751. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_PROPERTY_REQUEST, dwSocketID, &PropertyRequest, sizeof(PropertyRequest));
  10752. //
  10753. // return RESULT_SUCCESS;
  10754. //}
  10755. //使用道具
  10756. //bool CAttemperEngineSink::OnTCPNetwordSubSendTrumpet(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10757. //{
  10758. // //效验参数
  10759. // ASSERT(wDataSize == sizeof(CMD_GR_C_SendTrumpet));
  10760. // if (wDataSize != sizeof(CMD_GR_C_SendTrumpet)) return false;
  10761. //
  10762. // //变量定义
  10763. // CMD_GR_C_SendTrumpet * pSendTrumpet = (CMD_GR_C_SendTrumpet *)pData;
  10764. //
  10765. // //获取用户
  10766. // WORD wBindIndex = LOWORD(dwSocketID);
  10767. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10768. // if (pIServerUserItem == NULL) return false;
  10769. //
  10770. // //构造结构
  10771. // CMD_GR_C_PropertyBuy PropertyBuy;
  10772. // PropertyBuy.cbRequestArea = pSendTrumpet->cbRequestArea;
  10773. // PropertyBuy.dwTargetUserID = pIServerUserItem->GetUserID();
  10774. // PropertyBuy.wPropertyIndex = pSendTrumpet->wPropertyIndex;
  10775. // PropertyBuy.cbConsumeScore = FALSE;
  10776. // PropertyBuy.wItemCount = 1;
  10777. //
  10778. // //购买
  10779. // int cbResult = OnPropertyBuy((void *)&PropertyBuy, sizeof(PropertyBuy), dwSocketID);
  10780. //
  10781. // //结果判断
  10782. // if (cbResult == RESULT_ERROR) return false;
  10783. // if (cbResult != RESULT_SUCCESS) return true;
  10784. //
  10785. // //获取道具
  10786. // //tagUserProperty * pUserProperty = pIServerUserItem->GetUserProperty();
  10787. //
  10788. // //道具索引
  10789. // BYTE cbIndex = (pSendTrumpet->wPropertyIndex == PROPERTY_ID_TRUMPET) ? 2 : 3;
  10790. //
  10791. // //构造结构
  10792. // CMD_GR_S_SendTrumpet SendTrumpet;
  10793. // SendTrumpet.dwSendUserID = pIServerUserItem->GetUserID();
  10794. // SendTrumpet.wPropertyIndex = pSendTrumpet->wPropertyIndex;
  10795. // SendTrumpet.TrumpetColor = pSendTrumpet->TrumpetColor;
  10796. // ZeroMemory(SendTrumpet.szTrumpetContent, sizeof(SendTrumpet.szTrumpetContent));
  10797. // CopyMemory(SendTrumpet.szSendNickName, pIServerUserItem->GetNickName(), sizeof(SendTrumpet.szSendNickName));
  10798. //
  10799. // //字符过滤
  10800. // SensitiveWordFilter(pSendTrumpet->szTrumpetContent, SendTrumpet.szTrumpetContent, CountArray(SendTrumpet.szTrumpetContent));
  10801. //
  10802. // //房间转发
  10803. // if (cbIndex == 3)
  10804. // {
  10805. // //广播房间
  10806. // CMD_CS_S_SendTrumpet * pInfo = (CMD_CS_S_SendTrumpet *)&SendTrumpet;
  10807. // if (m_pITCPSocketService)
  10808. // {
  10809. // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  10810. // {
  10811. // auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  10812. //
  10813. // TCHAR szTemp[32] = { 0 };
  10814. // if (pat) pat->GetPrivateTableID(szTemp, 32);
  10815. // CString csTemp = szTemp;
  10816. //
  10817. // /*if (pat != nullptr && !csTemp.IsEmpty())
  10818. // {
  10819. // DWORD dTableNum = _wtol(szTemp);
  10820. // }*/
  10821. // }
  10822. // 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()*/);
  10823. // }
  10824. // }
  10825. //
  10826. // //游戏转发
  10827. // if (cbIndex == 2)
  10828. // {
  10829. // //DWORD dTableNum = 0;
  10830. // if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  10831. // {
  10832. // auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  10833. //
  10834. // TCHAR szTemp[32] = { 0 };
  10835. // if (pat) pat->GetPrivateTableID(szTemp, 32);
  10836. // CString csTemp = szTemp;
  10837. //
  10838. // /*if (pat != nullptr && !csTemp.IsEmpty())
  10839. // {
  10840. // dTableNum = _wtol(szTemp);
  10841. // }*/
  10842. // }
  10843. //
  10844. // CString csSend;
  10845. // CString csTest = AfxGetAppName();
  10846. //
  10847. // csSend.Format(_T("进程【%s】【群发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET);
  10848. // //OutputDebugString(csSend);
  10849. // Commend::ToShow(this, MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, &SendTrumpet, sizeof(SendTrumpet), 0, 0, m_pIGameServiceManager->GetDataString());
  10850. //
  10851. // //发送数据
  10852. // m_pITCPNetworkEngine->SendDataBatch(MDM_GR_USER, SUB_GR_PROPERTY_TRUMPET, &SendTrumpet, sizeof(SendTrumpet), BG_COMPUTER);
  10853. // }
  10854. //
  10855. // return true;
  10856. //}
  10857. //邀请用户
  10858. //bool CAttemperEngineSink::OnTCPNetworkSubUserInviteReq(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10859. //{
  10860. // UserInfo::PB_CS_C_UserInviteReq InviteReq;
  10861. // InviteReq.ParseFromArray(pData, wDataSize);
  10862. //
  10863. // //处理消息
  10864. // CMD_GR_UserInviteReq pUserInviteReq;
  10865. // ZeroMemory(&pUserInviteReq, sizeof(pUserInviteReq));
  10866. // pUserInviteReq.wTableID = InviteReq.wtableid();
  10867. // pUserInviteReq.dwUserID = InviteReq.dwuserid();
  10868. //
  10869. // //获取用户
  10870. // WORD wBindIndex = LOWORD(dwSocketID);
  10871. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10872. // if (pIServerUserItem == NULL) return false;
  10873. //
  10874. // //效验状态
  10875. // if (pUserInviteReq.wTableID == INVALID_TABLE) return true;
  10876. // if (pIServerUserItem->GetTableID() != pUserInviteReq.wTableID) return true;
  10877. // if (pIServerUserItem->GetUserStatus() == US_PLAYING) return true;
  10878. // if (pIServerUserItem->GetUserStatus() == US_OFFLINE) return true;
  10879. //
  10880. // //目标用户
  10881. // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pUserInviteReq.dwUserID);
  10882. // if (pITargetUserItem == NULL) return true;
  10883. // if (pITargetUserItem->GetUserStatus() == US_PLAYING) return true;
  10884. //
  10885. // UserInfo::PB_CS_S_UserInvite Invite;
  10886. // Invite.set_wtableid(pUserInviteReq.wTableID);
  10887. // Invite.set_dwuserid(pIServerUserItem->GetUserID());
  10888. // //发送数据
  10889. // std::string pbdata = Invite.SerializePartialAsString();
  10890. //
  10891. // SendData(pITargetUserItem, MDM_GR_USER, SUB_GR_USER_INVITE, (void*)pbdata.c_str(), pbdata.length());
  10892. // return true;
  10893. //}
  10894. ////拒绝厌友
  10895. //bool CAttemperEngineSink::OnTCPNetworkSubUserRepulseSit(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10896. //{
  10897. // UserInfo::PB_CS_C_UserRepulseSit RepulseSit;
  10898. // RepulseSit.ParseFromArray(pData, wDataSize);
  10899. //
  10900. // //处理消息
  10901. // CMD_GR_UserRepulseSit pUserRepulseSit;
  10902. // ZeroMemory(&pUserRepulseSit, sizeof(pUserRepulseSit));
  10903. // pUserRepulseSit.wTableID = RepulseSit.wtableid();
  10904. // pUserRepulseSit.wChairID = RepulseSit.wchairid();
  10905. // pUserRepulseSit.dwUserID = RepulseSit.dwuserid();
  10906. // pUserRepulseSit.dwRepulseUserID = RepulseSit.dwrepulseuserid();
  10907. //
  10908. // //获取用户
  10909. // WORD wBindIndex = LOWORD(dwSocketID);
  10910. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10911. // if (pIServerUserItem == NULL) return false;
  10912. //
  10913. // //获取桌子
  10914. // auto pTableFrame = GetTableFrame(pUserRepulseSit.wTableID);
  10915. // if (!pTableFrame)
  10916. // return false;
  10917. // if (pTableFrame->IsGameStarted() == true) return true;
  10918. //
  10919. // //获取用户
  10920. // IServerUserItem * pRepulseIServerUserItem = pTableFrame->GetTableUserItem(pUserRepulseSit.wChairID);
  10921. // if (pRepulseIServerUserItem == NULL) return true;
  10922. // if (pRepulseIServerUserItem->GetUserID() != pUserRepulseSit.dwRepulseUserID)return true;
  10923. //
  10924. // //发送消息
  10925. // TCHAR szDescribe[256] = TEXT("");
  10926. // lstrcpyn(szDescribe, TEXT("此桌有玩家设置了不与您同桌游戏!"), CountArray(szDescribe));
  10927. // SendRoomMessage(pRepulseIServerUserItem, szDescribe, SMT_TABLE_EXIT);
  10928. //
  10929. // //弹起玩家
  10930. // pTableFrame->PerformStandUpAction(pRepulseIServerUserItem);
  10931. //
  10932. // return true;
  10933. //}
  10934. //
  10935. ////踢出命令
  10936. //bool CAttemperEngineSink::OnTCPNetworkSubMemberKickUser(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  10937. //{
  10938. // UserInfo::PB_CS_C_KickUser Kick;
  10939. // Kick.ParseFromArray(pData, wDataSize);
  10940. //
  10941. // //处理消息
  10942. // CMD_GR_KickUser pKickUser;
  10943. // ZeroMemory(&pKickUser, sizeof(pKickUser));
  10944. // pKickUser.dwTargetUserID = Kick.dwtargetuserid();
  10945. //
  10946. //
  10947. // //获取用户
  10948. // WORD wBindIndex = LOWORD(dwSocketID);
  10949. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  10950. //
  10951. // //目标用户
  10952. // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pKickUser.dwTargetUserID);
  10953. // if (pITargetUserItem == NULL) return true;
  10954. //
  10955. // //用户效验
  10956. // ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMemberOrder() > pITargetUserItem->GetMemberOrder()));
  10957. // if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMemberOrder() <= pITargetUserItem->GetMemberOrder())) return false;
  10958. //
  10959. // //权限判断
  10960. // ASSERT(CUserRight::CanKillOutUser(pIServerUserItem->GetUserRight()) == true);
  10961. // if (CUserRight::CanKillOutUser(pIServerUserItem->GetUserRight()) == false) return false;
  10962. //
  10963. // //禁踢管理员
  10964. // if (pITargetUserItem->GetMasterOrder() > 0)
  10965. // {
  10966. // //发送消息
  10967. // SendRequestFailure(pIServerUserItem, TEXT("很抱歉,踢出管理员是不被允许的!"), 0);
  10968. // return true;
  10969. // }
  10970. //
  10971. // //百人游戏
  10972. // if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR)
  10973. // {
  10974. // //发送消息
  10975. // SendRequestFailure(pIServerUserItem, TEXT("很抱歉,百人游戏不许踢人!"), 0);
  10976. // return true;
  10977. // }
  10978. //
  10979. // //用户状态
  10980. // if (pITargetUserItem->GetUserStatus() == US_PLAYING)
  10981. // {
  10982. // //变量定义
  10983. // TCHAR szMessage[256] = TEXT("");
  10984. // _sntprintf(szMessage, CountArray(szMessage), TEXT("由于玩家 [ %s ] 正在游戏中,您不能将它踢出游戏!"), pITargetUserItem->GetNickName());
  10985. //
  10986. // //发送消息
  10987. // SendRequestFailure(pIServerUserItem, szMessage, 0);
  10988. // return true;
  10989. // }
  10990. //
  10991. // //防踢判断
  10992. // if ((pITargetUserItem->GetUserProperty()->wPropertyUseMark&PT_USE_MARK_GUARDKICK_CARD) != 0)
  10993. // {
  10994. // //变量定义
  10995. // DWORD dwCurrentTime = (DWORD)time(NULL);
  10996. // tagUserProperty * pUserProperty = pITargetUserItem->GetUserProperty();
  10997. //
  10998. // //时效判断
  10999. // DWORD dwValidTime = pUserProperty->PropertyInfo[2].wPropertyCount*pUserProperty->PropertyInfo[2].dwValidNum;
  11000. // if (pUserProperty->PropertyInfo[2].dwEffectTime + dwValidTime > dwCurrentTime)
  11001. // {
  11002. // //变量定义
  11003. // TCHAR szMessage[256] = TEXT("");
  11004. // _sntprintf(szMessage, CountArray(szMessage), TEXT("由于玩家 [ %s ] 正在使用防踢卡,您无法将它踢出游戏!"), pITargetUserItem->GetNickName());
  11005. //
  11006. // //发送消息
  11007. // SendRequestFailure(pIServerUserItem, szMessage, 0);
  11008. //
  11009. // return true;
  11010. // }
  11011. // else
  11012. // pUserProperty->wPropertyUseMark &= ~PT_USE_MARK_GUARDKICK_CARD;
  11013. // }
  11014. //
  11015. // //请离桌子
  11016. // WORD wTargerTableID = pITargetUserItem->GetTableID();
  11017. // if (wTargerTableID != INVALID_TABLE)
  11018. // {
  11019. // //定义变量
  11020. // TCHAR szMessage[64] = TEXT("");
  11021. // _sntprintf(szMessage, CountArray(szMessage), TEXT("你已被%s请离桌子!"), pIServerUserItem->GetNickName());
  11022. //
  11023. // //发送消息
  11024. //
  11025. // SendGameMessage(pITargetUserItem, szMessage, SMT_TABLE_EXIT);
  11026. //
  11027. // auto pTableFrame = GetTableFrame(wTargerTableID);
  11028. // if (!pTableFrame)
  11029. // return false;
  11030. // if (pTableFrame->PerformStandUpAction(pITargetUserItem) == false) return true;
  11031. // }
  11032. //
  11033. // return true;
  11034. //}
  11035. //请求用户信息
  11036. bool CAttemperEngineSink::OnTCPNetworkSubUserInfoReq(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11037. {
  11038. //获取用户
  11039. WORD wBindIndex = LOWORD(dwSocketID);
  11040. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11041. //用户效验
  11042. ASSERT(pIServerUserItem != NULL);
  11043. if (pIServerUserItem == NULL) return false;
  11044. UserInfo::PB_CS_C_UserInfoReq InfoReq;
  11045. InfoReq.ParseFromArray(pData, wDataSize);
  11046. //处理消息
  11047. CMD_GR_UserInfoReq pUserInfoReq;
  11048. ZeroMemory(&pUserInfoReq, sizeof(pUserInfoReq));
  11049. pUserInfoReq.dwUserIDReq = InfoReq.dwuseridreq();
  11050. pUserInfoReq.wTablePos = InfoReq.wtablepos();
  11051. pIServerUserItem->SetMobileUserDeskPos(pUserInfoReq.wTablePos);
  11052. //发送信息
  11053. SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, pUserInfoReq.dwUserIDReq);
  11054. return true;
  11055. }
  11056. //请求更换位置
  11057. bool CAttemperEngineSink::OnTCPNetworkSubUserChairReq(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11058. {
  11059. //获取用户
  11060. WORD wBindIndex = LOWORD(dwSocketID);
  11061. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11062. //用户效验
  11063. ASSERT(pIServerUserItem != NULL);
  11064. if (pIServerUserItem == NULL) return false;
  11065. //用户状态
  11066. if (pIServerUserItem->GetUserStatus() == US_PLAYING)
  11067. {
  11068. //失败
  11069. SendRequestFailure(pIServerUserItem, TEXT("您正在游戏中,暂时不能离开,请先结束当前游戏!"), REQUEST_FAILURE_NORMAL);
  11070. if (IsJC(1234))
  11071. {
  11072. CString csTestB;
  11073. csTestB.Format(_T("状态出错 -> 函数名:%s, 用户ID:%d,桌号:%s,状态:%d"), L"OnTCPNetworkSubUserChairReq", pIServerUserItem->GetUserID()
  11074. , pIServerUserItem->GetUserInfo()->szPrivateTableID
  11075. , pIServerUserItem->GetUserStatus());
  11076. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  11077. }
  11078. return true;
  11079. }
  11080. //动态加入
  11081. bool bDynamicJoin = true;
  11082. if (m_pGameServiceAttrib->cbDynamicJoin == FALSE) bDynamicJoin = false;
  11083. if (CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule) == false) bDynamicJoin = false;
  11084. //查找桌子
  11085. INT nStartIndex = rand() % m_pGameServiceOption->wTableCount;
  11086. for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++)
  11087. {
  11088. //定义变量
  11089. INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount;
  11090. //过滤同桌
  11091. if (nTableIndex == pIServerUserItem->GetTableID())continue;
  11092. //获取桌子
  11093. auto pTableFrame = GetTableFrame(nTableIndex);
  11094. if (!pTableFrame)
  11095. return false;
  11096. if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue;
  11097. if (pTableFrame->IsTableLocked()) continue;
  11098. if (pTableFrame->GetChairCount() == pTableFrame->GetNullChairCount()) continue;
  11099. //无效过滤
  11100. WORD wChairID = pTableFrame->GetRandNullChairID();
  11101. if (wChairID == INVALID_CHAIR) continue;
  11102. //离开处理
  11103. if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  11104. {
  11105. auto pTableFrameTemp = GetTableFrame(pIServerUserItem->GetTableID());
  11106. if (!pTableFrameTemp)
  11107. return false;
  11108. if (pTableFrameTemp->PerformStandUpAction(pIServerUserItem) == false) return true;
  11109. }
  11110. //定义变量
  11111. WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos();
  11112. WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount();
  11113. //更新信息
  11114. if ((nTableIndex < wTagerDeskPos) || (nTableIndex > (wTagerDeskPos + wTagerDeskCount - 1)))
  11115. {
  11116. WORD wNewPos = (nTableIndex / wTagerDeskCount)*wTagerDeskCount;
  11117. pIServerUserItem->SetMobileUserDeskPos(wNewPos);
  11118. }
  11119. //用户坐下
  11120. pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem);
  11121. return true;
  11122. }
  11123. //查找桌子
  11124. nStartIndex = rand() % m_pGameServiceOption->wTableCount;
  11125. for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++)
  11126. {
  11127. //定义变量
  11128. INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount;
  11129. //过滤同桌
  11130. if (nTableIndex == pIServerUserItem->GetTableID())continue;
  11131. //获取桌子
  11132. auto pTableFrame = GetTableFrame(nTableIndex);
  11133. if (!pTableFrame)
  11134. return false;
  11135. if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue;
  11136. if (pTableFrame->IsTableLocked()) continue;
  11137. //无效过滤
  11138. WORD wChairID = pTableFrame->GetRandNullChairID();
  11139. if (wChairID == INVALID_CHAIR) continue;
  11140. //离开处理
  11141. if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  11142. {
  11143. auto pTableFrameTemp = GetTableFrame(pIServerUserItem->GetTableID());
  11144. if (!pTableFrameTemp)
  11145. return false;
  11146. if (pTableFrameTemp->PerformStandUpAction(pIServerUserItem) == false) return true;
  11147. }
  11148. //定义变量
  11149. WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos();
  11150. WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount();
  11151. //更新信息
  11152. if ((nTableIndex < wTagerDeskPos) || (nTableIndex > (wTagerDeskPos + wTagerDeskCount - 1)))
  11153. {
  11154. WORD wNewPos = (nTableIndex / wTagerDeskCount)*wTagerDeskCount;
  11155. pIServerUserItem->SetMobileUserDeskPos(wNewPos);
  11156. }
  11157. //用户坐下
  11158. pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem);
  11159. return true;
  11160. }
  11161. //查找同桌
  11162. if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  11163. {
  11164. //获取桌子
  11165. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  11166. if (!pTableFrame)
  11167. return false;
  11168. if (pTableFrame->IsGameStarted() == false && pTableFrame->IsTableLocked() == false)
  11169. {
  11170. //无效过滤
  11171. WORD wChairID = pTableFrame->GetRandNullChairID();
  11172. if (wChairID != INVALID_CHAIR)
  11173. {
  11174. //离开处理
  11175. if (pTableFrame->PerformStandUpAction(pIServerUserItem) == false) return true;
  11176. //用户坐下
  11177. pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem);
  11178. return true;
  11179. }
  11180. }
  11181. }
  11182. //失败
  11183. SendRequestFailure(pIServerUserItem, TEXT("没找到可进入的游戏桌!"), REQUEST_FAILURE_NORMAL);
  11184. return true;
  11185. }
  11186. //请求椅子用户信息
  11187. bool CAttemperEngineSink::OnTCPNetworkSubChairUserInfoReq(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11188. {
  11189. //获取用户
  11190. WORD wBindIndex = LOWORD(dwSocketID);
  11191. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11192. //用户效验
  11193. ASSERT(pIServerUserItem != NULL);
  11194. if (pIServerUserItem == NULL) return false;
  11195. UserInfo::PB_CS_C_ChairUserInfoReq InfoReq;
  11196. InfoReq.ParseFromArray(pData, wDataSize);
  11197. //处理消息
  11198. CMD_GR_ChairUserInfoReq pUserInfoReq;
  11199. ZeroMemory(&pUserInfoReq, sizeof(pUserInfoReq));
  11200. pUserInfoReq.wTableID = InfoReq.wtableid();
  11201. pUserInfoReq.wChairID = InfoReq.wchairid();
  11202. if (pUserInfoReq.wTableID == INVALID_TABLE) return true;
  11203. //发送消息
  11204. auto pTableFrame = GetTableFrame(pUserInfoReq.wTableID);
  11205. if (!pTableFrame)
  11206. return false;
  11207. WORD wChairCout = pTableFrame->GetChairCount();
  11208. for (WORD wIndex = 0; wIndex < wChairCout; wIndex++)
  11209. {
  11210. //获取用户
  11211. if (pUserInfoReq.wChairID != INVALID_CHAIR && wIndex != pUserInfoReq.wChairID)continue;
  11212. IServerUserItem * pTagerIServerUserItem = pTableFrame->GetTableUserItem(wIndex);
  11213. if (pTagerIServerUserItem == NULL)continue;
  11214. if (pIServerUserItem == pTagerIServerUserItem) continue; //请求自己
  11215. //变量定义
  11216. tagMobileUserInfoHead pUserInfoHead;
  11217. tagUserInfo *pUserInfo = pTagerIServerUserItem->GetUserInfo();
  11218. //用户属性
  11219. pUserInfoHead.wFaceID = pUserInfo->wFaceID;
  11220. pUserInfoHead.dwGameID = pUserInfo->dwGameID;
  11221. pUserInfoHead.dwUserID = pUserInfo->dwUserID;
  11222. pUserInfoHead.dwCustomID = pUserInfo->dwCustomID;
  11223. //用户属性
  11224. pUserInfoHead.cbGender = pUserInfo->cbGender;
  11225. pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder;
  11226. //用户状态
  11227. pUserInfoHead.wTableID = pUserInfo->wTableID;
  11228. pUserInfoHead.wChairID = pUserInfo->wChairID;
  11229. pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus;
  11230. //用户局数
  11231. pUserInfoHead.dwWinCount = pUserInfo->dwWinCount;
  11232. pUserInfoHead.dwLostCount = pUserInfo->dwLostCount;
  11233. pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount;
  11234. pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount;
  11235. pUserInfoHead.dwExperience = pUserInfo->dwExperience;
  11236. //用户成绩
  11237. pUserInfoHead.lScore = pUserInfo->lScore;
  11238. pUserInfoHead.lScore += pTagerIServerUserItem->GetTrusteeScore();
  11239. pUserInfoHead.lScore += pTagerIServerUserItem->GetFrozenedScore();
  11240. lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName));
  11241. //用户头像地址
  11242. lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl));
  11243. //IP地址
  11244. pUserInfoHead.dwClientAddr = pTagerIServerUserItem->GetClientAddr();
  11245. pUserInfoHead.iJiePing = pUserInfo->llJiePing;
  11246. pUserInfoHead.iXinYong = pUserInfo->iXinYong;
  11247. pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX;
  11248. pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY;
  11249. lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate));
  11250. lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi));
  11251. UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead;
  11252. UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID);
  11253. UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID);
  11254. UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID);
  11255. UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID);
  11256. UserInfoHead.set_cbgender(pUserInfoHead.cbGender);
  11257. UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder);
  11258. UserInfoHead.set_wtableid(pUserInfoHead.wTableID);
  11259. UserInfoHead.set_wchairid(pUserInfoHead.wChairID);
  11260. UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus);
  11261. UserInfoHead.set_lscore(pUserInfoHead.lScore);
  11262. UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount);
  11263. UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount);
  11264. UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount);
  11265. UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount);
  11266. UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience);
  11267. std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz;
  11268. std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz;
  11269. std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz;
  11270. std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz;
  11271. UserInfoHead.set_sznickname(szNickname);
  11272. UserInfoHead.set_szheadurl(szHeadUrl);
  11273. UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr);
  11274. UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong);
  11275. UserInfoHead.set_rettime(RetTime);
  11276. UserInfoHead.set_chengshi(ChengShi);
  11277. UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX);
  11278. UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY);
  11279. UserInfoHead.set_ijieping(pUserInfoHead.iJiePing);
  11280. //发送数据
  11281. std::string pbdata = UserInfoHead.SerializePartialAsString();
  11282. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  11283. }
  11284. if (pTableFrame) pTableFrame->PerformLookonLogin(pIServerUserItem);
  11285. return true;
  11286. }
  11287. //查询参数
  11288. //bool CAttemperEngineSink::OnTCPNetworkSubQueryExchangeInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11289. //{
  11290. // //构造结构
  11291. // //CMD_GR_ExchangeParameter ExchangeParameter;
  11292. // //ZeroMemory(&ExchangeParameter, sizeof(ExchangeParameter));
  11293. //
  11294. // ////设置变量
  11295. // //ExchangeParameter.wExchangeRate = m_pGameParameter->wExchangeRate;
  11296. //
  11297. // //WORD wBindIndex = LOWORD(dwSocketID);
  11298. // //IServerUserItem * pIBindUserItem = GetBindUserItem(wBindIndex);
  11299. //
  11300. // ////计算大小
  11301. // //DWORD dTableNum = 0;
  11302. // //if (pIBindUserItem && pIBindUserItem->GetTableID() != INVALID_TABLE)
  11303. // //{
  11304. // // auto pat = GetTableFrame(pIBindUserItem->GetTableID());
  11305. // // TCHAR szTemp[32] = { 0 };
  11306. // // if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32);
  11307. // // CString csTemp = szTemp;
  11308. //
  11309. // // if (!csTemp.IsEmpty())
  11310. // // {
  11311. // // dTableNum = _wtol(szTemp);
  11312. // // }
  11313. // //}
  11314. //
  11315. // //CString csSend;
  11316. // //CString csTest = AfxGetAppName();
  11317. //
  11318. // //csSend.Format(_T("进程【%s】【发送】 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), MDM_GR_TASK, SUB_GR_TASK_RESULT);
  11319. // ////OutputDebugString(csSend);
  11320. // //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());
  11321. //
  11322. // ////发送数据
  11323. // //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, &ExchangeParameter, sizeof(CMD_GR_ExchangeParameter));
  11324. //
  11325. // ///+++查询兑换配置列表(即:金币兑换商品列表)
  11326. // /*m_pIRecordDataBaseEngine*/m_pIKernelDataBaseEngine->PostDataBaseRequest(DBO_GP_EXCHANGE_CONFIG_LIST, dwSocketID, NULL, 0);
  11327. //
  11328. // return true;
  11329. //}
  11330. //
  11331. ////购买会员
  11332. //bool CAttemperEngineSink::OnTCPNetworkSubPurchaseMember(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11333. //{
  11334. // //参数校验
  11335. // ASSERT(wDataSize == sizeof(CMD_GR_PurchaseMember));
  11336. // if (wDataSize != sizeof(CMD_GR_PurchaseMember)) return false;
  11337. //
  11338. // //构造结构
  11339. // CMD_GR_PurchaseMember * pPurchaseMember = (CMD_GR_PurchaseMember*)pData;
  11340. // pPurchaseMember->szMachineID[CountArray(pPurchaseMember->szMachineID) - 1] = 0;
  11341. //
  11342. // //获取用户
  11343. // WORD wBindIndex = LOWORD(dwSocketID);
  11344. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11345. //
  11346. // //用户效验
  11347. // ASSERT(pIServerUserItem != NULL);
  11348. // if (pIServerUserItem == NULL) return false;
  11349. //
  11350. // //构造结构
  11351. // DBR_GR_PurchaseMember PurchaseMember;
  11352. // ZeroMemory(&PurchaseMember, sizeof(PurchaseMember));
  11353. //
  11354. // //设置变量
  11355. // PurchaseMember.dwUserID = pPurchaseMember->dwUserID;
  11356. // PurchaseMember.cbMemberOrder = pPurchaseMember->cbMemberOrder;
  11357. // PurchaseMember.wPurchaseTime = pPurchaseMember->wPurchaseTime;
  11358. // PurchaseMember.dwClientAddr = pIServerUserItem->GetClientAddr();
  11359. // lstrcpyn(PurchaseMember.szMachineID, pPurchaseMember->szMachineID, CountArray(PurchaseMember.szMachineID));
  11360. //
  11361. // CTraceService::TraceString(TEXT("购买会员已屏蔽 OnTCPNetworkSubPurchaseMember"), TraceLevel_Warning);
  11362. // //投递请求
  11363. // //m_pIDBCorrespondManager->PostDataBaseRequest(PurchaseMember.dwUserID, DBR_GR_PURCHASE_MEMBER, dwSocketID, &PurchaseMember, sizeof(PurchaseMember));
  11364. //
  11365. // return true;
  11366. //}
  11367. //
  11368. ////兑换游戏币
  11369. //bool CAttemperEngineSink::OnTCPNetworkSubExchangeScore(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11370. //{
  11371. // //参数校验
  11372. // ASSERT(wDataSize == sizeof(CMD_GR_ExchangeScore));
  11373. // if (wDataSize != sizeof(CMD_GR_ExchangeScore)) return false;
  11374. //
  11375. // //构造结构
  11376. // CMD_GR_ExchangeScore * pExchangeScore = (CMD_GR_ExchangeScore*)pData;
  11377. // pExchangeScore->szMachineID[CountArray(pExchangeScore->szMachineID) - 1] = 0;
  11378. //
  11379. // //获取用户
  11380. // WORD wBindIndex = LOWORD(dwSocketID);
  11381. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11382. //
  11383. // //用户效验
  11384. // ASSERT(pIServerUserItem != NULL);
  11385. // if (pIServerUserItem == NULL) return false;
  11386. //
  11387. // //构造结构
  11388. // DBR_GR_ExchangeScore ExchangeScore;
  11389. // ZeroMemory(&ExchangeScore, sizeof(ExchangeScore));
  11390. //
  11391. // //设置变量
  11392. // ExchangeScore.dwUserID = pExchangeScore->dwUserID;
  11393. // //ExchangeScore.lExchangeIngot = pExchangeScore->lExchangeIngot;
  11394. // ExchangeScore.dwExchangeID = pExchangeScore->dwExchangeID; //兑换ID
  11395. // ExchangeScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  11396. // lstrcpyn(ExchangeScore.szMachineID, pExchangeScore->szMachineID, CountArray(ExchangeScore.szMachineID));
  11397. // CTraceService::TraceString(TEXT("兑换游戏币已屏蔽 DBR_GR_EXCHANGE_SCORE"), TraceLevel_Warning);
  11398. // //投递请求
  11399. // //m_pIDBCorrespondManager->PostDataBaseRequest(ExchangeScore.dwUserID, DBR_GR_EXCHANGE_SCORE, dwSocketID, &ExchangeScore, sizeof(ExchangeScore));
  11400. //
  11401. // return true;
  11402. //}
  11403. //俱乐部列表
  11404. bool CAttemperEngineSink::OnTCPNetworkSubGetClubList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11405. {
  11406. Club::PB_CS_C_ClubList ClubLists;
  11407. ClubLists.ParseFromArray(pData, wDataSize);
  11408. //处理消息
  11409. CMD_GR_ClubList pClubList;
  11410. ZeroMemory(&pClubList, sizeof(pClubList));
  11411. pClubList.wStartIndex = ClubLists.wstartindex();
  11412. pClubList.wCount = ClubLists.wcount();
  11413. //获取用户
  11414. WORD wBindIndex = LOWORD(dwSocketID);
  11415. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11416. //用户效验
  11417. ASSERT(pIServerUserItem != NULL);
  11418. if (pIServerUserItem == NULL) return false;
  11419. //构造结构
  11420. DBR_GR_ClubList ClubList;
  11421. ZeroMemory(&ClubList, sizeof(ClubList));
  11422. //设置变量
  11423. ClubList.dwUserID = pIServerUserItem->GetUserID();
  11424. ClubList.wStartIndex = pClubList.wStartIndex;
  11425. ClubList.wCount = pClubList.wCount;
  11426. //投递请求
  11427. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_LIST, dwSocketID, &ClubList, sizeof(ClubList));
  11428. }
  11429. //俱乐部会员
  11430. bool CAttemperEngineSink::OnTCPNetworkSubGetClubUser(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11431. {
  11432. //参数校验
  11433. ASSERT(wDataSize == sizeof(CMD_GR_ClubUser));
  11434. if (wDataSize != sizeof(CMD_GR_ClubUser)) return false;
  11435. //构造结构
  11436. CMD_GR_ClubUser * pClubUser = (CMD_GR_ClubUser*)pData;
  11437. if (pClubUser == NULL) return false;
  11438. //获取用户
  11439. WORD wBindIndex = LOWORD(dwSocketID);
  11440. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11441. //用户效验
  11442. ASSERT(pIServerUserItem != NULL);
  11443. if (pIServerUserItem == NULL) return false;
  11444. //构造结构
  11445. DBR_GR_ClubUser ClubUser;
  11446. ZeroMemory(&ClubUser, sizeof(ClubUser));
  11447. //设置变量
  11448. ClubUser.dwUserID = pIServerUserItem->GetUserID();
  11449. ClubUser.dwClubID = pClubUser->dwClubID;
  11450. ClubUser.wStartIndex = pClubUser->wStartIndex;
  11451. ClubUser.wCount = pClubUser->wCount;
  11452. //投递请求
  11453. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER, dwSocketID, &ClubUser, sizeof(ClubUser));
  11454. }
  11455. //俱乐部会员(在线)
  11456. bool CAttemperEngineSink::OnTCPNetworkSubGetClubUserEx(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11457. {
  11458. Club::PB_CS_C_ClubUser User;
  11459. User.ParseFromArray(pData, wDataSize);
  11460. //处理消息
  11461. CMD_GR_ClubUser pClubUser;
  11462. ZeroMemory(&pClubUser, sizeof(pClubUser));
  11463. pClubUser.dwClubID = User.dwclubid();
  11464. pClubUser.wStartIndex = User.wstartindex();
  11465. pClubUser.wCount = User.wcount();
  11466. //获取用户
  11467. WORD wBindIndex = LOWORD(dwSocketID);
  11468. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11469. //用户效验
  11470. ASSERT(pIServerUserItem != NULL);
  11471. if (pIServerUserItem == NULL) return false;
  11472. //构造结构
  11473. DBR_GR_ClubUser ClubUser;
  11474. ZeroMemory(&ClubUser, sizeof(ClubUser));
  11475. //设置变量
  11476. ClubUser.dwUserID = pIServerUserItem->GetUserID();
  11477. ClubUser.dwClubID = pClubUser.dwClubID;
  11478. ClubUser.wStartIndex = pClubUser.wStartIndex;
  11479. ClubUser.wCount = pClubUser.wCount;
  11480. //投递请求
  11481. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER_EX, dwSocketID, &ClubUser, sizeof(ClubUser));
  11482. }
  11483. //俱乐部消息
  11484. bool CAttemperEngineSink::OnTCPNetworkSubGetClubMessage(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11485. {
  11486. Club::PB_CS_C_ClubMessage Message;
  11487. Message.ParseFromArray(pData, wDataSize);
  11488. //处理消息
  11489. CMD_GR_ClubMessage pClubMessage;
  11490. ZeroMemory(&pClubMessage, sizeof(pClubMessage));
  11491. pClubMessage.wStartIndex = Message.wstartindex();
  11492. pClubMessage.wCount = Message.wcount();
  11493. //获取用户
  11494. WORD wBindIndex = LOWORD(dwSocketID);
  11495. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11496. //用户效验
  11497. ASSERT(pIServerUserItem != NULL);
  11498. if (pIServerUserItem == NULL) return false;
  11499. //构造结构
  11500. DBR_GR_ClubMessage ClubMessage;
  11501. ZeroMemory(&ClubMessage, sizeof(ClubMessage));
  11502. //设置变量
  11503. ClubMessage.dwUserID = pIServerUserItem->GetUserID();
  11504. ClubMessage.wStartIndex = pClubMessage.wStartIndex;
  11505. ClubMessage.wCount = pClubMessage.wCount;
  11506. //投递请求
  11507. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MESSAGE, dwSocketID, &ClubMessage, sizeof(ClubMessage));
  11508. }
  11509. //俱乐部记录
  11510. bool CAttemperEngineSink::OnTCPNetworkSubGetClubRecord(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11511. {
  11512. Club::PB_CS_C_ClubRecord Record;
  11513. Record.ParseFromArray(pData, wDataSize);
  11514. //处理消息
  11515. CMD_GR_ClubRecord pClubRecord;
  11516. ZeroMemory(&pClubRecord, sizeof(pClubRecord));
  11517. pClubRecord.dwClubID = Record.dwclubid();
  11518. pClubRecord.wStartIndex = Record.wstartindex();
  11519. pClubRecord.wCount = Record.wcount();
  11520. pClubRecord.dtStartTime = Record.dtstarttime();
  11521. pClubRecord.dwPrivatetable = Record.dwprivatetable();
  11522. //获取用户
  11523. WORD wBindIndex = LOWORD(dwSocketID);
  11524. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11525. //用户效验
  11526. ASSERT(pIServerUserItem != NULL);
  11527. if (pIServerUserItem == NULL) return false;
  11528. //构造结构
  11529. DBR_GR_ClubRecordRead ClubRecord;
  11530. ZeroMemory(&ClubRecord, sizeof(ClubRecord));
  11531. //设置变量
  11532. ClubRecord.dwUserID = pIServerUserItem->GetUserID();
  11533. ClubRecord.dwClubID = pClubRecord.dwClubID;
  11534. ClubRecord.wStartIndex = pClubRecord.wStartIndex;
  11535. ClubRecord.wCount = pClubRecord.wCount;
  11536. ClubRecord.dtStartTime = pClubRecord.dtStartTime;
  11537. ClubRecord.dwPrivateTable = pClubRecord.dwPrivatetable;
  11538. //投递请求
  11539. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_RECORD_EX, dwSocketID, &ClubRecord, sizeof(ClubRecord));
  11540. }
  11541. //俱乐部创建
  11542. bool CAttemperEngineSink::OnTCPNetworkSubCreateClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11543. {
  11544. OutputDebugStringA("创建俱乐部");
  11545. Club::PB_CS_C_ClubInfo ClubInfo;
  11546. ClubInfo.ParseFromArray(pData, wDataSize);
  11547. CString szclubname = (CA2CTEX<2048>(ClubInfo.szclubname().c_str(), CP_UTF8)).m_szBuffer;
  11548. CString szhostname = (CA2CTEX<2048>(ClubInfo.szhostname().c_str(), CP_UTF8)).m_szBuffer;
  11549. CString szheadurl = (CA2CTEX<2048>(ClubInfo.szheadurl().c_str(), CP_UTF8)).m_szBuffer;
  11550. CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.csgameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  11551. //处理消息
  11552. CMD_S_ClubInfo pClubInfo;
  11553. ZeroMemory(&pClubInfo, sizeof(pClubInfo));
  11554. pClubInfo.dwClubID = ClubInfo.dwclubid();
  11555. _sntprintf(pClubInfo.szClubName, CountArray(pClubInfo.szClubName), TEXT("%s"), szclubname);
  11556. pClubInfo.cbIsOwner = ClubInfo.cbisowner();
  11557. pClubInfo.wTotalNum = ClubInfo.wtotalnum();
  11558. pClubInfo.wWaitTableNum = ClubInfo.wwaittablenum();
  11559. pClubInfo.wOnLineNum = ClubInfo.wonlinenum();
  11560. pClubInfo.wWaitUserNum = ClubInfo.wwaitusernum();
  11561. pClubInfo.dwOwnerID = ClubInfo.dwownerid();
  11562. _sntprintf(pClubInfo.szHostName, CountArray(pClubInfo.szHostName), TEXT("%s"), szhostname);
  11563. _sntprintf(pClubInfo.szHeadUrl, CountArray(pClubInfo.szHeadUrl), TEXT("%s"), szheadurl);
  11564. pClubInfo.temp1 = ClubInfo.temp1();
  11565. pClubInfo.temp2 = ClubInfo.temp2();
  11566. pClubInfo.temp3 = ClubInfo.temp3();
  11567. pClubInfo.temp4 = ClubInfo.temp4();
  11568. pClubInfo.csGameConfig.wSubGameID = ClubInfo.csgameconfig().wsubgameid();
  11569. pClubInfo.csGameConfig.wPlayRule = ClubInfo.csgameconfig().wplayrule();
  11570. pClubInfo.csGameConfig.wMaxFanRule = ClubInfo.csgameconfig().wmaxfanrule();
  11571. pClubInfo.csGameConfig.wMaxScore = ClubInfo.csgameconfig().wmaxscore();
  11572. pClubInfo.csGameConfig.wPlayCountRule = ClubInfo.csgameconfig().wplaycountrule();
  11573. pClubInfo.csGameConfig.wHadPlayCount = ClubInfo.csgameconfig().whadplaycount();
  11574. pClubInfo.csGameConfig.zmExtraRule = ClubInfo.csgameconfig().zmextrarule();
  11575. pClubInfo.csGameConfig.dghRule = ClubInfo.csgameconfig().dghrule();
  11576. _sntprintf(pClubInfo.csGameConfig.sPrivateTableID, CountArray(pClubInfo.csGameConfig.sPrivateTableID), TEXT("%s"), sprivatetableid);
  11577. pClubInfo.csGameConfig.bDuoLai = ClubInfo.csgameconfig().bduolai();
  11578. pClubInfo.csGameConfig.wFengDing = ClubInfo.csgameconfig().wfengding();
  11579. pClubInfo.csGameConfig.tmp1 = ClubInfo.csgameconfig().tmp1();
  11580. pClubInfo.csGameConfig.tmp2 = ClubInfo.csgameconfig().tmp2();
  11581. pClubInfo.csGameConfig.tmp3 = ClubInfo.csgameconfig().tmp3();
  11582. pClubInfo.csGameConfig.tmp4 = ClubInfo.csgameconfig().tmp4();
  11583. pClubInfo.csGameConfig.tmp5 = ClubInfo.csgameconfig().tmp5();
  11584. //获取用户
  11585. WORD wBindIndex = LOWORD(dwSocketID);
  11586. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11587. //用户效验
  11588. ASSERT(pIServerUserItem != NULL);
  11589. if (pIServerUserItem == NULL) return false;
  11590. //构造数据
  11591. DBR_GR_ClubAction1 ClubAction1;
  11592. ZeroMemory(&ClubAction1, sizeof(ClubAction1));
  11593. ClubAction1.dwUserID = pIServerUserItem->GetUserID();
  11594. ClubAction1.ClubInfo = pClubInfo;
  11595. //投递请求
  11596. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_CREATE, dwSocketID, &ClubAction1, sizeof(ClubAction1));
  11597. }
  11598. //俱乐部修改
  11599. bool CAttemperEngineSink::OnTCPNetworkSubUpdateAddClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11600. {
  11601. Club::PB_CS_C_ClubAutoAddInfo ClubInfo;
  11602. ClubInfo.ParseFromArray(pData, wDataSize);
  11603. //处理消息
  11604. CMD_S_ClubAutoAddInfo pClubInfo;
  11605. ZeroMemory(&pClubInfo, sizeof(pClubInfo));
  11606. pClubInfo.dwClubID = ClubInfo.dwclubid();
  11607. pClubInfo.cbWanfaId = ClubInfo.cbwanfaid();
  11608. pClubInfo.cbStatus = ClubInfo.cbstatus();
  11609. pClubInfo.gameconfig.wSubGameID = ClubInfo.gameconfig().wsubgameid();
  11610. pClubInfo.gameconfig.wPlayRule = ClubInfo.gameconfig().wplayrule();
  11611. pClubInfo.gameconfig.wMaxFanRule = ClubInfo.gameconfig().wmaxfanrule();
  11612. pClubInfo.gameconfig.wMaxScore = ClubInfo.gameconfig().wmaxscore();
  11613. pClubInfo.gameconfig.wPlayCountRule = ClubInfo.gameconfig().wplaycountrule();
  11614. pClubInfo.gameconfig.wHadPlayCount = ClubInfo.gameconfig().whadplaycount();
  11615. pClubInfo.gameconfig.zmExtraRule = ClubInfo.gameconfig().zmextrarule();
  11616. pClubInfo.gameconfig.dghRule = ClubInfo.gameconfig().dghrule();
  11617. CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.gameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  11618. _sntprintf(pClubInfo.gameconfig.sPrivateTableID, CountArray(pClubInfo.gameconfig.sPrivateTableID), TEXT("%s"), sprivatetableid);
  11619. pClubInfo.gameconfig.bDuoLai = ClubInfo.gameconfig().bduolai();
  11620. pClubInfo.gameconfig.wFengDing = ClubInfo.gameconfig().wfengding();
  11621. pClubInfo.gameconfig.tmp1 = ClubInfo.gameconfig().tmp1();
  11622. pClubInfo.gameconfig.tmp2 = ClubInfo.gameconfig().tmp2();
  11623. pClubInfo.gameconfig.tmp3 = ClubInfo.gameconfig().tmp3();
  11624. pClubInfo.gameconfig.tmp4 = ClubInfo.gameconfig().tmp4();
  11625. pClubInfo.gameconfig.tmp5 = ClubInfo.gameconfig().tmp5();
  11626. //获取用户
  11627. WORD wBindIndex = LOWORD(dwSocketID);
  11628. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11629. //用户效验
  11630. ASSERT(pIServerUserItem != NULL);
  11631. if (pIServerUserItem == NULL) return false;
  11632. //构造数据
  11633. DBR_GR_ClubAddAction ClubAction1;
  11634. ZeroMemory(&ClubAction1, sizeof(ClubAction1));
  11635. ClubAction1.dwUserID = pIServerUserItem->GetUserID();
  11636. if (0 == pClubInfo.cbStatus)
  11637. {
  11638. //获取额外玩法
  11639. CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, (sizeof(CMD_S_ClubAutoAddInfo) - sizeof(tagTableConfig)));
  11640. //投递请求
  11641. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MORE_WANFA, dwSocketID, &ClubAction1, sizeof(DBR_GR_ClubAddAction));
  11642. }
  11643. else
  11644. {
  11645. if (2 == pClubInfo.cbStatus)
  11646. {
  11647. CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, (sizeof(CMD_S_ClubAutoAddInfo) - sizeof(tagTableConfig)));
  11648. }
  11649. if (1 == pClubInfo.cbStatus)
  11650. {
  11651. CopyMemory(&ClubAction1.tbAutoAddInfo, &pClubInfo, sizeof(CMD_S_ClubAutoAddInfo));
  11652. }
  11653. }
  11654. //投递请求
  11655. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_SAVE_MORE_WANFA, dwSocketID, &ClubAction1, sizeof(DBR_GR_ClubAddAction));
  11656. }
  11657. //俱乐部修改
  11658. bool CAttemperEngineSink::OnTCPNetworkSubUpdateClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11659. {
  11660. Club::PB_CS_C_ClubInfo ClubInfo;
  11661. ClubInfo.ParseFromArray(pData, wDataSize);
  11662. CString szclubname = (CA2CTEX<2048>(ClubInfo.szclubname().c_str(), CP_UTF8)).m_szBuffer;
  11663. CString szhostname = (CA2CTEX<2048>(ClubInfo.szhostname().c_str(), CP_UTF8)).m_szBuffer;
  11664. CString szheadurl = (CA2CTEX<2048>(ClubInfo.szheadurl().c_str(), CP_UTF8)).m_szBuffer;
  11665. CString sprivatetableid = (CA2CTEX<2048>(ClubInfo.csgameconfig().sprivatetableid().c_str(), CP_UTF8)).m_szBuffer;
  11666. //处理消息
  11667. CMD_S_ClubInfo pClubInfo;
  11668. ZeroMemory(&pClubInfo, sizeof(pClubInfo));
  11669. pClubInfo.dwClubID = ClubInfo.dwclubid();
  11670. _sntprintf(pClubInfo.szClubName, CountArray(pClubInfo.szClubName), TEXT("%s"), szclubname);
  11671. pClubInfo.cbIsOwner = ClubInfo.cbisowner();
  11672. pClubInfo.wTotalNum = ClubInfo.wtotalnum();
  11673. pClubInfo.wWaitTableNum = ClubInfo.wwaittablenum();
  11674. pClubInfo.wOnLineNum = ClubInfo.wonlinenum();
  11675. pClubInfo.wWaitUserNum = ClubInfo.wwaitusernum();
  11676. pClubInfo.dwOwnerID = ClubInfo.dwownerid();
  11677. _sntprintf(pClubInfo.szHostName, CountArray(pClubInfo.szHostName), TEXT("%s"), szhostname);
  11678. _sntprintf(pClubInfo.szHeadUrl, CountArray(pClubInfo.szHeadUrl), TEXT("%s"), szheadurl);
  11679. pClubInfo.temp1 = ClubInfo.temp1();
  11680. pClubInfo.temp2 = ClubInfo.temp2();
  11681. pClubInfo.temp3 = ClubInfo.temp3();
  11682. pClubInfo.temp4 = ClubInfo.temp4();
  11683. pClubInfo.csGameConfig.wSubGameID = ClubInfo.csgameconfig().wsubgameid();
  11684. pClubInfo.csGameConfig.wPlayRule = ClubInfo.csgameconfig().wplayrule();
  11685. pClubInfo.csGameConfig.wMaxFanRule = ClubInfo.csgameconfig().wmaxfanrule();
  11686. pClubInfo.csGameConfig.wMaxScore = ClubInfo.csgameconfig().wmaxscore();
  11687. pClubInfo.csGameConfig.wPlayCountRule = ClubInfo.csgameconfig().wplaycountrule();
  11688. pClubInfo.csGameConfig.wHadPlayCount = ClubInfo.csgameconfig().whadplaycount();
  11689. pClubInfo.csGameConfig.zmExtraRule = ClubInfo.csgameconfig().zmextrarule();
  11690. pClubInfo.csGameConfig.dghRule = ClubInfo.csgameconfig().dghrule();
  11691. _sntprintf(pClubInfo.csGameConfig.sPrivateTableID, CountArray(pClubInfo.csGameConfig.sPrivateTableID), TEXT("%s"), sprivatetableid);
  11692. pClubInfo.csGameConfig.bDuoLai = ClubInfo.csgameconfig().bduolai();
  11693. pClubInfo.csGameConfig.wFengDing = ClubInfo.csgameconfig().wfengding();
  11694. pClubInfo.csGameConfig.tmp1 = ClubInfo.csgameconfig().tmp1();
  11695. pClubInfo.csGameConfig.tmp2 = ClubInfo.csgameconfig().tmp2();
  11696. pClubInfo.csGameConfig.tmp3 = ClubInfo.csgameconfig().tmp3();
  11697. pClubInfo.csGameConfig.tmp4 = ClubInfo.csgameconfig().tmp4();
  11698. pClubInfo.csGameConfig.tmp5 = ClubInfo.csgameconfig().tmp5();
  11699. //获取用户
  11700. WORD wBindIndex = LOWORD(dwSocketID);
  11701. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11702. //用户效验
  11703. ASSERT(pIServerUserItem != NULL);
  11704. if (pIServerUserItem == NULL) return false;
  11705. //构造数据
  11706. DBR_GR_ClubAction1 ClubAction1;
  11707. ZeroMemory(&ClubAction1, sizeof(ClubAction1));
  11708. ClubAction1.dwUserID = pIServerUserItem->GetUserID();
  11709. ClubAction1.ClubInfo = pClubInfo;
  11710. //投递请求
  11711. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_UPDATE, dwSocketID, &ClubAction1, sizeof(ClubAction1));
  11712. }
  11713. //俱乐部删除
  11714. bool CAttemperEngineSink::OnTCPNetworkSubDeleteClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11715. {
  11716. Club::PB_CS_C_Club_Action1 ClubAction;
  11717. ClubAction.ParseFromArray(pData, wDataSize);
  11718. //处理消息
  11719. CMD_GR_Club_Action1 pClubID;
  11720. ZeroMemory(&pClubID, sizeof(pClubID));
  11721. pClubID.dwClubID = ClubAction.dwclubid();
  11722. //获取用户
  11723. WORD wBindIndex = LOWORD(dwSocketID);
  11724. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11725. //用户效验
  11726. ASSERT(pIServerUserItem != NULL);
  11727. if (pIServerUserItem == NULL) return false;
  11728. //构造数据
  11729. DBR_GR_ClubAction2 ClubAction2;
  11730. ZeroMemory(&ClubAction2, sizeof(ClubAction2));
  11731. ClubAction2.dwUserID = pIServerUserItem->GetUserID();
  11732. ClubAction2.dwClubID = pClubID.dwClubID;
  11733. //投递请求
  11734. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_DELETE, dwSocketID, &ClubAction2, sizeof(ClubAction2));
  11735. }
  11736. //俱乐部获取
  11737. bool CAttemperEngineSink::OnTCPNetworkSubGetClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11738. {
  11739. Club::PB_CS_C_Club_Action1 ClubAction;
  11740. ClubAction.ParseFromArray(pData, wDataSize);
  11741. //处理消息
  11742. CMD_GR_Club_Action1 pClubID;
  11743. ZeroMemory(&pClubID, sizeof(pClubID));
  11744. pClubID.dwClubID = ClubAction.dwclubid();
  11745. //获取用户
  11746. WORD wBindIndex = LOWORD(dwSocketID);
  11747. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11748. //用户效验
  11749. ASSERT(pIServerUserItem != NULL);
  11750. if (pIServerUserItem == NULL) return false;
  11751. //构造数据
  11752. DBR_GR_ClubAction2 ClubAction2;
  11753. ZeroMemory(&ClubAction2, sizeof(ClubAction2));
  11754. ClubAction2.dwUserID = pIServerUserItem->GetUserID();
  11755. ClubAction2.dwClubID = pClubID.dwClubID;
  11756. //投递请求
  11757. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, dwSocketID, &ClubAction2, sizeof(ClubAction2));
  11758. }
  11759. //俱乐部加入
  11760. bool CAttemperEngineSink::OnTCPNetworkSubJoinClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11761. {
  11762. Club::PB_CS_C_Club_Action1 ClubAction;
  11763. ClubAction.ParseFromArray(pData, wDataSize);
  11764. //处理消息
  11765. CMD_GR_Club_Action1 pClubID;
  11766. ZeroMemory(&pClubID, sizeof(pClubID));
  11767. pClubID.dwClubID = ClubAction.dwclubid();
  11768. //获取用户
  11769. WORD wBindIndex = LOWORD(dwSocketID);
  11770. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11771. //用户效验
  11772. ASSERT(pIServerUserItem != NULL);
  11773. if (pIServerUserItem == NULL) return false;
  11774. //构造数据
  11775. DBR_GR_ClubAction2 ClubAction2;
  11776. ZeroMemory(&ClubAction2, sizeof(ClubAction2));
  11777. ClubAction2.dwUserID = pIServerUserItem->GetUserID();
  11778. ClubAction2.dwClubID = pClubID.dwClubID;
  11779. //投递请求
  11780. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_JOIN, dwSocketID, &ClubAction2, sizeof(ClubAction2));
  11781. }
  11782. //俱乐部退出
  11783. bool CAttemperEngineSink::OnTCPNetworkSubQuitClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11784. {
  11785. Club::PB_CS_C_Club_Action1 ClubAction;
  11786. ClubAction.ParseFromArray(pData, wDataSize);
  11787. //处理消息
  11788. CMD_GR_Club_Action1 pClubID;
  11789. ZeroMemory(&pClubID, sizeof(pClubID));
  11790. pClubID.dwClubID = ClubAction.dwclubid();
  11791. //获取用户
  11792. WORD wBindIndex = LOWORD(dwSocketID);
  11793. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11794. //用户效验
  11795. ASSERT(pIServerUserItem != NULL);
  11796. if (pIServerUserItem == NULL) return false;
  11797. //构造数据
  11798. DBR_GR_ClubAction2 ClubAction2;
  11799. ZeroMemory(&ClubAction2, sizeof(ClubAction2));
  11800. ClubAction2.dwUserID = pIServerUserItem->GetUserID();
  11801. ClubAction2.dwClubID = pClubID.dwClubID;
  11802. //投递请求
  11803. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_QUIT, dwSocketID, &ClubAction2, sizeof(ClubAction2));
  11804. }
  11805. //俱乐同意加入
  11806. bool CAttemperEngineSink::OnTCPNetworkSubAgreeClub(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11807. {
  11808. Club::PB_CS_C_Club_Action2 ClubAction;
  11809. ClubAction.ParseFromArray(pData, wDataSize);
  11810. //处理消息
  11811. CMD_GR_Club_Action2 pAction2;
  11812. ZeroMemory(&pAction2, sizeof(pAction2));
  11813. pAction2.dwClubID = ClubAction.dwclubid();
  11814. pAction2.dwUserID = ClubAction.dwuserid();
  11815. pAction2.cbIsAgree = ClubAction.cbisagree();
  11816. //获取用户
  11817. WORD wBindIndex = LOWORD(dwSocketID);
  11818. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11819. DBR_GR_ClubAction3 ClubAction3;
  11820. ZeroMemory(&ClubAction3, sizeof(ClubAction3));
  11821. ClubAction3.Agree = pAction2.cbIsAgree;
  11822. ClubAction3.dwCurrentID = pIServerUserItem->GetUserID();
  11823. ClubAction3.dwClubID = pAction2.dwClubID;
  11824. ClubAction3.dwUserID = pAction2.dwUserID;
  11825. //用户效验
  11826. ASSERT(pIServerUserItem != NULL);
  11827. if (pIServerUserItem == NULL) return false;
  11828. //投递请求
  11829. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_ISAGREE, dwSocketID, &ClubAction3, sizeof(ClubAction3));
  11830. }
  11831. //俱乐部在线信息
  11832. //bool CAttemperEngineSink::OnTCPNetworkSubGetClubOnLine(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11833. //{
  11834. // //参数校验
  11835. // ASSERT(wDataSize == sizeof(CMD_GR_ClubOnLine));
  11836. // if (wDataSize != sizeof(CMD_GR_ClubOnLine)) return false;
  11837. //
  11838. // //构造结构
  11839. // CMD_GR_ClubOnLine * pClubOnLine = (CMD_GR_ClubOnLine*)pData;
  11840. // if (pClubOnLine == NULL) return false;
  11841. //
  11842. // //获取用户
  11843. // WORD wBindIndex = LOWORD(dwSocketID);
  11844. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11845. //
  11846. // //用户效验
  11847. // ASSERT(pIServerUserItem != NULL);
  11848. // if (pIServerUserItem == NULL) return false;
  11849. //
  11850. // //构造数据
  11851. // DBR_GR_ClubOnLineRq ClubOnLine;
  11852. // ZeroMemory(&ClubOnLine, sizeof(ClubOnLine));
  11853. //
  11854. // ClubOnLine.dwUserID= pIServerUserItem->GetUserID();
  11855. // ClubOnLine.dwClubID = pClubOnLine->dwClubID;
  11856. // ClubOnLine.wStartIndex = pClubOnLine->wStartIndex;
  11857. // ClubOnLine.wCount = pClubOnLine->wCount;
  11858. //
  11859. // //投递请求
  11860. // return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_ONLINE, dwSocketID, &ClubOnLine, sizeof(DBR_GR_ClubOnLineRq));
  11861. //}
  11862. //升序
  11863. bool LessSort(const JN_GR_RoomListBig a, const JN_GR_RoomListBig b){
  11864. return a.dwReadyBody<b.dwReadyBody;
  11865. }
  11866. //俱乐部在线信息
  11867. bool CAttemperEngineSink::OnTCPNetworkSubGetClubOnLineEx(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  11868. {
  11869. Club::PB_CS_C_ClubOnLineEx ClubOnLine;
  11870. ClubOnLine.ParseFromArray(pData, wDataSize);
  11871. //处理消息
  11872. CMD_GR_ClubOnLineEx pClubOnLine;
  11873. ZeroMemory(&pClubOnLine, sizeof(pClubOnLine));
  11874. pClubOnLine.dwClubID = ClubOnLine.dwclubid();
  11875. pClubOnLine.wStartIndex = ClubOnLine.wstartindex();
  11876. pClubOnLine.wCount = ClubOnLine.wcount();
  11877. pClubOnLine.cbType = ClubOnLine.cbtype();
  11878. //获取用户
  11879. WORD wBindIndex = LOWORD(dwSocketID);
  11880. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  11881. //用户效验
  11882. ASSERT(pIServerUserItem != NULL);
  11883. if (pIServerUserItem == NULL) return false;
  11884. //返回数据
  11885. CMD_GR_ClubOnLine_AckEx ClubOnLineAck;
  11886. ZeroMemory(&ClubOnLineAck, sizeof(ClubOnLineAck));
  11887. ClubOnLineAck.dwClubID = pClubOnLine.dwClubID;
  11888. //全局查找
  11889. {
  11890. CWHDataLocker DataLocker(m_CriticalSection);
  11891. std::vector<JN_GR_RoomListBig> ve;
  11892. std::vector<JN_GR_RoomListBig> veGameing;
  11893. std::vector<JN_GR_RoomListBig> veGame;
  11894. JN_GR_RoomListBig Rooms;
  11895. ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig));
  11896. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it2 = m_PrivateRoomAll.begin();
  11897. while (it2 != m_PrivateRoomAll.end())
  11898. {
  11899. ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig));
  11900. Rooms = it2->second;
  11901. if (Rooms.roomType == 1 && Rooms.tmp6[0] == pClubOnLine.dwClubID)
  11902. {
  11903. if (0 == Rooms.roomStatus)
  11904. {
  11905. veGame.push_back(Rooms);
  11906. }
  11907. else
  11908. {
  11909. veGameing.push_back(Rooms);
  11910. }
  11911. }
  11912. it2++;
  11913. }
  11914. //合并 等待状态 和 游戏状态
  11915. ve.insert(ve.end(), veGame.begin(), veGame.end());
  11916. ve.insert(ve.end(), veGameing.begin(), veGameing.end());
  11917. CTimer Start;
  11918. double dRet = Start.End();
  11919. if (IsJC(110))
  11920. {
  11921. CString csTest;
  11922. csTest.Format(_T("协议(3-437) 俱乐部房间排序 ----> %.3f wtotalTableNum=%d"), dRet, ClubOnLineAck.wtotalTableNum);
  11923. //提示消息
  11924. CTraceService::TraceString(csTest, TraceLevel_Normal);
  11925. }
  11926. std::vector<JN_GR_RoomListBig>::iterator iter;
  11927. for (iter = ve.begin(); iter != ve.end(); iter++)
  11928. {
  11929. ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig));
  11930. Rooms = *iter;
  11931. //版本控制
  11932. TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  11933. memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  11934. del_char(szMachineID, L'.');
  11935. __int64 iMachineID = StrToNmuber(szMachineID);
  11936. //最低要求的版本号
  11937. TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 };
  11938. memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer));
  11939. del_char(szMinClientVer, L'.');
  11940. __int64 iMinClientVer = StrToNmuber(szMinClientVer);
  11941. /*if (iMachineID < iMinClientVer && ((Rooms.bWanFa == 14 || Rooms.tmp1==2)))
  11942. {
  11943. TCHAR szString[512] = { 0 };
  11944. _sntprintf(szString, CountArray(szString), TEXT("版本不匹配:用户ID不匹配[ RoomInfo.bDuoLai=%ld,RoomInfo.bWanFa=%ld,RoomInfo.wFengDing = %ld ]"), Rooms.bDuoLai, Rooms.bWanFa, Rooms.wFengDing);
  11945. CTraceService::TraceString(szString, TraceLevel_Warning);
  11946. continue;
  11947. }*/
  11948. if (IsJC(110))
  11949. {
  11950. CString csArr;
  11951. csArr.Format(L"dwRoomNumber=%d ", Rooms.dwRoomNumber);
  11952. CTraceService::TraceString(csArr, TraceLevel_Normal);
  11953. }
  11954. //全部
  11955. if (pClubOnLine.cbType == 0)
  11956. {
  11957. ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber;
  11958. }
  11959. //缺一人
  11960. if (pClubOnLine.cbType == 1 && Rooms.roomStatus == 0 && Rooms.dwBody - Rooms.dwReadyBody == 1)
  11961. {
  11962. ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber;
  11963. }
  11964. //等待中
  11965. if (pClubOnLine.cbType == 2 && Rooms.roomStatus == 0)
  11966. {
  11967. ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber;
  11968. }
  11969. //游戏中
  11970. if (pClubOnLine.cbType == 3 && Rooms.roomStatus == 1)
  11971. {
  11972. ClubOnLineAck.tableID[ClubOnLineAck.wtotalTableNum++] = Rooms.dwRoomNumber;
  11973. }
  11974. //共同数据
  11975. if (Rooms.roomStatus == 0)
  11976. {
  11977. ClubOnLineAck.wWaitTableNum++;
  11978. }
  11979. if (Rooms.roomStatus == 1)
  11980. {
  11981. ClubOnLineAck.wPlayTableNmu++;
  11982. }
  11983. if (Rooms.roomStatus == 0 && Rooms.dwBody - Rooms.dwReadyBody == 1)
  11984. {
  11985. ClubOnLineAck.wQueTableNum++;
  11986. }
  11987. }
  11988. }
  11989. Club::PB_CS_S_ClubOnLine_AckEx ClubActionACK;
  11990. ClubActionACK.set_dwclubid(ClubOnLineAck.dwClubID);
  11991. ClubActionACK.set_wquetablenum(ClubOnLineAck.wQueTableNum);
  11992. ClubActionACK.set_wwaittablenum(ClubOnLineAck.wWaitTableNum);
  11993. ClubActionACK.set_wplaytablenmu(ClubOnLineAck.wPlayTableNmu);
  11994. ClubActionACK.set_temp(ClubOnLineAck.temp);
  11995. ClubActionACK.set_wtotaltablenum(ClubOnLineAck.wtotalTableNum);
  11996. for (WORD i = 0; i < ClubOnLineAck.wtotalTableNum; i++)
  11997. {
  11998. ClubActionACK.add_tableid(ClubOnLineAck.tableID[i]);
  11999. }
  12000. //发送数据
  12001. std::string pbdata = ClubActionACK.SerializePartialAsString();
  12002. SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_ACK_EX, (void*)pbdata.c_str(), pbdata.length());
  12003. //触发向客户端更新桌子总数,在线人数,俱乐部总人数,新消息数(待优化)
  12004. {
  12005. DBR_GR_ClubAction2 clubAction2;
  12006. ZeroMemory(&clubAction2, sizeof(clubAction2));
  12007. clubAction2.dwClubID = pClubOnLine.dwClubID;
  12008. clubAction2.dwUserID = pIServerUserItem->GetUserID();
  12009. //投递请求
  12010. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_ONLINEEX, dwSocketID, &clubAction2, sizeof(clubAction2));
  12011. }
  12012. }
  12013. //俱乐部在线桌子信息
  12014. bool CAttemperEngineSink::OnTCPNetworkSubGetClubTable(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12015. {
  12016. Club::PB_CS_C_ClubOnLineTable OnLineTable;
  12017. OnLineTable.ParseFromArray(pData, wDataSize);
  12018. //处理消息
  12019. CMD_GR_ClubOnLineTable pClubOnLineTable;
  12020. ZeroMemory(&pClubOnLineTable, sizeof(pClubOnLineTable));
  12021. pClubOnLineTable.dwClubID = OnLineTable.dwclubid();
  12022. pClubOnLineTable.dwTableID = OnLineTable.dwtableid();
  12023. pClubOnLineTable.cbType = OnLineTable.cbtype();
  12024. //获取用户
  12025. WORD wBindIndex = LOWORD(dwSocketID);
  12026. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12027. //用户效验
  12028. ASSERT(pIServerUserItem != NULL);
  12029. if (pIServerUserItem == NULL) return false;
  12030. //获取桌子配置
  12031. if (pClubOnLineTable.cbType == 0)
  12032. {
  12033. //返回数据
  12034. CMD_GR_ClubOnLineTableCfAck ClubOnLineTableCfAck;
  12035. ZeroMemory(&ClubOnLineTableCfAck, sizeof(ClubOnLineTableCfAck));
  12036. {
  12037. CWHDataLocker DataLocker(m_CriticalSection);
  12038. auto iter = m_PrivateRoomAll.find(pClubOnLineTable.dwTableID);
  12039. if (iter != m_PrivateRoomAll.end())
  12040. {
  12041. JN_GR_RoomListBig Temp;
  12042. ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  12043. Temp = iter->second;
  12044. JN_GR_RoomListInfo RoomInfo;
  12045. ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo));
  12046. RoomInfo.dwDiFen = Temp.dwDiFen;
  12047. RoomInfo.dwJuShu = Temp.dwJuShu;
  12048. RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay;
  12049. RoomInfo.dwRoomNumber = Temp.dwRoomNumber;
  12050. RoomInfo.dwServerID = Temp.dwServerID;
  12051. RoomInfo.bFanGua = Temp.bFanGua;
  12052. RoomInfo.bWanFa = Temp.bWanFa;
  12053. RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以
  12054. RoomInfo.wFengDing = Temp.wFengDing; //封顶值
  12055. RoomInfo.tmp1 = Temp.tmp1; //备用字段
  12056. RoomInfo.tmp2 = Temp.tmp2; //备用字段
  12057. StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName); //房间名称
  12058. StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), Temp.szIp); //房间ip
  12059. RoomInfo.wPort = Temp.wPort; //房间端口
  12060. CopyMemory(&(ClubOnLineTableCfAck.Room), &RoomInfo, sizeof(RoomInfo));
  12061. ClubOnLineTableCfAck.dwTableID = pClubOnLineTable.dwTableID;
  12062. Club::PB_CS_S_ClubOnLineTableCfAck OnLineTableCfAck;
  12063. OnLineTableCfAck.set_dwtableid(ClubOnLineTableCfAck.dwTableID);
  12064. std::string szName = CW2AEX<1024>(ClubOnLineTableCfAck.Room.szName, CP_UTF8).m_psz;
  12065. std::string szIp = CW2AEX<1024>(ClubOnLineTableCfAck.Room.szIp, CP_UTF8).m_psz;
  12066. OnLineTableCfAck.mutable_room()->set_szname(szName);
  12067. OnLineTableCfAck.mutable_room()->set_dwserverid(ClubOnLineTableCfAck.Room.dwServerID);
  12068. OnLineTableCfAck.mutable_room()->set_szip(szIp);
  12069. OnLineTableCfAck.mutable_room()->set_bduolai(ClubOnLineTableCfAck.Room.bDuoLai);
  12070. OnLineTableCfAck.mutable_room()->set_wfengding(ClubOnLineTableCfAck.Room.wFengDing);
  12071. OnLineTableCfAck.mutable_room()->set_tmp1(ClubOnLineTableCfAck.Room.tmp1);
  12072. OnLineTableCfAck.mutable_room()->set_tmp2(ClubOnLineTableCfAck.Room.tmp2);
  12073. for (WORD i = 0; i < 4; i++)
  12074. {
  12075. OnLineTableCfAck.mutable_room()->add_tmp6(ClubOnLineTableCfAck.Room.tmp6[i]);
  12076. }
  12077. OnLineTableCfAck.mutable_room()->set_wport(ClubOnLineTableCfAck.Room.wPort);
  12078. OnLineTableCfAck.mutable_room()->set_dwroomnumber(ClubOnLineTableCfAck.Room.dwRoomNumber);
  12079. OnLineTableCfAck.mutable_room()->set_dwdifen(ClubOnLineTableCfAck.Room.dwDiFen);
  12080. OnLineTableCfAck.mutable_room()->set_dwjushu(ClubOnLineTableCfAck.Room.dwJuShu);
  12081. OnLineTableCfAck.mutable_room()->set_broomcreatepay(ClubOnLineTableCfAck.Room.bRoomCreatePay);
  12082. OnLineTableCfAck.mutable_room()->set_bfangua(ClubOnLineTableCfAck.Room.bFanGua);
  12083. OnLineTableCfAck.mutable_room()->set_bwanfa(ClubOnLineTableCfAck.Room.bWanFa);
  12084. OnLineTableCfAck.mutable_room()->set_tmp3(ClubOnLineTableCfAck.Room.tmp3);
  12085. OnLineTableCfAck.mutable_room()->set_tmp4(ClubOnLineTableCfAck.Room.tmp4);
  12086. OnLineTableCfAck.mutable_room()->set_tmp5(ClubOnLineTableCfAck.Room.tmp5);
  12087. //发送数据
  12088. std::string pbdata = OnLineTableCfAck.SerializePartialAsString();
  12089. SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLE_ACK, (void*)pbdata.c_str(), pbdata.length());
  12090. }
  12091. }
  12092. }
  12093. //桌子用户信息
  12094. if (pClubOnLineTable.cbType == 1)
  12095. {
  12096. CMD_GR_ClubOnLineTableAck OnLineTableAck;
  12097. ZeroMemory(&OnLineTableAck, sizeof(OnLineTableAck));
  12098. {
  12099. CWHDataLocker DataLocker(m_CriticalSection);
  12100. auto iter = m_PrivateRoomAll.find(pClubOnLineTable.dwTableID);
  12101. if (iter != m_PrivateRoomAll.end())
  12102. {
  12103. JN_GR_RoomListBig Temp;
  12104. ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  12105. Temp = iter->second;
  12106. OnLineTableAck.dwTableID = pClubOnLineTable.dwTableID;
  12107. OnLineTableAck.wJushu = Temp.currentjushu;
  12108. OnLineTableAck.wTableState = Temp.roomStatus;
  12109. //房主
  12110. OnLineTableAck.Userinfo[4].dwUserID = Temp.dwUserID;
  12111. CopyMemory(OnLineTableAck.Userinfo[4].szName, Temp.szName, sizeof(Temp.szName));
  12112. CopyMemory(OnLineTableAck.Userinfo[4].szHeadUrl, Temp.szHeadUrl, sizeof(Temp.szHeadUrl));
  12113. // && 0 == Temp.roomStatus
  12114. if (Temp.dwUserID == pIServerUserItem->GetUserID()&& 0<Temp.currentjushu&&Temp.dwBody > Temp.dwReadyBody)
  12115. {
  12116. TCHAR szString[512] = TEXT("");
  12117. _sntprintf(szString, CountArray(szString), TEXT("userid=%d [%d]已经开始游戏,但检测少人了(%d>%d),当前局数:%d"), pIServerUserItem->GetUserID(),Temp.dwRoomNumber, Temp.dwBody, Temp.dwReadyBody, Temp.currentjushu);
  12118. CTraceService::TraceString(szString, TraceLevel_Warning);
  12119. bool bIsUserNull = false;
  12120. for (int i = 0; i < Temp.dwBody; i++){
  12121. if (0 == Temp.player[i].dwUserID)
  12122. {
  12123. bIsUserNull = true;
  12124. //将少人的数据补上
  12125. std::shared_ptr<CTableFrame> pTableFrame;
  12126. CString csTest;
  12127. csTest.Format(_T("%d"), Temp.dwRoomNumber);
  12128. std::wstring str = csTest.GetBuffer();
  12129. csTest.ReleaseBuffer();
  12130. pTableFrame = GetPriTableFrame(str);
  12131. if (pTableFrame){
  12132. IServerUserItem * pTagerIServerUserItem = pTableFrame->GetTableUserItem(i);
  12133. if (pTagerIServerUserItem == NULL)continue;
  12134. if (pIServerUserItem == pTagerIServerUserItem) continue; //请求自己
  12135. //变量定义
  12136. //tagMobileUserInfoHead pUserInfoHead;
  12137. tagUserInfo *pUserInfo = pTagerIServerUserItem->GetUserInfo();
  12138. Temp.player[i].dwUserID=pUserInfo->dwUserID;
  12139. lstrcpyn(Temp.player[i].szHeadUrl, pUserInfo->szHeadUrl, CountArray(Temp.player[i].szHeadUrl));
  12140. lstrcpyn(Temp.player[i].szName, pUserInfo->szNickName, CountArray(Temp.player[i].szName));
  12141. Temp.dwReadyBody++;
  12142. //同步到中心服务器
  12143. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  12144. }
  12145. }
  12146. }
  12147. OnLineTableAck.wTableState = Temp.roomStatus;
  12148. //玩家
  12149. CopyMemory(OnLineTableAck.Userinfo, Temp.player, sizeof(Temp.player));
  12150. Club::PB_CS_S_ClubOnLineTableAck TableAck;
  12151. TableAck.set_dwtableid(OnLineTableAck.dwTableID);
  12152. TableAck.set_wjushu(OnLineTableAck.wJushu);
  12153. TableAck.set_wtablestate(OnLineTableAck.wTableState);
  12154. for (WORD i = 0; i < 5; i++)
  12155. {
  12156. Club::pb_PlayerInfo* PlayerInfo = TableAck.add_userinfo();
  12157. PlayerInfo->set_dwuserid(OnLineTableAck.Userinfo[i].dwUserID);
  12158. std::string szName = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szName, CP_UTF8).m_psz;
  12159. std::string szHeadUrl = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szHeadUrl, CP_UTF8).m_psz;
  12160. PlayerInfo->set_szname(szName);
  12161. PlayerInfo->set_szheadurl(szHeadUrl);
  12162. }
  12163. //发送数据
  12164. std::string pbdata = TableAck.SerializePartialAsString();
  12165. SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLEUSER_ACK, (void*)pbdata.c_str(), pbdata.length());
  12166. if ((Temp.dwBody == Temp.dwReadyBody || bIsUserNull) && 0 == Temp.roomStatus)
  12167. {
  12168. Temp.roomStatus = 1;//房间状态
  12169. //同步到中心服务器
  12170. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  12171. //自动创建1个房间
  12172. if (0 < Temp.tmp6[0] && 1 == Temp.tmp5)
  12173. {
  12174. memset(szString, 0, 512 * sizeof(TCHAR));
  12175. _sntprintf(szString, CountArray(szString), TEXT("userid=%d 检测少人(游戏已开始),m_PriTableID_2_TableID有这个房间 可以(自动创建1个房间)"), pIServerUserItem->GetUserID());
  12176. CTraceService::TraceString(szString, TraceLevel_Warning);
  12177. this->OnAutoCreateRoomToDB(Temp.tmp6[0], pIServerUserItem->GetUserID(), Temp.tmp4);
  12178. }
  12179. }
  12180. }
  12181. else{
  12182. //玩家
  12183. CopyMemory(OnLineTableAck.Userinfo, Temp.player, sizeof(Temp.player));
  12184. Club::PB_CS_S_ClubOnLineTableAck TableAck;
  12185. TableAck.set_dwtableid(OnLineTableAck.dwTableID);
  12186. TableAck.set_wjushu(OnLineTableAck.wJushu);
  12187. TableAck.set_wtablestate(OnLineTableAck.wTableState);
  12188. for (WORD i = 0; i < 5; i++)
  12189. {
  12190. Club::pb_PlayerInfo* PlayerInfo = TableAck.add_userinfo();
  12191. PlayerInfo->set_dwuserid(OnLineTableAck.Userinfo[i].dwUserID);
  12192. std::string szName = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szName, CP_UTF8).m_psz;
  12193. std::string szHeadUrl = CW2AEX<1024>(OnLineTableAck.Userinfo[i].szHeadUrl, CP_UTF8).m_psz;
  12194. PlayerInfo->set_szname(szName);
  12195. PlayerInfo->set_szheadurl(szHeadUrl);
  12196. }
  12197. //发送数据
  12198. std::string pbdata = TableAck.SerializePartialAsString();
  12199. SendData(pIServerUserItem, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_TABLEUSER_ACK, (void*)pbdata.c_str(), pbdata.length());
  12200. }
  12201. }
  12202. }
  12203. }
  12204. return true;
  12205. }
  12206. //俱乐部会员黑名单
  12207. bool CAttemperEngineSink::OnTCPNetworkSubGetClubBlackUser(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12208. {
  12209. Club::PB_CS_C_ClubUser2 ClubUser2;
  12210. ClubUser2.ParseFromArray(pData, wDataSize);
  12211. //处理消息
  12212. CMD_GR_ClubUser2 pClubUser;
  12213. ZeroMemory(&pClubUser, sizeof(pClubUser));
  12214. pClubUser.dwClubID = ClubUser2.dwclubid();
  12215. pClubUser.wStartIndex = ClubUser2.wstartindex();
  12216. pClubUser.wCount = ClubUser2.wcount();
  12217. pClubUser.cbKind = ClubUser2.cbkind();
  12218. pClubUser.dwTemp = ClubUser2.dwtemp();
  12219. //获取用户
  12220. WORD wBindIndex = LOWORD(dwSocketID);
  12221. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12222. //用户效验
  12223. ASSERT(pIServerUserItem != NULL);
  12224. if (pIServerUserItem == NULL) return false;
  12225. //构造结构
  12226. DBR_GR_ClubUser2 ClubUser;
  12227. ZeroMemory(&ClubUser, sizeof(ClubUser));
  12228. //设置变量
  12229. ClubUser.dwUserID = pIServerUserItem->GetUserID();
  12230. ClubUser.dwClubID = pClubUser.dwClubID;
  12231. ClubUser.wStartIndex = pClubUser.wStartIndex;
  12232. ClubUser.wCount = pClubUser.wCount;
  12233. ClubUser.cbKind = pClubUser.cbKind;
  12234. ClubUser.dwTemp = pClubUser.dwTemp;
  12235. //投递请求
  12236. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER2, dwSocketID, &ClubUser, sizeof(ClubUser));
  12237. }
  12238. //俱乐部检测协议
  12239. bool CAttemperEngineSink::OnTCPNetworkSubGetClubProtocol(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12240. {
  12241. Club::PB_CS_C_ClubProtocol Protocol;
  12242. Protocol.ParseFromArray(pData, wDataSize);
  12243. //处理消息
  12244. CMD_GR_ClubProtocol pClubProtocol;
  12245. ZeroMemory(&pClubProtocol, sizeof(pClubProtocol));
  12246. pClubProtocol.dwClubID = Protocol.dwclubid();
  12247. pClubProtocol.dwTemp = Protocol.dwtemp();
  12248. //获取用户
  12249. WORD wBindIndex = LOWORD(dwSocketID);
  12250. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12251. //用户效验
  12252. ASSERT(pIServerUserItem != NULL);
  12253. if (pIServerUserItem == NULL) return false;
  12254. //构造结构
  12255. DBR_GR_ClubProtocol ClubProtocol;
  12256. ZeroMemory(&ClubProtocol, sizeof(ClubProtocol));
  12257. //设置变量
  12258. ClubProtocol.dwUserID = pIServerUserItem->GetUserID();
  12259. ClubProtocol.dwClubID = pClubProtocol.dwClubID;
  12260. ClubProtocol.dwTemp = pClubProtocol.dwTemp;
  12261. //投递请求
  12262. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_PROTOCOL, dwSocketID, &ClubProtocol, sizeof(ClubProtocol));
  12263. }
  12264. //俱乐部同意协议
  12265. bool CAttemperEngineSink::OnTCPNetworkSubAgreeClubProtocol(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12266. {
  12267. Club::PB_CS_S_ClubProtocolAgree Protocol;
  12268. Protocol.ParseFromArray(pData, wDataSize);
  12269. //处理消息
  12270. CMD_GR_ClubProtocolAgree pClubUserAgree;
  12271. ZeroMemory(&pClubUserAgree, sizeof(pClubUserAgree));
  12272. pClubUserAgree.dwClubID = Protocol.dwclubid();
  12273. pClubUserAgree.cbAgree = Protocol.cbagree();
  12274. pClubUserAgree.dwTemp = Protocol.dwtemp();
  12275. //获取用户
  12276. WORD wBindIndex = LOWORD(dwSocketID);
  12277. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12278. //用户效验
  12279. ASSERT(pIServerUserItem != NULL);
  12280. if (pIServerUserItem == NULL) return false;
  12281. //构造结构
  12282. DBR_GR_ClubProtocolAgree ClubUserAgree;
  12283. ZeroMemory(&ClubUserAgree, sizeof(ClubUserAgree));
  12284. //设置变量
  12285. ClubUserAgree.dwUserID = pIServerUserItem->GetUserID();
  12286. ClubUserAgree.dwClubID = pClubUserAgree.dwClubID;
  12287. ClubUserAgree.dwTemp = pClubUserAgree.dwTemp;
  12288. ClubUserAgree.cbAgree = pClubUserAgree.cbAgree;
  12289. //投递请求
  12290. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_PROTOCOLAGREE, dwSocketID, &ClubUserAgree, sizeof(ClubUserAgree));
  12291. }
  12292. //俱乐部公告
  12293. bool CAttemperEngineSink::OnTCPNetworkSubGetClubNotice(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12294. {
  12295. Club::PB_CS_C_ClubNotice Notice;
  12296. Notice.ParseFromArray(pData, wDataSize);
  12297. CString message = (CA2CTEX<2048>(Notice.message().c_str(), CP_UTF8)).m_szBuffer;
  12298. //处理消息
  12299. CMD_GR_ClubNotice pClubUserNotice;
  12300. ZeroMemory(&pClubUserNotice, sizeof(pClubUserNotice));
  12301. pClubUserNotice.dwClubID = Notice.dwclubid();
  12302. pClubUserNotice.cbType = Notice.cbtype();
  12303. pClubUserNotice.dwTemp = Notice.dwtemp();
  12304. _sntprintf(pClubUserNotice.Message, CountArray(pClubUserNotice.Message), TEXT("%s"), message);
  12305. //获取用户
  12306. WORD wBindIndex = LOWORD(dwSocketID);
  12307. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12308. //用户效验
  12309. ASSERT(pIServerUserItem != NULL);
  12310. if (pIServerUserItem == NULL) return false;
  12311. //构造结构
  12312. DBR_GR_ClubNotice ClubNotice;
  12313. ZeroMemory(&ClubNotice, sizeof(ClubNotice));
  12314. //设置变量
  12315. ClubNotice.dwUserID = pIServerUserItem->GetUserID();
  12316. ClubNotice.dwClubID = pClubUserNotice.dwClubID;
  12317. ClubNotice.dwTemp = pClubUserNotice.dwTemp;
  12318. ClubNotice.cbType = pClubUserNotice.cbType;
  12319. CopyMemory(ClubNotice.Message, pClubUserNotice.Message, sizeof(pClubUserNotice.Message));
  12320. //投递请求
  12321. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_NOTICE, dwSocketID, &ClubNotice, sizeof(ClubNotice));
  12322. }
  12323. //群主解散俱乐部房间
  12324. bool CAttemperEngineSink::OnTCPNetworkSubDissolveRoom(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12325. {
  12326. Club::PB_CS_C_ClubDissolveRoom DissolveRoom;
  12327. DissolveRoom.ParseFromArray(pData, wDataSize);
  12328. //处理消息
  12329. CMD_GR_ClubDissolveRoom pClubDissolveRoom;
  12330. ZeroMemory(&pClubDissolveRoom, sizeof(pClubDissolveRoom));
  12331. pClubDissolveRoom.dwClubID = DissolveRoom.dwclubid();
  12332. pClubDissolveRoom.dwRoomID = DissolveRoom.dwroomid();
  12333. //获取用户
  12334. WORD wBindIndex = LOWORD(dwSocketID);
  12335. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12336. //用户效验
  12337. ASSERT(pIServerUserItem != NULL);
  12338. if (pIServerUserItem == NULL) return false;
  12339. //校验该房间属于该俱乐部
  12340. CWHDataLocker DataLocker(m_CriticalSection);
  12341. JN_GR_RoomListBig* pRoomListBig = &m_PrivateRoomAll[pClubDissolveRoom.dwRoomID];
  12342. if (pRoomListBig == NULL) return false;
  12343. if (pRoomListBig->roomType == 1 && pRoomListBig->tmp6[0] == pClubDissolveRoom.dwClubID)
  12344. {
  12345. DBR_GR_ClubDissolveRoom ClubDissolveRoom = { 0 };
  12346. ClubDissolveRoom.dwClubID = pClubDissolveRoom.dwClubID;
  12347. ClubDissolveRoom.dwRoomID = pClubDissolveRoom.dwRoomID;
  12348. ClubDissolveRoom.dwUserID = pIServerUserItem->GetUserID();
  12349. //校验该用户为该俱乐部群主
  12350. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_DISSOLVEROOM, dwSocketID, &ClubDissolveRoom, sizeof(ClubDissolveRoom));
  12351. }
  12352. else
  12353. {
  12354. SendRequestFailure(pIServerUserItem, TEXT("不是本俱乐部房间,不能强制解散!"), 0);
  12355. }
  12356. return true;
  12357. }
  12358. //俱乐部统计战绩
  12359. bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountExploits(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12360. {
  12361. Club::PB_CS_C_ClubExploits ploits;
  12362. ploits.ParseFromArray(pData, wDataSize);
  12363. //处理消息
  12364. CMD_GR_ClubExploits pClubRecord;
  12365. ZeroMemory(&pClubRecord, sizeof(pClubRecord));
  12366. pClubRecord.dwClubID = ploits.dwclubid();
  12367. pClubRecord.PrivateTableID = ploits.privatetableid();
  12368. //获取用户
  12369. WORD wBindIndex = LOWORD(dwSocketID);
  12370. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12371. //用户效验
  12372. ASSERT(pIServerUserItem != NULL);
  12373. if (pIServerUserItem == NULL) return false;
  12374. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_EXPLOITS, dwSocketID, &pClubRecord, wDataSize);
  12375. }
  12376. //俱乐部统计对局数排名
  12377. bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountPlaygames(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12378. {
  12379. Club::PB_CS_C_ClubPlaygames Playgames;
  12380. Playgames.ParseFromArray(pData, wDataSize);
  12381. //处理消息
  12382. CMD_GR_ClubPlaygames pClubPlaygames;
  12383. ZeroMemory(&pClubPlaygames, sizeof(pClubPlaygames));
  12384. pClubPlaygames.dwClubID = Playgames.dwclubid();
  12385. pClubPlaygames.wType = Playgames.wtype();
  12386. pClubPlaygames.StartIndex = Playgames.startindex();
  12387. pClubPlaygames.mCount = Playgames.mcount();
  12388. pClubPlaygames.wDateCount = Playgames.wdatecount();
  12389. //获取用户
  12390. WORD wBindIndex = LOWORD(dwSocketID);
  12391. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12392. //用户效验
  12393. ASSERT(pIServerUserItem != NULL);
  12394. if (pIServerUserItem == NULL) return false;
  12395. CMD_GR_ClubPlaygamesUser pClubPlaygamesUser;
  12396. ZeroMemory(&pClubPlaygamesUser, sizeof(pClubPlaygamesUser));
  12397. pClubPlaygamesUser.dwClubID = pClubPlaygames.dwClubID;
  12398. pClubPlaygamesUser.wType = pClubPlaygames.wType;
  12399. pClubPlaygamesUser.StartIndex = pClubPlaygames.StartIndex;
  12400. pClubPlaygamesUser.mCount = pClubPlaygames.mCount;
  12401. pClubPlaygamesUser.wDateCount = pClubPlaygames.wDateCount;
  12402. pClubPlaygamesUser.UserID = pIServerUserItem->GetUserID();
  12403. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_PLAYGAEMS, dwSocketID, &pClubPlaygamesUser, sizeof(CMD_GR_ClubPlaygamesUser));
  12404. }
  12405. //俱乐部统计积分数排名
  12406. bool CAttemperEngineSink::OnTCPNetworkSubGetClubCountIntegral(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12407. {
  12408. Club::PB_CS_C_ClubIntegral Integral;
  12409. Integral.ParseFromArray(pData, wDataSize);
  12410. //处理消息
  12411. CMD_GR_ClubIntegral pClubIntegral;
  12412. ZeroMemory(&pClubIntegral, sizeof(pClubIntegral));
  12413. pClubIntegral.dwClubID = Integral.dwclubid();
  12414. pClubIntegral.wType = Integral.wtype();
  12415. pClubIntegral.wDateCount = Integral.wdatecount();
  12416. //获取用户
  12417. WORD wBindIndex = LOWORD(dwSocketID);
  12418. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12419. //用户效验
  12420. ASSERT(pIServerUserItem != NULL);
  12421. if (pIServerUserItem == NULL) return false;
  12422. CMD_GR_ClubIntegralUser pClubIntegralUser;
  12423. pClubIntegralUser.dwClubID = pClubIntegral.dwClubID;
  12424. pClubIntegralUser.wType = pClubIntegral.wType;
  12425. pClubIntegralUser.wDateCount = pClubIntegral.wDateCount;
  12426. pClubIntegralUser.UserID = pIServerUserItem->GetUserID();
  12427. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_COUNT_INTEGRAL, dwSocketID, &pClubIntegralUser, sizeof(CMD_GR_ClubIntegralUser));
  12428. }
  12429. //俱乐部打样
  12430. bool CAttemperEngineSink::OnTCPNetworkSubGetClubSample(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12431. {
  12432. Club::PB_CS_Club_Make_A_Sample MakeSample;
  12433. MakeSample.ParseFromArray(pData, wDataSize);
  12434. //处理消息
  12435. CMD_GR_Club_Make_A_Sample pSample;
  12436. ZeroMemory(&pSample, sizeof(pSample));
  12437. pSample.dwClubID = MakeSample.dwclubid();
  12438. pSample.IsSample = MakeSample.issample();
  12439. //获取用户
  12440. WORD wBindIndex = LOWORD(dwSocketID);
  12441. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12442. //用户效验
  12443. ASSERT(pIServerUserItem != NULL);
  12444. if (pIServerUserItem == NULL) return false;
  12445. //构造数据
  12446. DBR_GR_Club_Make_A_Sample Sample;
  12447. ZeroMemory(&Sample, sizeof(Sample));
  12448. Sample.dwClubID = pSample.dwClubID;
  12449. Sample.IsSample = pSample.IsSample;
  12450. Sample.dwUserID = pIServerUserItem->GetUserID();
  12451. //投递请求
  12452. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_MAKEA_SAMPLE, dwSocketID, &Sample, sizeof(Sample));
  12453. }
  12454. ////////////////////////////////////////////////////////
  12455. //查询银行
  12456. //bool CAttemperEngineSink::OnTCPNetworkSubQueryInsureInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12457. //{
  12458. // //效验参数
  12459. // ASSERT(wDataSize == sizeof(CMD_GR_C_QueryInsureInfoRequest));
  12460. // if (wDataSize != sizeof(CMD_GR_C_QueryInsureInfoRequest)) return false;
  12461. //
  12462. // //房间判断
  12463. // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD);
  12464. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12465. //
  12466. // //获取用户
  12467. // WORD wBindIndex = LOWORD(dwSocketID);
  12468. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12469. //
  12470. // //用户效验
  12471. // ASSERT(pIServerUserItem != NULL);
  12472. // if (pIServerUserItem == NULL) return false;
  12473. //
  12474. // //变量定义
  12475. // CMD_GR_C_QueryInsureInfoRequest * pQueryInsureInfoRequest = (CMD_GR_C_QueryInsureInfoRequest *)pData;
  12476. //
  12477. // //变量定义
  12478. // DBR_GR_QueryInsureInfo QueryInsureInfo;
  12479. // ZeroMemory(&QueryInsureInfo, sizeof(QueryInsureInfo));
  12480. //
  12481. // //构造数据
  12482. // QueryInsureInfo.cbActivityGame = pQueryInsureInfoRequest->cbActivityGame;
  12483. // QueryInsureInfo.dwUserID = pIServerUserItem->GetUserID();
  12484. // QueryInsureInfo.dwClientAddr = pIServerUserItem->GetClientAddr();
  12485. // lstrcpyn(QueryInsureInfo.szPassword, pQueryInsureInfoRequest->szInsurePass, CountArray(QueryInsureInfo.szPassword));
  12486. //
  12487. // CTraceService::TraceString(TEXT("查询银行已屏蔽 DBR_GR_QUERY_INSURE_INFO"), TraceLevel_Warning);
  12488. // //投递请求
  12489. // //m_pIDBCorrespondManager->PostDataBaseRequest(QueryInsureInfo.dwUserID, DBR_GR_QUERY_INSURE_INFO, dwSocketID, &QueryInsureInfo, sizeof(QueryInsureInfo));
  12490. //
  12491. // return true;
  12492. //}
  12493. //
  12494. ////开通银行
  12495. //bool CAttemperEngineSink::OnTCPNetworkSubEnableInsureRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12496. //{
  12497. // //效验参数
  12498. // ASSERT(wDataSize == sizeof(CMD_GR_C_EnableInsureRequest));
  12499. // if (wDataSize != sizeof(CMD_GR_C_EnableInsureRequest)) return false;
  12500. //
  12501. // //房间判断
  12502. // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD);
  12503. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12504. //
  12505. // //获取用户
  12506. // WORD wBindIndex = LOWORD(dwSocketID);
  12507. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12508. //
  12509. // //用户效验
  12510. // ASSERT(pIServerUserItem != NULL);
  12511. // if (pIServerUserItem == NULL) return false;
  12512. //
  12513. // //变量定义
  12514. // CMD_GR_C_EnableInsureRequest * pEnableInsureRequest = (CMD_GR_C_EnableInsureRequest *)pData;
  12515. //
  12516. // //变量定义
  12517. // DBR_GR_UserEnableInsure UserEnableInsure;
  12518. // ZeroMemory(&UserEnableInsure, sizeof(UserEnableInsure));
  12519. //
  12520. // //构造数据
  12521. // UserEnableInsure.dwUserID = pIServerUserItem->GetUserID();
  12522. // UserEnableInsure.dwClientAddr = pIServerUserItem->GetClientAddr();
  12523. // UserEnableInsure.cbActivityGame = pEnableInsureRequest->cbActivityGame;
  12524. // lstrcpyn(UserEnableInsure.szLogonPass, pEnableInsureRequest->szLogonPass, CountArray(UserEnableInsure.szLogonPass));
  12525. // lstrcpyn(UserEnableInsure.szInsurePass, pEnableInsureRequest->szInsurePass, CountArray(UserEnableInsure.szInsurePass));
  12526. // lstrcpyn(UserEnableInsure.szMachineID, pEnableInsureRequest->szMachineID, CountArray(UserEnableInsure.szMachineID));
  12527. //
  12528. // //投递请求
  12529. // m_pIDBCorrespondManager->PostDataBaseRequest(UserEnableInsure.dwUserID, DBR_GR_USER_ENABLE_INSURE, dwSocketID, &UserEnableInsure, sizeof(UserEnableInsure));
  12530. //
  12531. // return true;
  12532. //}
  12533. //
  12534. ////存款请求
  12535. //bool CAttemperEngineSink::OnTCPNetworkSubSaveScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12536. //{
  12537. // //效验参数
  12538. // ASSERT(wDataSize == sizeof(CMD_GR_C_SaveScoreRequest));
  12539. // if (wDataSize != sizeof(CMD_GR_C_SaveScoreRequest)) return false;
  12540. //
  12541. // //房间判断
  12542. // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD);
  12543. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12544. //
  12545. // //变量定义
  12546. // CMD_GR_C_SaveScoreRequest * pSaveScoreRequest = (CMD_GR_C_SaveScoreRequest *)pData;
  12547. //
  12548. // //效验参数
  12549. // ASSERT(pSaveScoreRequest->lSaveScore > 0L);
  12550. // if (pSaveScoreRequest->lSaveScore <= 0L) return false;
  12551. //
  12552. // //获取用户
  12553. // WORD wBindIndex = LOWORD(dwSocketID);
  12554. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12555. //
  12556. // //用户效验
  12557. // ASSERT(pIServerUserItem != NULL);
  12558. // if (pIServerUserItem == NULL) return false;
  12559. //
  12560. // //规则判断
  12561. // if (pSaveScoreRequest->cbActivityGame == FALSE && CServerRule::IsForfendSaveInRoom(m_pGameServiceOption->dwServerRule))
  12562. // {
  12563. // //发送数据
  12564. // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止房间存款,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame);
  12565. // return true;
  12566. // }
  12567. //
  12568. // //规则判断
  12569. // if (pSaveScoreRequest->cbActivityGame == TRUE && CServerRule::IsForfendSaveInGame(m_pGameServiceOption->dwServerRule))
  12570. // {
  12571. // //发送数据
  12572. // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止游戏存款,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame);
  12573. // return true;
  12574. // }
  12575. //
  12576. // //变量定义
  12577. // SCORE lConsumeQuota;
  12578. //
  12579. //
  12580. // //获取限额
  12581. // if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  12582. // {
  12583. // auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  12584. // if (!pTableFrame)
  12585. // return false;
  12586. // lConsumeQuota = pTableFrame->QueryConsumeQuota(pIServerUserItem);
  12587. // }
  12588. // else
  12589. // {
  12590. // lConsumeQuota = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore();
  12591. // }
  12592. //
  12593. // //限额判断
  12594. // if (pSaveScoreRequest->lSaveScore > lConsumeQuota)
  12595. // {
  12596. // SCORE lUserWholeScore = pIServerUserItem->GetUserScore() + pIServerUserItem->GetTrusteeScore();
  12597. // if (lConsumeQuota < lUserWholeScore)
  12598. // {
  12599. // //构造提示
  12600. // TCHAR szDescribe[128] = TEXT("");
  12601. // _sntprintf(szDescribe, CountArray(szDescribe), TEXT("由于您正在游戏中,游戏币可存入额度为 %I64d,存入操作失败!"), lConsumeQuota);
  12602. //
  12603. // //发送数据
  12604. // SendInsureFailure(pIServerUserItem, szDescribe, 0L, pSaveScoreRequest->cbActivityGame);
  12605. // }
  12606. // else
  12607. // {
  12608. // //发送数据
  12609. // SendInsureFailure(pIServerUserItem, TEXT("您的游戏币余额不足,存入操作失败!"), 0L, pSaveScoreRequest->cbActivityGame);
  12610. // }
  12611. //
  12612. // return true;
  12613. // }
  12614. //
  12615. // //锁定积分
  12616. // if (pIServerUserItem->FrozenedUserScore(pSaveScoreRequest->lSaveScore) == false)
  12617. // {
  12618. // ASSERT(FALSE);
  12619. // return false;
  12620. // }
  12621. //
  12622. // //变量定义
  12623. // DBR_GR_UserSaveScore UserSaveScore;
  12624. // ZeroMemory(&UserSaveScore, sizeof(UserSaveScore));
  12625. //
  12626. // //构造数据
  12627. // UserSaveScore.cbActivityGame = pSaveScoreRequest->cbActivityGame;
  12628. // UserSaveScore.dwUserID = pIServerUserItem->GetUserID();
  12629. // UserSaveScore.lSaveScore = pSaveScoreRequest->lSaveScore;
  12630. // UserSaveScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  12631. // lstrcpyn(UserSaveScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserSaveScore.szMachineID));
  12632. //
  12633. // //投递请求
  12634. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_SAVE_SCORE, dwSocketID, &UserSaveScore, sizeof(UserSaveScore));
  12635. //
  12636. // return true;
  12637. //}
  12638. //
  12639. ////取款请求
  12640. //bool CAttemperEngineSink::OnTCPNetworkSubTakeScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12641. //{
  12642. // //效验参数
  12643. // ASSERT(wDataSize == sizeof(CMD_GR_C_TakeScoreRequest));
  12644. // if (wDataSize != sizeof(CMD_GR_C_TakeScoreRequest)) return false;
  12645. //
  12646. // //房间判断
  12647. // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD);
  12648. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12649. //
  12650. // //变量定义
  12651. // CMD_GR_C_TakeScoreRequest * pTakeScoreRequest = (CMD_GR_C_TakeScoreRequest *)pData;
  12652. // pTakeScoreRequest->szInsurePass[CountArray(pTakeScoreRequest->szInsurePass) - 1] = 0;
  12653. //
  12654. // //效验参数
  12655. // ASSERT(pTakeScoreRequest->lTakeScore > 0L);
  12656. // if (pTakeScoreRequest->lTakeScore <= 0L) return false;
  12657. //
  12658. // //获取用户
  12659. // WORD wBindIndex = LOWORD(dwSocketID);
  12660. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12661. //
  12662. // //用户效验
  12663. // ASSERT(pIServerUserItem != NULL);
  12664. // if (pIServerUserItem == NULL) return false;
  12665. //
  12666. // //规则判断
  12667. // if (pTakeScoreRequest->cbActivityGame == FALSE && CServerRule::IsForfendTakeInRoom(m_pGameServiceOption->dwServerRule))
  12668. // {
  12669. // //发送数据
  12670. // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止房间取款,取出操作失败!"), 0L, pTakeScoreRequest->cbActivityGame);
  12671. // return true;
  12672. // }
  12673. //
  12674. // //规则判断
  12675. // if (pTakeScoreRequest->cbActivityGame == TRUE && CServerRule::IsForfendTakeInGame(m_pGameServiceOption->dwServerRule))
  12676. // {
  12677. // //发送数据
  12678. // SendInsureFailure(pIServerUserItem, TEXT("此房间禁止游戏取款,取出操作失败!"), 0L, pTakeScoreRequest->cbActivityGame);
  12679. // return true;
  12680. // }
  12681. //
  12682. // //变量定义
  12683. // DBR_GR_UserTakeScore UserTakeScore;
  12684. // ZeroMemory(&UserTakeScore, sizeof(UserTakeScore));
  12685. //
  12686. // //构造数据
  12687. // UserTakeScore.cbActivityGame = pTakeScoreRequest->cbActivityGame;
  12688. // UserTakeScore.dwUserID = pIServerUserItem->GetUserID();
  12689. // UserTakeScore.lTakeScore = pTakeScoreRequest->lTakeScore;
  12690. // UserTakeScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  12691. // lstrcpyn(UserTakeScore.szPassword, pTakeScoreRequest->szInsurePass, CountArray(UserTakeScore.szPassword));
  12692. // lstrcpyn(UserTakeScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserTakeScore.szMachineID));
  12693. //
  12694. // //投递请求
  12695. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_TAKE_SCORE, dwSocketID, &UserTakeScore, sizeof(UserTakeScore));
  12696. //
  12697. // return true;
  12698. //}
  12699. //
  12700. ////转帐请求
  12701. //bool CAttemperEngineSink::OnTCPNetworkSubTransferScoreRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12702. //{
  12703. // //效验参数
  12704. // ASSERT(wDataSize == sizeof(CMD_GP_C_TransferScoreRequest));
  12705. // if (wDataSize != sizeof(CMD_GP_C_TransferScoreRequest)) return false;
  12706. //
  12707. // //房间判断
  12708. // ASSERT(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD);
  12709. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12710. //
  12711. // //变量定义
  12712. // CMD_GP_C_TransferScoreRequest * pTransferScoreRequest = (CMD_GP_C_TransferScoreRequest *)pData;
  12713. // pTransferScoreRequest->szAccounts[CountArray(pTransferScoreRequest->szAccounts) - 1] = 0;
  12714. // pTransferScoreRequest->szInsurePass[CountArray(pTransferScoreRequest->szInsurePass) - 1] = 0;
  12715. //
  12716. // //效验参数
  12717. // ASSERT(pTransferScoreRequest->lTransferScore > 0L);
  12718. // if (pTransferScoreRequest->lTransferScore <= 0L) return false;
  12719. //
  12720. // //获取用户
  12721. // WORD wBindIndex = LOWORD(dwSocketID);
  12722. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12723. //
  12724. // //用户效验
  12725. // ASSERT(pIServerUserItem != NULL);
  12726. // if (pIServerUserItem == NULL) return false;
  12727. //
  12728. // //变量定义
  12729. // DBR_GR_UserTransferScore UserTransferScore;
  12730. // ZeroMemory(&UserTransferScore, sizeof(UserTransferScore));
  12731. //
  12732. // //构造数据
  12733. // UserTransferScore.cbActivityGame = pTransferScoreRequest->cbActivityGame;
  12734. // UserTransferScore.dwUserID = pIServerUserItem->GetUserID();
  12735. // UserTransferScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  12736. // UserTransferScore.lTransferScore = pTransferScoreRequest->lTransferScore;
  12737. // lstrcpyn(UserTransferScore.szAccounts, pTransferScoreRequest->szAccounts, CountArray(UserTransferScore.szAccounts));
  12738. // lstrcpyn(UserTransferScore.szMachineID, pIServerUserItem->GetMachineID(), CountArray(UserTransferScore.szMachineID));
  12739. // lstrcpyn(UserTransferScore.szPassword, pTransferScoreRequest->szInsurePass, CountArray(UserTransferScore.szPassword));
  12740. // lstrcpyn(UserTransferScore.szTransRemark, pTransferScoreRequest->szTransRemark, CountArray(UserTransferScore.szTransRemark));
  12741. //
  12742. // //投递请求
  12743. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_USER_TRANSFER_SCORE, dwSocketID, &UserTransferScore, sizeof(UserTransferScore));
  12744. //
  12745. // return true;
  12746. //}
  12747. //
  12748. //查询用户请求
  12749. //bool CAttemperEngineSink::OnTCPNetworkSubQueryUserInfoRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12750. //{
  12751. // //效验参数
  12752. // ASSERT(wDataSize == sizeof(CMD_GR_C_QueryUserInfoRequest));
  12753. // if (wDataSize != sizeof(CMD_GR_C_QueryUserInfoRequest)) return false;
  12754. //
  12755. // //房间判断
  12756. // ASSERT((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) != 0);
  12757. // if ((m_pGameServiceOption->wServerType&GAME_GENRE_GOLD) == 0) return false;
  12758. //
  12759. // //变量定义
  12760. // CMD_GR_C_QueryUserInfoRequest * pQueryUserInfoRequest = (CMD_GR_C_QueryUserInfoRequest *)pData;
  12761. // pQueryUserInfoRequest->szAccounts[CountArray(pQueryUserInfoRequest->szAccounts) - 1] = 0;
  12762. //
  12763. // //获取用户
  12764. // WORD wBindIndex = LOWORD(dwSocketID);
  12765. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12766. //
  12767. // //用户效验
  12768. // ASSERT(pIServerUserItem != NULL);
  12769. // if (pIServerUserItem == NULL) return false;
  12770. //
  12771. // //ID判断
  12772. // if (pQueryUserInfoRequest->cbByNickName == FALSE)
  12773. // {
  12774. // //长度判断
  12775. // int nLen = lstrlen(pQueryUserInfoRequest->szAccounts);
  12776. // if (nLen >= 8)
  12777. // {
  12778. // SendInsureFailure(pIServerUserItem, TEXT("请输入合法的玩家ID!"), 0, pQueryUserInfoRequest->cbActivityGame);
  12779. // return true;
  12780. // }
  12781. //
  12782. // //合法判断
  12783. // for (int i = 0; i < nLen; i++)
  12784. // {
  12785. // if (pQueryUserInfoRequest->szAccounts[i] < TEXT('0') || pQueryUserInfoRequest->szAccounts[i] > TEXT('9'))
  12786. // {
  12787. // SendInsureFailure(pIServerUserItem, TEXT("请输入合法的玩家ID!"), 0, pQueryUserInfoRequest->cbActivityGame);
  12788. // return true;
  12789. // }
  12790. // }
  12791. // }
  12792. //
  12793. // //变量定义
  12794. // DBR_GR_QueryTransferUserInfo QueryTransferUserInfo;
  12795. // ZeroMemory(&QueryTransferUserInfo, sizeof(QueryTransferUserInfo));
  12796. //
  12797. // //构造数据
  12798. // QueryTransferUserInfo.dwUserID = pIServerUserItem->GetUserID();
  12799. // QueryTransferUserInfo.cbByNickName = pQueryUserInfoRequest->cbByNickName;
  12800. // QueryTransferUserInfo.cbActivityGame = pQueryUserInfoRequest->cbActivityGame;
  12801. // lstrcpyn(QueryTransferUserInfo.szAccounts, pQueryUserInfoRequest->szAccounts, CountArray(QueryTransferUserInfo.szAccounts));
  12802. //
  12803. // //投递请求
  12804. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_QUERY_TRANSFER_USER_INFO, dwSocketID, &QueryTransferUserInfo, sizeof(QueryTransferUserInfo));
  12805. //
  12806. // return true;
  12807. //}
  12808. ////领取任务
  12809. //bool CAttemperEngineSink::OnTCPNetworkSubTakeTaskRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12810. //{
  12811. // //参数校验
  12812. // ASSERT(wDataSize == sizeof(CMD_GR_C_TakeTask));
  12813. // if (wDataSize != sizeof(CMD_GR_C_TakeTask)) return false;
  12814. //
  12815. // //提取数据
  12816. // CMD_GR_C_TakeTask * pTaskTake = (CMD_GR_C_TakeTask *)pData;
  12817. // pTaskTake->szPassword[CountArray(pTaskTake->szPassword) - 1] = 0;
  12818. // pTaskTake->szMachineID[CountArray(pTaskTake->szMachineID) - 1] = 0;
  12819. //
  12820. // //查找用户
  12821. // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pTaskTake->dwUserID);
  12822. // if (pIServerUserItem == NULL) return false;
  12823. //
  12824. // //构造结构
  12825. // DBR_GR_TaskTake TaskTake;
  12826. // TaskTake.dwUserID = pTaskTake->dwUserID;
  12827. // TaskTake.wTaskID = pTaskTake->wTaskID;
  12828. // TaskTake.dwClientAddr = pIServerUserItem->GetClientAddr();
  12829. // lstrcpyn(TaskTake.szPassword, pTaskTake->szPassword, CountArray(TaskTake.szPassword));
  12830. // lstrcpyn(TaskTake.szMachineID, pTaskTake->szMachineID, CountArray(TaskTake.szMachineID));
  12831. //
  12832. // //投递请求
  12833. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_TAKE, dwSocketID, &TaskTake, sizeof(TaskTake));
  12834. //
  12835. // return true;
  12836. //}
  12837. //
  12838. ////领取奖励
  12839. //bool CAttemperEngineSink::OnTCPNetworkSubTaskRewardRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12840. //{
  12841. // //参数校验
  12842. // ASSERT(wDataSize == sizeof(CMD_GR_C_TaskReward));
  12843. // if (wDataSize != sizeof(CMD_GR_C_TaskReward)) return false;
  12844. //
  12845. // //提取数据
  12846. // CMD_GR_C_TaskReward * pTaskReward = (CMD_GR_C_TaskReward *)pData;
  12847. // pTaskReward->szPassword[CountArray(pTaskReward->szPassword) - 1] = 0;
  12848. // pTaskReward->szMachineID[CountArray(pTaskReward->szMachineID) - 1] = 0;
  12849. //
  12850. // //查找用户
  12851. // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pTaskReward->dwUserID);
  12852. // if (pIServerUserItem == NULL) return false;
  12853. //
  12854. // //构造结构
  12855. // DBR_GR_TaskReward TaskReward;
  12856. // TaskReward.dwUserID = pTaskReward->dwUserID;
  12857. // TaskReward.wTaskID = pTaskReward->wTaskID;
  12858. // TaskReward.dwClientAddr = pIServerUserItem->GetClientAddr();
  12859. // lstrcpyn(TaskReward.szPassword, pTaskReward->szPassword, CountArray(TaskReward.szPassword));
  12860. // lstrcpyn(TaskReward.szMachineID, pTaskReward->szMachineID, CountArray(TaskReward.szMachineID));
  12861. //
  12862. // //投递请求
  12863. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_REWARD, dwSocketID, &TaskReward, sizeof(TaskReward));
  12864. //
  12865. // return true;
  12866. //}
  12867. //
  12868. ////加载任务
  12869. //bool CAttemperEngineSink::OnTCPNetworkSubLoadTaskInfoRequest(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12870. //{
  12871. // //参数校验
  12872. // ASSERT(wDataSize == sizeof(CMD_GR_C_LoadTaskInfo));
  12873. // if (wDataSize != sizeof(CMD_GR_C_LoadTaskInfo)) return false;
  12874. //
  12875. // //提取数据
  12876. // CMD_GR_C_LoadTaskInfo * pLoadTaskInfo = (CMD_GR_C_LoadTaskInfo *)pData;
  12877. // pLoadTaskInfo->szPassword[CountArray(pLoadTaskInfo->szPassword) - 1] = 0;
  12878. //
  12879. // //查找用户
  12880. // IServerUserItem * pIServerUserItem = m_ServerUserManager.SearchUserItem(pLoadTaskInfo->dwUserID);
  12881. // if (pIServerUserItem == NULL) return false;
  12882. //
  12883. // //构造结构
  12884. // DBR_GR_TaskQueryInfo TaskQueryInfo;
  12885. // TaskQueryInfo.dwUserID = pLoadTaskInfo->dwUserID;
  12886. // lstrcpyn(TaskQueryInfo.szPassword, pLoadTaskInfo->szPassword, CountArray(TaskQueryInfo.szPassword));
  12887. //
  12888. // //投递请求
  12889. // m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_TASK_QUERY_INFO, dwSocketID, &TaskQueryInfo, sizeof(TaskQueryInfo));
  12890. //
  12891. // return true;
  12892. //}
  12893. //查询设置
  12894. bool CAttemperEngineSink::OnTCPNetworkSubQueryOption(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12895. {
  12896. //获取用户
  12897. WORD wBindIndex = LOWORD(dwSocketID);
  12898. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12899. //用户效验
  12900. ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0));
  12901. if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false;
  12902. //变量定义
  12903. CMD_GR_OptionCurrent OptionCurrent;
  12904. ZeroMemory(&OptionCurrent, sizeof(OptionCurrent));
  12905. //挂接属性
  12906. OptionCurrent.ServerOptionInfo.wKindID = m_pGameServiceOption->wKindID;
  12907. OptionCurrent.ServerOptionInfo.wNodeID = m_pGameServiceOption->wNodeID;
  12908. OptionCurrent.ServerOptionInfo.wSortID = m_pGameServiceOption->wSortID;
  12909. //房间配置
  12910. OptionCurrent.ServerOptionInfo.wRevenueRatio = m_pGameServiceOption->wRevenueRatio;
  12911. OptionCurrent.ServerOptionInfo.lServiceScore = m_pGameServiceOption->lServiceScore;
  12912. OptionCurrent.ServerOptionInfo.lRestrictScore = m_pGameServiceOption->lRestrictScore;
  12913. OptionCurrent.ServerOptionInfo.lMinTableScore = m_pGameServiceOption->lMinTableScore;
  12914. OptionCurrent.ServerOptionInfo.lMinEnterScore = m_pGameServiceOption->lMinEnterScore;
  12915. OptionCurrent.ServerOptionInfo.lMaxEnterScore = m_pGameServiceOption->lMaxEnterScore;
  12916. //会员限制
  12917. OptionCurrent.ServerOptionInfo.cbMinEnterMember = m_pGameServiceOption->cbMinEnterMember;
  12918. OptionCurrent.ServerOptionInfo.cbMaxEnterMember = m_pGameServiceOption->cbMaxEnterMember;
  12919. //房间属性
  12920. OptionCurrent.ServerOptionInfo.dwServerRule = m_pGameServiceOption->dwServerRule;
  12921. lstrcpyn(OptionCurrent.ServerOptionInfo.szServerName, m_pGameServiceOption->szServerName, CountArray(OptionCurrent.ServerOptionInfo.szServerName));
  12922. //聊天规则
  12923. OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_CHAT;
  12924. OptionCurrent.dwRuleMask |= SR_FORFEND_ROOM_CHAT;
  12925. OptionCurrent.dwRuleMask |= SR_FORFEND_WISPER_CHAT;
  12926. OptionCurrent.dwRuleMask |= SR_FORFEND_WISPER_ON_GAME;
  12927. //房间规则
  12928. OptionCurrent.dwRuleMask |= SR_FORFEND_ROOM_ENTER;
  12929. OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_ENTER;
  12930. OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_LOOKON;
  12931. //银行规则
  12932. OptionCurrent.dwRuleMask |= SR_FORFEND_TAKE_IN_ROOM;
  12933. OptionCurrent.dwRuleMask |= SR_FORFEND_TAKE_IN_GAME;
  12934. OptionCurrent.dwRuleMask |= SR_FORFEND_SAVE_IN_ROOM;
  12935. OptionCurrent.dwRuleMask |= SR_FORFEND_SAVE_IN_GAME;
  12936. //其他规则
  12937. //OptionCurrent.dwRuleMask|=SR_RECORD_GAME_TRACK;
  12938. OptionCurrent.dwRuleMask |= SR_FORFEND_GAME_RULE;
  12939. OptionCurrent.dwRuleMask |= SR_FORFEND_LOCK_TABLE;
  12940. OptionCurrent.dwRuleMask |= SR_ALLOW_ANDROID_SIMULATE;
  12941. //组件规则
  12942. if (m_pGameServiceAttrib->cbDynamicJoin == TRUE) OptionCurrent.dwRuleMask |= SR_ALLOW_DYNAMIC_JOIN;
  12943. if (m_pGameServiceAttrib->cbAndroidUser == TRUE) OptionCurrent.dwRuleMask |= SR_ALLOW_ANDROID_ATTEND;
  12944. //if (m_pGameServiceAttrib->cbOffLineTrustee==TRUE) OptionCurrent.dwRuleMask|=SR_ALLOW_OFFLINE_TRUSTEE;
  12945. //模式规则
  12946. if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) OptionCurrent.dwRuleMask |= SR_RECORD_GAME_SCORE;
  12947. if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0) OptionCurrent.dwRuleMask |= SR_IMMEDIATE_WRITE_SCORE;
  12948. //发送数据
  12949. SendData(pIServerUserItem, MDM_GR_MANAGE, SUB_GR_OPTION_CURRENT, &OptionCurrent, sizeof(OptionCurrent));
  12950. return true;
  12951. }
  12952. //房间设置
  12953. bool CAttemperEngineSink::OnTCPNetworkSubOptionServer(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  12954. {
  12955. //效验参数
  12956. ASSERT(wDataSize == sizeof(CMD_GR_ServerOption));
  12957. if (wDataSize != sizeof(CMD_GR_ServerOption)) return false;
  12958. //变量定义
  12959. CMD_GR_ServerOption * pServerOption = (CMD_GR_ServerOption *)pData;
  12960. tagServerOptionInfo * pServerOptionInfo = &pServerOption->ServerOptionInfo;
  12961. //获取用户
  12962. WORD wBindIndex = LOWORD(dwSocketID);
  12963. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  12964. //用户效验
  12965. ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0));
  12966. if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false;
  12967. //变量定义
  12968. bool bModifyServer = false;
  12969. //挂接节点
  12970. if (m_pGameServiceOption->wNodeID != pServerOptionInfo->wNodeID)
  12971. {
  12972. bModifyServer = true;
  12973. m_pGameServiceOption->wNodeID = pServerOptionInfo->wNodeID;
  12974. }
  12975. //挂接类型
  12976. if ((pServerOptionInfo->wKindID != 0) && (m_pGameServiceOption->wKindID != pServerOptionInfo->wKindID))
  12977. {
  12978. bModifyServer = true;
  12979. m_pGameServiceOption->wKindID = pServerOptionInfo->wKindID;
  12980. }
  12981. //挂接排序
  12982. if ((pServerOptionInfo->wSortID != 0) && (m_pGameServiceOption->wSortID != pServerOptionInfo->wSortID))
  12983. {
  12984. bModifyServer = true;
  12985. m_pGameServiceOption->wSortID = pServerOptionInfo->wSortID;
  12986. }
  12987. //房间名字
  12988. if ((pServerOptionInfo->szServerName[0] != 0) && (lstrcmp(m_pGameServiceOption->szServerName, pServerOptionInfo->szServerName) != 0))
  12989. {
  12990. bModifyServer = true;
  12991. lstrcpyn(m_pGameServiceOption->szServerName, pServerOptionInfo->szServerName, CountArray(m_pGameServiceOption->szServerName));
  12992. }
  12993. //税收配置
  12994. m_pGameServiceOption->wRevenueRatio = pServerOptionInfo->wRevenueRatio;
  12995. m_pGameServiceOption->lServiceScore = pServerOptionInfo->lServiceScore;
  12996. //房间配置
  12997. m_pGameServiceOption->lRestrictScore = pServerOptionInfo->lRestrictScore;
  12998. m_pGameServiceOption->lMinTableScore = pServerOptionInfo->lMinTableScore;
  12999. m_pGameServiceOption->lMinEnterScore = pServerOptionInfo->lMinEnterScore;
  13000. m_pGameServiceOption->lMaxEnterScore = pServerOptionInfo->lMaxEnterScore;
  13001. //会员限制
  13002. m_pGameServiceOption->cbMinEnterMember = pServerOptionInfo->cbMinEnterMember;
  13003. m_pGameServiceOption->cbMaxEnterMember = pServerOptionInfo->cbMaxEnterMember;
  13004. //聊天规则
  13005. CServerRule::SetForfendGameChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameChat(pServerOptionInfo->dwServerRule));
  13006. CServerRule::SetForfendRoomChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendRoomChat(pServerOptionInfo->dwServerRule));
  13007. CServerRule::SetForfendWisperChat(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendWisperChat(pServerOptionInfo->dwServerRule));
  13008. CServerRule::SetForfendWisperOnGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendWisperOnGame(pServerOptionInfo->dwServerRule));
  13009. //房间规则
  13010. CServerRule::SetForfendRoomEnter(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendRoomEnter(pServerOptionInfo->dwServerRule));
  13011. CServerRule::SetForfendGameEnter(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameEnter(pServerOptionInfo->dwServerRule));
  13012. CServerRule::SetForfendGameLookon(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameLookon(pServerOptionInfo->dwServerRule));
  13013. //银行规则
  13014. CServerRule::SetForfendTakeInRoom(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendTakeInRoom(pServerOptionInfo->dwServerRule));
  13015. CServerRule::SetForfendTakeInGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendTakeInGame(pServerOptionInfo->dwServerRule));
  13016. CServerRule::SetForfendSaveInRoom(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendSaveInRoom(pServerOptionInfo->dwServerRule));
  13017. CServerRule::SetForfendSaveInGame(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendSaveInGame(pServerOptionInfo->dwServerRule));
  13018. //其他规则
  13019. CServerRule::SetRecordGameTrack(m_pGameServiceOption->dwServerRule, CServerRule::IsRecordGameTrack(pServerOptionInfo->dwServerRule));
  13020. CServerRule::SetForfendGameRule(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendGameRule(pServerOptionInfo->dwServerRule));
  13021. CServerRule::SetForfendLockTable(m_pGameServiceOption->dwServerRule, CServerRule::IsForfendLockTable(pServerOptionInfo->dwServerRule));
  13022. //动态加入
  13023. if (m_pGameServiceAttrib->cbDynamicJoin == TRUE)
  13024. {
  13025. CServerRule::SetAllowDynamicJoin(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowDynamicJoin(pServerOptionInfo->dwServerRule));
  13026. }
  13027. //机器管理
  13028. if (m_pGameServiceAttrib->cbAndroidUser == TRUE)
  13029. {
  13030. CServerRule::SetAllowAndroidAttend(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowAndroidAttend(pServerOptionInfo->dwServerRule));
  13031. }
  13032. //断线托管
  13033. if (m_pGameServiceAttrib->cbOffLineTrustee == TRUE)
  13034. {
  13035. CServerRule::SetAllowOffLineTrustee(m_pGameServiceOption->dwServerRule, CServerRule::IsAllowOffLineTrustee(pServerOptionInfo->dwServerRule));
  13036. }
  13037. //记录成绩
  13038. if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0)
  13039. {
  13040. CServerRule::SetRecordGameScore(m_pGameServiceOption->dwServerRule, CServerRule::IsRecordGameScore(pServerOptionInfo->dwServerRule));
  13041. }
  13042. //立即写分
  13043. if ((m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) == 0)
  13044. {
  13045. CServerRule::SetImmediateWriteScore(m_pGameServiceOption->dwServerRule, CServerRule::IsImmediateWriteScore(pServerOptionInfo->dwServerRule));
  13046. }
  13047. //调整参数
  13048. CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  13049. pServiceUnits->RectifyServiceParameter();
  13050. //发送修改
  13051. if (bModifyServer == true)
  13052. {
  13053. //变量定义
  13054. CMD_CS_C_ServerModify ServerModify;
  13055. ZeroMemory(&ServerModify, sizeof(ServerModify));
  13056. //服务端口
  13057. ServerModify.wServerPort = pServiceUnits->m_TCPNetworkEngine->GetCurrentPort();
  13058. //房间信息
  13059. ServerModify.wKindID = m_pGameServiceOption->wKindID;
  13060. ServerModify.wNodeID = m_pGameServiceOption->wNodeID;
  13061. ServerModify.wSortID = m_pGameServiceOption->wSortID;
  13062. ServerModify.dwOnLineCount = m_ServerUserManager.GetUserItemCount();
  13063. ServerModify.dwFullCount = m_pGameServiceOption->wMaxPlayer - RESERVE_USER_COUNT;
  13064. lstrcpyn(ServerModify.szServerName, m_pGameServiceOption->szServerName, CountArray(ServerModify.szServerName));
  13065. lstrcpyn(ServerModify.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(ServerModify.szServerAddr));
  13066. //DWORD dTableNum = 0;
  13067. if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  13068. {
  13069. auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  13070. TCHAR szTemp[32] = { 0 };
  13071. if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32);
  13072. CString csTemp = szTemp;
  13073. /*if (!csTemp.IsEmpty())
  13074. {
  13075. dTableNum = _wtol(szTemp);
  13076. }*/
  13077. }
  13078. //发送数据
  13079. 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()*/);
  13080. }
  13081. //发送信息
  13082. SendRequestFailure(pIServerUserItem, TEXT("当前游戏服务器房间的“运行值”状态配置数据修改成功"), 0);
  13083. //输出信息
  13084. TCHAR szBuffer[128] = TEXT("");
  13085. _sntprintf(szBuffer, CountArray(szBuffer), TEXT("远程修改房间配置通知 管理员 %s [ %ld ]"), pIServerUserItem->GetNickName(), pIServerUserItem->GetUserID());
  13086. //输出信息
  13087. CTraceService::TraceString(szBuffer, TraceLevel_Info);
  13088. return true;
  13089. }
  13090. //踢出用户
  13091. //bool CAttemperEngineSink::OnTCPNetworkSubManagerKickUser(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13092. //{
  13093. // //效验参数
  13094. // ASSERT(wDataSize == sizeof(CMD_GR_KickUser));
  13095. // if (wDataSize != sizeof(CMD_GR_KickUser)) return false;
  13096. //
  13097. // //变量定义
  13098. // CMD_GR_KickUser * pKickUser = (CMD_GR_KickUser *)pData;
  13099. //
  13100. // //获取用户
  13101. // WORD wBindIndex = LOWORD(dwSocketID);
  13102. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13103. //
  13104. // //用户效验
  13105. // ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetMasterOrder() > 0));
  13106. // if ((pIServerUserItem == NULL) || (pIServerUserItem->GetMasterOrder() == 0)) return false;
  13107. //
  13108. // //权限判断
  13109. // ASSERT(CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == true);
  13110. // if (CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == false) return false;
  13111. //
  13112. // //目标用户
  13113. // IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pKickUser->dwTargetUserID);
  13114. // if (pITargetUserItem == NULL) return true;
  13115. //
  13116. // //用户状态
  13117. // if (pITargetUserItem->GetUserStatus() == US_PLAYING) return true;
  13118. //
  13119. // //踢出记录
  13120. // m_KickUserItemMap[pITargetUserItem->GetUserID()] = (DWORD)time(NULL);
  13121. //
  13122. // //请离桌子
  13123. // WORD wTargerTableID = pITargetUserItem->GetTableID();
  13124. // if (wTargerTableID != INVALID_TABLE)
  13125. // {
  13126. // //发送消息
  13127. // SendGameMessage(pITargetUserItem, TEXT("你已被管理员请离桌子!"), SMT_TABLE_EXIT);
  13128. //
  13129. // auto pTableFrame = GetTableFrame(wTargerTableID);
  13130. // if (!pTableFrame)
  13131. // return false;
  13132. // if (pTableFrame->PerformStandUpAction(pITargetUserItem) == false) return true;
  13133. // }
  13134. //
  13135. // //发送通知
  13136. // LPCTSTR pszMessage = TEXT("你已被管理员请离此游戏房间!");
  13137. // SendRoomMessage(pITargetUserItem, pszMessage, SMT_TABLE_EXIT);
  13138. //
  13139. // pITargetUserItem->SetUserStatus(US_NULL, INVALID_TABLE, INVALID_CHAIR);
  13140. //
  13141. // return true;
  13142. //}
  13143. //限制聊天
  13144. //bool CAttemperEngineSink::OnTCPNetworkSubLimitUserChat(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13145. //{
  13146. // //效验数据
  13147. // ASSERT(wDataSize == sizeof(CMD_GR_LimitUserChat));
  13148. // if (wDataSize != sizeof(CMD_GR_LimitUserChat)) return false;
  13149. //
  13150. // //消息处理
  13151. // CMD_GR_LimitUserChat * pLimitUserChat = (CMD_GR_LimitUserChat *)pData;
  13152. //
  13153. // //获取用户
  13154. // WORD wBindIndex = LOWORD(dwSocketID);
  13155. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13156. // if (pIServerUserItem == NULL) return false;
  13157. //
  13158. // //目标用户
  13159. // IServerUserItem * pITargerUserItem = m_ServerUserManager.SearchUserItem(pLimitUserChat->dwTargetUserID);
  13160. // if (pITargerUserItem == NULL) return true;
  13161. //
  13162. // //变量定义
  13163. // DWORD dwAddRight = 0, dwRemoveRight = 0;
  13164. //
  13165. // //大厅聊天
  13166. // if (pLimitUserChat->cbLimitFlags == OSF_ROOM_CHAT)
  13167. // {
  13168. // if (CMasterRight::CanLimitRoomChat(pIServerUserItem->GetMasterRight()) == false) return false;
  13169. //
  13170. // if (pLimitUserChat->cbLimitValue == TRUE)
  13171. // dwAddRight |= UR_CANNOT_ROOM_CHAT;
  13172. // else
  13173. // dwRemoveRight |= UR_CANNOT_ROOM_CHAT;
  13174. // }
  13175. //
  13176. // //游戏聊天
  13177. // if (pLimitUserChat->cbLimitFlags == OSF_GAME_CHAT)
  13178. // {
  13179. // if (CMasterRight::CanLimitGameChat(pIServerUserItem->GetMasterRight()) == false) return false;
  13180. //
  13181. // if (pLimitUserChat->cbLimitValue == TRUE)
  13182. // dwAddRight |= UR_CANNOT_GAME_CHAT;
  13183. // else
  13184. // dwRemoveRight |= UR_CANNOT_GAME_CHAT;
  13185. // }
  13186. //
  13187. // //大厅私聊
  13188. // if (pLimitUserChat->cbLimitFlags == OSF_ROOM_WISPER)
  13189. // {
  13190. // if (CMasterRight::CanLimitWisper(pIServerUserItem->GetMasterRight()) == false) return false;
  13191. //
  13192. // if (pLimitUserChat->cbLimitValue == TRUE)
  13193. // dwAddRight |= UR_CANNOT_WISPER;
  13194. // else
  13195. // dwRemoveRight |= UR_CANNOT_WISPER;
  13196. // }
  13197. //
  13198. // //发送喇叭
  13199. // if (pLimitUserChat->cbLimitFlags == OSF_SEND_BUGLE)
  13200. // {
  13201. // if (CMasterRight::CanLimitUserChat(pIServerUserItem->GetMasterRight()) == false) return false;
  13202. //
  13203. // if (pLimitUserChat->cbLimitValue == TRUE)
  13204. // dwAddRight |= UR_CANNOT_BUGLE;
  13205. // else
  13206. // dwRemoveRight |= UR_CANNOT_BUGLE;
  13207. // }
  13208. //
  13209. // if (dwAddRight != 0 || dwRemoveRight != 0)
  13210. // {
  13211. // pITargerUserItem->ModifyUserRight(dwAddRight, dwRemoveRight);
  13212. //
  13213. // //发送通知
  13214. // CMD_GR_ConfigUserRight cur;
  13215. // ZeroMemory(&cur, sizeof(cur));
  13216. // cur.dwUserRight = pITargerUserItem->GetUserRight();
  13217. //
  13218. // SendData(pITargerUserItem, MDM_GR_CONFIG, SUB_GR_CONFIG_USER_RIGHT, &cur, sizeof(cur));
  13219. //
  13220. // //发送消息
  13221. // SendRequestFailure(pIServerUserItem, TEXT("用户聊天权限配置成功!"), 0);
  13222. // }
  13223. // else return false;
  13224. //
  13225. // return true;
  13226. //}
  13227. //解散所有所有游戏中牌桌
  13228. bool CAttemperEngineSink::OnTCPNetworkSubKickAllUser()
  13229. {
  13230. //消息处理
  13231. //CMD_GR_KickAllUser * pKillAllUser = (CMD_GR_KickAllUser *)pData;
  13232. //效验数据
  13233. //ASSERT(wDataSize <= sizeof(CMD_GR_KickAllUser));
  13234. //if (wDataSize > sizeof(CMD_GR_KickAllUser)) return false;
  13235. //ASSERT(wDataSize == CountStringBuffer(pKillAllUser->szKickMessage));
  13236. //if (wDataSize != CountStringBuffer(pKillAllUser->szKickMessage)) return false;
  13237. //获取用户
  13238. //WORD wBindIndex = LOWORD(dwSocketID);
  13239. //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13240. //if (pIServerUserItem == NULL) return false;
  13241. //权限判断
  13242. //ASSERT(CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == true);
  13243. //if (CMasterRight::CanKillUser(pIServerUserItem->GetMasterRight()) == false) return false;
  13244. //解散所有游戏
  13245. for (auto value : m_TableFrameArray)
  13246. {
  13247. auto pTableFrame = value.second;
  13248. //获取桌子
  13249. if (pTableFrame->GetStartCount() ==0 ) continue;
  13250. pTableFrame->DismissGame();
  13251. }
  13252. //tagBindParameter *pBindParameter = m_pNormalParameter;
  13253. //for( INT i = 0; i < m_pGameServiceOption->wMaxPlayer; i++ )
  13254. //{
  13255. // //目录用户
  13256. // IServerUserItem * pITargerUserItem= pBindParameter->pIServerUserItem;
  13257. // if (pITargerUserItem==NULL || pITargerUserItem==pIServerUserItem )
  13258. // {
  13259. // pBindParameter++;
  13260. // continue;
  13261. // }
  13262. // //发送消息
  13263. // SendRoomMessage(pITargerUserItem,pKillAllUser->szKickMessage,SMT_CHAT|SMT_EJECT|SMT_CLOSE_LINK|SMT_CLOSE_ROOM);
  13264. // pBindParameter++;
  13265. //}
  13266. return true;
  13267. }
  13268. //发布消息
  13269. bool CAttemperEngineSink::OnTCPNetworkSubSendMessage(VOID * pData, WORD wDataSize)
  13270. {
  13271. //获取用户
  13272. //WORD wBindIndex = LOWORD(dwSocketID);
  13273. //IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13274. //if (pIServerUserItem == NULL) return false;
  13275. //权限判断
  13276. //ASSERT(CMasterRight::CanIssueMessage(pIServerUserItem->GetMasterRight()) == true);
  13277. //if (CMasterRight::CanIssueMessage(pIServerUserItem->GetMasterRight()) == false) return false;
  13278. //变量定义
  13279. CMD_GR_SendMessage *pSysMessage = (CMD_GR_SendMessage *)pData;
  13280. if (pSysMessage->cbLoop == TRUE)
  13281. {
  13282. //定于变量
  13283. tagSystemMessage *pSendMessage = new tagSystemMessage;
  13284. ZeroMemory(pSendMessage, sizeof(tagSystemMessage));
  13285. //构造消息
  13286. pSendMessage->dwLastTime = (DWORD)time(NULL);
  13287. pSendMessage->SystemMessage.dwMessageID = TEMP_MESSAGE_ID;
  13288. pSendMessage->SystemMessage.cbAllRoom = pSysMessage->cbAllRoom;
  13289. if (pSysMessage->cbRoom == TRUE && pSysMessage->cbGame == TRUE)
  13290. pSendMessage->SystemMessage.cbMessageType = 3;
  13291. else if (pSysMessage->cbRoom == TRUE)
  13292. pSendMessage->SystemMessage.cbMessageType = 2;
  13293. else if (pSysMessage->cbGame == TRUE)
  13294. pSendMessage->SystemMessage.cbMessageType = 1;
  13295. pSendMessage->SystemMessage.dwTimeRate = pSysMessage->dwTimeRate;
  13296. pSendMessage->SystemMessage.tStartTime = (DWORD)time(NULL);
  13297. pSendMessage->SystemMessage.tConcludeTime = pSysMessage->tConcludeTime;
  13298. lstrcpyn(pSendMessage->SystemMessage.szSystemMessage, pSysMessage->szSystemMessage, CountArray(pSendMessage->SystemMessage.szSystemMessage));
  13299. //记录消息
  13300. m_SystemMessageActive.Add(pSendMessage);
  13301. }
  13302. //消息处理
  13303. return SendSystemMessage((CMD_GR_SendMessage *)pData, wDataSize);
  13304. }
  13305. //解散游戏
  13306. bool CAttemperEngineSink::OnTCPNetworkSubDismissGame(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13307. {
  13308. //效验数据
  13309. ASSERT(wDataSize == sizeof(CMD_GR_DismissGame));
  13310. if (wDataSize != sizeof(CMD_GR_DismissGame)) return false;
  13311. //获取用户
  13312. WORD wBindIndex = LOWORD(dwSocketID);
  13313. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13314. if (pIServerUserItem == NULL) return false;
  13315. //权限判断
  13316. ASSERT(CMasterRight::CanDismissGame(pIServerUserItem->GetMasterRight()) == true);
  13317. if (CMasterRight::CanDismissGame(pIServerUserItem->GetMasterRight()) == false) return false;
  13318. //消息处理
  13319. CMD_GR_DismissGame * pDismissGame = (CMD_GR_DismissGame *)pData;
  13320. auto pTableFrame = GetTableFrame(pDismissGame->wDismissTableNum);
  13321. if (!pTableFrame)
  13322. return false;
  13323. //解散游戏
  13324. if (pTableFrame->IsGameStarted()) pTableFrame->DismissGame();
  13325. //pTableFrame->SendGameMessage(TEXT("抱歉,此桌已被管理员解散游戏"), 0);
  13326. //SetUserServerID(pIServerUserItem, 0);
  13327. return true;
  13328. }
  13329. bool CAttemperEngineSink::OnTCPNetworkSubDeletePrivateTableReq(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13330. {
  13331. UserInfo::PB_CS_C_DELETE_PRIVATE_ROOM_REQ RoomReq;
  13332. RoomReq.ParseFromArray(pData, wDataSize);
  13333. //处理消息
  13334. CMD_GR_DELETE_PRIVATE_ROOM_REQ req;
  13335. ZeroMemory(&req, sizeof(req));
  13336. req.wTableID = RoomReq.wtableid();
  13337. req.wChairID = RoomReq.wchairid();
  13338. req.leftTime = RoomReq.lefttime();
  13339. //获取用户
  13340. WORD wBindIndex = LOWORD(dwSocketID);
  13341. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13342. if (pIServerUserItem == NULL) return false;
  13343. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  13344. if (!pTableFrame)
  13345. {
  13346. SendRequestFailure(pIServerUserItem, TEXT("房间已被删除!"), 0);
  13347. return true;
  13348. }
  13349. TCHAR szTemp[32] = { 0 };
  13350. if (pTableFrame != nullptr) pTableFrame->GetPrivateTableID(szTemp, 32);
  13351. CString csTemp = szTemp;
  13352. if (csTemp.IsEmpty()) {
  13353. SendRequestFailure(pIServerUserItem,TEXT("不是好友房间,不能解散!"), 0);
  13354. return true;
  13355. }
  13356. auto pUserItem = pTableFrame->GetTableUserItem(req.wChairID);
  13357. if (pUserItem == NULL) {
  13358. SendRequestFailure(pIServerUserItem, TEXT("您的座位号有误,不能解散!"), 0);
  13359. return true;
  13360. }
  13361. if (pIServerUserItem->GetUserID() != pUserItem->GetUserID())
  13362. {
  13363. return true;
  13364. }
  13365. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  13366. if (cbUserStatus != US_PLAYING && cbUserStatus != US_READY && cbUserStatus != US_SIT && cbUserStatus != US_PLAYINGWAIT)//用户判断
  13367. {
  13368. SendRequestFailure(pIServerUserItem, TEXT("您当前的状态不能申请解散!"), 0);
  13369. return true;
  13370. }
  13371. pTableFrame->DeletePrivateTableReq(pIServerUserItem, req);
  13372. pTableFrame->DeletePrivateTableResp(pIServerUserItem, 1, true);
  13373. return true;
  13374. }
  13375. //删除私有房间
  13376. bool CAttemperEngineSink::OnTCPNetworkSubDeletePrivateTableResp(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13377. {
  13378. UserInfo::PB_CS_C_DELETE_PRIVATE_ROOM_RESP RoomResp;
  13379. RoomResp.ParseFromArray(pData, wDataSize);
  13380. //处理消息
  13381. CMD_GR_DELETE_PRIVATE_ROOM_RESP pDeleteResp;
  13382. ZeroMemory(&pDeleteResp, sizeof(pDeleteResp));
  13383. pDeleteResp.wTableID = RoomResp.wtableid();
  13384. pDeleteResp.wChairID = RoomResp.wchairid();
  13385. pDeleteResp.bAgree = RoomResp.bagree();
  13386. //获取用户
  13387. WORD wBindIndex = LOWORD(dwSocketID);
  13388. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13389. if (pIServerUserItem == NULL) return false;
  13390. auto pTableFrame = GetTableFrame(pDeleteResp.wTableID);
  13391. if (!pTableFrame)
  13392. {
  13393. //SendRequestFailure(pIServerUserItem, TEXT("房间已被删除!"), 0);
  13394. return true;
  13395. }
  13396. TCHAR szTemp[32] = { 0 };
  13397. if (pTableFrame != nullptr) pTableFrame->GetPrivateTableID(szTemp, 32);
  13398. CString csTemp = szTemp;
  13399. if (csTemp.IsEmpty()) {
  13400. SendRequestFailure(pIServerUserItem, TEXT("不是私有房间,不能删除!"), 0);
  13401. return true;
  13402. }
  13403. auto pUserItem = pTableFrame->GetTableUserItem(pDeleteResp.wChairID);
  13404. if (pUserItem == NULL) return false;
  13405. if (pUserItem->GetUserID() != pIServerUserItem->GetUserID())
  13406. return false;
  13407. BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
  13408. if (cbUserStatus != US_PLAYING && cbUserStatus != US_READY && cbUserStatus != US_SIT && cbUserStatus != US_PLAYINGWAIT)//用户判断
  13409. {
  13410. SendRequestFailure(pIServerUserItem, TEXT("您当前的状态不能投票!"), 0);
  13411. return true;
  13412. }
  13413. pTableFrame->DeletePrivateTableResp(pIServerUserItem, pDeleteResp.bAgree);
  13414. return true;
  13415. }
  13416. //警告命令
  13417. bool CAttemperEngineSink::OnTCPNetworkSubWarningUser(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  13418. {
  13419. //效验数据
  13420. ASSERT(wDataSize == sizeof(CMD_GR_SendWarning));
  13421. if (wDataSize != sizeof(CMD_GR_SendWarning)) return false;
  13422. //提取数据
  13423. CMD_GR_SendWarning * pSendWarning = (CMD_GR_SendWarning*)pData;
  13424. ASSERT(pSendWarning != NULL);
  13425. //获取用户
  13426. WORD wBindIndex = LOWORD(dwSocketID);
  13427. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  13428. if (pIServerUserItem == NULL) return false;
  13429. IServerUserItem * pITargetUserItem = m_ServerUserManager.SearchUserItem(pSendWarning->dwTargetUserID);
  13430. if (pITargetUserItem == NULL) return true;
  13431. //权限判断
  13432. ASSERT(CMasterRight::CanSendWarning(pIServerUserItem->GetMasterRight()) == true);
  13433. if (CMasterRight::CanSendWarning(pIServerUserItem->GetMasterRight()) == false) return false;
  13434. //权限判断
  13435. ASSERT(pIServerUserItem->GetMasterOrder() > pITargetUserItem->GetMasterOrder());
  13436. if (pIServerUserItem->GetMasterOrder() < pITargetUserItem->GetMasterOrder()) return false;
  13437. //发送警告
  13438. TCHAR szMessage[128] = TEXT("");
  13439. _sntprintf(szMessage, CountArray(szMessage), TEXT("警告:%s"), pSendWarning->szWarningMessage);
  13440. SendRequestFailure(pITargetUserItem, szMessage, 0);
  13441. return true;
  13442. }
  13443. //用户登录
  13444. VOID CAttemperEngineSink::OnEventUserLogon(IServerUserItem * pIServerUserItem, bool bAlreadyOnLine)
  13445. {
  13446. CTraceService::TraceString(TEXT("用户登录 OnEventUserLogon"), TraceLevel_Debug);
  13447. //获取参数
  13448. WORD wBindIndex = pIServerUserItem->GetBindIndex();
  13449. bool bAndroidUser = pIServerUserItem->IsAndroidUser();
  13450. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  13451. /*if (pIServerUserItem->GetUserStatus() == US_LOOKON)
  13452. {
  13453. pIServerUserItem->SetUserStatus(US_FREE, INVALID_TABLE, INVALID_CHAIR, true);
  13454. }*/
  13455. //玩家获取自己的数据
  13456. SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, pIServerUserItem->GetUserID());
  13457. TurntableLogon::PB_CS_S_LogonSuccess Success;
  13458. //发送数据
  13459. std::string pbdata = Success.SerializePartialAsString();
  13460. SendData(pBindParameter->dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FINISH, (void*)pbdata.c_str(), pbdata.length());
  13461. //立即登录
  13462. if (pIServerUserItem->GetTableID() == INVALID_TABLE)
  13463. {
  13464. WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule();
  13465. if ((wMobileUserRule&BEHAVIOR_LOGON_IMMEDIATELY) != 0)
  13466. {
  13467. MobileUserImmediately(pIServerUserItem);
  13468. }
  13469. else
  13470. {
  13471. SendViewTableUserInfoPacketToMobileUser(pIServerUserItem, INVALID_CHAIR);
  13472. }
  13473. m_Data.dLoginQOK++;
  13474. pIServerUserItem->SetClientReady(true);
  13475. }
  13476. else
  13477. {
  13478. //断线重连
  13479. auto pTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  13480. if (pTableFrame)
  13481. {
  13482. bool bRet = pTableFrame->OnEventUserOnLine(pIServerUserItem);
  13483. if (!bRet)
  13484. {
  13485. CString csTestB;
  13486. csTestB.Format(_T("断线重练失败 -> 原因:OnEventUserOnLine调用失败, 用户ID:%d,桌号:%d,状态:%d chairID=%d"), pIServerUserItem->GetUserID()
  13487. , pIServerUserItem->GetUserInfo()->wTableID
  13488. , pIServerUserItem->GetUserInfo()->cbUserStatus,
  13489. pIServerUserItem->GetChairID());
  13490. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  13491. }
  13492. else{
  13493. m_Data.dLoginDuanXianOK++;
  13494. }
  13495. }
  13496. else
  13497. {
  13498. CString csTestB;
  13499. csTestB.Format(_T("断线重练失败 -> 原因:桌号实体不存在, 用户ID:%d,桌号:%d,状态:%d"), pIServerUserItem->GetUserID()
  13500. , pIServerUserItem->GetUserInfo()->wTableID
  13501. , pIServerUserItem->GetUserInfo()->cbUserStatus);
  13502. CTraceService::TraceString(csTestB, TraceLevel_Normal);
  13503. ///+++2017-11-24
  13504. pIServerUserItem->SetUserStatus(US_FREE, INVALID_TABLE, INVALID_CHAIR, false);
  13505. }
  13506. }
  13507. //}
  13508. //网络设置
  13509. if (bAndroidUser == false)
  13510. {
  13511. if (pBindParameter->cbClientKind == CLIENT_KIND_MOBILE)
  13512. {
  13513. m_pITCPNetworkEngine->AllowBatchSend(pBindParameter->dwSocketID, true, BG_MOBILE);
  13514. }
  13515. else
  13516. {
  13517. m_pITCPNetworkEngine->AllowBatchSend(pBindParameter->dwSocketID, true, BG_COMPUTER);
  13518. }
  13519. }
  13520. //登录通知
  13521. //if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventUserLogon(pIServerUserItem);
  13522. return;
  13523. }
  13524. //用户离开
  13525. VOID CAttemperEngineSink::OnEventUserLogout(IServerUserItem * pIServerUserItem, DWORD dwLeaveReason)
  13526. {
  13527. //变量定义
  13528. DBR_GR_LeaveGameServer LeaveGameServer;
  13529. ZeroMemory(&LeaveGameServer, sizeof(LeaveGameServer));
  13530. //提取成绩
  13531. pIServerUserItem->QueryRecordInfo(LeaveGameServer.RecordInfo);
  13532. pIServerUserItem->DistillVariation(LeaveGameServer.VariationInfo);
  13533. //用户信息
  13534. LeaveGameServer.dwLeaveReason = dwLeaveReason;
  13535. LeaveGameServer.dwUserID = pIServerUserItem->GetUserID();
  13536. LeaveGameServer.dwInoutIndex = pIServerUserItem->GetInoutIndex();
  13537. LeaveGameServer.dwOnLineTimeCount = (DWORD)(time(NULL)) - pIServerUserItem->GetLogonTime();
  13538. //连接信息
  13539. LeaveGameServer.dwClientAddr = pIServerUserItem->GetClientAddr();
  13540. lstrcpyn(LeaveGameServer.szMachineID, pIServerUserItem->GetMachineID(), CountArray(LeaveGameServer.szMachineID));
  13541. //投递请求
  13542. //m_pIDBCorrespondManager->PostDataBaseRequest(pIServerUserItem->GetUserID(), DBR_GR_LEAVE_GAME_SERVER, 0L, &LeaveGameServer, sizeof(LeaveGameServer), TRUE);
  13543. //查找对象
  13544. //tagUserTaskEntry * pUserTaskEntry = m_UserTaskManager.GetUserTaskEntry(pIServerUserItem->GetUserID(), TASK_STATUS_UNFINISH | TASK_STATUS_FAILED);
  13545. //推进任务
  13546. //if (pUserTaskEntry != NULL)
  13547. //{
  13548. // PerformTaskProgress(pIServerUserItem, pUserTaskEntry, LeaveGameServer.VariationInfo.dwWinCount, LeaveGameServer.VariationInfo.dwLostCount, LeaveGameServer.VariationInfo.dwDrawCount);
  13549. //}
  13550. //汇总用户
  13551. if (m_bCollectUser == true)
  13552. {
  13553. //变量定义
  13554. CMD_CS_C_UserLeave UserLeave;
  13555. ZeroMemory(&UserLeave, sizeof(UserLeave));
  13556. //设置变量
  13557. UserLeave.dwUserID = pIServerUserItem->GetUserID();
  13558. /*DWORD dTableNum = 0;*/
  13559. if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
  13560. {
  13561. auto pat = GetTableFrame(pIServerUserItem->GetTableID());
  13562. TCHAR szTemp[32] = { 0 };
  13563. if (pat != nullptr) pat->GetPrivateTableID(szTemp, 32);
  13564. CString csTemp = szTemp;
  13565. /*if (!csTemp.IsEmpty())
  13566. {
  13567. dTableNum = _wtol(szTemp);
  13568. }*/
  13569. }
  13570. //发送消息
  13571. 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()*/);
  13572. }
  13573. //玩家退赛
  13574. //if (m_pIMatchServiceManager != NULL)
  13575. //{
  13576. // m_pIMatchServiceManager->OnEventUserQuitMatch(pIServerUserItem, 0);
  13577. //}
  13578. //删除分组
  13579. DeleteDistribute(pIServerUserItem);
  13580. //移除任务
  13581. //m_UserTaskManager.RemoveUserTask(pIServerUserItem->GetUserID());
  13582. //删除用户
  13583. m_ServerUserManager.DeleteUserItem(pIServerUserItem);
  13584. //登出通知
  13585. //if (m_pIMatchServiceManager != NULL) m_pIMatchServiceManager->OnEventUserLogout(pIServerUserItem);
  13586. return;
  13587. }
  13588. //解锁游戏币
  13589. bool CAttemperEngineSink::PerformUnlockScore(DWORD dwUserID, DWORD dwInoutIndex, DWORD dwLeaveReason)
  13590. {
  13591. return true;
  13592. ////变量定义
  13593. //DBR_GR_LeaveGameServer LeaveGameServer;
  13594. //ZeroMemory(&LeaveGameServer, sizeof(LeaveGameServer));
  13595. ////设置变量
  13596. //LeaveGameServer.dwUserID = dwUserID;
  13597. //LeaveGameServer.dwInoutIndex = dwInoutIndex;
  13598. //LeaveGameServer.dwLeaveReason = dwLeaveReason;
  13599. ////投递请求
  13600. ////m_pIDBCorrespondManager->PostDataBaseRequest(dwUserID, DBR_GR_LEAVE_GAME_SERVER, 0L, &LeaveGameServer, sizeof(LeaveGameServer));
  13601. //return true;
  13602. }
  13603. //推进任务
  13604. bool CAttemperEngineSink::PerformTaskProgress(IServerUserItem * pIServerUserItem, tagUserTaskEntry * pUserTaskEntry, DWORD dwWinCount, DWORD dwLostCount, DWORD dwDrawCount)
  13605. {
  13606. //参数校验
  13607. ASSERT(pIServerUserItem != NULL && pUserTaskEntry != NULL);
  13608. if (pIServerUserItem == NULL || pUserTaskEntry == NULL) return false;
  13609. //状态校验
  13610. if (pUserTaskEntry->pTaskParameter == NULL) return true;
  13611. if (pUserTaskEntry->cbTaskStatus != TASK_STATUS_UNFINISH) return true;
  13612. if (pUserTaskEntry->pTaskParameter->wKindID != m_pGameServiceOption->wKindID) return true;
  13613. //任务参数
  13614. tagTaskParameter * pTaskParameter = pUserTaskEntry->pTaskParameter;
  13615. //获取时间
  13616. DWORD dwSpanSecond = (DWORD)time(NULL) - pUserTaskEntry->dwLastUpdateTime;
  13617. dwSpanSecond = __min(dwSpanSecond, pUserTaskEntry->dwResidueTime);
  13618. //更新时间
  13619. pUserTaskEntry->dwResidueTime -= dwSpanSecond;
  13620. pUserTaskEntry->dwLastUpdateTime = (DWORD)time(NULL);
  13621. //任务超时
  13622. if (pUserTaskEntry->dwResidueTime == 0)
  13623. {
  13624. pUserTaskEntry->wTaskProgress = 0;
  13625. pUserTaskEntry->pTaskParameter = NULL;
  13626. pUserTaskEntry->cbTaskStatus = TASK_STATUS_FAILED;
  13627. }
  13628. //任务未完成
  13629. if (pUserTaskEntry->cbTaskStatus == TASK_STATUS_UNFINISH)
  13630. {
  13631. //任务类型
  13632. switch (pTaskParameter->wTaskType)
  13633. {
  13634. case TASK_TYPE_WIN_INNINGS: //赢局任务
  13635. {
  13636. //更新状态
  13637. pUserTaskEntry->wTaskProgress += dwWinCount;
  13638. if (pUserTaskEntry->wTaskProgress >= pTaskParameter->wTaskObject)
  13639. {
  13640. pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS;
  13641. }
  13642. break;
  13643. };
  13644. case TASK_TYPE_SUM_INNINGS: //总局任务
  13645. {
  13646. //更新状态
  13647. pUserTaskEntry->wTaskProgress += dwWinCount + dwLostCount + dwDrawCount;
  13648. if (pUserTaskEntry->wTaskProgress >= pTaskParameter->wTaskObject)
  13649. {
  13650. pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS;
  13651. }
  13652. break;
  13653. };
  13654. case TASK_TYPE_FIRST_WIN: //首胜任务
  13655. {
  13656. //更新状态
  13657. pUserTaskEntry->wTaskProgress = dwWinCount;
  13658. if (pUserTaskEntry->wTaskProgress == pTaskParameter->wTaskObject)
  13659. {
  13660. pUserTaskEntry->cbTaskStatus = TASK_STATUS_SUCCESS;
  13661. }
  13662. else
  13663. {
  13664. pUserTaskEntry->cbTaskStatus = TASK_STATUS_FAILED;
  13665. }
  13666. break;
  13667. };
  13668. case TASK_TYPE_JOIN_MATCH: //比赛任务
  13669. {
  13670. break;
  13671. };
  13672. default:
  13673. {
  13674. ASSERT(FALSE);
  13675. break;
  13676. };
  13677. }
  13678. }
  13679. //任务完成
  13680. //if (pUserTaskEntry->cbTaskStatus == TASK_STATUS_SUCCESS)
  13681. //{
  13682. // //构造结构
  13683. // CMD_GR_S_TaskFinish TaskFinish;
  13684. // TaskFinish.wFinishTaskID = pTaskParameter->wTaskID;
  13685. // lstrcpyn(TaskFinish.szTaskName, pTaskParameter->szTaskName, CountArray(TaskFinish.szTaskName));
  13686. // //发送消息
  13687. // WORD wHeadSize = sizeof(TaskFinish) - sizeof(TaskFinish.szTaskName);
  13688. // WORD wDataSize = wHeadSize + CountStringBuffer(TaskFinish.szTaskName);
  13689. // SendData(pIServerUserItem, MDM_GR_TASK, SUB_GR_TASK_FINISH, &TaskFinish, wDataSize);
  13690. //}
  13691. //递归调用
  13692. if (pUserTaskEntry->pNextTaskEntry != NULL)
  13693. {
  13694. PerformTaskProgress(pIServerUserItem, pUserTaskEntry->pNextStatusEntry, dwWinCount, dwLostCount, dwDrawCount);
  13695. }
  13696. return true;
  13697. }
  13698. //版本检查
  13699. bool CAttemperEngineSink::PerformCheckVersion(DWORD dwPlazaVersion, DWORD dwFrameVersion, DWORD dwClientVersion, DWORD dwSocketID)
  13700. {
  13701. //变量定义
  13702. bool bMustUpdateClient = false;
  13703. bool bAdviceUpdateClient = false;
  13704. //游戏版本
  13705. //if (VERSION_EFFICACY == TRUE)
  13706. //{
  13707. // if (GetSubVer(dwClientVersion) < GetSubVer(m_pGameServiceAttrib->dwClientVersion)) bAdviceUpdateClient = true;
  13708. // if (GetMainVer(dwClientVersion) != GetMainVer(m_pGameServiceAttrib->dwClientVersion)) bMustUpdateClient = true;
  13709. // if (GetProductVer(dwClientVersion) != GetProductVer(m_pGameServiceAttrib->dwClientVersion)) bMustUpdateClient = true;
  13710. //}
  13711. //else
  13712. {
  13713. if (GetSubVer(dwClientVersion) < GetSubVer(m_pGameParameter->dwClientVersion)) bAdviceUpdateClient = true;
  13714. if (GetMainVer(dwClientVersion) != GetMainVer(m_pGameParameter->dwClientVersion)) bMustUpdateClient = true;
  13715. if (GetProductVer(dwClientVersion) != GetProductVer(m_pGameParameter->dwClientVersion)) bMustUpdateClient = true;
  13716. }
  13717. //更新通知
  13718. if ((bMustUpdateClient == true) || (bAdviceUpdateClient == true))
  13719. {
  13720. //变量定义
  13721. CMD_GR_UpdateNotify UpdateNotify;
  13722. ZeroMemory(&UpdateNotify, sizeof(UpdateNotify));
  13723. //变量定义
  13724. UpdateNotify.cbMustUpdatePlaza = false;
  13725. UpdateNotify.cbMustUpdateClient = bMustUpdateClient;
  13726. UpdateNotify.cbAdviceUpdateClient = bAdviceUpdateClient;
  13727. //当前版本
  13728. UpdateNotify.dwCurrentPlazaVersion = VERSION_PLAZA;
  13729. UpdateNotify.dwCurrentFrameVersion = VERSION_FRAME;
  13730. UpdateNotify.dwCurrentClientVersion = m_pGameServiceAttrib->dwClientVersion;
  13731. //发送消息
  13732. SendData(dwSocketID, MDM_GR_LOGON, SUB_GR_UPDATE_NOTIFY, &UpdateNotify, sizeof(UpdateNotify));
  13733. //中止判断
  13734. if (bMustUpdateClient == true)
  13735. {
  13736. m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  13737. return false;
  13738. }
  13739. }
  13740. return true;
  13741. }
  13742. //切换连接
  13743. bool CAttemperEngineSink::SwitchUserItemConnect(IServerUserItem * pIServerUserItem, TCHAR szMachineID[LEN_MACHINE_ID], WORD wTargetIndex, BYTE cbDeviceType, WORD wBehaviorFlags, WORD wPageTableCount)
  13744. {
  13745. //效验参数
  13746. ASSERT((pIServerUserItem != NULL) && (wTargetIndex != INVALID_WORD));
  13747. if ((pIServerUserItem == NULL) || (wTargetIndex == INVALID_WORD))
  13748. {
  13749. //CTraceService::TraceString(TEXT("登录失败,切换链接校验失败。"), TraceLevel_Normal);
  13750. return false;
  13751. }
  13752. //断开用户
  13753. if (pIServerUserItem->GetBindIndex() != INVALID_WORD)
  13754. {
  13755. // by jn 此次修改存在风险,属于尝试性修改。稍后观察是否有其他风险 2017/08/21
  13756. // pIServerUserItem->DetachBindStatus(); //强制解绑
  13757. //发送通知
  13758. LPCTSTR pszMessage = TEXT("网络连接不稳定,请重试.");
  13759. SendRoomMessage(pIServerUserItem, pszMessage, SMT_CLOSE_SEND);
  13760. //绑定参数
  13761. WORD wSourceIndex = pIServerUserItem->GetBindIndex();
  13762. tagBindParameter * pSourceParameter = GetBindParameter(wSourceIndex);
  13763. //解除绑定
  13764. ASSERT((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem));
  13765. if ((pSourceParameter != NULL) && (pSourceParameter->pIServerUserItem == pIServerUserItem))
  13766. {
  13767. pSourceParameter->pIServerUserItem = NULL;
  13768. }
  13769. //断开用户
  13770. if (pIServerUserItem->IsAndroidUser() == true)
  13771. {
  13772. //m_AndroidUserManager.DeleteAndroidUserItem(pSourceParameter->dwSocketID, true);
  13773. }
  13774. else
  13775. {
  13776. m_pITCPNetworkEngine->ShutDownSocket(pSourceParameter->dwSocketID);
  13777. }
  13778. }
  13779. //变量定义
  13780. bool bAndroidUser = (wTargetIndex >= INDEX_ANDROID);
  13781. tagBindParameter * pTargetParameter = GetBindParameter(wTargetIndex);
  13782. //激活用户
  13783. pTargetParameter->pIServerUserItem = pIServerUserItem;
  13784. pIServerUserItem->SetUserParameter(pTargetParameter->dwClientAddr, wTargetIndex, szMachineID, bAndroidUser, false);
  13785. if (pIServerUserItem->GetUserStatus() == US_OFFLINE)
  13786. {
  13787. //变量定义
  13788. WORD wTableID = pIServerUserItem->GetTableID();
  13789. WORD wChairID = pIServerUserItem->GetChairID();
  13790. pIServerUserItem->SetUserStatus(US_PLAYING, wTableID, wChairID);
  13791. }
  13792. //手机标识
  13793. if (pTargetParameter->cbClientKind == CLIENT_KIND_MOBILE)
  13794. {
  13795. pIServerUserItem->SetMobileUser(true);
  13796. SetMobileUserParameter(pIServerUserItem, cbDeviceType, wBehaviorFlags, wPageTableCount);
  13797. }
  13798. //取消托管
  13799. if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH)
  13800. {
  13801. if (pIServerUserItem->IsTrusteeUser() == true && pIServerUserItem->GetUserStatus() != US_PLAYING)
  13802. {
  13803. pIServerUserItem->SetTrusteeUser(false);
  13804. }
  13805. }
  13806. if (IsJC(7777))
  13807. {
  13808. TCHAR szString[512] = TEXT("");
  13809. _sntprintf(szString, CountArray(szString), TEXT("用户 %s(%d) 切换连接登录"), pIServerUserItem->GetUserInfo()->szNickName, pIServerUserItem->GetUserInfo()->dwUserID);
  13810. CTraceService::TraceString(szString, TraceLevel_Normal);
  13811. }
  13812. //2018.7.2 奚志远 解决大退房间列表不见了
  13813. DWORD dwUserID = pIServerUserItem->GetUserID();
  13814. auto iter = m_UserID_2_PriTableIDGROUP.find(dwUserID);
  13815. if (iter == m_UserID_2_PriTableIDGROUP.end())
  13816. {
  13817. JN_GR_RoomListGroup Temp;
  13818. ZeroMemory(&Temp, sizeof(Temp));
  13819. std::pair<DWORD, JN_GR_RoomListGroup> Sub(dwUserID, Temp);
  13820. m_UserID_2_PriTableIDGROUP.insert(Sub);
  13821. UserInfo::PB_CS_S_RoomListGroupSend GroupSend;
  13822. for (WORD i = 0; i < Temp.Num; i++)
  13823. {
  13824. if (Temp.jgrDate[i].dwRoomNumber == 0)break;
  13825. UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate();
  13826. RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID);
  13827. RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID);
  13828. RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber);
  13829. RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del);
  13830. RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen);
  13831. RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu);
  13832. RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody);
  13833. RoomList->set_dwbody(Temp.jgrDate[i].dwBody);
  13834. RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa);
  13835. std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz;
  13836. RoomList->set_szip(szIp);
  13837. RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai);
  13838. RoomList->set_wfengding(Temp.jgrDate[i].wFengDing);
  13839. RoomList->set_tmp1(Temp.jgrDate[i].tmp1);
  13840. RoomList->set_tmp2(Temp.jgrDate[i].tmp2);
  13841. RoomList->set_tmp3(Temp.jgrDate[i].tmp3);
  13842. RoomList->set_tmp4(Temp.jgrDate[i].tmp4);
  13843. RoomList->set_tmp5(Temp.jgrDate[i].tmp5);
  13844. for (WORD i = 0; i < 4; i++)
  13845. {
  13846. RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]);
  13847. }
  13848. RoomList->set_wport(Temp.jgrDate[i].wPort);
  13849. }
  13850. GroupSend.set_num(Temp.Num);
  13851. //发送数据
  13852. std::string pbdata = GroupSend.SerializePartialAsString();
  13853. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length());
  13854. }
  13855. else
  13856. {
  13857. JN_GR_RoomListGroupSend Temp;
  13858. ZeroMemory(&Temp, sizeof(JN_GR_RoomListGroupSend));
  13859. for (int i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++)
  13860. {
  13861. CopyMemory(&(Temp.jgrDate[i]), &(m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i]), sizeof(JN_GR_RoomList));
  13862. //纠正
  13863. Temp.jgrDate[i].tmp1 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].bRoomCreatePay;
  13864. Temp.jgrDate[i].tmp2 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp1;
  13865. Temp.jgrDate[i].tmp3 = m_UserID_2_PriTableIDGROUP[dwUserID].jgrDate[i].tmp2;
  13866. }
  13867. UserInfo::PB_CS_S_RoomListGroupSend GroupSend;
  13868. for (WORD i = 0; i < m_UserID_2_PriTableIDGROUP[dwUserID].Num; i++)
  13869. {
  13870. if (Temp.jgrDate[i].dwRoomNumber == 0)break;
  13871. UserInfo::PB_CS_S_RoomList* RoomList = GroupSend.add_jgrdate();
  13872. RoomList->set_dwuserid(Temp.jgrDate[i].dwUserID);
  13873. RoomList->set_dwserverid(Temp.jgrDate[i].dwServerID);
  13874. RoomList->set_dwroomnumber(Temp.jgrDate[i].dwRoomNumber);
  13875. RoomList->set_dwinsert_updata_del(Temp.jgrDate[i].dwInsert_UpData_Del);
  13876. RoomList->set_dwdifen(Temp.jgrDate[i].dwDiFen);
  13877. RoomList->set_dwjushu(Temp.jgrDate[i].dwJuShu);
  13878. RoomList->set_dwreadybody(Temp.jgrDate[i].dwReadyBody);
  13879. RoomList->set_dwbody(Temp.jgrDate[i].dwBody);
  13880. RoomList->set_bwanfa(Temp.jgrDate[i].bWanFa);
  13881. std::string szIp = CW2AEX<1024>(Temp.jgrDate[i].szIp, CP_UTF8).m_psz;
  13882. RoomList->set_szip(szIp);
  13883. RoomList->set_bduolai(Temp.jgrDate[i].bDuoLai);
  13884. RoomList->set_wfengding(Temp.jgrDate[i].wFengDing);
  13885. RoomList->set_tmp1(Temp.jgrDate[i].tmp1);
  13886. RoomList->set_tmp2(Temp.jgrDate[i].tmp2);
  13887. RoomList->set_tmp3(Temp.jgrDate[i].tmp3);
  13888. RoomList->set_tmp4(Temp.jgrDate[i].tmp4);
  13889. RoomList->set_tmp5(Temp.jgrDate[i].tmp5);
  13890. for (WORD i = 0; i < 4; i++)
  13891. {
  13892. RoomList->add_tmp6(Temp.jgrDate[i].tmp6[i]);
  13893. }
  13894. RoomList->set_wport(Temp.jgrDate[i].wPort);
  13895. }
  13896. GroupSend.set_num(m_UserID_2_PriTableIDGROUP[dwUserID].Num);
  13897. //发送数据
  13898. std::string pbdata = GroupSend.SerializePartialAsString();
  13899. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ALL, (void*)pbdata.c_str(), pbdata.length());
  13900. }
  13901. //提示消息
  13902. //CTraceService::TraceString(szString, TraceLevel_Normal);
  13903. //登录事件
  13904. OnEventUserLogon(pIServerUserItem, true);
  13905. //安全提示
  13906. //if ((bAndroidUser == false) && (bIsOffLine == false) && (bSameMachineID == false))
  13907. //{
  13908. // SendRoomMessage(pIServerUserItem, TEXT("请注意,您的帐号在另一地方进入了此游戏房间,对方被迫离开!"), SMT_CLOSE_SEND);
  13909. //}
  13910. return true;
  13911. }
  13912. //登录失败
  13913. bool CAttemperEngineSink::SendLogonFailure(LPCTSTR pszString, LONG lErrorCode, DWORD dwSocketID)
  13914. {
  13915. CTraceService::TraceString(TEXT("登录失败 SendLogonFailure"), TraceLevel_Exception);
  13916. //变量定义
  13917. TurntableLogon::PB_CS_S_LogonFailure Failure;
  13918. Failure.set_lerrorcode(lErrorCode);
  13919. std::string szDescribeString = CW2AEX<1024>(pszString, CP_UTF8).m_psz;
  13920. Failure.set_szdescribestring(szDescribeString);
  13921. //发送数据
  13922. std::string pbdata = Failure.SerializePartialAsString();
  13923. SendData(dwSocketID, MDM_GR_LOGON, SUB_M_LOGON_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  13924. return true;
  13925. }
  13926. //银行失败
  13927. //bool CAttemperEngineSink::SendInsureFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszString, LONG lErrorCode, BYTE cbActivityGame)
  13928. //{
  13929. // CTraceService::TraceString(TEXT("银行失败 SendInsureFailure"), TraceLevel_Debug);
  13930. // //效验参数
  13931. // ASSERT(pIServerUserItem != NULL);
  13932. // if (pIServerUserItem == NULL) return false;
  13933. //
  13934. // //变量定义
  13935. // CMD_GR_S_UserInsureFailure UserInsureFailure;
  13936. // ZeroMemory(&UserInsureFailure, sizeof(UserInsureFailure));
  13937. //
  13938. // //构造数据
  13939. // UserInsureFailure.cbActivityGame = cbActivityGame;
  13940. // UserInsureFailure.lErrorCode = lErrorCode;
  13941. // lstrcpyn(UserInsureFailure.szDescribeString, pszString, CountArray(UserInsureFailure.szDescribeString));
  13942. //
  13943. // //数据属性
  13944. // WORD wDataSize = CountStringBuffer(UserInsureFailure.szDescribeString);
  13945. // WORD wHeadSize = sizeof(UserInsureFailure) - sizeof(UserInsureFailure.szDescribeString);
  13946. //
  13947. // //发送数据
  13948. // SendData(pIServerUserItem, MDM_GR_INSURE, SUB_GR_USER_INSURE_FAILURE, &UserInsureFailure, wHeadSize + wDataSize);
  13949. //
  13950. // return true;
  13951. //}
  13952. //请求失败
  13953. bool CAttemperEngineSink::SendRequestFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode)
  13954. {
  13955. CTraceService::TraceString(TEXT("请求失败 SendRequestFailure"), TraceLevel_Debug);
  13956. //变量定义
  13957. CMD_GR_RequestFailure RequestFailure;
  13958. ZeroMemory(&RequestFailure, sizeof(RequestFailure));
  13959. //设置变量
  13960. RequestFailure.lErrorCode = lErrorCode;
  13961. lstrcpyn(RequestFailure.szDescribeString, pszDescribe, CountArray(RequestFailure.szDescribeString));
  13962. UserInfo::PB_CS_S_RequestFailure Failure;
  13963. Failure.set_lerrorcode(RequestFailure.lErrorCode);
  13964. std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz;
  13965. Failure.set_szdescribestring(szDescribeString);
  13966. //发送数据
  13967. std::string pbdata = Failure.SerializePartialAsString();
  13968. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  13969. return true;
  13970. }
  13971. //道具失败
  13972. //bool CAttemperEngineSink::SendPropertyFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode, WORD wRequestArea)
  13973. //{
  13974. // //变量定义
  13975. // CMD_GR_PropertyFailure PropertyFailure;
  13976. // ZeroMemory(&PropertyFailure, sizeof(PropertyFailure));
  13977. //
  13978. // //设置变量
  13979. // PropertyFailure.lErrorCode = lErrorCode;
  13980. // PropertyFailure.wRequestArea = wRequestArea;
  13981. // lstrcpyn(PropertyFailure.szDescribeString, pszDescribe, CountArray(PropertyFailure.szDescribeString));
  13982. //
  13983. // //发送数据
  13984. // WORD wDataSize = CountStringBuffer(PropertyFailure.szDescribeString);
  13985. // WORD wHeadSize = sizeof(PropertyFailure) - sizeof(PropertyFailure.szDescribeString);
  13986. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_PROPERTY_FAILURE, &PropertyFailure, wHeadSize + wDataSize);
  13987. //
  13988. // return true;
  13989. //}
  13990. //发送用户
  13991. bool CAttemperEngineSink::SendUserInfoPacket(IServerUserItem * pIServerUserItem, DWORD dwSocketID, bool bSendAndroidFalg)
  13992. {
  13993. //效验参数
  13994. ASSERT(pIServerUserItem != NULL);
  13995. if (pIServerUserItem == NULL) return false;
  13996. //变量定义
  13997. BYTE cbBuffer[SOCKET_TCP_PACKET];
  13998. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  13999. tagUserInfoHead * pUserInfoHead = (tagUserInfoHead *)cbBuffer;
  14000. CSendPacketHelper SendPacket(cbBuffer + sizeof(tagUserInfoHead), sizeof(cbBuffer) - sizeof(tagUserInfoHead));
  14001. //用户属性
  14002. pUserInfoHead->wFaceID = pUserInfo->wFaceID;
  14003. pUserInfoHead->dwGameID = pUserInfo->dwGameID;
  14004. pUserInfoHead->dwUserID = pUserInfo->dwUserID;
  14005. pUserInfoHead->dwGroupID = pUserInfo->dwGroupID;
  14006. pUserInfoHead->dwCustomID = pUserInfo->dwCustomID;
  14007. //用户属性
  14008. pUserInfoHead->cbGender = pUserInfo->cbGender;
  14009. pUserInfoHead->cbMemberOrder = pUserInfo->cbMemberOrder;
  14010. pUserInfoHead->cbMasterOrder = pUserInfo->cbMasterOrder;
  14011. pUserInfoHead->bIsAndroid = pIServerUserItem->IsAndroidUser() && bSendAndroidFalg;
  14012. //用户状态
  14013. pUserInfoHead->wTableID = pUserInfo->wTableID;
  14014. pUserInfoHead->wChairID = pUserInfo->wChairID;
  14015. pUserInfoHead->cbUserStatus = pUserInfo->cbUserStatus;
  14016. //用户局数
  14017. pUserInfoHead->dwWinCount = pUserInfo->dwWinCount;
  14018. pUserInfoHead->dwLostCount = pUserInfo->dwLostCount;
  14019. pUserInfoHead->dwDrawCount = pUserInfo->dwDrawCount;
  14020. pUserInfoHead->dwFleeCount = pUserInfo->dwFleeCount;
  14021. pUserInfoHead->dwExperience = pUserInfo->dwExperience;
  14022. pUserInfoHead->lLoveLiness = pUserInfo->lLoveLiness;
  14023. //用户积分
  14024. pUserInfoHead->lGrade = pUserInfo->lGrade;
  14025. pUserInfoHead->lInsure = pUserInfo->lInsure;
  14026. pUserInfoHead->lIngot = 0;
  14027. //用户成绩
  14028. pUserInfoHead->lScore = pUserInfo->lScore;
  14029. pUserInfoHead->lScore += pIServerUserItem->GetTrusteeScore();
  14030. pUserInfoHead->lScore += pIServerUserItem->GetFrozenedScore();
  14031. //叠加信息
  14032. SendPacket.AddPacket(pUserInfo->szNickName, DTP_GR_NICK_NAME);
  14033. SendPacket.AddPacket(pUserInfo->szGroupName, DTP_GR_GROUP_NAME);
  14034. SendPacket.AddPacket(pUserInfo->szUnderWrite, DTP_GR_UNDER_WRITE);
  14035. //发送数据
  14036. if (dwSocketID == INVALID_DWORD)
  14037. {
  14038. WORD wHeadSize = sizeof(tagUserInfoHead);
  14039. SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_ENTER, cbBuffer, wHeadSize + SendPacket.GetDataSize());
  14040. SendUserInfoPacketBatchToMobileUser(pIServerUserItem);
  14041. }
  14042. else
  14043. {
  14044. WORD wHeadSize = sizeof(tagUserInfoHead);
  14045. SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_ENTER, cbBuffer, wHeadSize + SendPacket.GetDataSize());
  14046. }
  14047. return true;
  14048. }
  14049. ////广播道具
  14050. //bool CAttemperEngineSink::SendPropertyMessage(DWORD dwSourceID, DWORD dwTargerID, WORD wPropertyIndex, WORD wPropertyCount)
  14051. //{
  14052. // //构造结构
  14053. // CMD_GR_S_PropertyMessage PropertyMessage;
  14054. // PropertyMessage.wPropertyIndex = wPropertyIndex;
  14055. // PropertyMessage.dwSourceUserID = dwSourceID;
  14056. // PropertyMessage.dwTargerUserID = dwTargerID;
  14057. // PropertyMessage.wPropertyCount = wPropertyCount;
  14058. //
  14059. // //在线用户
  14060. // WORD wUserIndex = 0;
  14061. // while (true)
  14062. // {
  14063. // IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  14064. // if (pIServerUserItemSend == NULL) break;
  14065. // SendData(pIServerUserItemSend, MDM_GR_USER, SUB_GR_PROPERTY_MESSAGE, &PropertyMessage, sizeof(PropertyMessage));
  14066. // }
  14067. //
  14068. // return true;
  14069. //}
  14070. //道具效应
  14071. //bool CAttemperEngineSink::SendPropertyEffect(IServerUserItem * pIServerUserItem)
  14072. //{
  14073. // //参数校验
  14074. // if (pIServerUserItem == NULL) return false;
  14075. //
  14076. // //构造结构
  14077. // CMD_GR_S_PropertyEffect PropertyEffect;
  14078. // PropertyEffect.wUserID = pIServerUserItem->GetUserID();
  14079. // PropertyEffect.cbMemberOrder = pIServerUserItem->GetMemberOrder();
  14080. //
  14081. // //在线用户
  14082. // WORD wUserIndex = 0;
  14083. // while (true)
  14084. // {
  14085. // IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  14086. // if (pIServerUserItemSend == NULL) break;
  14087. // SendData(pIServerUserItemSend, MDM_GR_USER, SUB_GR_PROPERTY_EFFECT, &PropertyEffect, sizeof(PropertyEffect));
  14088. // }
  14089. //
  14090. // return true;
  14091. //}
  14092. //道具事件
  14093. //bool CAttemperEngineSink::OnEventPropertyBuyPrep(WORD cbRequestArea, WORD wPropertyIndex, IServerUserItem *pISourceUserItem, IServerUserItem *pTargetUserItem)
  14094. //{
  14095. // //目标玩家
  14096. // if (pTargetUserItem == NULL)
  14097. // {
  14098. // //发送消息
  14099. // SendPropertyFailure(pISourceUserItem, TEXT("赠送失败,您要赠送的玩家已经离开!"), 0L, cbRequestArea);
  14100. //
  14101. // return false;
  14102. // }
  14103. //
  14104. // //房间判断
  14105. // if ((m_pGameServiceOption->wServerType == GAME_GENRE_GOLD || m_pGameServiceOption->wServerType == GAME_GENRE_MATCH) &&
  14106. // (wPropertyIndex == PROPERTY_ID_SCORE_CLEAR || wPropertyIndex == PROPERTY_ID_TWO_CARD || wPropertyIndex == PROPERTY_ID_FOUR_CARD || wPropertyIndex == PROPERTY_ID_POSSESS))
  14107. // {
  14108. // //发送消息
  14109. // SendPropertyFailure(pISourceUserItem, TEXT("此房间不可以使用此道具,购买失败"), 0L, cbRequestArea);
  14110. //
  14111. // return false;
  14112. // }
  14113. //
  14114. // //查找道具
  14115. // tagPropertyInfo * pPropertyInfo = m_GamePropertyManager.SearchPropertyItem(wPropertyIndex);
  14116. //
  14117. // //有效效验
  14118. // if (pPropertyInfo == NULL)
  14119. // {
  14120. // //发送消息
  14121. // SendPropertyFailure(pISourceUserItem, TEXT("此道具还未启用,购买失败!"), 0L, cbRequestArea);
  14122. //
  14123. // return false;
  14124. // }
  14125. //
  14126. // //自己使用
  14127. // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_MESELF) == 0 && pISourceUserItem == pTargetUserItem)
  14128. // {
  14129. // //发送消息
  14130. // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可自己使用,购买失败!"), 0L, cbRequestArea);
  14131. //
  14132. // return false;
  14133. // }
  14134. //
  14135. // //玩家使用
  14136. // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_PLAYER) == 0 && pISourceUserItem != pTargetUserItem)
  14137. // {
  14138. // //发送消息
  14139. // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可赠送给玩家,只能自己使用,购买失败!"), 0L, cbRequestArea);
  14140. //
  14141. // return false;
  14142. // }
  14143. //
  14144. // //旁观范围
  14145. // if ((pPropertyInfo->wIssueArea&PT_SERVICE_AREA_LOOKON) == 0)
  14146. // {
  14147. // //变量定义
  14148. // WORD wTableID = pTargetUserItem->GetTableID();
  14149. // if (wTableID != INVALID_TABLE)
  14150. // {
  14151. // //变量定义
  14152. // WORD wEnumIndex = 0;
  14153. // //获取桌子
  14154. // auto pTableFrame = GetTableFrame(wTableID);
  14155. // if (!pTableFrame)
  14156. // return false;
  14157. // //枚举用户
  14158. // do
  14159. // {
  14160. // //获取用户
  14161. // IServerUserItem * pIServerUserItem = pTableFrame->EnumLookonUserItem(wEnumIndex++);
  14162. // if (pIServerUserItem == nullptr) break;
  14163. // if (pIServerUserItem == pTargetUserItem)
  14164. // {
  14165. // //发送消息
  14166. // SendPropertyFailure(pISourceUserItem, TEXT("此道具不可赠送给旁观用户,购买失败!"), 0L, cbRequestArea);
  14167. // return false;
  14168. // }
  14169. // } while (true);
  14170. // }
  14171. // }
  14172. //
  14173. // //道具判断
  14174. // switch (wPropertyIndex)
  14175. // {
  14176. // case PROPERTY_ID_SCORE_CLEAR: //负分清零
  14177. // {
  14178. // //变量定义
  14179. // SCORE lCurrScore = pTargetUserItem->GetUserScore();
  14180. // if (lCurrScore >= 0)
  14181. // {
  14182. // //变量定义
  14183. // TCHAR szMessage[128] = TEXT("");
  14184. // if (pISourceUserItem == pTargetUserItem)
  14185. // _sntprintf(szMessage, CountArray(szMessage), TEXT("您现在的积分已经是非负数,不需要使用负分清零道具!"));
  14186. // else
  14187. // _sntprintf(szMessage, CountArray(szMessage), TEXT("[ %s ]现在的积分已经是非负数,不需要使用负分清零道具!"), pTargetUserItem->GetNickName());
  14188. //
  14189. // //发送消息
  14190. // SendPropertyFailure(pISourceUserItem, szMessage, 0L, cbRequestArea);
  14191. //
  14192. // return false;
  14193. // }
  14194. // break;
  14195. // }
  14196. // case PROPERTY_ID_ESCAPE_CLEAR: //逃跑清零
  14197. // {
  14198. // //变量定义
  14199. // DWORD dwCurrFleeCount = pTargetUserItem->GetUserInfo()->dwFleeCount;
  14200. // if (dwCurrFleeCount == 0)
  14201. // {
  14202. // //变量定义
  14203. // TCHAR szMessage[128] = TEXT("");
  14204. // if (pISourceUserItem == pTargetUserItem)
  14205. // _sntprintf(szMessage, CountArray(szMessage), TEXT("您现在的逃跑率已经为0,不需要使用逃跑清零道具!"));
  14206. // else
  14207. // _sntprintf(szMessage, CountArray(szMessage), TEXT("[ %s ]现在的逃跑率已经为0,不需要使用逃跑清零道具!"), pTargetUserItem->GetNickName());
  14208. //
  14209. // //发送消息
  14210. // SendPropertyFailure(pISourceUserItem, szMessage, 0L, cbRequestArea);
  14211. //
  14212. // return false;
  14213. // }
  14214. // break;
  14215. // }
  14216. // default: break;
  14217. // }
  14218. //
  14219. // return true;
  14220. //}
  14221. //绑定用户
  14222. IServerUserItem * CAttemperEngineSink::GetBindUserItem(WORD wBindIndex)
  14223. {
  14224. //获取参数
  14225. tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  14226. //获取用户
  14227. if (pBindParameter != NULL)
  14228. {
  14229. return pBindParameter->pIServerUserItem;
  14230. }
  14231. else
  14232. {
  14233. CString strErr;
  14234. strErr.Format(_T("绑定用户失败 pBindParameter=NULL"));
  14235. CTraceService::TraceString(strErr, TraceLevel_Normal);
  14236. }
  14237. //错误断言
  14238. ASSERT(FALSE);
  14239. return NULL;
  14240. }
  14241. //绑定参数
  14242. tagBindParameter * CAttemperEngineSink::GetBindParameter(WORD wBindIndex)
  14243. {
  14244. //无效连接
  14245. if (wBindIndex == INVALID_WORD)
  14246. {
  14247. //CString strErr;
  14248. //strErr.Format(_T("绑定用户失败 wBindIndex=INVALID_WORD"));
  14249. //CTraceService::TraceString(strErr, TraceLevel_Normal);
  14250. return NULL;
  14251. }
  14252. if (m_pGameServiceOption == NULL)
  14253. {
  14254. CString strErr;
  14255. strErr.Format(_T("绑定用户失败 m_pGameServiceOption=NULL"));
  14256. CTraceService::TraceString(strErr, TraceLevel_Normal);
  14257. return NULL;
  14258. }
  14259. //常规连接
  14260. if (wBindIndex < m_pGameServiceOption->wMaxPlayer)
  14261. {
  14262. return m_pNormalParameter + wBindIndex;
  14263. }
  14264. //机器连接
  14265. //if ((wBindIndex >= INDEX_ANDROID) && (wBindIndex < (INDEX_ANDROID + MAX_ANDROID)))
  14266. //{
  14267. // return m_pAndroidParameter + (wBindIndex - INDEX_ANDROID);
  14268. //}
  14269. //else
  14270. {
  14271. ///---记录下非法索引
  14272. CString strErr;
  14273. strErr.Format(_T("绑定索引错误,wBindIndex=%d"), wBindIndex);
  14274. CTraceService::TraceString(strErr, TraceLevel_Warning);
  14275. }
  14276. //错误断言
  14277. ASSERT(FALSE);
  14278. return NULL;
  14279. }
  14280. //道具类型
  14281. WORD CAttemperEngineSink::GetPropertyType(WORD wPropertyIndex)
  14282. {
  14283. switch (wPropertyIndex)
  14284. {
  14285. case PROPERTY_ID_CAR: case PROPERTY_ID_EGG: case PROPERTY_ID_CLAP: case PROPERTY_ID_KISS: case PROPERTY_ID_BEER:
  14286. case PROPERTY_ID_CAKE: case PROPERTY_ID_RING: case PROPERTY_ID_BEAT: case PROPERTY_ID_BOMB: case PROPERTY_ID_SMOKE:
  14287. case PROPERTY_ID_VILLA: case PROPERTY_ID_BRICK: case PROPERTY_ID_FLOWER:
  14288. {
  14289. return PT_TYPE_PRESENT;
  14290. };
  14291. case PROPERTY_ID_TWO_CARD: case PROPERTY_ID_FOUR_CARD: case PROPERTY_ID_SCORE_CLEAR: case PROPERTY_ID_ESCAPE_CLEAR:
  14292. case PROPERTY_ID_TRUMPET: case PROPERTY_ID_TYPHON: case PROPERTY_ID_GUARDKICK_CARD: case PROPERTY_ID_POSSESS:
  14293. case PROPERTY_ID_BLUERING_CARD: case PROPERTY_ID_YELLOWRING_CARD: case PROPERTY_ID_WHITERING_CARD: case PROPERTY_ID_REDRING_CARD:
  14294. case PROPERTY_ID_VIPROOM_CARD:
  14295. {
  14296. return PT_TYPE_PROPERTY;
  14297. };
  14298. default: break;
  14299. }
  14300. ASSERT(false);
  14301. return PT_TYPE_ERROR;
  14302. }
  14303. //分配用户
  14304. bool CAttemperEngineSink::PerformDistribute()
  14305. {
  14306. //人数校验
  14307. if (m_DistributeManage.GetCount() < m_pGameServiceOption->wMinDistributeUser) return false;
  14308. //分配用户
  14309. while (true)
  14310. {
  14311. //人数校验
  14312. if (m_DistributeManage.GetCount() < m_pGameServiceOption->wMinPartakeGameUser) break;
  14313. //变量定义
  14314. CDistributeInfoArray DistributeInfoArray;
  14315. //获取用户
  14316. WORD wRandCount = __max(m_pGameServiceOption->wMaxPartakeGameUser - m_pGameServiceOption->wMinPartakeGameUser + 1, 1);
  14317. WORD wChairCount = m_pGameServiceOption->wMinPartakeGameUser + rand() % wRandCount;
  14318. WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray, wChairCount);
  14319. if (wDistributeCount < m_pGameServiceOption->wMinPartakeGameUser) break;
  14320. //寻找位置
  14321. std::shared_ptr<CTableFrame> pCurrTableFrame;
  14322. for (WORD i = 0; i < m_pGameServiceOption->wTableCount; i++)
  14323. {
  14324. auto pTableFrame = GetTableFrame(i);//获取对象
  14325. if (!pTableFrame)
  14326. continue;
  14327. //状态判断
  14328. if (pTableFrame->GetSitUserCount() == 0)
  14329. {
  14330. pCurrTableFrame = pTableFrame;
  14331. break;
  14332. }
  14333. }
  14334. //桌子判断
  14335. if (!pCurrTableFrame) break;
  14336. //玩家坐下
  14337. bool bSitSuccess = true;
  14338. INT_PTR nSitFailedIndex = INVALID_CHAIR;
  14339. for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++)
  14340. {
  14341. //变量定义
  14342. WORD wChairID = pCurrTableFrame->GetNullChairID();
  14343. //分配用户
  14344. if (wChairID != INVALID_CHAIR)
  14345. {
  14346. //获取用户
  14347. IServerUserItem * pIServerUserItem = DistributeInfoArray[nIndex].pIServerUserItem;
  14348. //用户坐下
  14349. if (pCurrTableFrame->PerformSitDownAction(wChairID, pIServerUserItem) == false)
  14350. {
  14351. bSitSuccess = false;
  14352. nSitFailedIndex = nIndex;
  14353. break;
  14354. }
  14355. }
  14356. }
  14357. //坐下结果
  14358. if (bSitSuccess)
  14359. {
  14360. //移除结点
  14361. while (DistributeInfoArray.GetCount() > 0)
  14362. {
  14363. m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode);
  14364. DistributeInfoArray.RemoveAt(0);
  14365. }
  14366. }
  14367. else
  14368. {
  14369. for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++)
  14370. {
  14371. if (nSitFailedIndex == nIndex)
  14372. {
  14373. m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[nIndex].pPertainNode);
  14374. }
  14375. else
  14376. {
  14377. //用户起立
  14378. if (DistributeInfoArray[nIndex].pIServerUserItem->GetTableID() != INVALID_TABLE)
  14379. {
  14380. WORD wTableID = DistributeInfoArray[nIndex].pIServerUserItem->GetTableID();
  14381. auto pTableFrame = GetTableFrame(wTableID);//获取对象
  14382. if (!pTableFrame)
  14383. return false;
  14384. pTableFrame->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem);
  14385. }
  14386. }
  14387. }
  14388. }
  14389. }
  14390. //提示消息
  14391. CString csTest;
  14392. csTest.Format(_T("分配用户IDI_DISTRIBUTE_USER ---->分组值m_DistributeManage.GetCount() %d "), m_DistributeManage.GetCount());
  14393. CTraceService::TraceString(csTest, TraceLevel_Normal);
  14394. return true;
  14395. }
  14396. //配置机器
  14397. bool CAttemperEngineSink::InitAndroidUser()
  14398. {
  14399. //机器参数
  14400. tagAndroidUserParameter AndroidUserParameter;
  14401. ZeroMemory(&AndroidUserParameter, sizeof(AndroidUserParameter));
  14402. //配置参数
  14403. AndroidUserParameter.bServiceContinue = true;
  14404. AndroidUserParameter.pGameParameter = m_pGameParameter;
  14405. AndroidUserParameter.pGameServiceAttrib = m_pGameServiceAttrib;
  14406. AndroidUserParameter.pGameServiceOption = m_pGameServiceOption;
  14407. //服务组件
  14408. AndroidUserParameter.pITimerEngine = m_pITimerEngine;
  14409. AndroidUserParameter.pIServerUserManager = &m_ServerUserManager;
  14410. AndroidUserParameter.pIGameServiceManager = m_pIGameServiceManager;
  14411. AndroidUserParameter.pITCPNetworkEngineEvent = QUERY_OBJECT_PTR_INTERFACE(m_pIAttemperEngine, ITCPNetworkEngineEvent);
  14412. //服务配置
  14413. if (m_pGameServiceAttrib->wChairCount >= MAX_CHAIR)
  14414. {
  14415. AndroidUserParameter.bServiceContinue = false;
  14416. AndroidUserParameter.dwMinSitInterval = MIN_INTERVAL_TIME;
  14417. AndroidUserParameter.dwMaxSitInterval = MAX_INTERVAL_TIME;
  14418. }
  14419. //设置对象
  14420. //if (m_AndroidUserManager.InitAndroidUser(AndroidUserParameter) == false)
  14421. //{
  14422. // return false;
  14423. //}
  14424. return true;
  14425. }
  14426. std::wstring CAttemperEngineSink::GetNextPrivateRoomID(int idLen)
  14427. {
  14428. //连接协调服务器,创建私有房间号码
  14429. static std::wstring str = L"123456789";
  14430. static std::wstring zero = L"0";
  14431. srand(time(nullptr));
  14432. const int tryTimes = 100; //失败尝试次数
  14433. int a = m_pGameServiceOption->wServerID % 100 / 10; // 十位数
  14434. int b = m_pGameServiceOption->wServerID % 100 % 10; // 个位数
  14435. if (b == 9) a++;
  14436. std::wstring roomID(L"");
  14437. for (int i = 0; i < tryTimes; i++)
  14438. {
  14439. roomID.resize(idLen);
  14440. for (int j = 0; j < idLen; j++)
  14441. roomID[j] = str[rand() % str.length()];
  14442. roomID[4] = str[a];
  14443. if (b == 9)
  14444. roomID[5] = zero[0];
  14445. else
  14446. roomID[5] = str[b];
  14447. auto titer = m_PriTableID_2_TableID.find(roomID);
  14448. if (titer == m_PriTableID_2_TableID.end())
  14449. return roomID;
  14450. }
  14451. return roomID;
  14452. }
  14453. bool CAttemperEngineSink::DecUserTable(DWORD dwUser, DWORD dwTableID,int TableCount)
  14454. {
  14455. const auto iterate = m_UserID_2_PriTableIDGROUP.find(dwUser);
  14456. if (iterate == std::end(m_UserID_2_PriTableIDGROUP))
  14457. return false;
  14458. JN_GR_RoomListGroup Temp = iterate->second;
  14459. JN_GR_RoomListGroup TempSet;
  14460. ZeroMemory(&TempSet, sizeof(JN_GR_RoomListGroup));
  14461. bool bEnd = false;
  14462. int iNum = 0;
  14463. for (int i = 0; i < (Temp.Num > 30 ? 30 : Temp.Num); i++)
  14464. {
  14465. if (Temp.jgrDate[i].dwRoomNumber == dwTableID && dwTableID > 0)
  14466. {
  14467. //同步到中心服务器
  14468. JN_GR_RoomListBig UserChat = Temp.jgrDate[i];
  14469. UserChat.dwInsert_UpData_Del = 2;
  14470. UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat));
  14471. //俱乐部删除桌子广播
  14472. if (UserChat.roomType == 1 && UserChat.tmp6[0] != 0)
  14473. {
  14474. if (UserChat.tmp5 == 0 || (UserChat.tmp5 == 1 && TableCount > 1))
  14475. {
  14476. CMD_GR_UserData UserData;
  14477. ZeroMemory(&UserData, sizeof(UserData));
  14478. UserData.dwClubID = UserChat.tmp6[0];
  14479. UserData.newsFlag = 2;
  14480. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  14481. }
  14482. }
  14483. }
  14484. else
  14485. {
  14486. if (Temp.jgrDate[i].dwRoomNumber != 0)
  14487. {
  14488. TempSet.jgrDate[iNum] = Temp.jgrDate[i];
  14489. iNum++;
  14490. }
  14491. }
  14492. }
  14493. TempSet.Num = iNum;
  14494. if (iNum == 0) bEnd = true;
  14495. if (bEnd)
  14496. {
  14497. m_UserID_2_PriTableIDGROUP.erase(dwUser);
  14498. }
  14499. else
  14500. {
  14501. m_UserID_2_PriTableIDGROUP[dwUser] = TempSet;
  14502. }
  14503. return true;
  14504. }
  14505. std::shared_ptr<CTableFrame> CAttemperEngineSink::CreatePrivateTable(DWORD RoomID, WORD wGameType)
  14506. {
  14507. CString PrivateTableID;
  14508. PrivateTableID.Format(_T("%d"), RoomID);
  14509. //桌子参数
  14510. tagTableFrameParameter TableFrameParameter;
  14511. ZeroMemory(&TableFrameParameter, sizeof(TableFrameParameter));
  14512. //内核组件
  14513. TableFrameParameter.pITimerEngine = m_pITimerEngine;
  14514. TableFrameParameter.pIKernelDataBaseEngine = m_pIKernelDataBaseEngine;
  14515. TableFrameParameter.pIRecordDataBaseEngine = m_pIRecordDataBaseEngine;
  14516. //服务组件
  14517. TableFrameParameter.pIMainServiceFrame = this;
  14518. //TableFrameParameter.pIAndroidUserManager = &m_AndroidUserManager;
  14519. TableFrameParameter.pIGameServiceManager = m_pIGameServiceManager;
  14520. //配置参数
  14521. TableFrameParameter.pGameParameter = m_pGameParameter;
  14522. TableFrameParameter.pGameServiceAttrib = m_pGameServiceAttrib;
  14523. TableFrameParameter.pGameServiceOption = m_pGameServiceOption;
  14524. auto table = std::make_shared<CTableFrame>();
  14525. TCHAR szTemp[32] = { 0 };
  14526. if (table != nullptr) table->GetPrivateTableID(szTemp, 32);
  14527. CString csTemp = szTemp;
  14528. table->SetPrivateTableID(PrivateTableID.GetBuffer(0));
  14529. PrivateTableID.ReleaseBuffer();
  14530. const auto tableId = m_privateTableIDPool.front();
  14531. m_privateTableIDPool.pop_front(); ///---如果用完了呢?
  14532. m_TableFrameArray[tableId] = table;
  14533. //配置桌子
  14534. if (table->InitializationFrame(tableId, TableFrameParameter, wGameType) == false)
  14535. {
  14536. return nullptr;
  14537. }
  14538. return table;
  14539. }
  14540. //配置桌子
  14541. bool CAttemperEngineSink::InitTableFrameArray()
  14542. {
  14543. //桌子参数
  14544. tagTableFrameParameter TableFrameParameter;
  14545. ZeroMemory(&TableFrameParameter, sizeof(TableFrameParameter));
  14546. //内核组件
  14547. TableFrameParameter.pITimerEngine = m_pITimerEngine;
  14548. TableFrameParameter.pIKernelDataBaseEngine = m_pIKernelDataBaseEngine;
  14549. TableFrameParameter.pIRecordDataBaseEngine = m_pIRecordDataBaseEngine;
  14550. //服务组件
  14551. TableFrameParameter.pIMainServiceFrame = this;
  14552. //TableFrameParameter.pIAndroidUserManager = &m_AndroidUserManager;
  14553. TableFrameParameter.pIGameServiceManager = m_pIGameServiceManager;
  14554. //配置参数
  14555. TableFrameParameter.pGameParameter = m_pGameParameter;
  14556. TableFrameParameter.pGameServiceAttrib = m_pGameServiceAttrib;
  14557. TableFrameParameter.pGameServiceOption = m_pGameServiceOption;
  14558. //创建桌子
  14559. for (WORD i = 0; i < m_pGameServiceOption->wTableCount; i++)
  14560. {
  14561. //创建对象
  14562. auto pTableFrame = std::make_shared<CTableFrame>();
  14563. m_TableFrameArray[i] = pTableFrame;
  14564. //配置桌子
  14565. if (pTableFrame->InitializationFrame(i, TableFrameParameter,1) == false)
  14566. {
  14567. return false;
  14568. }
  14569. //绑定桌子
  14570. //if (m_pIMatchServiceManager != NULL)
  14571. //{
  14572. // m_pIMatchServiceManager->BindTableFrame(QUERY_OBJECT_PTR_INTERFACE((m_TableFrameArray[i]), ITableFrame), i);
  14573. //}
  14574. }
  14575. return true;
  14576. }
  14577. //配置比赛
  14578. //bool CAttemperEngineSink::InitMatchServiceManager()
  14579. //{
  14580. // //参数校验
  14581. // if (m_pIMatchServiceManager == NULL) return true;
  14582. //
  14583. // //桌子参数
  14584. // tagMatchManagerParameter MatchManagerParameter;
  14585. // ZeroMemory(&MatchManagerParameter, sizeof(MatchManagerParameter));
  14586. //
  14587. // //配置参数
  14588. // MatchManagerParameter.pGameMatchOption = m_pGameMatchOption;
  14589. // MatchManagerParameter.pGameServiceOption = m_pGameServiceOption;
  14590. // MatchManagerParameter.pGameServiceAttrib = m_pGameServiceAttrib;
  14591. //
  14592. // //内核组件
  14593. // MatchManagerParameter.pITimerEngine = m_pITimerEngine;
  14594. // MatchManagerParameter.pICorrespondManager = m_pIDBCorrespondManager;
  14595. // MatchManagerParameter.pTCPNetworkEngine = QUERY_OBJECT_PTR_INTERFACE(m_pIAttemperEngine, ITCPNetworkEngineEvent);
  14596. //
  14597. // //服务组件
  14598. // MatchManagerParameter.pIMainServiceFrame = this;
  14599. // MatchManagerParameter.pIServerUserItemSink = this;
  14600. // MatchManagerParameter.pIAndroidUserManager = &m_AndroidUserManager;
  14601. // MatchManagerParameter.pIServerUserManager = QUERY_OBJECT_INTERFACE(m_ServerUserManager, IServerUserManager);
  14602. //
  14603. // //初始化接口
  14604. // m_pIMatchServiceManager->InitMatchInterface(MatchManagerParameter);
  14605. //
  14606. // return true;
  14607. //}
  14608. //发送请求
  14609. bool CAttemperEngineSink::SendUIControlPacket(WORD wRequestID, VOID * pData, WORD wDataSize)
  14610. {
  14611. //发送数据
  14612. CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  14613. pServiceUnits->PostControlRequest(wRequestID, pData, wDataSize);
  14614. return true;
  14615. }
  14616. //插入分配
  14617. bool CAttemperEngineSink::InsertDistribute(IServerUserItem * pIServerUserItem)
  14618. {
  14619. //效验参数
  14620. ASSERT(pIServerUserItem != NULL);
  14621. if (pIServerUserItem == NULL) return false;
  14622. //状态判断
  14623. ASSERT(pIServerUserItem->GetUserStatus() < US_PLAYING);
  14624. if (pIServerUserItem->GetUserStatus() >= US_PLAYING) return false;
  14625. //比赛类型
  14626. //if (m_pIMatchServiceManager != NULL)
  14627. //{
  14628. // //获取参数
  14629. // WORD wBindIndex = pIServerUserItem->GetBindIndex();
  14630. // tagBindParameter * pBindParameter = GetBindParameter(wBindIndex);
  14631. // //加入比赛
  14632. // return m_pIMatchServiceManager->OnEventUserJoinMatch(pIServerUserItem, 0, pBindParameter->dwSocketID);
  14633. //}
  14634. //变量定义
  14635. tagDistributeInfo DistributeInfo;
  14636. ZeroMemory(&DistributeInfo, sizeof(DistributeInfo));
  14637. //设置变量
  14638. DistributeInfo.pIServerUserItem = pIServerUserItem;
  14639. DistributeInfo.wLastTableID = pIServerUserItem->GetTableID();
  14640. DistributeInfo.pPertainNode = NULL;
  14641. //加入数组
  14642. if (m_DistributeManage.InsertDistributeNode(DistributeInfo) == false)
  14643. {
  14644. return pIServerUserItem->IsAndroidUser() ? false : true;
  14645. }
  14646. //用户起立
  14647. if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  14648. {
  14649. WORD wTableID = pIServerUserItem->GetTableID();
  14650. auto pTableFrame = GetTableFrame(wTableID);//获取对象
  14651. if (!pTableFrame)
  14652. return false;
  14653. pTableFrame->PerformStandUpAction(pIServerUserItem);
  14654. }
  14655. UserInfo::PB_CS_S_Distribute Distribute;
  14656. //发送数据
  14657. std::string pbdata = Distribute.SerializePartialAsString();
  14658. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_WAIT_DISTRIBUTE, (void*)pbdata.c_str(), pbdata.length());
  14659. //分配判断
  14660. bool bDistribute = false;
  14661. if (m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_IMMEDIATE) bDistribute = true;
  14662. //执行分组
  14663. if (bDistribute == true)
  14664. {
  14665. PerformDistribute();
  14666. }
  14667. return true;
  14668. }
  14669. bool CAttemperEngineSink::DeletePrivateTable(ITableFrame* pTableFrame)
  14670. {
  14671. if (!pTableFrame)
  14672. return false;
  14673. TCHAR szTemp[32] = { 0 };
  14674. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  14675. CString csTemp = szTemp;
  14676. JN_GR_RoomListBig TargetRoom;
  14677. ZeroMemory(&TargetRoom, sizeof(TargetRoom));
  14678. if (csTemp.IsEmpty())
  14679. {
  14680. return false;
  14681. }
  14682. else
  14683. {
  14684. CWHDataLocker DataLocker(m_CriticalSection);
  14685. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  14686. while (it != m_PrivateRoomAll.end())
  14687. {
  14688. JN_GR_RoomListBig Temp = it->second;
  14689. if (Temp.dwRoomNumber == _ttol(szTemp))
  14690. {
  14691. TargetRoom = Temp;
  14692. break;
  14693. }
  14694. it++;
  14695. }
  14696. }
  14697. //俱乐部自动创房判定
  14698. int TableCount = 0;
  14699. if (TargetRoom.tmp5 == 1 && TargetRoom.roomType == 1)
  14700. {
  14701. int FreeTalbe = 0;
  14702. CWHDataLocker DataLocker(m_CriticalSection);
  14703. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  14704. while (it != m_PrivateRoomAll.end())
  14705. {
  14706. JN_GR_RoomListBig Temp = it->second;
  14707. if (Temp.tmp6[0] == TargetRoom.tmp6[0] && Temp.roomStatus == 0 && Temp.dwRoomNumber != TargetRoom.dwRoomNumber)
  14708. {
  14709. FreeTalbe++;
  14710. }
  14711. if (Temp.tmp6[0] == TargetRoom.tmp6[0])
  14712. {
  14713. TableCount++;
  14714. }
  14715. it++;
  14716. }
  14717. //没有找到空闲的桌子
  14718. if (FreeTalbe == 0)
  14719. {
  14720. this->OnAutoCreateRoomToDB(TargetRoom.tmp6[0], 0, TargetRoom.tmp4);
  14721. }
  14722. }
  14723. bool result = DecUserTable(pTableFrame->GetPrivateTableOwnerID(), _ttol(szTemp), TableCount);
  14724. if (result == false)
  14725. {
  14726. //无条件上报删除该桌子
  14727. TCHAR szString[512] = { 0 };
  14728. _sntprintf(szString, CountArray(szString), TEXT("上报删除桌子 [ tableID=%d ]"), _ttol(szTemp));
  14729. CTraceService::TraceString(szString, TraceLevel_Warning);
  14730. TargetRoom.dwInsert_UpData_Del = 2;
  14731. UpdataBodyOwnRoomToServer(&TargetRoom, sizeof(TargetRoom));
  14732. //俱乐部删除桌子广播
  14733. if (TargetRoom.roomType == 1 && TargetRoom.tmp6[0] != 0)
  14734. {
  14735. if (TargetRoom.tmp5 == 0 || (TargetRoom.tmp5 == 1 && TableCount > 1))
  14736. {
  14737. CMD_GR_UserData UserData;
  14738. ZeroMemory(&UserData, sizeof(UserData));
  14739. UserData.dwClubID = TargetRoom.tmp6[0];
  14740. UserData.newsFlag = 2;
  14741. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  14742. }
  14743. }
  14744. }
  14745. m_TableFrameArray.erase(pTableFrame->GetTableID()); ///---yd 释放桌子后,tableId回收到“私有桌子ID池”中
  14746. m_privateTableIDPool.push_back(pTableFrame->GetTableID());
  14747. std::wstring sPrivateTableID = szTemp;
  14748. m_PriTableID_2_TableID.erase(sPrivateTableID);
  14749. return true;
  14750. }
  14751. //敏感词过滤
  14752. void CAttemperEngineSink::SensitiveWordFilter(LPCTSTR pMsg, LPTSTR pszFiltered, int nMaxLen)
  14753. {
  14754. //m_WordsFilter.Filtrate(pMsg, pszFiltered, nMaxLen);
  14755. }
  14756. //删除用户
  14757. bool CAttemperEngineSink::DeleteDistribute(IServerUserItem * pIServerUserItem)
  14758. {
  14759. //移除节点
  14760. m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
  14761. return true;
  14762. }
  14763. //设置参数
  14764. void CAttemperEngineSink::SetMobileUserParameter(IServerUserItem * pIServerUserItem, BYTE cbDeviceType, WORD wBehaviorFlags, WORD wPageTableCount)
  14765. {
  14766. if (wPageTableCount > m_pGameServiceOption->wTableCount)wPageTableCount = m_pGameServiceOption->wTableCount;
  14767. pIServerUserItem->SetMobileUserDeskCount(wPageTableCount);
  14768. pIServerUserItem->SetMobileUserRule(wBehaviorFlags);
  14769. pIServerUserItem->SetMobileUserMachineType(cbDeviceType);
  14770. }
  14771. //群发用户信息
  14772. bool CAttemperEngineSink::SendUserInfoPacketBatchToMobileUser(IServerUserItem * pIServerUserItem)
  14773. {
  14774. //return true;
  14775. //效验参数
  14776. ASSERT(pIServerUserItem != NULL);
  14777. if (pIServerUserItem == NULL) return false;
  14778. //变量定义
  14779. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  14780. tagMobileUserInfoHead pUserInfoHead;
  14781. //用户属性
  14782. pUserInfoHead.wFaceID = pUserInfo->wFaceID;
  14783. pUserInfoHead.dwGameID = pUserInfo->dwGameID;
  14784. pUserInfoHead.dwUserID = pUserInfo->dwUserID;
  14785. pUserInfoHead.dwCustomID = pUserInfo->dwCustomID;
  14786. //用户属性
  14787. pUserInfoHead.cbGender = pUserInfo->cbGender;
  14788. pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder;
  14789. //用户状态
  14790. pUserInfoHead.wTableID = pUserInfo->wTableID;
  14791. pUserInfoHead.wChairID = pUserInfo->wChairID;
  14792. pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus;
  14793. //用户局数
  14794. pUserInfoHead.dwWinCount = pUserInfo->dwWinCount;
  14795. pUserInfoHead.dwLostCount = pUserInfo->dwLostCount;
  14796. pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount;
  14797. pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount;
  14798. pUserInfoHead.dwExperience = pUserInfo->dwExperience;
  14799. pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX;
  14800. pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY;
  14801. pUserInfoHead.iJiePing = pUserInfo->llJiePing;
  14802. pUserInfoHead.iXinYong = pUserInfo->iXinYong;
  14803. lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate));
  14804. //用户成绩
  14805. pUserInfoHead.lScore = pUserInfo->lScore;
  14806. pUserInfoHead.lScore += pIServerUserItem->GetTrusteeScore();
  14807. pUserInfoHead.lScore += pIServerUserItem->GetFrozenedScore();
  14808. lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi));
  14809. lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName));
  14810. //用户头像地址
  14811. lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl));
  14812. //IP地址
  14813. pUserInfoHead.dwClientAddr = pIServerUserItem->GetClientAddr();
  14814. UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead;
  14815. UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID);
  14816. UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID);
  14817. UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID);
  14818. UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID);
  14819. UserInfoHead.set_cbgender(pUserInfoHead.cbGender);
  14820. UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder);
  14821. UserInfoHead.set_wtableid(pUserInfoHead.wTableID);
  14822. UserInfoHead.set_wchairid(pUserInfoHead.wChairID);
  14823. UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus);
  14824. UserInfoHead.set_lscore(pUserInfoHead.lScore);
  14825. UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount);
  14826. UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount);
  14827. UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount);
  14828. UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount);
  14829. UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience);
  14830. std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz;
  14831. std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz;
  14832. std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz;
  14833. std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz;
  14834. UserInfoHead.set_sznickname(szNickname);
  14835. UserInfoHead.set_szheadurl(szHeadUrl);
  14836. UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr);
  14837. UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong);
  14838. UserInfoHead.set_rettime(RetTime);
  14839. UserInfoHead.set_chengshi(ChengShi);
  14840. UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX);
  14841. UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY);
  14842. UserInfoHead.set_ijieping(pUserInfoHead.iJiePing);
  14843. //发送数据
  14844. std::string pbdata = UserInfoHead.SerializePartialAsString();
  14845. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  14846. return true;
  14847. }
  14848. /*
  14849. ///[+++花牌增加 ---需要客户端确认下,对以前版本是否兼容
  14850. tagGameConfig gameConfig;
  14851. ZeroMemory(&gameConfig, sizeof(gameConfig));
  14852. auto pTmpTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  14853. if (pTmpTableFrame != NULL)
  14854. {
  14855. gameConfig = pTmpTableFrame->GetGameConfig();
  14856. }
  14857. SendData(pBindParameter->dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FINISH, &gameConfig, sizeof(gameConfig));
  14858. ///+++]
  14859. */
  14860. //发可视用户信息
  14861. bool CAttemperEngineSink::SendViewTableUserInfoPacketToMobileUser(IServerUserItem * pIServerUserItem, DWORD dwUserIDReq)
  14862. {
  14863. ///[+++花牌增加 ---需要客户端确认下,对以前版本是否兼容
  14864. tagGameConfig gameConfig;
  14865. ZeroMemory(&gameConfig, sizeof(gameConfig));
  14866. auto pTmpTableFrame = GetTableFrame(pIServerUserItem->GetTableID());
  14867. if (pTmpTableFrame != NULL)
  14868. {
  14869. gameConfig = pTmpTableFrame->GetGameConfig();
  14870. }
  14871. ///+++]
  14872. //变量定义
  14873. tagMobileUserInfoHead pUserInfoHead;
  14874. WORD wMobileUserRule = pIServerUserItem->GetMobileUserRule();
  14875. //WORD wTagerTableID = pIServerUserItem->GetTableID();
  14876. WORD wTagerDeskPos = pIServerUserItem->GetMobileUserDeskPos();
  14877. WORD wTagerDeskCount = pIServerUserItem->GetMobileUserDeskCount();
  14878. bool bViewModeAll = ((wMobileUserRule&VIEW_MODE_ALL) != 0);
  14879. if (wTagerDeskCount == 0) wTagerDeskCount = 1;
  14880. //枚举用户
  14881. WORD wEnumIndex = 0;
  14882. while (wEnumIndex < m_ServerUserManager.GetUserItemCount())
  14883. {
  14884. //过滤用户
  14885. IServerUserItem *pIUserItem = m_ServerUserManager.EnumUserItem(wEnumIndex++);
  14886. if (pIUserItem == NULL || (dwUserIDReq == INVALID_CHAIR && pIUserItem == pIServerUserItem)) continue; //表示请求所有人但不包含请求自己的信息
  14887. if (dwUserIDReq != INVALID_CHAIR && pIUserItem->GetUserID() != dwUserIDReq) continue; //表示只发送指定用户的信息
  14888. //部分可视
  14889. if (dwUserIDReq == INVALID_CHAIR && !bViewModeAll)
  14890. {//如果不是全图可见模式,则只发送当前桌子的用户数据
  14891. if (pIUserItem->GetTableID() < wTagerDeskPos) continue;
  14892. if (pIUserItem->GetTableID() > (wTagerDeskPos + wTagerDeskCount - 1)) continue;
  14893. }
  14894. //定义变量
  14895. tagUserInfo * pUserInfo = pIUserItem->GetUserInfo();
  14896. //前端区别麻将判断根据高八位(人数)大于0 则为扑克,反之为麻将
  14897. if (14 <= gameConfig.wSubGameID && 16 >= gameConfig.wSubGameID)//扑克表示高8位chairCount 底8位wSubGameID LYH 2018-10-18
  14898. {
  14899. BYTE cbChairCount = pTmpTableFrame->GetChairCount();
  14900. pUserInfoHead.wFaceID = ((cbChairCount << 8) | gameConfig.wSubGameID);
  14901. }
  14902. else{
  14903. pUserInfoHead.wFaceID = gameConfig.wSubGameID/*pUserInfo->wFaceID*/; ///2017-10-25 麻将复用FaceID当作游戏ID
  14904. }
  14905. //用户属性
  14906. //pUserInfoHead.wFaceID = gameConfig.wSubGameID/*pUserInfo->wFaceID*/; ///2017-10-25 复用FaceID,当作游戏ID
  14907. pUserInfoHead.dwGameID = pUserInfo->dwGameID;
  14908. pUserInfoHead.dwUserID = pUserInfo->dwUserID;
  14909. //DWORD wVenueID = 0xFFFFFFFF;
  14910. //if (isVenueServer())
  14911. //{
  14912. // //登录完成 ///---此处应客户端要求,增加场ID,用以标识登录的是金币场
  14913. // wVenueID = m_pGameServiceOption->wNodeID;
  14914. //}
  14915. //pUserInfoHead.dwCustomID = wVenueID/*pUserInfo->dwCustomID*/; ///---作为场馆ID
  14916. pUserInfoHead.dwCustomID = pUserInfo->dwCustomID;
  14917. //用户属性
  14918. pUserInfoHead.cbGender = pUserInfo->cbGender;
  14919. pUserInfoHead.cbMemberOrder = pUserInfo->cbMemberOrder;
  14920. //用户状态
  14921. pUserInfoHead.wTableID = pUserInfo->wTableID;
  14922. pUserInfoHead.wChairID = pUserInfo->wChairID;
  14923. pUserInfoHead.cbUserStatus = pUserInfo->cbUserStatus;
  14924. //用户局数
  14925. pUserInfoHead.dwWinCount = pUserInfo->dwWinCount;
  14926. pUserInfoHead.dwLostCount = pUserInfo->dwLostCount;
  14927. pUserInfoHead.dwDrawCount = pUserInfo->dwDrawCount;
  14928. pUserInfoHead.dwFleeCount = pUserInfo->dwFleeCount;
  14929. pUserInfoHead.dwExperience = pUserInfo->dwExperience;
  14930. //用户成绩
  14931. pUserInfoHead.lScore = pUserInfo->lScore;
  14932. pUserInfoHead.lScore += pIUserItem->GetTrusteeScore();
  14933. pUserInfoHead.lScore += pIUserItem->GetFrozenedScore();
  14934. pUserInfoHead.iJiePing = pUserInfo->llJiePing;
  14935. pUserInfoHead.iXinYong = pUserInfo->iXinYong;
  14936. pUserInfoHead.llDingWeiX = pUserInfo->dDingWeiX;
  14937. pUserInfoHead.llDingWeiY = pUserInfo->dDingWeiY;
  14938. lstrcpyn(pUserInfoHead.ChengShi, pUserInfo->szChengShi, CountArray(pUserInfo->szChengShi));
  14939. lstrcpyn(pUserInfoHead.szNickname, pUserInfo->szNickName, CountArray(pUserInfo->szNickName));
  14940. //用户头像地址
  14941. lstrcpyn(pUserInfoHead.szHeadUrl, pUserInfo->szHeadUrl, CountArray(pUserInfo->szHeadUrl));
  14942. //IP地址
  14943. pUserInfoHead.dwClientAddr = pIUserItem->GetClientAddr();
  14944. lstrcpyn(pUserInfoHead.RetTime, pUserInfo->RegisterDate, CountArray(pUserInfo->RegisterDate));
  14945. UserInfo::PB_CS_S_tagMobileUserInfoHead UserInfoHead;
  14946. UserInfoHead.set_wfaceid(pUserInfoHead.wFaceID);
  14947. UserInfoHead.set_dwgameid(pUserInfoHead.dwGameID);
  14948. UserInfoHead.set_dwuserid(pUserInfoHead.dwUserID);
  14949. UserInfoHead.set_dwcustomid(pUserInfoHead.dwCustomID);
  14950. UserInfoHead.set_cbgender(pUserInfoHead.cbGender);
  14951. UserInfoHead.set_cbmemberorder(pUserInfoHead.cbMemberOrder);
  14952. UserInfoHead.set_wtableid(pUserInfoHead.wTableID);
  14953. UserInfoHead.set_wchairid(pUserInfoHead.wChairID);
  14954. UserInfoHead.set_cbuserstatus(pUserInfoHead.cbUserStatus);
  14955. UserInfoHead.set_lscore(pUserInfoHead.lScore);
  14956. UserInfoHead.set_dwwincount(pUserInfoHead.dwWinCount);
  14957. UserInfoHead.set_dwlostcount(pUserInfoHead.dwLostCount);
  14958. UserInfoHead.set_dwdrawcount(pUserInfoHead.dwDrawCount);
  14959. UserInfoHead.set_dwfleecount(pUserInfoHead.dwFleeCount);
  14960. UserInfoHead.set_dwexperience(pUserInfoHead.dwExperience);
  14961. std::string szNickname = CW2AEX<1024>(pUserInfoHead.szNickname, CP_UTF8).m_psz;
  14962. std::string szHeadUrl = CW2AEX<1024>(pUserInfoHead.szHeadUrl, CP_UTF8).m_psz;
  14963. std::string RetTime = CW2AEX<1024>(pUserInfoHead.RetTime, CP_UTF8).m_psz;
  14964. std::string ChengShi = CW2AEX<1024>(pUserInfoHead.ChengShi, CP_UTF8).m_psz;
  14965. UserInfoHead.set_sznickname(szNickname);
  14966. UserInfoHead.set_szheadurl(szHeadUrl);
  14967. UserInfoHead.set_dwclientaddr(pUserInfoHead.dwClientAddr);
  14968. UserInfoHead.set_ixinyong(pUserInfoHead.iXinYong);
  14969. UserInfoHead.set_rettime(RetTime);
  14970. UserInfoHead.set_chengshi(ChengShi);
  14971. UserInfoHead.set_lldingweix(pUserInfoHead.llDingWeiX);
  14972. UserInfoHead.set_lldingweiy(pUserInfoHead.llDingWeiY);
  14973. UserInfoHead.set_ijieping(pUserInfoHead.iJiePing);
  14974. //发送数据
  14975. std::string pbdata = UserInfoHead.SerializePartialAsString();
  14976. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ENTER, (void*)pbdata.c_str(), pbdata.length());
  14977. }
  14978. return true;
  14979. }
  14980. //手机立即登录
  14981. bool CAttemperEngineSink::MobileUserImmediately(IServerUserItem * pIServerUserItem)
  14982. {
  14983. CTraceService::TraceString(TEXT("手机立即登录 MobileUserImmediately"), TraceLevel_Debug);
  14984. //动态加入
  14985. bool bDynamicJoin = true;
  14986. if (m_pGameServiceAttrib->cbDynamicJoin == FALSE) bDynamicJoin = false;
  14987. if (CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule) == false) bDynamicJoin = false;
  14988. //查找桌子
  14989. INT nStartIndex = rand() % m_pGameServiceOption->wTableCount;
  14990. for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++)
  14991. {
  14992. //定义变量
  14993. INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount;
  14994. //获取桌子
  14995. auto pTableFrame = GetTableFrame(nTableIndex);//获取对象
  14996. if (!pTableFrame)
  14997. continue;
  14998. if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue;
  14999. if (pTableFrame->IsTableLocked()) continue;
  15000. if (pTableFrame->GetChairCount() == pTableFrame->GetNullChairCount()) continue;
  15001. //无效过滤
  15002. WORD wChairID = pTableFrame->GetRandNullChairID();
  15003. if (wChairID == INVALID_CHAIR) continue;
  15004. //用户坐下
  15005. pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem);
  15006. return true;
  15007. }
  15008. //查找桌子
  15009. nStartIndex = rand() % m_pGameServiceOption->wTableCount;
  15010. for (INT_PTR i = 0; i < (m_pGameServiceOption->wTableCount); i++)
  15011. {
  15012. //定义变量
  15013. INT nTableIndex = (i + nStartIndex) % m_pGameServiceOption->wTableCount;
  15014. //获取桌子
  15015. auto pTableFrame = GetTableFrame(nTableIndex);//获取对象
  15016. if (!pTableFrame)
  15017. continue;
  15018. if ((pTableFrame->IsGameStarted() == true) && (bDynamicJoin == false)) continue;
  15019. if (pTableFrame->IsTableLocked()) continue;
  15020. //无效过滤
  15021. WORD wChairID = pTableFrame->GetRandNullChairID();
  15022. if (wChairID == INVALID_CHAIR) continue;
  15023. //用户坐下
  15024. pTableFrame->PerformSitDownAction(wChairID, pIServerUserItem);
  15025. return true;
  15026. }
  15027. //失败
  15028. SendRequestFailure(pIServerUserItem, TEXT("没找到可进入的游戏桌!"), REQUEST_FAILURE_NORMAL);
  15029. return true;
  15030. }
  15031. //发送系统消息
  15032. bool CAttemperEngineSink::SendSystemMessage(CMD_GR_SendMessage * pSendMessage, WORD wDataSize)
  15033. {
  15034. //消息处理
  15035. ASSERT(pSendMessage != NULL);
  15036. //效验数据
  15037. ASSERT(wDataSize == sizeof(CMD_GR_SendMessage) - sizeof(pSendMessage->szSystemMessage) + sizeof(TCHAR)*pSendMessage->wChatLength);
  15038. if (wDataSize != sizeof(CMD_GR_SendMessage) - sizeof(pSendMessage->szSystemMessage) + sizeof(TCHAR)*pSendMessage->wChatLength)
  15039. return false;
  15040. //所有房间
  15041. if (pSendMessage->cbAllRoom == TRUE)
  15042. {
  15043. pSendMessage->cbAllRoom = FALSE;
  15044. m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_SYSTEM_MESSAGE, pSendMessage, wDataSize/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  15045. }
  15046. //else
  15047. //{
  15048. //发送系统消息
  15049. //if (pSendMessage->cbGame == TRUE)
  15050. //SendGameMessage(pSendMessage->szSystemMessage, SMT_CHAT);
  15051. //if (pSendMessage->cbRoom == TRUE)
  15052. //SendRoomMessage(pSendMessage->szSystemMessage, SMT_CHAT);
  15053. //}
  15054. if (pSendMessage->cbGame == TRUE) SendGameMessage(pSendMessage->szSystemMessage, SMT_SYS);
  15055. return true;
  15056. }
  15057. bool CAttemperEngineSink::SetUserServerID(IServerUserItem * pIServerUserItem, BYTE cbFlag, WORD ServerID)
  15058. {
  15059. //记录用户的ServerID
  15060. CMD_CS_C_UserServer UserServer;
  15061. ZeroMemory(&UserServer, sizeof(UserServer));
  15062. UserServer.dwUserID = pIServerUserItem->GetUserID();
  15063. UserServer.cbFlag = cbFlag;
  15064. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_SERVER, &UserServer, sizeof(UserServer)/*, 0, 0, m_pIGameServiceManager == NULL ? NULL : m_pIGameServiceManager->GetDataString()*/);
  15065. return true;
  15066. }
  15067. //移除消息
  15068. void CAttemperEngineSink::RemoveSystemMessage()
  15069. {
  15070. //缓存消息
  15071. m_SystemMessageBuffer.Append(m_SystemMessageActive);
  15072. m_SystemMessageActive.RemoveAll();
  15073. }
  15074. //////////////////////////////////////////////////////////////////////////////////
  15075. // 是否监测此用户
  15076. BOOL CAttemperEngineSink::IsJC(DWORD UserID)
  15077. {
  15078. for (int i = 0; i < 20;i++)
  15079. {
  15080. if (m_JC.dUserID[i] == 0) break;
  15081. if (m_JC.dUserID[i] == UserID)
  15082. {
  15083. return TRUE;
  15084. }
  15085. }
  15086. return FALSE;
  15087. }
  15088. // 更新通道
  15089. int CAttemperEngineSink::UpDataTongDao()
  15090. {
  15091. //查询所有节点服务器信息
  15092. std::unordered_map<std::wstring, int> iptostat;
  15093. //枚举数据
  15094. POSITION Position = NULL;
  15095. //枚举数据
  15096. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  15097. {
  15098. //获取数据
  15099. CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  15100. if (pGameServerItem == NULL) continue;
  15101. bool finda = false;
  15102. std::wstring cc = pGameServerItem->m_GameServer.szServerAddr;
  15103. auto iter = iptostat.find(cc);
  15104. if (iter != std::end(iptostat))
  15105. {
  15106. //已经存在
  15107. finda = true;
  15108. }
  15109. if (finda) continue;
  15110. iptostat[cc] = 1;
  15111. }
  15112. IPLIST Temp;
  15113. ZeroMemory(&Temp, sizeof(IPLIST));
  15114. CList<std::wstring> aa;
  15115. std::unordered_map<std::wstring, int>::iterator iter_ = iptostat.begin();
  15116. for (int i = 0; i < iptostat.size(); i++)
  15117. {
  15118. if (iter_->first != _T(""))
  15119. {
  15120. aa.AddTail(iter_->first);
  15121. }
  15122. iter_++;
  15123. }
  15124. iptostat.clear();
  15125. POSITION Pos = aa.GetHeadPosition();
  15126. int i = 0;
  15127. while (Pos)
  15128. {
  15129. std::wstring wRet = aa.GetNext(Pos);
  15130. StringCchCat(Temp.ST_LIST[i], 64, wRet.c_str());
  15131. i++;
  15132. if (i > (64-1)) break;
  15133. }
  15134. //更新加载通道
  15135. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0L, &Temp, sizeof(IPLIST));
  15136. return 0;
  15137. }
  15138. //分享奖励钻石(仅当天首次分享才有奖励)
  15139. bool CAttemperEngineSink::OnTCPNetworkShareAwardBean(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15140. {
  15141. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkShareAwardBean"), TraceLevel_Debug);
  15142. //获取用户
  15143. WORD wBindIndex = LOWORD(dwSocketID);
  15144. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15145. //用户效验
  15146. ASSERT(pIServerUserItem != NULL);
  15147. if (pIServerUserItem == NULL)
  15148. {
  15149. return false;
  15150. }
  15151. CMD_GR_ShareAwardBean shareAwardBean;
  15152. shareAwardBean.dwUserID = pIServerUserItem->GetUserID();
  15153. lstrcpyn(shareAwardBean.szClientIp, dwIP2csIP(pIServerUserItem->GetClientAddr()), sizeof(shareAwardBean.szClientIp));
  15154. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_SHRAE_AWARD_BEAN, dwSocketID, &shareAwardBean, sizeof(shareAwardBean));
  15155. return true;
  15156. }
  15157. //分享奖励钻石结果
  15158. bool CAttemperEngineSink::OnDBShareAwardResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15159. {
  15160. //获取用户
  15161. WORD wBindIndex = LOWORD(dwContextID);
  15162. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15163. //用户效验
  15164. ASSERT(pIServerUserItem != NULL);
  15165. if (pIServerUserItem == NULL)
  15166. {
  15167. return false;
  15168. }
  15169. DBR_GR_ShareAwardBeanResult * pShareAwardResult = (DBR_GR_ShareAwardBeanResult*)pData;
  15170. UserInfo::PB_CS_S_ShareAwardBeanResult BeanResult;
  15171. BeanResult.set_dwcurrency(pShareAwardResult->dwCurrency);
  15172. BeanResult.set_wawardcurrency(pShareAwardResult->wAwardCurrency);
  15173. //发送数据
  15174. std::string pbdata = BeanResult.SerializePartialAsString();
  15175. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_SHRAE_AWARD_BEAN_RESULT, (void*)pbdata.c_str(), pbdata.length());
  15176. return true;
  15177. }
  15178. //用户分享信息
  15179. bool CAttemperEngineSink::OnTCPNetworkShareInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15180. {
  15181. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkShareInfo"), TraceLevel_Debug);
  15182. //获取用户
  15183. WORD wBindIndex = LOWORD(dwSocketID);
  15184. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15185. //用户效验
  15186. ASSERT(pIServerUserItem != NULL);
  15187. if (pIServerUserItem == NULL) return false;
  15188. DWORD dUserID = pIServerUserItem->GetUserID();
  15189. m_pIRecordDataBaseEngine->PostDataBaseRequest(SUB_GR_USER_SHRAE_INFO, dwSocketID, &dUserID, sizeof(dUserID));
  15190. return true;
  15191. }
  15192. //用户当天分享信息结果
  15193. bool CAttemperEngineSink::OnDBShareInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15194. {
  15195. //获取用户
  15196. WORD wBindIndex = LOWORD(dwContextID);
  15197. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15198. //用户效验
  15199. ASSERT(pIServerUserItem != NULL);
  15200. if (pIServerUserItem == NULL)
  15201. {
  15202. return false;
  15203. }
  15204. DBR_GR_ShareAwardInfo * pShareInfo = (DBR_GR_ShareAwardInfo *)pData;
  15205. UserInfo::PB_CS_S_ShareAwardInfo shareAwardInfo;
  15206. shareAwardInfo.set_wtodaysharedflag(pShareInfo->wTodaySharedFlag);
  15207. shareAwardInfo.set_wshardawardcurrency(pShareInfo->wShardAwardCurrency);
  15208. //发送数据
  15209. std::string pbdata = shareAwardInfo.SerializePartialAsString();
  15210. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_SHRAE_INFO_RESULT, (void*)pbdata.c_str(), pbdata.length());
  15211. return true;
  15212. }
  15213. /////+++拉取场馆游戏服务器
  15214. //bool CAttemperEngineSink::OnTCPNetworkMainVenue(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15215. //{
  15216. // switch (wSubCmdID)
  15217. // {
  15218. // case SUB_GR_VENUE_C_GAME_SERVER: //拉取场馆游戏服务器(返回最优的那个) 场馆ID
  15219. // {
  15220. // OnTCPNetworkGetVenueGameSvr(pData, wDataSize, dwSocketID);
  15221. // return true;
  15222. // }
  15223. // case SUB_GR_VENUE_C_INFO_LIST: //拉取场馆信息列表
  15224. // {
  15225. // OnTCPNetworkGetVenueInfoList(pData, wDataSize, dwSocketID);
  15226. // return true;
  15227. // }
  15228. // default: break;
  15229. // }
  15230. //
  15231. // return false;
  15232. //}
  15233. ///---发送场馆信息列表
  15234. //bool CAttemperEngineSink::OnTCPNetworkGetVenueInfoList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15235. //{
  15236. // TRACE("\n\n***Fun=[%s] Line[%d] ***\n\n", __FUNCTION__, __LINE__);
  15237. // if (m_vecVenueInfo.size() <= 0 || NULL == m_pITCPNetworkEngine)
  15238. // {
  15239. // ASSERT(FALSE);
  15240. // return false;
  15241. // }
  15242. //
  15243. // //获取用户
  15244. // WORD wBindIndex = LOWORD(dwSocketID);
  15245. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15246. //
  15247. // //用户效验
  15248. // ASSERT(pIServerUserItem != NULL);
  15249. // if (pIServerUserItem == NULL)
  15250. // {
  15251. // return false;
  15252. // }
  15253. //
  15254. // //网络数据
  15255. // bool bExistVenue = false; ///---是否存在场馆信息
  15256. // WORD wSendSize = 0;
  15257. // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 };
  15258. // memset(cbDataBuffer, 0, sizeof(cbDataBuffer));
  15259. //
  15260. // for (std::vector<tagVenueInfo>::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++)
  15261. // {
  15262. // //发送数据
  15263. // if ((wSendSize + sizeof(tagVenueInfo)) > sizeof(cbDataBuffer))
  15264. // {
  15265. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST, cbDataBuffer, wSendSize);
  15266. // wSendSize = 0;
  15267. // }
  15268. //
  15269. // //获取数据
  15270. // tagVenueInfo venueInfo = *it;
  15271. //
  15272. // // 协议数据
  15273. // CMD_VenueInfo cmdVenueInfo(venueInfo);
  15274. //
  15275. // //拷贝数据
  15276. // CopyMemory(cbDataBuffer + wSendSize, &cmdVenueInfo, sizeof(cmdVenueInfo));
  15277. // wSendSize += sizeof(cmdVenueInfo);
  15278. // bExistVenue = true;
  15279. // }
  15280. //
  15281. // //发送剩余
  15282. // if (wSendSize > 0)
  15283. // {
  15284. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST, cbDataBuffer, wSendSize);
  15285. // }
  15286. //
  15287. // ///---不存在,发空
  15288. // if (!bExistVenue)
  15289. // {
  15290. // ASSERT(false);
  15291. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_INFO_LIST);
  15292. // }
  15293. //
  15294. // ///---查询该用户有无破产赠送 (改在进入低级场时触发)
  15295. // ////if (pIServerUserItem->GetUserScore() < SCORE_RELIEF_VALUE)
  15296. // ////{
  15297. // //// OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID);
  15298. // ////}
  15299. //
  15300. // return true;
  15301. //}
  15302. //tagVenueInfo CAttemperEngineSink::getVenueInfo(WORD wVenueID)
  15303. //{
  15304. // tagVenueInfo venue;
  15305. // for (std::vector<tagVenueInfo>::iterator it = m_vecVenueInfo.begin();
  15306. // it != m_vecVenueInfo.end(); it++)
  15307. // {
  15308. // tagVenueInfo venueTemp = *it;
  15309. //
  15310. // if (venueTemp.wVenueID == wVenueID)
  15311. // {
  15312. // return venueTemp;
  15313. // }
  15314. // }
  15315. // ASSERT(FALSE);
  15316. // return venue;
  15317. //}
  15318. ///---查询破产补助信息
  15319. //bool CAttemperEngineSink::OnTCPNetworkQueryRelief(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15320. //{
  15321. // //获取用户
  15322. // WORD wBindIndex = LOWORD(dwSocketID);
  15323. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15324. // //用户效验
  15325. // ASSERT(pIServerUserItem != NULL);
  15326. // if (pIServerUserItem == NULL)
  15327. // {
  15328. // ASSERT(FALSE);
  15329. // return false;
  15330. // }
  15331. // DWORD dwUserID = pIServerUserItem->GetUserID();
  15332. // m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_RELIEF_INFO, dwSocketID, &dwUserID, sizeof(dwUserID)); /*m_pIRecordDataBaseEngine投递队列有数据延迟太大*/
  15333. //
  15334. // /////---打印下,投递时间
  15335. // //TCHAR szString[512] = { 0 };
  15336. // //_sntprintf(szString, CountArray(szString), TEXT("查询有无破产领取 [ userID=%d ]"), dwUserID);
  15337. // //CTraceService::TraceString(szString, TraceLevel_Normal);
  15338. //
  15339. // return true;
  15340. //}
  15341. // 人数倒序排列
  15342. class SortByLineCountDescFunc
  15343. {
  15344. public:
  15345. int operator()(CGameServerItem* l, CGameServerItem* r)
  15346. {
  15347. return l->m_GameServer.dwOnLineCount > r->m_GameServer.dwOnLineCount;
  15348. }
  15349. };
  15350. // 服务器级倒序排列
  15351. class SortByServerLevelDescFunc
  15352. {
  15353. public:
  15354. int operator()(CGameServerItem* l, CGameServerItem* r)
  15355. {
  15356. return l->m_GameServer.wServerLevel > r->m_GameServer.wServerLevel;
  15357. }
  15358. };
  15359. /*
  15360. 增加分组成功概率规则:1, 玩家往人数多的游戏服务上去匹配;
  15361. 2, 同一服务器往人数多的桌子上去匹配;
  15362. */
  15363. ///---拉取场馆服务器
  15364. //bool CAttemperEngineSink::OnTCPNetworkGetVenueGameSvr(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15365. //{
  15366. // //效验参数
  15367. // ASSERT(wDataSize >= sizeof(WORD));
  15368. // if (wDataSize < sizeof(WORD))
  15369. // {
  15370. // return false;
  15371. // }
  15372. //
  15373. // //获取用户
  15374. // WORD wBindIndex = LOWORD(dwSocketID);
  15375. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15376. //
  15377. // //用户效验
  15378. // ASSERT(pIServerUserItem != NULL);
  15379. // if (pIServerUserItem == NULL)
  15380. // {
  15381. // return false;
  15382. // }
  15383. //
  15384. // WORD * pwVenueID = (WORD *)pData; //场馆ID
  15385. //
  15386. // ///---检查有无救济
  15387. // if (CanGetRelief(pIServerUserItem, *pwVenueID))
  15388. // {
  15389. // ///---当前金币不够进去,下发救济领取通知
  15390. // return OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID);
  15391. // }
  15392. //
  15393. // ///---如果为0,系统推荐一个合适的场馆给他(用于“快速开始”功能)
  15394. // if (0 == *pwVenueID)
  15395. // {
  15396. // tagVenueInfo venueInfo;
  15397. // for (std::vector<tagVenueInfo>::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++)
  15398. // {
  15399. // if (((it)->sMinScore == 0 || ((it)->sMinScore != 0 && pIServerUserItem->GetUserScore() >= (it)->sMinScore))
  15400. // && ((it)->sMaxScore == 0 || ((it)->sMaxScore != 0 && pIServerUserItem->GetUserScore() <= (it)->sMaxScore)))
  15401. // {
  15402. // venueInfo = *it;
  15403. // break;
  15404. // }
  15405. // }
  15406. //
  15407. // if (venueInfo.wVenueID != 0)
  15408. // {
  15409. // WORD venueID = venueInfo.wVenueID; //场馆ID
  15410. // *pwVenueID = venueID;
  15411. // }
  15412. // else
  15413. // {
  15414. // ///---检查携带金币是否符合最低场要求
  15415. // if (m_vecVenueInfo.size() > 0 && m_vecVenueInfo[0].sMinScore != 0 && pIServerUserItem->GetUserScore() < m_vecVenueInfo[0].sMinScore)
  15416. // {
  15417. // CString strHint;
  15418. // strHint.Format(L"您的金币不足,金币最低要求%lld,请先兑换金币!", m_vecVenueInfo[0].sMinScore);
  15419. // SendRequestFailure(pIServerUserItem, strHint, 1);
  15420. // return true;
  15421. // }
  15422. //
  15423. // SendRequestFailure(pIServerUserItem, L"没有合适的服务器", 1);
  15424. // return true;
  15425. // }
  15426. // }
  15427. //
  15428. // ASSERT(*pwVenueID > 0);
  15429. //
  15430. // if (*pwVenueID <= 0) ///---场馆ID
  15431. // {
  15432. // SendRequestFailure(pIServerUserItem, TEXT("金币场馆ID无效!"), 0);
  15433. //
  15434. // TCHAR szHint[256] = { 0 };
  15435. // swprintf(szHint, TEXT("场馆ID非法, venueID=%d"), *pwVenueID);
  15436. // CTraceService::TraceString(szHint, TraceLevel_Warning);
  15437. // return true;
  15438. // }
  15439. //
  15440. // ///---检查有无救济
  15441. // if (CanGetRelief(pIServerUserItem, *pwVenueID))
  15442. // {
  15443. // ///---当前金币不够进去,下发救济领取通知
  15444. // return OnTCPNetworkQueryRelief(pData, wDataSize, dwSocketID);
  15445. // }
  15446. //
  15447. // ///---先检查携带金币,不够
  15448. // //if (pIServerUserItem->GetUserScore() <= 0)
  15449. // //{
  15450. // // SendRequestFailure(pIServerUserItem, TEXT("抱歉,您没有金币,请先兑换金币!"), 0);
  15451. // // return true;
  15452. // //}
  15453. //
  15454. // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  15455. // int iXinYong = pUserInfo->iXinYong; //用户信用等级
  15456. //
  15457. //
  15458. // //查找符合场馆ID的房间
  15459. // std::vector<CGameServerItem*> gameSvrItemVec;
  15460. // POSITION Position = NULL;
  15461. // CGameServerItem * pGameServerItem = NULL;
  15462. // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  15463. // {
  15464. // //获取数据
  15465. // pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  15466. // if (pGameServerItem == NULL
  15467. // || pGameServerItem->m_GameServer.wNodeID != *pwVenueID)
  15468. // {
  15469. // continue;
  15470. // }
  15471. // gameSvrItemVec.push_back(pGameServerItem);
  15472. // }
  15473. //
  15474. // ///---过滤不符合条件的服务器
  15475. // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByServerLevelDescFunc()); ///-- 排序目的是优先过滤高级别的服务器(防攻击用)
  15476. // std::vector<CGameServerItem*>::iterator it = gameSvrItemVec.begin();
  15477. // while (it != gameSvrItemVec.end())
  15478. // {
  15479. // CGameServerItem* pGameServerItemTemp = *it;
  15480. //
  15481. // if (NULL == pGameServerItemTemp)
  15482. // {
  15483. // it = gameSvrItemVec.erase(it);
  15484. // continue;
  15485. // }
  15486. //
  15487. // //不提供服务
  15488. // if (pGameServerItemTemp->m_GameServer.bService < 1)
  15489. // {
  15490. // it = gameSvrItemVec.erase(it);
  15491. // continue;
  15492. // }
  15493. //
  15494. // //人员已满
  15495. // if (pGameServerItemTemp->m_GameServer.dwOnLineCount >= pGameServerItemTemp->m_GameServer.dwFullCount)
  15496. // {
  15497. // it = gameSvrItemVec.erase(it);
  15498. // continue;
  15499. // }
  15500. //
  15501. // //玩家级别
  15502. // if (pGameServerItemTemp->m_GameServer.wServerLevel > iXinYong && gameSvrItemVec.size() > 1/*总得返回一个用吧*/)
  15503. // {
  15504. // it = gameSvrItemVec.erase(it);
  15505. // continue;
  15506. // }
  15507. //
  15508. // it++;
  15509. // }
  15510. //
  15511. // if (gameSvrItemVec.size() == 0) ///---没有GameServer
  15512. // {
  15513. // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 };
  15514. // memset(cbDataBuffer, 0, sizeof(cbDataBuffer));
  15515. //
  15516. // WORD wErrorCode = 1;
  15517. // memcpy(cbDataBuffer, &wErrorCode, sizeof(wErrorCode));
  15518. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_GAME_SERVER, &cbDataBuffer, sizeof(WORD) + sizeof(tagVenueServer));
  15519. //
  15520. // SendRequestFailure(pIServerUserItem, TEXT("没有可用的金币场服务器!"), 1);
  15521. //
  15522. // TCHAR szHint[256] = { 0 };
  15523. // swprintf(szHint, TEXT("没有可用的金币场服务器,venueID=%d"), *pwVenueID);
  15524. // CTraceService::TraceString(szHint, TraceLevel_Warning);
  15525. // return TRUE;
  15526. // }
  15527. //
  15528. // ///---按人数倒序排列,返回最多人数的服务器
  15529. // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByLineCountDescFunc());
  15530. //
  15531. // tagGameServer tmpGameSvr = gameSvrItemVec[0]->m_GameServer;
  15532. // tagVenueServer tmpVenueSvr;
  15533. // tmpVenueSvr.wKindID = tmpGameSvr.wKindID;
  15534. // tmpVenueSvr.wVenueID = tmpGameSvr.wNodeID;
  15535. // tmpVenueSvr.wServerID = tmpGameSvr.wServerID;
  15536. // tmpVenueSvr.wServerKind = tmpGameSvr.wServerKind;
  15537. // StringCbCat(tmpVenueSvr.szServerAddr, 32, tmpGameSvr.szServerAddr);
  15538. // tmpVenueSvr.wServerPort = tmpGameSvr.wServerPort;
  15539. //
  15540. // tagVenueInfo venueInfo = getVenueInfo(tmpVenueSvr.wVenueID);
  15541. // ASSERT(venueInfo.wVenueID != 0);
  15542. // if (venueInfo.wVenueID > 0)
  15543. // {
  15544. // tmpVenueSvr.lCellScore = venueInfo.sBaseScore;
  15545. // tmpVenueSvr.lMinScore = venueInfo.sMinScore;
  15546. // tmpVenueSvr.lMaxScore = venueInfo.sMaxScore;
  15547. //
  15548. // ///---检查携带金币是否符合要求
  15549. // if (venueInfo.sMinScore != 0 && pIServerUserItem->GetUserScore() < venueInfo.sMinScore)
  15550. // {
  15551. // CString strHint;
  15552. // strHint.Format(L"您的金币不足,本场最低要求金币%lld,请先兑换金币!", venueInfo.sMinScore);
  15553. // SendRequestFailure(pIServerUserItem, strHint, 1);
  15554. // return true;
  15555. // }
  15556. // else if (venueInfo.sMaxScore != 0 && pIServerUserItem->GetUserScore() > venueInfo.sMaxScore)
  15557. // {
  15558. // SendRequestFailure(pIServerUserItem, TEXT("抱歉,您的金币不符合进入要求,请选择合适的金币场!"), 1);
  15559. // return true;
  15560. // }
  15561. // }
  15562. //
  15563. // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 };
  15564. // memset(cbDataBuffer, 0, sizeof(cbDataBuffer));
  15565. //
  15566. // WORD wErrorCode = 0;
  15567. // memcpy(cbDataBuffer, &wErrorCode, sizeof(wErrorCode));
  15568. // memcpy(cbDataBuffer + sizeof(WORD), &tmpVenueSvr, sizeof(tmpVenueSvr));
  15569. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_VENUE, SUB_GR_VENUE_S_GAME_SERVER, &cbDataBuffer, sizeof(WORD) + sizeof(tagVenueServer));
  15570. //
  15571. // return true;
  15572. //}
  15573. //
  15574. /////---上行拉取胜局榜
  15575. //bool CAttemperEngineSink::OnTCPNetworkTopWinList(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15576. //{
  15577. // CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkTopWinList"), TraceLevel_Debug);
  15578. //
  15579. // //获取用户
  15580. // WORD wBindIndex = LOWORD(dwSocketID);
  15581. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15582. // //用户效验
  15583. // ASSERT(pIServerUserItem != NULL);
  15584. // if (pIServerUserItem == NULL)
  15585. // {
  15586. // ASSERT(FALSE);
  15587. // return false;
  15588. // }
  15589. //
  15590. // /*m_pIRecordDataBaseEngine*/m_pIKernelDataBaseEngine->PostDataBaseRequest(DBO_GR_TOP_WIN_LIST, dwSocketID, NULL, 0);
  15591. // return true;
  15592. //}
  15593. //
  15594. /////---用户领取破产补助
  15595. //bool CAttemperEngineSink::OnTCPNetworkGetRelief(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  15596. //{
  15597. // //获取用户
  15598. // WORD wBindIndex = LOWORD(dwSocketID);
  15599. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15600. // //用户效验
  15601. // ASSERT(pIServerUserItem != NULL);
  15602. // if (pIServerUserItem == NULL)
  15603. // {
  15604. // ASSERT(FALSE);
  15605. // return false;
  15606. // }
  15607. //
  15608. // ///---记录领取客户端的相关信息
  15609. // DBR_GR_GetRelief getRelief;
  15610. // getRelief.dwUserID = pIServerUserItem->GetUserID();
  15611. // getRelief.dwClientAddr = pIServerUserItem->GetClientAddr();
  15612. // lstrcpyn(getRelief.szMachineID, pIServerUserItem->GetMachineID(), CountArray(getRelief.szMachineID));
  15613. //
  15614. // m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_RELIEF, dwSocketID, &getRelief, sizeof(getRelief));
  15615. // return true;
  15616. //}
  15617. //
  15618. /////+++拉取胜局榜列表的返回
  15619. //BOOL CAttemperEngineSink::OnDBTopWinList(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15620. //{
  15621. // std::vector<tagTopWinInfo> vecTopWinInfo;
  15622. // //效验参数
  15623. // ASSERT(wDataSize % sizeof(tagTopWinInfo) == 0);
  15624. // if (wDataSize % sizeof(tagTopWinInfo) != 0)
  15625. // {
  15626. // return FALSE;
  15627. // }
  15628. //
  15629. // //变量定义
  15630. // WORD wItemCount = wDataSize / sizeof(tagTopWinInfo);
  15631. // tagTopWinInfo * pTopWin = (tagTopWinInfo *)pData;
  15632. //
  15633. // //更新数据
  15634. // for (WORD i = 0; i < wItemCount; i++)
  15635. // {
  15636. // tagTopWinInfo tmpTopWinInfo(*pTopWin);
  15637. // //插入列表
  15638. // vecTopWinInfo.push_back(tmpTopWinInfo);
  15639. // pTopWin++;
  15640. // }
  15641. //
  15642. // if (vecTopWinInfo.size() <= 0 || NULL == m_pITCPNetworkEngine)
  15643. // {
  15644. // ASSERT(FALSE);
  15645. // return false;
  15646. // }
  15647. //
  15648. // //获取用户
  15649. // WORD wBindIndex = LOWORD(dwContextID);
  15650. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15651. //
  15652. // //用户效验
  15653. // ASSERT(pIServerUserItem != NULL);
  15654. // if (NULL == pIServerUserItem)
  15655. // {
  15656. // TRACE(L"\nOnDBTopWinList,胜局榜用户为空\n");
  15657. // return false;
  15658. // }
  15659. //
  15660. // bool bExistTopWin = false; ///---是否存在胜局榜
  15661. // WORD wSendSize = 0;
  15662. // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 };
  15663. // memset(cbDataBuffer, 0, sizeof(cbDataBuffer));
  15664. //
  15665. // for (std::vector<tagTopWinInfo>::iterator it = vecTopWinInfo.begin(); it != vecTopWinInfo.end(); it++)
  15666. // {
  15667. // //发送数据
  15668. // if ((wSendSize + sizeof(tagTopWinInfo)) > sizeof(cbDataBuffer))
  15669. // {
  15670. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK, cbDataBuffer, wSendSize);
  15671. // wSendSize = 0;
  15672. // }
  15673. //
  15674. // //获取数据
  15675. //
  15676. // //拷贝数据
  15677. // CopyMemory(cbDataBuffer + wSendSize, &(*it), sizeof(tagTopWinInfo));
  15678. // wSendSize += sizeof(tagTopWinInfo);
  15679. // bExistTopWin = true;
  15680. //
  15681. // }
  15682. //
  15683. // //发送剩余
  15684. // if (wSendSize > 0)
  15685. // {
  15686. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK, cbDataBuffer, wSendSize);
  15687. // }
  15688. //
  15689. // ///---不存在,发空
  15690. // if (!bExistTopWin)
  15691. // {
  15692. // ASSERT(false);
  15693. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_TOP_WIN_LIST_ACK);
  15694. // }
  15695. //
  15696. // return true;
  15697. //}
  15698. //
  15699. /////+++钻石兑换金币列表(即金币兑换商品列表)
  15700. //BOOL CAttemperEngineSink::OnDBExchangeConfigList(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15701. //{
  15702. // //效验参数
  15703. // ASSERT(wDataSize % sizeof(tagExchangeConfig) == 0);
  15704. // if (wDataSize % sizeof(tagExchangeConfig) != 0)
  15705. // {
  15706. // return FALSE;
  15707. // }
  15708. //
  15709. // std::vector<tagExchangeConfig> vecExchangeConfig;
  15710. //
  15711. // //变量定义
  15712. // WORD wItemCount = wDataSize / sizeof(tagExchangeConfig);
  15713. // tagExchangeConfig * pExchangeConfig = (tagExchangeConfig *)pData;
  15714. //
  15715. // for (WORD i = 0; i < wItemCount; i++)
  15716. // {
  15717. // tagExchangeConfig exchageConfig(*pExchangeConfig);
  15718. // //插入列表
  15719. // vecExchangeConfig.push_back(exchageConfig);
  15720. // pExchangeConfig++;
  15721. // }
  15722. //
  15723. // //金币兑换商品列表为空
  15724. // if (vecExchangeConfig.size() <= 0)
  15725. // {
  15726. // ASSERT(FALSE);
  15727. // return false;
  15728. // }
  15729. //
  15730. // //获取用户
  15731. // /*WORD wBindIndex = LOWORD(dwContextID);
  15732. // auto pIServerUserItem = GetBindUserItem(wBindIndex);*/
  15733. //
  15734. // //用户效验
  15735. // //ASSERT(pIServerUserItem != NULL);
  15736. // //if (pIServerUserItem == NULL)
  15737. // //{
  15738. // // return false;
  15739. // //}
  15740. //
  15741. // bool bExist = false; ///---是否存在
  15742. // WORD wSendSize = 0;
  15743. // BYTE cbDataBuffer[SOCKET_TCP_PACKET] = { 0 };
  15744. // memset(cbDataBuffer, 0, sizeof(cbDataBuffer));
  15745. //
  15746. // for (std::vector<tagExchangeConfig>::iterator it = vecExchangeConfig.begin(); it != vecExchangeConfig.end(); it++)
  15747. // {
  15748. // //发送数据
  15749. // if ((wSendSize + sizeof(tagExchangeConfig)) > sizeof(cbDataBuffer))
  15750. // {
  15751. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, cbDataBuffer, wSendSize);
  15752. // wSendSize = 0;
  15753. // }
  15754. //
  15755. // //拷贝数据
  15756. // CopyMemory(cbDataBuffer + wSendSize, &(*it), sizeof(tagExchangeConfig));
  15757. // wSendSize += sizeof(tagExchangeConfig);
  15758. // bExist = true;
  15759. //
  15760. // }
  15761. //
  15762. // //发送剩余
  15763. // if (wSendSize > 0)
  15764. // {
  15765. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO, cbDataBuffer, wSendSize);
  15766. // }
  15767. //
  15768. // ///---不存在,发空
  15769. // if (!bExist)
  15770. // {
  15771. // ASSERT(false);
  15772. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_EXCHANGE, SUB_GR_EXCHANGE_PARAM_INFO);
  15773. // }
  15774. //
  15775. // return true;
  15776. //}
  15777. //
  15778. /////+++查询破产信息结果
  15779. //BOOL CAttemperEngineSink::OnDBReliefInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15780. //{
  15781. // //获取用户
  15782. // WORD wBindIndex = LOWORD(dwContextID);
  15783. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15784. //
  15785. // //用户效验
  15786. // //ASSERT(pIServerUserItem != NULL);
  15787. // if (pIServerUserItem == NULL)
  15788. // {
  15789. // //ASSERT(FALSE);
  15790. // return false;
  15791. // }
  15792. //
  15793. // //提取数据
  15794. // tagReliefInfo * pReliefInfo = (tagReliefInfo *)pData;
  15795. //
  15796. // tagReliefInfo reliefInfo;
  15797. // reliefInfo.wTotalCount = pReliefInfo->wTotalCount;
  15798. // reliefInfo.wGetCount = pReliefInfo->wGetCount;
  15799. // reliefInfo.dwReliefScore = pReliefInfo->dwReliefScore;
  15800. //
  15801. // if (pReliefInfo->wTotalCount > 0)
  15802. // {
  15803. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_RELIEF_NOTIFY, &reliefInfo, sizeof(reliefInfo));
  15804. // }
  15805. //
  15806. // ///---更新救济领取信息
  15807. // pIServerUserItem->GetUserInfo()->dwUpdateReliefLeftCount = GetTickCount();
  15808. // pIServerUserItem->GetUserInfo()->wReliefLeftCount = pReliefInfo->wTotalCount - pReliefInfo->wGetCount;
  15809. //
  15810. // return true;
  15811. //}
  15812. //
  15813. /////+++下行领取破产结果
  15814. //BOOL CAttemperEngineSink::OnDBGetRelief(DWORD dwContextID, VOID * pData, WORD wDataSize)
  15815. //{
  15816. // //获取用户
  15817. // WORD wBindIndex = LOWORD(dwContextID);
  15818. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15819. //
  15820. // //用户效验
  15821. // ///ASSERT(pIServerUserItem != NULL); ///---还没领取完,就断线了
  15822. // if (pIServerUserItem == NULL)
  15823. // {
  15824. // return false;
  15825. // }
  15826. //
  15827. // //提取数据
  15828. // tagReliefScore * pReliefScore = (tagReliefScore *)pData;
  15829. //
  15830. // tagReliefScore reliefScore;
  15831. // reliefScore.dwReliefScore = pReliefScore->dwReliefScore;
  15832. // reliefScore.lCurrScore = pReliefScore->lCurrScore;
  15833. //
  15834. // ///更新用户最新携带
  15835. // pIServerUserItem->GetUserInfo()->lScore = pReliefScore->lCurrScore;
  15836. //
  15837. // TRACE(L"\n领取破产补助成功 userid=%d reliefScore.dwReliefScore=%d reliefScore.lScore=%lld\n", pIServerUserItem->GetUserID(), reliefScore.dwReliefScore, reliefScore.lCurrScore);
  15838. //
  15839. // //发送数据[3:50]
  15840. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_GET_RELIEF_ACK, &reliefScore, sizeof(reliefScore));
  15841. //
  15842. // /////---广播积分变动协议
  15843. // //{
  15844. // // CMD_GR_UserScore UserScore;
  15845. // // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  15846. //
  15847. // // //变量定义
  15848. // // CMD_GR_MobileUserScore MobileUserScore;
  15849. //
  15850. // // MobileUserScore.dwUserID = pUserInfo->dwUserID;
  15851. // // MobileUserScore.UserScore.lScore = pUserInfo->lScore;
  15852. // // MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  15853. // // MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  15854. //
  15855. // // //发送数据
  15856. // // SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore));
  15857. // // TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore);
  15858. // //}
  15859. //
  15860. // //---本桌用户广播
  15861. // WORD wTableID = pIServerUserItem->GetTableID();
  15862. // auto it = m_TableFrameArray.find(wTableID);
  15863. // if (it != m_TableFrameArray.end())
  15864. // {
  15865. // auto pITable = it->second;
  15866. // if (pITable != NULL)
  15867. // {
  15868. // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  15869. //
  15870. // //变量定义
  15871. // CMD_GR_MobileUserScore MobileUserScore;
  15872. //
  15873. // MobileUserScore.dwUserID = pUserInfo->dwUserID;
  15874. // MobileUserScore.UserScore.lScore = pUserInfo->lScore;
  15875. // MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  15876. // MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  15877. //
  15878. // pITable->SendTableData(INVALID_CHAIR, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore), MDM_GR_USER);
  15879. // TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore);
  15880. // }
  15881. // }
  15882. //
  15883. //
  15884. // ////{
  15885. // //// CMD_GR_UserScore UserScore;
  15886. // //// tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  15887. //
  15888. // //// //变量定义
  15889. // //// CMD_GR_MobileUserScore MobileUserScore;
  15890. //
  15891. // //// MobileUserScore.dwUserID = pUserInfo->dwUserID;
  15892. // //// MobileUserScore.UserScore.lScore = pUserInfo->lScore;
  15893. // //// MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  15894. // //// MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  15895. //
  15896. // //// //发送数据
  15897. // //// SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore));
  15898. // //// TRACE(L"\n广播积分变动协议 userid=%d MobileUserScore.UserScore.lScore=%lld\n", pIServerUserItem->GetUserID(), MobileUserScore.UserScore.lScore);
  15899. // ////}
  15900. //
  15901. // return true;
  15902. //}
  15903. //列表
  15904. bool CAttemperEngineSink::OnDBGetClubList(DWORD dwContextID, VOID * pData, WORD wDataSize){
  15905. //获取用户
  15906. WORD wBindIndex = LOWORD(dwContextID);
  15907. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15908. //用户效验
  15909. ASSERT(pIServerUserItem != NULL);
  15910. if (pIServerUserItem == NULL)
  15911. {
  15912. return false;
  15913. }
  15914. CMD_GR_ClubList_Ack * pClubListAck = (CMD_GR_ClubList_Ack *)pData;
  15915. if (pData == NULL) return false;
  15916. for (int i = 0; i <20; i++)
  15917. {
  15918. pIServerUserItem->GetUserInfo()->dwClubID[i] = 0;
  15919. }
  15920. for (int i = 0; i < pClubListAck->wClubCount;i++)
  15921. {
  15922. pIServerUserItem->GetUserInfo()->dwClubID[i] = pClubListAck->csGameClubInfo[i].dwClubID;
  15923. }
  15924. Club::PB_CS_S_ClubList_Ack ClubList;
  15925. ClubList.set_wnewscount(pClubListAck->wNewsCount);
  15926. ClubList.set_wclubcount(pClubListAck->wClubCount);
  15927. for (WORD i = 0; i < pClubListAck->wClubCount; i++)
  15928. {
  15929. Club::PB_CS_C_ClubInfo* ClubInfo = ClubList.add_csgameclubinfo();
  15930. ClubInfo->set_dwclubid(pClubListAck->csGameClubInfo[i].dwClubID);
  15931. std::string szClubName = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szClubName, CP_UTF8).m_psz;
  15932. std::string szHostName = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szHostName, CP_UTF8).m_psz;
  15933. std::string szHeadUrl = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].szHeadUrl, CP_UTF8).m_psz;
  15934. ClubInfo->set_szclubname(szClubName);
  15935. ClubInfo->set_cbisowner(pClubListAck->csGameClubInfo[i].cbIsOwner);
  15936. ClubInfo->set_wtotalnum(pClubListAck->csGameClubInfo[i].wTotalNum);
  15937. ClubInfo->set_wwaittablenum(pClubListAck->csGameClubInfo[i].wWaitTableNum);
  15938. ClubInfo->set_wonlinenum(pClubListAck->csGameClubInfo[i].wOnLineNum);
  15939. ClubInfo->set_wwaitusernum(pClubListAck->csGameClubInfo[i].wWaitUserNum);
  15940. ClubInfo->set_dwownerid(pClubListAck->csGameClubInfo[i].dwOwnerID);
  15941. ClubInfo->set_szhostname(szHostName);
  15942. ClubInfo->set_szheadurl(szHeadUrl);
  15943. ClubInfo->set_temp1(pClubListAck->csGameClubInfo[i].temp1);
  15944. ClubInfo->set_temp2(pClubListAck->csGameClubInfo[i].temp2);
  15945. ClubInfo->set_temp3(pClubListAck->csGameClubInfo[i].temp3);
  15946. ClubInfo->set_temp4(pClubListAck->csGameClubInfo[i].temp4);
  15947. ClubInfo->mutable_csgameconfig()->set_wsubgameid(pClubListAck->csGameClubInfo[i].csGameConfig.wSubGameID);
  15948. ClubInfo->mutable_csgameconfig()->set_wplayrule(pClubListAck->csGameClubInfo[i].csGameConfig.wPlayRule);
  15949. ClubInfo->mutable_csgameconfig()->set_wmaxfanrule(pClubListAck->csGameClubInfo[i].csGameConfig.wMaxFanRule);
  15950. ClubInfo->mutable_csgameconfig()->set_wmaxscore(pClubListAck->csGameClubInfo[i].csGameConfig.wMaxScore);
  15951. ClubInfo->mutable_csgameconfig()->set_wplaycountrule(pClubListAck->csGameClubInfo[i].csGameConfig.wPlayCountRule);
  15952. ClubInfo->mutable_csgameconfig()->set_whadplaycount(pClubListAck->csGameClubInfo[i].csGameConfig.wHadPlayCount);
  15953. ClubInfo->mutable_csgameconfig()->set_zmextrarule(pClubListAck->csGameClubInfo[i].csGameConfig.zmExtraRule);
  15954. ClubInfo->mutable_csgameconfig()->set_dghrule(pClubListAck->csGameClubInfo[i].csGameConfig.dghRule);
  15955. std::string sPrivateTableID = CW2AEX<1024>(pClubListAck->csGameClubInfo[i].csGameConfig.sPrivateTableID, CP_UTF8).m_psz;
  15956. ClubInfo->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID);
  15957. ClubInfo->mutable_csgameconfig()->set_bduolai(pClubListAck->csGameClubInfo[i].csGameConfig.bDuoLai);
  15958. ClubInfo->mutable_csgameconfig()->set_wfengding(pClubListAck->csGameClubInfo[i].csGameConfig.wFengDing);
  15959. ClubInfo->mutable_csgameconfig()->set_tmp1(pClubListAck->csGameClubInfo[i].csGameConfig.tmp1);
  15960. ClubInfo->mutable_csgameconfig()->set_tmp2(pClubListAck->csGameClubInfo[i].csGameConfig.tmp2);
  15961. ClubInfo->mutable_csgameconfig()->set_tmp3(pClubListAck->csGameClubInfo[i].csGameConfig.tmp3);
  15962. ClubInfo->mutable_csgameconfig()->set_tmp4(pClubListAck->csGameClubInfo[i].csGameConfig.tmp4);
  15963. ClubInfo->mutable_csgameconfig()->set_tmp5(pClubListAck->csGameClubInfo[i].csGameConfig.tmp5);
  15964. }
  15965. //发送数据
  15966. std::string pbdata = ClubList.SerializePartialAsString();
  15967. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBLIST_ACK, (void*)pbdata.c_str(), pbdata.length());
  15968. return true;
  15969. }
  15970. //会员
  15971. bool CAttemperEngineSink::OnDBGetClubUser(DWORD dwContextID, VOID * pData, WORD wDataSize){
  15972. //获取用户
  15973. WORD wBindIndex = LOWORD(dwContextID);
  15974. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  15975. //用户效验
  15976. ASSERT(pIServerUserItem != NULL);
  15977. if (pIServerUserItem == NULL)
  15978. {
  15979. return false;
  15980. }
  15981. CMD_GR_ClubUser_Ack * pClubUserAck = (CMD_GR_ClubUser_Ack *)pData;
  15982. if(pClubUserAck == NULL) return false;
  15983. for (int i = 0; i < pClubUserAck->wCount; i++)
  15984. {
  15985. //从其全局服务器上找
  15986. if (i >= 20){ break; }
  15987. auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID);
  15988. if (iter != m_OnLineUserAll.end())
  15989. {
  15990. pClubUserAck->csMemberInfo[i].isOnline = 1;
  15991. }
  15992. }
  15993. Club::PB_CS_S_ClubUser_Ack ClubRecord;
  15994. ClubRecord.set_cbhost(pClubUserAck->cbHost);
  15995. ClubRecord.set_dwclubid(pClubUserAck->dwClubID);
  15996. ClubRecord.set_wcount(pClubUserAck->wCount);
  15997. for (WORD i = 0; i < pClubUserAck->wCount; i++)
  15998. {
  15999. Club::PB_CS_S_MemberInfo* RecordInfo = ClubRecord.add_csmemberinfo();
  16000. RecordInfo->set_bangmaid(pClubUserAck->csMemberInfo[i].BangMaID);
  16001. RecordInfo->set_cbstaus(pClubUserAck->csMemberInfo[i].cbStaus);
  16002. RecordInfo->set_ishost(pClubUserAck->csMemberInfo[i].isHost);
  16003. RecordInfo->set_isonline(pClubUserAck->csMemberInfo[i].isOnline);
  16004. RecordInfo->set_dwuserid(pClubUserAck->csMemberInfo[i].dwUserID);
  16005. std::string szName = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szName, CP_UTF8).m_psz;
  16006. std::string szHeadUrl = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szHeadUrl, CP_UTF8).m_psz;
  16007. RecordInfo->set_szname(szName);
  16008. RecordInfo->set_szheadurl(szHeadUrl);
  16009. }
  16010. //发送数据
  16011. std::string pbdata = ClubRecord.SerializePartialAsString();
  16012. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBUSER_ACK, (void*)pbdata.c_str(), pbdata.length());
  16013. return true;
  16014. }
  16015. //会员
  16016. bool CAttemperEngineSink::OnDBGetClubUserEx(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16017. //获取用户
  16018. WORD wBindIndex = LOWORD(dwContextID);
  16019. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16020. //用户效验
  16021. ASSERT(pIServerUserItem != NULL);
  16022. if (pIServerUserItem == NULL)
  16023. {
  16024. return false;
  16025. }
  16026. CMD_GR_ClubUser_Ack_Ex * pClubUserAck = (CMD_GR_ClubUser_Ack_Ex *)pData;
  16027. if (pClubUserAck == NULL) return false;
  16028. for (int i = 0; i < pClubUserAck->wMemCount; i++)
  16029. {
  16030. //从其全局服务器上找
  16031. if (i >= 1000){ break; }
  16032. auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID);
  16033. if (iter != m_OnLineUserAll.end())
  16034. {
  16035. pClubUserAck->csMemberInfo[i].isOnline = 1;
  16036. }
  16037. }
  16038. //排序
  16039. for (int i = 0; i < pClubUserAck->wMemCount; i++)
  16040. {
  16041. if (pClubUserAck->csMemberInfo[i].isHost > 0 || pClubUserAck->csMemberInfo[i].Agree == 0 ) continue;
  16042. if (pClubUserAck->csMemberInfo[i].isOnline == 0 && pClubUserAck->csMemberInfo[i].dwUserID > 0)
  16043. {
  16044. for (int k = i + 1; k < pClubUserAck->wMemCount; k++)
  16045. {
  16046. if (pClubUserAck->csMemberInfo[k].isOnline == 1)
  16047. {
  16048. CMD_S_MemberInfoEx Member;
  16049. ZeroMemory(&Member, sizeof(CMD_S_MemberInfoEx));
  16050. CopyMemory(&Member, &(pClubUserAck->csMemberInfo[i]), sizeof(CMD_S_MemberInfoEx));
  16051. ZeroMemory(&(pClubUserAck->csMemberInfo[i]), sizeof(CMD_S_MemberInfoEx));
  16052. CopyMemory(&(pClubUserAck->csMemberInfo[i]), &(pClubUserAck->csMemberInfo[k]), sizeof(CMD_S_MemberInfoEx));
  16053. ZeroMemory(&(pClubUserAck->csMemberInfo[k]), sizeof(CMD_S_MemberInfoEx));
  16054. CopyMemory(&(pClubUserAck->csMemberInfo[k]), &Member, sizeof(CMD_S_MemberInfoEx));
  16055. break;
  16056. }
  16057. }
  16058. }
  16059. }
  16060. //投递请求
  16061. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET_USER_ONLINE, dwContextID, pClubUserAck, sizeof(CMD_GR_ClubUser_Ack_Ex));
  16062. }
  16063. //通知
  16064. bool CAttemperEngineSink::OnDBGetClubMessage(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16065. //获取用户
  16066. WORD wBindIndex = LOWORD(dwContextID);
  16067. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16068. //用户效验
  16069. ASSERT(pIServerUserItem != NULL);
  16070. if (pIServerUserItem == NULL)
  16071. {
  16072. return false;
  16073. }
  16074. CMD_GR_ClubMessage_Ack * pClubMessageAck = (CMD_GR_ClubMessage_Ack *)pData;
  16075. if (pClubMessageAck == NULL) return false;
  16076. Club::PB_CS_S_ClubMessage_Ack ClubMessage;
  16077. ClubMessage.set_wcount(pClubMessageAck->wCount);
  16078. for (WORD i = 0; i < pClubMessageAck->wCount; i++)
  16079. {
  16080. Club::pb_MessageInfo* MessageInfo = ClubMessage.add_messageinfo();
  16081. MessageInfo->set_dtype(pClubMessageAck->CMD_S_MessageInfo[i].dType);
  16082. std::string szContent = CW2AEX<1024>(pClubMessageAck->CMD_S_MessageInfo[i].szContent, CP_UTF8).m_psz;
  16083. MessageInfo->set_szcontent(szContent);
  16084. MessageInfo->set_dtactiontime(pClubMessageAck->CMD_S_MessageInfo[i].dtActionTime);
  16085. }
  16086. //发送数据
  16087. std::string pbdata = ClubMessage.SerializePartialAsString();
  16088. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBMESSAGE_ACK, (void*)pbdata.c_str(), pbdata.length());
  16089. return true;
  16090. }
  16091. //记录
  16092. bool CAttemperEngineSink::OnDBGetClubRecord(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16093. //获取用户
  16094. WORD wBindIndex = LOWORD(dwContextID);
  16095. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16096. //用户效验
  16097. ASSERT(pIServerUserItem != NULL);
  16098. if (pIServerUserItem == NULL)
  16099. {
  16100. return false;
  16101. }
  16102. CMD_GR_ClubRecord_Ack * pClubRecordAck = (CMD_GR_ClubRecord_Ack *)pData;
  16103. if (pClubRecordAck == NULL) return false;
  16104. //发送数据
  16105. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBRECORD_ACK, pClubRecordAck, wDataSize);
  16106. return true;
  16107. }
  16108. //记录
  16109. bool CAttemperEngineSink::OnDBGetClubRecordEx(DWORD dwContextID, VOID * pData, WORD wDataSize)
  16110. {
  16111. //获取用户
  16112. WORD wBindIndex = LOWORD(dwContextID);
  16113. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16114. //用户效验
  16115. ASSERT(pIServerUserItem != NULL);
  16116. if (pIServerUserItem == NULL)
  16117. {
  16118. return false;
  16119. }
  16120. CMD_GR_ClubRecord_Ack_EX * pClubRecordAck = (CMD_GR_ClubRecord_Ack_EX *)pData;
  16121. if (pClubRecordAck == NULL) return false;
  16122. Club::PB_CS_S_ClubRecord_Ack_EX ClubRecord;
  16123. ClubRecord.set_wcount(pClubRecordAck->wCount);
  16124. ClubRecord.set_dwtablecount(pClubRecordAck->dwTableCount);
  16125. ClubRecord.set_dwzunshi(pClubRecordAck->dwZunShi);
  16126. ClubRecord.set_dwclubid(pClubRecordAck->dwClubID);
  16127. for (WORD i = 0; i < pClubRecordAck->wCount; i++)
  16128. {
  16129. Club::PB_CS_S_RecordInfoEX* RecordInfo = ClubRecord.add_csrecordinfo();
  16130. for (WORD j = 0; j < 4; j++)
  16131. {
  16132. RecordInfo->add_score(pClubRecordAck->csRecordInfo[i].Score[j]);
  16133. RecordInfo->add_tmp(pClubRecordAck->csRecordInfo[i].Tmp[j]);
  16134. }
  16135. RecordInfo->mutable_record()->set_dwtableid(pClubRecordAck->csRecordInfo[i].Record.dwTableID);
  16136. RecordInfo->mutable_record()->set_cbjushu(pClubRecordAck->csRecordInfo[i].Record.cbJuShu);
  16137. RecordInfo->mutable_record()->set_cbpayway(pClubRecordAck->csRecordInfo[i].Record.cbPayWay);
  16138. RecordInfo->mutable_record()->set_dwtableownerid(pClubRecordAck->csRecordInfo[i].Record.dwTableOwnerID);
  16139. RecordInfo->mutable_record()->set_dtcreatetime(pClubRecordAck->csRecordInfo[i].Record.dtCreateTime);
  16140. for (WORD k = 0; k < 4; k++)
  16141. {
  16142. RecordInfo->mutable_record()->add_playerid(pClubRecordAck->csRecordInfo[i].Record.PlayerID[k]);
  16143. }
  16144. for (WORD l = 0; l < 4; l++)
  16145. {
  16146. Club::pb_PlayerName* PlayerName = RecordInfo->mutable_record()->add_playername1();
  16147. std::string PlayerName2 = CW2AEX<1024>(pClubRecordAck->csRecordInfo[i].Record.PlayerName[l], CP_UTF8).m_psz;
  16148. PlayerName->set_playername2(PlayerName2);
  16149. }
  16150. }
  16151. //发送数据
  16152. std::string pbdata = ClubRecord.SerializePartialAsString();
  16153. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBRECORD_ACK_EX, (void*)pbdata.c_str(), pbdata.length());
  16154. return true;
  16155. }
  16156. //俱乐部局数排名
  16157. bool CAttemperEngineSink::OnDBGetClubPlaygames_Ack(DWORD dwContextID, VOID * pData, WORD wDataSize)
  16158. {
  16159. //获取用户
  16160. WORD wBindIndex = LOWORD(dwContextID);
  16161. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16162. //用户效验
  16163. ASSERT(pIServerUserItem != NULL);
  16164. if (pIServerUserItem == NULL)
  16165. {
  16166. return false;
  16167. }
  16168. tagClubPlaygames2* pClubRecordAck = (tagClubPlaygames2*)pData;
  16169. if (pClubRecordAck == NULL)
  16170. {
  16171. return false;
  16172. }
  16173. Club::PB_CS_S_tagClubPlaygames ClubRecord;
  16174. ClubRecord.set_wdatecount(pClubRecordAck->wDateCount);
  16175. ClubRecord.set_temp(pClubRecordAck->temp);
  16176. for (WORD i = 0; i < 10; i++)
  16177. {
  16178. if (pClubRecordAck->Playgames[i].dwUserID == 0)continue;
  16179. Club::PB_CS_tagClubPlaygames* pPlaygame = ClubRecord.add_playgames();
  16180. pPlaygame->set_dwuserid(pClubRecordAck->Playgames[i].dwUserID);
  16181. pPlaygame->set_mcount(pClubRecordAck->Playgames[i].mCount);
  16182. std::string szUserName = CW2AEX<1024>(pClubRecordAck->Playgames[i].szUserName, CP_UTF8).m_psz;
  16183. std::string szHeadImg = CW2AEX<1024>(pClubRecordAck->Playgames[i].szHeadImg, CP_UTF8).m_psz;
  16184. pPlaygame->set_szusername(szUserName);
  16185. pPlaygame->set_szheadimg(szHeadImg);
  16186. }
  16187. //发送数据
  16188. std::string pbdata = ClubRecord.SerializePartialAsString();
  16189. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_COUNT_PLAYGAEMS_ACK, (void*)pbdata.c_str(), pbdata.length());
  16190. return true;
  16191. }
  16192. //俱乐部积分排名
  16193. bool CAttemperEngineSink::OnDBGetClubIntegral_Ack(DWORD dwContextID, VOID * pData, WORD wDataSize)
  16194. {
  16195. //获取用户
  16196. WORD wBindIndex = LOWORD(dwContextID);
  16197. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16198. //用户效验
  16199. ASSERT(pIServerUserItem != NULL);
  16200. if (pIServerUserItem == NULL)
  16201. {
  16202. return false;
  16203. }
  16204. tagClubIntegral2* pClubRecordAck = (tagClubIntegral2*)pData;
  16205. if (pClubRecordAck == NULL)
  16206. {
  16207. return false;
  16208. }
  16209. Club::PB_CS_S_tagClubIntegral Integral;
  16210. Integral.set_wdatecount(pClubRecordAck->wDateCount);
  16211. Integral.set_temp(pClubRecordAck->temp);
  16212. for (WORD i = 0; i < 10; i++)
  16213. {
  16214. if (pClubRecordAck->Integral[i].dwUserID == 0)continue;
  16215. Club::PB_CS_tagClubIntegral* pIntegral = Integral.add_integral();
  16216. pIntegral->set_dwuserid(pClubRecordAck->Integral[i].dwUserID);
  16217. pIntegral->set_mcount(pClubRecordAck->Integral[i].mCount);
  16218. pIntegral->set_mcount(pClubRecordAck->Integral[i].mJiFen);
  16219. std::string szUserName = CW2AEX<1024>(pClubRecordAck->Integral[i].szUserName, CP_UTF8).m_psz;
  16220. std::string szHeadImg = CW2AEX<1024>(pClubRecordAck->Integral[i].szHeadImg, CP_UTF8).m_psz;
  16221. pIntegral->set_szusername(szUserName);
  16222. pIntegral->set_szheadimg(szHeadImg);
  16223. }
  16224. //发送数据
  16225. std::string pbdata = Integral.SerializePartialAsString();
  16226. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_COUNT_INTEGRAL_ACK, (void*)pbdata.c_str(), pbdata.length());
  16227. return true;
  16228. }
  16229. //创建
  16230. bool CAttemperEngineSink::OnDBCreateClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16231. //获取用户
  16232. WORD wBindIndex = LOWORD(dwContextID);
  16233. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16234. //用户效验
  16235. ASSERT(pIServerUserItem != NULL);
  16236. if (pIServerUserItem == NULL)
  16237. {
  16238. return false;
  16239. }
  16240. DBR_GR_Club_Action_Ack4 * pActionAck1 = (DBR_GR_Club_Action_Ack4 *)pData;
  16241. if (pActionAck1 == NULL) return false;
  16242. if (pActionAck1->Result == 1)
  16243. {
  16244. for (int i = 0; i < 20; i++)
  16245. {
  16246. if (pIServerUserItem->GetUserInfo()->dwClubID[i] == 0)
  16247. {
  16248. pIServerUserItem->GetUserInfo()->dwClubID[i] = pActionAck1->ClubInfo.dwClubID;
  16249. break;
  16250. }
  16251. }
  16252. }
  16253. //自动建房
  16254. if (pActionAck1->ClubInfo.temp1 == 2)
  16255. {
  16256. this->OnAutoCreateRoomToDB(pActionAck1->ClubInfo.dwClubID, pIServerUserItem->GetUserID(), 0);
  16257. }
  16258. CMD_GR_Club_Action_Ack1 ActionAck1;
  16259. ZeroMemory(&ActionAck1, sizeof(CMD_GR_Club_Action_Ack1));
  16260. ActionAck1.Result = pActionAck1->Result;
  16261. CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message));
  16262. Club::PB_CS_S_Club_Action_Ack1 ClubAction;
  16263. ClubAction.set_result(ActionAck1.Result);
  16264. std::string Message = CW2AEX<1024>(ActionAck1.Message, CP_UTF8).m_psz;
  16265. ClubAction.set_message(Message);
  16266. //发送数据
  16267. std::string pbdata = ClubAction.SerializePartialAsString();
  16268. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_CREATE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16269. return true;
  16270. }
  16271. //俱乐部额外玩法修改
  16272. bool CAttemperEngineSink::OnDBUpdateAddClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16273. //获取用户
  16274. WORD wBindIndex = LOWORD(dwContextID);
  16275. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16276. //用户效验
  16277. ASSERT(pIServerUserItem != NULL);
  16278. if (pIServerUserItem == NULL)
  16279. {
  16280. return false;
  16281. }
  16282. CMD_GR_Club_Action_Ack1Add * pActionAck = (CMD_GR_Club_Action_Ack1Add *)pData;
  16283. if (pActionAck == NULL) return false;
  16284. Club::PB_CS_S_Club_Action_Ack1Add ClubAction;
  16285. ClubAction.set_result(pActionAck->Result);
  16286. std::string Message = CW2AEX<1024>(pActionAck->Message, CP_UTF8).m_psz;
  16287. ClubAction.set_message(Message);
  16288. ClubAction.mutable_autoaddinfo()->set_dwclubid(pActionAck->AutoAddInfo.dwClubID);
  16289. ClubAction.mutable_autoaddinfo()->set_cbwanfaid(pActionAck->AutoAddInfo.cbWanfaId);
  16290. ClubAction.mutable_autoaddinfo()->set_cbstatus(pActionAck->AutoAddInfo.cbStatus);
  16291. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wsubgameid(pActionAck->AutoAddInfo.gameconfig.wSubGameID);
  16292. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplayrule(pActionAck->AutoAddInfo.gameconfig.wPlayRule);
  16293. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxfanrule(pActionAck->AutoAddInfo.gameconfig.wMaxFanRule);
  16294. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxscore(pActionAck->AutoAddInfo.gameconfig.wMaxScore);
  16295. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplaycountrule(pActionAck->AutoAddInfo.gameconfig.wPlayCountRule);
  16296. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_whadplaycount(pActionAck->AutoAddInfo.gameconfig.wHadPlayCount);
  16297. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_zmextrarule(pActionAck->AutoAddInfo.gameconfig.zmExtraRule);
  16298. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_dghrule(pActionAck->AutoAddInfo.gameconfig.dghRule);
  16299. std::string sPrivateTableID = CW2AEX<1024>(pActionAck->AutoAddInfo.gameconfig.sPrivateTableID, CP_UTF8).m_psz;
  16300. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_sprivatetableid(sPrivateTableID);
  16301. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_bduolai(pActionAck->AutoAddInfo.gameconfig.bDuoLai);
  16302. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wfengding(pActionAck->AutoAddInfo.gameconfig.wFengDing);
  16303. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp1(pActionAck->AutoAddInfo.gameconfig.tmp1);
  16304. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp2(pActionAck->AutoAddInfo.gameconfig.tmp2);
  16305. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp3(pActionAck->AutoAddInfo.gameconfig.tmp3);
  16306. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp4(pActionAck->AutoAddInfo.gameconfig.tmp4);
  16307. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp5(pActionAck->AutoAddInfo.gameconfig.tmp5);
  16308. //发送数据
  16309. std::string pbdata = ClubAction.SerializePartialAsString();
  16310. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_MORE_WANFA_ACK, (void*)pbdata.c_str(), pbdata.length());
  16311. if (1 == pActionAck->AutoAddInfo.cbStatus && pActionAck->Result == 1)
  16312. {//自动建房
  16313. this->OnAutoCreateRoomToDB(pActionAck->AutoAddInfo.dwClubID, pIServerUserItem->GetUserID(), pActionAck->AutoAddInfo.cbWanfaId);
  16314. }
  16315. return true;
  16316. }
  16317. //修改
  16318. bool CAttemperEngineSink::OnDBUpdateClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16319. //获取用户
  16320. WORD wBindIndex = LOWORD(dwContextID);
  16321. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16322. //用户效验
  16323. ASSERT(pIServerUserItem != NULL);
  16324. if (pIServerUserItem == NULL)
  16325. {
  16326. return false;
  16327. }
  16328. CMD_GR_Club_Action_Ack2Ex * pActionAck2 = (CMD_GR_Club_Action_Ack2Ex *)pData;
  16329. if (pActionAck2 == NULL) return false;
  16330. //构造返回参数
  16331. CMD_GR_Club_Action_Ack2 ActionAck2;
  16332. ZeroMemory(&ActionAck2, sizeof(CMD_GR_Club_Action_Ack2));
  16333. CopyMemory(&ActionAck2, &(pActionAck2->Ack2), sizeof(CMD_GR_Club_Action_Ack2));
  16334. //如果开房设置作了修改
  16335. if (pActionAck2->TableChoiceChange == 1)
  16336. {
  16337. //自动建房
  16338. if (pActionAck2->Ack2.ClubInfo.temp1 == 2)
  16339. {
  16340. this->OnAutoCreateRoomToDB(pActionAck2->Ack2.ClubInfo.dwClubID, pIServerUserItem->GetUserID(), 0);
  16341. //更改已创好房的属性
  16342. CWHDataLocker DataLocker(m_CriticalSection);
  16343. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  16344. while (it != m_PrivateRoomAll.end())
  16345. {
  16346. JN_GR_RoomListBig Temp = it->second;
  16347. if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck2->Ack2.ClubInfo.dwClubID && Temp.tmp5 == 0)
  16348. {
  16349. Temp.dwInsert_UpData_Del = 1;
  16350. Temp.tmp5 = 1;
  16351. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  16352. }
  16353. it++;
  16354. }
  16355. }
  16356. else
  16357. {
  16358. //更改已创好房的属性
  16359. CWHDataLocker DataLocker(m_CriticalSection);
  16360. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  16361. while (it != m_PrivateRoomAll.end())
  16362. {
  16363. JN_GR_RoomListBig Temp = it->second;
  16364. if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck2->Ack2.ClubInfo.dwClubID && Temp.tmp5 == 1)
  16365. {
  16366. Temp.dwInsert_UpData_Del = 1;
  16367. Temp.tmp5 = 0;
  16368. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  16369. }
  16370. it++;
  16371. }
  16372. }
  16373. }
  16374. Club::PB_CS_S_Club_Action_Ack2 ClubList;
  16375. ClubList.set_result(ActionAck2.Result);
  16376. std::string Message = CW2AEX<1024>(ActionAck2.Message, CP_UTF8).m_psz;
  16377. std::string szClubName = CW2AEX<1024>(ActionAck2.ClubInfo.szClubName, CP_UTF8).m_psz;
  16378. std::string szHostName = CW2AEX<1024>(ActionAck2.ClubInfo.szHostName, CP_UTF8).m_psz;
  16379. std::string szHeadUrl = CW2AEX<1024>(ActionAck2.ClubInfo.szHeadUrl, CP_UTF8).m_psz;
  16380. ClubList.set_message(Message);
  16381. ClubList.mutable_clubinfo()->set_dwclubid(ActionAck2.ClubInfo.dwClubID);
  16382. ClubList.mutable_clubinfo()->set_szclubname(szClubName);
  16383. ClubList.mutable_clubinfo()->set_cbisowner(ActionAck2.ClubInfo.cbIsOwner);
  16384. ClubList.mutable_clubinfo()->set_wtotalnum(ActionAck2.ClubInfo.wTotalNum);
  16385. ClubList.mutable_clubinfo()->set_wwaittablenum(ActionAck2.ClubInfo.wWaitTableNum);
  16386. ClubList.mutable_clubinfo()->set_wonlinenum(ActionAck2.ClubInfo.wOnLineNum);
  16387. ClubList.mutable_clubinfo()->set_wwaitusernum(ActionAck2.ClubInfo.wWaitUserNum);
  16388. ClubList.mutable_clubinfo()->set_dwownerid(ActionAck2.ClubInfo.dwOwnerID);
  16389. ClubList.mutable_clubinfo()->set_szhostname(szHostName);
  16390. ClubList.mutable_clubinfo()->set_szheadurl(szHeadUrl);
  16391. ClubList.mutable_clubinfo()->set_temp1(ActionAck2.ClubInfo.temp1);
  16392. ClubList.mutable_clubinfo()->set_temp2(ActionAck2.ClubInfo.temp2);
  16393. ClubList.mutable_clubinfo()->set_temp3(ActionAck2.ClubInfo.temp3);
  16394. ClubList.mutable_clubinfo()->set_temp4(ActionAck2.ClubInfo.temp4);
  16395. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wsubgameid(ActionAck2.ClubInfo.csGameConfig.wSubGameID);
  16396. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplayrule(ActionAck2.ClubInfo.csGameConfig.wPlayRule);
  16397. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxfanrule(ActionAck2.ClubInfo.csGameConfig.wMaxFanRule);
  16398. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxscore(ActionAck2.ClubInfo.csGameConfig.wMaxScore);
  16399. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplaycountrule(ActionAck2.ClubInfo.csGameConfig.wPlayCountRule);
  16400. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_whadplaycount(ActionAck2.ClubInfo.csGameConfig.wHadPlayCount);
  16401. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_zmextrarule(ActionAck2.ClubInfo.csGameConfig.zmExtraRule);
  16402. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_dghrule(ActionAck2.ClubInfo.csGameConfig.dghRule);
  16403. std::string sPrivateTableID = CW2AEX<1024>(ActionAck2.ClubInfo.csGameConfig.sPrivateTableID, CP_UTF8).m_psz;
  16404. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID);
  16405. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_bduolai(ActionAck2.ClubInfo.csGameConfig.bDuoLai);
  16406. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wfengding(ActionAck2.ClubInfo.csGameConfig.wFengDing);
  16407. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp1(ActionAck2.ClubInfo.csGameConfig.tmp1);
  16408. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp2(ActionAck2.ClubInfo.csGameConfig.tmp2);
  16409. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp3(ActionAck2.ClubInfo.csGameConfig.tmp3);
  16410. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp4(ActionAck2.ClubInfo.csGameConfig.tmp4);
  16411. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp5(ActionAck2.ClubInfo.csGameConfig.tmp5);
  16412. //发送数据
  16413. std::string pbdata = ClubList.SerializePartialAsString();
  16414. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_UPDATE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16415. return true;
  16416. }
  16417. //删除
  16418. bool CAttemperEngineSink::OnDBDeleteClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16419. //获取用户
  16420. WORD wBindIndex = LOWORD(dwContextID);
  16421. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16422. //用户效验
  16423. ASSERT(pIServerUserItem != NULL);
  16424. if (pIServerUserItem == NULL)
  16425. {
  16426. return false;
  16427. }
  16428. DBR_GR_Club_Action_Ack1 * pActionAck1 = (DBR_GR_Club_Action_Ack1 *)pData;
  16429. if (pActionAck1 == NULL) return false;
  16430. //遍历房间修改已经创房的属性
  16431. {
  16432. CWHDataLocker DataLocker(m_CriticalSection);
  16433. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  16434. while (it != m_PrivateRoomAll.end())
  16435. {
  16436. JN_GR_RoomListBig Temp = it->second;
  16437. if (Temp.roomType == 1 && Temp.tmp6[0] == pActionAck1->dwClubID)
  16438. {
  16439. Temp.roomType = 0;
  16440. Temp.tmp6[0] = 0;
  16441. Temp.dwInsert_UpData_Del = 1;
  16442. UpdataBodyOwnRoomToServer(&Temp, sizeof(Temp));
  16443. }
  16444. it++;
  16445. }
  16446. }
  16447. //返回数据
  16448. CMD_GR_Club_Action_Ack1 ActionAck1;
  16449. ZeroMemory(&ActionAck1, sizeof(ActionAck1));
  16450. ActionAck1.Result = pActionAck1->Result;
  16451. CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message));
  16452. Club::PB_CS_S_Club_Action_Ack1 ClubAction;
  16453. ClubAction.set_result(ActionAck1.Result);
  16454. std::string Message = CW2AEX<1024>(ActionAck1.Message, CP_UTF8).m_psz;
  16455. ClubAction.set_message(Message);
  16456. //发送数据
  16457. std::string pbdata = ClubAction.SerializePartialAsString();
  16458. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_DELETE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16459. return true;
  16460. }
  16461. //查看
  16462. bool CAttemperEngineSink::OnDBGetClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16463. //获取用户
  16464. WORD wBindIndex = LOWORD(dwContextID);
  16465. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16466. //用户效验
  16467. ASSERT(pIServerUserItem != NULL);
  16468. if (pIServerUserItem == NULL)
  16469. {
  16470. return false;
  16471. }
  16472. CMD_GR_Club_Action_Ack2 * pActionAck2 = (CMD_GR_Club_Action_Ack2 *)pData;
  16473. if (pActionAck2 == NULL) return false;
  16474. Club::PB_CS_S_Club_Action_Ack2 ClubList;
  16475. ClubList.set_result(pActionAck2->Result);
  16476. std::string Message = CW2AEX<1024>(pActionAck2->Message, CP_UTF8).m_psz;
  16477. std::string szClubName = CW2AEX<1024>(pActionAck2->ClubInfo.szClubName, CP_UTF8).m_psz;
  16478. std::string szHostName = CW2AEX<1024>(pActionAck2->ClubInfo.szHostName, CP_UTF8).m_psz;
  16479. std::string szHeadUrl = CW2AEX<1024>(pActionAck2->ClubInfo.szHeadUrl, CP_UTF8).m_psz;
  16480. ClubList.set_message(Message);
  16481. ClubList.mutable_clubinfo()->set_dwclubid(pActionAck2->ClubInfo.dwClubID);
  16482. ClubList.mutable_clubinfo()->set_szclubname(szClubName);
  16483. ClubList.mutable_clubinfo()->set_cbisowner(pActionAck2->ClubInfo.cbIsOwner);
  16484. ClubList.mutable_clubinfo()->set_wtotalnum(pActionAck2->ClubInfo.wTotalNum);
  16485. ClubList.mutable_clubinfo()->set_wwaittablenum(pActionAck2->ClubInfo.wWaitTableNum);
  16486. ClubList.mutable_clubinfo()->set_wonlinenum(pActionAck2->ClubInfo.wOnLineNum);
  16487. ClubList.mutable_clubinfo()->set_wwaitusernum(pActionAck2->ClubInfo.wWaitUserNum);
  16488. ClubList.mutable_clubinfo()->set_dwownerid(pActionAck2->ClubInfo.dwOwnerID);
  16489. ClubList.mutable_clubinfo()->set_szhostname(szHostName);
  16490. ClubList.mutable_clubinfo()->set_szheadurl(szHeadUrl);
  16491. ClubList.mutable_clubinfo()->set_temp1(pActionAck2->ClubInfo.temp1);
  16492. ClubList.mutable_clubinfo()->set_temp2(pActionAck2->ClubInfo.temp2);
  16493. ClubList.mutable_clubinfo()->set_temp3(pActionAck2->ClubInfo.temp3);
  16494. ClubList.mutable_clubinfo()->set_temp4(pActionAck2->ClubInfo.temp4);
  16495. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wsubgameid(pActionAck2->ClubInfo.csGameConfig.wSubGameID);
  16496. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplayrule(pActionAck2->ClubInfo.csGameConfig.wPlayRule);
  16497. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxfanrule(pActionAck2->ClubInfo.csGameConfig.wMaxFanRule);
  16498. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wmaxscore(pActionAck2->ClubInfo.csGameConfig.wMaxScore);
  16499. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wplaycountrule(pActionAck2->ClubInfo.csGameConfig.wPlayCountRule);
  16500. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_whadplaycount(pActionAck2->ClubInfo.csGameConfig.wHadPlayCount);
  16501. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_zmextrarule(pActionAck2->ClubInfo.csGameConfig.zmExtraRule);
  16502. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_dghrule(pActionAck2->ClubInfo.csGameConfig.dghRule);
  16503. std::string sPrivateTableID = CW2AEX<1024>(pActionAck2->ClubInfo.csGameConfig.sPrivateTableID, CP_UTF8).m_psz;
  16504. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_sprivatetableid(sPrivateTableID);
  16505. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_bduolai(pActionAck2->ClubInfo.csGameConfig.bDuoLai);
  16506. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_wfengding(pActionAck2->ClubInfo.csGameConfig.wFengDing);
  16507. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp1(pActionAck2->ClubInfo.csGameConfig.tmp1);
  16508. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp2(pActionAck2->ClubInfo.csGameConfig.tmp2);
  16509. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp3(pActionAck2->ClubInfo.csGameConfig.tmp3);
  16510. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp4(pActionAck2->ClubInfo.csGameConfig.tmp4);
  16511. ClubList.mutable_clubinfo()->mutable_csgameconfig()->set_tmp5(pActionAck2->ClubInfo.csGameConfig.tmp5);
  16512. //发送数据
  16513. std::string pbdata = ClubList.SerializePartialAsString();
  16514. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16515. return true;
  16516. }
  16517. //查看 额外玩法
  16518. bool CAttemperEngineSink::OnDBGetAddClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16519. //获取用户
  16520. WORD wBindIndex = LOWORD(dwContextID);
  16521. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16522. //用户效验
  16523. ASSERT(pIServerUserItem != NULL);
  16524. if (pIServerUserItem == NULL)
  16525. {
  16526. return false;
  16527. }
  16528. CMD_GR_Club_Action_Ack1Add * pActionAck2 = (CMD_GR_Club_Action_Ack1Add *)pData;
  16529. if (pActionAck2 == NULL) return false;
  16530. Club::PB_CS_S_Club_Action_Ack1Add ClubAction;
  16531. ClubAction.set_result(pActionAck2->Result);
  16532. std::string Message = CW2AEX<1024>(pActionAck2->Message, CP_UTF8).m_psz;
  16533. ClubAction.set_message(Message);
  16534. ClubAction.mutable_autoaddinfo()->set_dwclubid(pActionAck2->AutoAddInfo.dwClubID);
  16535. ClubAction.mutable_autoaddinfo()->set_cbwanfaid(pActionAck2->AutoAddInfo.cbWanfaId);
  16536. ClubAction.mutable_autoaddinfo()->set_cbstatus(pActionAck2->AutoAddInfo.cbStatus);
  16537. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wsubgameid(pActionAck2->AutoAddInfo.gameconfig.wSubGameID);
  16538. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplayrule(pActionAck2->AutoAddInfo.gameconfig.wPlayRule);
  16539. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxfanrule(pActionAck2->AutoAddInfo.gameconfig.wMaxFanRule);
  16540. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wmaxscore(pActionAck2->AutoAddInfo.gameconfig.wMaxScore);
  16541. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wplaycountrule(pActionAck2->AutoAddInfo.gameconfig.wPlayCountRule);
  16542. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_whadplaycount(pActionAck2->AutoAddInfo.gameconfig.wHadPlayCount);
  16543. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_zmextrarule(pActionAck2->AutoAddInfo.gameconfig.zmExtraRule);
  16544. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_dghrule(pActionAck2->AutoAddInfo.gameconfig.dghRule);
  16545. std::string sPrivateTableID = CW2AEX<1024>(pActionAck2->AutoAddInfo.gameconfig.sPrivateTableID, CP_UTF8).m_psz;
  16546. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_sprivatetableid(sPrivateTableID);
  16547. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_bduolai(pActionAck2->AutoAddInfo.gameconfig.bDuoLai);
  16548. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_wfengding(pActionAck2->AutoAddInfo.gameconfig.wFengDing);
  16549. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp1(pActionAck2->AutoAddInfo.gameconfig.tmp1);
  16550. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp2(pActionAck2->AutoAddInfo.gameconfig.tmp2);
  16551. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp3(pActionAck2->AutoAddInfo.gameconfig.tmp3);
  16552. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp4(pActionAck2->AutoAddInfo.gameconfig.tmp4);
  16553. ClubAction.mutable_autoaddinfo()->mutable_gameconfig()->set_tmp5(pActionAck2->AutoAddInfo.gameconfig.tmp5);
  16554. //发送数据
  16555. std::string pbdata = ClubAction.SerializePartialAsString();
  16556. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_MORE_WANFA_ACK, (void*)pbdata.c_str(), pbdata.length());
  16557. return true;
  16558. }
  16559. //加入
  16560. bool CAttemperEngineSink::OnDBJoinClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16561. //获取用户
  16562. WORD wBindIndex = LOWORD(dwContextID);
  16563. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16564. //用户效验
  16565. ASSERT(pIServerUserItem != NULL);
  16566. if (pIServerUserItem == NULL)
  16567. {
  16568. return false;
  16569. }
  16570. CMD_GR_Club_Action_Ack1 * pActionAck1 = (CMD_GR_Club_Action_Ack1 *)pData;
  16571. if (pActionAck1 == NULL) return false;
  16572. Club::PB_CS_S_Club_Action_Ack1 ClubAction;
  16573. ClubAction.set_result(pActionAck1->Result);
  16574. std::string Message = CW2AEX<1024>(pActionAck1->Message, CP_UTF8).m_psz;
  16575. ClubAction.set_message(Message);
  16576. //发送数据
  16577. std::string pbdata = ClubAction.SerializePartialAsString();
  16578. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_JOIN_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16579. return true;
  16580. }
  16581. //退出
  16582. bool CAttemperEngineSink::OnDBQuitClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16583. //获取用户
  16584. WORD wBindIndex = LOWORD(dwContextID);
  16585. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16586. //用户效验
  16587. ASSERT(pIServerUserItem != NULL);
  16588. if (pIServerUserItem == NULL)
  16589. {
  16590. return false;
  16591. }
  16592. DBR_GR_Club_Action_Ack1 * pActionAck1 = (DBR_GR_Club_Action_Ack1 *)pData;
  16593. if (pActionAck1 == NULL) return false;
  16594. if (pActionAck1->Result == 1)
  16595. {
  16596. for (int i = 0; i < 20; i++)
  16597. {
  16598. if (pIServerUserItem->GetUserInfo()->dwClubID[i] == pActionAck1->dwClubID)
  16599. {
  16600. pIServerUserItem->GetUserInfo()->dwClubID[i] = 0;
  16601. break;
  16602. }
  16603. }
  16604. }
  16605. CMD_GR_Club_Action_Ack1 ActionAck1;
  16606. ZeroMemory(&ActionAck1, sizeof(ActionAck1));
  16607. ActionAck1.Result = pActionAck1->Result;
  16608. CopyMemory(ActionAck1.Message, pActionAck1->Message, sizeof(ActionAck1.Message));
  16609. Club::PB_CS_S_Club_Action_Ack1 ClubAction;
  16610. ClubAction.set_result(ActionAck1.Result);
  16611. std::string Message = CW2AEX<1024>(pActionAck1->Message, CP_UTF8).m_psz;
  16612. ClubAction.set_message(Message);
  16613. //发送数据
  16614. std::string pbdata = ClubAction.SerializePartialAsString();
  16615. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_QUIT_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16616. return true;
  16617. }
  16618. //同意加入
  16619. bool CAttemperEngineSink::OnDBAgreeClub(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16620. //获取用户
  16621. WORD wBindIndex = LOWORD(dwContextID);
  16622. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16623. //用户效验
  16624. ASSERT(pIServerUserItem != NULL);
  16625. if (pIServerUserItem == NULL)
  16626. {
  16627. return false;
  16628. }
  16629. DBR_GR_Club_Action_Ack3 * pActionAck3 = (DBR_GR_Club_Action_Ack3 *)pData;
  16630. if (pActionAck3 == NULL) return false;
  16631. if ((pActionAck3->Agree == 1 || pActionAck3->Agree == 5 || pActionAck3->Agree == 11) && pActionAck3->Result == 1)
  16632. {
  16633. //在线用户
  16634. WORD wUserIndex = 0;
  16635. while (true)
  16636. {
  16637. IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  16638. if (pIServerUserItemSend == NULL) break;
  16639. if (pIServerUserItemSend->GetUserID() == pActionAck3->dwUserID)
  16640. {
  16641. for (int i = 0; i < 20; i++)
  16642. {
  16643. if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == 0)
  16644. {
  16645. pIServerUserItemSend->GetUserInfo()->dwClubID[i] = pActionAck3->dwClubID; break;
  16646. }
  16647. }
  16648. break;
  16649. }
  16650. }
  16651. }
  16652. if ((pActionAck3->Agree == 2 || pActionAck3->Agree == 4) && pActionAck3->Result == 1)
  16653. {
  16654. //在线用户
  16655. WORD wUserIndex = 0;
  16656. while (true)
  16657. {
  16658. IServerUserItem * pIServerUserItemSend = m_ServerUserManager.EnumUserItem(wUserIndex++);
  16659. if (pIServerUserItemSend == NULL) break;
  16660. if (pIServerUserItemSend->GetUserID() == pActionAck3->dwUserID)
  16661. {
  16662. for (int i = 0; i < 20; i++)
  16663. {
  16664. if (pIServerUserItemSend->GetUserInfo()->dwClubID[i] == pActionAck3->dwClubID)
  16665. {
  16666. pIServerUserItemSend->GetUserInfo()->dwClubID[i] =0; break;
  16667. }
  16668. }
  16669. break;
  16670. }
  16671. }
  16672. }
  16673. CMD_GR_Club_Action_Ack3 ActionAck3;
  16674. ZeroMemory(&ActionAck3, sizeof(ActionAck3));
  16675. ActionAck3.Result = pActionAck3->Result;
  16676. ActionAck3.dwClubID = pActionAck3->dwClubID;
  16677. ActionAck3.cbAgree = pActionAck3->Agree;
  16678. CopyMemory(ActionAck3.Message, pActionAck3->Message, sizeof(pActionAck3->Message));
  16679. if (ActionAck3.Result == 1)
  16680. {
  16681. _sntprintf(ActionAck3.Message, CountArray(ActionAck3.Message), TEXT("%d"), pActionAck3->dwUserID);
  16682. }
  16683. Club::PB_CS_S_Club_Action_Ack3 ClubAction;
  16684. ClubAction.set_wclubid(ActionAck3.dwClubID);
  16685. ClubAction.set_result(ActionAck3.Result);
  16686. std::string Message = CW2AEX<1024>(ActionAck3.Message, CP_UTF8).m_psz;
  16687. ClubAction.set_message(Message);
  16688. ClubAction.set_cbagree(ActionAck3.cbAgree);
  16689. //发送数据
  16690. std::string pbdata = ClubAction.SerializePartialAsString();
  16691. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_ISAGREE_CLUB_ACK, (void*)pbdata.c_str(), pbdata.length());
  16692. return true;
  16693. }
  16694. //自动创房
  16695. bool CAttemperEngineSink::OnDBAutoCreateTable(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16696. CMD_GR_Club_Action_Ack2Ex2 * pActionAck2 = (CMD_GR_Club_Action_Ack2Ex2 *)pData;
  16697. if (pActionAck2 == NULL) return false;
  16698. if (pActionAck2->Ack2.ClubInfo.temp1 == 2)
  16699. {
  16700. //校验P
  16701. //本节点是否能创建房间
  16702. if (!m_BCreate)
  16703. {
  16704. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID);
  16705. //推荐可以创建桌子的服务器
  16706. if (pCGameServerItem == NULL)
  16707. {
  16708. TCHAR szString[512] = { 0 };
  16709. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:没有可用的服务器,俱乐部 [ ClubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID);
  16710. CTraceService::TraceString(szString, TraceLevel_Normal);
  16711. return true;
  16712. }
  16713. //向协调申请换服务器开房
  16714. CMD_GR_ClubAction2_XT ClubAction;
  16715. ZeroMemory(&ClubAction, sizeof(ClubAction));
  16716. ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID;
  16717. //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段
  16718. ClubAction.dwServerID = pCGameServerItem->wServerID;
  16719. ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4;
  16720. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction));
  16721. return true;
  16722. }
  16723. //花牌判定
  16724. BOOL bCreateHuaPai = (14 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID) || (15 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID) || (16 == pActionAck2->Ack2.ClubInfo.csGameConfig.wSubGameID);
  16725. if (!m_BCreate_Hua && bCreateHuaPai)
  16726. {
  16727. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID);
  16728. //推荐可以创建桌子的服务器
  16729. if (pCGameServerItem == NULL)
  16730. {
  16731. TCHAR szString[512] = { 0 };
  16732. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:花牌没有可用的服务器,俱乐部 [ clubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID);
  16733. CTraceService::TraceString(szString, TraceLevel_Normal);
  16734. return true;
  16735. }
  16736. //向协调申请换服务器开房
  16737. CMD_GR_ClubAction2_XT ClubAction;
  16738. ZeroMemory(&ClubAction, sizeof(ClubAction));
  16739. ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID;
  16740. //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段
  16741. ClubAction.dwServerID = pCGameServerItem->wServerID;
  16742. ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4;
  16743. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction));
  16744. return true;
  16745. }
  16746. //当前服务器桌子上限判断
  16747. DWORD wMaxTable = m_pGameServiceOption->wTableCount;
  16748. DWORD dwOnlineTableCount = m_PriTableID_2_TableID.size();
  16749. if (dwOnlineTableCount >= (wMaxTable - 1))
  16750. {
  16751. tagGameServer * pCGameServerItem = m_ServerListManager.SearchUseServer(8, m_pGameServiceOption->wServerID);
  16752. //推荐可以创建桌子的服务器
  16753. if (pCGameServerItem == NULL)
  16754. {
  16755. TCHAR szString[512] = { 0 };
  16756. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:本服务器桌子到达上限没有可用的服务器,俱乐部 [ clubID=%ld ]"), pActionAck2->Ack2.ClubInfo.dwClubID);
  16757. CTraceService::TraceString(szString, TraceLevel_Normal);
  16758. return true;
  16759. }
  16760. //向协调申请换服务器开房
  16761. CMD_GR_ClubAction2_XT ClubAction;
  16762. ZeroMemory(&ClubAction, sizeof(ClubAction));
  16763. ClubAction.dwClubID = pActionAck2->Ack2.ClubInfo.dwClubID;
  16764. //把服务器编号赋值给 DBR_GR_ClubAction2的第一个字段
  16765. ClubAction.dwServerID = pCGameServerItem->wServerID;
  16766. ClubAction.wWanFa = pActionAck2->Ack2.ClubInfo.temp4;
  16767. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_ChangServer, &ClubAction, sizeof(ClubAction));
  16768. return true;
  16769. }
  16770. //EE
  16771. void * pBuffer = NULL;
  16772. try
  16773. {
  16774. pBuffer = malloc(sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig));
  16775. ZeroMemory(pBuffer, sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig));
  16776. CMD_GR_UserSitDownEx * pEx = (CMD_GR_UserSitDownEx *)pBuffer;
  16777. pEx->dwUserID = pActionAck2->dwUserID;
  16778. pEx->cbAuto = 1;//表示自动创房
  16779. pEx->hostInfo.dwOwnerID = pActionAck2->Ack2.ClubInfo.dwOwnerID;
  16780. CopyMemory(pEx->hostInfo.szHeadUrl, pActionAck2->Ack2.ClubInfo.szHeadUrl, sizeof(pActionAck2->Ack2.ClubInfo.szHeadUrl));
  16781. CopyMemory(pEx->hostInfo.szHostName, pActionAck2->Ack2.ClubInfo.szHostName, sizeof(pActionAck2->Ack2.ClubInfo.szHostName));
  16782. memcpy(pEx->data.TableConfig, &(pActionAck2->Ack2.ClubInfo.csGameConfig), sizeof(tagTableConfig));
  16783. pEx->data.cbCreateTable = 1;//1表示创建新房间
  16784. pEx->data.tableType = 1; //??
  16785. pEx->data.clubID = pActionAck2->Ack2.ClubInfo.dwClubID;
  16786. pEx->cbWanFa = pActionAck2->Ack2.ClubInfo.temp4;//用来表示俱乐部的自动开房多玩法的0,1,2
  16787. //获取私有房间随机号码
  16788. ASSERT(m_pITCPSocketService != NULL);
  16789. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pBuffer, sizeof(CMD_GR_UserSitDownEx) + sizeof(tagTableConfig));
  16790. if (pBuffer) free(pBuffer);
  16791. pBuffer = NULL;
  16792. }
  16793. catch (...)
  16794. {
  16795. if (pBuffer) free(pBuffer);
  16796. }
  16797. }
  16798. return true;
  16799. }
  16800. //公告
  16801. bool CAttemperEngineSink::OnDBGetClubNotice(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16802. DBR_GR_ClubNotice_ACK* pClubNotice = (DBR_GR_ClubNotice_ACK *)pData;
  16803. if (pClubNotice == NULL) return false;
  16804. //返回数据
  16805. CMD_GR_ClubNoticeACK NoticeAck;
  16806. ZeroMemory(&NoticeAck, sizeof(NoticeAck));
  16807. NoticeAck.cbResult = pClubNotice->Result;
  16808. NoticeAck.cbType = pClubNotice->cbType;
  16809. NoticeAck.dwClubID = pClubNotice->dwClubID;
  16810. NoticeAck.dwTemp = pClubNotice->dwTemp;
  16811. CopyMemory(NoticeAck.Message, pClubNotice->Message, sizeof(NoticeAck.Message));
  16812. Club::PB_CS_S_ClubNoticeACK ClubNotice;
  16813. ClubNotice.set_dwclubid(NoticeAck.dwClubID);
  16814. ClubNotice.set_cbtype(NoticeAck.cbType);
  16815. ClubNotice.set_dwtemp(NoticeAck.dwTemp);
  16816. ClubNotice.set_cbresult(NoticeAck.cbResult);
  16817. std::string Message = CW2AEX<1024>(NoticeAck.Message, CP_UTF8).m_psz;
  16818. ClubNotice.set_message(Message);
  16819. //发送数据
  16820. std::string pbdata = ClubNotice.SerializePartialAsString();
  16821. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_NOTICE_ACK, (void*)pbdata.c_str(), pbdata.length());
  16822. return true;
  16823. }
  16824. //在线信息
  16825. //bool CAttemperEngineSink::OnDBGetClubOnLine(DWORD dwContextID, VOID * pData, WORD wDataSize){
  16826. //
  16827. // //获取用户
  16828. // WORD wBindIndex = LOWORD(dwContextID);
  16829. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  16830. //
  16831. // //用户效验
  16832. // ASSERT(pIServerUserItem != NULL);
  16833. // if (pIServerUserItem == NULL)
  16834. // {
  16835. // return false;
  16836. // }
  16837. //
  16838. // DBR_GR_ClubOnLine * pClubOnLineAck = (DBR_GR_ClubOnLine *)pData;
  16839. // if(pClubOnLineAck == NULL) return false;
  16840. //
  16841. // //返回数据
  16842. // CMD_GR_ClubOnLine_Ack ClubOnLine;
  16843. // ZeroMemory(&ClubOnLine, sizeof(ClubOnLine));
  16844. //
  16845. // ClubOnLine.wTotalUserCount = pClubOnLineAck->wUserCount;
  16846. // if (ClubOnLine.wTotalUserCount > 1000){ ClubOnLine.wTotalUserCount = 1000; }
  16847. // ClubOnLine.wNewUserCount = pClubOnLineAck->wNewUserCount;
  16848. // ClubOnLine.dwClubID = pClubOnLineAck->dwClubID;
  16849. // ClubOnLine.wUserMessageCount = pClubOnLineAck->wMessageCount;
  16850. //
  16851. //
  16852. //
  16853. // //在线用户
  16854. // WORD userCount = 0;
  16855. //
  16856. // //从全局服务器上找
  16857. // for (int i = 0; i < ClubOnLine.wTotalUserCount; i++)
  16858. // {
  16859. // auto iter = m_OnLineUserAll.find(pClubOnLineAck->dwUserID[i]);
  16860. // if (iter != m_OnLineUserAll.end())
  16861. // {
  16862. // userCount++;
  16863. // }
  16864. // }
  16865. // ClubOnLine.wOnLineUserNum = userCount;
  16866. //
  16867. //
  16868. // //房间信息
  16869. // DWORD tableCount = 0;
  16870. // //int startIndex = 0;
  16871. // CMD_S_Table_Info tableInfo[200] = { 0 };
  16872. //
  16873. // int AutoTableFreeCountAdd[3] = { 0 };//LYH 2018-11-2 表示多玩法的不同玩法桌子空闲个数
  16874. //
  16875. // //从全局服务器上查找
  16876. // int AutoTableCount = 0;
  16877. // CWHDataLocker DataLocker(m_CriticalSection);
  16878. // JN_GR_RoomListInfo RoomInfo;
  16879. // JN_GR_RoomListBig Temp;
  16880. // std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it2 = m_PrivateRoomAll.begin();
  16881. // while (it2 != m_PrivateRoomAll.end())
  16882. // {
  16883. // ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  16884. // Temp = it2->second;
  16885. // if (Temp.roomType == 1 && Temp.tmp6[0] == pClubOnLineAck->dwClubID)
  16886. // {
  16887. // if (Temp.roomStatus == 0 && Temp.currentjushu == 0)
  16888. // {
  16889. // for (BYTE i = 0; i < 3; i++)
  16890. // {
  16891. // if (Temp.tmp4 == i && pClubOnLineAck->IsWanFa[i] == 1)
  16892. // {
  16893. // AutoTableFreeCountAdd[i]++;
  16894. // break;
  16895. // }
  16896. // }
  16897. // }
  16898. // //如果是自动开的房且没有开始(有待优化)(服务器重启自动开房判定)
  16899. // AutoTableCount++;
  16900. // ZeroMemory(&RoomInfo, sizeof(JN_GR_RoomListInfo));
  16901. //
  16902. // RoomInfo.dwDiFen = Temp.dwDiFen;
  16903. // RoomInfo.dwJuShu = Temp.dwJuShu;
  16904. // RoomInfo.bRoomCreatePay = Temp.bRoomCreatePay;
  16905. // RoomInfo.dwRoomNumber = Temp.dwRoomNumber;
  16906. // RoomInfo.dwServerID = Temp.dwServerID;
  16907. // RoomInfo.bFanGua = Temp.bFanGua;
  16908. // RoomInfo.bWanFa = Temp.bWanFa;
  16909. //
  16910. // RoomInfo.bDuoLai = Temp.bDuoLai; //多癞子可平胡,0可以 1不可以
  16911. // RoomInfo.wFengDing = Temp.wFengDing; //封顶值
  16912. // RoomInfo.tmp1 = Temp.tmp1; //备用字段
  16913. // RoomInfo.tmp2 = Temp.tmp2; //备用字段
  16914. //
  16915. // // to do 判断用户版本号
  16916. // TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  16917. // memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  16918. // del_char(szMachineID, L'.');
  16919. // __int64 iMachineID = StrToNmuber(szMachineID);
  16920. //
  16921. // //--最低要求的版本号
  16922. // TCHAR szMinClientVer[LEN_MACHINE_ID] = { 0 };
  16923. // memcpy(szMinClientVer, m_pInitParameter->m_szMinClientVer, sizeof(szMinClientVer));
  16924. // del_char(szMinClientVer, L'.');
  16925. // __int64 iMinClientVer = StrToNmuber(szMinClientVer);
  16926. //
  16927. // if (iMachineID < iMinClientVer && ((RoomInfo.bWanFa == 14 || RoomInfo.tmp1 == 2)))
  16928. // {
  16929. // it2++;
  16930. // TCHAR szString[512] = { 0 };
  16931. // _sntprintf(szString, CountArray(szString), TEXT("版本异常:用户ID不匹配[ RoomInfo.bDuoLai=%ld,RoomInfo.bWanFa=%ld,RoomInfo.wFengDing = %ld ]"), RoomInfo.bDuoLai, RoomInfo.bWanFa, RoomInfo.wFengDing);
  16932. // CTraceService::TraceString(szString, TraceLevel_Warning);
  16933. // continue;
  16934. // }
  16935. //
  16936. // StringCchCopy(RoomInfo.szName, _countof(RoomInfo.szName), Temp.szName);
  16937. // //修改直接获取房间ip信息2018-07-30
  16938. // StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), Temp.szIp);
  16939. // //CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(Temp.dwServerID);
  16940. // //if (pCGameServerItem)
  16941. // //{
  16942. // /*if (pIServerUserItem->GetUserInfo()->iXinYong == 1 &&
  16943. // pCGameServerItem->m_GameServer.wServerLevel > 2)
  16944. // {
  16945. // continue;
  16946. // CMD_GR_UserSitDownAck req;
  16947. // req.cbRet = 1;
  16948. //
  16949. // req.szText;
  16950. // StringCchCopy(req.szText, _countof(req.szText), _T("此房间不可用,请自行建房."));
  16951. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  16952. // return true;
  16953. // }*/
  16954. //
  16955. // //计算距离排名
  16956. // //iPaiMing = 0; iCountMax = 1;
  16957. // //GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  16958. // //ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax);
  16959. // //if (ip.c_str() != Temp.szIp)
  16960. // //{
  16961. // // CString str;
  16962. // // str.Format(_T("获取的ip不等于内存szIp。ip=%s Temp.szIp=%s", ip, Temp.szIp));
  16963. // // CTraceService::TraceString(str, TraceLevel_Warning);
  16964. // //}
  16965. // //StringCchCopy(RoomInfo.szIp, _countof(RoomInfo.szIp), ip.c_str());
  16966. // //}
  16967. //
  16968. //
  16969. //
  16970. // if (Temp.szIp == L"")
  16971. // {
  16972. // it2++;
  16973. // TCHAR szString[512] = { 0 };
  16974. // _sntprintf(szString, CountArray(szString), TEXT("获取ip异常"));
  16975. // CTraceService::TraceString(szString, TraceLevel_Warning);
  16976. // continue;
  16977. // /*CMD_GR_UserSitDownAck req;
  16978. // req.cbRet = 1;
  16979. //
  16980. // req.szText;
  16981. // StringCchCopy(req.szText, _countof(req.szText), _T("此房间,无可用服务。请尝试进入其他房间!"));
  16982. // SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, &req, sizeof(TCHAR) * 32 + 1);
  16983. // return true;*/
  16984. // }
  16985. //
  16986. // RoomInfo.wPort = Temp.wPort;
  16987. // //m_Data.dAddRoomChange++;
  16988. //
  16989. // //if (pCGameServerItem != NULL)
  16990. // //{
  16991. // // if (IsJC(9999))
  16992. // // {
  16993. // // CString csTestB;
  16994. // // csTestB.Format(_T("昵称:%s -> 加入房间服务地址-> %s:%d 通道->%s,距离 -> %lld,排名 -> %d,最大人数 -> %d")
  16995. // // , pIServerUserItem->GetNickName(), pCGameServerItem->m_GameServer.szServerAddr, pCGameServerItem->m_GameServer.wServerPort
  16996. // // , RoomInfo.szIp, pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  16997. // // CTraceService::TraceString(csTestB, TraceLevel_Normal);
  16998. // // }
  16999. // //}
  17000. // //else
  17001. // //{
  17002. // // CString csTestB;
  17003. // // csTestB.Format(_T("未找到游戏节点 %d"), Temp.dwServerID);
  17004. //
  17005. // // CTraceService::TraceString(csTestB, TraceLevel_Normal);
  17006. // //}
  17007. //
  17008. // tableInfo[tableCount].dwUserID = Temp.dwUserID;
  17009. // tableInfo[tableCount].cbNum = Temp.dwReadyBody;
  17010. // CopyMemory(tableInfo[tableCount].szHeadUrl, Temp.szHeadUrl, sizeof(Temp.szHeadUrl));
  17011. // CopyMemory(&(tableInfo[tableCount].room), &RoomInfo, sizeof(RoomInfo));
  17012. // tableCount++;
  17013. // //if (tableCount >= 10){ break; } lyh 2018 - 9 - 13
  17014. // if (tableCount >= 200){break;}
  17015. // }
  17016. // it2++;
  17017. // }
  17018. //
  17019. // ////对tableinfo进行排序
  17020. // if ( tableCount >= 2 )
  17021. // {
  17022. // for (int i = 0; i < tableCount - 1; i++)
  17023. // {
  17024. //
  17025. // for (int j = 0; j < tableCount - 1 - i; j++)
  17026. // {
  17027. // if (tableInfo[j].cbNum > tableInfo[j + 1].cbNum)
  17028. // {
  17029. // CMD_S_Table_Info tableInfoTemp;
  17030. // ZeroMemory(&tableInfoTemp, sizeof(CMD_S_Table_Info));
  17031. // CopyMemory(&tableInfoTemp, &tableInfo[j], sizeof(CMD_S_Table_Info));
  17032. //
  17033. // ZeroMemory(&tableInfo[j], sizeof(CMD_S_Table_Info));
  17034. // CopyMemory(&tableInfo[j], &tableInfo[j + 1], sizeof(CMD_S_Table_Info));
  17035. //
  17036. // ZeroMemory(&tableInfo[j + 1], sizeof(CMD_S_Table_Info));
  17037. // CopyMemory(&tableInfo[j + 1], &tableInfoTemp, sizeof(CMD_S_Table_Info));
  17038. // }
  17039. // }
  17040. // }
  17041. // }
  17042. //
  17043. //
  17044. // int k = 0;
  17045. // for (int i = pClubOnLineAck->wStartIndex; i < tableCount; i++)
  17046. // {
  17047. // CopyMemory(&ClubOnLine.csTableInfo[k++], &tableInfo[i], sizeof(CMD_S_Table_Info));
  17048. // if (k == pClubOnLineAck->wCount || k>= 20) break;
  17049. // }
  17050. //
  17051. // ClubOnLine.wTableInfoCount = k;
  17052. // ClubOnLine.wTableNum = tableCount;
  17053. // //真实数据包长
  17054. // int pageLen = (sizeof(CMD_S_Table_Info)*k) + (sizeof(WORD) * 6) + sizeof(DWORD);
  17055. // //发送数据
  17056. // m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBONLINE_ACK, &ClubOnLine, pageLen);// sizeof(ClubOnLine)
  17057. //
  17058. // //自动开房校验:1.宕机没房间的时候第一个玩家获取在线信息时自动创房 2.平时出现没有自动创房时,群主获取在线信息时自动创房
  17059. // if (AutoTableCount == 0 && pClubOnLineAck->TableChoice == 2)
  17060. // {
  17061. // for (BYTE i = 0; i < 3; i++)
  17062. // {
  17063. // if (AutoTableFreeCountAdd[i] == 0 && pClubOnLineAck->IsWanFa[i] == 1)
  17064. // {
  17065. // this->OnAutoCreateRoomToDB(pClubOnLineAck->dwClubID, pIServerUserItem->GetUserID(), i);
  17066. // }
  17067. // }
  17068. // }
  17069. //
  17070. // return true;
  17071. //}
  17072. //在线信息
  17073. bool CAttemperEngineSink::OnDBGetClubOnLineEx(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17074. //获取用户
  17075. WORD wBindIndex = LOWORD(dwContextID);
  17076. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17077. //用户效验
  17078. ASSERT(pIServerUserItem != NULL);
  17079. if (pIServerUserItem == NULL)
  17080. {
  17081. return false;
  17082. }
  17083. DBR_GR_ClubOnLine * pClubOnLineAck = (DBR_GR_ClubOnLine *)pData;
  17084. if (pClubOnLineAck == NULL) return false;
  17085. //在线用户
  17086. WORD userCount = 0;
  17087. for (int i = 0; i < pClubOnLineAck->wUserCount; i++)
  17088. {
  17089. auto iter = m_OnLineUserAll.find(pClubOnLineAck->dwUserID[i]);
  17090. if (iter != m_OnLineUserAll.end())
  17091. {
  17092. userCount++;
  17093. }
  17094. }
  17095. CMD_GR_TableOtherInfo_Notify TableOtherInfo;
  17096. ZeroMemory(&TableOtherInfo, sizeof(TableOtherInfo));
  17097. TableOtherInfo.ClubID = pClubOnLineAck->dwClubID;
  17098. TableOtherInfo.totalUserNum = pClubOnLineAck->wUserCount;
  17099. TableOtherInfo.onlineUserNum = userCount;
  17100. TableOtherInfo.newMsgNum = pClubOnLineAck->wMessageCount;
  17101. TableOtherInfo.newUserNum = pClubOnLineAck->wNewUserCount;
  17102. TableOtherInfo.Type = 0x7F;//127
  17103. if (TableOtherInfo.newMsgNum == 0) TableOtherInfo.Type -= 8;
  17104. if (TableOtherInfo.newUserNum == 0) TableOtherInfo.Type -= 16;
  17105. int AutoWaitTableCountAdd[3] = { 0 }; // [CountArray(pClubOnLineAck->cbSubGameID)] = { 0 };//LYH 11-2 龙11.10修改
  17106. {
  17107. CWHDataLocker DataLocker(m_CriticalSection);
  17108. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it2 = m_PrivateRoomAll.begin();
  17109. while (it2 != m_PrivateRoomAll.end())
  17110. {
  17111. JN_GR_RoomListBig Rooms = it2->second;
  17112. if (Rooms.roomType == 1 && Rooms.tmp6[0] == pClubOnLineAck->dwClubID)
  17113. {
  17114. TableOtherInfo.totalTableNum++;
  17115. if (Rooms.roomStatus == 0 && Rooms.currentjushu == 0)
  17116. {
  17117. TableOtherInfo.waitTableNum++;
  17118. for (BYTE i = 0; i < 3; i++)
  17119. {
  17120. if (Rooms.tmp4 == i && pClubOnLineAck->IsWanFa[i] == 1)
  17121. {
  17122. AutoWaitTableCountAdd[i]++;
  17123. break;
  17124. }
  17125. }
  17126. }
  17127. if (Rooms.roomStatus == 1 || Rooms.currentjushu > 0) TableOtherInfo.playTableNum++;
  17128. }
  17129. it2++;
  17130. }
  17131. }
  17132. Club::PB_CS_S_TableOtherInfo_Notify Notify;
  17133. Notify.set_clubid(TableOtherInfo.ClubID);
  17134. Notify.set_newmsgnum(TableOtherInfo.newMsgNum);
  17135. Notify.set_newusernum(TableOtherInfo.newUserNum);
  17136. Notify.set_onlineusernum(TableOtherInfo.onlineUserNum);
  17137. Notify.set_playtablenum(TableOtherInfo.playTableNum);
  17138. Notify.set_totaltablenum(TableOtherInfo.totalTableNum);
  17139. Notify.set_totalusernum(TableOtherInfo.totalUserNum);
  17140. Notify.set_type(TableOtherInfo.Type);
  17141. Notify.set_waittablenum(TableOtherInfo.waitTableNum);
  17142. //发送数据
  17143. std::string pbdata = Notify.SerializePartialAsString();
  17144. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_CLUBCHANGE_NOTIFY_ACK, (void*)pbdata.c_str(), pbdata.length());
  17145. //自动创房触发
  17146. if (pClubOnLineAck->TableChoice == 2)
  17147. {
  17148. for (BYTE i = 0; i < 3; i++)
  17149. {
  17150. if (pClubOnLineAck->IsWanFa[i] == 1 && AutoWaitTableCountAdd[i] == 0)
  17151. {
  17152. //TCHAR szString[512] = { 0 };
  17153. //_sntprintf(szString, CountArray(szString), TEXT("打印玩法创建情况pClubOnLineAck->IsWanFa[%d]= %d, AutoWaitTableCountAdd[i]= %d"), i, pClubOnLineAck->IsWanFa[i], AutoWaitTableCountAdd[i]);
  17154. //CTraceService::TraceString(szString, TraceLevel_Warning);
  17155. this->OnAutoCreateRoomToDB(pClubOnLineAck->dwClubID, pIServerUserItem->GetUserID(), i);
  17156. }
  17157. }
  17158. }
  17159. return true;
  17160. }
  17161. bool CAttemperEngineSink::OnDBNotifyClubUser(DWORD dwContextID, VOID * pData, WORD wDataSize)
  17162. {
  17163. OutputDebugStringA("OnDBNotifyClubUser");
  17164. DBR_GR_UserData * pUserData = (DBR_GR_UserData *)pData;
  17165. //返回数据
  17166. CMD_GR_Club_Notify_ACK Notify;
  17167. ZeroMemory(&Notify, sizeof(Notify));
  17168. //赋值
  17169. Notify.newsFalg = pUserData->newsFlag;
  17170. Notify.dwClubID = pUserData->dwClubID;
  17171. Notify.dwUserCount = pUserData->newUserCount;
  17172. CopyMemory(Notify.Message, pUserData->Message, sizeof(pUserData->Message));
  17173. //从全局服务器上找
  17174. for (int i = 0; i < pUserData->wUserCount; i++)
  17175. {
  17176. auto iter = m_OnLineUserAll.find(pUserData->dwUserID[i]);
  17177. if (iter != m_OnLineUserAll.end())
  17178. {
  17179. CMD_GR_Club_NotifyEX_ACK NotifyEx;
  17180. ZeroMemory(&NotifyEx, sizeof(CMD_GR_Club_NotifyEX_ACK));
  17181. NotifyEx.dwUserId = pUserData->dwUserID[i];
  17182. CopyMemory(&NotifyEx.Notify, &Notify, sizeof(Notify));
  17183. if (m_pITCPSocketService)
  17184. {
  17185. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_C_USER_SendMessage, &NotifyEx, sizeof(CMD_GR_Club_NotifyEX_ACK));
  17186. }
  17187. }
  17188. }
  17189. return true;
  17190. }
  17191. //特殊会员
  17192. bool CAttemperEngineSink::OnDBGetClubBlackUser(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17193. //获取用户
  17194. WORD wBindIndex = LOWORD(dwContextID);
  17195. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17196. //用户效验
  17197. ASSERT(pIServerUserItem != NULL);
  17198. if (pIServerUserItem == NULL)
  17199. {
  17200. return false;
  17201. }
  17202. CMD_GR_ClubUser2_Ack * pClubUserAck = (CMD_GR_ClubUser2_Ack *)pData;
  17203. if (pClubUserAck == NULL) return false;
  17204. for (int i = 0; i < pClubUserAck->wCount; i++)
  17205. {
  17206. //从其全局服务器上找
  17207. if (i >= 20){ break; }
  17208. auto iter = m_OnLineUserAll.find(pClubUserAck->csMemberInfo[i].dwUserID);
  17209. if (iter != m_OnLineUserAll.end())
  17210. {
  17211. pClubUserAck->csMemberInfo[i].isOnline = 1;
  17212. }
  17213. }
  17214. Club::PB_CS_S_ClubUser2_Ack ClubRecord;
  17215. ClubRecord.set_cbkind(pClubUserAck->cbKind);
  17216. ClubRecord.set_tmp(pClubUserAck->tmp);
  17217. ClubRecord.set_cbhost(pClubUserAck->cbHost);
  17218. ClubRecord.set_dwclubid(pClubUserAck->dwClubID);
  17219. ClubRecord.set_wcount(pClubUserAck->wCount);
  17220. for (WORD i = 0; i < pClubUserAck->wCount; i++)
  17221. {
  17222. Club::PB_CS_S_MemberInfo* RecordInfo = ClubRecord.add_csmemberinfo();
  17223. RecordInfo->set_bangmaid(pClubUserAck->csMemberInfo[i].BangMaID);
  17224. RecordInfo->set_cbstaus(pClubUserAck->csMemberInfo[i].cbStaus);
  17225. RecordInfo->set_ishost(pClubUserAck->csMemberInfo[i].isHost);
  17226. RecordInfo->set_isonline(pClubUserAck->csMemberInfo[i].isOnline);
  17227. RecordInfo->set_dwuserid(pClubUserAck->csMemberInfo[i].dwUserID);
  17228. std::string szName = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szName, CP_UTF8).m_psz;
  17229. std::string szHeadUrl = CW2AEX<1024>(pClubUserAck->csMemberInfo[i].szHeadUrl, CP_UTF8).m_psz;
  17230. RecordInfo->set_szname(szName);
  17231. RecordInfo->set_szheadurl(szHeadUrl);
  17232. }
  17233. //发送数据
  17234. std::string pbdata = ClubRecord.SerializePartialAsString();
  17235. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_CLUBBLACKUSER_ACK, (void*)pbdata.c_str(), pbdata.length());
  17236. return true;
  17237. }
  17238. //协议
  17239. bool CAttemperEngineSink::OnDBGetClubProtocol(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17240. //获取用户
  17241. WORD wBindIndex = LOWORD(dwContextID);
  17242. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17243. //用户效验
  17244. ASSERT(pIServerUserItem != NULL);
  17245. if (pIServerUserItem == NULL)
  17246. {
  17247. return false;
  17248. }
  17249. DBR_GR_ClubProtocolAgree * pClubProtocolAck = (DBR_GR_ClubProtocolAgree *)pData;
  17250. if (pClubProtocolAck == NULL) return false;
  17251. //返回数据
  17252. CMD_GR_ClubProtocolAgree ClubProtocol;
  17253. ZeroMemory(&ClubProtocol, sizeof(ClubProtocol));
  17254. ClubProtocol.dwClubID = pClubProtocolAck->dwClubID;
  17255. ClubProtocol.cbAgree = pClubProtocolAck->cbAgree;
  17256. ClubProtocol.dwTemp = pClubProtocolAck->dwTemp;
  17257. Club::PB_CS_S_ClubProtocolAgree ProtocolAgree;
  17258. ProtocolAgree.set_dwclubid(ClubProtocol.dwClubID);
  17259. ProtocolAgree.set_cbagree(ClubProtocol.cbAgree);
  17260. ProtocolAgree.set_dwtemp(ClubProtocol.dwTemp);
  17261. //发送数据
  17262. std::string pbdata = ProtocolAgree.SerializePartialAsString();
  17263. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_PROTOLCOL_ACK, (void*)pbdata.c_str(), pbdata.length());
  17264. return true;
  17265. }
  17266. //群主解散俱乐部房间
  17267. bool CAttemperEngineSink::OnDBGetClubDissolveRoom(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17268. //获取用户
  17269. WORD wBindIndex = LOWORD(dwContextID);
  17270. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17271. //用户效验
  17272. ASSERT(pIServerUserItem != NULL);
  17273. if (pIServerUserItem == NULL)
  17274. {
  17275. return false;
  17276. }
  17277. DBR_GR_ClubDissolveRoom* pClubDissolveRoom = (DBR_GR_ClubDissolveRoom*)pData;
  17278. if (pClubDissolveRoom == NULL) return false;
  17279. if (pClubDissolveRoom->cbIsAdmin == 0)
  17280. {
  17281. //GetTCPNetworkEngine()->OnTBDataEvent(DBO_GR_GAME_JSROOM, 0, &pClubDissolveRoom->dwRoomID, sizeof(DWORD));
  17282. //通知协调全局解散此房间
  17283. DWORD dwRoomID = pClubDissolveRoom->dwRoomID;
  17284. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, &dwRoomID, sizeof(DWORD));
  17285. }
  17286. else if (pClubDissolveRoom->cbIsAdmin == 1)
  17287. {
  17288. SendRequestFailure(pIServerUserItem, TEXT("您没有权限,不能强制解散!"), 0);
  17289. }
  17290. else
  17291. {
  17292. SendRequestFailure(pIServerUserItem, TEXT("今日超过次数!"), 0);
  17293. }
  17294. return true;
  17295. }
  17296. //同意协议
  17297. bool CAttemperEngineSink::OnDBAgreeClubProtocol(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17298. //获取用户
  17299. WORD wBindIndex = LOWORD(dwContextID);
  17300. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17301. //用户效验
  17302. ASSERT(pIServerUserItem != NULL);
  17303. if (pIServerUserItem == NULL)
  17304. {
  17305. return false;
  17306. }
  17307. DBR_GR_Club_Action_Ack1 * pClubProtocolAck = (DBR_GR_Club_Action_Ack1 *)pData;
  17308. if (pClubProtocolAck == NULL) return false;
  17309. Club::PB_CS_S_ClubActionAck1 ProtocolAgree;
  17310. ProtocolAgree.set_dwclubid(pClubProtocolAck->dwClubID);
  17311. ProtocolAgree.set_result(pClubProtocolAck->Result);
  17312. std::string Message = CW2AEX<1024>(pClubProtocolAck->Message, CP_UTF8).m_psz;
  17313. ProtocolAgree.set_message(Message);
  17314. //发送数据
  17315. std::string pbdata = ProtocolAgree.SerializePartialAsString();
  17316. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_USER_GET_PROTOLCOLAGREE_ACK, (void*)pbdata.c_str(), pbdata.length());
  17317. return true;
  17318. }
  17319. //群主信息(自动开房和群主支付创房)
  17320. bool CAttemperEngineSink::OnDBGetClubHostInfo(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17321. DBR_GR_UserSitDownEx3 * pClubHostInfoAck = (DBR_GR_UserSitDownEx3 *)pData;
  17322. if (pClubHostInfoAck == NULL) return false;
  17323. IServerUserItem * pIServerUserItem = NULL;
  17324. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0 && dwContextID != 0)
  17325. {
  17326. //获取用户
  17327. WORD wBindIndex = LOWORD(dwContextID);
  17328. pIServerUserItem = GetBindUserItem(wBindIndex);
  17329. //用户效验
  17330. ASSERT(pIServerUserItem != NULL);
  17331. if (pIServerUserItem == NULL )
  17332. {
  17333. return false;
  17334. }
  17335. }
  17336. if (pClubHostInfoAck->UserSitDownData.data.cbCreateTable == 1)
  17337. {
  17338. //获取用户
  17339. WORD wBindIndex = LOWORD(dwContextID);
  17340. pIServerUserItem = GetBindUserItem(wBindIndex);
  17341. CMD_GR_UserSitDownAck req;
  17342. req.cbRet = 1;
  17343. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17344. {
  17345. StringCchCopy(req.szText, _countof(req.szText), _T("俱乐部已经打样,不能创建房间"));
  17346. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17347. SitDownAck.set_cbret(req.cbRet);
  17348. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  17349. SitDownAck.set_sztext(szText);
  17350. //发送数据
  17351. std::string pbdata = SitDownAck.SerializePartialAsString();
  17352. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17353. }
  17354. return true;
  17355. }
  17356. tagGameConfig* pConfigTemp = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig;
  17357. if (1 == pClubHostInfoAck->UserSitDownData.cbAuto || pConfigTemp->wMaxFanRule >= 10)//不是群主创房且不是自动创房 不进行下去,直接返回
  17358. {
  17359. if (pClubHostInfoAck->currCurrency < pClubHostInfoAck->UserSitDownData.ReduceBeans)
  17360. {
  17361. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17362. {
  17363. CMD_GR_UserSitDownAck req;
  17364. req.cbRet = 1;
  17365. StringCchCopy(req.szText, _countof(req.szText), _T("群主钻石不足,不能创建房间!"));
  17366. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17367. SitDownAck.set_cbret(req.cbRet);
  17368. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  17369. SitDownAck.set_sztext(szText);
  17370. //发送数据
  17371. std::string pbdata = SitDownAck.SerializePartialAsString();
  17372. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17373. }
  17374. else
  17375. {
  17376. TCHAR szString[512] = { 0 };
  17377. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:群主钻石不够,俱乐部[ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID);
  17378. CTraceService::TraceString(szString, TraceLevel_Normal);
  17379. //广播给其他用户(目前广播给群主)
  17380. CMD_GR_UserData UserData;
  17381. ZeroMemory(&UserData, sizeof(UserData));
  17382. UserData.dwClubID = pClubHostInfoAck->UserSitDownData.data.clubID;
  17383. UserData.newsFlag = 4;
  17384. //UserData.dwUserId = pClubHostInfoAck->UserSitDownData.dwUesrID;
  17385. CString s = L"自动创房失败:群主钻石不够";
  17386. _tcscpy(UserData.Message, s);
  17387. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  17388. }
  17389. return true;
  17390. }
  17391. }
  17392. //俱乐部房间
  17393. if (pClubHostInfoAck->UserSitDownData.data.tableType == 1)
  17394. {
  17395. int count = 0;
  17396. //从全局服务器上找
  17397. int flag = 1;
  17398. CWHDataLocker DataLocker(m_CriticalSection);
  17399. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it1 = m_PrivateRoomAll.begin();
  17400. while (it1 != m_PrivateRoomAll.end() && flag)
  17401. {
  17402. JN_GR_RoomListBig rooms = it1->second;
  17403. if (rooms.roomType == 1 && rooms.tmp6[0] == pClubHostInfoAck->UserSitDownData.data.clubID)
  17404. {
  17405. tagGameConfig* pConfigTemp = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig;
  17406. if (rooms.roomStatus == 0 && pConfigTemp->wSubGameID == rooms.bWanFa && pConfigTemp->wFengDing == rooms.wFengDing && rooms.tmp4 == pClubHostInfoAck->UserSitDownData.cbWanFa)//按照玩法来筛选空闲
  17407. {
  17408. if (rooms.tmp5 == 1 && rooms.currentjushu == 0)//当这个俱乐部为自动有自动建房的房间,且为空闲的,就不往下走了 //添加校验(自动开房)
  17409. {
  17410. TCHAR szString[512] = { 0 };
  17411. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:%d 已经存在一个房间了.房间号:%d,人数:%d,状态:%d 玩法几:%d"), pClubHostInfoAck->UserSitDownData.data.clubID, rooms.dwRoomNumber, rooms.dwReadyBody, rooms.roomStatus, rooms.tmp4);
  17412. CTraceService::TraceString(szString, TraceLevel_Warning);
  17413. return true;
  17414. }
  17415. count++;
  17416. if (count == 10)
  17417. {
  17418. flag = 0;
  17419. break;
  17420. }
  17421. }
  17422. }
  17423. it1++;
  17424. }
  17425. if (count >= 10)
  17426. {
  17427. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17428. {
  17429. CMD_GR_UserSitDownAck req;
  17430. req.cbRet = 1;
  17431. StringCchCopy(req.szText, _countof(req.szText), _T("牌友圈还有10桌未开始,请稍后再试!"));
  17432. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17433. SitDownAck.set_cbret(req.cbRet);
  17434. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  17435. SitDownAck.set_sztext(szText);
  17436. //发送数据
  17437. std::string pbdata = SitDownAck.SerializePartialAsString();
  17438. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17439. }
  17440. return true;
  17441. }
  17442. }
  17443. std::shared_ptr<CTableFrame> pTableFrame;
  17444. tagGameConfig* pConfig = (tagGameConfig*)pClubHostInfoAck->UserSitDownData.data.TableConfig;
  17445. pTableFrame = CreatePrivateTable(pClubHostInfoAck->UserSitDownData.RoomID, pConfig->wSubGameID);
  17446. if (nullptr == pTableFrame)
  17447. {
  17448. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17449. {
  17450. CMD_GR_UserSitDownAck req;
  17451. req.cbRet = 1;
  17452. StringCchCopy(req.szText, _countof(req.szText), _T("当前游戏房间已经人满为患了,请稍后再试!"));
  17453. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17454. SitDownAck.set_cbret(req.cbRet);
  17455. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  17456. SitDownAck.set_sztext(szText);
  17457. //发送数据
  17458. std::string pbdata = SitDownAck.SerializePartialAsString();
  17459. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17460. }
  17461. else
  17462. {
  17463. TCHAR szString[512] = { 0 };
  17464. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:服务器房间已满,俱乐部 [ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID);
  17465. CTraceService::TraceString(szString, TraceLevel_Normal);
  17466. }
  17467. return true;
  17468. }
  17469. TCHAR szTemp[32] = { 0 };
  17470. if (pTableFrame) pTableFrame->GetPrivateTableID(szTemp, 32);
  17471. std::wstring str;
  17472. str = szTemp;
  17473. m_PriTableID_2_TableID[str] = pTableFrame->GetTableID();
  17474. pConfig->wHadPlayCount = pTableFrame->GetTableID();
  17475. pConfig->zmExtraRule = 1;
  17476. StringCchCat(pConfig->sPrivateTableID, 7, str.c_str());
  17477. pTableFrame->OnEventSetGameConfig((void*)pClubHostInfoAck->UserSitDownData.data.TableConfig, wDataSize - sizeof(CMD_GR_UserSitDown), str);
  17478. int TargetID = 0;
  17479. TCHAR TargetHeadUrl[LEN_HEAD_URL];
  17480. TCHAR TargetName[32];
  17481. ZeroMemory(TargetName, sizeof(TargetName));
  17482. ZeroMemory(TargetHeadUrl, sizeof(TargetHeadUrl));
  17483. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17484. {
  17485. TargetID = pIServerUserItem->GetUserID();
  17486. CopyMemory(TargetHeadUrl, pIServerUserItem->GetUserInfo()->szHeadUrl, sizeof(TargetHeadUrl));
  17487. CopyMemory(TargetName, pIServerUserItem->GetUserInfo()->szNickName, sizeof(TargetName));
  17488. }
  17489. else
  17490. {
  17491. //校验群主房间是否已满(全局校验)
  17492. int i = 0;
  17493. for (i = 0; i <5; i++)
  17494. {
  17495. int count = 0;
  17496. int TestID = pClubHostInfoAck->AdmInfo[i].dwOwnerID;
  17497. if (TestID == 0)
  17498. {
  17499. TCHAR szString[512] = { 0 };
  17500. _sntprintf(szString, CountArray(szString), TEXT("自动创房失败:没有找到管理员,房间已满30个,俱乐部 [ ClubID=%ld ]"), pClubHostInfoAck->UserSitDownData.data.clubID);
  17501. CTraceService::TraceString(szString, TraceLevel_Normal);
  17502. return true;
  17503. }
  17504. //全局校验
  17505. CWHDataLocker DataLocker(m_CriticalSection);
  17506. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it = m_PrivateRoomAll.begin();
  17507. while (it != m_PrivateRoomAll.end())
  17508. {
  17509. JN_GR_RoomListBig rooms = it->second;
  17510. if (rooms.dwUserID == TestID)
  17511. {
  17512. count++;
  17513. }
  17514. it++;
  17515. }
  17516. if (count >= 30)
  17517. {
  17518. continue;
  17519. }
  17520. else
  17521. {
  17522. break;
  17523. }
  17524. }
  17525. TargetID = pClubHostInfoAck->AdmInfo[i].dwOwnerID;
  17526. CopyMemory(TargetHeadUrl, pClubHostInfoAck->AdmInfo[i].szHeadUrl, sizeof(TargetHeadUrl));
  17527. CopyMemory(TargetName, pClubHostInfoAck->AdmInfo[i].szHostName, sizeof(TargetName));
  17528. }
  17529. pTableFrame->SetPrivateTableOwnerID(TargetID);
  17530. pTableFrame->SetGameConfig(*pConfig, pClubHostInfoAck->UserSitDownData.data.WXianZhi);
  17531. //俱乐部房间和好友房间的区分
  17532. pTableFrame->SetTableKind(pClubHostInfoAck->UserSitDownData.data.tableType);
  17533. pTableFrame->SetTableClub(pClubHostInfoAck->UserSitDownData.data.clubID);
  17534. pTableFrame->SetTableAuto(pClubHostInfoAck->UserSitDownData.cbAuto);
  17535. JN_GR_RoomListGroup sPrivateTableID;
  17536. ZeroMemory(&sPrivateTableID, sizeof(JN_GR_RoomListGroup));
  17537. //查看自己创建的房间
  17538. auto iter = m_UserID_2_PriTableIDGROUP.find(TargetID);
  17539. if (iter != m_UserID_2_PriTableIDGROUP.end())
  17540. {
  17541. sPrivateTableID = iter->second;
  17542. if (sPrivateTableID.Num > 29)
  17543. {
  17544. if (pClubHostInfoAck->UserSitDownData.cbAuto== 0)
  17545. {
  17546. CMD_GR_UserSitDownAck req;
  17547. req.cbRet = 1;
  17548. StringCchCopy(req.szText, _countof(req.szText), _T("当前状态不允许创建!"));
  17549. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17550. SitDownAck.set_cbret(req.cbRet);
  17551. std::string szText = CW2AEX<1024>(req.szText, CP_UTF8).m_psz;
  17552. SitDownAck.set_sztext(szText);
  17553. //发送数据
  17554. std::string pbdata = SitDownAck.SerializePartialAsString();
  17555. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17556. }
  17557. return true;
  17558. }
  17559. }
  17560. else
  17561. {
  17562. std::pair<DWORD, JN_GR_RoomListGroup> temp(TargetID, sPrivateTableID);
  17563. m_UserID_2_PriTableIDGROUP.insert(temp);
  17564. }
  17565. sPrivateTableID.jgrDate[sPrivateTableID.Num].roomType = pClubHostInfoAck->UserSitDownData.data.tableType;
  17566. memset(sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6, 0, 3*sizeof(int));
  17567. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp6[0] = pClubHostInfoAck->UserSitDownData.data.clubID;
  17568. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp5 = pClubHostInfoAck->UserSitDownData.cbAuto;
  17569. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp4 = pClubHostInfoAck->UserSitDownData.cbWanFa; //新加一个用来表示同一个俱乐部不同玩法
  17570. //头像
  17571. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szHeadUrl),TargetHeadUrl);
  17572. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwUserID = TargetID;
  17573. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwServerID = m_pGameServiceOption->wServerID;
  17574. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwRoomNumber = _ttol(str.c_str());
  17575. if (pTableFrame->GetStartMode() == START_MODE_ALL_READY)
  17576. {
  17577. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = 2;
  17578. }
  17579. else
  17580. {
  17581. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwBody = pTableFrame->GetChairCount();
  17582. }
  17583. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwDiFen = pConfig->wPlayRule;
  17584. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwJuShu = pConfig->wPlayCountRule;
  17585. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwReadyBody = 0;
  17586. sPrivateTableID.jgrDate[sPrivateTableID.Num].bWanFa = pConfig->wSubGameID;
  17587. sPrivateTableID.jgrDate[sPrivateTableID.Num].bDuoLai = pConfig->bDuoLai; //多癞子可平胡,0可以 1不可以
  17588. sPrivateTableID.jgrDate[sPrivateTableID.Num].wFengDing = pConfig->wFengDing; //封顶值
  17589. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp1 = pConfig->tmp1; //备用字段(纠正)
  17590. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp2 = pConfig->tmp2; //备用字段
  17591. sPrivateTableID.jgrDate[sPrivateTableID.Num].tmp3 = pConfig->tmp3;
  17592. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szName), TargetName);
  17593. sPrivateTableID.jgrDate[sPrivateTableID.Num].bFanGua = pConfig->wMaxScore;
  17594. sPrivateTableID.jgrDate[sPrivateTableID.Num].bRoomCreatePay = pConfig->wMaxFanRule;
  17595. sPrivateTableID.jgrDate[sPrivateTableID.Num].dwInsert_UpData_Del = 0;
  17596. CGameServerItem * pCGameServerItem = m_ServerListManager.SearchGameServer(m_pGameServiceOption->wServerID);
  17597. if (pCGameServerItem)
  17598. {
  17599. //非自动创房通过玩家设置IP
  17600. if (pClubHostInfoAck->UserSitDownData.cbAuto == 0)
  17601. {
  17602. int iPaiMing = 0; int iCountMax = 1;
  17603. GetPaiMing(pIServerUserItem->GetUserID(), pIServerUserItem->GetUserInfo()->llJuLi, iPaiMing, iCountMax);
  17604. std::wstring ip = pCGameServerItem->GetRandom(pIServerUserItem->GetUserID(), iPaiMing, iCountMax);
  17605. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), ip.c_str());
  17606. }
  17607. else
  17608. {
  17609. //设置本地址IP
  17610. StringCchCopy(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp, _countof(sPrivateTableID.jgrDate[sPrivateTableID.Num].szIp), pCGameServerItem->m_GameServer.szServerAddr);
  17611. }
  17612. sPrivateTableID.jgrDate[sPrivateTableID.Num].wPort = pCGameServerItem->m_GameServer.wServerPort;
  17613. }
  17614. //同步到中心服务器
  17615. JN_GR_RoomListBig UserChat = sPrivateTableID.jgrDate[sPrivateTableID.Num];
  17616. UpdataBodyOwnRoomToServer(&UserChat, sizeof(UserChat));
  17617. sPrivateTableID.Num++;
  17618. m_UserID_2_PriTableIDGROUP[TargetID] = sPrivateTableID;
  17619. ///[+++支付修正下,根据玩法人数扣(修改3人玩法的BUG)2018-1-11
  17620. WORD wChairCount = pTableFrame->GetChairCount();
  17621. WORD wReduceBeans = 0;
  17622. if (pConfig->wMaxFanRule == 0 || pConfig->wMaxFanRule >= 10)
  17623. {
  17624. wReduceBeans = pClubHostInfoAck->UserSitDownData.ReduceBeans / wChairCount * wChairCount;
  17625. //强制转换对于特定2人
  17626. if (pTableFrame->GetStartMode() == START_MODE_ALL_READY)
  17627. {
  17628. wReduceBeans = 2 * (pConfig->wPlayCountRule / 8);
  17629. }
  17630. }
  17631. else
  17632. {
  17633. wReduceBeans = pClubHostInfoAck->UserSitDownData.ReduceBeans;
  17634. }
  17635. if (1 == pClubHostInfoAck->UserSitDownData.cbAuto || pConfigTemp->wMaxFanRule >= 10)//不是群主创房且不是自动创房 不进行下去,直接返回
  17636. {
  17637. //UserInfo->dwBean = UserInfo->dwBean - wReduceBeans;
  17638. //锁定元宝
  17639. pTableFrame->LockBeans(pClubHostInfoAck->UserSitDownData.hostInfo.dwOwnerID, wReduceBeans);
  17640. }
  17641. else if (pIServerUserItem)
  17642. {
  17643. pIServerUserItem->GetUserInfo()->dwBean = pIServerUserItem->GetUserInfo()->dwBean - wReduceBeans;
  17644. //锁定元宝
  17645. pTableFrame->LockBeans(pIServerUserItem->GetUserID(), wReduceBeans);
  17646. }
  17647. //加入旁观
  17648. if (pClubHostInfoAck->UserSitDownData .cbAuto == 0 && pTableFrame->PerformLookonAction(pIServerUserItem))
  17649. {
  17650. //房间创建30中后没人玩就解散(方便后台切换服务器)
  17651. pTableFrame->OnTCPNetworkSubUserCreateRoom(pIServerUserItem);
  17652. m_Data.dCreateTable++;
  17653. //进入房间旁观
  17654. CMD_GR_UserSitDownAckEx req;
  17655. TCHAR szTempTemp[32] = { 0 };
  17656. if (pTableFrame) pTableFrame->GetPrivateTableID(szTempTemp, 32);
  17657. lstrcpy(req.szPrivateTableID, szTempTemp);
  17658. req.cbRet = 0;
  17659. req.dijin = pConfig->wPlayRule;
  17660. req.paytype = pConfig->wMaxFanRule;
  17661. req.desktype = pTableFrame->GetTableKind();// pConfig->wSubGameID;
  17662. req.playtype = pConfig->wSubGameID;
  17663. req.totalplay = pConfig->wPlayCountRule;
  17664. req.bDuoLai = pConfig->bDuoLai;
  17665. req.wFengDing = pConfig->wFengDing;
  17666. req.ipLimit = pConfig->wMaxScore;
  17667. req.playnum = pConfig->tmp1;
  17668. req.tmp3 = pConfig->tmp2;
  17669. req.isowner = 1;
  17670. req.roomId = pTableFrame->GetTableID();
  17671. UserInfo::PB_CS_S_UserSitDownAck SitDownAck;
  17672. std::string szPrivateTableID = CW2AEX<1024>(req.szPrivateTableID, CP_UTF8).m_psz;
  17673. SitDownAck.set_szprivatetableid(szPrivateTableID);
  17674. SitDownAck.set_cbret(req.cbRet);
  17675. SitDownAck.set_dijin(req.dijin);
  17676. SitDownAck.set_paytype(req.paytype);
  17677. SitDownAck.set_desktype(req.desktype);
  17678. SitDownAck.set_playtype(req.playtype);
  17679. SitDownAck.set_totalplay(req.totalplay);
  17680. SitDownAck.set_bduolai(req.bDuoLai);
  17681. SitDownAck.set_wfengding(req.wFengDing);
  17682. SitDownAck.set_iplimit(req.ipLimit);
  17683. SitDownAck.set_playnum(req.playnum);
  17684. SitDownAck.set_tmp3(req.tmp3);
  17685. SitDownAck.set_isowner(req.isowner);
  17686. SitDownAck.set_roomid(req.roomId);
  17687. //发送数据
  17688. std::string pbdata = SitDownAck.SerializePartialAsString();
  17689. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_ADDCREATE_TABLE_ID, (void*)pbdata.c_str(), pbdata.length());
  17690. //用户状态
  17691. pIServerUserItem->SetClientReady(true);
  17692. pIServerUserItem->SetUserStatus(US_LOOKON, pTableFrame->GetTableID(), INVALID_CHAIR);
  17693. }
  17694. //俱乐部创建房间广播
  17695. if (pClubHostInfoAck->UserSitDownData.data.tableType == 1 && pClubHostInfoAck->UserSitDownData.data.clubID != 0)
  17696. {
  17697. CMD_GR_UserData UserData;
  17698. ZeroMemory(&UserData, sizeof(UserData));
  17699. UserData.dwClubID = pClubHostInfoAck->UserSitDownData.data.clubID;
  17700. UserData.newsFlag = 2;
  17701. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_NotifyUser, 0, &(UserData), sizeof(CMD_GR_UserData));
  17702. }
  17703. return true;
  17704. }
  17705. //俱乐部打样应答
  17706. bool CAttemperEngineSink::OnDBGetClubSample(DWORD dwContextID, VOID * pData, WORD wDataSize){
  17707. //获取用户
  17708. WORD wBindIndex = LOWORD(dwContextID);
  17709. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17710. //用户效验
  17711. ASSERT(pIServerUserItem != NULL);
  17712. if (pIServerUserItem == NULL)
  17713. {
  17714. return false;
  17715. }
  17716. CMD_GR_Club_Make_A_Sample * pSample = (CMD_GR_Club_Make_A_Sample *)pData;
  17717. if (pSample == NULL) return false;
  17718. Club::PB_CS_Club_Make_A_Sample MakeSample;
  17719. MakeSample.set_dwclubid(pSample->dwClubID);
  17720. MakeSample.set_issample(pSample->IsSample);
  17721. //发送数据
  17722. std::string pbdata = MakeSample.SerializePartialAsString();
  17723. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_CLUB, SUB_GR_CLUB_GET_MAKEA_SAMPLE_ACK, (void*)pbdata.c_str(), pbdata.length());
  17724. if (pSample->IsSample == 1 && pSample->dwClubID)
  17725. {
  17726. std::vector<JN_GR_RoomListBig> ve;
  17727. JN_GR_RoomListBig Rooms;
  17728. ve.clear();
  17729. //全局查找
  17730. {
  17731. CWHDataLocker DataLocker(m_CriticalSection);
  17732. std::unordered_map<DWORD, JN_GR_RoomListBig>::iterator it2 = m_PrivateRoomAll.begin();
  17733. while (it2 != m_PrivateRoomAll.end())
  17734. {
  17735. ZeroMemory(&Rooms, sizeof(JN_GR_RoomListBig));
  17736. Rooms = it2->second;
  17737. if (Rooms.roomType == 1 && Rooms.tmp6[0] == pSample->dwClubID)
  17738. {
  17739. ve.push_back(Rooms);
  17740. }
  17741. it2++;
  17742. }
  17743. }
  17744. std::sort(ve.begin(), ve.end(), LessSort);//升序
  17745. std::vector<JN_GR_RoomListBig>::iterator iter;
  17746. //等待中
  17747. for (iter = ve.begin(); iter != ve.end(); iter++)
  17748. {
  17749. if (iter->roomStatus == 0)
  17750. {
  17751. DWORD dwRoomID = iter->dwRoomNumber;
  17752. m_pITCPSocketService->SendData(MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, &dwRoomID, sizeof(DWORD));
  17753. }
  17754. }
  17755. }
  17756. return true;
  17757. }
  17758. ///+++是否为金币场服务器
  17759. //bool CAttemperEngineSink::isVenueServer()
  17760. //{
  17761. // if (m_pGameServiceOption != NULL && GAME_GENRE_SCORE == m_pGameServiceOption->wServerType)
  17762. // {
  17763. // return true;
  17764. // }
  17765. // return false;
  17766. //}
  17767. //统计该场的总人数
  17768. //DWORD CAttemperEngineSink::SumOnlineCount(WORD wVenueID)
  17769. //{
  17770. // //--不是金币场的服务器,就不用汇总了
  17771. // if (wVenueID <= 0)
  17772. // {
  17773. // return 0;
  17774. // }
  17775. //
  17776. // DWORD dwSum = 0;
  17777. // //枚举数据
  17778. // POSITION Position = NULL;
  17779. // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  17780. // {
  17781. // //获取数据
  17782. // CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  17783. // if (pGameServerItem != NULL && pGameServerItem->m_GameServer.wNodeID == wVenueID)
  17784. // {
  17785. // dwSum += pGameServerItem->m_GameServer.dwOnLineCount;
  17786. // }
  17787. // }
  17788. //
  17789. // for (std::vector<tagVenueInfo>::iterator it = m_vecVenueInfo.begin(); it != m_vecVenueInfo.end(); it++)
  17790. // {
  17791. // tagVenueInfo& venue = *it;
  17792. // if (venue.wVenueID == wVenueID)
  17793. // {
  17794. //#ifdef DEBUG
  17795. // //CString strOnline;
  17796. // //strOnline.Format(L"场馆人数wVenueID=%d dwSum =%d", wVenueID, dwSum);
  17797. // //CTraceService::TraceString(strOnline, TraceLevel_Normal);
  17798. //#endif // DEBUG
  17799. //
  17800. // venue.dwOnlineCount = dwSum;
  17801. // break;;
  17802. // }
  17803. // }
  17804. // return dwSum;
  17805. //}
  17806. //
  17807. /////能否领取救济
  17808. //bool CAttemperEngineSink::CanGetRelief(IServerUserItem* pIServerUserItem, WORD venueID)
  17809. //{
  17810. // if (pIServerUserItem != NULL && m_vecVenueInfo.size() > 0)
  17811. // {
  17812. // ///---救济领取信息(10秒内有效)
  17813. // tagUserInfo* pUser = pIServerUserItem->GetUserInfo();
  17814. // if (pUser != NULL)
  17815. // {
  17816. // if ((GetTickCount() - pUser->dwUpdateReliefLeftCount < 10 * 1000)
  17817. // && pUser->wReliefLeftCount <= 0)
  17818. // {
  17819. // return false;
  17820. // }
  17821. // }
  17822. //
  17823. // const tagVenueInfo & venue = m_vecVenueInfo[0];
  17824. // if ((0 == venueID || venue.wVenueID == venueID) && pIServerUserItem->GetUserScore() < venue.sMinScore)
  17825. // {
  17826. // return true;
  17827. // }
  17828. // }
  17829. // return false;
  17830. //}
  17831. //
  17832. //---拉取好友房服务器
  17833. //bool CAttemperEngineSink::OnTCPNetworkPrivateGameSvr(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  17834. //{
  17835. // //获取用户
  17836. // WORD wBindIndex = LOWORD(dwSocketID);
  17837. // IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17838. //
  17839. // //用户效验
  17840. // ASSERT(pIServerUserItem != NULL);
  17841. // if (pIServerUserItem == NULL)
  17842. // {
  17843. // return false;
  17844. // }
  17845. //
  17846. // tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  17847. //
  17848. // int iXinYong = pUserInfo->iXinYong; //用户信用等级
  17849. //
  17850. // //过滤不符合条件的服务器
  17851. // std::vector<CGameServerItem*> gameSvrItemVec;
  17852. //
  17853. // POSITION Position = NULL;
  17854. // CGameServerItem * pGameServerItem = NULL;
  17855. // for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  17856. // {
  17857. // pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  17858. //
  17859. // ///去掉金币服务器
  17860. // if (pGameServerItem == NULL || pGameServerItem->m_GameServer.wNodeID > 0)
  17861. // {
  17862. // continue;
  17863. // }
  17864. //
  17865. // //不提供服务
  17866. // if (pGameServerItem->m_GameServer.bService < 1)
  17867. // {
  17868. // continue;
  17869. // }
  17870. //
  17871. // //人员已满
  17872. // if (pGameServerItem->m_GameServer.dwOnLineCount >= pGameServerItem->m_GameServer.dwFullCount)
  17873. // {
  17874. // continue;
  17875. // }
  17876. //
  17877. // //玩家级别
  17878. // if (pGameServerItem->m_GameServer.wServerLevel > iXinYong && gameSvrItemVec.size() > 1/*总得返回一个用吧*/)
  17879. // {
  17880. // continue;
  17881. // }
  17882. //
  17883. // gameSvrItemVec.push_back(pGameServerItem);
  17884. // }
  17885. //
  17886. // //找人数少的服务器
  17887. // std::sort(gameSvrItemVec.begin(), gameSvrItemVec.end(), SortByLineCountFunc());
  17888. // tagPrivateGameServer privateGameSvr;
  17889. // //发送数据
  17890. // std::string pbdata = "";
  17891. // if (gameSvrItemVec.size() > 0)
  17892. // {
  17893. // //优先从人数少的随机选
  17894. // int randIndex = gameSvrItemVec.size() >= 4 ? rand() % (gameSvrItemVec.size() / 2) : rand() % gameSvrItemVec.size();
  17895. //
  17896. // CGameServerItem* pGameSvr = gameSvrItemVec[randIndex];
  17897. //
  17898. // privateGameSvr.wKindID = pGameSvr->m_GameServer.wKindID; //名称索引
  17899. // privateGameSvr.wNodeID = pGameSvr->m_GameServer.wNodeID; //节点索引
  17900. // privateGameSvr.wSortID = pGameSvr->m_GameServer.wSortID; //排序索引
  17901. // privateGameSvr.wServerID = pGameSvr->m_GameServer.wServerID; //房间索引
  17902. // privateGameSvr.wServerKind = pGameSvr->m_GameServer.wServerKind; //房间类型
  17903. // privateGameSvr.wServerType = pGameSvr->m_GameServer.wServerType; //房间类型
  17904. // privateGameSvr.wServerPort = pGameSvr->m_GameServer.wServerPort; //房间端口
  17905. // lstrcpyn(privateGameSvr.szServerAddr, pGameSvr->m_GameServer.szServerAddr, CountArray(privateGameSvr.szServerAddr));
  17906. // //StringCbCat(privateGameSvr.szServerAddr, 32, pGameSvr->m_GameServer.szServerAddr); //房间地址
  17907. // CString strHint;
  17908. // strHint.Format(L"%d, %d, %d, %d, %d, %d, %d, %s",
  17909. // privateGameSvr.wKindID,
  17910. // privateGameSvr.wNodeID,
  17911. // privateGameSvr.wSortID,
  17912. // privateGameSvr.wServerID,
  17913. // privateGameSvr.wServerKind,
  17914. // privateGameSvr.wServerType,
  17915. // privateGameSvr.wServerPort,
  17916. // privateGameSvr.szServerAddr);
  17917. // TRACE(L"svr=%s", strHint);
  17918. //
  17919. // UserInfo::PB_CS_S_tagPrivateGameServer GameServer;
  17920. // GameServer.set_wkindid(pGameSvr->m_GameServer.wKindID);
  17921. // GameServer.set_wnodeid(pGameSvr->m_GameServer.wNodeID);
  17922. // GameServer.set_wsortid(pGameSvr->m_GameServer.wSortID);
  17923. // GameServer.set_wserverid(pGameSvr->m_GameServer.wServerID);
  17924. // GameServer.set_wserverkind(pGameSvr->m_GameServer.wServerKind);
  17925. // GameServer.set_wservertype(pGameSvr->m_GameServer.wServerType);
  17926. // GameServer.set_wserverport(pGameSvr->m_GameServer.wServerPort);
  17927. // std::string szServerAddr = CW2AEX<1024>(pGameSvr->m_GameServer.szServerAddr, CP_UTF8).m_psz;
  17928. // GameServer.set_szserveraddr(szServerAddr);
  17929. // pbdata = GameServer.SerializePartialAsString();
  17930. // }
  17931. //
  17932. // m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_USER, SUB_GR_USER_PRIVATE_GAME_SVR_ACK, (void*)pbdata.c_str(), pbdata.length());
  17933. //
  17934. //
  17935. // return true;
  17936. //
  17937. //}
  17938. //玩家自主解绑代理
  17939. bool CAttemperEngineSink::OnTCPNetworkSubUserUntieAgent(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  17940. {
  17941. //获取用户
  17942. WORD wBindIndex = LOWORD(dwSocketID);
  17943. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17944. if (pIServerUserItem == NULL) return false;
  17945. DWORD dUserID = pIServerUserItem->GetUserID();
  17946. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_ZUANSHI_INFO, dwSocketID, &dUserID, sizeof(DWORD));
  17947. return true;
  17948. }
  17949. ///用户获得代理解绑相关信息
  17950. BOOL CAttemperEngineSink::OnDBUserUntieAgent(DWORD dwContextID, VOID * pData, WORD wDataSize)
  17951. {
  17952. //效验参数
  17953. ASSERT(wDataSize == sizeof(DBR_GR_GetUntieAgentInfo));
  17954. if (wDataSize != sizeof(DBR_GR_GetUntieAgentInfo))
  17955. {
  17956. return FALSE;
  17957. }
  17958. //获取用户
  17959. WORD wBindIndex = LOWORD(dwContextID);
  17960. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17961. if (pIServerUserItem == NULL) return false;
  17962. DBR_GR_GetUntieAgentInfo * pGetUntieAgentInfo = (DBR_GR_GetUntieAgentInfo *)pData;
  17963. GETDUILIEBASE Temp;
  17964. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  17965. StringCchCat(Temp.szUnionID, 32, pIServerUserItem->GetUserInfo()->szUnionID);
  17966. Temp.dUserID = pIServerUserItem->GetUserInfo()->dwUserID;
  17967. _sntprintf(Temp.bb.szName, 32, TEXT("%d"), pIServerUserItem->GetUserInfo()->dDaiLi);
  17968. _sntprintf(Temp.bb.szImgHead, 256, TEXT("%d"), pGetUntieAgentInfo->cbCost);
  17969. //StringCchCat(Temp.szUnionID, 32, L"10043");
  17970. //Temp.dUserID = 101088;
  17971. Temp.CommendID = 10; //玩家自主解绑代理(只作透传)
  17972. Temp.dwSocketID = dwContextID;
  17973. CHttpClient::AddLog(dwContextID, Temp);
  17974. return true;
  17975. }
  17976. //用户获得代理解绑相关信息
  17977. bool CAttemperEngineSink::OnTCPNetworkSubUserAgentInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  17978. {
  17979. //ASSERT(wDataSize == sizeof(BYTE));
  17980. //if (wDataSize != sizeof(BYTE))
  17981. //{
  17982. // return false;
  17983. //}
  17984. //获取用户
  17985. WORD wBindIndex = LOWORD(dwSocketID);
  17986. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  17987. if (pIServerUserItem == NULL) return false;
  17988. DWORD dUserID = pIServerUserItem->GetUserID();
  17989. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_UNTIE_AGENT_INFO, dwSocketID, &dUserID, sizeof(DWORD));
  17990. return true;
  17991. }
  17992. ///用户获得代理解绑相关信息
  17993. BOOL CAttemperEngineSink::OnDBUserAgentInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  17994. {
  17995. //效验参数
  17996. ASSERT(wDataSize == sizeof(DBR_GR_GetUntieAgentInfo));
  17997. if (wDataSize != sizeof(DBR_GR_GetUntieAgentInfo))
  17998. {
  17999. return FALSE;
  18000. }
  18001. //获取用户
  18002. WORD wBindIndex = LOWORD(dwContextID);
  18003. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18004. //用户效验
  18005. ASSERT(pIServerUserItem != NULL);
  18006. if (pIServerUserItem == NULL)
  18007. {
  18008. return false;
  18009. }
  18010. DBR_GR_GetUntieAgentInfo * pGetUntieAgentInfo = (DBR_GR_GetUntieAgentInfo *)pData;
  18011. pGetUntieAgentInfo->dwDaiLiID = pIServerUserItem->GetUserInfo()->dDaiLi;
  18012. UserInfo::PB_CS_S_GetUntieAgentInfo AgentInfo;
  18013. AgentInfo.set_cbcost(pGetUntieAgentInfo->cbCost);
  18014. AgentInfo.set_cbdays(pGetUntieAgentInfo->cbDays);
  18015. AgentInfo.set_dwcurrency(pGetUntieAgentInfo->dwCurrency);
  18016. AgentInfo.set_dwdailiid(pGetUntieAgentInfo->dwDaiLiID);
  18017. //发送数据
  18018. std::string pbdata = AgentInfo.SerializePartialAsString();
  18019. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_GET_UNTIE_AGENT_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  18020. return true;
  18021. }
  18022. ///---福利领取信息
  18023. bool CAttemperEngineSink::OnTCPNetworkWelfareInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18024. {
  18025. CString strHint;
  18026. strHint.Format(L"Fun=%hs", __FUNCTION__);
  18027. CTraceService::TraceString(strHint, TraceLevel_Debug);
  18028. //获取用户
  18029. WORD wBindIndex = LOWORD(dwSocketID);
  18030. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18031. //用户效验
  18032. ASSERT(pIServerUserItem != NULL);
  18033. if (pIServerUserItem == NULL)
  18034. {
  18035. return false;
  18036. }
  18037. DWORD dUserID = pIServerUserItem->GetUserID();
  18038. //投递请求
  18039. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_WELFARE_INFO, dwSocketID, &dUserID, sizeof(dUserID));
  18040. return true;
  18041. }
  18042. //查询福利信息应答
  18043. BOOL CAttemperEngineSink::OnDBWelfareInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18044. {
  18045. //效验参数
  18046. ASSERT(wDataSize == sizeof(tagWelfareInfo) * 3);
  18047. if (wDataSize != sizeof(tagWelfareInfo) * 3)
  18048. {
  18049. return FALSE;
  18050. }
  18051. tagWelfareInfo * pWelfareInfo = (tagWelfareInfo*)pData;
  18052. tagWelfareInfo welfareInfArr[3];
  18053. memcpy(welfareInfArr, pWelfareInfo, sizeof(tagWelfareInfo) * 3);
  18054. //获取用户
  18055. WORD wBindIndex = LOWORD(dwContextID);
  18056. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18057. //用户效验
  18058. ASSERT(pIServerUserItem != NULL);
  18059. if (pIServerUserItem == NULL)
  18060. {
  18061. return false;
  18062. }
  18063. UserInfo::PB_CS_S_tagWelfareInfo WelfareInfo;
  18064. for (WORD i = 0; i < 3; i++)
  18065. {
  18066. UserInfo::pb_tagWelfareInfo *tagWelfareInfo = WelfareInfo.add_welfareinfo();
  18067. tagWelfareInfo->set_btwelfaretype(welfareInfArr[i].btWelfareType);
  18068. tagWelfareInfo->set_bttakednum(welfareInfArr[i].btTakedNum);
  18069. tagWelfareInfo->set_bttotalnum(welfareInfArr[i].btTotalNum);
  18070. tagWelfareInfo->set_btvalidflag(welfareInfArr[i].btValidFlag);
  18071. }
  18072. //发送数据
  18073. std::string pbdata = WelfareInfo.SerializePartialAsString();
  18074. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_WELFARE_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  18075. return true;
  18076. }
  18077. ///+++大转盘命令
  18078. bool CAttemperEngineSink::OnTCPNetworkMainRoulette(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18079. {
  18080. switch (wSubCmdID)
  18081. {
  18082. case SUB_GF_ROULETEE_CONFIG: ///奖品配置+"我"的配置信息
  18083. {
  18084. return OnTCPNetworkMyRouletteConfig(pData, wDataSize, dwSocketID);
  18085. }
  18086. case SUB_GF_ROULETEE_LOTTERY: ///转盘抽奖
  18087. {
  18088. return OnTCPNetworkRouletteLottery(pData, wDataSize, dwSocketID);
  18089. }
  18090. case SUB_GF_LOTTERY_INFO: ///查询抽奖信息
  18091. {
  18092. return OnTCPNetworkLotteryInfo(pData, wDataSize, dwSocketID);
  18093. }
  18094. case SUB_GF_LOTTERY_HIS: ///查询抽奖历史记录
  18095. {
  18096. return OnTCPNetworkLotteryHis(pData, wDataSize, dwSocketID);
  18097. }
  18098. case SUB_GF_LOTTERY_AWARD: //手动领奖
  18099. {
  18100. return OnTCPNetworkLotteryAward(pData, wDataSize, dwSocketID);
  18101. }
  18102. case SUB_GF_LOTTERY_ADDRESS: //注册收件信息
  18103. {
  18104. return OnTCPNetworkLotteryAddress(pData, wDataSize, dwSocketID);
  18105. }
  18106. default: break;
  18107. }
  18108. return false;
  18109. }
  18110. ///拉取转盘奖品配置(返回我的转盘相关信息)
  18111. bool CAttemperEngineSink::OnTCPNetworkMyRouletteConfig(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18112. {
  18113. CString strHint;
  18114. strHint.Format(L"Fun=%hs", __FUNCTION__);
  18115. CTraceService::TraceString(strHint, TraceLevel_Debug);
  18116. //获取用户
  18117. WORD wBindIndex = LOWORD(dwSocketID);
  18118. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18119. //用户效验
  18120. ASSERT(pIServerUserItem != NULL);
  18121. if (pIServerUserItem == NULL)
  18122. {
  18123. ASSERT(FALSE);
  18124. return false;
  18125. }
  18126. DWORD dUserID = pIServerUserItem->GetUserID();
  18127. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_MY_ROULETTE_INFO, dwSocketID, &dUserID, sizeof(dUserID));
  18128. return true;
  18129. }
  18130. ///+++DB返回转盘奖品配置结果
  18131. BOOL CAttemperEngineSink::OnDBRouletteConfig(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18132. {
  18133. //效验参数
  18134. ASSERT(wDataSize % sizeof(tagRouletteConfig) == 0);
  18135. if (wDataSize % sizeof(tagRouletteConfig) != 0)
  18136. {
  18137. return FALSE;
  18138. }
  18139. ///---清除以前的数据
  18140. if (wDataSize > 0)
  18141. {
  18142. m_vecRouletteConfig.clear();
  18143. }
  18144. //变量定义
  18145. WORD wItemCount = wDataSize / sizeof(tagRouletteConfig);
  18146. tagRouletteConfig * pRouletteConfig = (tagRouletteConfig *)pData;
  18147. for (WORD i = 0; i < wItemCount; i++)
  18148. {
  18149. tagRouletteConfig rouletteConfig(*pRouletteConfig);
  18150. //插入列表
  18151. m_vecRouletteConfig.push_back(rouletteConfig);
  18152. pRouletteConfig++;
  18153. }
  18154. ///--第二步、执行抽奖
  18155. WORD wLotteryType = 0;
  18156. _DoRouletteLottery(&wLotteryType, sizeof(wLotteryType), dwContextID);
  18157. return true;
  18158. }
  18159. ///++中奖历史
  18160. BOOL CAttemperEngineSink::OnDBLotteryHis(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18161. {
  18162. //效验参数
  18163. ASSERT(wDataSize % sizeof(tagLotteryHis) == 0);
  18164. if (wDataSize % sizeof(tagLotteryHis) != 0)
  18165. {
  18166. return FALSE;
  18167. }
  18168. //获取用户
  18169. WORD wBindIndex = LOWORD(dwContextID);
  18170. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18171. //用户效验
  18172. ASSERT(pIServerUserItem != NULL);
  18173. if (pIServerUserItem == NULL)
  18174. {
  18175. return false;
  18176. }
  18177. tagLotteryHisACK * pLotteryHis = (tagLotteryHisACK*)pData;
  18178. TurntableLogon::PB_CS_S_tagLotteryHisACK LotteryHis;
  18179. for (int i = 0; i < 30; i++)
  18180. {
  18181. if (pLotteryHis->LotteryHis[i].dwUserID == 0)continue;
  18182. TurntableLogon::PB_CS_S_tagLotteryHis *tagLottery = LotteryHis.add_lotteryhis();
  18183. tagLottery->set_dwuserid(pLotteryHis->LotteryHis[i].dwUserID);
  18184. std::string szUserName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szUserName, CP_UTF8).m_psz;
  18185. std::string szLotteryName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szLotteryName, CP_UTF8).m_psz;
  18186. std::string szInputeDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szInputeDate, CP_UTF8).m_psz;
  18187. std::string szGetLotteryDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szGetLotteryDate, CP_UTF8).m_psz;
  18188. tagLottery->set_szusername(szUserName);
  18189. tagLottery->set_wlotterytype(pLotteryHis->LotteryHis[i].wLotteryType);
  18190. tagLottery->set_wrouletteid(pLotteryHis->LotteryHis[i].wRouletteID);
  18191. tagLottery->set_szlotteryname(szLotteryName);
  18192. tagLottery->set_szgetlotterydate(szInputeDate);
  18193. tagLottery->set_szgetlotterydate(szGetLotteryDate);
  18194. tagLottery->set_btgetlotteryflag(pLotteryHis->LotteryHis[i].btGetLotteryFlag);
  18195. }
  18196. //发送数据
  18197. std::string pbdata = LotteryHis.SerializePartialAsString();
  18198. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_HIS_ACK, (void*)pbdata.c_str(), pbdata.length());
  18199. return true;
  18200. }
  18201. BOOL CAttemperEngineSink::OnDBLotteryHisEx(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18202. {
  18203. //效验参数
  18204. ASSERT(wDataSize % sizeof(tagLotteryHisEx) == 0);
  18205. if (wDataSize % sizeof(tagLotteryHisEx) != 0)
  18206. {
  18207. return FALSE;
  18208. }
  18209. //获取用户
  18210. WORD wBindIndex = LOWORD(dwContextID);
  18211. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18212. //用户效验
  18213. ASSERT(pIServerUserItem != NULL);
  18214. if (pIServerUserItem == NULL)
  18215. {
  18216. return false;
  18217. }
  18218. tagLotteryHisExACK* pLotteryHis = (tagLotteryHisExACK*)pData;
  18219. TurntableLogon::PB_CS_S_tagLotteryHisExACK LotteryHis;
  18220. for (int i = 0; i < 6; i++)
  18221. {
  18222. if (pLotteryHis->LotteryHis[i].dwRecordID == 0)continue;
  18223. TurntableLogon::PB_CS_S_tagLotteryHisEx* tagLottery = LotteryHis.add_lotteryhisex();
  18224. tagLottery->set_dwrecordid(pLotteryHis->LotteryHis[i].dwRecordID);
  18225. tagLottery->set_wrouletteid(pLotteryHis->LotteryHis[i].wRouletteID);
  18226. std::string szLotteryName = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szLotteryName, CP_UTF8).m_psz;
  18227. std::string szInputeDate = CW2AEX<1024>(pLotteryHis->LotteryHis[i].szInputeDate, CP_UTF8).m_psz;
  18228. tagLottery->set_szlotteryname(szLotteryName);
  18229. tagLottery->set_szinputedate(szInputeDate);
  18230. tagLottery->set_btgetlotteryflag(pLotteryHis->LotteryHis[i].btGetLotteryFlag);
  18231. }
  18232. //发送数据
  18233. std::string pbdata = LotteryHis.SerializePartialAsString();
  18234. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_HIS_ACKEX, (void*)pbdata.c_str(), pbdata.length());
  18235. return true;
  18236. }
  18237. ///+++DB返回转盘奖品配置结果
  18238. BOOL CAttemperEngineSink::OnDBMyRouletteInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18239. {
  18240. //效验参数
  18241. ASSERT(wDataSize == sizeof(tagRouletteConfig2));
  18242. if (wDataSize != sizeof(tagRouletteConfig2))
  18243. {
  18244. return FALSE;
  18245. }
  18246. //--查看用
  18247. tagRouletteConfig2 rouletteConfig2;
  18248. memcpy(&rouletteConfig2, pData, wDataSize);
  18249. //获取用户
  18250. WORD wBindIndex = LOWORD(dwContextID);
  18251. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18252. //用户效验
  18253. ASSERT(pIServerUserItem != NULL);
  18254. if (pIServerUserItem == NULL)
  18255. {
  18256. return false;
  18257. }
  18258. TurntableLogon::PB_CS_S_tagRouletteConfig2 RouletteConfig;
  18259. RouletteConfig.set_wresult(rouletteConfig2.wResult);
  18260. std::string szDesc = CW2AEX<1024>(rouletteConfig2.szDesc, CP_UTF8).m_psz;
  18261. std::string szICON = CW2AEX<1024>(rouletteConfig2.szICON, CP_UTF8).m_psz;
  18262. std::string szLotteryRule = CW2AEX<1024>(rouletteConfig2.szLotteryRule, CP_UTF8).m_psz;
  18263. RouletteConfig.set_szdesc(szDesc);
  18264. RouletteConfig.set_wid(rouletteConfig2.wID);
  18265. RouletteConfig.set_szicon(szICON);
  18266. RouletteConfig.set_whadlotterycount(rouletteConfig2.wHadLotteryCount);
  18267. RouletteConfig.set_wlotterycountpara(rouletteConfig2.wLotteryCountPara);
  18268. RouletteConfig.set_wlotterylimit(rouletteConfig2.wLotteryLimit);
  18269. RouletteConfig.set_winningvalue(rouletteConfig2.wInningValue);
  18270. RouletteConfig.set_wrechargevalue(rouletteConfig2.wRechargeValue);
  18271. for (WORD i = 0; i < 3; i++)
  18272. {
  18273. RouletteConfig.add_winninginfo(rouletteConfig2.wInningInfo[i]);
  18274. }
  18275. RouletteConfig.set_cbrechargeinfo(rouletteConfig2.cbRechargeInfo);
  18276. RouletteConfig.set_szlotteryrule(szLotteryRule);
  18277. //发送数据
  18278. std::string pbdata = RouletteConfig.SerializePartialAsString();
  18279. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_ROULETEE_CONFIG_ACK, (void*)pbdata.c_str(), pbdata.length());
  18280. return true;
  18281. }
  18282. ///+++转盘抽奖
  18283. bool CAttemperEngineSink::OnTCPNetworkRouletteLottery(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18284. {
  18285. ///---第一步 拉取轮盘奖品的配置
  18286. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_GET_ROULETTE_CONFIG, dwSocketID, pData, wDataSize);
  18287. return true;
  18288. }
  18289. /// 转盘抽奖
  18290. bool CAttemperEngineSink::_DoRouletteLottery(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18291. {
  18292. ASSERT(wDataSize == sizeof(WORD));
  18293. if (wDataSize != sizeof(WORD))
  18294. {
  18295. return false;
  18296. }
  18297. WORD wLotteryType = *((WORD *)pData);
  18298. ASSERT(0 == wLotteryType || 1 == wLotteryType);
  18299. //判断有没有配置奖品
  18300. ASSERT(m_vecRouletteConfig.size() > 0);
  18301. if (m_vecRouletteConfig.size() <= 0)
  18302. {
  18303. CTraceService::TraceString(L"转盘奖品配置为空(表Roulette)", TraceLevel_Warning);
  18304. return true;
  18305. }
  18306. //获取用户
  18307. WORD wBindIndex = LOWORD(dwSocketID);
  18308. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18309. //用户效验
  18310. ASSERT(pIServerUserItem != NULL);
  18311. if (pIServerUserItem == NULL)
  18312. {
  18313. return false;
  18314. }
  18315. //概率总和
  18316. DWORD dwOddSum = 0;
  18317. std::vector<tagRouletteConfig>::iterator it;
  18318. for (it = m_vecRouletteConfig.begin(); it != m_vecRouletteConfig.end(); it++)
  18319. {
  18320. tagRouletteConfig roulette = *it;
  18321. ///---过滤掉个数为0的奖品
  18322. if (roulette.iQuantity <= 0)
  18323. {
  18324. continue;
  18325. }
  18326. dwOddSum += roulette.wOdds;
  18327. }
  18328. srand(GetTickCount());
  18329. DWORD dwRand = rand() % dwOddSum + 1;
  18330. for (it = m_vecRouletteConfig.begin(); it != m_vecRouletteConfig.end(); it++)
  18331. {
  18332. tagRouletteConfig roulette = *it;
  18333. ///---过滤掉个数为0的奖品
  18334. if (roulette.iQuantity <= 0)
  18335. {
  18336. continue;
  18337. }
  18338. if (dwRand <= roulette.wOdds)
  18339. {
  18340. break;
  18341. }
  18342. else
  18343. {
  18344. dwRand -= roulette.wOdds;
  18345. }
  18346. }
  18347. ASSERT(it != m_vecRouletteConfig.end());
  18348. if (it != m_vecRouletteConfig.end())
  18349. {
  18350. CString strLottery;
  18351. strLottery.Format(L"UserID=%d 中奖结果:%s", pIServerUserItem->GetUserID(), (*it).szName);
  18352. CTraceService::TraceString(strLottery, TraceLevel_Normal);
  18353. }
  18354. ///---记录中奖信息
  18355. DBR_GR_RouletteLottery rouletteLottery;
  18356. rouletteLottery.dwUserID = pIServerUserItem->GetUserID();
  18357. rouletteLottery.wLotteryType = wLotteryType; ///---抽奖类型 0:轮盘抽奖 1:玩牌抽奖 2017-12-29
  18358. rouletteLottery.dwClientAddr = pIServerUserItem->GetClientAddr();
  18359. lstrcpyn(rouletteLottery.szMachineID, pIServerUserItem->GetMachineID(), CountArray(rouletteLottery.szMachineID));
  18360. rouletteLottery.wRouletteLotteryID = (*it).wID;
  18361. lstrcpyn(rouletteLottery.szLotteryName, (*it).szName, CountArray(rouletteLottery.szLotteryName));
  18362. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_ROULETTE_LOTTERY, dwSocketID, &rouletteLottery, sizeof(rouletteLottery));
  18363. return true;
  18364. }
  18365. ///+++轮盘抽奖
  18366. BOOL CAttemperEngineSink::OnDBRouletteLottery(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18367. {
  18368. //效验参数
  18369. ASSERT(wDataSize == sizeof(tagLotteryResultEx));
  18370. if (wDataSize != sizeof(tagLotteryResultEx))
  18371. {
  18372. return FALSE;
  18373. }
  18374. tagLotteryResultEx * pLotteryResult = (tagLotteryResultEx*)pData;
  18375. {
  18376. CString strLottery;
  18377. strLottery.Format(L"lScore=%lld, dwBean=%d", pLotteryResult->LotteryResult.lScore, pLotteryResult->LotteryResult.dwBean);
  18378. CTraceService::TraceString(strLottery, TraceLevel_Normal);
  18379. }
  18380. if (pLotteryResult->LotteryResult.wResult == 0)
  18381. {
  18382. if (pLotteryResult->wAwardType <= 2)
  18383. {
  18384. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc);
  18385. }
  18386. else if (pLotteryResult->wAwardType == 4)
  18387. {
  18388. if (pLotteryResult->szPhoneNum[0] == _T('\0'))
  18389. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s\n[ff0000]请去\"我的奖品\"完善收件信息!"), pLotteryResult->LotteryResult.szDesc);
  18390. else
  18391. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc);
  18392. }
  18393. else if (pLotteryResult->wAwardType == 3 || pLotteryResult->wAwardType == 6 || pLotteryResult->wAwardType == 7)
  18394. {
  18395. if (pLotteryResult->szPhoneNum[0] == _T('\0'))
  18396. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s\n[ff0000]您尚未绑定手机号,请去\"我的奖品\"手动领取"), pLotteryResult->LotteryResult.szDesc);
  18397. else
  18398. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("恭喜您获得%s"), pLotteryResult->LotteryResult.szDesc);
  18399. }
  18400. else if (pLotteryResult->wAwardType == 8)
  18401. {
  18402. _sntprintf(pLotteryResult->LotteryResult.szResultDesc, CountArray(pLotteryResult->LotteryResult.szResultDesc), TEXT("%s"), pLotteryResult->LotteryResult.szDesc);
  18403. }
  18404. }
  18405. //获取用户
  18406. WORD wBindIndex = LOWORD(dwContextID);
  18407. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18408. //用户效验
  18409. ASSERT(pIServerUserItem != NULL);
  18410. if (pIServerUserItem == NULL)
  18411. {
  18412. return false;
  18413. }
  18414. //--抽奖成功,更新下 // 2018-3-29
  18415. pIServerUserItem->GetUserInfo()->lScore = pLotteryResult->LotteryResult.lScore;
  18416. pIServerUserItem->GetUserInfo()->dwBean = pLotteryResult->LotteryResult.dwBean;
  18417. TurntableLogon::PB_CS_S_tagLotteryResult Result;
  18418. Result.set_wresult(pLotteryResult->LotteryResult.wResult);
  18419. std::string szDesc = CW2AEX<1024>(pLotteryResult->LotteryResult.szDesc, CP_UTF8).m_psz;
  18420. std::string szResultDesc = CW2AEX<1024>(pLotteryResult->LotteryResult.szResultDesc, CP_UTF8).m_psz;
  18421. Result.set_szdesc(szDesc);
  18422. Result.set_wlotterytype(pLotteryResult->LotteryResult.wLotteryType);
  18423. Result.set_wroulettelotterid(pLotteryResult->LotteryResult.wRouletteLotterID);
  18424. Result.set_whadlotterycount(pLotteryResult->LotteryResult.wHadLotteryCount);
  18425. Result.set_wlotterycountpara(pLotteryResult->LotteryResult.wLotteryCountPara);
  18426. Result.set_lscore(pLotteryResult->LotteryResult.lScore);
  18427. Result.set_dwbean(pLotteryResult->LotteryResult.dwBean);
  18428. Result.set_szresultdesc(szResultDesc);
  18429. //发送数据
  18430. std::string pbdata = Result.SerializePartialAsString();
  18431. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_ROULETEE_LOTTERY_ACK, (void*)pbdata.c_str(), pbdata.length());
  18432. //抽奖记录传到web端 过滤掉金币钻石、谢谢惠顾
  18433. if (pLotteryResult->wAwardType > 2 && pLotteryResult->wAwardType < 8 )
  18434. {
  18435. GETDUILIEBASE Temp;
  18436. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  18437. Temp.dUserID = pIServerUserItem->GetUserInfo()->dwUserID;
  18438. _sntprintf(Temp.bb.szName, 32, TEXT("%d"), pLotteryResult->LotteryResult.wRouletteLotterID);
  18439. StringCchCat(Temp.bb.szImgHead, 12, pLotteryResult->szPhoneNum);
  18440. _sntprintf(Temp.szUnionID, 32, TEXT("%d"), pLotteryResult->wAwardType);
  18441. sprintf(Temp.szBuffer, "%d", pLotteryResult->dwRecordID);
  18442. Temp.CommendID = 11; //抽奖记录
  18443. Temp.dwSocketID = dwContextID;
  18444. CHttpClient::AddLog(dwContextID, Temp);
  18445. }
  18446. return true;
  18447. }
  18448. ///查询抽奖信息
  18449. bool CAttemperEngineSink::OnTCPNetworkLotteryInfo(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18450. {
  18451. ASSERT(wDataSize == sizeof(WORD));
  18452. if (wDataSize != sizeof(WORD))
  18453. {
  18454. return false;
  18455. }
  18456. WORD wLotteryType = *((WORD *)pData);
  18457. ASSERT(0 == wLotteryType || 1 == wLotteryType);
  18458. //获取用户
  18459. WORD wBindIndex = LOWORD(dwSocketID);
  18460. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18461. //用户效验
  18462. ASSERT(pIServerUserItem != NULL);
  18463. if (pIServerUserItem == NULL)
  18464. {
  18465. return false;
  18466. }
  18467. ///---记录中奖信息
  18468. DBR_GR_LotteryInfo rouletteLotteryInfo;
  18469. rouletteLotteryInfo.dwUserID = pIServerUserItem->GetUserID();
  18470. rouletteLotteryInfo.wLotteryType = wLotteryType; ///---抽奖类型 0:轮盘抽奖 1:玩牌抽奖 2017-12-29
  18471. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_INFO, dwSocketID, &rouletteLotteryInfo, sizeof(rouletteLotteryInfo));
  18472. return true;
  18473. }
  18474. ///---查询签到奖品 ( 已经预加载 CT_LOAD_SERVICE_CONFIG )
  18475. bool CAttemperEngineSink::OnTCPNetworkCheckinReward(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18476. {
  18477. //变量定义
  18478. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinReward"), TraceLevel_Debug);
  18479. //获取用户
  18480. WORD wBindIndex = LOWORD(dwSocketID);
  18481. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18482. //用户效验
  18483. ASSERT(pIServerUserItem != NULL);
  18484. if (pIServerUserItem == NULL)
  18485. {
  18486. return false;
  18487. }
  18488. UserInfo::PB_CS_S_tagCheckinReward CheckinReward;
  18489. for (WORD i = 0; i < LEN_WEEK; i++)
  18490. {
  18491. CheckinReward.add_lrewardgold(m_checkinReward[i].lRewardGold);
  18492. CheckinReward.add_irewardcurrency(m_checkinReward[i].iRewardCurrency);
  18493. }
  18494. //发送数据
  18495. std::string pbdata = CheckinReward.SerializePartialAsString();
  18496. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_USER, SUB_GP_CHECKIN_REWARD2_ACK, (void*)pbdata.c_str(), pbdata.length());
  18497. return true;
  18498. }
  18499. ///---查询签到信息
  18500. bool CAttemperEngineSink::OnTCPNetworkCheckinQuery(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18501. {
  18502. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinQuery"), TraceLevel_Debug);
  18503. //获取用户
  18504. WORD wBindIndex = LOWORD(dwSocketID);
  18505. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18506. //用户效验
  18507. ASSERT(pIServerUserItem != NULL);
  18508. if (pIServerUserItem == NULL)
  18509. {
  18510. return false;
  18511. }
  18512. DWORD dUserID = pIServerUserItem->GetUserID();
  18513. //投递请求
  18514. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_CHECKIN_QUERY_INFO, dwSocketID, &dUserID, sizeof(dUserID));
  18515. return true;
  18516. }
  18517. //查询玩家签到信息
  18518. bool CAttemperEngineSink::OnDBUserCheckInInfo(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18519. {
  18520. //变量定义
  18521. tagCheckInInfo * pCheckInInfo = (tagCheckInInfo *)pData;
  18522. //变量定义
  18523. tagCheckInInfo CheckInInfo;
  18524. ZeroMemory(&CheckInInfo, sizeof(CheckInInfo));
  18525. //构造变量
  18526. CheckInInfo.bSuccessed = pCheckInInfo->bSuccessed; //成功标识
  18527. CheckInInfo.bTodayChecked = pCheckInInfo->bTodayChecked;
  18528. CheckInInfo.wSeriesDate = pCheckInInfo->wSeriesDate;
  18529. lstrcpyn(CheckInInfo.szNotifyContent, pCheckInInfo->szNotifyContent, CountArray(CheckInInfo.szNotifyContent));
  18530. UserCheckinInfo userCheckinInfo;
  18531. userCheckinInfo.btTodayChecked = CheckInInfo.bTodayChecked ? 1 : 0;
  18532. userCheckinInfo.wSeriesDay = CheckInInfo.wSeriesDate;
  18533. memcpy(&userCheckinInfo.checkinReward, m_checkinReward, sizeof(userCheckinInfo.checkinReward));
  18534. UserInfo::PB_CS_S_UserCheckinInfo CheckinInfo;
  18535. CheckinInfo.set_bttodaychecked(userCheckinInfo.btTodayChecked);
  18536. CheckinInfo.set_wseriesday(userCheckinInfo.wSeriesDay);
  18537. for (WORD i = 0; i < LEN_WEEK; i++)
  18538. {
  18539. UserInfo::pb_tagCheckinReward* CheckinReward = CheckinInfo.add_checkinreward();
  18540. CheckinReward->set_lrewardgold(userCheckinInfo.checkinReward[i].lRewardGold);
  18541. CheckinReward->set_irewardcurrency(userCheckinInfo.checkinReward[i].iRewardCurrency);
  18542. }
  18543. //发送数据
  18544. std::string pbdata = CheckinInfo.SerializePartialAsString();
  18545. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_CHECKIN_INFO2_ACK, (void*)pbdata.c_str(), pbdata.length());
  18546. return true;
  18547. }
  18548. ///---执行签到
  18549. bool CAttemperEngineSink::OnTCPNetworkCheckinDone(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18550. {
  18551. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkCheckinQuery"), TraceLevel_Debug);
  18552. //获取用户
  18553. WORD wBindIndex = LOWORD(dwSocketID);
  18554. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18555. //用户效验
  18556. ASSERT(pIServerUserItem != NULL);
  18557. if (pIServerUserItem == NULL)
  18558. {
  18559. return false;
  18560. }
  18561. tagCheckInDone checkinDown;
  18562. checkinDown.dwUserID = pIServerUserItem->GetUserID();
  18563. checkinDown.dwClientAddr = pIServerUserItem->GetClientAddr();
  18564. lstrcpyn(checkinDown.szMachineID, pIServerUserItem->GetMachineID(), CountArray(checkinDown.szMachineID));
  18565. //投递请求
  18566. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_CHECKIN_DONE, dwSocketID, &checkinDown, sizeof(checkinDown));
  18567. return true;
  18568. }
  18569. //签到结果
  18570. bool CAttemperEngineSink::OnDBUserCheckInResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18571. {
  18572. //获取用户
  18573. WORD wBindIndex = LOWORD(dwContextID);
  18574. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18575. //用户效验
  18576. ASSERT(pIServerUserItem != NULL);
  18577. if (pIServerUserItem == NULL)
  18578. {
  18579. return false;
  18580. }
  18581. //变量定义
  18582. tagCheckInResult * pCheckInResult = (tagCheckInResult *)pData;
  18583. //变量定义
  18584. tagCheckInResult checkinResult;
  18585. ZeroMemory(&checkinResult, sizeof(checkinResult));
  18586. //构造变量
  18587. ///===checkinResult.bSuccessed = pCheckInResult->bSuccessed;
  18588. checkinResult.btSuccessed = pCheckInResult->btSuccessed;
  18589. checkinResult.lScore = pCheckInResult->lScore;
  18590. checkinResult.dwBean = pCheckInResult->dwBean;
  18591. lstrcpyn(checkinResult.szNotifyContent, pCheckInResult->szNotifyContent, CountArray(checkinResult.szNotifyContent));
  18592. //--签到成功,更新下 // 2018-3-29
  18593. if (checkinResult.btSuccessed)
  18594. {
  18595. pIServerUserItem->GetUserInfo()->lScore = checkinResult.lScore;
  18596. pIServerUserItem->GetUserInfo()->dwBean = checkinResult.dwBean;
  18597. }
  18598. UserInfo::PB_CS_S_tagCheckInResult InResult;
  18599. InResult.set_btsuccessed(checkinResult.btSuccessed);
  18600. InResult.set_lscore(checkinResult.lScore);
  18601. InResult.set_dwbean(checkinResult.dwBean);
  18602. std::string szNotifyContent = CW2AEX<1024>(checkinResult.szNotifyContent, CP_UTF8).m_psz;
  18603. InResult.set_sznotifycontent(szNotifyContent);
  18604. //发送数据
  18605. std::string pbdata = InResult.SerializePartialAsString();
  18606. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GP_CHECKIN_DONE2_ACK, (void*)pbdata.c_str(), pbdata.length());
  18607. return true;
  18608. }
  18609. //签到的奖励
  18610. bool CAttemperEngineSink::OnDBCheckInReward(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18611. {
  18612. //参数校验
  18613. ASSERT(wDataSize == sizeof(tagCheckinReward)*LEN_WEEK);
  18614. if (wDataSize != sizeof(tagCheckinReward)*LEN_WEEK)
  18615. {
  18616. return false;
  18617. }
  18618. //提取数据
  18619. tagCheckinReward * pCheckinReward = (tagCheckinReward *)pData;
  18620. //保存到成员变量
  18621. CopyMemory(m_checkinReward, pCheckinReward, sizeof(tagCheckinReward)*LEN_WEEK);
  18622. return true;
  18623. }
  18624. ///+++轮盘抽奖
  18625. bool CAttemperEngineSink::OnDBQueryLotteryInfoResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18626. {
  18627. //效验参数
  18628. ASSERT(wDataSize == sizeof(tagLotteryInfo));
  18629. if (wDataSize != sizeof(tagLotteryInfo))
  18630. {
  18631. return false;
  18632. }
  18633. tagLotteryInfo * pLotteryInfo = (tagLotteryInfo*)pData;
  18634. //获取用户
  18635. WORD wBindIndex = LOWORD(dwContextID);
  18636. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18637. //用户效验
  18638. ASSERT(pIServerUserItem != NULL);
  18639. if (pIServerUserItem == NULL)
  18640. {
  18641. return false;
  18642. }
  18643. TurntableLogon::PB_CS_S_tagLotteryInfo LotteryInfo;
  18644. LotteryInfo.set_wresult(pLotteryInfo->wResult);
  18645. LotteryInfo.set_wlotterytype(pLotteryInfo->wLotteryType);
  18646. LotteryInfo.set_whadlotterycount(pLotteryInfo->wHadLotteryCount);
  18647. LotteryInfo.set_wlotterycountpara(pLotteryInfo->wLotteryCountPara);
  18648. LotteryInfo.set_wcurrentdrawcount(pLotteryInfo->wCurrentDrawCount);
  18649. LotteryInfo.set_wdrawlotterycountpara(pLotteryInfo->wDrawLotteryCountPara);
  18650. std::string szDesc = CW2AEX<1024>(pLotteryInfo->szDesc, CP_UTF8).m_psz;
  18651. LotteryInfo.set_szdesc(szDesc);
  18652. //发送数据
  18653. std::string pbdata = LotteryInfo.SerializePartialAsString();
  18654. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GF_ROULETEE, SUB_GF_LOTTERY_INFO_ACK, (void*)pbdata.c_str(), pbdata.length());
  18655. return true;
  18656. }
  18657. ///查询抽奖历史记录 BYTE btQueryFlag; //++查询标志 0:只查自己的;1:查最近中奖记录
  18658. bool CAttemperEngineSink::OnTCPNetworkLotteryHis(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18659. {
  18660. TurntableLogon::PB_CS_C_workLotteryHis LotteryHis;
  18661. LotteryHis.ParseFromArray(pData, wDataSize);
  18662. //获取用户
  18663. WORD wBindIndex = LOWORD(dwSocketID);
  18664. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18665. //用户效验
  18666. ASSERT(pIServerUserItem != NULL);
  18667. if (pIServerUserItem == NULL)
  18668. {
  18669. return false;
  18670. }
  18671. ///---记录中奖信息
  18672. DBR_GR_LotteryHis lotteryHis;
  18673. lotteryHis.dwUserID = pIServerUserItem->GetUserID();
  18674. lotteryHis.btQueryFlag = LotteryHis.btqueryflag(); //查询标志 0:只查自己的;1:查最近中奖记录
  18675. // to do 判断用户版本号
  18676. TCHAR szMachineID[LEN_MACHINE_ID] = { 0 };
  18677. memcpy(szMachineID, pIServerUserItem->GetMachineID(), sizeof(szMachineID));
  18678. del_char(szMachineID, L'.');
  18679. __int64 iMachineID = StrToNmuber(szMachineID);
  18680. /*if (iMachineID < 112)
  18681. {
  18682. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_HIS, dwSocketID, &lotteryHis, sizeof(lotteryHis));
  18683. }
  18684. else
  18685. {*/
  18686. m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_HIS_EX, dwSocketID, &lotteryHis, sizeof(lotteryHis));
  18687. /*}*/
  18688. return true;
  18689. }
  18690. //扫码绑定执行代码加钻和代理id
  18691. bool CAttemperEngineSink::OnSetAddBingIDAndCurrency(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18692. {
  18693. //效验参数
  18694. ASSERT(wDataSize == sizeof(CMD_GR_GetDaiLiSaoMaResult)
  18695. || wDataSize == sizeof(CMD_GR_GetDaiLiSaoMaResult));
  18696. //效验参数
  18697. if (wDataSize != sizeof(CMD_GR_GetDaiLiSaoMaResult)
  18698. && wDataSize != sizeof(CMD_GR_GetDaiLiSaoMaResult)) return false;
  18699. //获取用户
  18700. WORD wBindIndex = LOWORD(dwSocketID);
  18701. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18702. //用户效验
  18703. ASSERT(pIServerUserItem != NULL);
  18704. if (pIServerUserItem == NULL) return false;
  18705. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBO_GR_TASK_SAOMA, dwSocketID, pData, wDataSize);
  18706. return true;
  18707. }
  18708. //扫码绑定给前端推送钻石数量
  18709. bool CAttemperEngineSink::OnDBUserZuanShi(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18710. {
  18711. //效验参数
  18712. ASSERT(wDataSize == sizeof(CMD_GR_UserBean)
  18713. || wDataSize == sizeof(CMD_GR_UserBean));
  18714. //效验参数
  18715. if (wDataSize != sizeof(CMD_GR_UserBean)
  18716. && wDataSize != sizeof(CMD_GR_UserBean)) return false;
  18717. //dwContextID
  18718. WORD wBindIndex = LOWORD(dwContextID);
  18719. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18720. //用户效验
  18721. ASSERT(pIServerUserItem != NULL);
  18722. if (pIServerUserItem == NULL) return false;
  18723. CMD_GR_UserBean* gg = (CMD_GR_UserBean*)pData;
  18724. UserInfo::PB_CS_S_UserBean Bean;
  18725. Bean.set_dwcurrbeans(gg->dwCurrBeans);
  18726. //发送数据
  18727. std::string pbdata = Bean.SerializePartialAsString();
  18728. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  18729. return true;
  18730. }
  18731. //回调抽奖记录入库,更新领取标志
  18732. bool CAttemperEngineSink::OnTCPNetworkSubUserLotteryResultCallBack(WORD wLotteryID, DWORD dwSocketID)
  18733. {
  18734. //获取用户
  18735. WORD wBindIndex = LOWORD(dwSocketID);
  18736. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18737. if (pIServerUserItem == NULL) return false;
  18738. DBR_GR_LotteryFlag struLotteryFlag;
  18739. struLotteryFlag.wLotteryID = wLotteryID;
  18740. struLotteryFlag.dwUserID = pIServerUserItem->GetUserID();
  18741. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_FLAG, dwSocketID, &struLotteryFlag, sizeof(DBR_GR_LotteryFlag));
  18742. }
  18743. ///手动领奖
  18744. bool CAttemperEngineSink::OnTCPNetworkLotteryAward(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18745. {
  18746. TurntableLogon::PB_CS_C_workLotteryAward LotteryAward;
  18747. LotteryAward.ParseFromArray(pData, wDataSize);
  18748. //获取用户
  18749. WORD wBindIndex = LOWORD(dwSocketID);
  18750. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18751. //用户效验
  18752. ASSERT(pIServerUserItem != NULL);
  18753. if (pIServerUserItem == NULL)
  18754. {
  18755. return false;
  18756. }
  18757. DBR_GR_LotteryAward struLotteryAward;
  18758. struLotteryAward.dwRecordID = LotteryAward.precord();
  18759. struLotteryAward.dwUserID = pIServerUserItem->GetUserID();
  18760. //投递请求
  18761. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_AWARD, dwSocketID, &struLotteryAward, sizeof(struLotteryAward));
  18762. return true;
  18763. }
  18764. //注册收件信息
  18765. bool CAttemperEngineSink::OnTCPNetworkLotteryAddress(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18766. {
  18767. TurntableLogon::PB_CS_LotteryAddr LotteryAddr;
  18768. LotteryAddr.ParseFromArray(pData, wDataSize);
  18769. CString szaddress = (CA2CTEX<2048>(LotteryAddr.szaddress().c_str(), CP_UTF8)).m_szBuffer;
  18770. CString szaddressname = (CA2CTEX<2048>(LotteryAddr.szaddressname().c_str(), CP_UTF8)).m_szBuffer;
  18771. CString szaddrphonenum = (CA2CTEX<2048>(LotteryAddr.szaddrphonenum().c_str(), CP_UTF8)).m_szBuffer;
  18772. //处理消息
  18773. CMD_GR_LotteryAddr pLotteryAddr;
  18774. ZeroMemory(&pLotteryAddr, sizeof(pLotteryAddr));
  18775. _sntprintf(pLotteryAddr.szAddress, CountArray(pLotteryAddr.szAddress), TEXT("%s"), szaddress);
  18776. _sntprintf(pLotteryAddr.szAddressName, CountArray(pLotteryAddr.szAddressName), TEXT("%s"), szaddressname);
  18777. _sntprintf(pLotteryAddr.szAddrPhoneNum, CountArray(pLotteryAddr.szAddrPhoneNum), TEXT("%s"), szaddrphonenum);
  18778. //_stprintf_s(pLotteryAddr.szAddress, 11, _T("%S"), LotteryAddr.szaddress().c_str());
  18779. //_stprintf_s(pLotteryAddr.szAddressName, 11, _T("%S"), LotteryAddr.szaddressname().c_str());
  18780. //_stprintf_s(pLotteryAddr.szAddrPhoneNum, 11, _T("%S"), LotteryAddr.szaddrphonenum().c_str());
  18781. //获取用户
  18782. WORD wBindIndex = LOWORD(dwSocketID);
  18783. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18784. //用户效验
  18785. ASSERT(pIServerUserItem != NULL);
  18786. if (pIServerUserItem == NULL)
  18787. {
  18788. return false;
  18789. }
  18790. DBR_GR_LotteryAddr struLotteryAddr;
  18791. struLotteryAddr.dwUserID = pIServerUserItem->GetUserID();
  18792. memcpy(struLotteryAddr.szAddress, pLotteryAddr.szAddress, sizeof(struLotteryAddr.szAddress));
  18793. memcpy(struLotteryAddr.szAddressName, pLotteryAddr.szAddressName, sizeof(struLotteryAddr.szAddressName));
  18794. memcpy(struLotteryAddr.szAddrPhoneNum, pLotteryAddr.szAddrPhoneNum, sizeof(struLotteryAddr.szAddrPhoneNum));
  18795. //投递请求
  18796. m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GP_LOTTERY_ADDRESS, dwSocketID, &struLotteryAddr, sizeof(struLotteryAddr));
  18797. return true;
  18798. }
  18799. //手动领奖
  18800. BOOL CAttemperEngineSink::OnDBRouletteAward(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18801. {
  18802. //效验参数
  18803. ASSERT(wDataSize == sizeof(DBR_GR_LotteryAward));
  18804. if (wDataSize != sizeof(DBR_GR_LotteryAward))
  18805. {
  18806. return FALSE;
  18807. }
  18808. //获取用户
  18809. WORD wBindIndex = LOWORD(dwContextID);
  18810. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18811. DBR_GR_LotteryAward * pLotteryAward = (DBR_GR_LotteryAward*)pData;
  18812. if (pLotteryAward->cbCheckResult != 0)
  18813. {
  18814. CMD_GR_RequestFailureAward RequestFailure;
  18815. ZeroMemory(&RequestFailure, sizeof(RequestFailure));
  18816. //设置变量
  18817. RequestFailure.lErrorCode = 1; //表示失败
  18818. switch (pLotteryAward->cbCheckResult)
  18819. {
  18820. case 1:
  18821. {
  18822. _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品已领取!"));
  18823. break;
  18824. }
  18825. case 2:
  18826. {
  18827. _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品发放中,请稍候查收!"));
  18828. break;
  18829. }
  18830. case 3:
  18831. {
  18832. _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("领取失败,必要信息不全!"));
  18833. break;
  18834. }
  18835. default:
  18836. {
  18837. _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), TEXT("奖品发放异常,请联系客服!"));
  18838. break;
  18839. }
  18840. }
  18841. ////发送数据
  18842. //WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString);
  18843. //WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString);
  18844. if (pIServerUserItem != NULL)
  18845. {
  18846. TurntableLogon::PB_CS_C_workLotteryAward LotteryAward;
  18847. LotteryAward.set_lerrorcode(RequestFailure.lErrorCode);
  18848. std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz;
  18849. LotteryAward.set_szdescribestring(szDescribeString);
  18850. //发送数据
  18851. std::string pbdata = LotteryAward.SerializePartialAsString();
  18852. SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_AWARD, (void*)pbdata.c_str(), pbdata.length());
  18853. }
  18854. }
  18855. else
  18856. {
  18857. //发放奖品
  18858. GETDUILIEBASE Temp;
  18859. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  18860. Temp.dUserID = pLotteryAward->dwUserID;
  18861. StringCchCat(Temp.szUnionID, 12, pLotteryAward->szAddrPhoneNum);
  18862. StringCchCat(Temp.bb.szName, 17, pLotteryAward->szAddressee);
  18863. StringCchCat(Temp.bb.szImgHead, 129, pLotteryAward->szAddress);
  18864. sprintf(Temp.szBuffer, "%d", pLotteryAward->dwRecordID);
  18865. Temp.CommendID = 12; //抽奖记录
  18866. Temp.dwSocketID = dwContextID;
  18867. CHttpClient::AddLog(dwContextID, Temp);
  18868. CMD_GR_RequestFailureAward RequestFailure;
  18869. ZeroMemory(&RequestFailure, sizeof(RequestFailure));
  18870. //设置变量
  18871. RequestFailure.lErrorCode = 0; //表示成功
  18872. CString str;
  18873. str.Format(_T("%d"), pLotteryAward->dwRecordID);
  18874. _sntprintf(RequestFailure.szDescribeString, CountArray(RequestFailure.szDescribeString), str);
  18875. ////发送数据
  18876. //WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString);
  18877. //WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString);
  18878. if (pIServerUserItem != NULL)
  18879. {
  18880. TurntableLogon::PB_CS_C_workLotteryAward LotteryAward;
  18881. LotteryAward.set_lerrorcode(RequestFailure.lErrorCode);
  18882. std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz;
  18883. LotteryAward.set_szdescribestring(szDescribeString);
  18884. //发送数据
  18885. std::string pbdata = LotteryAward.SerializePartialAsString();
  18886. SendData(pIServerUserItem, MDM_GF_ROULETEE, SUB_GF_LOTTERY_AWARD, (void*)pbdata.c_str(), pbdata.length());
  18887. }
  18888. }
  18889. return true;
  18890. }
  18891. //分享战绩到闲聊
  18892. bool CAttemperEngineSink::OnDBFenXiangReCord(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18893. {
  18894. DBR_GR_ClubRecordXianLiao * pClubRecord = (DBR_GR_ClubRecordXianLiao*)pData;
  18895. GETDUILIEBASE Temp;
  18896. ZeroMemory(&Temp, sizeof(GETDUILIEBASE));
  18897. Temp.CommendID = 13; //调用.net闲聊分享战绩
  18898. //Temp.dwSocketID = pClubRecord->dwTableID;//桌子号
  18899. //Temp.dUserID = pClubRecord->dwClubID;//俱乐部id
  18900. switch (pClubRecord->WanFa)
  18901. {
  18902. case 0:
  18903. case 1:
  18904. case 2:
  18905. {
  18906. TCHAR szBuffer[32] = _T("一脚癞油");
  18907. _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID,pClubRecord->DiFen);
  18908. break;
  18909. }
  18910. case 3:
  18911. case 4:
  18912. case 5:
  18913. {
  18914. if (pClubRecord->dwUserCount == 3)
  18915. {
  18916. TCHAR szBuffer[32] = _T("戳虾子");
  18917. _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen);
  18918. }
  18919. else
  18920. {
  18921. TCHAR szBuffer[32] = _T("戳虾子-单挑");
  18922. _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen);
  18923. }
  18924. break;
  18925. }
  18926. case 10:
  18927. case 11:
  18928. case 12:
  18929. {
  18930. TCHAR szBuffer[32] = _T("血流成河");
  18931. _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen);
  18932. break;
  18933. }
  18934. case 14:
  18935. case 15:
  18936. case 16:
  18937. {
  18938. TCHAR szBuffer[32] = _T("花牌");
  18939. _sntprintf(Temp.szUnionID, CountArray(Temp.szUnionID), TEXT("%s %d人玩法\n桌子号%d 底分%d"), szBuffer, pClubRecord->dwUserCount, pClubRecord->dwTableID, pClubRecord->DiFen);
  18940. break;
  18941. }
  18942. default:
  18943. break;
  18944. }
  18945. //CMD_GR_Info bb; //人物信息
  18946. //CDM_GR_XIANL_Info PlayerInfo[4] = { 0 };
  18947. //for (BYTE i = 0; i < pClubRecord->dwUserCount; i++)
  18948. //{
  18949. // PlayerInfo[i].userID = pClubRecord->Player[i].userID;
  18950. // CopyMemory(&PlayerInfo[i].szName, pClubRecord->Player[i].szName, sizeof(PlayerInfo[i].szName));
  18951. // CopyMemory(&PlayerInfo[i].szImgHead, pClubRecord->Player[i].szImgHead, sizeof(PlayerInfo[i].szImgHead));
  18952. // PlayerInfo[i].gScore = pClubRecord->Player[i].gScore;
  18953. //}
  18954. CopyMemory(Temp.szBuffer, pClubRecord, wDataSize);//战绩信息
  18955. DWORD dwSocketID = INVALID_CHAIR;
  18956. CHttpClient::AddLog(dwSocketID, Temp);
  18957. return true;
  18958. }
  18959. //自动创建房间,发送请求到数据库进行创建
  18960. bool CAttemperEngineSink::OnAutoCreateRoomToDB(DWORD dwClubID, DWORD dwUserID, WORD wWanFa)
  18961. {
  18962. DBR_GR_ClubAction2 ClubAction;
  18963. ZeroMemory(&ClubAction, sizeof(ClubAction));
  18964. ClubAction.dwClubID = dwClubID;
  18965. ClubAction.dwUserID = dwUserID;
  18966. ClubAction.wWanFa = wWanFa;
  18967. //ClubAction.wFengDing = wFengDing;
  18968. //自动创建1个房间
  18969. return m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_CLUB_GET, 0, &ClubAction, sizeof(DBR_GR_ClubAction2));
  18970. }
  18971. bool CAttemperEngineSink::OnWlShuffleGameHandle(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  18972. {
  18973. //ASSERT(wDataSize == sizeof(BYTE));
  18974. //if (wDataSize != sizeof(BYTE))
  18975. //{
  18976. // return false;
  18977. //}
  18978. //获取用户
  18979. WORD wBindIndex = LOWORD(dwSocketID);
  18980. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18981. if (pIServerUserItem == NULL) return false;
  18982. DWORD dUserID = pIServerUserItem->GetUserID();
  18983. m_pIKernelDataBaseEngine->PostDataBaseRequest(SUB_GP_WENLIN_SHUFFLE, dwSocketID, &dUserID, sizeof(DWORD));
  18984. return true;
  18985. }
  18986. //洗牌动画 获取砖石数据应答
  18987. bool CAttemperEngineSink::OnWlShuffleGameHandleACK(DWORD dwContextID, VOID * pData, WORD wDataSize)
  18988. {
  18989. ASSERT(sizeof(USER_SHUFFLE_ZUANSHI) == wDataSize);
  18990. //获取用户
  18991. WORD wBindIndex = LOWORD(dwContextID);
  18992. IServerUserItem * pIServerUserItem = GetBindUserItem(wBindIndex);
  18993. if (pIServerUserItem == NULL) return false;
  18994. if (pIServerUserItem->GetUserStatus() == US_PLAYING) return true;
  18995. USER_SHUFFLE_ZUANSHI * pInfo = (USER_SHUFFLE_ZUANSHI*)pData;
  18996. m_wShuffleZuan = pInfo->dwNeedZuanshi;//所需钻石
  18997. //获取当前玩家钻石数
  18998. pInfo->dwUserZuanShi = pIServerUserItem->GetUserInfo()->dwBean;
  18999. UserInfo::PB_CS_S_USER_SHUFFLE_ZUANSHI Zuanshi;
  19000. Zuanshi.set_dwuserzuanshi(pInfo->dwUserZuanShi);
  19001. Zuanshi.set_dwneedzuanshi(pInfo->dwNeedZuanshi);
  19002. //发送数据
  19003. std::string pbdata = Zuanshi.SerializePartialAsString();
  19004. SendData(pIServerUserItem, MDM_GR_USER, SUB_GP_WENLIN_SHUFFLE_ACK, (void*)pbdata.c_str(), pbdata.length());
  19005. return true;
  19006. }
  19007. //扣钻 更新钻石
  19008. bool CAttemperEngineSink::OnWlShuffleGameDeductHandle(VOID * pData, WORD wDataSize)
  19009. {
  19010. ASSERT(sizeof(DBR_GR_WLDeductInfo) == wDataSize);
  19011. DBR_GR_WLDeductInfo * pInfo = (DBR_GR_WLDeductInfo*)pData;
  19012. IServerUserItem * pIServerUserItem = SearchUserItem(pInfo->dwUserID);
  19013. if (NULL == pIServerUserItem) return false;
  19014. if (pIServerUserItem->GetUserInfo()->dwBean >= pInfo->dwConsumeCurrency)
  19015. {
  19016. pIServerUserItem->GetUserInfo()->dwBean = pInfo->dwConsumeCurrency;
  19017. }
  19018. else
  19019. {
  19020. pIServerUserItem->GetUserInfo()->dwBean = 0;
  19021. }
  19022. //变量定义
  19023. CMD_GR_UserBean UserBeans;
  19024. ZeroMemory(&UserBeans, sizeof(UserBeans));
  19025. //构造变量
  19026. UserBeans.dwCurrBeans = pIServerUserItem->GetUserInfo()->dwBean;
  19027. UserInfo::PB_CS_S_UserBean Bean;
  19028. Bean.set_dwcurrbeans(UserBeans.dwCurrBeans);
  19029. //发送数据
  19030. std::string pbdata = Bean.SerializePartialAsString();
  19031. SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_USER_BEAN, (void*)pbdata.c_str(), pbdata.length());
  19032. return true;
  19033. }