DinerAction.lua 6.79 KB
local ipairs = ipairs
local table = table
local math = math
local redisproxy = redisproxy
local MsgPack = MsgPack

local _M = {}

function _M.addSellRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)

	local slot = msg.slot
	if math.illegalNum(slot, 1, role.dinerData:getMaxSlots()) then
		return 1
	end
	slot = tostring(slot)

	local dish = msg.dish
	local dishSet = csvdb["diner_dishCsv"][dish]
	if not dishSet then
		return 2
	end
	local dishLevel = role.dinerData:getProperty("dishTree"):getv(dish, 0)
	if dishLevel == 0 then
		return 3
	end
	local dishData = dishSet[dishLevel]
	if not dishData then
		return 4
	end

	local calSell = role.dinerData:updateSell(slot, true) or {
		deltaCount = 0,
		deltaTime = 0,
		lastCount = 0,
	}
	local count = msg.count
	local maxDishCount = role.dinerData:getMaxDishs()
	if math.illegalNum(count + calSell.lastCount, 1, maxDishCount) then
		return 5
	end

	local cost = dishData.material:toNumMap()
	for _, n in pairs(cost) do
		n = n * count
	end
	if not role:checkItemEnough(cost) then
		return 6
	end

	role:costItems(cost)
	role.dinerData:updateSell(slot)

	local sells = json.decode(role.dinerData:getProperty("sells"))
	if not sells[slot] then
		sells[slot] = {
			dish = dish,
			level = dishLevel,
			totalCount = 0,
			count = 0,
		}
	end
	local sell = sells[slot]
	sell.totalCount = sell.totalCount + count
	sell.count = sell.count + count
	sell.time = skynet.timex() - calSell.deltaTime
	sell.hot = role.dinerData:getProperty("hot"):getv(sell.dish, 0)

	role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
	SendPacket(actionCodes.Diner_addSellRpc, "")
	
	return true
end

function _M.removeSellRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)

	local slot = msg.slot
	if math.illegalNum(slot, 1, role.dinerData:getMaxSlots()) then
		return 1
	end
	slot = tostring(slot)
	local sells = json.decode(role.dinerData:getProperty("sells"))
	local sell = sells[slot]
	if not sell then
		return 2
	end

	local dish = sell.dish
	local dishSet = csvdb["diner_dishCsv"][dish]
	if not dishSet then
		return 3
	end
	local dishLevel = role.dinerData:getProperty("dishTree"):getv(dish, 0)
	if dishLevel == 0 then
		return 4
	end
	local dishData = dishSet[dishLevel]
	if not dishData then
		return 5
	end

	local reward = {}
	local cost = dishData.material:toNumMap()
	for k, n in pairs(cost) do
		local sum = n*sell.count
		role:addItem({itemId = k,count = sum})
		reward[k] = sum
	end
	sells[slot] = nil
	role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
	SendPacket(actionCodes.Diner_removeSellRpc, MsgPack.pack({reward = reward}))
	return true
end

function _M.getSellRewardRpc( agent, data )
	local role = agent.role
	local rewards = {}
	local sells = json.decode(role.dinerData:getProperty("sells"))
	for slot,sell in pairs(sells) do
		local info = role.dinerData:updateSell(slot)
		if info.deltaCount > 0 then
			local dish = sell.dish
			local dishSet = csvdb["diner_dishCsv"][dish]
			if not dishSet then
				return 3
			end
			local dishLevel = role.dinerData:getProperty("dishTree"):getv(dish, 0)
			if dishLevel == 0 then
				return 4
			end
			local dishData = dishSet[dishLevel]
			if not dishData then
				return 5
			end

			local reward = dishData.item_normal:toNumMap()
			if sell.hot then
				for k,v in pairs(dishData.item_popular:toNumMap()) do
					if reward[k] then
						reward[k] = reward[k] + v
					else
						reward[k] = v
					end
				end
			end
		
			for k, n in pairs(reward) do
				local sum = n*info.deltaCount
				role:addItem({itemId = k,count = sum})
				rewards[k] = sum
			end
		end
	end

	sells = json.decode(role.dinerData:getProperty("sells"))
	for _,sell in pairs(sells) do
		if sell.count == 0 then
			sell = nil
		end
	end
	role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
	SendPacket(actionCodes.Diner_getSellRewardRpc, MsgPack.pack({reward = rewards}))
	return true
end

function _M.levelUpRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)

	local index = msg.index
	local buildingSet = csvdb["diner_buildingCsv"][index]
	if not buildingSet then
		return
	end

	local buildL = role.dinerData:getProperty("buildL")
	local curLevel = buildL:getv(index, 1)
	if curLevel >= #buildingSet then
		return
	end
	local buildingData = buildingSet[curLevel]
	if not buildingData then
		return
	end
	if buildingData.upLimit ~= "" then
		local id, level = buildingData.upLimit:match("(%d+)=(%d+)")
		if buildL:getv(tonumber(id), 1) < tonumber(level) then
			return
		end
	end

	local cost = buildingData.starCost:toNumMap()
	if not role:checkItemEnough(cost) then
		return 
	end

	role:costItems(cost)
	role.dinerData:updateProperty({field = "buildL", value = buildL:setv(index, curLevel + 1)})

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

function _M.talentUpRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)

	local dish = msg.dish
	local dishSet = csvdb["diner_dishCsv"][dish]
	if not dishSet then
		return
	end

	local dishTree = role.dinerData:getProperty("dishTree")
	local dishLevel = dishTree:getv(dish, 0)
	local cost = {}
	local treePoint = {}
	if dishLevel == 0 then
		local dishData = dishSet[1]
		if dishData.unlock_tree > 0 then
			if dishTree:getv(dishData.unlock_tree, 0) == 0 then
				return
			end
		end
		if dishData.unlock_carbon > 0 then
			local hangPass = role:getProperty("hangPass")
			if not hangPass[dishData.unlock_carbon] then
				return
			end
		end
		cost = globalCsv.diner_sell_dish_talent_unlock:toNumMap()
	else
		if dishLevel >= #dishSet then
			return
		end
		local dishData = dishSet[dishLevel]
		cost = dishData.tree_material:toNumMap()
		treePoint = dishData.tree_point:toNumMap()
	end
	if not role:checkItemEnough(cost) then
		return
	end

	role:costItems(cost)
	role.dinerData:updateProperty({field = "dishTree", value = dishTree:setv(dish, dishLevel + 1)})
	if next(treePoint) then
		role:award(treePoint)
	end

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

function _M.skillUpRpc( agent, data )
	local role = agent.role
	local msg = MsgPack.unpack(data)

	local skill = msg.skill
	local skillSet = csvdb["diner_skillCsv"][skill]
	if not skillSet then
		return
	end

	local skillTree = role.dinerData:getProperty("skillTree")
	local skillLevel = skillTree:getv(skill, 1)
	local skillData = skillSet[skillLevel]
	if not skillData then
		return
	end
	if skillData.unlock ~= "" then
		local id, level = skillData.unlock:math("(%d+)=(%d+)")
		if skillTree:getv(tonumber(id), 1) < tonumber(level) then
			return
		end
	end
	local cost = skillData.cost:toNumMap()
	if not role:checkItemEnough(cost) then
		return
	end

	role:costItems(cost)
	role.dinerData:updateProperty({field = "skillTree", value = skillTree:setv(skill, skillLevel + 1)})

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

return _M