CServerItem.js 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. var GameExitCode_Normal = 0; //正常退出
  2. var GameExitCode_CreateFailed = 1; //创建失败
  3. var GameExitCode_Timeout = 2; //定时到时
  4. var GameExitCode_Shutdown = 3; //断开连接
  5. var CServerItem = cc.Class({
  6. extends: cc.Component,
  7. properties: {
  8. },
  9. ctor :function () {
  10. this.mReqTableID = INVALID_TABLE;
  11. this.mServiceStatus = ServiceStatus_Unknow;
  12. this.mGameServer = null;
  13. this.mServerAttribute = null;
  14. this.mSocketEngine = null;
  15. this.mIStringMessageSink = null;
  16. this.mUserManager = null;
  17. this.mMeUserItem = 0;
  18. this.mUserAttribute = null;
  19. this.mReconnecting = false;
  20. this.mInterval = null;
  21. this.mIntervalTime = 0;
  22. this.mServerHeartTime = 0;
  23. this.mHeartStatTime = 0;
  24. },
  25. //设置接口
  26. SetServerItemSink :function(pIServerItemSink){
  27. this.mServerAttribute = new tagServerAttribute();
  28. this.mUserManager = new CPlazaUserManager(this);
  29. this.mUserAttribute = new tagUserAttribute();
  30. this.mIServerItemSink = pIServerItemSink;
  31. return true;
  32. },
  33. //设置接口
  34. SetStringMessageSink :function(pIStringMessageSink){
  35. this.mIStringMessageSink = pIStringMessageSink;
  36. return true;
  37. },
  38. //比赛框架
  39. GetMatchViewFrame :function(){
  40. return this.mMatchViewFrame;
  41. },
  42. //房间属性
  43. GetServerAttribute:function (){
  44. return this.mServerAttribute;
  45. },
  46. //设置状态
  47. SetServiceStatus :function(ServiceStatus){
  48. //设置变量
  49. this.mServiceStatus=ServiceStatus;
  50. },
  51. //是否服务状态
  52. IsService:function (){
  53. return this.mServiceStatus == ServiceStatus_ServiceIng;
  54. },
  55. //服务状态
  56. GetServiceStatus:function (){
  57. return this.mServiceStatus;
  58. },
  59. //自己位置
  60. GetMeUserItem :function() {
  61. return this.mMeUserItem;
  62. },
  63. //配置房间
  64. SetServerAttribute:function (pGameServerItem,wAVServerPort,dwAVServerAddr) {
  65. //房间属性
  66. this.mGameServer = pGameServerItem;
  67. this.mServerAttribute.wKindID = this.mGameServer.wKindID;
  68. this.mServerAttribute.wServerID = this.mGameServer.wServerID;
  69. this.mServerAttribute.wAVServerPort = this.mGameServer.wAVServerPort;
  70. this.mServerAttribute.dwAVServerAddr = this.mGameServer.dwAVServerAddr;
  71. this.mServerAttribute.szServerName = this.mGameServer.szServerName;
  72. return true;
  73. },
  74. //配置房间
  75. ConnectServer:function (pGameServerItem,wAVServerPort,dwAVServerAddr) {
  76. if (this.mServiceStatus != ServiceStatus_Unknow && this.mServiceStatus != ServiceStatus_NetworkDown){
  77. if (this.mIStringMessageSink)
  78. this.mIStringMessageSink.InsertPromptString("很抱歉,此遊戲房間還未關閉,請先關閉!!"+this.mServiceStatus);
  79. return false;
  80. }
  81. //房间属性
  82. this.SetServerAttribute(pGameServerItem, wAVServerPort, dwAVServerAddr);
  83. //关闭判断
  84. if (this.mServerAttribute.wServerID==0){
  85. this.SetServiceStatus(ServiceStatus_Unknow);
  86. if (this.mIStringMessageSink)
  87. this.mIStringMessageSink.InsertPromptString("很抱歉,此遊戲房間已經關閉了,不允許繼續進入!");
  88. return false;
  89. }
  90. //创建组件
  91. this.mSocketEngine = new cc.CSocketEngine(this);
  92. this.mSocketEngine.connect(this.mGameServer.szServerAddr, this.mGameServer.wServerPort);
  93. //设置状态
  94. this.SetServiceStatus(ServiceStatus_Entering);
  95. return true;
  96. },
  97. OnErr:function(){
  98. if (this.mIServerItemSink) return this.mIServerItemSink.OnGFServerReLink();
  99. },
  100. //发送登录
  101. SendLogonPacket:function (){
  102. //变量定义
  103. var LogonUserID = new CMD_GR_LogonUserID();
  104. //变量定义
  105. var pGlobalUserData=g_GlobalUserInfo.GetGlobalUserData();
  106. //登录信息
  107. LogonUserID.dwUserID = pGlobalUserData.dwUserID;
  108. LogonUserID.szPassword = pGlobalUserData.szDynamicPass;
  109. LogonUserID.szServerPasswd = LogonUserID.szServerPasswd;
  110. LogonUserID.wKindID = this.mServerAttribute.wKindID;
  111. LogonUserID.szMachineID = 'creator';
  112. //发送数据
  113. this.SendSocketClass(MDM_GR_LOGON, SUB_GR_LOGON_USERID, LogonUserID);
  114. return true;
  115. },
  116. //发送函数
  117. SendSocketData :function(wMainCmdID, wSubCmdID, data, dataSize){
  118. return this.mSocketEngine.send(wMainCmdID, wSubCmdID, data, dataSize);
  119. },
  120. //发送函数
  121. SendSocketClass :function (wMainCmdID, wSubCmdID, Obj){
  122. return this.mSocketEngine.sendClass(wMainCmdID, wSubCmdID, Obj);
  123. },
  124. //////////////////////////////////////////////////////////////////////////
  125. // Socket消息
  126. // 发送数据
  127. GFSendData :function(main, sub, data, size){
  128. return this.SendSocketData(main, sub, data, size);
  129. },
  130. //中断连接
  131. IntermitConnect :function(bBackLobby){
  132. if (this.mServiceStatus==ServiceStatus_Unknow || this.mServiceStatus==ServiceStatus_NetworkDown)return false;//
  133. if (this.IsService()){
  134. var kernel = gClientKernel.get();
  135. if(kernel) kernel.Intermit(0);
  136. }
  137. this.mIServerItemSink = null;
  138. this.mIntervalTime = new Date().getTime();
  139. this.mInterval = bBackLobby;
  140. return true;
  141. },
  142. CloseSocket:function (dt) {
  143. //设置状态
  144. this.SetServiceStatus(ServiceStatus_NetworkDown);
  145. this.mSocketEngine.closesocket();
  146. this.mReqTableID = INVALID_TABLE;
  147. this.mReqChairID = INVALID_CHAIR;
  148. this.mIsGameReady = false;
  149. this.mMeUserItem = 0;
  150. this.mServerHeartTime = 0;
  151. this.mUserManager.ResetUserItem(true);
  152. var kernel = gClientKernel.get();
  153. if(kernel)kernel.ResetUserItem();
  154. },
  155. update :function (dt) {
  156. if(!this.mInterval) return;
  157. //检查锁屏
  158. var timestamp=new Date().getTime();
  159. if(timestamp-this.mIntervalTime>=500){
  160. this.mInterval = null;
  161. this.CloseSocket();
  162. gClientKernel.destory();
  163. ChangeScene('Lobby');
  164. }
  165. },
  166. //游戏已准备好
  167. OnGFGameReady :function() {
  168. //变量定义
  169. var wTableID = this.mMeUserItem.GetTableID();
  170. var wChairID = this.mMeUserItem.GetChairID();
  171. var dwMeUserID = this.mMeUserItem.GetUserID();
  172. var pClientKernel = gClientKernel.get();
  173. this.mUserAttribute.wChairID = wChairID;
  174. this.mUserAttribute.wTableID = wTableID;
  175. //房间信息
  176. pClientKernel.OnGFConfigServer(this.mUserAttribute, this.mServerAttribute);
  177. pClientKernel.OnGFUserEnter(this.mMeUserItem);
  178. //发送用户
  179. if ((wTableID!=INVALID_TABLE)&&(wChairID!=INVALID_CHAIR)) {
  180. //变量定义
  181. var wEnumIndex = 0;
  182. //发送玩家
  183. while (true) {
  184. //获取用户
  185. var pIClientUserItem = this.mUserManager.EnumUserItem(wEnumIndex++);
  186. if (pIClientUserItem == 0) break;
  187. //发送判断
  188. if (pIClientUserItem.GetUserID() == dwMeUserID) continue;
  189. if (pIClientUserItem.GetTableID() != wTableID) continue;
  190. if (pIClientUserItem.GetUserStatus() == US_LOOKON) continue;
  191. //发送用户
  192. pClientKernel.OnGFUserEnter(pIClientUserItem);
  193. };
  194. //旁观用户
  195. wEnumIndex=0;
  196. while (true){
  197. //获取用户
  198. pIClientUserItem=this.mUserManager.EnumUserItem(wEnumIndex++);
  199. if (pIClientUserItem==0) break;
  200. //发送判断
  201. if (pIClientUserItem.GetUserID() == dwMeUserID) continue;
  202. if (pIClientUserItem.GetTableID()!=wTableID) continue;
  203. if (pIClientUserItem.GetUserStatus()!=US_LOOKON) continue;
  204. //发送用户
  205. pClientKernel.OnGFUserEnter(pIClientUserItem);
  206. };
  207. }
  208. //配置完成
  209. pClientKernel.OnGFConfigFinish();
  210. this.mIsGameReady = true;
  211. },
  212. //游戏关闭
  213. OnGFGameClose :function(iExitCode){
  214. //效验状态
  215. if (this.mMeUserItem==0) return ;
  216. this.mIsGameReady = false;
  217. //变量定义
  218. var wTableID=this.mMeUserItem.GetTableID();
  219. var wChairID=this.mMeUserItem.GetChairID();
  220. var cbUserStatus=this.mMeUserItem.GetUserStatus();
  221. this.mUserAttribute.wChairID = INVALID_CHAIR;
  222. this.mUserAttribute.wTableID = INVALID_TABLE;
  223. //退出游戏
  224. if ((wTableID!=INVALID_TABLE)&&(this.mServiceStatus==ServiceStatus_ServiceIng))
  225. {
  226. console.log("起立1")
  227. this.SendStandUpPacket(wTableID,wChairID,1);
  228. }
  229. this.mTableViewFrame.SetTableStatus1(false);
  230. },
  231. onEventTCPSocketLink :function(){
  232. this.mServerHeartTime = new Date().getTime();
  233. if(this.mIServerItemSink)this.mIServerItemSink.StopLoading();
  234. if(window.ReLinkTime != null){
  235. if(window.LOG_NET_DATA)console.log("onEventTCPSocketLink "+window.ReLinkTime)
  236. window.ReLinkTime = null;
  237. var kernel = gClientKernel.get();
  238. kernel.mIClientKernelSink.OnClearScene();
  239. if(kernel.mIClientKernelSink.m_DisCtrl && kernel.mIClientKernelSink.m_DisCtrl.node.active){
  240. kernel.mIClientKernelSink.m_DisCtrl.node.active = false;
  241. g_TimerEngine.UnPauseGameTimer();
  242. }
  243. }
  244. this.SendLogonPacket();
  245. },
  246. onEventTCPSocketShut :function(){
  247. //设置状态
  248. this.SetServiceStatus(ServiceStatus_NetworkDown);
  249. if (this.mIServerItemSink && this.mInterval != null) return this.mIServerItemSink.OnGFServerReLink();
  250. },
  251. onEventTCPSocketRead :function(main, sub, data, dataSize){
  252. console.log("CServerItem消息",main,sub)
  253. //try {
  254. switch (main){
  255. //登录消息
  256. case MDM_GR_LOGON: return this.OnSocketMainLogon(sub,data,dataSize);
  257. //配置信息
  258. case MDM_GR_CONFIG: return this.OnSocketMainConfig(sub,data,dataSize);
  259. //用户信息
  260. case MDM_GR_USER: return this.OnSocketMainUser(sub,data,dataSize);
  261. //状态信息
  262. case MDM_GR_STATUS: return this.OnSocketMainStatus(sub,data,dataSize);
  263. //银行消息
  264. case MDM_GR_INSURE: return OnSocketMainInsure(sub,data,dataSize);
  265. //管理消息
  266. case MDM_GR_MANAGE: return OnSocketMainManager(sub,data,dataSize);
  267. //管理消息
  268. case MDM_CM_SYSTEM: return this.OnSocketMainSystem(sub,data,dataSize);
  269. //游戏消息
  270. case MDM_GF_GAME:
  271. case MDM_GF_CARDROOM:
  272. case MDM_GF_FRAME: return this.OnSocketMainGameFrame(main,sub,data,dataSize);
  273. //比赛消息
  274. case MDM_GR_MATCH: return this.OnSocketMainMatch(sub,data,dataSize);
  275. }
  276. return true;
  277. /*} catch (error) {
  278. if(window.LOG_NET_DATA)console.log('onEventTCPSocketRead err!!! '+main+'-'+sub+' size:'+dataSize)
  279. if(window.LOG_NET_DATA)console.log(error)
  280. }*/
  281. },
  282. //登录消息
  283. OnSocketMainLogon :function(sub, data, dataSize) {
  284. switch (sub){
  285. //登录成功
  286. case SUB_GR_LOGON_SUCCESS: return this.OnSocketSubLogonSuccess(data,dataSize);
  287. //登录失败
  288. case SUB_GR_LOGON_ERROR: return this.onSocketSubLogonFailure(data,dataSize);
  289. //登录完成
  290. case SUB_GR_LOGON_FINISH: return this.OnSocketSubLogonFinish(data,dataSize);
  291. //更新提示
  292. case SUB_GR_UPDATE_NOTIFY: return this.OnSocketSubUpdateNotify(data,dataSize);
  293. }
  294. return true;
  295. },
  296. //配置信息
  297. OnSocketMainConfig :function(sub, data, dataSize) {
  298. switch (sub){
  299. //房间配置
  300. case SUB_GR_CONFIG_SERVER: return this.OnSocketSubConfigServer(data, dataSize);
  301. //列表配置
  302. case SUB_GR_CONFIG_COLUMN: return true;
  303. //道具配置
  304. case SUB_GR_CONFIG_PROPERTY: return true;
  305. //配置玩家权限
  306. case SUB_GR_CONFIG_USER_RIGHT: return true;
  307. //配置完成
  308. case SUB_GR_CONFIG_FINISH: return true;
  309. }
  310. return true;
  311. },
  312. //比赛消息
  313. OnSocketMainMatch :function(sub, data, dataSize){
  314. switch (sub){
  315. //费用查询
  316. case SUB_GR_MATCH_FEE: return this.OnSocketSubMatchFee(data,dataSize);
  317. //金币更新
  318. case SUB_GR_MATCH_GOLDUPDATE: return this.OnSocketSubMatchGold(data, dataSize);
  319. }
  320. return this.mMatchViewFrame.OnEventViewData(sub, data, dataSize);
  321. },
  322. //心跳消息
  323. OnSocketHeart :function(){
  324. if( this.mInterval != null) return true;
  325. //服务器端返回的心跳
  326. this.mServerHeartTime = new Date().getTime();
  327. window.g_NetResponseTime = this.mServerHeartTime - this.mHeartStatTime;
  328. return true;
  329. },
  330. //比赛费用
  331. OnSocketSubMatchFee :function(data, dataSize) {
  332. var pMatchFee = new CMD_GR_Match_Fee();
  333. //参数效验
  334. if (dataSize>pMatchFee.getSize()) return false;
  335. //提取数据
  336. pMatchFee.lMatchFee = gCByte.r4(data,pMatchFee.index_lMatchFee);
  337. pMatchFee.szNotifyContent = gCByte.rStr(data,pMatchFee.index_szNotifyContent);
  338. if (pMatchFee.lMatchFee>0)
  339. {
  340. if (this.mIStringMessageSink)
  341. {
  342. this.mIStringMessageSink.InsertMatchJoinString(pMatchFee.lMatchFee);
  343. }
  344. }
  345. return true;
  346. },
  347. //更新金币
  348. OnSocketSubMatchGold :function(data, dataSize) {
  349. var pMatchGoldUpdate = new CMD_GR_MatchGoldUpdate();
  350. //参数校验
  351. if (pMatchGoldUpdate.getSize() != dataSize) return false;
  352. //提取数据
  353. pMatchGoldUpdate.lCurrGold = gCByte.r8(data,pMatchGoldUpdate.index_lCurrGold);
  354. pMatchGoldUpdate.lCurrIngot = gCByte.r8(data,pMatchGoldUpdate.index_lCurrIngot);
  355. pMatchGoldUpdate.dwCurrExprience = gCByte.r4(data,pMatchGoldUpdate.index_dwCurrExprience);
  356. //变量定义
  357. var pGlobalUserData = g_GlobalUserInfo.GetGlobalUserData();
  358. //设置变量
  359. pGlobalUserData.llUserScore = pMatchGoldUpdate.lCurrGold;
  360. pGlobalUserData.llUserIngot = pMatchGoldUpdate.lCurrIngot;
  361. pGlobalUserData.dwExperience = pMatchGoldUpdate.dwCurrExprience;
  362. return true;
  363. },
  364. //登录失败
  365. onSocketSubLogonFailure :function(data, size){
  366. //变量定义
  367. var pLogonFailure = new CMD_GR_LogonFailure();
  368. gCByte.Bytes2Str(pLogonFailure,data);
  369. //显示消息
  370. if (this.mIStringMessageSink)
  371. this.mIStringMessageSink.InsertPromptStringAndClose(pLogonFailure.szErrorDescribe);
  372. return true;
  373. },
  374. //登录成功
  375. OnSocketSubLogonSuccess :function(data,dataSize) {
  376. this.mIsQuickSitDown = false;
  377. //设置状态
  378. this.SetServiceStatus(ServiceStatus_RecvInfo);
  379. //if (this.mIServerItemSink)
  380. // this.mIServerItemSink.OnGRLogonSuccess();
  381. return true;
  382. },
  383. //登录完成
  384. OnSocketSubLogonFinish :function(data, dataSize) {
  385. //设置状态
  386. this.SetServiceStatus(ServiceStatus_ServiceIng);
  387. this.mUserAttribute.dwUserID=this.mMeUserItem.GetUserID();
  388. this.mUserAttribute.wChairID=INVALID_CHAIR;
  389. this.mUserAttribute.wTableID=INVALID_TABLE;
  390. if (this.mIServerItemSink)
  391. this.mIServerItemSink.OnGRLogonFinish();
  392. return true;
  393. },
  394. //登录完成
  395. OnSocketSubUpdateNotify :function(data, dataSize) {
  396. if (this.mIServerItemSink)
  397. this.mIStringMessageSink.InsertPromptStringAndClose("遊戲版本不匹配");
  398. return true;
  399. },
  400. //房间配置
  401. OnSocketSubConfigServer :function(data,dataSize) {
  402. var pConfigServer = new CMD_GR_ConfigServer();
  403. //效验数据
  404. if (dataSize<gCByte.Bytes2Str(pConfigServer,data)) return false;
  405. //消息处理
  406. //房间属性
  407. this.mServerAttribute.wServerType=pConfigServer.wServerType;
  408. this.mServerAttribute.dwServerRule=pConfigServer.dwServerRule;
  409. this.mServerAttribute.wTableCount=pConfigServer.wTableCount;
  410. this.mServerAttribute.wChairCount=pConfigServer.wChairCount;
  411. if (!this.mTableViewFrame.ConfigTableFrame(
  412. this.mServerAttribute.wTableCount,
  413. this.mServerAttribute.wChairCount,
  414. this.mServerAttribute.dwServerRule,
  415. this.mServerAttribute.wServerType,
  416. this.mServerAttribute.wServerID))
  417. {
  418. this.IntermitConnect(true);
  419. return false;
  420. }
  421. return true;
  422. },
  423. //用户处理
  424. OnSocketMainUser :function(sub, data, dataSize){
  425. switch (sub) {
  426. //请求坐下失败
  427. case SUB_GR_REQUEST_FAILURE: return this.OnSocketSubRequestFailure(data, dataSize);
  428. //邀请玩家
  429. case SUB_GR_USER_INVITE: return OnSocketSubUserInvite(data,dataSize);
  430. //等待分配
  431. case SUB_GR_USER_WAIT_DISTRIBUTE: return OnSocketSubWaitDistribute(data,dataSize);
  432. //用户进入
  433. case SUB_GR_USER_ENTER: return this.OnSocketSubUserEnter(data, dataSize);
  434. //用户积分
  435. case SUB_GR_USER_SCORE: return this.OnSocketSubUserScore(data,dataSize);
  436. //用户状态
  437. case SUB_GR_USER_STATUS: return this.OnSocketSubUserStatus(data,dataSize);
  438. //道具成功
  439. case SUB_GR_PROPERTY_SUCCESS: return OnSocketSubPropertySuccess(data,dataSize);
  440. //道具失败
  441. case SUB_GR_PROPERTY_FAILURE: return OnSocketSubPropertyFailure(data,dataSize);
  442. //道具效应
  443. case SUB_GR_PROPERTY_EFFECT: return OnSocketSubPropertyEffect(data,dataSize);
  444. //礼物消息
  445. case SUB_GR_PROPERTY_MESSAGE: return OnSocketSubPropertyMessage(data,dataSize);
  446. //喇叭消息
  447. case SUB_GR_PROPERTY_TRUMPET: return OnSocketSubPropertyTrumpet(data,dataSize);
  448. case SUB_GR_USER_QUEUE_COM: return OnSocketSubQueueCom(data, dataSize);
  449. case SUB_GR_USER_GAME_DATA:
  450. if(window.LOG_NET_DATA)console.log("the fucking user game data!!!!!")
  451. return true;
  452. }
  453. return true;
  454. },
  455. //请求失败
  456. OnSocketSubRequestFailure :function(data,dataSize) {
  457. //变量定义
  458. var pRequestFailure = new CMD_GR_RequestFailure();
  459. gCByte.Bytes2Str(pRequestFailure, data);
  460. //变量定义
  461. var pITableUserItem=0;
  462. var wMeTableID=this.mMeUserItem.GetTableID();
  463. var wMeChairID=this.mMeUserItem.GetChairID();
  464. //界面还原
  465. if ((this.mReqTableID!=INVALID_TABLE)&&(this.mReqChairID!=INVALID_TABLE)&&(this.mReqChairID!=MAX_CHAIR))
  466. {
  467. var pITableUserItem=this.mTableViewFrame.GetClientUserItem(this.mReqTableID,this.mReqChairID);
  468. if (pITableUserItem==this.mMeUserItem)
  469. this.mTableViewFrame.SetClientUserItem2(this.mReqTableID, this.mReqChairID, null);
  470. }
  471. //设置变量
  472. this.mReqTableID=INVALID_TABLE;
  473. this.mReqChairID=INVALID_CHAIR;
  474. if (this.mIsQuickSitDown){
  475. this.mIsQuickSitDown = false;
  476. /*
  477. if (CServerRule::IsAllowQuickMode(mServerAttribute.dwServerRule))
  478. {//快速坐下,防作弊模式
  479. if (mIServerItemSink)
  480. {
  481. char szDescribeString[256*4];
  482. UtoA(pRequestFailure->szDescribeString, szDescribeString, sizeof(pRequestFailure->szDescribeString));
  483. mIServerItemSink->OnGFServerClose(szDescribeString);
  484. }
  485. }
  486. */
  487. }else{
  488. //提示消息
  489. if (this.mIServerItemSink)
  490. this.mIServerItemSink.onGRRequestFailure(pRequestFailure.szDescribeString);
  491. }
  492. return true;
  493. },
  494. //用户积分
  495. OnSocketSubUserScore: function (data, dataSize) {
  496. // 创建一个CMD_GR_UserScore对象实例
  497. var pUserScore = new CMD_GR_UserScore();
  498. // 校验接收到的数据大小是否与CMD_GR_UserScore对象解析后的数据大小一致
  499. // 使用gCByte.Bytes2Str方法将字节数据转换为字符串,并与dataSize进行比较
  500. // 如果不一致,返回false,表示数据校验失败
  501. if (dataSize != gCByte.Bytes2Str(pUserScore, data)) return false;
  502. console.log("用户积分--1",pUserScore);
  503. // 根据用户ID从用户管理器中搜索对应的用户项
  504. // pUserScore.dwUserID包含了要查找的用户ID
  505. var pIClientUserItem = this.mUserManager.SearchUserByUserID(pUserScore.dwUserID);
  506. // 判断用户项是否存在
  507. // 如果用户项不存在(返回0),则不需要进一步处理,直接返回true
  508. // 注意:这里的判断条件应该是pIClientUserItem === null 或 pIClientUserItem === undefined,
  509. // 根据实际代码逻辑,0可能是为了表示未找到用户,这在某些特定实现中可能是合理的
  510. if (pIClientUserItem == 0) return true;
  511. // 获取全局用户数据
  512. // pGlobalUserData是一个包含全局用户信息的对象
  513. var pGlobalUserData = g_GlobalUserInfo.GetGlobalUserData();
  514. // 更新全局用户数据中的用户分数和金币数
  515. // 首先检查全局用户数据中的dwUserID是否与接收到的用户ID一致
  516. if (pGlobalUserData.dwUserID == pUserScore.dwUserID) {
  517. // 如果服务器类型为GAME_GENRE_GOLD,则更新用户的分数
  518. // 注意:这里假设llUserScore是用户的分数,llIngot是用户的金币数
  519. if (this.mServerAttribute.wServerType == GAME_GENRE_GOLD) {
  520. pGlobalUserData.llUserScore = pUserScore.UserScore.llScore;
  521. }
  522. // 无论服务器类型如何,都更新用户的金币数
  523. pGlobalUserData.llUserIngot = pUserScore.UserScore.llIngot;
  524. }
  525. // 更新用户管理器中用户项的分数
  526. // this.mUserManager.UpdateUserItemScore方法用于更新用户项的分数
  527. this.mUserManager.UpdateUserItemScore(pIClientUserItem, pUserScore.UserScore);
  528. // 返回true,表示数据处理成功
  529. return true;
  530. },
  531. //用户进入
  532. OnSocketSubUserEnter :function(data, dataSize) {
  533. //消息处理
  534. var pUserInfoHead = new tagUserInfoHead();
  535. var readSize = gCByte.Bytes2Str(pUserInfoHead,data);
  536. //效验参数
  537. if (dataSize<readSize) return false;
  538. //变量定义
  539. var DataDescribe = new tagDataDescribe();
  540. var UserInfo = new tagUserInfo();
  541. var InfoObj = new Object();
  542. InfoObj.szStr = '';
  543. InfoObj.len_szStr = 0;
  544. //扩展信息
  545. while (readSize < dataSize){
  546. readSize += gCByte.Bytes2Str(DataDescribe, data, readSize);
  547. if (DataDescribe.wDataDescribe == DTP_NULL) break;
  548. InfoObj.len_szStr = DataDescribe.wDataSize;
  549. readSize += gCByte.Bytes2Str(InfoObj, data, readSize);
  550. switch (DataDescribe.wDataDescribe){
  551. case DTP_GR_NICK_NAME: //用户昵称
  552. {
  553. UserInfo.szNickName = InfoObj.szStr;
  554. break;
  555. }
  556. case DTP_GR_GROUP_NAME: //用户社团
  557. {
  558. UserInfo.szGroupName = InfoObj.szStr;
  559. break;
  560. }
  561. case DTP_GR_UNDER_WRITE: //个性签名
  562. {
  563. UserInfo.szUnderWrite = InfoObj.szStr;
  564. break;
  565. }
  566. case DTP_GR_MOBILE_PHONE: //个性签名
  567. {
  568. UserInfo.szMobilePhone = InfoObj.szStr;
  569. break;
  570. }
  571. case DTP_GR_IP: //个性签名
  572. {
  573. UserInfo.szClientIP = InfoObj.szStr;
  574. break;
  575. }
  576. }
  577. }
  578. //var CustomFaceInfo = new tagCustomFaceInfo();
  579. //用户属性
  580. gCByte.StrSameMemCopy(UserInfo, pUserInfoHead);
  581. //激活用户
  582. var pIClientUserItem = this.mUserManager.SearchUserByUserID(UserInfo.dwUserID);
  583. if (pIClientUserItem == 0){
  584. pIClientUserItem = this.mUserManager.ActiveUserItem(UserInfo/*, CustomFaceInfo*/);
  585. }
  586. //获取对象
  587. var pServerListData = g_ServerListData;
  588. //人数更新
  589. //if (pServerListData)
  590. // pServerListData.SetServerOnLineCount(this.mServerAttribute.wServerID, this.mUserManager.GetActiveUserCount());
  591. console.log("用户进入OnSocketSubUserEnter",pUserInfoHead)
  592. return true;
  593. },
  594. OnUserItemAcitve :function(pIClientUserItem){
  595. //判断自己
  596. var pGlobalUserData = g_GlobalUserInfo.GetGlobalUserData();
  597. if (pGlobalUserData.dwUserID == pIClientUserItem.m_UserInfo.dwUserID){
  598. this.mMeUserItem=pIClientUserItem;
  599. }
  600. //设置桌子
  601. var cbUserStatus=pIClientUserItem.GetUserStatus();
  602. if ((cbUserStatus>=US_SIT)&&(cbUserStatus!=US_LOOKON)){
  603. var wTableID=pIClientUserItem.GetTableID();
  604. var wChairID=pIClientUserItem.GetChairID();
  605. this.mTableViewFrame.SetClientUserItem2(wTableID, wChairID, pIClientUserItem);
  606. }
  607. },
  608. //状态信息
  609. OnSocketMainStatus:function (sub,data,dataSize)
  610. {
  611. switch (sub)
  612. {
  613. //桌子信息
  614. case SUB_GR_TABLE_INFO: return this.OnSocketSubStatusTableInfo(data, dataSize);
  615. //桌子状态
  616. case SUB_GR_TABLE_STATUS: return this.OnSocketSubStatusTableStatus(data, dataSize);
  617. }
  618. return true;
  619. },
  620. //桌子信息
  621. OnSocketSubStatusTableInfo :function(data, dataSize){
  622. //变量定义
  623. var pTableInfo = new CMD_GR_TableInfo();
  624. if(dataSize < gCByte.Bytes2Str(pTableInfo,data)) return false;
  625. pTableInfo.TableStatusArray = new Array();
  626. for(var i = 0;i<pTableInfo.wTableCount;i++){
  627. pTableInfo.TableStatusArray[i] = new tagTableStatus();
  628. }
  629. if(dataSize != gCByte.Bytes2Str(pTableInfo,data)) return false;
  630. //桌子状态
  631. for (var i = 0; i < pTableInfo.wTableCount; i++){
  632. var cbTableLock= pTableInfo.TableStatusArray[i].cbTableLock;
  633. var cbPlayStatus=pTableInfo.TableStatusArray[i].cbPlayStatus;
  634. this.mTableViewFrame.SetTableStatus(i, (cbPlayStatus == true), (cbTableLock == true));
  635. }
  636. return true;
  637. },
  638. //桌子状态
  639. OnSocketSubStatusTableStatus :function(data, dataSize){
  640. var pTableStatus = new CMD_GR_TableStatus();
  641. //效验参数
  642. if(dataSize != gCByte.Bytes2Str(pTableStatus,data)) return false;
  643. //设置桌子
  644. var cbTableLock=pTableStatus.TableStatus.cbTableLock ;
  645. var cbPlayStatus=pTableStatus.TableStatus.cbPlayStatus;
  646. this.mTableViewFrame.SetTableStatus(pTableStatus.wTableID, (cbPlayStatus == true), (cbTableLock == true));
  647. //设置桌子
  648. if(cbPlayStatus==true && this.mMeUserItem.GetTableID()==pTableStatus.wTableID ){
  649. this.mTableViewFrame.SetTableStatus1(false);
  650. }
  651. return true;
  652. },
  653. //系统消息
  654. OnSocketMainSystem:function (sub, data, dataSize){
  655. switch (sub){
  656. //系统消息
  657. case SUB_CM_SYSTEM_MESSAGE: return this.OnSocketSubSystemMessage(data,dataSize);
  658. //动作消息
  659. case SUB_CM_ACTION_MESSAGE: return OnSocketSubActionMessage(data,dataSize);
  660. }
  661. return true;
  662. },
  663. //系统消息
  664. OnSocketSubSystemMessage:function (data, dataSize){
  665. var message = new CMD_CM_SystemMessage();
  666. gCByte.Bytes2Str(message, data);
  667. console.log("系统消息CServerItem",message)
  668. //关闭游戏
  669. if (message.wType&(SMT_CLOSE_ROOM|SMT_CLOSE_LINK|SMT_CLOSE_GAME)){
  670. if (gClientKernel.get())
  671. gClientKernel.get().Intermit(GameExitCode_Shutdown);
  672. }
  673. //关闭游戏
  674. if (message.wType&(SMT_CLOSE_ROOM|SMT_CLOSE_LINK))
  675. {
  676. //this.IntermitConnect(true);
  677. }
  678. //弹出消息
  679. if (message.wType&SMT_EJECT)
  680. {
  681. if (this.mIStringMessageSink)
  682. this.mIStringMessageSink.InsertPromptString( message.szString);
  683. }
  684. //关闭处理
  685. if ((message.wType&(SMT_CLOSE_ROOM|SMT_CLOSE_LINK))!=0)
  686. {
  687. //时间延迟
  688. //if (this.mIServerItemSink)
  689. // this.mIServerItemSink.OnGFServerClose(sString);
  690. }
  691. return true;
  692. },
  693. //执行起立
  694. PerformStandUpAction:function (wTableID,wChairID){
  695. if (!this.IsService())
  696. return false;
  697. //状态过滤
  698. if (this.mServiceStatus!=ServiceStatus_ServiceIng) return false;
  699. if ((this.mReqTableID==wTableID)&&(this.mReqChairID==wChairID)) return false;
  700. //设置变量
  701. this.mReqTableID=INVALID_TABLE;
  702. this.mReqChairID=INVALID_CHAIR;
  703. this.mFindTableID=INVALID_TABLE;
  704. //设置界面
  705. this.mTableViewFrame.VisibleTable(wTableID);
  706. var kernel = gClientKernel.get();
  707. if (kernel){
  708. kernel.Intermit(false);
  709. }else{
  710. console.log("起立2")
  711. this.SendStandUpPacket(wTableID, wChairID, 0);
  712. }
  713. return true;
  714. },
  715. //执行坐下
  716. PerformSitDownAction:function(wTableID, wChairID, bEfficacyPass){
  717. if(window.LOG_NET_DATA)console.log("執行坐下",wTableID,wChairID);
  718. if (!this.IsService()) return false;
  719. //状态过滤
  720. if (this.mServiceStatus!=ServiceStatus_ServiceIng) return false;
  721. if ((this.mReqTableID!=INVALID_TABLE)&&(this.mReqTableID==wTableID)) return false;
  722. if ((this.mReqChairID!=INVALID_CHAIR)&&(this.mReqChairID==wChairID)) return false;
  723. if ((wTableID != INVALID_TABLE) && (wChairID != INVALID_CHAIR))
  724. {
  725. var pINowUserItem = this.mTableViewFrame.GetClientUserItem(wTableID, wChairID);
  726. if (pINowUserItem != null)return true;
  727. }
  728. //自己状态
  729. if (this.mMeUserItem.GetUserStatus()>=US_PLAYING)
  730. {
  731. return true;
  732. //提示消息
  733. if (this.mIStringMessageSink)
  734. this.mIStringMessageSink.InsertPromptString("您正在遊戲中,暫時不能離開,請先結束當前遊戲!");
  735. return false;
  736. }
  737. //清理界面
  738. if ((this.mReqTableID!=INVALID_TABLE)&&(this.mReqChairID!=INVALID_CHAIR)&&(this.mReqChairID!=MAX_CHAIR))
  739. {
  740. pIClientUserItem = this.mTableViewFrame.GetClientUserItem(this.mReqTableID, this.mReqChairID);
  741. if (pIClientUserItem == this.mMeUserItem) this.mTableViewFrame.SetClientUserItem2(mReqTableID, mReqChairID, null);
  742. }
  743. //设置界面
  744. if ((wChairID!=MAX_CHAIR)&&(wTableID!=INVALID_TABLE)&&(wChairID!=INVALID_CHAIR))
  745. {
  746. this.mTableViewFrame.VisibleTable(wTableID);
  747. this.mTableViewFrame.SetClientUserItem2(wTableID, wChairID, this.mMeUserItem);
  748. }
  749. //设置变量
  750. this.mReqTableID=wTableID;
  751. this.mReqChairID=wChairID;
  752. this.mFindTableID=INVALID_TABLE;
  753. //发送命令
  754. this.SendSitDownPacket(wTableID,wChairID,"");
  755. return true;
  756. },
  757. //执行坐下
  758. PerformEnterRoom:function() {
  759. if(window.LOG_NET_DATA)console.log("进入房间 ", window.g_dwRoomID);
  760. if (!this.IsService()) return false;
  761. //状态过滤
  762. if (this.mServiceStatus!=ServiceStatus_ServiceIng) return false;
  763. //自己状态
  764. if (this.mMeUserItem.GetUserStatus() >= US_PLAYING && this.mMeUserItem.GetTableID() != INVALID_CHAIR){
  765. return true;
  766. //提示消息
  767. if (this.mIStringMessageSink)
  768. this.mIStringMessageSink.InsertPromptString("您正在遊戲中,暫時不能離開,請先結束當前遊戲!");
  769. return false;
  770. }
  771. /*
  772. //清理界面
  773. if ((this.mReqTableID!=INVALID_TABLE)&&(this.mReqChairID!=INVALID_CHAIR)&&(this.mReqChairID!=MAX_CHAIR)){
  774. pIClientUserItem = this.mTableViewFrame.GetClientUserItem(this.mReqTableID, this.mReqChairID);
  775. if (pIClientUserItem == this.mMeUserItem) this.mTableViewFrame.SetClientUserItem2(mReqTableID, mReqChairID, null);
  776. }
  777. //设置界面
  778. if ((wChairID!=MAX_CHAIR)&&(wTableID!=INVALID_TABLE)&&(wChairID!=INVALID_CHAIR)){
  779. this.mTableViewFrame.VisibleTable(wTableID);
  780. this.mTableViewFrame.SetClientUserItem2(wTableID, wChairID, this.mMeUserItem);
  781. }
  782. */
  783. //发送命令
  784. //if(g_ServerListDataLast.wServerType & (GAME_GENRE_PERSONAL|GAME_GENRE_CLUB)){
  785. if( window.g_dwRoomID > 0){
  786. var UserSitDown = new CMD_GR_UserEnterRoom();
  787. UserSitDown.dwRoomID = window.g_dwRoomID;
  788. UserSitDown.dwClubID = window.g_dwClubID;
  789. console.log("进入房间 SUB_GR_USER_ENTER_ROOM")
  790. this.SendSocketClass(MDM_GR_USER, SUB_GR_USER_ENTER_ROOM, UserSitDown);
  791. }else{
  792. if(window.LOG_NET_DATA)console.log('PerformEnterRoom window.g_dwRoomID null')
  793. this.IntermitConnect(true);
  794. }
  795. //}
  796. return true;
  797. },
  798. OnUserItemDelete:function (pIClientUserItem)
  799. {
  800. //变量定义
  801. var wLastTableID = pIClientUserItem.GetTableID();
  802. var wLastChairID = pIClientUserItem.GetChairID();
  803. var dwLeaveUserID = pIClientUserItem.GetUserID();
  804. var pMeUserInfo = this.mMeUserItem.GetUserInfo();
  805. //离开处理
  806. if ((wLastTableID!=INVALID_TABLE)&&(wLastChairID!=INVALID_CHAIR))
  807. {
  808. //获取用户
  809. var pITableUserItem= this.mTableViewFrame.GetClientUserItem(wLastTableID,wLastChairID);
  810. if (pITableUserItem==pIClientUserItem) this.mTableViewFrame.SetClientUserItem2(wLastTableID,wLastChairID,null);
  811. //离开通知
  812. if ((pIClientUserItem==this.mMeUserItem)||(wLastTableID==pMeUserInfo.wTableID)) {
  813. var UserStatus = new tagUserStatus();
  814. UserStatus.cbUserStatus=US_NULL;
  815. UserStatus.wTableID=INVALID_TABLE;
  816. UserStatus.wChairID=INVALID_CHAIR;
  817. if (gClientKernel.get())
  818. gClientKernel.get().OnGFUserStatus(pIClientUserItem.GetUserID(), UserStatus);
  819. }
  820. }
  821. },
  822. OnUserItemUpdate2:function (pIClientUserItem,tLastScore) {
  823. //变量定义
  824. var pUserInfo = pIClientUserItem.GetUserInfo();
  825. var pMeUserInfo = this.mMeUserItem.GetUserInfo();
  826. var wNowTableID=pIClientUserItem.GetTableID();
  827. var wLastTableID=tLastScore.wTableID;
  828. var wNowChairID=pIClientUserItem.GetChairID();
  829. var wLastChairID=tLastScore.wChairID;
  830. var cbNowStatus=pIClientUserItem.GetUserStatus();
  831. var cbLastStatus=tLastScore.cbUserStatus;
  832. var pClientKernel = gClientKernel.get();
  833. //桌子离开
  834. if ((wLastTableID!=INVALID_TABLE)&&((wLastTableID!=wNowTableID)||(wLastChairID!=wNowChairID)))
  835. {
  836. var pITableUserItem = this.mTableViewFrame.GetClientUserItem(wLastTableID, wLastChairID);
  837. if (pITableUserItem == pIClientUserItem) this.mTableViewFrame.SetClientUserItem2(wLastTableID, wLastChairID, null);
  838. }
  839. //桌子加入
  840. if ((wNowTableID!=INVALID_TABLE)&&(cbNowStatus!=US_LOOKON)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID)))
  841. {
  842. this.mTableViewFrame.SetClientUserItem2(wNowTableID,wNowChairID,pIClientUserItem);
  843. }
  844. //桌子状态
  845. if ((this.mTableViewFrame.GetChairCount() < MAX_CHAIR)&&(wNowTableID!=INVALID_TABLE)&&(wNowTableID==wLastTableID)&&(wNowChairID==wLastChairID))
  846. {
  847. this.mTableViewFrame.UpdateTableView(wNowTableID);
  848. }
  849. //离开通知
  850. if ((wLastTableID!=INVALID_TABLE)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID))){
  851. //游戏通知
  852. if ((pIClientUserItem==this.mMeUserItem)||(wLastTableID==pMeUserInfo.wTableID)) {
  853. var UserStatus = new tagUserStatus();
  854. UserStatus.wTableID=wNowTableID;
  855. UserStatus.wChairID=wNowChairID;
  856. UserStatus.cbUserStatus=cbNowStatus;
  857. if (pClientKernel) pClientKernel.OnGFUserStatus(pUserInfo.dwUserID,UserStatus);
  858. }
  859. if (pIClientUserItem==this.mMeUserItem) {
  860. //设置变量
  861. mReqTableID=INVALID_TABLE;
  862. mReqChairID=INVALID_CHAIR;
  863. //快速模式的
  864. this.IntermitConnect(true);
  865. //TODO:
  866. //if (this.mIServerItemSink)
  867. // this.mIServerItemSink.OnGFServerClose("");
  868. }
  869. return;
  870. }
  871. //加入处理
  872. if ((wNowTableID!=INVALID_TABLE)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID)))
  873. {
  874. //自己判断
  875. if (this.mMeUserItem==pIClientUserItem)
  876. {
  877. //设置变量
  878. this.mReqTableID=INVALID_TABLE;
  879. this.mReqChairID=INVALID_CHAIR;
  880. if (pClientKernel==0){
  881. //启动进程
  882. if (!this.mIServerItemSink || !this.mIServerItemSink.CreateKernel()){
  883. this.OnGFGameClose(GameExitCode_CreateFailed);
  884. return;
  885. }
  886. } else {
  887. this.mMeUserItem = pIClientUserItem;
  888. IServerItem.get().OnGFGameReady();
  889. }
  890. }
  891. //游戏通知
  892. if ((this.mMeUserItem!=pIClientUserItem || this.mMeUserItem.GetUserStatus() == US_LOOKON)&&pMeUserInfo.wTableID==wNowTableID){
  893. if (pClientKernel) pClientKernel.OnGFUserEnter(pIClientUserItem);
  894. }
  895. return;
  896. }
  897. //状态改变
  898. if ((wNowTableID!=INVALID_TABLE)&&(wNowTableID==wLastTableID)&&(pMeUserInfo.wTableID==wNowTableID)){
  899. //游戏通知
  900. UserStatus = new tagUserStatus();
  901. UserStatus.wTableID=wNowTableID;
  902. UserStatus.wChairID=wNowChairID;
  903. UserStatus.cbUserStatus=cbNowStatus;
  904. if (pClientKernel) pClientKernel.OnGFUserStatus(pUserInfo.dwUserID,UserStatus);
  905. }
  906. },
  907. OnUserScoreUpdate: function(pIClientUserItem, UserScore) {
  908. // 获取客户端内核对象
  909. var pClientKernel = gClientKernel.get();
  910. // 如果客户端内核对象存在,则调用其OnGFUserScore方法更新用户分数
  911. if (pClientKernel) pClientKernel.OnGFUserScore(pIClientUserItem.GetUserID(), UserScore);
  912. },
  913. OnUserFlowerUpdate: function(pIClientUserItem, UserFlower) {
  914. // 获取客户端内核对象
  915. var pClientKernel = gClientKernel.get();
  916. // 如果客户端内核对象存在,则调用其OnGFUserFlower方法更新用户鲜花
  917. if (pClientKernel) pClientKernel.OnGFUserFlower(pIClientUserItem.GetUserID(), UserFlower);
  918. },
  919. OnUserItemUpdate:function(pIClientUserItem, LastStatus){
  920. //变量定义
  921. var pUserInfo=pIClientUserItem.GetUserInfo();
  922. var pMeUserInfo=this.mMeUserItem.GetUserInfo();
  923. var wNowTableID=pIClientUserItem.GetTableID();
  924. var wLastTableID=LastStatus.wTableID;
  925. var wNowChairID=pIClientUserItem.GetChairID();
  926. var wLastChairID=LastStatus.wChairID;
  927. var cbNowStatus=pIClientUserItem.GetUserStatus();
  928. var cbLastStatus=LastStatus.cbUserStatus;
  929. var pClientKernel = gClientKernel.get();
  930. if (this.mIServerItemSink)
  931. this.mIServerItemSink.OnGRUserUpdate(pIClientUserItem);
  932. //桌子离开
  933. if ((wLastTableID!=INVALID_TABLE)&&((wLastTableID!=wNowTableID)||(wLastChairID!=wNowChairID))){
  934. var pITableUserItem = this.mTableViewFrame.GetClientUserItem(wLastTableID, wLastChairID);
  935. if (pITableUserItem == pIClientUserItem) this.mTableViewFrame.SetClientUserItem2(wLastTableID, wLastChairID, null);
  936. }
  937. //桌子加入
  938. if ((wNowTableID!=INVALID_TABLE)&&(cbNowStatus!=US_LOOKON)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID)))
  939. {
  940. this.mTableViewFrame.SetClientUserItem2(wNowTableID,wNowChairID,pIClientUserItem);
  941. }
  942. //桌子状态
  943. if ((this.mTableViewFrame.GetChairCount() < MAX_CHAIR)&&(wNowTableID!=INVALID_TABLE)&&(wNowTableID==wLastTableID)&&(wNowChairID==wLastChairID)){
  944. this.mTableViewFrame.UpdateTableView(wNowTableID);
  945. }
  946. //离开通知
  947. if ((wLastTableID!=INVALID_TABLE)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID)))
  948. {
  949. //游戏通知
  950. if ((pIClientUserItem==this.mMeUserItem)||(wLastTableID==pMeUserInfo.wTableID)) {
  951. var UserStatus = new tagUserStatus();
  952. UserStatus.wTableID=wNowTableID;
  953. UserStatus.wChairID=wNowChairID;
  954. UserStatus.cbUserStatus=cbNowStatus;
  955. if (pClientKernel) pClientKernel.OnGFUserStatus(pUserInfo.dwUserID, UserStatus);
  956. }
  957. if (pIClientUserItem==this.mMeUserItem){ //设置变量
  958. this.mReqTableID=INVALID_TABLE;
  959. this.mReqChairID=INVALID_CHAIR;
  960. }
  961. return;
  962. }
  963. //加入处理
  964. if ((wNowTableID!=INVALID_TABLE)&&((wNowTableID!=wLastTableID)||(wNowChairID!=wLastChairID))){
  965. //自己判断
  966. if (this.mMeUserItem==pIClientUserItem){
  967. //设置变量
  968. this.mReqTableID=INVALID_TABLE;
  969. this.mReqChairID=INVALID_CHAIR;
  970. if (!pClientKernel) {
  971. //启动进程
  972. if (!this.mIServerItemSink || !this.mIServerItemSink.CreateKernel()){
  973. this.OnGFGameClose(GameExitCode_CreateFailed);
  974. return;
  975. }
  976. } else {
  977. this.mMeUserItem = pIClientUserItem;
  978. this.OnGFGameReady();
  979. }
  980. }
  981. //游戏通知
  982. if ((this.mMeUserItem!=pIClientUserItem || this.mMeUserItem.GetUserStatus() == US_LOOKON)&&(pMeUserInfo.wTableID==wNowTableID)){
  983. if (pClientKernel) pClientKernel.OnGFUserEnter(pIClientUserItem);
  984. }
  985. return;
  986. }
  987. //状态改变
  988. if ((wNowTableID!=INVALID_TABLE)&&(wNowTableID==wLastTableID)&&(pMeUserInfo.wTableID==wNowTableID)){
  989. //游戏通知
  990. var UserStatus = new tagUserStatus();
  991. UserStatus.wTableID=wNowTableID;
  992. UserStatus.wChairID=wNowChairID;
  993. UserStatus.cbUserStatus=cbNowStatus;
  994. if (pClientKernel) pClientKernel.OnGFUserStatus(pUserInfo.dwUserID,UserStatus);
  995. return;
  996. }
  997. return;
  998. },
  999. //用户状态
  1000. OnSocketSubUserStatus:function (data,dataSize) {
  1001. var pUserStatus = new CMD_GR_UserStatus();
  1002. //效验参数
  1003. if (dataSize<gCByte.Bytes2Str(pUserStatus, data)) return false;
  1004. //寻找用户
  1005. var pIClientUserItem=this.mUserManager.SearchUserByUserID(pUserStatus.dwUserID);
  1006. //用户判断
  1007. if (pIClientUserItem==0) return true;
  1008. //设置状态
  1009. if (pUserStatus.UserStatus.cbUserStatus==US_NULL) {
  1010. //删除用户
  1011. this.mUserManager.DeleteUserItem(pIClientUserItem);
  1012. }else{
  1013. //更新用户
  1014. this.mUserManager.UpdateUserItemStatus(pIClientUserItem, pUserStatus.UserStatus);
  1015. }
  1016. return true;
  1017. },
  1018. //发送坐下
  1019. SendSitDownPacket:function (wTableID, wChairID)
  1020. {
  1021. var UserSitDown = new CMD_GR_UserSitDown();
  1022. //构造数据
  1023. UserSitDown.wTableID = wTableID;
  1024. UserSitDown.wChairID = wChairID;
  1025. UserSitDown.szPassword = "";
  1026. console.log("坐下--SUB_GR_USER_SITDOWN")
  1027. this.SendSocketClass(MDM_GR_USER, SUB_GR_USER_SITDOWN, UserSitDown);
  1028. return true;
  1029. },
  1030. //游戏消息
  1031. //框架消息
  1032. OnSocketMainGameFrame:function (main,sub, data, dataSize){
  1033. if (!gClientKernel.get() || !this.mIsGameReady) return true;
  1034. return gClientKernel.get().OnGFEventSocket(main, sub, data, dataSize);
  1035. },
  1036. //发送起立
  1037. SendStandUpPacket:function (wTableID,wChairID,cbForceLeave)
  1038. {
  1039. //变量定义
  1040. var UserStandUp = new CMD_GR_UserStandUp();
  1041. //构造数据
  1042. UserStandUp.wTableID = wTableID;
  1043. UserStandUp.wChairID = wChairID;
  1044. UserStandUp.cbForceLeave = parseInt(cbForceLeave);
  1045. console.log("发送起立==");
  1046. //发送数据
  1047. this.SendSocketClass(MDM_GR_USER, SUB_GR_USER_STANDUP, UserStandUp);
  1048. return true;
  1049. },
  1050. ChangeTable:function(){
  1051. console.log("发送==换桌子");
  1052. this.IntermitConnect(true);
  1053. window.isJoinGame = true;
  1054. return;
  1055. // var UserStandUp = new CMD_GR_UserStandUp();
  1056. // this.SendSocketClass(MDM_GR_USER, SUB_GR_USER_CHAIR_REQ, UserStandUp);
  1057. }
  1058. });