-- 泸州跑得快消息处理 local PdkCmd = require("pk_luzhoupdk.luaScript.Protocol.luzhouPdkCmd") local PdkMessage = require("pk_luzhoupdk.luaScript.Protocol.luzhouPdkMessage") local EVENT_PRE= "luzhouPaoDeKuai_" require("luaScript.GameTypeDef") local Room = class("Room" , require("luaScript.Protocol.ProtocolRoomBase")) function Room:ctor(net) Room.super.ctor(self , net); --是否为断线重连 self.isReconnection = false self.isGameOver = false -- 兼容俱乐部需要 self.roomInfo = {} self.roomInfo.memberList = {} self:registeRequest() self:registeResponse() self:resetDismissData() end -- 通过玩家逻辑椅子号找到玩家ID function Room:getUserIdBySeatId(nSeatId) local p = self:getPlayerCid(nSeatId) if p then return p.userId end return nil end -- 通过玩家视图椅子号找到玩家ID function Room:getUserIdByViewId(nViewId) local p = self:getPlayerVpos(nViewId) if p then return p.userId end return nil end -- 通过玩家ID获取玩家展示的座位号 function Room:getViewIdByUserId(nUserId) if self:getPlayer(nUserId) then return self:getPlayer(nUserId).viewPos end return nil end -- 通过玩家逻辑椅子号找到视图椅子号 function Room:getViewIdBySeatId(nSeatId) local p = self:getPlayerCid(nSeatId) if p then return p.viewPos end return nil end -- 通过玩家ID找到逻辑椅子号 function Room:getSeatIdByUserId(nViewId) local p = self:getPlayerVpos(nViewId) if p then return p.userId end return nil end -- 通过玩家视图椅子号找到逻辑椅子号 function Room:getSeatIdByViewId(nUserId) local p = self:getPlayerVpos(nUserId) if p then return p.viewPos end return nil end -- 获取房间内的用户信息 function Room:getUserInfo(uid) if self:getPlayer(uid) then return self:getPlayer(uid).jsonInfo end return nil end -- 缓存房间信息 function Room:setRoomInfo( roominfo ) self.roomInfo = self.roomInfo or {} for k,v in pairs(roominfo) do self.roomInfo[k] = v end end -- 获取房间信息 function Room:getRoomInfo() return self.roomInfo end -- 设置当前房间轮次 function Room:setCurTurn( pos ) self.roomInfo.curTurn = pos end -- 获取当前房价轮次 function Room:getNextTurn() local MaxCount = self:getRoomInfo().nMaxPlayCount if MaxCount == 4 then if self.roomInfo.curTurn == 4 then return 1 else return self.roomInfo.curTurn+1 end elseif MaxCount == 3 then if self.roomInfo.curTurn == 3 then return 1 else return self.roomInfo.curTurn+1 end else if self.roomInfo.curTurn == 2 then return 1 else return self.roomInfo.curTurn+1 end end end -- 获取当前玩家的上家 function Room:getPreSeatId( cid ) local MaxCount = self:getRoomInfo().nMaxPlayCount if MaxCount == 4 then if cid == 0 then return 3 else return cid-1 end elseif MaxCount == 3 then if cid == 0 then return 2 else return cid-1 end else if cid == 0 then return 1 else return cid-1 end end end -- 添加玩家,如果玩家存在则更新数据 -- key - value 缓存 function Room:addPlayer( pl )--and update self._players = self._players or {} local player = self._players[tostring(pl.userId)] if player then for k,v in pairs(pl) do player[k] = v end else self._players[tostring(pl.userId)] = pl end end -- 删除玩家 function Room:delPlayer( uid ) local player = self._players[tostring(uid)] if player then self._players[tostring(uid)] = nil end end -- 获取玩家 function Room:getPlayer( uid ) local player = self._players[tostring(uid)] return player end -- 根据座位号获取玩家数据 function Room:getPlayerCid( cid ) for _,v in pairs(self._players) do if v.seatId == cid then return v end end return nil end -- 根据视角获取玩家数据 function Room:getPlayerVpos( viewPos ) for _,v in pairs(self._players) do if v.viewPos == viewPos then return v end end return nil end -- 获取所有玩家 function Room:getPlayers() return self._players or {} end -- 获取玩家数量 function Room:getPlayerNum() local count = 0 for _,_ in pairs(self._players) do count = count + 1 end return count end -- 获取玩家信息用于GPS function Room:getUserInfoList() local userInfoList = {} for k,v in pairs(self._players) do userInfoList[v.userId] = {nSeatId=v.seatId, userInfo=v.jsonInfo} end return userInfoList end -- 根据id判断是否是自己 function Room:isMyself( uid ) return tonumber(app.user.loginInfo.uid) == tonumber(uid) end -- 获取自己信息 function Room:getMyself() if self._players then return self._players[tostring(app.user.loginInfo.uid)] end end -- 获取模式牌张数 function Room:getRuleCardsNum() local gameInfo = self:getRoomInfo().nGameInfo local data = json.decode(gameInfo) local allCards = 0 if tonumber(data.gamerule) == 1 then --经典 allCards = 16 else--十五张 allCards = 15 end return allCards end -- 视角转换 function Room:transPos( pos ) local myself = self:getMyself() local MaxCount = self:getRoomInfo().nMaxPlayCount or 4 local showPos = 0 local myPos = myself.seatId if myPos <= pos then showPos = pos - myPos elseif myPos > pos then showPos = MaxCount - myPos + pos end return showPos+1 end -- 更新玩家flag function Room:updateFlag( userId, flag ) -- 俱乐部需要 if self.roomInfo.memberList[userId] == nil then self.roomInfo.memberList[userId] = {} end self.roomInfo.memberList[userId].nUserId = userId self.roomInfo.memberList[userId].nPlayerFlag = flag end function Room:resetDismissData() --玩家解散数据(userId 为Key,解散类型为value) self.dismissInfo = {} --解散总时间 self.roomInfo.nDismissToTalTime = nil -- 解散倒计时 self.roomInfo.nDismissStateTime = nil -- 解散显示 self.roomInfo.nShowDismiss = false end -- 清除缓存信息 function Room:cleanCache() self:resetDismissData() self._players = {} self.roomInfo = {} self.roomInfo.memberList = {} end ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- 我发起请求解散房间 function Room:requestDismissRoom(opType) --1: 表示发起解散 2:同意解散 3:不同意解散 local request = PdkMessage.DismissRequest:new() request.operateType = opType self:sendResponse{cmd = PdkCmd.GAME_COMMAND_DISBAND_GAME , sender = request} end -- 请求出牌 function Room:requestOutCards( cards ) local request = PdkMessage.GameOutCards:new() for _,v in ipairs(cards) do table.insert(request.byOutCard.Datas, v) end self:sendResponse{cmd = PdkCmd.GAME_CAMMAND_OUT_CARDS , sender = request} end ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- 注册客户端发送到服务器的消息 function Room:registeRequest() -- 离开房间 self:defMsgFunc{name = "callLeaveRequest" , cmd = PdkCmd.GAME_COMMAND_USER_LEAVE}; -- 玩家请求准备 self:defMsgFunc{name = "callReadyRequestPdk" , cmd = PdkCmd.GAME_COMMAND_USER_READY}; -- 客户端发起快速请求 self:defMsgFunc{name = "requestFastStartGame", cmd = PdkCmd.GAME_COMMAND_FAST_START_GAME, sender = PdkMessage.FastStartRequest}; -- GPS信息发生变化的时候主动给服务器发消息 app:addEventListener("onUpdateLoctionSuccessed", handler(self, self.onGpsChangeRequest)) end -- 注册服务器发送到客户端的消息监听 function Room:registeResponse() self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGIN_GAME_SUCCESS, reader = PdkMessage.GameLoginSuccess, func = handler(self , self.onResponseLoginSuc)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGIN_GAME_ERR, reader = PdkMessage.GameLoginFailed, func = handler(self , self.onResponseLoginFailed)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_READY, reader = PdkMessage.GameUserReady, func = handler(self , self.onResponseUserReady)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_LOGOUT_GAME_SUCCESS, reader = PdkMessage.GameUserLogoutSuc, func = handler(self , self.onResponseLogoutSuc)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LOGOUT, reader = PdkMessage.GameBroadcastUserLogout, func = handler(self , self.onResponseBroadcastLogout)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LOGIN, reader = PdkMessage.GameUserEnter, func = handler(self , self.onResponseBroadcastLogin)}; -- 玩家收到解散房间的请求 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_DISBAND_GAME, reader = PdkMessage.DismissResponse, func = handler(self , self.onDismissResponse)}; -- 收到玩家申请解散房间 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_DISBAND_GAME, reader = PdkMessage.DismissResult, func = handler(self , self.onUserDismissResultResponse)}; -- 收到其他玩家掉线信息 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_USER_LEAVE, reader = PdkMessage.OtherDroppedResponse, func = handler(self , self.onOtherDroppedResponse)}; -------------------------------------------------------------------------- -- 游戏处理逻辑协议 -------------------------------------------------------------------------- self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_GAME_START, reader = PdkMessage.GameBroadcastGameStart, func = handler(self , self.onResponseGameStart)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_SEND_HAND_CARD, reader = PdkMessage.GameSendCards, func = handler(self , self.onResponseSendCards)}; -- self:defPushMsg{cmd = PdkCmd.GAME_CAMMAND_SEND_TIPS, reader = PdkMessage.GameReturnTips, func = handler(self , self.onResponseSendTips)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_OUT_CARD_ERR, reader = PdkMessage.GameOutCardsErr, func = handler(self , self.onResponseOutCardsErr)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_OUT_CARD, reader = PdkMessage.GameBroadcastOutCards, func = handler(self , self.onResponseOutCards)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_RESULT, reader = PdkMessage.GameBroadcastResult, func = handler(self , self.onResponseGameResult)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_GAME_OVER, reader = PdkMessage.GameGameOver, func = handler(self , self.onResponseGameOver)}; self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_RECONNECT_SUCCESS, reader = PdkMessage.GameGameRecover, func = handler(self , self.onResponseGameRecover)}; -- 更新玩家分数 self:defPushMsg{cmd = PdkCmd.GAME_CAMMAND_BROADCAST_SCORES, reader = PdkMessage.GameUpdateScore, func = handler(self , self.onResponseUpdateScore)}; -- 更新当前轮次 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROADCAST_TURNS, reader = PdkMessage.GameBroadcastTurns, func = handler(self , self.onResponseUpdateTurns)}; -- 快速开始请求返回 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_FAST_START_RESULT, reader = PdkMessage.FastStartRequestResult, func = handler(self, self.onUserRequestFast)} -- 快速开始广播请求 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROAD_FAST_START_GAME, reader = PdkMessage.FastStartStatus, func = handler(self, self.onBroadcastFastRequest)} -- 快速开始成功 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_BROAD_QUICKLY_START, reader = PdkMessage.UpdateSeatIds, func = handler(self, self.onFastStartSucc)} -- 托管广播 self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_TUOGUAN_RESPONSE, reader = PdkMessage.TuoGuanResponse, func = handler(self , self.onTuoGuanResponse)}; -- 玩家信息改变 --self:defPushMsg{cmd = PdkCmd.GAME_COMMAND_SERVER_CHANGE_USERINFO, reader = PdkMessage.ServerChangeUserInfo, func = handler(self , self.onGpsChangeResponse)}; end -- 快速开始请求返回 function Room:onUserRequestFast( status, response ) --快速开始请求错误提示错误 local errTxt ={ [0] = "成功", [1] = "人数不够", [2] = "其他人已请求", [3] = "房间人数已满", [4] = "非法操作" } local txt = errTxt[response.result] if txt then showTooltip(txt) end end -- 快速开始操作广播 function Room:onBroadcastFastRequest( status, response ) logD("Room:onBroadcastFastRequest response = "..table.tostring(response)) self:dispatchEvent({name = "onBroadcastFastRequest" ,response = response}) end -- 游戏快速开始,更新玩家座位号 function Room:onFastStartSucc( status, response ) logD("Room:onFastStartSucc response = "..table.tostring(response)) --更新最大人数 self.roomInfo.nMaxPlayCount = #response.pList -- 更新椅子号 for _,v in pairs(response.pList) do self:addPlayer({userId = v.nUserId, seatId = v.nSeatId}) end -- 更新视图ID for _,v in pairs(response.pList) do self:addPlayer({userId = v.nUserId, viewPos = self:transPos(v.nSeatId)}) end self:dispatchEvent({name = "onFastStartSucc" ,response = response}) end -- 更新当前房间轮次 function Room:onResponseUpdateTurns( status, response ) self:dispatchEvent({name = "onResponseUpdateTurns",response = response}) end -- 更新玩家分数 function Room:onResponseUpdateScore( status, response ) self:dispatchEvent({name = "onResponseUpdateScore",response = response}) end -- 其他玩家掉线 function Room:onOtherDroppedResponse( status, response ) -- logD("onOtherDroppedResponse:", table.tostring(response)) self:dispatchEvent({name = "onOtherDroppedResponse",response = response}) end -- 加入房间成功回调处理 function Room:onResponseLoginSuc( status, response ) -- logD("PDK_onResponseLoginSuc:", table.tostring(response)) self:cleanCache() local roomInfo = {} roomInfo.nGameInfo = response.nGameInfo--创建房间参数信息 roomInfo.nGameStartCount = response.nGameStartCount roomInfo.nTotalGameNum = response.nTotalGameNum roomInfo.nMaxPlayCount = response.nMaxPlayCount roomInfo.nRoomOwnedUid = response.nRoomOwnedUid roomInfo.nTableId = response.nTableId roomInfo.nShowTableId = response.nTableId ------------------------------------和断线重连对比缺失字段,所以设置默认值------------------------------------------------- roomInfo.gameStatus = 0 roomInfo.reBankerId = -1 --房间是否是解散状态 roomInfo.bUserDisbandGame = 0 --解散剩余时间 roomInfo.leftTimeOut = 0 --快速开始状态1:有人申请提前开始 roomInfo.userFastStartStatus = 0 --快速开始剩余时间 roomInfo.fastStartTimeout = 0 --每个玩家对应快速开始状态 roomInfo.fastStartPlayersStatus = {} --当前操作玩家id roomInfo.curOpUid = 0 --当前操作玩家操作类型 0-pass 1-可以出牌也可以pass 2-只能出牌 roomInfo.curOpType = 0 roomInfo.recoverItem = nil --[[for k,v in pairs(response.players) do local player = {} player.userId = v.userId player.seatId = v.seatId --是否正在玩 -1: 用户站起 0: 用户坐下 1: 准备状态 2: 正在玩 player.playFlag = v.playFlag --玩家解散状态 0:初始状态, 1:发起解散 2: 同意解散 3:不同意解散 player.disbandStatus = 0 --是否在线 0:离线 1:在线 player.onlineStatus = 1 player.jsonInfo = v.jsonInfo player.winTimes = 0 player.loseTimes = 0 player.isCanOp = 0 player.bSpring = 0 player.haveBlackThree = 0 player.haveRedTen = 0 player.maxScore = 0 player.turnBombTimes = 0 player.totalBombTimes = 0 player.turnScore = 0 player.totalScore = 0 player.handType = 0 player.handCards = {} player.outCards = {} table.insert(roomInfo.recoverItem, player) end--]] --------------------------------------------------------------------------------------- self:setRoomInfo(roomInfo) -- 处理玩家信息 for _,v in ipairs(response.players) do local player = {} player.playFlag = v.playFlag player.userId = v.userId player.seatId = v.seatId player.jsonInfo = v.jsonInfo local oinfo = json.decode(v.jsonInfo) player.unionid = oinfo.unionid player.headimgurl = oinfo.headimgurl player.gpsInfo = oinfo.gpsInfo player.sex = oinfo.sex player.openid = oinfo.openid player.nickname = oinfo.nickname player.areano = oinfo.areano local strData = response.playerOnlineState[v.userId] if strData and strData.jsonInfo then local tData = json.decode(strData.jsonInfo) player.onlineStatus = tData.online end self:addPlayer(player) -- 俱乐部需要 if self.roomInfo.memberList[v.userId] == nil then self.roomInfo.memberList[v.userId] = {} end self.roomInfo.memberList[v.userId].nUserId = v.userId self.roomInfo.memberList[v.userId].nSeatId = v.seatId self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo end for _,v in pairs(self._players) do self:addPlayer({userId=v.userId, viewPos=self:transPos(v.seatId)}) end self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.luzhouPaoDeKuai, gameType = 1}) end -- 加入房间失败返回 function Room:onResponseLoginFailed( status, response ) -- logD("onResponseLoginFailed:", table.tostring(response)) if not self.roomInfo then print("self.roomInfo no exist,容错处理!") return end local errorCode = response.nErrNo local errorString = ENTER_ROOM_RET_STR[errorCode] or string.format("Unkown Error errorCode = %s", errorCode) showTooltip(errorString) -- 发送通知 self:dispatchEvent({name = "onSitDownFailedResponse",response = response}) end -- 玩家准备广播 function Room:onResponseUserReady( status, response ) -- logD("onResponseUserReady:", table.tostring(response)) self:addPlayer({userId = response.userId, ready = 1}) self:updateFlag( response.userId, 1 ) self:dispatchEvent({name = "onResponseUserReady",userId = response.userId}) self:dispatchEvent({name = "onUserReadyResponse"})--刷新俱乐部里显示状态 end -- 玩家退出桌子成功 function Room:onResponseLogoutSuc( status, response ) logD("onResponseLogoutSuc:", table.tostring(response)) -- fixed:房卡信息没刷新 -- local ttExtInfo = string.split(response.userInfo, ",") -- app.user.loginInfo.historyCardNum = ttExtInfo[1] or app.user.loginInfo.historyCardNum -- app.user.loginInfo.curCardNum = ttExtInfo[2] or app.user.loginInfo.curCardNum local ttExtInfo = string.split(response.extInfo, ",") app.user.loginInfo.historyCardNum = ttExtInfo[1]; app.user.loginInfo.curCardNum = ttExtInfo[2]; self.checkGpsID = nil self:dispatchEvent({name = "onUserExitResponseRoom",response = response}) end -- 广播桌子玩家离开 function Room:onResponseBroadcastLogout( status, response ) -- logD("onResponseBroadcastLogout:", table.tostring(response)) self:delPlayer(response.userId) if not self.isGameOver then self.roomInfo.memberList[response.userId] = nil end self:updateGpsUserInfo(nil,false) if self.checkGpsID then for i,v in pairs(self.checkGpsID) do if v == response.userId then table.remove(self.checkGpsID,i) end end end self:dispatchEvent({name = "onResponseBroadcastLogout",userId = response.userId}) end -- 其他玩家加入房间 function Room:onResponseBroadcastLogin( status, response ) -- logD("onResponseBroadcastLogin:", table.tostring(response)) local player = {} local v = response player.playFlag = v.playFlag--//是否正在玩 -1: 用户站起 0: 用户坐下 1: 准备状态 2: 正在玩 player.userId = v.userId player.seatId = v.seatId player.jsonInfo = v.jsonInfo local oinfo = json.decode(v.jsonInfo) player.unionid = oinfo.unionid player.headimgurl = oinfo.headimgurl player.gpsInfo = oinfo.gpsInfo player.sex = oinfo.sex player.openid = oinfo.openid player.nickname = oinfo.nickname player.areano = oinfo.areano player.viewPos = self:transPos(v.seatId) self:addPlayer(player) -- 俱乐部需要 if self.roomInfo.memberList[v.userId] == nil then self.roomInfo.memberList[v.userId] = {} end self.roomInfo.memberList[v.userId].nUserId = v.userId self.roomInfo.memberList[v.userId].nSeatId = v.seatId self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo --检测GPS self:updateGpsUserInfo(v.userId,true) self:dispatchEvent({name = "onResponseBroadcastLogin", pInfo = player}) end function Room:onDismissResponse( status, response ) logD("onDismissResponse:", table.tostring(response)) --[[-- nUserId , defVar("nUserId", VT_Int, 0) -- 1: 表示发起解散 2:同意解散 3:不同意解散 , defVar("operateType", VT_UChar, 0) -- 剩余解散超时时间 , defVar("timeLeft", VT_Short, 0) --]] if not self.roomInfo then print("self.roomInfo no exist,容错处理!") return end local nUserId = response.nUserId local operateType = response.operateType -- 收到玩家发起请求时,数据重置 if response.operateType == 1 then self:resetDismissData() end --数据记录 self.dismissInfo[nUserId] = operateType self:dispatchEvent({name = "onDismissResponse", response = response}) end function Room:onUserDismissResultResponse( status, response ) logD("onUserDismissResultResponse:", table.tostring(response)) if not self.roomInfo then print("self.roomInfo no exist,容错处理!") return end if response.errorCode == 1 then showTooltip("operateType取值范围不对") elseif response.errorCode == 2 then showTooltip("当前没人发起解散") elseif response.errorCode == 3 then showTooltip("已经有人申请解散") elseif response.errorCode == 4 then showTooltip("用户已经操作过") else -- 其他玩家的解散状态 for uid, value in pairs(response.memberList) do self.dismissInfo[uid] = value.dismissState end self:dispatchEvent({name = "onDismissResponse", response = response}) end end -------------------------------------------------------------------------- -- 游戏处理逻辑协议 -------------------------------------------------------------------------- -- 广播游戏开始 0x8101 function Room:onResponseGameStart( status, response ) -- logD("onResponseGameStart:", table.tostring(response)) self:setCurTurn(0) self:setRoomInfo({nGameStartCount=response.gameStartCount, nTotalGameNum=totalGamenum}) self:dispatchEvent({name = "onResponseGameStart", response = response}) end -- 给玩家发牌 0x8102 function Room:onResponseSendCards( status, response ) -- logD("onResponseSendCards:", table.tostring(response)) self:dispatchEvent({name = "onResponseSendCards", response = response}) end -- 服务器返回最佳提示 function Room:onResponseSendTips( status, response ) -- logD("onResponseSendTips:", table.tostring(response)) self:dispatchEvent({name = "onResponseSendTips", response = response}) end -- 服务器返回出牌错误提示 function Room:onResponseOutCardsErr( status, response ) logD("onResponseOutCardsErr:", table.tostring(response)) local msg = { [1] = "牌型错误", [2] = "出牌错误",--牌与手牌对不上 [3] = "出牌未包含打头必出的牌", [4] = "第一手须包含黑桃三", [5] = "牌型错误", [6] = "报单必须出最大牌", [11] = '出牌规则必须符合铁二线', } if self:isMyself(response.userId) then local m = msg[response.errFlag] or "出牌错误" showTooltip(""..m) end self:dispatchEvent({name = "onResponseOutCardsErr", response = response}) end --玩家出牌成功,广播 function Room:onResponseOutCards( status, response ) -- print("----------------self userId-------------------------"..self:getMyself().userId) -- logD("onResponseOutCards:", table.tostring(response)) self:dispatchEvent({name = "onResponseOutCards", response = response}) end --单局结算 function Room:onResponseGameResult( status, response ) logD("onResponseGameResult:", table.tostring(response)) self:dispatchEvent({name = "onResponseGameResult", response = response}) end --总结算 function Room:onResponseGameOver( status, response ) logD("onResponseGameOver:", table.tostring(response)) self.isGameOver = true self:dispatchEvent({name = "onResponseGameOver", response = response}) end --断线重连 function Room:onResponseGameRecover( status, response ) logD("onResponseGameRecover:", table.tostring(response)) self.isReconnection = true self:cleanCache() local roomInfo = {} roomInfo.nGameInfo = response.gameInfo--创建房间参数信息 roomInfo.nGameStartCount = response.gameStartCount roomInfo.nTotalGameNum = response.totalGamenum roomInfo.nMaxPlayCount = response.maxPlayCount roomInfo.nRoomOwnedUid = response.roomOwnedUid roomInfo.nTableId = response.showTableId roomInfo.nShowTableId = response.showTableId roomInfo.recoverItem = response.recoverItem roomInfo.gameStatus = response.gameStatus roomInfo.reBankerId = response.bankSeatId roomInfo.bUserDisbandGame = response.bUserDisbandGame roomInfo.leftTimeOut = response.leftTimeOut --快速开始状态1:有人申请提前开始 roomInfo.userFastStartStatus = response.userFastStartStatus --快速开始剩余时间 roomInfo.fastStartTimeout = response.fastStartTimeout --每个玩家对应快速开始状态 roomInfo.fastStartPlayersStatus = {} --记牌器数据 roomInfo.cardPlayerInfo = response.cardPlayerInfo --底牌 roomInfo.dipaiCard = response.dipaiCard --最后一手牌是否只能用炸弹来接 app.room.isMustBomb = response.isMustBomb if app.club_php.clubID and app.club_php.clubID ~= 0 and roomInfo.nGameStartCount > 0 then app.club_php:getClubList(); end --当前操作玩家id roomInfo.curOpUid = response.curOpUid --当前操作玩家操作类型 0-pass 1-可以出牌也可以pass 2-只能出牌 roomInfo.curOpType = response.curOpType self:setRoomInfo(roomInfo) -- 处理玩家信息 for _,v in ipairs(response.recoverItem) do local player = {} player.playFlag = v.playFlag player.userId = v.userId player.seatId = v.seatId player.jsonInfo = v.jsonInfo local oinfo = json.decode(v.jsonInfo) player.unionid = oinfo.unionid player.headimgurl = oinfo.headimgurl player.gpsInfo = oinfo.gpsInfo player.sex = oinfo.sex player.openid = oinfo.openid player.nickname = oinfo.nickname player.areano = oinfo.areano self:addPlayer(player) -- 俱乐部需要 if self.roomInfo.memberList[v.userId] == nil then self.roomInfo.memberList[v.userId] = {} end self.roomInfo.memberList[v.userId].nUserId = v.userId self.roomInfo.memberList[v.userId].nSeatId = v.seatId self.roomInfo.memberList[v.userId].nPlayerFlag = v.playFlag self.roomInfo.memberList[v.userId].userInfo = v.jsonInfo self.roomInfo.memberList[v.userId].nDisbandStatus = v.disbandStatus local fastStartPlayer = {} fastStartPlayer.userId = v.userId fastStartPlayer.fastStartStatus = v.fastStartStatus table.insert(roomInfo.fastStartPlayersStatus, fastStartPlayer) end if response.extInfo and type(response.extInfo)=='string' and response.extInfo~="" then local extInfo = json.decode(response.extInfo) if extInfo and type(extInfo)=='table' and extInfo[tostring(self:getMyself())] then self.roomInfo.quickStartInfo = extInfo.faststart--提前开局 end local passShow = extInfo.passuser or {} local tmpShowPass = {} for i,v in ipairs(passShow) do tmpShowPass[tostring(v)] = true end for _,v in pairs(roomInfo.recoverItem) do v.operate = extInfo[tostring(v.userId)].operate v.passShow = tmpShowPass[tostring(v.userId)] v.offtime = 0 if extInfo[tostring(v.userId)] and extInfo[tostring(v.userId)].offtime then v.offtime = extInfo[tostring(v.userId)].offtime end end end for _,v in pairs(self._players) do self:addPlayer({userId=v.userId, viewPos=self:transPos(v.seatId)}) end --检测GPS self:updateGpsUserInfo(nil,false) self:dispatchEvent({name = "onEnterRoomSuccess", gameId = GAME_IDS.luzhouPaoDeKuai, gameType = 1}) -- self:dispatchEvent({name = "onResponseGameRecover"}) end function Room:test() logD("--------------------------pdk room test") end -- 通知服务器玩家GPS数据发生变化 function Room:onGpsChangeRequest() print("Room:onUserInfoChangeRequest()") local request = StringPacket:new() request.stringValue = app.user.userInfo or "" logD("Room:onGpsChangeRequest()", table.tostring(request)) self:sendResponse{cmd = PdkCmd.GAME_COMMAND_CLIENT_CHANGE_USERINFO , sender = request}; end -- 服务器下发玩家GPS数据发生变化 --[[function Room:onGpsChangeResponse(status, response) print("Room:onGpsChangeResponse()", table.tostring(response)) local nUserId = response.uid local memberInfo = self.roomInfo.memberList[nUserId] if memberInfo then memberInfo.userInfo = response.userInfo end local player = self._players[tostring(nUserId)] player.jsonInfo = response.userInfo self:dispatchEvent({name = "onGpsChangeResponse", nUserId = nUserId}); end--]] --更新gps用户数据 --需要检测的ID 没有则检测所有人的距离 --isOpenView 危险距离是否主动弹出提示 function Room:updateGpsUserInfo(userId,isOpenView) self.checkGpsID = self.checkGpsID or {} for i,v in pairs(self.checkGpsID) do if v == userId then table.remove(self.checkGpsID,i) return--同一ID4秒内只检测一次 end end if self.roomInfo and self.roomInfo.memberList then local gameStartCount = self:getRoomInfo().nGameStartCount or 0 local isGameStart = gameStartCount>0 --如果是游戏开始后收到消息则不处理 local userInfoList = self:getUserInfoList() if isGameStart then isOpenView = false end table.insert(self.checkGpsID,userId) self:dispatchEvent({ name = GAME_EVENT.GPS_UPDATE_USER_INFO, userId=userId, userInfoList = userInfoList, isOpenView = isOpenView or false, isGameStart = isGameStart, -- maxPlayerNum = self.roomInfo.nMaxPlayCount, }) end end -- 申请托管 function Room:requestTuoGuan(optType) local request = PdkMessage.sendTuoGuan:new() request.entrustType = optType; logD("requestTuoGuan",table.tostring(request)) self:sendResponse{cmd = PdkCmd.GAME_COMMAND_REQUEST_TUOGUAN , sender = request}; end function Room:onTuoGuanResponse(status, response) logD("Room:onTuoGuanResponse(), ", table.tostring(response)) if not self.roomInfo then logD("self.roomInfo no exist,容错处理!") return end self.roomInfo.hostInfos = response.userCnt self:dispatchEvent({name = "onTuoGuanResponse",response = response}); end return Room