local ServerItemData = class("ServerItemData", ServerBaseData) function ServerItemData:init(data) data = data or {} self.data.items = {} for idStr, item in pairs(data) do local id = tonumber(idStr) if id == GConst.ItemConst.ITEM_ID_VIT then local ServerGameData = require "app/server/data/server_game_data" ServerGameData.PlayerData:setVit(item.count) end self.data.items[id] = {cfg_id = id, count = item.count} end self.data.recoveries = data.recoveries or {} self:checkRecoveries() end function ServerItemData:tryAddItem(id, num) if not self.data.items[id] then if num < 0 then return false end else if self.data.items[id].count + num < 0 then return false end end return true end function ServerItemData:addItem(id, num, getType) local hadNum = 0 if self.data.items[id] then hadNum = self.data.items[id].count else self.data.items[id] = {} self.data.items[id].cfg_id = id self.data.items[id].count = 0 end local finalNum = (hadNum or 0) + num if finalNum < 0 then finalNum = 0 end local ServerGameData = require "app/server/data/server_game_data" if id == GConst.ItemConst.ITEM_ID_VIT then ServerGameData.PlayerData:setVit(finalNum) end self.data.items[id].count = finalNum if num < 0 then if id == GConst.ItemConst.ITEM_ID_GEM then ServerGameData.TaskData:addTaskProgress(GConst.TASK_TYPE.TASK_GEM_COST, -num) end end getType = getType or "" if num > 0 and id == GConst.ItemConst.ITEM_ID_GOLD and getType ~= GConst.ServerDataConst.DATA_OP_BEHAVIOR.EQUIP_RESOLVE and getType ~= GConst.ServerDataConst.DATA_OP_BEHAVIOR.EQUIP_REBACK then ServerGameData.TaskData:addTaskProgress(GConst.TASK_TYPE.TASK_GOLD_GET, num) end end function ServerItemData:getAllItems() return self.data.items end function ServerItemData:getItemNumById(id) if not self.data.items[id] then return 0 end local num = self.data.items[id].count or 0 return num end function ServerItemData:checkRecoveries() local recoveryCfg = self:getRecoveryCfg() for k, v in pairs(recoveryCfg) do local inList = false for ii, vv in ipairs(self.data.recoveries) do if vv.cfg_id == k then inList = true end end if not inList then table.insert(self.data.recoveries, {cfg_id = k, ts = Time:getServerTime()}) end end self:recoveryItems() end function ServerItemData:recoveryItems() if not self.data.recoveries then return end for i,v in ipairs(self.data.recoveries) do if v.cfg_id == GConst.ItemConst.ITEM_ID_VIT then local maxCount = self:getMaxVit() self:recoveryItem(v, maxCount) end end end function ServerItemData:recoveryItem(data, maxCount) if not CS.BF.BFMain.IsGotServerTime then return end if data.cfg_id == GConst.ItemConst.ITEM_ID_VIT then local ServerGameData = require "app/server/data/server_game_data" local currentCount = ServerGameData.PlayerData:getVit() if currentCount >= maxCount then -- 已经达到上限 return end local cfg = self:getRecoveryCfg()[data.cfg_id] local nowTime = Time:getServerTime() local diffTime = nowTime - data.ts if diffTime <= 0 then return end local addCount = math.floor(diffTime / cfg.time) if addCount <= 0 then return end end local currentCount = self:getItemNumById(data.cfg_id) if currentCount >= maxCount then -- 已经达到上限 return end local cfg = self:getRecoveryCfg()[data.cfg_id] local nowTime = Time:getServerTime() local diffTime = nowTime - data.ts if diffTime <= 0 then return end local addCount = math.floor(diffTime / cfg.time) if addCount <= 0 then return end data.ts = data.ts + cfg.time*addCount if currentCount + addCount > maxCount then addCount = maxCount - currentCount end self:addItem(data.cfg_id, addCount) ServerDataManager:saveData() end function ServerItemData:resetVitRecoverTime() local maxCount = self:getMaxVit() local ServerGameData = require "app/server/data/server_game_data" local currentCount = ServerGameData.PlayerData:getVit() if currentCount >= maxCount then -- 已经达到上限 return end local currentCount = self:getItemNumById(GConst.ItemConst.ITEM_ID_VIT) if currentCount >= maxCount then -- 已经达到上限 return end for i,v in ipairs(self.recoveries) do if v.cfg_id == GConst.ItemConst.ITEM_ID_VIT then self.data.recoveries[i].ts = Time:getServerTime() end end end function ServerItemData:getRecoveryCfg() if self.recoveryCfg == nil then self.recoveryCfg = ConfigManager:getConfig("recovery") end return self.recoveryCfg end function ServerItemData:getMaxVit() if self.maxVit == nil then local cfg = self:getRecoveryCfg()[GConst.ItemConst.ITEM_ID_VIT] self.maxVit = cfg.limit end return self.maxVit end return ServerItemData