您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

885 行
29 KiB

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