CServerItem.js 46 KB

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