231 lines
8.7 KiB
Lua
231 lines
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
|