local ipairs = ipairs local table = table local math = math local next = next local string = string local redisproxy = redisproxy local MsgPack = MsgPack local getRandomName = getRandomName local mcast_util = mcast_util local string_format = string.format local tonumber = tonumber local require = require local table_insert = table.insert local tconcat = table.concat local table_unpack = table.unpack local _M = {} --开始一个新的关卡 function _M.startAdvRpc( agent, data ) local role = agent.role local msg = MsgPack.unpack(data) local chapterId = msg.chapterId --上一个关卡结束才可以开始新的关卡 local advInfo = role:getProperty("advInfo") if next(advInfo) then return end role:getAdvData():initByChapter(chapterId, 1) SendPacket(actionCodes.Adv_startAdvRpc, '') return true end function _M.roleFormatRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local advTeam = role:getProperty("advTeam") for slot, heroId in pairs(msg.heros) do if not role.heros[heroId] then return end end table.clear(advTeam) advTeam.heros = {} for slot, heroId in pairs(msg.heros) do advTeam.heros[slot] = heroId end advTeam.leader = msg.leader role:updateProperty({field = "advTeam", value = advTeam}) SendPacket(actionCodes.Adv_roleFormatRpc, '') return true end -- 点击地块(解锁)(触发事件) function _M.clickBlockRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local adv = role:getAdvData() local status = adv:clickBlock(msg.roomId, msg.blockId, msg) if not status then return end SendPacket(actionCodes.Adv_clickBlockRpc, MsgPack.pack({events = adv:popBackEvents()})) return true end --use item 使用背包道具 function _M.useItemRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local adv = role:getAdvData() local status = adv:useItem(msg.itemId, msg.count, msg.target) -- target {roomId = 1, blockId = 1} 选择的目标 if not status then return end SendPacket(actionCodes.Adv_useItemRpc, MsgPack.pack({events = adv:popBackEvents()})) return true end --使用营养技能 function _M.usePotionRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local dishLevel = role.dinerData:getProperty("dishTree"):getv(msg.potionId, 0) if dishLevel == 0 then return end local adv = role:getAdvData() local status = adv:usePotion(msg.potionId, dishLevel, msg.target) -- target {roomId = 1, blockId = 1} 选择的目标 if not status then return end SendPacket(actionCodes.Adv_usePotionRpc, MsgPack.pack({events = adv:popBackEvents()})) return true end --退出 function _M.exitAdvRpc(agent, data) local role = agent.role -- local msg = MsgPack.unpack(data) local adv = role:getAdvData() local status = adv:exit() -- target {roomId = 1, blockId = 1} 选择的目标 SendPacket(actionCodes.Adv_exitAdvRpc, MsgPack.pack({events = adv:popBackEvents()})) return true end --开始战斗 function _M.startBattleRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) -- 校验一下信息 local roomId = msg.roomId local blockId = msg.blockId local monsterId = msg.monsterId local enemyId = msg.enemyId if not enemyId then return end local adv = role:getAdvData() local enemy = adv.battle:getEnemyById(enemyId) if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId or enemy.lock or enemy.isDead then return end local key = tostring(math.random()) adv.__battleCache = { enemyId = enemyId, key = key } SendPacket(actionCodes.Adv_startBattleRpc, MsgPack.pack({key = key})) return true end -- 结束战斗 function _M.endBattleRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local roomId = msg.roomId local blockId = msg.blockId local monsterId = msg.monsterId local enemyId = msg.enemyId local key = msg.key local player = msg.player if not player or not player.hp or not player.sp or not enemyId or not key then return end local adv = role:getAdvData() -- 校验 if not adv.__battleCache then return end if adv.__battleCache.enemyId ~= enemyId then return end local enemy = adv.battle:getEnemyById(enemyId) if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId then return end adv.__battleCache = nil local status = adv:clickBlock(roomId, blockId, {player = player}) if not status then return end SendPacket(actionCodes.Adv_endBattleRpc, MsgPack.pack({events = adv:popBackEvents()})) return true end return _M