c1_lua/lua/app/server/data/server_item_data.lua
2023-04-28 00:00:32 +08:00

213 lines
5.3 KiB
Lua

local ServerItemData = class("ServerItemData", ServerBaseData)
function ServerItemData:init(data)
self.data.items = {}
if data then
for idStr, item in pairs(data.items) do
local id = tonumber(idStr)
if id == GConst.ItemConst.ITEM_ID_VIT then
local ServerGameData = require "app/server/server_game_data"
ServerGameData.PlayerData:setVit(item.count)
end
self.data.items[idStr] = {cfg_id = id, count = item.count}
end
self.data.recoveries = data.recoveries or {}
else
self.data.recoveries = {}
end
self:checkRecoveries()
end
function ServerItemData:tryAddItem(id, num)
local idStr = tostring(id)
if not self.data.items[idStr] then
if num < 0 then
return false
end
else
if self.data.items[idStr].count + num < 0 then
return false
end
end
return true
end
function ServerItemData:getAllItems()
return self.data.items
end
function ServerItemData:getItemNumById(id)
local idStr = tostring(id)
if not self.data.items[idStr] then
return 0
end
local num = self.data.items[idStr].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(true)
end
function ServerItemData:recoveryItems(isInit)
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, isInit)
end
end
end
function ServerItemData:recoveryItem(data, maxCount, isInit)
if not CS.BF.BFMain.IsGotServerTime then
return
end
if data.cfg_id == GConst.ItemConst.ITEM_ID_VIT then
local ServerGameData = require "app/server/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)
if data.cfg_id == GConst.ItemConst.ITEM_ID_VIT then
BIReport:postVitGet(addCount, BIReport.ITEM_GET_TYPE.RECOVERY_TIME, self:getItemNumById(data.cfg_id))
end
ServerDataManager:saveData()
end
function ServerItemData:resetVitRecoverTime()
local maxCount = self:getMaxVit()
local ServerGameData = require "app/server/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.data.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
function ServerItemData:addItemReward(item, getType)
local id = GFunc.getRewardId(item)
local num = GFunc.getRewardNum(item)
self:addItem(id, num, getType)
end
function ServerItemData:addItemCost(cost)
local id = GFunc.getRewardId(cost)
local num = GFunc.getRewardNum(cost)
self:addItem(id, -num)
end
function ServerItemData:addItem(id, num, getType)
if id == GConst.ItemConst.ITEM_ID_VIT then
local maxCount = self:getMaxVit()
local currentCount = self:getItemNumById(GConst.ItemConst.ITEM_ID_VIT)
local isMax = currentCount >= maxCount
self:_addItem(id, num, getType)
local currentCount = currentCount + num
local isMax1 = currentCount >= maxCount
if not isMax1 then
if isMax then
self:resetVitRecoverTime()
else
self:recoveryItems()
end
end
else
self:_addItem(id, num, getType)
end
end
function ServerItemData:_addItem(id, num, getType)
local idStr = tostring(id)
local hadNum = 0
if self.data.items[idStr] then
hadNum = self.data.items[idStr].count
else
self.data.items[idStr] = {}
self.data.items[idStr].cfg_id = id
self.data.items[idStr].count = 0
end
local finalNum = (hadNum or 0) + num
if finalNum < 0 then
finalNum = 0
end
local ServerGameData = require "app/server/server_game_data"
if id == GConst.ItemConst.ITEM_ID_VIT then
ServerGameData.PlayerData:setVit(finalNum)
end
self.data.items[idStr].count = finalNum
end
return ServerItemData