You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

898 lines
30 KiB

  1. -- 合江跑得快消息处理
  2. local PdkCmd = require("pk_hejiangpdk.luaScript.Protocol.hejiangPdkCmd")
  3. local PdkMessage = require("pk_hejiangpdk.luaScript.Protocol.hejiangPdkMessage")
  4. local EVENT_PRE= "hejiangPaoDeKuai_"
  5. require("luaScript.GameTypeDef")
  6. local Room = class("Room" , require("luaScript.Protocol.ProtocolRoomBase"))
  7. function Room:ctor(net)
  8. Room.super.ctor(self , net);
  9. --是否为断线重连
  10. self.isReconnection = false
  11. self.isGameOver = false
  12. -- 兼容俱乐部需要
  13. self.roomInfo = {}
  14. self.roomInfo.memberList = {}
  15. self:registeRequest()
  16. self:registeResponse()
  17. self:resetDismissData()
  18. end
  19. -- 通过玩家逻辑椅子号找到玩家ID
  20. function Room:getUserIdBySeatId(nSeatId)
  21. local p = self:getPlayerCid(nSeatId)
  22. if p then return p.userId end
  23. return nil
  24. end
  25. -- 通过玩家视图椅子号找到玩家ID
  26. function Room:getUserIdByViewId(nViewId)
  27. local p = self:getPlayerVpos(nViewId)
  28. if p then return p.userId end
  29. return nil
  30. end
  31. -- 通过玩家ID获取玩家展示的座位号
  32. function Room:getViewIdByUserId(nUserId)
  33. if self:getPlayer(nUserId) then return self:getPlayer(nUserId).viewPos end
  34. return nil
  35. end
  36. -- 通过玩家逻辑椅子号找到视图椅子号
  37. function Room:getViewIdBySeatId(nSeatId)
  38. local p = self:getPlayerCid(nSeatId)
  39. if p then return p.viewPos end
  40. return nil
  41. end
  42. -- 通过玩家ID找到逻辑椅子号
  43. function Room:getSeatIdByUserId(nViewId)
  44. local p = self:getPlayerVpos(nViewId)
  45. if p then return p.userId end
  46. return nil
  47. end
  48. -- 通过玩家视图椅子号找到逻辑椅子号
  49. function Room:getSeatIdByViewId(nUserId)
  50. local p = self:getPlayerVpos(nUserId)
  51. if p then return p.viewPos end
  52. return nil
  53. end
  54. -- 获取房间内的用户信息
  55. function Room:getUserInfo(uid)
  56. if self:getPlayer(uid) then
  57. return self:getPlayer(uid).jsonInfo
  58. end
  59. return nil
  60. end
  61. -- 缓存房间信息
  62. function Room:setRoomInfo( roominfo )
  63. self.roomInfo = self.roomInfo or {}
  64. for k,v in pairs(roominfo) do
  65. self.roomInfo[k] = v
  66. end
  67. end
  68. -- 获取房间信息
  69. function Room:getRoomInfo()
  70. return self.roomInfo
  71. end
  72. -- 设置当前房间轮次
  73. function Room:setCurTurn( pos )
  74. self.roomInfo.curTurn = pos
  75. end
  76. -- 获取当前房价轮次
  77. function Room:getNextTurn()
  78. local MaxCount = self:getRoomInfo().nMaxPlayCount
  79. if MaxCount == 4 then
  80. if self.roomInfo.curTurn == 4 then
  81. return 1
  82. else
  83. return self.roomInfo.curTurn+1
  84. end
  85. elseif MaxCount == 3 then
  86. if self.roomInfo.curTurn == 3 then
  87. return 1
  88. else
  89. return self.roomInfo.curTurn+1
  90. end
  91. else
  92. if self.roomInfo.curTurn == 2 then
  93. return 1
  94. else
  95. return self.roomInfo.curTurn+1
  96. end
  97. end
  98. end
  99. -- 获取当前玩家的上家
  100. function Room:getPreSeatId( cid )
  101. local MaxCount = self:getRoomInfo().nMaxPlayCount
  102. if MaxCount == 4 then
  103. if cid == 0 then
  104. return 3
  105. else
  106. return cid-1
  107. end
  108. elseif MaxCount == 3 then
  109. if cid == 0 then
  110. return 2
  111. else
  112. return cid-1
  113. end
  114. else
  115. if cid == 0 then
  116. return 1
  117. else
  118. return cid-1
  119. end
  120. end
  121. end
  122. -- 添加玩家,如果玩家存在则更新数据
  123. -- key - value 缓存
  124. function Room:addPlayer( pl )--and update
  125. self._players = self._players or {}
  126. local player = self._players[tostring(pl.userId)]
  127. if player then
  128. for k,v in pairs(pl) do
  129. player[k] = v
  130. end
  131. else
  132. self._players[tostring(pl.userId)] = pl
  133. end
  134. end
  135. -- 删除玩家
  136. function Room:delPlayer( uid )
  137. local player = self._players[tostring(uid)]
  138. if player then
  139. self._players[tostring(uid)] = nil
  140. end
  141. end
  142. -- 获取玩家
  143. function Room:getPlayer( uid )
  144. local player = self._players[tostring(uid)]
  145. return player
  146. end
  147. -- 根据座位号获取玩家数据
  148. function Room:getPlayerCid( cid )
  149. for _,v in pairs(self._players) do
  150. if v.seatId == cid then
  151. return v
  152. end
  153. end
  154. return nil
  155. end
  156. -- 根据视角获取玩家数据
  157. function Room:getPlayerVpos( viewPos )
  158. for _,v in pairs(self._players) do
  159. if v.viewPos == viewPos then
  160. return v
  161. end
  162. end
  163. return nil
  164. end
  165. -- 获取所有玩家
  166. function Room:getPlayers()
  167. return self._players or {}
  168. end
  169. -- 获取玩家数量
  170. function Room:getPlayerNum()
  171. local count = 0
  172. for _,_ in pairs(self._players) do
  173. count = count + 1
  174. end
  175. return count
  176. end
  177. -- 获取玩家信息用于GPS
  178. function Room:getUserInfoList()
  179. local userInfoList = {}
  180. for k,v in pairs(self._players) do
  181. userInfoList[v.userId] = {nSeatId=v.seatId, userInfo=v.jsonInfo}
  182. end
  183. return userInfoList
  184. end
  185. -- 根据id判断是否是自己
  186. function Room:isMyself( uid )
  187. return tonumber(app.user.loginInfo.uid) == tonumber(uid)
  188. end
  189. -- 获取自己信息
  190. function Room:getMyself()
  191. return self._players[tostring(app.user.loginInfo.uid)]
  192. end
  193. -- 获取模式牌张数
  194. function Room:getRuleCardsNum()
  195. local gameInfo = self:getRoomInfo().nGameInfo
  196. local data = json.decode(gameInfo)
  197. local allCards = 0
  198. if tonumber(data.gamerule) == 1 then --经典
  199. allCards = 16
  200. else--十五张
  201. allCards = 15
  202. end
  203. return allCards
  204. end
  205. -- 视角转换
  206. function Room:transPos( pos )
  207. local myself = self:getMyself()
  208. local MaxCount = self:getRoomInfo().nMaxPlayCount or 4
  209. local showPos = 0
  210. local myPos = myself.seatId
  211. if myPos <= pos then
  212. showPos = pos - myPos
  213. elseif myPos > pos then
  214. showPos = MaxCount - myPos + pos
  215. end
  216. return showPos+1
  217. end
  218. -- 更新玩家flag
  219. function Room:updateFlag( userId, flag )
  220. -- 俱乐部需要
  221. if self.roomInfo.memberList[userId] == nil then
  222. self.roomInfo.memberList[userId] = {}
  223. end
  224. self.roomInfo.memberList[userId].nUserId = userId
  225. self.roomInfo.memberList[userId].nPlayerFlag = flag
  226. end
  227. function Room:resetDismissData()
  228. --玩家解散数据(userId 为Key,解散类型为value)
  229. self.dismissInfo = {}
  230. --解散总时间
  231. self.roomInfo.nDismissToTalTime = nil
  232. -- 解散倒计时
  233. self.roomInfo.nDismissStateTime = nil
  234. -- 解散显示
  235. self.roomInfo.nShowDismiss = false
  236. end
  237. -- 清除缓存信息
  238. function Room:cleanCache()
  239. self:resetDismissData()
  240. self._players = {}
  241. self.roomInfo = {}
  242. self.roomInfo.memberList = {}
  243. end
  244. -------------------------------------------------------------------------------------------
  245. -------------------------------------------------------------------------------------------
  246. -- 我发起请求解散房间
  247. function Room:requestDismissRoom(opType)
  248. --1: 表示发起解散 2:同意解散 3:不同意解散
  249. local request = PdkMessage.DismissRequest:new()
  250. request.operateType = opType
  251. self:sendResponse{cmd = PdkCmd.GAME_COMMAND_DISBAND_GAME , sender = request}
  252. end
  253. -- 请求出牌
  254. function Room:requestOutCards( cards )
  255. local request = PdkMessage.GameOutCards:new()
  256. for _,v in ipairs(cards) do
  257. table.insert(request.byOutCard.Datas, v)
  258. end
  259. self:sendResponse{cmd = PdkCmd.GAME_CAMMAND_OUT_CARDS , sender = request}
  260. end
  261. -------------------------------------------------------------------------------------------
  262. -------------------------------------------------------------------------------------------
  263. -- 注册客户端发送到服务器的消息
  264. function Room:registeRequest()
  265. -- 离开房间
  266. self:defMsgFunc{name = "callLeaveRequest" , cmd = PdkCmd.GAME_COMMAND_USER_LEAVE};
  267. -- 玩家请求准备
  268. self:defMsgFunc{name = "callReadyRequestPdk" , cmd = PdkCmd.GAME_COMMAND_USER_READY};
  269. -- 客户端发起快速请求
  270. self:defMsgFunc{name = "requestFastStartGame", cmd = PdkCmd.GAME_COMMAND_FAST_START_GAME, sender = PdkMessage.FastStartRequest};
  271. -- GPS信息发生变化的时候主动给服务器发消息
  272. app:addEventListener("onUpdateLoctionSuccessed", handler(self, self.onGpsChangeRequest))
  273. end
  274. -- 注册服务器发送到客户端的消息监听
  275. function Room:registeResponse()
  276. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGIN_GAME_SUCCESS, reader = PdkMessage.GameLoginSuccess, func = handler(self , self.onResponseLoginSuc)};
  277. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGIN_GAME_ERR, reader = PdkMessage.GameLoginFailed, func = handler(self , self.onResponseLoginFailed)};
  278. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_READY, reader = PdkMessage.GameUserReady, func = handler(self , self.onResponseUserReady)};
  279. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGOUT_GAME_SUCCESS, reader = PdkMessage.GameUserLogoutSuc, func = handler(self , self.onResponseLogoutSuc)};
  280. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LOGOUT, reader = PdkMessage.GameBroadcastUserLogout, func = handler(self , self.onResponseBroadcastLogout)};
  281. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LOGIN, reader = PdkMessage.GameUserEnter, func = handler(self , self.onResponseBroadcastLogin)};
  282. -- 玩家收到解散房间的请求
  283. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_DISBAND_GAME, reader = PdkMessage.DismissResponse, func = handler(self , self.onDismissResponse)};
  284. -- 收到玩家申请解散房间
  285. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_DISBAND_GAME, reader = PdkMessage.DismissResult, func = handler(self , self.onUserDismissResultResponse)};
  286. -- 收到其他玩家掉线信息
  287. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LEAVE, reader = PdkMessage.OtherDroppedResponse, func = handler(self , self.onOtherDroppedResponse)};
  288. --------------------------------------------------------------------------
  289. -- 游戏处理逻辑协议
  290. --------------------------------------------------------------------------
  291. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_GAME_START, reader = PdkMessage.GameBroadcastGameStart, func = handler(self , self.onResponseGameStart)};
  292. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_SEND_HAND_CARD, reader = PdkMessage.GameSendCards, func = handler(self , self.onResponseSendCards)};
  293. -- self:defPushMsg{cmd = PdkCmd.GAME_CAMMAND_SEND_TIPS, reader = PdkMessage.GameReturnTips, func = handler(self , self.onResponseSendTips)};
  294. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_OUT_CARD_ERR, reader = PdkMessage.GameOutCardsErr, func = handler(self , self.onResponseOutCardsErr)};
  295. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_OUT_CARD, reader = PdkMessage.GameBroadcastOutCards, func = handler(self , self.onResponseOutCards)};
  296. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_RESULT, reader = PdkMessage.GameBroadcastResult, func = handler(self , self.onResponseGameResult)};
  297. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_GAME_OVER, reader = PdkMessage.GameGameOver, func = handler(self , self.onResponseGameOver)};
  298. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_RECONNECT_SUCCESS, reader = PdkMessage.GameGameRecover, func = handler(self , self.onResponseGameRecover)};
  299. -- 更新玩家分数
  300. self:defPushMsg{cmd = PdkCmd.GAME_CAMMAND_BROADCAST_SCORES, reader = PdkMessage.GameUpdateScore, func = handler(self , self.onResponseUpdateScore)};
  301. -- 更新当前轮次
  302. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_TURNS, reader = PdkMessage.GameBroadcastTurns, func = handler(self , self.onResponseUpdateTurns)};
  303. -- 快速开始请求返回
  304. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_FAST_START_RESULT, reader = PdkMessage.FastStartRequestResult, func = handler(self, self.onUserRequestFast)}
  305. -- 快速开始广播请求
  306. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROAD_FAST_START_GAME, reader = PdkMessage.FastStartStatus, func = handler(self, self.onBroadcastFastRequest)}
  307. -- 快速开始成功
  308. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROAD_QUICKLY_START, reader = PdkMessage.UpdateSeatIds, func = handler(self, self.onFastStartSucc)}
  309. -- 托管广播
  310. self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_TUOGUAN_RESPONSE, reader = PdkMessage.TuoGuanResponse, func = handler(self , self.onTuoGuanResponse)};
  311. -- 玩家信息改变
  312. --self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_SERVER_CHANGE_USERINFO, reader = PdkMessage.ServerChangeUserInfo, func = handler(self , self.onGpsChangeResponse)};
  313. end
  314. -- 快速开始请求返回
  315. function Room:onUserRequestFast( status, response )
  316. --快速开始请求错误提示错误
  317. local errTxt ={
  318. [0] = "成功",
  319. [1] = "人数不够",
  320. [2] = "其他人已请求",
  321. [3] = "房间人数已满",
  322. [4] = "非法操作"
  323. }
  324. local txt = errTxt[response.result]
  325. if txt then
  326. showTooltip(txt)
  327. end
  328. end
  329. -- 快速开始操作广播
  330. function Room:onBroadcastFastRequest( status, response )
  331. logD("Room:onBroadcastFastRequest response = "..table.tostring(response))
  332. self:dispatchEvent({name = "onBroadcastFastRequest" ,response = response})
  333. end
  334. -- 游戏快速开始,更新玩家座位号
  335. function Room:onFastStartSucc( status, response )
  336. logD("Room:onFastStartSucc response = "..table.tostring(response))
  337. --更新最大人数
  338. self.roomInfo.nMaxPlayCount = #response.pList
  339. -- 更新椅子号
  340. for _,v in pairs(response.pList) do
  341. self:addPlayer({userId = v.nUserId, seatId = v.nSeatId})
  342. end
  343. -- 更新视图ID
  344. for _,v in pairs(response.pList) do
  345. self:addPlayer({userId = v.nUserId, viewPos = self:transPos(v.nSeatId)})
  346. end
  347. self:dispatchEvent({name = "onFastStartSucc" ,response = response})
  348. end
  349. -- 更新当前房间轮次
  350. function Room:onResponseUpdateTurns( status, response )
  351. self:dispatchEvent({name = "onResponseUpdateTurns",response = response})
  352. end
  353. -- 更新玩家分数
  354. function Room:onResponseUpdateScore( status, response )
  355. self:dispatchEvent({name = "onResponseUpdateScore",response = response})
  356. end
  357. -- 其他玩家掉线
  358. function Room:onOtherDroppedResponse( status, response )
  359. -- logD("onOtherDroppedResponse:", table.tostring(response))
  360. self:dispatchEvent({name = "onOtherDroppedResponse",response = response})
  361. end
  362. -- 加入房间成功回调处理
  363. function Room:onResponseLoginSuc( status, response )
  364. -- logD("PDK_onResponseLoginSuc:", table.tostring(response))
  365. self:cleanCache()
  366. local roomInfo = {}
  367. roomInfo.nGameInfo = response.nGameInfo--创建房间参数信息
  368. roomInfo.nGameStartCount = response.nGameStartCount
  369. roomInfo.nTotalGameNum = response.nTotalGameNum
  370. roomInfo.nMaxPlayCount = response.nMaxPlayCount
  371. roomInfo.nRoomOwnedUid = response.nRoomOwnedUid
  372. roomInfo.nTableId = response.nTableId
  373. roomInfo.nShowTableId = response.nTableId
  374. ------------------------------------和断线重连对比缺失字段,所以设置默认值-------------------------------------------------
  375. roomInfo.gameStatus = 0
  376. roomInfo.reBankerId = -1
  377. --房间是否是解散状态
  378. roomInfo.bUserDisbandGame = 0
  379. --解散剩余时间
  380. roomInfo.leftTimeOut = 0
  381. --快速开始状态1:有人申请提前开始
  382. roomInfo.userFastStartStatus = 0
  383. --快速开始剩余时间
  384. roomInfo.fastStartTimeout = 0
  385. --每个玩家对应快速开始状态
  386. roomInfo.fastStartPlayersStatus = {}
  387. --当前操作玩家id
  388. roomInfo.curOpUid = 0
  389. --当前操作玩家操作类型 0-pass 1-可以出牌也可以pass 2-只能出牌
  390. roomInfo.curOpType = 0
  391. roomInfo.recoverItem = nil
  392. --[[for k,v in pairs(response.players) do
  393. local player = {}
  394. player.userId = v.userId
  395. player.seatId = v.seatId
  396. --是否正在玩 -1: 用户站起 0: 用户坐下 1: 准备状态 2: 正在玩
  397. player.playFlag = v.playFlag
  398. --玩家解散状态 0:初始状态, 1:发起解散 2: 同意解散 3:不同意解散
  399. player.disbandStatus = 0
  400. --是否在线 0:离线 1:在线
  401. player.onlineStatus = 1
  402. player.jsonInfo = v.jsonInfo
  403. player.winTimes = 0
  404. player.loseTimes = 0
  405. player.isCanOp = 0
  406. player.bSpring = 0
  407. player.haveBlackThree = 0
  408. player.haveRedTen = 0
  409. player.maxScore = 0
  410. player.turnBombTimes = 0
  411. player.totalBombTimes = 0
  412. player.turnScore = 0
  413. player.totalScore = 0
  414. player.handType = 0
  415. player.handCards = {}
  416. player.outCards = {}
  417. table.insert(roomInfo.recoverItem, player)
  418. end--]]
  419. ---------------------------------------------------------------------------------------
  420. self:setRoomInfo(roomInfo)
  421. -- 处理玩家信息
  422. for _,v in ipairs(response.players) do
  423. local player = {}
  424. player.playFlag = v.playFlag
  425. player.userId = v.userId
  426. player.seatId = v.seatId
  427. player.jsonInfo = v.jsonInfo
  428. local oinfo = json.decode(v.jsonInfo)
  429. player.unionid = oinfo.unionid
  430. player.headimgurl = oinfo.headimgurl
  431. player.gpsInfo = oinfo.gpsInfo
  432. player.sex = oinfo.sex
  433. player.openid = oinfo.openid
  434. player.nickname = oinfo.nickname
  435. player.areano = oinfo.areano
  436. local strData = response.playerOnlineState[v.userId]
  437. if strData and strData.jsonInfo then
  438. local tData = json.decode(strData.jsonInfo)
  439. player.onlineStatus = tData.online
  440. end
  441. self:addPlayer(player)
  442. -- 俱乐部需要
  443. if self.roomInfo.memberList[v.userId] == nil then
  444. self.roomInfo.memberList[v.userId] = {}
  445. end
  446. self.roomInfo.memberList[v.userId].nUserId = v.userId
  447. self.roomInfo.memberList[v.userId].nSeatId = v.seatId
  448. self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag
  449. self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo
  450. end
  451. for _,v in pairs(self._players) do
  452. self:addPlayer({userId=v.userId, viewPos=self:transPos(v.seatId)})
  453. end
  454. self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.hejiangPaoDeKuai, gameType = 1})
  455. end
  456. -- 加入房间失败返回
  457. function Room:onResponseLoginFailed( status, response )
  458. -- logD("onResponseLoginFailed:", table.tostring(response))
  459. if not self.roomInfo then
  460. print("self.roomInfo no exist,容错处理!")
  461. return
  462. end
  463. local errorCode = response.nErrNo
  464. local errorString = ENTER_ROOM_RET_STR[errorCode] or string.format("Unkown Error errorCode = %s", errorCode)
  465. showTooltip(errorString)
  466. -- 发送通知
  467. self:dispatchEvent({name = "onSitDownFailedResponse",response = response})
  468. end
  469. -- 玩家准备广播
  470. function Room:onResponseUserReady( status, response )
  471. -- logD("onResponseUserReady:", table.tostring(response))
  472. self:addPlayer({userId = response.userId, ready = 1})
  473. self:updateFlag( response.userId, 1 )
  474. self:dispatchEvent({name = "onResponseUserReady",userId = response.userId})
  475. self:dispatchEvent({name = "onUserReadyResponse"})--刷新俱乐部里显示状态
  476. end
  477. -- 玩家退出桌子成功
  478. function Room:onResponseLogoutSuc( status, response )
  479. logD("onResponseLogoutSuc:", table.tostring(response))
  480. -- fixed:房卡信息没刷新
  481. -- local ttExtInfo = string.split(response.userInfo, ",")
  482. -- app.user.loginInfo.historyCardNum = ttExtInfo[1] or app.user.loginInfo.historyCardNum
  483. -- app.user.loginInfo.curCardNum = ttExtInfo[2] or app.user.loginInfo.curCardNum
  484. local ttExtInfo = string.split(response.extInfo, ",")
  485. app.user.loginInfo.historyCardNum = ttExtInfo[1];
  486. app.user.loginInfo.curCardNum = ttExtInfo[2];
  487. self.checkGpsID = nil
  488. self:dispatchEvent({name = "onUserExitResponseRoom",response = response})
  489. end
  490. -- 广播桌子玩家离开
  491. function Room:onResponseBroadcastLogout( status, response )
  492. -- logD("onResponseBroadcastLogout:", table.tostring(response))
  493. self:delPlayer(response.userId)
  494. if not self.isGameOver then
  495. self.roomInfo.memberList[response.userId] = nil
  496. end
  497. self:updateGpsUserInfo(nil,false)
  498. if self.checkGpsID then
  499. for i,v in pairs(self.checkGpsID) do
  500. if v == response.userId then
  501. table.remove(self.checkGpsID,i)
  502. end
  503. end
  504. end
  505. self:dispatchEvent({name = "onResponseBroadcastLogout",userId = response.userId})
  506. end
  507. -- 其他玩家加入房间
  508. function Room:onResponseBroadcastLogin( status, response )
  509. -- logD("onResponseBroadcastLogin:", table.tostring(response))
  510. local player = {}
  511. local v = response
  512. player.playFlag = v.playFlag--//是否正在玩 -1: 用户站起 0: 用户坐下 1: 准备状态 2: 正在玩
  513. player.userId = v.userId
  514. player.seatId = v.seatId
  515. player.jsonInfo = v.jsonInfo
  516. local oinfo = json.decode(v.jsonInfo)
  517. player.unionid = oinfo.unionid
  518. player.headimgurl = oinfo.headimgurl
  519. player.gpsInfo = oinfo.gpsInfo
  520. player.sex = oinfo.sex
  521. player.openid = oinfo.openid
  522. player.nickname = oinfo.nickname
  523. player.areano = oinfo.areano
  524. player.viewPos = self:transPos(v.seatId)
  525. self:addPlayer(player)
  526. -- 俱乐部需要
  527. if self.roomInfo.memberList[v.userId] == nil then
  528. self.roomInfo.memberList[v.userId] = {}
  529. end
  530. self.roomInfo.memberList[v.userId].nUserId = v.userId
  531. self.roomInfo.memberList[v.userId].nSeatId = v.seatId
  532. self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag
  533. self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo
  534. --检测GPS
  535. self:updateGpsUserInfo(v.userId,true)
  536. self:dispatchEvent({name = "onResponseBroadcastLogin", pInfo = player})
  537. end
  538. function Room:onDismissResponse( status, response )
  539. logD("onDismissResponse:", table.tostring(response))
  540. --[[-- nUserId
  541. , defVar("nUserId", VT_Int, 0)
  542. -- 1: 表示发起解散 2:同意解散 3:不同意解散
  543. , defVar("operateType", VT_UChar, 0)
  544. -- 剩余解散超时时间
  545. , defVar("timeLeft", VT_Short, 0) --]]
  546. if not self.roomInfo then
  547. print("self.roomInfo no exist,容错处理!")
  548. return
  549. end
  550. local nUserId = response.nUserId
  551. local operateType = response.operateType
  552. -- 收到玩家发起请求时,数据重置
  553. if response.operateType == 1 then
  554. self:resetDismissData()
  555. end
  556. --数据记录
  557. self.dismissInfo[nUserId] = operateType
  558. self:dispatchEvent({name = "onDismissResponse", response = response})
  559. end
  560. function Room:onUserDismissResultResponse( status, response )
  561. logD("onUserDismissResultResponse:", table.tostring(response))
  562. if not self.roomInfo then
  563. print("self.roomInfo no exist,容错处理!")
  564. return
  565. end
  566. if response.errorCode == 1 then
  567. showTooltip("operateType取值范围不对")
  568. elseif response.errorCode == 2 then
  569. showTooltip("当前没人发起解散")
  570. elseif response.errorCode == 3 then
  571. showTooltip("已经有人申请解散")
  572. elseif response.errorCode == 4 then
  573. showTooltip("用户已经操作过")
  574. else
  575. -- 其他玩家的解散状态
  576. for uid, value in pairs(response.memberList) do
  577. self.dismissInfo[uid] = value.dismissState
  578. end
  579. self:dispatchEvent({name = "onDismissResponse", response = response})
  580. end
  581. end
  582. --------------------------------------------------------------------------
  583. -- 游戏处理逻辑协议
  584. --------------------------------------------------------------------------
  585. -- 广播游戏开始 0x8101
  586. function Room:onResponseGameStart( status, response )
  587. -- logD("onResponseGameStart:", table.tostring(response))
  588. self:setCurTurn(0)
  589. self:setRoomInfo({nGameStartCount=response.gameStartCount, nTotalGameNum=totalGamenum})
  590. self:dispatchEvent({name = "onResponseGameStart", response = response})
  591. end
  592. -- 给玩家发牌 0x8102
  593. function Room:onResponseSendCards( status, response )
  594. -- logD("onResponseSendCards:", table.tostring(response))
  595. self:dispatchEvent({name = "onResponseSendCards", response = response})
  596. end
  597. -- 服务器返回最佳提示
  598. function Room:onResponseSendTips( status, response )
  599. -- logD("onResponseSendTips:", table.tostring(response))
  600. self:dispatchEvent({name = "onResponseSendTips", response = response})
  601. end
  602. -- 服务器返回出牌错误提示
  603. function Room:onResponseOutCardsErr( status, response )
  604. logD("onResponseOutCardsErr:", table.tostring(response))
  605. local msg = {
  606. [1] = "牌型错误",
  607. [2] = "出牌错误",--牌与手牌对不上
  608. [3] = "出牌未包含打头必出的牌",
  609. [4] = "第一手须包含黑桃三",
  610. [5] = "牌型错误",
  611. [6] = "报单必须出最大牌",
  612. [7] = "没轮到该玩家出牌",
  613. [11] = "出牌不符合铁一线规则",
  614. }
  615. if self:isMyself(response.userId) then
  616. local m = msg[response.errFlag] or "出牌错误"
  617. showTooltip(""..m)
  618. end
  619. self:dispatchEvent({name = "onResponseOutCardsErr", response = response})
  620. end
  621. --玩家出牌成功,广播
  622. function Room:onResponseOutCards( status, response )
  623. -- print("----------------self userId-------------------------"..self:getMyself().userId)
  624. -- logD("onResponseOutCards:", table.tostring(response))
  625. self:dispatchEvent({name = "onResponseOutCards", response = response})
  626. end
  627. --单局结算
  628. function Room:onResponseGameResult( status, response )
  629. logD("onResponseGameResult:", table.tostring(response))
  630. self:dispatchEvent({name = "onResponseGameResult", response = response})
  631. end
  632. --总结算
  633. function Room:onResponseGameOver( status, response )
  634. logD("onResponseGameOver:", table.tostring(response))
  635. self.isGameOver = true;
  636. self:dispatchEvent({name = "onResponseGameOver", response = response})
  637. end
  638. --断线重连
  639. function Room:onResponseGameRecover( status, response )
  640. logD("onResponseGameRecover:", table.tostring(response))
  641. self.isReconnection = true
  642. self:cleanCache()
  643. local roomInfo = {}
  644. roomInfo.nGameInfo = response.gameInfo--创建房间参数信息
  645. roomInfo.nGameStartCount = response.gameStartCount
  646. roomInfo.nTotalGameNum = response.totalGamenum
  647. roomInfo.nMaxPlayCount = response.maxPlayCount
  648. roomInfo.nRoomOwnedUid = response.roomOwnedUid
  649. roomInfo.nTableId = response.showTableId
  650. roomInfo.nShowTableId = response.showTableId
  651. roomInfo.recoverItem = response.recoverItem
  652. roomInfo.gameStatus = response.gameStatus
  653. roomInfo.reBankerId = response.bankSeatId
  654. roomInfo.bUserDisbandGame = response.bUserDisbandGame
  655. roomInfo.leftTimeOut = response.leftTimeOut
  656. --快速开始状态1:有人申请提前开始
  657. roomInfo.userFastStartStatus = response.userFastStartStatus
  658. --快速开始剩余时间
  659. roomInfo.fastStartTimeout = response.fastStartTimeout
  660. --每个玩家对应快速开始状态
  661. roomInfo.fastStartPlayersStatus = {}
  662. --记牌器数据
  663. roomInfo.cardPlayerInfo = response.cardPlayerInfo
  664. --底牌
  665. roomInfo.dipaiCard = response.dipaiCard
  666. --最后一手牌是否只能用炸弹来接
  667. app.room.isMustBomb = response.isMustBomb
  668. if app.club_php.clubID and app.club_php.clubID ~= 0 and roomInfo.nGameStartCount > 0 then
  669. app.club_php:getClubList();
  670. end
  671. --当前操作玩家id
  672. roomInfo.curOpUid = response.curOpUid
  673. --当前操作玩家操作类型 0-pass 1-可以出牌也可以pass 2-只能出牌
  674. roomInfo.curOpType = response.curOpType
  675. self:setRoomInfo(roomInfo)
  676. -- 处理玩家信息
  677. for _,v in ipairs(response.recoverItem) do
  678. local player = {}
  679. player.playFlag = v.playFlag
  680. player.userId = v.userId
  681. player.seatId = v.seatId
  682. player.jsonInfo = v.jsonInfo
  683. local oinfo = json.decode(v.jsonInfo)
  684. player.unionid = oinfo.unionid
  685. player.headimgurl = oinfo.headimgurl
  686. player.gpsInfo = oinfo.gpsInfo
  687. player.sex = oinfo.sex
  688. player.openid = oinfo.openid
  689. player.nickname = oinfo.nickname
  690. player.areano = oinfo.areano
  691. self:addPlayer(player)
  692. -- 俱乐部需要
  693. if self.roomInfo.memberList[v.userId] == nil then
  694. self.roomInfo.memberList[v.userId] = {}
  695. end
  696. self.roomInfo.memberList[v.userId].nUserId = v.userId
  697. self.roomInfo.memberList[v.userId].nSeatId = v.seatId
  698. self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag
  699. self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo
  700. self.roomInfo.memberList[v.userId].nDisbandStatus = v.disbandStatus
  701. local fastStartPlayer = {}
  702. fastStartPlayer.userId = v.userId
  703. fastStartPlayer.fastStartStatus = v.fastStartStatus
  704. table.insert(roomInfo.fastStartPlayersStatus, fastStartPlayer)
  705. end
  706. if response.extInfo and type(response.extInfo)=='string' and response.extInfo~="" then
  707. local extInfo = json.decode(response.extInfo)
  708. if extInfo and type(extInfo)=='table' and extInfo[tostring(self:getMyself())] then
  709. self.roomInfo.quickStartInfo = extInfo.faststart--提前开局
  710. end
  711. local passShow = extInfo.passuser or {}
  712. local tmpShowPass = {}
  713. for i,v in ipairs(passShow) do
  714. tmpShowPass[tostring(v)] = true
  715. end
  716. for _,v in pairs(roomInfo.recoverItem) do
  717. v.operate = extInfo[tostring(v.userId)].operate
  718. v.passShow = tmpShowPass[tostring(v.userId)]
  719. v.offtime = 0
  720. if extInfo[tostring(v.userId)] and extInfo[tostring(v.userId)].offtime then
  721. v.offtime = extInfo[tostring(v.userId)].offtime
  722. end
  723. end
  724. end
  725. for _,v in pairs(self._players) do
  726. self:addPlayer({userId=v.userId, viewPos=self:transPos(v.seatId)})
  727. end
  728. --检测GPS
  729. self:updateGpsUserInfo(nil,false)
  730. self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.hejiangPaoDeKuai, gameType = 1})
  731. --
  732. self:dispatchEvent({name = "onResponseGameRecover"})
  733. end
  734. function Room:test()
  735. logD("--------------------------pdk room test")
  736. end
  737. -- 通知服务器玩家GPS数据发生变化
  738. function Room:onGpsChangeRequest()
  739. print("Room:onUserInfoChangeRequest()")
  740. local request = StringPacket:new()
  741. request.stringValue = app.user.userInfo or ""
  742. logD("Room:onGpsChangeRequest()", table.tostring(request))
  743. self:sendResponse{cmd = PdkCmd.GAME_COMMAND_CLIENT_CHANGE_USERINFO , sender = request};
  744. end
  745. -- 服务器下发玩家GPS数据发生变化
  746. --[[function Room:onGpsChangeResponse(status, response)
  747. print("Room:onGpsChangeResponse()", table.tostring(response))
  748. local nUserId = response.uid
  749. local memberInfo = self.roomInfo.memberList[nUserId]
  750. if memberInfo then
  751. memberInfo.userInfo = response.userInfo
  752. end
  753. local player = self._players[tostring(nUserId)]
  754. player.jsonInfo = response.userInfo
  755. self:dispatchEvent({name = "onGpsChangeResponse", nUserId = nUserId});
  756. end--]]
  757. --更新gps用户数据
  758. --需要检测的ID 没有则检测所有人的距离
  759. --isOpenView 危险距离是否主动弹出提示
  760. function Room:updateGpsUserInfo(userId,isOpenView)
  761. self.checkGpsID = self.checkGpsID or {}
  762. for i,v in pairs(self.checkGpsID) do
  763. if v == userId then
  764. table.remove(self.checkGpsID,i)
  765. return--同一ID4秒内只检测一次
  766. end
  767. end
  768. if self.roomInfo and self.roomInfo.memberList then
  769. local gameStartCount = self:getRoomInfo().nGameStartCount or 0
  770. local isGameStart = gameStartCount>0
  771. --如果是游戏开始后收到消息则不处理
  772. local userInfoList = self:getUserInfoList()
  773. if isGameStart then
  774. isOpenView = false
  775. end
  776. table.insert(self.checkGpsID,userId)
  777. self:dispatchEvent({
  778. name = GAME_EVENT.GPS_UPDATE_USER_INFO,
  779. userId=userId,
  780. userInfoList = userInfoList,
  781. isOpenView = isOpenView or false,
  782. isGameStart = isGameStart,
  783. -- maxPlayerNum = self.roomInfo.nMaxPlayCount,
  784. })
  785. end
  786. end
  787. -- 申请托管
  788. function Room:requestTuoGuan(optType)
  789. local request = PdkMessage.sendTuoGuan:new()
  790. request.entrustType = optType;
  791. logD("requestTuoGuan",table.tostring(request))
  792. self:sendResponse{cmd = PdkCmd.GAME_COMMAND_REQUEST_TUOGUAN , sender = request};
  793. end
  794. function Room:onTuoGuanResponse(status, response)
  795. logD("Room:onTuoGuanResponse(), ", table.tostring(response))
  796. if not self.roomInfo then
  797. logD("self.roomInfo no exist,容错处理!")
  798. return
  799. end
  800. self.roomInfo.hostInfos = response.userCnt
  801. self:dispatchEvent({name = "onTuoGuanResponse",response = response});
  802. end
  803. return Room