Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

1006 rindas
30 KiB

  1. require("luaScript.Protocol.ProtocolCommon")
  2. local defs = require("pk_nanchongdoudizhu.luaScript.Def_53")
  3. local Functions = require("pk_nanchongdoudizhu.luaScript.Functions_53")
  4. local Cmds = require("pk_nanchongdoudizhu.luaScript.Protocol.ProtocolCmd_53")
  5. local Messages = require("pk_nanchongdoudizhu.luaScript.Protocol.ProtocolMessage_53")
  6. local Room = class("Room" , require("luaScript.Protocol.ProtocolRoomBase"))
  7. --队列初始化
  8. local callbackQueue = {}
  9. local callbackRunning = true
  10. function Room:ctor(net)
  11. Room.super.ctor(self , net)
  12. -- GPS信息发生变化的时候主动给服务器发消息
  13. app:addEventListener("onUpdateLoctionSuccessed", handler(self, self.onGpsChangeRequest))
  14. --发送
  15. -- 请求准备
  16. self:defMsgFunc{name = "callReadyRequest" , cmd = Cmds.GAME_COMMAND_USER_READY}
  17. -- 玩家请求解散房间,获取其他玩家回复解散房间
  18. self:defMsgFunc{name = "dismissRoomRequest", cmd = Cmds.GAME_COMMAND_DISBAND_GAME, sender = Messages.DismissRequest}
  19. -- 离开房间
  20. self:defMsgFunc{name = "callLeaveRequest" , cmd = Cmds.GAME_COMMAND_USER_LEAVE}
  21. --接收
  22. -- 玩家进入桌子成功
  23. self:defPushMsg{cmd = Cmds.GAME_COMMAND_LOGIN_GAME_SUCCESS, reader = Messages.SitDownSuccessResponse, func = handler(self , self.onSitDownSuccessResponse)}
  24. -- 玩家进入桌子失败
  25. self:defPushMsg{cmd = Cmds.GAME_COMMAND_LOGIN_GAME_ERR, reader = Messages.SitDownFailedResponse, func = handler(self , self.onSitDownFailedResponse)}
  26. -- 断线重连
  27. self:defPushMsg{cmd = Cmds.GAME_COMMAND_GAME_RECONNECTION, reader = Messages.GameReconnection, func = handler(self, self.onGameReconnection)}
  28. -- 用户退出
  29. self:defPushMsg{cmd = Cmds.GAME_COMMAND_LOGOUT_GAME_SUCCESS, reader = Messages.UserExitResponse, func = handler(self , self.onUserExitResponse)}
  30. -- 其他玩家进入桌子
  31. self:defPushMsg{cmd = Cmds.GAME_COMMAND_BROADCAST_USER_LOGIN, reader = Messages.OtherSitDownResponse, func = handler(self , self.onOtherSitDownResponse)}
  32. -- 其他玩家掉线
  33. self:defPushMsg{cmd = Cmds.GAME_COMMAND_BROADCAST_USER_DROPPED, reader = Messages.OtherDroppedResponse, func = handler(self , self.onOtherDroppedResponse)}
  34. -- 其他玩家退出房间
  35. self:defPushMsg{cmd = Cmds.GAME_COMMAND_BROADCAST_USER_LOGOUT, reader = Messages.OtherLogoutResponse, func = handler(self , self.onOtherLogoutResponse)}
  36. -- 收到服务器下发的玩家准备状态
  37. self:defPushMsg{cmd = Cmds.GAME_COMMAND_BROADCAST_USER_READY, reader = Messages.IntPacket, func = handler(self , self.onUserReadyResponse)}
  38. -- 游戏开始
  39. self:defPushMsg{cmd = Cmds.cmd_0x8104, reader = Messages.cmd_0x8104_RespStructure, func = handler(self , self.cmd_0x8104_Resp)}
  40. -- 更新游戏状态
  41. self:defPushMsg{cmd = Cmds.cmd_0x8105, reader = Messages.cmd_0x8105_RespStructure, func = handler(self , self.cmd_0x8105_Resp)}
  42. -- 发牌
  43. self:defPushMsg{cmd = Cmds.cmd_0x8106, reader = Messages.cmd_0x8106_RespStructure, func = handler(self , self.cmd_0x8106_Resp)}
  44. -- 翻牌信息
  45. self:defPushMsg{cmd = Cmds.cmd_0x8117, reader = Messages.cmd_0x8117_RespStructure, func = handler(self , self.cmd_0x8117_Resp)}
  46. -- 选漂
  47. self:defPushMsg{cmd = Cmds.cmd_0x8115, reader = Messages.cmd_0x8115_RespStructure, func = handler(self , self.cmd_0x8115_Resp)}
  48. -- 漂结果
  49. self:defPushMsg{cmd = Cmds.cmd_0x8116, reader = Messages.cmd_0x8116_RespStructure, func = handler(self , self.cmd_0x8116_Resp)}
  50. -- 通知玩家是否选择闷抓
  51. self:defPushMsg{cmd = Cmds.cmd_0x8118, reader = Messages.cmd_0x8118_RespStructure, func = handler(self , self.cmd_0x8118_Resp)}
  52. -- 通知玩家闷抓结果
  53. self:defPushMsg{cmd = Cmds.cmd_0x8119, reader = Messages.cmd_0x8119_RespStructure, func = handler(self , self.cmd_0x8119_Resp)}
  54. -- 通知玩家是否闷拉
  55. self:defPushMsg{cmd = Cmds.cmd_0x811b, reader = Messages.cmd_0x811b_RespStructure, func = handler(self , self.cmd_0x811b_Resp)}
  56. -- 广播玩家闷拉结果
  57. self:defPushMsg{cmd = Cmds.cmd_0x811c, reader = Messages.cmd_0x811c_RespStructure, func = handler(self , self.cmd_0x811c_Resp)}
  58. -- 通知玩家叫分
  59. self:defPushMsg{cmd = Cmds.cmd_0x8108, reader = Messages.cmd_0x8108_RespStructure, func = handler(self , self.cmd_0x8108_Resp)}
  60. -- 广播叫分结果
  61. self:defPushMsg{cmd = Cmds.cmd_0x8109, reader = Messages.cmd_0x8109_RespStructure, func = handler(self , self.cmd_0x8109_Resp)}
  62. -- 叫分结果,将底牌发给地主
  63. self:defPushMsg{cmd = Cmds.cmd_0x810a, reader = Messages.cmd_0x810a_RespStructure, func = handler(self , self.cmd_0x810a_Resp)}
  64. -- 通知加倍
  65. self:defPushMsg{cmd = Cmds.cmd_0x810c, reader = Messages.cmd_0x810c_RespStructure, func = handler(self , self.cmd_0x810c_Resp)}
  66. -- 广播玩家加倍结果
  67. self:defPushMsg{cmd = Cmds.cmd_0x810d, reader = Messages.cmd_0x810d_RespStructure, func = handler(self , self.cmd_0x810d_Resp)}
  68. -- 玩家出牌轮次广播
  69. self:defPushMsg{cmd = Cmds.cmd_0x810e, reader = Messages.cmd_0x810e_RespStructure, func = handler(self , self.cmd_0x810e_Resp)}
  70. -- 玩家出牌错误
  71. self:defPushMsg{cmd = Cmds.cmd_0x810f, reader = Messages.cmd_0x810f_RespStructure, func = handler(self , self.cmd_0x810f_Resp)}
  72. -- 玩家出牌成功
  73. self:defPushMsg{cmd = Cmds.cmd_0x8110, reader = Messages.cmd_0x8110_RespStructure, func = handler(self , self.cmd_0x8110_Resp)}
  74. -- 倍率发生变化
  75. self:defPushMsg{cmd = Cmds.cmd_0x8111, reader = Messages.cmd_0x8111_RespStructure, func = handler(self , self.cmd_0x8111_Resp)}
  76. -- 小局结算
  77. self:defPushMsg{cmd = Cmds.cmd_0x8112, reader = Messages.cmd_0x8112_RespStructure, func = handler(self , self.cmd_0x8112_Resp)}
  78. -- 总结算
  79. self:defPushMsg{cmd = Cmds.cmd_0x8113, reader = Messages.cmd_0x8113_RespStructure, func = handler(self , self.cmd_0x8113_Resp)}
  80. -- 无人叫分重新洗牌
  81. self:defPushMsg{cmd = Cmds.cmd_0x8114, reader = Messages.cmd_0x8114_RespStructure, func = handler(self , self.cmd_0x8114_Resp)}
  82. -- 玩家收到解散房间的请求
  83. self:defPushMsg{cmd = Cmds.GAME_COMMAND_BROADCAST_DISBAND_GAME, reader = Messages.DismissResponse, func = handler(self , self.onDismissResponse)}
  84. -- 收到玩家申请解散房间
  85. self:defPushMsg{cmd = Cmds.GAME_COMMAND_DISBAND_GAME, reader = Messages.DismissResult, func = handler(self , self.onUserDismissResultResponse)}
  86. -- 收到玩家申请立即开局
  87. self:defPushMsg{cmd = Cmds.GAME_COMMAND_RESPONSE_EARLY_START, reader = Messages.EarlyStartResult, func = handler(self , self.onQuickStartResponse)}
  88. end
  89. -- 无人叫分重新洗牌
  90. function Room:cmd_0x8114_Resp(status, response)
  91. if not self.roomInfo then
  92. logD("self.roomInfo no exist,容错处理!")
  93. return
  94. end
  95. logD("Room:cmd_0x8114_Resp(), ", table.tostring(response))
  96. -- 发送广播通知
  97. self:dispatchEvent({name = "cmd_0x8114_Resp", response = response})
  98. end
  99. -- 总结算
  100. function Room:cmd_0x8113_Resp(status, response)
  101. if not self.roomInfo then
  102. logD("self.roomInfo no exist,容错处理!")
  103. return
  104. end
  105. logD("Room:cmd_0x8113_Resp(), ", table.tostring(response))
  106. self.roomInfo.isGameOver = 1
  107. self.roomInfo._GameOverInfo = response
  108. self.roomInfo._stopFlag = response.stopFlag
  109. -- 发送广播通知
  110. self:dispatchEvent({name = "cmd_0x8113_Resp", response = response})
  111. end
  112. -- 小局结算
  113. function Room:cmd_0x8112_Resp(status, response)
  114. if not self.roomInfo then
  115. logD("self.roomInfo no exist,容错处理!")
  116. return
  117. end
  118. logD("Room:cmd_0x8112_Resp(), ", table.tostring(response))
  119. self.roomInfo.isGameOver = response.isGameOver
  120. for _,v in pairs(response.memberList) do
  121. self.roomInfo.memberList[v.nUserId].nTotalScore = v.nTotalScore
  122. end
  123. -- 强制把操作数据添加到memberList里面,因为小结算直接用的发来的repsonse数据而不是self.roomInfo.memberList
  124. for _, v in pairs(response.memberOperateData) do
  125. response.memberList[v.nUserId].ext = v.ext
  126. response.memberList[v.nUserId].nMenZhuaState = v.nMenZhuaState
  127. response.memberList[v.nUserId].nMenLaState = v.nMenLaState
  128. response.memberList[v.nUserId].nDaoState = v.nDaoState
  129. response.memberList[v.nUserId].nLaState = v.nLaState
  130. response.memberList[v.nUserId].nPiaoState = v.nPiaoState
  131. end
  132. -- 发送广播通知
  133. self:dispatchEvent({name = "cmd_0x8112_Resp", response = response})
  134. end
  135. -- 倍率发生变化
  136. function Room:cmd_0x8111_Resp(status, response)
  137. if not self.roomInfo then
  138. logD("self.roomInfo no exist,容错处理!")
  139. return
  140. end
  141. logD("Room:cmd_0x8111_Resp(), ", table.tostring(response))
  142. self.roomInfo.nBombs = response.nBombs
  143. self.roomInfo.curAskLoard = response.baseScore
  144. -- 发送广播通知
  145. self:dispatchEvent({name = "cmd_0x8111_Resp", response = response})
  146. end
  147. -- 玩家出牌成功
  148. function Room:cmd_0x8110_Resp(status, response)
  149. if not self.roomInfo then
  150. logD("self.roomInfo no exist,容错处理!")
  151. return
  152. end
  153. logD("Room:cmd_0x8110_Resp(), ", table.tostring(response))
  154. -- 发送广播通知
  155. self:dispatchEvent({name = "cmd_0x8110_Resp", response = response})
  156. end
  157. -- 玩家出牌错误
  158. function Room:cmd_0x810f_Resp(status, response)
  159. if not self.roomInfo then
  160. logD("self.roomInfo no exist,容错处理!")
  161. return
  162. end
  163. logD("Room:cmd_0x810f_Resp(), ", table.tostring(response))
  164. -- 发送广播通知
  165. self:dispatchEvent({name = "cmd_0x810f_Resp", response = response})
  166. end
  167. -- 玩家出牌轮次广播
  168. function Room:cmd_0x810e_Resp(status, response)
  169. if not self.roomInfo then
  170. logD("self.roomInfo no exist,容错处理!")
  171. return
  172. end
  173. logD("Room:cmd_0x810e_Resp(), ", table.tostring(response))
  174. -- 发送广播通知
  175. self:dispatchEvent({name = "cmd_0x810e_Resp", response = response})
  176. end
  177. -- 广播玩家加倍结果
  178. function Room:cmd_0x810d_Resp(status, response)
  179. if not self.roomInfo then
  180. logD("self.roomInfo no exist,容错处理!")
  181. return
  182. end
  183. logD("Room:cmd_0x810d_Resp(), ", table.tostring(response))
  184. self.roomInfo.memberList[response.nUserId].askBei = response.askBei
  185. self.roomInfo.memberList[response.nUserId].nDaoState = response.askBei
  186. self.roomInfo.memberList[response.nUserId].nLaState = response.askBei
  187. -- 发送广播通知
  188. self:dispatchEvent({name = "cmd_0x810d_Resp", response = response})
  189. end
  190. -- 通知加倍
  191. function Room:cmd_0x810c_Resp(status, response)
  192. if not self.roomInfo then
  193. logD("self.roomInfo no exist,容错处理!")
  194. return
  195. end
  196. logD("Room:cmd_0x810c_Resp(), ", table.tostring(response))
  197. -- 发送广播通知
  198. self:dispatchEvent({name = "cmd_0x810c_Resp", response = response})
  199. end
  200. -- 叫分结果,将底牌发给地主
  201. function Room:cmd_0x810a_Resp(status, response)
  202. if not self.roomInfo then
  203. logD("self.roomInfo no exist,容错处理!")
  204. return
  205. end
  206. logD("Room:cmd_0x810a_Resp(), ", table.tostring(response))
  207. for k,v in pairs(response.Datas) do
  208. self.roomInfo[k] = v
  209. end
  210. -- 发送广播通知
  211. self:dispatchEvent({name = "cmd_0x810a_Resp", response = response})
  212. end
  213. -- 通知玩家叫分
  214. function Room:cmd_0x8108_Resp(status, response)
  215. if not self.roomInfo then
  216. logD("self.roomInfo no exist,容错处理!")
  217. return
  218. end
  219. logD("Room:cmd_0x8108_Resp(), ", table.tostring(response))
  220. self.roomInfo.memberList[response.nUserId].askLoard = response.askLoard
  221. -- 发送广播通知
  222. self:dispatchEvent({name = "cmd_0x8108_Resp", response = response})
  223. end
  224. -- 发牌
  225. function Room:cmd_0x8106_Resp(status, response)
  226. if not self.roomInfo then
  227. logD("self.roomInfo no exist,容错处理!")
  228. return
  229. end
  230. logD("Room:cmd_0x8106_Resp(), ", table.tostring(response))
  231. self.roomInfo.memberList[response.nUserId].handCards = response.handCards
  232. -- 发送广播通知
  233. self:dispatchEvent({name = "cmd_0x8106_Resp"})
  234. end
  235. -- 翻牌信息
  236. function Room:cmd_0x8117_Resp(status, response)
  237. if not self.roomInfo then
  238. logD("self.roomInfo no exist,容错处理!")
  239. return
  240. end
  241. logD("Room:cmd_0x8117_Resp(), ", table.tostring(response))
  242. self.roomInfo.nGameStartCount = response.Datas.nGameStartCount
  243. -- 发送广播通知
  244. self:dispatchEvent({name = "cmd_0x8117_Resp", response = response})
  245. end
  246. -- 选漂
  247. function Room:cmd_0x8115_Resp(status, response)
  248. if not self.roomInfo then
  249. logD("self.roomInfo no exist,容错处理!")
  250. return
  251. end
  252. logD("Room:cmd_0x8115_Resp(), ", table.tostring(response))
  253. self.roomInfo.nGameStartCount = response.Datas.nGameStartCount
  254. -- 发送广播通知
  255. self:dispatchEvent({name = "cmd_0x8115_Resp", response = response})
  256. end
  257. -- 漂结果
  258. function Room:cmd_0x8116_Resp(status, response)
  259. if not self.roomInfo then
  260. logD("self.roomInfo no exist,容错处理!")
  261. return
  262. end
  263. logD("Room:cmd_0x8116_Resp(), ", table.tostring(response))
  264. self.roomInfo.memberList[response.nUserId].nPiaoState = response.nPiaoState
  265. -- 发送广播通知
  266. self:dispatchEvent({name = "cmd_0x8116_Resp", response = response})
  267. end
  268. -- 通知玩家是否选择闷抓
  269. function Room:cmd_0x8118_Resp(status, response)
  270. if not self.roomInfo then
  271. logD("self.roomInfo no exist,容错处理!")
  272. return
  273. end
  274. logD("Room:cmd_0x8118_Resp(), ", table.tostring(response))
  275. -- 通知闷抓,重置数据
  276. if response.nMenZhuaState <= defs.MEN_STATE.MEN_STATE_ZHUAI then
  277. self.roomInfo.menZhuaUserId = 0
  278. end
  279. -- 发送广播通知
  280. self:dispatchEvent({name = "cmd_0x8118_Resp", response = response})
  281. end
  282. -- 广播玩家闷抓结果
  283. function Room:cmd_0x8119_Resp(status, response)
  284. if not self.roomInfo then
  285. logD("self.roomInfo no exist,容错处理!")
  286. return
  287. end
  288. logD("Room:cmd_0x8119_Resp(), ", table.tostring(response))
  289. -- 记录闷抓的玩家
  290. if response.nMenZhuaState == defs.MEN_STATE.MEN_STATE_ZHUAI then
  291. self.roomInfo.menZhuaUserId = response.nUserId
  292. end
  293. -- 记录闷倒的玩家,保存到自己的内容
  294. self.roomInfo.memberList[response.nUserId].nMenZhuaState = response.nMenZhuaState
  295. -- 发送广播通知
  296. self:dispatchEvent({name = "cmd_0x8119_Resp", response = response})
  297. end
  298. -- 通知玩家是否闷拉
  299. function Room:cmd_0x811b_Resp(status, response)
  300. if not self.roomInfo then
  301. logD("self.roomInfo no exist,容错处理!")
  302. return
  303. end
  304. logD("Room:cmd_0x811b_Resp(), ", table.tostring(response))
  305. -- 发送广播通知
  306. self:dispatchEvent({name = "cmd_0x811b_Resp", response = response})
  307. end
  308. -- 广播玩家闷拉结果
  309. function Room:cmd_0x811c_Resp(status, response)
  310. if not self.roomInfo then
  311. logD("self.roomInfo no exist,容错处理!")
  312. return
  313. end
  314. logD("Room:cmd_0x811c_Resp(), ", table.tostring(response))
  315. -- 记录闷倒的玩家,保存到自己的内容内
  316. self.roomInfo.memberList[response.nUserId].nMenLaState = response.nMenLaState
  317. -- 发送广播通知
  318. self:dispatchEvent({name = "cmd_0x811c_Resp", response = response})
  319. end
  320. -- 更新游戏状态
  321. function Room:cmd_0x8105_Resp(status, response)
  322. if not self.roomInfo then
  323. logD("self.roomInfo no exist,容错处理!")
  324. return
  325. end
  326. logD("Room:cmd_0x8105_Resp(), ", table.tostring(response))
  327. self.roomInfo.nStatus = response.nStatus
  328. -- 发送广播通知
  329. self:dispatchEvent({name = "cmd_0x8105_Resp", response = response})
  330. end
  331. -- 游戏开始
  332. function Room:cmd_0x8104_Resp(status, response)
  333. if not self.roomInfo then
  334. logD("self.roomInfo no exist,容错处理!")
  335. return
  336. end
  337. logD("Room:cmd_0x8104_Resp(), ", table.tostring(response))
  338. for k,v in pairs(response.Datas) do
  339. self.roomInfo[k] = v
  340. end
  341. --重置准备状态
  342. for _,v in pairs(self.roomInfo.memberList) do
  343. v.nPlayerFlag = 0
  344. end
  345. --重置叫分
  346. self.roomInfo.curAskLoard = 0
  347. -- 发送广播通知
  348. self:dispatchEvent({name = "cmd_0x8104_Resp", response = response})
  349. end
  350. -- 广播叫分结果
  351. function Room:cmd_0x8109_Resp(status, response)
  352. if not self.roomInfo then
  353. logD("self.roomInfo no exist,容错处理!")
  354. return
  355. end
  356. logD("Room:cmd_0x8109_Resp(), ", table.tostring(response))
  357. if response.askLoard ~= 0 then
  358. self.roomInfo.curAskLoard = response.askLoard
  359. end
  360. -- 发送广播通知
  361. self:dispatchEvent({name = "cmd_0x8109_Resp", response = response})
  362. end
  363. --8012
  364. function Room:onDismissResponse(status, response)
  365. --[[-- nUserId
  366. , defVar("nUserId", VT_Int, 0)
  367. -- 1: 表示发起解散 2:同意解散 3:不同意解散
  368. , defVar("operateType", VT_UChar, 0)
  369. -- 剩余解散超时时间
  370. , defVar("timeLeft", VT_Short, 0) --]]
  371. if not self.roomInfo then
  372. logD("self.roomInfo no exist,容错处理!")
  373. return
  374. end
  375. local nUserId = response.nUserId
  376. local operateType = response.operateType
  377. -- 收到玩家发起请求时,数据重置
  378. if response.operateType == 1 then
  379. self:resetDismissData()
  380. end
  381. --数据记录
  382. self.dismissInfo[nUserId] = operateType
  383. self:dispatchEvent({name = "onDismissResponse", response = response})
  384. end
  385. -- 发起请求回复 8011
  386. function Room:onUserDismissResultResponse(status, response)
  387. logD("User:onUserDismissResultResponse, ", table.tostring(response))
  388. if not self.roomInfo then
  389. logD("self.roomInfo no exist,容错处理!")
  390. return
  391. end
  392. --[[
  393. -- 0:成功
  394. -- 1:operateType取值范围不对
  395. -- 2:当前没人发起解散
  396. -- 3:已经有人申请解散
  397. , defVar("errorCode", VT_Short, 0)
  398. -- 玩家操作
  399. , defVar("operateType", VT_Int, 0)
  400. -- 桌子上其他用户数量
  401. , defVar("memberList", VT_VectorToMap(UserDismissResult, "nUserId"))
  402. -- 剩余解散超时时间
  403. , defVar("timeLeft", VT_Short, 0) --]]
  404. logD("30000000--runUserDismissResultResponse")
  405. if response.errorCode == 1 then
  406. showTooltip("operateType取值范围不对")
  407. elseif response.errorCode == 2 then
  408. showTooltip("当前没人发起解散")
  409. elseif response.errorCode == 3 then
  410. showTooltip("已经有人申请解散")
  411. elseif response.errorCode == 4 then
  412. showTooltip("用户已经操作过")
  413. else
  414. -- 其他玩家的解散状态
  415. for uid, value in pairs(response.memberList) do
  416. self.dismissInfo[uid] = value.dismissState
  417. end
  418. self:dispatchEvent({name = "onDismissResponse", response = response})
  419. end
  420. end
  421. -- 服务器下发玩家GPS数据发生变化
  422. function Room:onGpsChangeResponse(status, response)
  423. print("Room:onGpsChangeResponse()", table.tostring(response))
  424. --[[
  425. --server收到0x8060协议后,广播当前桌子上所有用户
  426. ServerChangeUserInfo = defClass("ServerChangeUserInfo"
  427. --更新信息的用户uid
  428. , defVar("uid", VT_Int, -1)
  429. --用户信息
  430. , defVar("userInfo", VT_String, "")
  431. --保留字段,暂不使用
  432. , defVar("reserved", VT_String, "")
  433. )
  434. --]]
  435. print("Room:onGpsChangeResponse()", table.tostring(response))
  436. local nUserId = response.uid
  437. local memberInfo = self.roomInfo.memberList[nUserId]
  438. if memberInfo then
  439. memberInfo.userInfo = response.userInfo
  440. end
  441. self:dispatchEvent({name = "onGpsChangeResponse", nUserId = nUserId})
  442. end
  443. --辅助查找
  444. -- 通过玩家逻辑椅子号找到玩家ID
  445. function Room:getUserIdBySeatId(seatId)
  446. return self.seatList[seatId]
  447. end
  448. -- 通过玩家视图椅子号找到玩家ID
  449. function Room:getUserIdByViewId(seatShowId)
  450. return self.seatShowList[seatShowId]
  451. end
  452. -- 通过玩家逻辑椅子号找到视图椅子号
  453. function Room:getViewIdBySeatId(nSeatId)
  454. local userid = self:getUserIdBySeatId(nSeatId)
  455. return self:getViewIdByUserId(userid)
  456. end
  457. -- 通过玩家视图椅子号找到逻辑椅子号
  458. function Room:getSeatIdByViewId(nViewId)
  459. local userid = self:getUserIdByViewId(nViewId)
  460. for seatId,nUserId in pairs(self.seatList) do
  461. if userid == nUserId then
  462. return seatId
  463. end
  464. end
  465. end
  466. -- return table of userInfo, not string
  467. function Room:getUserInfo(nUserId)
  468. if self.roomInfo.memberList[nUserId] then
  469. return json.decode(self.roomInfo.memberList[nUserId].userInfo)
  470. else
  471. return nil
  472. end
  473. end
  474. -- 发起请求立即开局
  475. function Room:requestQuickStart(opType)
  476. --0初始状态 1申请开始游戏 2同意开始游戏 3不同意开始游戏
  477. local request = Messages.EarlyStartRequest:new()
  478. request.optType = opType
  479. self:sendResponse{cmd = Cmds.GAME_COMMAND_REQUEST_EARLY_START , sender = request}
  480. end
  481. -- 立即开局结果
  482. function Room:onQuickStartResponse(status, response)
  483. if not self.roomInfo then
  484. logD("self.roomInfo no exist,容错处理!")
  485. return
  486. end
  487. self.nleftStartGameTimeout = response.nleftStartGameTimeout
  488. self.quickStartInfo = {}
  489. for i,v in pairs(response.earlyStartPlayerInfo) do
  490. self.quickStartInfo[v.nUserId] = v.optType
  491. end
  492. self:dispatchEvent({name = "onQuickStartResponse", response = response})
  493. end
  494. function Room:resetDismissData()
  495. --玩家解散数据(userId 为Key,解散类型为value)
  496. self.dismissInfo = {}
  497. --解散总时间
  498. self.roomInfo.nDismissToTalTime = nil
  499. -- 解散倒计时
  500. self.roomInfo.nDismissStateTime = nil
  501. -- 解散显示
  502. self.roomInfo.nShowDismiss = false
  503. end
  504. function Room:initRoomInfo()
  505. self.roomInfo = {}
  506. self.seatShowList = {}
  507. self:resetDismissData()
  508. --手牌数据
  509. self.cards = {}
  510. end
  511. -- 通知服务器玩家GPS数据发生变化
  512. function Room:onGpsChangeRequest()
  513. print("Room:onUserInfoChangeRequest()")
  514. local request = StringPacket:new()
  515. request.stringValue = app.user.userInfo or ""
  516. logD("Room:onGpsChangeRequest()", table.tostring(request))
  517. self:sendResponse{cmd = Cmds.GAME_COMMAND_CLIENT_CHANGE_USERINFO , sender = request}
  518. end
  519. -- 玩家进入桌子成功
  520. function Room:onSitDownSuccessResponse(status, response)
  521. logD("--------------------玩家进入桌子成功--------------------")
  522. logD("Room:onSitDownSuccessResponse(), ", table.tostring(response))
  523. app.net:onMsgClear()
  524. app.net:onMsgPause()
  525. -- 记录当前桌子号
  526. self:initRoomInfo()
  527. -- 获取到的房间信息
  528. for k,v in pairs(response.Datas) do
  529. self.roomInfo[k] = v
  530. end
  531. --设置默认数据
  532. self.roomInfo.nGameStartCount = self.roomInfo.nGameStartCount or 0
  533. local gameinfo = json.decode(self.roomInfo.strGameInfo)
  534. self.roomInfo.gameinfo = gameinfo
  535. --俱乐部标志
  536. self.roomInfo.clubId = gameinfo.clubId
  537. -- 更新椅子号
  538. self:updateUserSeateShowId()
  539. logD("Room:onSitDownSuccessResponse() roomInfo = ", table.tostring(self.roomInfo))
  540. -- 发送通知
  541. self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.NanChongDouDiZhu, gameType = gameinfo.gamerule})
  542. end
  543. -- 玩家进入桌子失败
  544. function Room:onSitDownFailedResponse(status, response)
  545. logD("--------------------玩家进入桌子失败--------------------")
  546. app.waitDialogManager:closeWaitNetworkDialog()
  547. local errorCode = response.nErrorCode
  548. local errorString = ENTER_ROOM_RET_STR[errorCode] or string.format("坐下失败 errorCode = %s", errorCode)
  549. showTooltip(errorString)
  550. end
  551. function Room:getMyRecordUserId()
  552. local myUserId = app.user.loginInfo.uid
  553. local minID = 0
  554. local isFind = false
  555. for k,v in pairsByKeys(self.roomInfo.memberList) do
  556. if myUserId == v.nUserId then
  557. return myUserId
  558. end
  559. if not isFind then
  560. minID = v.nUserId
  561. isFind = true
  562. end
  563. end
  564. return minID
  565. end
  566. -- 检查此桌是否有此ID玩家
  567. function Room:checkUserIDIsInTable(nUserId)
  568. if self.roomInfo.memberList then
  569. local memberInfo = self.roomInfo.memberList[nUserId]
  570. if memberInfo then
  571. return true
  572. else
  573. return false
  574. end
  575. else
  576. return false
  577. end
  578. end
  579. -- 获取桌子上实际人数
  580. function Room:getActualPlayerNum()
  581. local playernum = 0
  582. for i,v in pairs(self.roomInfo.memberList) do
  583. if self:checkUserIDIsInTable(i) then
  584. playernum = playernum + 1
  585. end
  586. end
  587. return playernum
  588. end
  589. -- 更新玩家的相对椅子号
  590. function Room:updateUserSeateShowId()
  591. local myUserId = self:getMyRecordUserId()
  592. local mySeatId = self.roomInfo.memberList[myUserId].nSeatId
  593. self.roomInfo.nUserId = myUserId
  594. self.roomInfo.nSeatId = mySeatId
  595. local serverSeatToViewSeat = {
  596. [4] = {
  597. [0] = 4,
  598. [1] = 1,
  599. [2] = 2,
  600. [3] = 3,
  601. },
  602. [3] = {
  603. [0] = 4,
  604. [1] = 1,
  605. [2] = 3,
  606. },
  607. [2] = {
  608. [0] = 4,
  609. [1] = 2,
  610. }
  611. }
  612. self.seatList = {}
  613. self.userList = {}
  614. self.seatShowList = {}
  615. for k,v in pairs(self.roomInfo.memberList) do
  616. local relativeSeat = (v.nSeatId - mySeatId + self.roomInfo.nMaxPlayCount) % self.roomInfo.nMaxPlayCount
  617. local nSeatShowId = serverSeatToViewSeat[self.roomInfo.nMaxPlayCount][relativeSeat]
  618. self.seatShowList[nSeatShowId] = v.nUserId
  619. self.userList[v.nUserId] = nSeatShowId
  620. self.seatList[v.nSeatId] = v.nUserId
  621. end
  622. logD("User:updateUserSeateShowId(),seatShowList", table.tostring(self.seatShowList))
  623. logD("User:updateUserSeateShowId(),seatList ", table.tostring(self.seatList))
  624. logD("User:updateUserSeateShowId(),userList ", table.tostring(self.userList))
  625. end
  626. --断线重连
  627. function Room:onGameReconnection(status,response)
  628. logD("===============重连成功,清空之前所有存在的队列==================")
  629. app.net:onMsgClear()
  630. app.net:onMsgPause()
  631. logD(" = ", table.tostring(response))
  632. self:initRoomInfo()
  633. -- 获取到的房间信息
  634. for k,v in pairs(response.Datas) do
  635. self.roomInfo[k] = v
  636. end
  637. local gameinfo = json.decode(self.roomInfo.strGameInfo)
  638. self.roomInfo.gameinfo = gameinfo
  639. --俱乐部标志
  640. self.roomInfo.clubId = gameinfo.clubId
  641. --当前叫分
  642. self.roomInfo.curAskLoard = 1
  643. for k,v in pairs(self.roomInfo.memberList) do
  644. --最大叫分
  645. if v.askLoard > self.roomInfo.curAskLoard then
  646. self.roomInfo.curAskLoard = v.askLoard
  647. end
  648. -- 记录闷抓的玩家
  649. if v.nMenZhuaState == defs.MEN_STATE.MEN_STATE_ZHUAI then
  650. self.roomInfo.menZhuaUserId = v.nUserId
  651. end
  652. --加倍状态
  653. v.askBei = v.bAskBei == 1 and v.askBei == 2 and 1 or 0
  654. end
  655. -- 更新椅子号
  656. self:updateUserSeateShowId()
  657. --小局结算
  658. if self.roomInfo.nStatus == defs.GAME_STATUS.ROUND_OVER then
  659. local myMemberInfo = self.roomInfo.memberList[self:getMyUserId()]
  660. --已经准备,则重置一些状态
  661. if myMemberInfo.nPlayerFlag == 1 then
  662. --庄家
  663. self.roomInfo.nBankerId = 0
  664. --玩家数据
  665. for k,v in pairs(self.roomInfo.memberList) do
  666. --加倍状态
  667. v.askBei = 0
  668. --手牌
  669. v.handCards.Datas = {}
  670. end
  671. end
  672. end
  673. -- 发送通知
  674. self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.NanChongDouDiZhu, gameType = gameinfo.gamerule})
  675. end
  676. -- 通过玩家ID获取玩家展示的座位号
  677. function Room:getViewIdByUserId(nUserId)
  678. return self.userList[nUserId]
  679. end
  680. -- 我发起请求解散房间
  681. function Room:requestDismissRoom(opType)
  682. --1: 表示发起解散 2:同意解散 3:不同意解散
  683. local request = Messages.DismissRequest:new()
  684. request.operateType = opType
  685. self:sendResponse{cmd = Cmds.GAME_COMMAND_DISBAND_GAME , sender = request}
  686. end
  687. function Room:onUserExitResponse(status, response)
  688. logD("Room:onUserExitResponse(), ", table.tostring(response))
  689. if not self.roomInfo then
  690. logD("self.roomInfo no exist, 容错处理!")
  691. return
  692. end
  693. local ttExtInfo = string.split(response.userInfo, ",")
  694. app.user.loginInfo.historyCardNum = ttExtInfo[1]
  695. app.user.loginInfo.curCardNum = ttExtInfo[2]
  696. self:dispatchEvent({name = "onUserExitResponseRoom",response = response})
  697. end
  698. -- 其他玩家进入桌子
  699. function Room:onOtherSitDownResponse(status, response)
  700. logD("Room:onOtherSitDownResponse(), response = ", table.tostring(response))
  701. if not self.roomInfo then
  702. logD("self.roomInfo no exist,容错处理!")
  703. return
  704. end
  705. self.roomInfo.memberList[response.nUserId] = response
  706. -- 更新椅子号
  707. self:updateUserSeateShowId()
  708. -- 发送广播通知,某个位置有人坐下了
  709. self:dispatchEvent({name = "onOtherSitDownResponse", response = response})
  710. end
  711. -- 其他玩家是否掉线
  712. function Room:onOtherDroppedResponse(status, response)
  713. logD("User:onOtherDroppedResponse(), response = ", table.tostring(response))
  714. local memberInfo = self.roomInfo.memberList[response.nUserId]
  715. if memberInfo then
  716. memberInfo.nOnlineStatus = response.nOnlineStatus
  717. end
  718. self:dispatchEvent({name = "onOtherDroppedResponse", response = response})
  719. end
  720. -- 其他玩家退出房间
  721. function Room:onOtherLogoutResponse(status, response)
  722. logD("Room:onOtherLogoutResponse(), response = ", table.tostring(response))
  723. if not self.roomInfo then
  724. logD("self.roomInfo no exist,容错处理!")
  725. return
  726. end
  727. --已开局玩家不可退出(不做处理)
  728. if (self.roomInfo.nGameStartCount or 0) > 0 then
  729. logD("onOtherLogoutResponse 已开局玩家不可退出")
  730. return
  731. end
  732. response.viewId = self:getViewIdByUserId(response.nUserId)
  733. self.roomInfo.memberList[response.nUserId] = nil
  734. self:dispatchEvent({name = "onOtherLogoutResponse", response = response})
  735. end
  736. -- 服务器下发玩家的准备状态
  737. function Room:onUserReadyResponse(status, response)
  738. logD("Room:onUserReadyResponse(), ", table.tostring(response))
  739. if not self.roomInfo then
  740. logD("self.roomInfo no exist,容错处理!")
  741. return
  742. end
  743. if response.nUserId == self:getMyUserId() then
  744. --重置庄家
  745. self.roomInfo.nBankerId = 0
  746. --重置炸弹数量
  747. self.roomInfo.nBombs = 0
  748. --重置加倍
  749. for k,v in pairs(self.roomInfo.memberList) do
  750. v.askBei = 0
  751. v.nDaoState = -1
  752. v.nMenLaState = -1
  753. v.nDaoState = -1
  754. v.nLaState = -1
  755. end
  756. end
  757. --标记准备了
  758. self.roomInfo.memberList[response.nUserId].nPlayerFlag = 1
  759. self:dispatchEvent({name = "onUserReadyResponse", response = response})
  760. end
  761. function Room:getMyUserId()
  762. return self:getUserIdByViewId(defs.VIEW_ID.MY_VIEW_ID)
  763. end
  764. -- 玩家地主选择(抓)
  765. function Room:sendAskLoard(askLoard)
  766. local request = Messages.AskLoard:new()
  767. request.askLoard = askLoard
  768. self:sendResponse{cmd = Cmds.cmd_0x8109 , sender = request}
  769. print('发送抓', askLoard)
  770. end
  771. -- 玩家加倍选择(倒or拉)
  772. function Room:sendAskBeiOrLa(askBeiOrLa)
  773. local request = Messages.AskBei:new()
  774. request.askBei = askBeiOrLa
  775. self:sendResponse{cmd = Cmds.cmd_0x810d , sender = request}
  776. print('发送倒or拉(可看枚举defs.DAO_STATE)', askBeiOrLa)
  777. end
  778. -- 玩家飘选择
  779. function Room:sendPiao(piao)
  780. local request = Messages.cmd_0x811e_RespStructure:new()
  781. request.choosePiao = piao
  782. self:sendResponse{cmd = Cmds.cmd_0x811e , sender = request}
  783. print('发送飘', piao)
  784. end
  785. -- 玩家闷抓/闷倒选择
  786. function Room:sendMenZhuaOrMenDao(menZhua)
  787. local request = Messages.cmd_0x811a_RespStructure:new()
  788. request.nMenZhua = menZhua
  789. self:sendResponse{cmd = Cmds.cmd_0x811a , sender = request}
  790. print('发送闷抓or闷倒(可看枚举defs.MEN_STATE)', menZhua)
  791. end
  792. -- 玩家闷拉选择
  793. function Room:sendMenLa(menLa)
  794. local request = Messages.cmd_0x811d_RespStructure:new()
  795. request.nMenLa = menLa
  796. self:sendResponse{cmd = Cmds.cmd_0x811d , sender = request}
  797. print('发送闷拉', menLa)
  798. end
  799. function Room:sendOperation(data)
  800. local request = Messages.Operation:new()
  801. request.opType = data.opType
  802. for _,v in ipairs(data.cards) do
  803. table.insert(request.cards.Datas, v)
  804. end
  805. for _, v in ipairs(data.lzCards) do
  806. table.insert(request.lzCards.Datas, v)
  807. end
  808. self:sendResponse{cmd = Cmds.cmd_0x810f , sender = request}
  809. end
  810. return Room