PGRData/Script/matrix/xentity/xsupertower/XSuperTowerBagManager.lua

316 lines
10 KiB
Lua
Raw Normal View History

local XCollectionManager = require("XEntity/XSuperTower/XCollectionManager")
local XSuperTowerPlugin = require("XEntity/XSuperTower/Plugin/XSuperTowerPlugin")
local XSuperTowerBagManager = XClass(XCollectionManager, "XSuperTowerBagManager")
local SortByPriority = function(pluginA, pluginB)
return pluginA:GetPriority() < pluginB:GetPriority()
end
function XSuperTowerBagManager:Ctor()
-- 图鉴数据
self.PokedexPluginDic = {}
self.PluginSynthesisQueue = XQueue.New()
self.BagMaxCapacityUpdate = false
-- self:InitServerApi()
end
-- data : StBagInfo
function XSuperTowerBagManager:InitWithServerData(data)
-- 更新背包容量
self:UpdateMaxCapacity(data.Capacity)
-- 更新背包插件
-- pluginInfo : StPluginInfo
for _, pluginInfo in ipairs(data.PluginInfos) do
self:AddPlugin(pluginInfo)
end
end
-- data : StPluginInfo
function XSuperTowerBagManager:AddPlugin(data)
-- 增加图鉴标志
self.PokedexPluginDic[data.Id] = true
if data.Count > 0 then
local plugin = XSuperTowerPlugin.New(data.Id)
plugin:InitWithServerData(data)
self:AddData(plugin)
end
end
function XSuperTowerBagManager:DeletePlugin(id, count)
local plugin = self:GetPlugin(id)
plugin:UpdateCount(plugin:GetCount() - count)
if plugin:GetCount() <= 0 then
self:DeleteData(id)
end
end
function XSuperTowerBagManager:GetPlugins(isAscendOrder)
local pluginsNotSplit = self:GetDatas()
local result = {}
local tmpPlugin = nil
for _, plugin in ipairs(pluginsNotSplit) do
for i = 1, plugin:GetCount() do
tmpPlugin = XSuperTowerPlugin.New(plugin:GetId())
tmpPlugin:UpdateCount(1)
table.insert(result, tmpPlugin)
end
end
if isAscendOrder ~= nil then
local ascendWeight = -1
if isAscendOrder then
ascendWeight = 1
end
table.sort(result, function(pluginA, pluginB)
local sortWeigthA = ascendWeight * (pluginA:GetId() + pluginA:GetQuality() * 100000000)
local sortWeigthB = ascendWeight * (pluginB:GetId() + pluginB:GetQuality() * 100000000)
return sortWeigthA > sortWeigthB
end)
end
return result
end
function XSuperTowerBagManager:GetPluginsByPrior()
local pluginsNotSplit = self:GetDatas()
local result = {}
local tmpPlugin = nil
for _, plugin in ipairs(pluginsNotSplit) do
for i = 1, plugin:GetCount() do
tmpPlugin = XSuperTowerPlugin.New(plugin:GetId())
tmpPlugin:UpdateCount(1)
table.insert(result, tmpPlugin)
end
end
table.sort(result, SortByPriority)
return result
end
function XSuperTowerBagManager:GetPlugin(id)
return self:GetData(id)
end
-- 根据插件id来更新数量
function XSuperTowerBagManager:UpdatePluginCount(pluginId, count)
local plugin = self:GetData(pluginId)
plugin:UpdateCount(count)
if plugin:GetCount() <= 0 then
self:DeleteData(plugin:GetId())
end
end
function XSuperTowerBagManager:UpdatePluginDic(pluginDic)
for pluginId, count in pairs(pluginDic) do
self:UpdatePluginCount(pluginId, count)
end
end
function XSuperTowerBagManager:UpdateMaxCapacity(value)
if self.MaxCapacity > 0 then
if not self.LastMaxCapacity then
self.LastMaxCapacity = self.MaxCapacity
end
self.BagMaxCapacityUpdate = true
end
self.MaxCapacity = value
end
function XSuperTowerBagManager:CheckMaxCapacityUpdate()
if self.BagMaxCapacityUpdate then
self.BagMaxCapacityUpdate = false
local last = self.LastMaxCapacity
self.LastMaxCapacity = nil
return true, last, self:GetMaxCapacity()
end
return false
end
function XSuperTowerBagManager:GetCurrentCapacity()
local allPlugins = self:GetPlugins()
local result = 0
for _, plugin in pairs(allPlugins) do
result = result + plugin:GetCapacity()
end
return result
end
function XSuperTowerBagManager:PluginSynEnqueue(oldList, newList)
local data = {
Old = oldList,
New = newList,
}
self.PluginSynthesisQueue:Enqueue(data)
end
function XSuperTowerBagManager:GetPluginSyn()
if self.PluginSynthesisQueue:IsEmpty() then
return nil
end
local data = self.PluginSynthesisQueue:Dequeue()
return data and data.Old or nil, data and data.New or nil
end
-- starGroup : { [star] = true, ... }
function XSuperTowerBagManager:GetPluginsWithStarFilter(starGroup, isAscendOrder)
local plugins = self:GetPlugins(isAscendOrder)
local result = {}
for _, plugin in ipairs(plugins) do
if starGroup[plugin:GetStar()] then
table.insert(result, plugin)
end
end
return result
end
function XSuperTowerBagManager:CheckHasPluginWithStarFilter(star)
local plugins = self:GetPlugins()
for _, plugin in ipairs(plugins) do
if plugin:GetStar() <= star then
return true
end
end
return false
end
function XSuperTowerBagManager:GetCapacityPercentsByStar(star)
local plugins = self:GetDatas()
local starTotalCapacity = 0
-- local totalCapacity = 0
for _, plugin in ipairs(plugins) do
-- totalCapacity = totalCapacity + plugin:GetCapacity()
if plugin:GetStar() == star then
starTotalCapacity = starTotalCapacity + plugin:GetCapacity()
end
end
-- if totalCapacity == 0 then return totalCapacity end
return getRoundingValue(starTotalCapacity / self:GetMaxCapacity(), 3)
end
-- 获取图鉴插件数组
-- return 1 : 已获得的图鉴插件
-- return 2 : 未获得的图鉴插件
function XSuperTowerBagManager:GetIllusPluginList(filter)
--[[local pluginConfigs = XSuperTowerConfigs.GetAllPluginCfgs()
local result1 = {} -- 已获得的图鉴插件
local result2 = {} -- 未获得的图鉴插件
local plugin
for _, config in pairs(pluginConfigs) do
plugin = XSuperTowerPlugin.New(config.Id)
if self.PokedexPluginDic[plugin:GetId()] then
table.insert(result1, plugin)
else
table.insert(result2, plugin)
end
end
return result1, result2]] --注释掉需要区分历史有无获得过的条件
local pluginConfigs = XSuperTowerConfigs.GetAllPluginCfgs()
local result = {}
local noFilter = true
if filter and next(filter) then noFilter = false end
for _, config in pairs(pluginConfigs) do
if config.IsShowInLibrary and config.IsShowInLibrary > 0 then
if not noFilter and filter[config.Quality] then
local plugin = XSuperTowerPlugin.New(config.Id)
table.insert(result, plugin)
elseif noFilter then
local plugin = XSuperTowerPlugin.New(config.Id)
table.insert(result, plugin)
end
end
end
table.sort(result, SortByPriority)
return result
end
function XSuperTowerBagManager:RequestResolvePlugin(resolveDic)
local requestData = {
ResolveDic = resolveDic,
}
XMessagePack.MarkAsTable(requestData.ResolveDic)
-- res : StResolvePluginResponse(RewardGoodsList)
XNetwork.Call("StResolvePluginRequest", requestData, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList)
end)
end
--######################## 私有方法 ########################
-- function XSuperTowerBagManager:InitServerApi()
-- -- 背包最大容量
-- XRpc.NotifyStBagCapacity = function(data)
-- self:UpdateMaxCapacity(data.Capacity)
-- end
-- -- 背包插件更新
-- XRpc.NotifyStBagPluginChange = function(data)
-- self:OnBagPluginChange(data)
-- end
-- -- 通知背包插件合成数据
-- -- data : List<StPluginSynthesisInfo>
-- XRpc.NotifyStBagPluginSynthesisData = function(pluginSynthesisInfos)
-- self:OnBagPluginSynthesisData(pluginSynthesisInfos)
-- end
-- end
function XSuperTowerBagManager:OnBagPluginChange(data)
-- List<StPluginInfo> Id && Count
local changePluginInfos = data.ChangePluginInfos
local plugin
for _, pluginInfo in ipairs(changePluginInfos) do
-- 删除变化
if pluginInfo.Count <= 0 then
self:DeleteData(pluginInfo.Id)
else
plugin = self:GetData(pluginInfo.Id)
-- 更新变化
if plugin then
plugin:UpdateWithServerData(pluginInfo)
else -- 增加变化
self:AddPlugin(pluginInfo)
end
end
end
XEventManager.DispatchEvent(XEventId.EVENT_ST_PLUGIN_REFRESH)
end
function XSuperTowerBagManager:OnBagPluginSynthesisData(pluginSynthesisInfos)
local result1 = {} -- 旧的插件数据
local result2 = {} -- 新的插件数据
--对比旧列表和新列表中重复的ID数量插件去掉此为多次合成的中途插件最终不显示
local oldPluginDic = {}
for _, pluginSynthesisInfo in pairs(pluginSynthesisInfos.SynthesisInfos) do
if pluginSynthesisInfo.Id and pluginSynthesisInfo.Id > 0 and not oldPluginDic[pluginSynthesisInfo.Id] then
oldPluginDic[pluginSynthesisInfo.Id] = pluginSynthesisInfo
end
end
for _, pluginSynthesisInfo in pairs(pluginSynthesisInfos.SynthesisInfos) do
if pluginSynthesisInfo.NewId and pluginSynthesisInfo.NewId > 0 and oldPluginDic[pluginSynthesisInfo.NewId] then
for i = 1, pluginSynthesisInfo.NewCount do
oldPluginDic[pluginSynthesisInfo.NewId].Count = oldPluginDic[pluginSynthesisInfo.NewId].Count - 1
end
pluginSynthesisInfo.NewCount = 0
end
end
--记录处理后的新旧合成列表
local tmpPlugin
for _, pluginSynthesisInfo in ipairs(pluginSynthesisInfos.SynthesisInfos) do
-- 旧插件数据
for i = 1, pluginSynthesisInfo.Count do
tmpPlugin = XSuperTowerPlugin.New(pluginSynthesisInfo.Id)
tmpPlugin:UpdateCount(1)
table.insert(result1, tmpPlugin)
end
-- 新插件数据
for i = 1, pluginSynthesisInfo.NewCount do
tmpPlugin = XSuperTowerPlugin.New(pluginSynthesisInfo.NewId)
tmpPlugin:UpdateCount(1)
table.insert(result2, tmpPlugin)
end
end
XDataCenter.SuperTowerManager.GetBagManager():PluginSynEnqueue(result1, result2)
end
return XSuperTowerBagManager