307 lines
8.0 KiB
Lua
307 lines
8.0 KiB
Lua
local ItemEntity = require "app/userdata/bag/item_entity"
|
|
local ServerGameData = require "app/server/server_game_data"
|
|
|
|
local ItemConst = require "app/module/item/item_const"
|
|
local ItemData = class("ItemData", BaseData)
|
|
|
|
local RECOVERY_TYPE_DAILY = 2
|
|
local SECONDS_PRE_DAY = 86400
|
|
|
|
local CACHE_ITEM = {
|
|
cfg_id = 0,
|
|
count = 0
|
|
}
|
|
|
|
function ItemData:ctor()
|
|
self.items = {}
|
|
end
|
|
|
|
function ItemData:init(data)
|
|
self.items = {}
|
|
data = data or {}
|
|
if data.items then
|
|
for _, info in pairs(data.items) do
|
|
-- if info.id == GConst.ItemConst.ITEM_ID_GEM then
|
|
-- local parmas = {}
|
|
-- parmas.gem = BigNumOpt.bigNum2Num(info.count)
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(parmas)
|
|
-- elseif info.id == GConst.ItemConst.ITEM_ID_GOLD then
|
|
-- local parmas = {}
|
|
-- parmas.gold_value = info.count
|
|
-- parmas.gold_unit = info.count
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(parmas)
|
|
-- end
|
|
if info.cfg_id == GConst.ItemConst.ITEM_ID_VIT then
|
|
DataManager.PlayerData:setVit(info.count)
|
|
end
|
|
self:_add(info.cfg_id, info.count)
|
|
end
|
|
end
|
|
self.recoveryList = {}
|
|
self.recoveryMap = {}
|
|
if data.recoveries then
|
|
local recoveryCfg = ConfigManager:getConfig("recovery")
|
|
for k, v in ipairs(data.recoveries) do
|
|
local recoveryInfo = recoveryCfg[v.cfg_id]
|
|
if recoveryInfo then
|
|
local obj = {
|
|
cfg_id = v.cfg_id,
|
|
ts = v.ts,
|
|
limit = recoveryInfo.limit,
|
|
recoveryType = recoveryInfo.type,
|
|
time = recoveryInfo.time
|
|
}
|
|
self.recoveryMap[v.cfg_id] = obj
|
|
table.insert(self.recoveryList, obj)
|
|
end
|
|
end
|
|
end
|
|
self.data.dirty = false
|
|
end
|
|
|
|
function ItemData:_add(id, num)
|
|
self.items[id] = ItemEntity:create(id, num)
|
|
end
|
|
|
|
function ItemData:clear()
|
|
self.items = {}
|
|
end
|
|
|
|
-- 根据id获取道具
|
|
function ItemData:getItemById(id)
|
|
if self.items[id] then
|
|
return self.items[id]
|
|
end
|
|
local item = ItemEntity:create(id, 0)
|
|
self.items[id] = item
|
|
return self.items[id]
|
|
end
|
|
|
|
-- 获取所有道具数据
|
|
function ItemData:getAllItems()
|
|
return self.items
|
|
end
|
|
|
|
function ItemData:getItemBigNumById(id)
|
|
local num
|
|
if self.items[id] then
|
|
num = self.items[id]:getNum()
|
|
else
|
|
num = 0
|
|
end
|
|
return num
|
|
end
|
|
|
|
function ItemData:getItemNumById(id)
|
|
local num
|
|
if self.items[id] then
|
|
num = self.items[id]:getNum()
|
|
else
|
|
num = 0
|
|
end
|
|
return num
|
|
end
|
|
|
|
function ItemData:getVit()
|
|
return self:getItemNumById(GConst.ItemConst.ITEM_ID_VIT)
|
|
end
|
|
|
|
function ItemData:addItemReward(item, itemGetType)
|
|
CACHE_ITEM.cfg_id = GFunc.getRewardId(item)
|
|
CACHE_ITEM.count = GFunc.getRewardNum(item)
|
|
self:addItem(CACHE_ITEM, itemGetType)
|
|
end
|
|
|
|
function ItemData:addItemCost(cost, itemGetType)
|
|
CACHE_ITEM.cfg_id = GFunc.getRewardId(cost)
|
|
CACHE_ITEM.count = -GFunc.getRewardNum(cost)
|
|
self:addItem(CACHE_ITEM, itemGetType)
|
|
end
|
|
|
|
function ItemData:addItemCosts(costs, itemGetType)
|
|
if not costs then
|
|
return
|
|
end
|
|
for _, cost in ipairs(costs) do
|
|
self:addItemCost(cost, itemGetType)
|
|
end
|
|
end
|
|
|
|
function ItemData:addItem(data, itemGetType)
|
|
if data == nil then
|
|
return
|
|
end
|
|
|
|
if EDITOR_MODE then
|
|
if not itemGetType then
|
|
local params = {
|
|
content = "ItemData addItem has no itemGetType",
|
|
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
|
|
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
|
|
}
|
|
GFunc.showMessageBox(params)
|
|
Logger.log("ItemData addItem has no itemGetType")
|
|
end
|
|
end
|
|
|
|
self:_addItemNumById(data.cfg_id, data.count)
|
|
|
|
-- if data.cfg_id == GConst.ItemConst.ITEM_ID_GEM or data.cfg_id == GConst.ItemConst.ITEM_ID_GOLD then
|
|
-- if data.count < 0 then
|
|
-- if data.cfg_id == GConst.ItemConst.ITEM_ID_GOLD and itemGetType == BIReport.ITEM_GET_TYPE.TRAIN_UP then
|
|
-- else
|
|
-- BIReport:postGemUse(data.count, itemGetType, data.cfg_id)
|
|
-- if data.cfg_id == GConst.ItemConst.ITEM_ID_GEM then
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserAdd("gem", data.count)
|
|
-- elseif data.cfg_id == GConst.ItemConst.ITEM_ID_GOLD then
|
|
-- local goldNum = DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_GOLD)
|
|
-- local parmas = {}
|
|
-- parmas.gold = goldNum
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(parmas)
|
|
-- end
|
|
-- end
|
|
-- else
|
|
-- if data.cfg_id == GConst.ItemConst.ITEM_ID_GOLD and itemGetType == BIReport.ITEM_GET_TYPE.CHAPTER_DROP then
|
|
-- else
|
|
-- BIReport:postGemGet(data.count, itemGetType, data.cfg_id)
|
|
-- if data.cfg_id == GConst.ItemConst.ITEM_ID_GEM then
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserAdd("gem", data.count)
|
|
-- elseif data.cfg_id == GConst.ItemConst.ITEM_ID_GOLD then
|
|
-- local goldNum = DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_GOLD)
|
|
-- local parmas = {}
|
|
-- parmas.gold = goldNum
|
|
-- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(parmas)
|
|
-- end
|
|
-- end
|
|
-- end
|
|
-- else
|
|
-- if data.count < 0 then
|
|
-- BIReport:postItemUse(data.count, data.cfg_id, itemGetType)
|
|
-- else
|
|
-- BIReport:postItemGet(data.count, data.cfg_id, itemGetType)
|
|
-- end
|
|
-- end
|
|
end
|
|
|
|
function ItemData:addItemNumById(id, num, itemGetType)
|
|
CACHE_ITEM.cfg_id = id
|
|
CACHE_ITEM.count = num
|
|
self:addItem(CACHE_ITEM, itemGetType)
|
|
end
|
|
|
|
function ItemData:_addItemNumById(id, num)
|
|
if num == nil then
|
|
return
|
|
end
|
|
local isFull = false
|
|
if id == ItemConst.ITEM_ID_VIT then
|
|
local maxVit = DataManager.PlayerData:getMaxVit()
|
|
local currentCount = DataManager.PlayerData:getVit()
|
|
isFull = currentCount >= maxVit
|
|
end
|
|
if self.items[id] then
|
|
self.items[id]:addNum(num)
|
|
else
|
|
if id == GConst.ItemConst.ITEM_ID_VIT then
|
|
DataManager.PlayerData:setVit(num)
|
|
end
|
|
self:_add(id, num)
|
|
end
|
|
if id == ItemConst.ITEM_ID_VIT and isFull then
|
|
local maxVit = DataManager.PlayerData:getMaxVit()
|
|
local currentCount = DataManager.PlayerData:getVit()
|
|
local isNewFull = currentCount >= maxVit
|
|
if not isNewFull then
|
|
self:resetItemRecoveryTime(ItemConst.ITEM_ID_VIT)
|
|
end
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
function ItemData:setDirty()
|
|
self.data.dirty = not self.data.dirty
|
|
end
|
|
|
|
function ItemData:getTimelyItemRecoveryTime(itemId)
|
|
local data = self.recoveryMap[itemId]
|
|
if not data then
|
|
return -1
|
|
end
|
|
-- 计算当前值和最大值
|
|
local currNum = self:getItemNumById(itemId)
|
|
-- 如果是最大,则重置上一次时间为当前时间
|
|
if currNum >= data.limit then
|
|
return -1
|
|
end
|
|
-- 计算时间
|
|
local remainTime = data.ts + data.time - Time:getServerTime()
|
|
return remainTime
|
|
end
|
|
|
|
-- 按时间回复的在此回复
|
|
function ItemData:recoveryItem(data)
|
|
-- 计算已经达到上限
|
|
local itemId = data.cfg_id
|
|
local currNum = self:getItemNumById(itemId)
|
|
if currNum >= data.limit then
|
|
return
|
|
end
|
|
-- 计算恢复间隔
|
|
local nowTime = Time:getServerTime()
|
|
local diffTime = nowTime - data.ts -- 上次回复时间,此处计算离线总共回复多少个
|
|
if diffTime <= 0 then
|
|
return
|
|
end
|
|
-- 计算增加数量
|
|
local recoverTime = data.time
|
|
local addCount = math.floor(diffTime / recoverTime)
|
|
if addCount <= 0 then
|
|
return
|
|
end
|
|
-- 计算此次实际增加数量
|
|
local addAfterNum = currNum + addCount
|
|
if addAfterNum > data.limit then
|
|
addCount = data.limit - currNum
|
|
end
|
|
-- 根据实际增加的数量,计算恢复时间
|
|
data.ts = data.ts + recoverTime * addCount
|
|
self:addItemNumById(itemId, addCount, BIReport.ITEM_GET_TYPE.RECOVERY_TIME)
|
|
end
|
|
|
|
-- 每日回复的在此回复
|
|
function ItemData:recoveryDailyItem(data)
|
|
local nowTime = Time:getServerTime()
|
|
if nowTime < data.ts then
|
|
return
|
|
end
|
|
local itemId = data.cfg_id
|
|
local currNum = self:getItemNumById(itemId)
|
|
if currNum < data.limit then
|
|
self:addItemNumById(itemId, data.limit - currNum, BIReport.ITEM_GET_TYPE.CROSS_DAY)
|
|
end
|
|
-- 计算下次回复的时间
|
|
data.ts = data.ts + SECONDS_PRE_DAY
|
|
end
|
|
|
|
function ItemData:resetItemRecoveryTime(itemId)
|
|
local obj = self.recoveryMap[itemId]
|
|
if obj then
|
|
obj.ts = Time:getServerTime()
|
|
end
|
|
end
|
|
|
|
function ItemData:updateCd()
|
|
if not self.recoveryList then
|
|
return
|
|
end
|
|
for i, v in ipairs(self.recoveryList) do
|
|
if v.recoveryType == RECOVERY_TYPE_DAILY then
|
|
self:recoveryDailyItem(v) -- 每日的直接加满
|
|
else
|
|
self:recoveryItem(v) -- 根据间隔时间增加
|
|
end
|
|
end
|
|
ServerGameData.BagData.ItemData:recoveryItems()
|
|
end
|
|
|
|
return ItemData |