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