您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字

899 行
30 KiB

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