require "config.CONST_CONFIG"
local Item_Config = require "config.Item_Config"
local DataComponentBase = require "gameplay.data.DataComponentBase"
local Data_Item = Inherit(DataComponentBase)
local m_ItemList = {} --普通物品列表RewardType.Prop
local m_TimeItemList = {} --限时物品列表RewardType.PropTime
local m_NewItemList = {}
function Data_Item:InitData()
end
function Data_Item:OnLogin() --进入系统
self.m_NewItemList = {}
end
function Data_Item:OnLogout() --退出系统
self.m_NewItemList = nil
self.m_ItemList = nil
self.m_TimeItemList = nil
end
function Data_Item:InitItems(_Items, _TimeItems) --初始化道具
self.m_ItemList = _Items
self.m_TimeItemList = _TimeItems
end
function Data_Item:UpdateItems(_ItemInfo) --更新道具
if _ItemInfo then
if _ItemInfo.type == EnumConfig.RewardType.PropTime then
self:UpdateTimeItem(_ItemInfo)
else
self:UpdateItem(_ItemInfo)
end
--判断物品是否是新增
self:CheckAddNewItem(_ItemInfo)
end
end
function Data_Item:UpdateItem(_ItemInfo)
if _ItemInfo.finalValue > 0 then
self.m_ItemList[_ItemInfo.id] = _ItemInfo.finalValue
else
self.m_ItemList[_ItemInfo.id] = nil
-- table.remove(self.m_ItemList, _ItemInfo.id)
end
end
function Data_Item:UpdateTimeItem(_ItemInfo)
if _ItemInfo.finalValue == 0 or _ItemInfo.value == 0 then
return
end
if _ItemInfo.finalValue == _ItemInfo.value and _ItemInfo.value > 0 then
--新增物品
local _NewItem = self:GetNewItem(_ItemInfo.type, _ItemInfo.id, _ItemInfo.finalValue, _ItemInfo.opt)
table.insert(self.m_TimeItemList, _NewItem)
else
--原来有的物品,数量改变,或者从列表移除
for k,v in pairs(self.m_TimeItemList or {}) do
if v and v.id == _ItemInfo.id then
if _ItemInfo.finalValue <= 0 then
--移除
table.remove(self.m_TimeItemList, k)
break
else
--改变数量
self.m_TimeItemList[k].value = _ItemInfo.finalValue
break
end
end
end
end
end
function Data_Item:CheckAddNewItem(_ItemInfo)
if _ItemInfo.value > 0 then
if _ItemInfo.finalValue == _ItemInfo.value then
--全新的物品
self.m_NewItemList[_ItemInfo.id] = _ItemInfo.type
else
--数量增加
end
else
--数量减少
end
end
function Data_Item:IsNewItem(_ItemType, _ItemID)
--检测是否是新的物品
for k,v in pairs(self.m_NewItemList or {}) do
if k == _ItemID and v == _ItemType then
self.m_NewItemList[k] = nil
return true
end
end
return false
end
function Data_Item:IsNewType(_ItemType)
--TODO 检测标签页是否显示红点
return false
end
function Data_Item:GetItemList()
local _OutItems = {}
for k,v in pairs(self.m_ItemList or {}) do
local _CurItem = self:GetNewItem(EnumConfig.RewardType.Prop, k, v, 0)
table.insert(_OutItems, _CurItem)
end
for k,v in pairs(self.m_TimeItemList or {}) do
local _CurItem = self:GetNewItem(EnumConfig.RewardType.PropTime, v.id, v.value, v.opt)
table.insert(_OutItems, _CurItem)
end
return _OutItems
end
function Data_Item:GetNewItem(_Type, _ID, _Value, _Opt)
local _NewItem = {}
_NewItem.type = _Type
_NewItem.id = _ID
_NewItem.value = _Value
_NewItem.opt = _Opt
return _NewItem
end
function Data_Item:GetItemCfgByID(_ItemID)
return Item_Config[_ItemID]
end
--获取物品数量 start
function Data_Item:GetItemCount(_ItemID)
return self:GetNormalItemCount(_ItemID) + self:GetTimeItemCount(_ItemID)
end
function Data_Item:GetNormalItemCount(_ItemID) --获取正常道具计数
for k,v in pairs(self.m_ItemList or {}) do
if k and k == _ItemID then
return v
end
end
return 0
end
function Data_Item:GetTimeItemCount(_ItemID) --获取限时道具计数
local _ItemCount = 0
local _tmNow = GlobalPlayerData:GetServerTime()
for k,v in pairs(self.m_TimeItemList or {}) do
if v and v.id == _ItemID and v.opt > _tmNow then --判断时间是否过期
_ItemCount = _ItemCount + v.value
end
end
return _ItemCount
end
--获取物品数量 end
--获取可自动销售的物品列表
function Data_Item:GetAutoSellItemList()
local _autoSellItemList = {}
for k,v in pairs(self:GetItemList() or {}) do
if v then
if Item_Config[v.id].AutoSell == 1 and Item_Config[v.id].ItemSell == 1 then
table.insert(_autoSellItemList, v)
end
end
end
return _autoSellItemList
end
--获取物品飘字信息(string)
function Data_Item:GetAwardPopMessage(_Type, _ID, _Count)
local _resultStr = ""
if _Type == EnumConfig.RewardType.Prop then
_resultStr = self:GetPropPopMessage(_ID, _Count)
elseif _Type == EnumConfig.RewardType.PropTime then
_resultStr = self:GetPropPopMessage(_ID, _Count)
elseif _Type == EnumConfig.RewardType.Pet then
_resultStr = self:GetPetPopMessage(_ID, _Count)
end
return _resultStr
end
--道具
function Data_Item:GetPropPopMessage(_ID, _Count)
local _ItemCfg = self:GetItemCfgByID(_ID)
local _desc = ""
if _ItemCfg then _desc = _ItemCfg.ItemName end
if _Count > 0 then _desc = _desc.."x".._Count end
--编码的table中有三个字段:(type id desc)不可少写或写错
local _EncodeTable = {type=EnumConfig.RewardType.Prop, id=_ID, desc=_desc}
return require 'util.json'.encode(_EncodeTable)
end
--宠物
function Data_Item:GetPetPopMessage(_ID, _Count)
local _PetCfg = GlobalPlayerData.Data_Pet:GetPetCfgByID(_ID)
local _desc = ""
if _PetCfg then _desc = _PetCfg.Name end
if _Count > 0 then _desc = _desc.."x".._Count end
local _EncodeTable = {type=EnumConfig.RewardType.Pet, id=_ID, desc=_desc}
return require 'util.json'.encode(_EncodeTable)
end
--find Pet Upgrade Item
function Data_Item:GetPetUpgradeItem() --获取宠物升级道具
local result = {}
for k,v in pairs(Item_Config) do
if v.ItemUseType == EnumConfig.ItemUseType.ItemPetExp then
table.insert(result , k)
end
end
return result
end
function Data_Item:GetItemQualityByID( itemID )
local itemCfg = Item_Config[itemID]
if not itemCfg then
return false
end
return itemCfg.ItemQuality
end
function Data_Item:GetItemExpByID( itemID )
local itemCfg = Item_Config[itemID]
if not self:IsItemUseForPetUpgrade(itemID) then
return 0
end
return itemCfg.Attribute1
end
function Data_Item:IsItemUseForPetUpgrade( itemID )
local itemCfg = Item_Config[itemID]
if not itemCfg then
return false
end
if itemCfg.ItemUseType ~= EnumConfig.ItemUseType.ItemPetExp then
return false
end
return true
end
return Data_Item