AdvAction.lua 4.44 KB
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