forked from endernon/PGRData
231 lines
No EOL
8.7 KiB
Lua
231 lines
No EOL
8.7 KiB
Lua
local XSuperTowerPluginSlotManager = require("XEntity/XSuperTower/XSuperTowerPluginSlotManager")
|
||
local XTeam = require("XEntity/XTeam/XTeam")
|
||
local XSuperTowerTeamManager = XClass(nil, "XSuperTowerTeamManager")
|
||
|
||
function XSuperTowerTeamManager:Ctor()
|
||
-- key : id, value : XTeam
|
||
self.TeamDic = nil
|
||
self.TeamDic = {}
|
||
end
|
||
|
||
local CreateRealTeamId = function(teamId, index)
|
||
return string.format("%sSuperTower%s_%s_%s",XPlayer.Id, XDataCenter.SuperTowerManager.GetActivityId(), teamId, index or 1)
|
||
end
|
||
|
||
function XSuperTowerTeamManager:GetTeamById(teamId, index)--单队伍类型时不需要设置关卡序号(有且仅有1),默认为1
|
||
local teamId = CreateRealTeamId(teamId, index)
|
||
local result = self.TeamDic[teamId]
|
||
if not result then
|
||
result = XTeam.New(teamId)
|
||
result:UpdateExtraData(XSuperTowerPluginSlotManager.New())
|
||
--result:UpdateSaveCallback(function(team)
|
||
--self:HandleTeamSaveCallback(team)
|
||
--end)
|
||
self.TeamDic[teamId] = result
|
||
end
|
||
return result
|
||
end
|
||
|
||
function XSuperTowerTeamManager:ClearTeam(teamId, index)--单队伍类型时不需要设置关卡序号(有且仅有1),默认为1
|
||
local teamId = CreateRealTeamId(teamId, index)
|
||
local team = self.TeamDic[teamId]
|
||
if team then
|
||
team:Clear()
|
||
end
|
||
end
|
||
--[[
|
||
teamId:队伍类型ID(XSuperTowerManager.TeamId)
|
||
teamCount:本关队伍数量
|
||
entityId:成员ID
|
||
检查某个成员是否在队伍/其他队伍中,返回队伍编号,如果没有在任何队伍则返回0
|
||
]]
|
||
function XSuperTowerTeamManager:CheckMemberIsInTeam(teamId, teamCount, entityId)
|
||
for index = 1, teamCount do
|
||
local teamId = CreateRealTeamId(teamId, index)
|
||
if teamId then
|
||
local team = self.TeamDic[teamId]
|
||
local entityList = team and team:GetEntityIds() or {}
|
||
for _,id in pairs(entityList) do
|
||
if id == entityId then
|
||
return index, team
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function XSuperTowerTeamManager:GetTeamsByIdAndCount(teamId, teamCount)
|
||
local result = {}
|
||
for index = 1, teamCount do
|
||
local teamId = CreateRealTeamId(teamId, index)
|
||
if teamId then
|
||
local team = self.TeamDic[teamId]
|
||
if team then
|
||
table.insert(result, team)
|
||
end
|
||
end
|
||
end
|
||
return result
|
||
end
|
||
|
||
--[[
|
||
没有任何插件,给提示
|
||
有插件,但不是合适的插件,并且当前是空状态,给提示
|
||
有插件,但不是合适的插件,不是空状态,不给提示
|
||
]]
|
||
-- return : 是否一键上阵了插件,true为有上阵,false为无上阵
|
||
function XSuperTowerTeamManager:AutoSelectPlugins2Teams(teams)
|
||
local plugins = XDataCenter.SuperTowerManager.GetBagManager():GetPlugins()
|
||
if not plugins or not next(plugins) then
|
||
XUiManager.TipText("STNoPlugin")
|
||
return false
|
||
end
|
||
-- 所有队伍的插件状态是否都是空的
|
||
local isEmptyStatus = true
|
||
-- 队伍已经使用的插件
|
||
local usedPluginDic = {}
|
||
local teamPlugins, pluginId
|
||
-- 将队伍正在使用的插件拿出来
|
||
for _, team in ipairs(teams) do
|
||
teamPlugins = team:GetExtraData():GetPlugins(true)
|
||
for _, plugin in ipairs(teamPlugins) do
|
||
if plugin ~= 0 then
|
||
pluginId = plugin:GetId()
|
||
usedPluginDic[pluginId] = usedPluginDic[pluginId] or 0
|
||
usedPluginDic[pluginId] = usedPluginDic[pluginId] + 1
|
||
isEmptyStatus = false
|
||
end
|
||
end
|
||
end
|
||
local plugin
|
||
-- 和背包作比较,拿剩下的做自动选择
|
||
for i = #plugins, 1, -1 do
|
||
plugin = plugins[i]
|
||
pluginId = plugin:GetId()
|
||
if usedPluginDic[pluginId] ~= nil and usedPluginDic[pluginId] > 0 then
|
||
table.remove(plugins, i)
|
||
usedPluginDic[pluginId] = usedPluginDic[pluginId] - 1
|
||
end
|
||
end
|
||
local oldCount = #plugins
|
||
if oldCount <= 0 then return false end
|
||
for _, team in ipairs(teams) do
|
||
plugins = self:AutoSelectPlugins2Team(team, plugins)
|
||
end
|
||
if isEmptyStatus and oldCount == #plugins then
|
||
XUiManager.TipText("STNoPlugin")
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
--######################## 私有方法 ########################
|
||
|
||
-- team : XTeam
|
||
function XSuperTowerTeamManager:SetTargetFightTeam(teamList, stageId, callback)
|
||
local teamInfos = {}
|
||
for teamIndex,team in pairs(teamList or {}) do
|
||
local pluginSlotManager = team:GetExtraData()
|
||
|
||
-- 消耗的插件数据
|
||
local pluginInfos = {}
|
||
for _, plugin in pairs(pluginSlotManager:GetPluginsNotSplit()) do
|
||
table.insert(pluginInfos, {
|
||
Id = plugin:GetId(),
|
||
Count = plugin:GetCount()
|
||
})
|
||
end
|
||
-- 成员数据
|
||
local characterInfos = {}
|
||
for index, entityId in ipairs(team:GetEntityIds()) do
|
||
characterInfos[index] = {}
|
||
local roleManager = XDataCenter.SuperTowerManager.GetRoleManager()
|
||
local role = roleManager:GetRole(entityId)
|
||
if not role then
|
||
characterInfos[index].Id = 0
|
||
characterInfos[index].RobotId = 0
|
||
elseif role:GetIsRobot() then
|
||
characterInfos[index].Id = role:GetCharacterId()
|
||
characterInfos[index].RobotId = entityId
|
||
else
|
||
characterInfos[index].Id = entityId
|
||
characterInfos[index].RobotId = 0
|
||
end
|
||
end
|
||
|
||
teamInfos[teamIndex] = {}
|
||
teamInfos[teamIndex].Id = teamIndex
|
||
teamInfos[teamIndex].CaptainPos = team:GetCaptainPos()
|
||
teamInfos[teamIndex].FirstPos = team:GetFirstFightPos()
|
||
teamInfos[teamIndex].PluginInfos = pluginInfos
|
||
teamInfos[teamIndex].CharacterInfos = characterInfos
|
||
end
|
||
|
||
self:RequestSetTargetFightTeam(stageId, teamInfos, callback)
|
||
end
|
||
|
||
-- StTargetFightTeamInfo array
|
||
-- { Id, CaptainPos, FirstPos }
|
||
function XSuperTowerTeamManager:RequestSetTargetFightTeam(stageId, teamInfos, callback)
|
||
if not stageId then return end
|
||
local requestData = {
|
||
TargetId = XDataCenter.SuperTowerManager.GetTargetStageIdByStageId(stageId),
|
||
TeamInfos = teamInfos
|
||
}
|
||
|
||
XNetwork.Call("StSetTargetFightTeamRequest", requestData, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
if callback then callback() end
|
||
end)
|
||
end
|
||
|
||
-- team : XTeam
|
||
function XSuperTowerTeamManager:AutoSelectPlugins2Team(team, plugins)
|
||
if plugins == nil then plugins = XDataCenter.SuperTowerManager.GetBagManager():GetPlugins() end
|
||
local characterContainValueDic = {}
|
||
local entityIds = team:GetEntityIds()
|
||
local characterId
|
||
local teamCharacterIdDic = {}
|
||
for pos, entityId in ipairs(entityIds) do
|
||
if entityId ~= 0 then
|
||
characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||
-- 位置越前权重越大
|
||
characterContainValueDic[characterId] = 10 - pos
|
||
teamCharacterIdDic[characterId] = true
|
||
end
|
||
end
|
||
table.sort(plugins, function(pluginA, pluginB)
|
||
local containValueA = characterContainValueDic[pluginA:GetCharacterId()]
|
||
local containValueB = characterContainValueDic[pluginB:GetCharacterId()]
|
||
-- 根据位置设置插件权重
|
||
local characterWeightA = containValueA and containValueA * 1000000000 or 0
|
||
local characterWeightB = containValueB and containValueB * 1000000000 or 0
|
||
local sortWeightA = pluginA:GetId() + pluginA:GetQuality() * 100000000 + characterWeightA + pluginA:GetPriority()
|
||
local sortWeightB = pluginB:GetId() + pluginB:GetQuality() * 100000000 + characterWeightB + pluginB:GetPriority()
|
||
return sortWeightA < sortWeightB
|
||
end)
|
||
local pluginSlotManager = team:GetExtraData()
|
||
local maxCapacity = pluginSlotManager:GetMaxCapacity()
|
||
local plugin, pluginCharacterId
|
||
for i = #plugins, 1, -1 do
|
||
plugin = plugins[i]
|
||
-- 如果插件是角色专属插件,同时又是不属于本队伍角色,一律不上
|
||
pluginCharacterId = plugin:GetCharacterId()
|
||
-- 属于通用插件、插件专属角色id是否在队伍里和排除掉所有角色专属槽插件
|
||
if not XSuperTowerConfigs.GetPluginIdIsCharacterSlot(plugin:GetId())
|
||
and (pluginCharacterId <= 0 or teamCharacterIdDic[pluginCharacterId]) then
|
||
pluginSlotManager:AddPlugin(plugin)
|
||
table.remove(plugins, i)
|
||
if pluginSlotManager:GetCurrentCapacity() >= maxCapacity then
|
||
break
|
||
end
|
||
end
|
||
end
|
||
return plugins
|
||
end
|
||
|
||
return XSuperTowerTeamManager |