CarAction.lua 5.52 KB
local ipairs = ipairs
local table = table
local math = math
local redisproxy = redisproxy
local MsgPack = MsgPack

local _M = {}

function _M.makePotionRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local potionId = msg.id
	local count = msg.count
	if count < 1 then return 0 end
	local potionBag = role:getProperty("potionBag")
	local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 0)
	if potionLv < 1 then return 1 end

	local potionSet = csvdb["adv_potionCsv"][potionId]
	if not potionSet then return 2 end

	local potionData = potionSet[potionLv]
	if not potionData then return 3 end

	local own = potionBag[potionId] or 0
	if own+count > potionData.limit then
		return 4
	end

	local cost = potionData.material:toNumMap()
	for k, n in pairs(cost) do
		cost[k] = n * count
	end
	if not role:checkItemEnough(cost) then
		return 5
	end

	role:costItems(cost, {log = {desc = "makePotion", int1 = potionId, int2 = count}})
	potionBag[potionId] = own + count
	role:updateProperty({field = "potionBag", value = potionBag})
	role:checkTaskEnter("PotionMake", {count = count, id = potionId})

	role:log("role_action", {desc = "makePotion", int1 = potionId, int2 = count})
	SendPacket(actionCodes.Car_makePotionRpc, MsgPack.pack({potionBag = potionBag}))
	return true
end

function _M.equipUpRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id
	local count = msg.count

	local typ = math.floor((id-7000)/100)
	local lv = (id-7000)%100

	local dataSet = csvdb["equipCsv"][typ]
	if not dataSet then return 1 end
	local equipData = dataSet[lv]
	if not equipData then return 21 end
	if equipData.merge < 1 then return 22 end

	local maxLv = 3
	local nextLv = lv+1
	if nextLv%10 > maxLv then
		nextLv = nextLv+10-maxLv
	end
	local nextEquip = dataSet[nextLv]
	if not nextEquip then return 23 end

	local limit = csvdb["itemCsv"][nextEquip.id].limit ~= 0 and csvdb["itemCsv"][nextEquip.id].limit or math.huge

	if math.illegalNum(count, 1, limit)  then return 0 end

	local own = role:getEquipCount(typ,lv)
	local costCount = equipData.merge * count
	if own < costCount then
		return 3
	end

	local cost = equipData.cost:toNumMap()
	for k, n in pairs(cost) do
		cost[k] = n * count
	end
	if not role:checkItemEnough(cost) then
		return 4
	end

	role:costItems(cost, {log = {desc = "equipUp", int1 = id, int2 = count}})
	role:addEquip(typ, lv, -costCount, {log = {desc = "equipUp"}})
	role:addEquip(typ, nextLv ,count, {log = {desc = "equipUp"}})
	role:checkTaskEnter("EquipUp", {count = count})

	role:log("role_action", {desc = "equipUp", int1 = id, int2 = count})

	SendPacket(actionCodes.Car_equipUpRpc, '')
	return true
end

function _M.runeUpRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local uid = msg.uid
	local ownRune = role.runeBag[uid]
	if not ownRune then return 1 end
	if ownRune:getProperty("refer") ~= 0 then return 2 end

	local typ = ownRune:getProperty("type")
	local id = ownRune:getProperty("id")
	local level = ownRune:getProperty("level")

	local runeSet = csvdb["runeCsv"][typ]
	if not runeSet then return 4 end
	local runeData = runeSet[id]
	if not runeData then return 5 end

	local maxLv = #csvdb["rune_buildCsv"]
	if level >= maxLv then return 6 end
	local lvData = csvdb["rune_buildCsv"][level]
	local cost = lvData.cost:toNumMap()
	if not role:checkItemEnough(cost) then
		return 7
	end

	role:costItems(cost, {log = {desc = "runeUp", int1 = uid, int2 = level}})
	ownRune:updateProperty({field = "level",value = level+1})
	role:checkTaskEnter("RuneUp")

	ownRune:log({desc = "runeUp", int1 = level + 1})

	SendPacket(actionCodes.Car_runeUpRpc, '')
	return true
end

function _M.saleEquipRpc(agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local backs = msg.backs
	if not backs then return end
	for id, count in pairs(backs) do
		if not csvdb["itemCsv"][id] then return end
		local typ = math.floor((id-7000)/100)
		local lv = (id-7000)%100
		local own = role:getEquipCount(typ,lv)
		if math.illegalNum(count, 1, own)  then return end
	end
	local reward = {}
	local allCount = 0
	for id, count in pairs(backs) do
		allCount = allCount + count
		local itemData = csvdb["itemCsv"][id]
		local typ = math.floor((id-7000)/100)
		local lv = (id-7000)%100
		role:addEquip(typ, lv, -count, {log = {desc = "saleEquip"}}) -- 删掉装备
		-- 发奖励
		local one = itemData.sell_effect:toNumMap()
		for k ,v in pairs(one) do
			reward[k] = (reward[k] or 0) + v * count 
		end
	end
	role:checkTaskEnter("SaleEquip", {count = allCount})
	reward = role:award(reward, {log = {desc = "saleEquip"}})

	role:log("role_action", {desc = "saleEquip", int1 = allCount})

	SendPacket(actionCodes.Car_saleEquipRpc, MsgPack.pack({reward = reward}))
	return true
end

function _M.saleRuneRpc(agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local backs = msg.backs
	if not backs then return end

	local reward = {}
	local count = 0
	for _, uid in pairs(backs) do
		count = count + 1
		local rune = role.runeBag[uid]
		if not rune then return end
		if rune:getProperty("refer") ~= 0 then return end
		local itemData = csvdb["itemCsv"][rune:getProperty("id")]
		if not itemData then return end
		local one = itemData.sell_effect:toNumMap()
		for k ,v in pairs(one) do
			reward[k] = (reward[k] or 0) + v
		end
	end

	role:delRunes(backs, {log = {desc = "saleRune"}})
	role:checkTaskEnter("DecoRune", {count = count})
	reward = role:award(reward, {log = {desc = "saleRune"}})
	
	SendPacket(actionCodes.Car_saleRuneRpc, MsgPack.pack({reward = reward}))
	return true
end

return _M