RolePlugin.lua 4.38 KB


local RolePlugin = {}

function RolePlugin.bind(Role)

	function Role:log()

	end

	function Role:loadAll()
		self:loadHeros()
	end

	function Role:reloadWhenLogin()
	end

	function Role:onCrossDay(now)

	end
	function Role:onOfflineEvent()
		
	end


	local function _award(self, itemId, count, params)
		local itemData = csvdb["itemCsv"][itemId]
		local curType = itemData.type
		local change = {} -- 奖励被转化为了其他奖励 id = count

		if curType == ItemType.Hero then
			params.type = itemId - ItemStartId.Hero
			for i = 1, count do
				self:addHero(params)
			end
		else
			params.itemId = itemId
			params.count = count
			self:addItem(params)
		end

		return count, change --  count 刷新实际发放的奖励个数 change 物品实际奖励与当前id 不符 就发生转换 而不实际发奖
	end


	-- 发奖功能入口  award string id=count or {[id] = count}
	function Role:award(gift, params)
		local tgift = {}
		if type(award) == "string" then
			for _, one in pairs(gift:toTableArray(true)) do
				tgift[one[1]] = (tgift[one[1]] or 0) + one[2]
			end
		else
			tgift = gift
		end
		local reward, allChange = {}, {}

		for itemId, count in pairs(tgift) do
			local count, change = _award(self, itemId, count, clone(params or {}))
			if next(change) then
				local cr, cc = self:award(change, params) -- 内部转换忽略
				for _id, _ct in pairs(cr) do
					reward[_id] = (reward[_id] or 0) + _ct
				end
				table.insert(allChange, {form = {[itemId] = count}, to = cr})
			else
				reward[itemId] = (reward[itemId] or 0) + count
			end
		end

		return reward, allChange --实际获得的奖励 和 最高级奖励转化过程
	end

	function Role:addItem(params)
		params = params or {}
		local items = self:getProperty("items")
		local origin = items:getv(params.itemId, 0)
		local nums = origin+params.count
		if nums <= 0 then
			items = items:delk(params.itemId)
			nums = 0
		else
			items = items:incrv(params.itemId, params.count)
		end
		self:setProperty("items", items)
		if not params.notNotify then
			SendPacket(actionCodes.Role_updateItems, MsgPack.pack({[params.itemId] = nums}))
		end
	end

	function Role:checkItemEnough(itemCountT)
		local less = {}
		for itemId, count in pairs(itemCountT) do
			local last = self:getItemCount(itemId) - count
			if last < 0 then
				less[itemId] = -last
			end
		end
		return (not next(less)), less -- 是否足够,,缺什么缺多少
	end

	function Role:costItems(itemCountT, params)
		for itemId, count in pairs(itemCountT) do
			local pms = clone(params or {})
			pms.itemId = itemId
			pms.count = - count
			self:addItem(pms)
		end
	end

	function Role:getItemCount(itemId)
		return self:getProperty("items"):getv(itemId, 0)
	end

	function Role:addHero(params)
		local roleId = self:getProperty("id")
		local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1))

		local heroType = params.type
		local unitData = csvdb["unitCsv"][heroType]

		redisproxy:sadd(string.format(R_HEROS, roleId), heroId)

		local heroInfo = {
			key = string.format(R_HERO, roleId, heroId),
			id 	= heroId,
			type= heroType,
		}
		
		local newHero = require("models.Hero").new(heroInfo)
		newHero:create()
		newHero.owner = self
		newHero:saveBattleValue()
		self.heros[heroId] = newHero

		if not params.notNotify then
			local heroResponse = {}
			table.insert(heroResponse, newHero:data())
			local bin = MsgPack.pack(heroResponse)
			SendPacket(actionCodes.Hero_loadInfos, bin)
		end
	end

	function Role:delHero(params)
		local roleId = self:getProperty('id')
		local hero = self.heros[heroId]
		if not hero then return end

		self.heros[heroId] = nil
		redisproxy:pipelining(function (red)
			red:del(string.format(R_HERO, roleId, heroId))
			red:srem(string.format(R_HEROS, roleId), heroId)
		end)
		SendPacket(actionCodes.Hero_loadInfos, MsgPack.pack({{id = heroId, bDel = true}}))
	end

	function Role:loadHeros()
		local roleId = self:getProperty("id")
		local heroIds = redisproxy:smembers(string.format(R_HEROS, roleId))
		local redret = redisproxy:pipelining(function (red)
			for _, heroId in ipairs(heroIds) do
				red:hgetall(string.format(R_HERO, roleId, heroId))
			end
		end)
		for index, heroId in ipairs(heroIds) do
			local hero = require("models.Hero").new({key = string.format(R_HERO, roleId, heroId)})
			if hero:load(table.array2Table(redret[index])) then
				hero.owner = self
				self.heros[tonumber(heroId)] = hero
			end
		end
	end

end

return RolePlugin