local BagData = class("BagData", BaseData) local ItemConst = require "app/module/item/item_const" local SECONDS_PRE_DAY = 86400 BagData.RECOVERY_TYPE = { TIMELY = 1, DAILY = 2, } function BagData:ctor() self.ItemData = require("app/userdata/bag/item_data"):create() self.EquipData = require("app/userdata/bag/equip_data"):create() end function BagData:init(data) self.ItemData:init(data.items) self.EquipData:init(data.equips) self.recoveries = data.recoveries or {} -- ts在此处做转换:对每日回复来说,ts指下次回复时间;对时间回复来说,ts仍指上次回复时间 for i,v in pairs(self.recoveries) do self.recoveries[i].ts = self.recoveries[i].ts // 1000 -- local cfg = RecoveryCfg[v.id] -- if cfg.type == self.RECOVERY_TYPE.DAILY then -- self.recoveries[i].ts = self.recoveries[i].ts + SECONDS_PRE_DAY -- end end DataManager:registerDataCd("BagData") end function BagData:clear() self.ItemData:clear() self.EquipData:clear() self.recoveries = {} DataManager:unregisterDataCd("BagData") end -- 重置为上次回复的时间 function BagData:resetItemRecoveryTime(itemId) for i,v in pairs(self.recoveries) do if v.id == itemId and self.recoveries[i] then self.recoveries[i].ts = Time:getServerTime() end end end function BagData:getTimelyItemRecoveryTime(itemId) local data = self.recoveries[itemId] if not data then return -1 end -- 计算当前值和最大值 -- local cfg = RecoveryCfg[itemId] -- local curBigNum = self.ItemData:getItemBigNumById(itemId) -- local maxBigNum = BigNumOpt.getEmptyBigNum() -- if itemId == ItemConst.ITEM_ID_MINING_PICK then -- maxBigNum = DataManager.MiningData:getItemMineLimitNum() -- else -- maxBigNum = cfg.limit -- end -- -- 如果是最大,则重置上一次时间为当前时间 -- if BigNumOpt.bigNumCompare(curBigNum, BigNumOpt.num2BigNum(maxBigNum)) == 0 then -- data.ts = Time:getServerTime() -- return 1000 -- 需要持续重置,保持时间更新 -- end -- -- 计算时间 -- local intervalTime = cfg.time -- if itemId == GConst.ItemConst.ITEM_ID_MINING_PICK then -- intervalTime = DataManager.MiningData:getRecoverIntervalTime() -- end -- local remainTime = data.ts + intervalTime - Time:getServerTime() -- return remainTime end function BagData:getDailyItemRecoveryMaxTime(itemId) -- if itemId == ItemConst.ITEM_ID_PVP_KEY then -- if self.ItemData:isPvPKeyMax() then -- return -1 -- end -- elseif itemId == ItemConst.ITEM_ID_MOPPING_UP then -- if self.ItemData:isMoppingUpMax() then -- return -1 -- end -- end local data = self.recoveries[itemId] if data then return data.ts - Time:getServerTime() end return -1 end function BagData:getTimelyItemRecoveryMaxTime(itemId) local maxVit = 0 local vit = 0 -- if itemId == ItemConst.ITEM_ID_VIT then -- if self.ItemData:isVitMax() then -- return -1 -- end -- vit = self.ItemData:getVit() -- maxVit = DataManager.PlayerData:getMaxVit() -- elseif itemId == ItemConst.ITEM_ID_GUILD_KEY then -- if self.ItemData:isGuildBossKeyMax() then -- return -1 -- end -- vit = self.ItemData:getGuildBossKey() -- maxVit = self.ItemData:getMaxGuildBossKey() -- end local curTime = self:getTimelyItemRecoveryTime(itemId) if curTime < 0 then return -1 end -- local cfg = RecoveryCfg[itemId] -- if not cfg then -- return -1 -- end -- curTime = curTime + (maxVit - vit - 1)*cfg.time -- return curTime end -- 按时间回复的在此回复 function BagData:recoveryItem(data, maxBigNum) -- 计算已经达到上限 local curBigNum = self.ItemData:getItemBigNumById(data.id) if BigNumOpt.bigNumCompare(curBigNum, maxBigNum) >= 0 then return end -- 计算恢复间隔 -- local cfg = RecoveryCfg[data.id] -- local nowTime = Time:getServerTime() -- local diffTime = nowTime - data.ts -- 上次回复时间,此处计算离线总共回复多少个 -- if diffTime <= 0 then -- return -- end -- -- 计算增加数量 -- local recoverTime = cfg.time -- if data.id == GConst.ItemConst.ITEM_ID_MINING_PICK then -- 挖矿特殊处理,受研究属性影响 -- recoverTime = DataManager.MiningData:getRecoverIntervalTime() -- end -- local addCount = math.floor(diffTime / recoverTime) -- if addCount <= 0 then -- return -- end -- local addBigNum = BigNumOpt.num2BigNum(addCount) -- -- 计算此次实际增加数量 -- local addAfterNum = BigNumOpt.bigNumAdd(curBigNum, addBigNum) -- if BigNumOpt.bigNumCompare(addAfterNum, maxBigNum) > 0 then -- addBigNum = BigNumOpt.bigNumSub(maxBigNum, curBigNum) -- end -- Logger.logHighlight("实际恢复数量:".. BigNumOpt.bigNum2Num(addBigNum) ) -- -- 根据实际增加的数量,计算恢复时间 -- data.ts = data.ts + recoverTime * BigNumOpt.bigNum2Num(addBigNum) -- self.ItemData:addItemNumById(data.id, addBigNum, BIReport.ITEM_GET_TYPE.UPDATE_TIME) end -- 每日回复的在此回复 function BagData:recoveryDailyItem(key, data) -- local nowTime = Time:getServerTime() -- if nowTime < self.recoveries[key].ts then -- return -- end -- local itemId = data.id -- local cfg = RecoveryCfg[data.id] -- local curBigNum = self.ItemData:getItemBigNumById(itemId) -- local maxBigNum = cfg.limit -- if BigNumOpt.bigNumCompare(curBigNum, maxBigNum) < 0 then -- self.ItemData:addItemNumById(itemId, BigNumOpt.bigNumSub(maxBigNum, curBigNum), BIReport.ITEM_GET_TYPE.CROSS_DAY) -- end -- -- 计算下次回复的时间 -- self.recoveries[key].ts = self.recoveries[key].ts + SECONDS_PRE_DAY end function BagData:updateCd() if not self.recoveries then return end for i,v in pairs(self.recoveries) do -- local cfg = RecoveryCfg[v.id] -- if cfg.type == self.RECOVERY_TYPE.DAILY then -- self:recoveryDailyItem(i, v) -- 每日的直接加满 -- else -- local limit = cfg.limit -- if v.id == GConst.ItemConst.ITEM_ID_MINING_PICK then -- 挖矿的上限特殊处理,受属性影响 -- limit = DataManager.MiningData:getItemMineLimitNum() -- limit = BigNumOpt.num2BigNum(limit) -- end -- self:recoveryItem(v, limit) -- 根据间隔时间增加 -- end end end return BagData