forked from endernon/PGRData
423 lines
No EOL
15 KiB
Lua
423 lines
No EOL
15 KiB
Lua
local XUiExpeditionEquipGrid = require("XUi/XUiExpedition/RoleList/XUiExpeditionEquipGrid/XUiExpeditionEquipGrid")
|
|
local XUiGridStrongholdCharacter = require("XUi/XUiStronghold/XUiGridStrongholdCharacter")
|
|
|
|
local handler = handler
|
|
local CsXUiHelper = CsXUiHelper
|
|
local CsXTextManagerGetText = CsXTextManagerGetText
|
|
local IsNumberValid = XTool.IsNumberValid
|
|
local IsTableEmpty = XTool.IsTableEmpty
|
|
local tableRemove = table.remove
|
|
local tableInsert = table.insert
|
|
|
|
local CONDITION_COLOR = {
|
|
[true] = CS.UnityEngine.Color.red,
|
|
[false] = XUiHelper.Hexcolor2Color("0E70BDFF"),
|
|
}
|
|
|
|
local XUiPanelStrongholdRoomCharacterOthers = XClass(nil, "XUiPanelStrongholdRoomCharacterOthers")
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:Ctor(ui, selectCharacterCb, closeUiFunc, playAnimationCb, rootUi)
|
|
self.GameObject = ui.gameObject
|
|
self.Transform = ui.transform
|
|
self.SelectCharacterCb = selectCharacterCb
|
|
self.CloseUiFunc = closeUiFunc
|
|
self.PlayAnimationCb = playAnimationCb
|
|
self.RootUi = rootUi
|
|
self.WearingAwarenessGrids = {}
|
|
|
|
XTool.InitUiObject(self)
|
|
self.PanelEquip = self.GameObject:FindTransform("TeamBtn2")
|
|
|
|
self:InitDynamicTable()
|
|
self:AutoAddListener()
|
|
|
|
self.GridCharacter.gameObject:SetActiveEx(false)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:InitDynamicTable()
|
|
self.DynamicTable = XDynamicTableNormal.New(self.SViewCharacterList)
|
|
self.DynamicTable:SetProxy(XUiGridStrongholdCharacter)
|
|
self.DynamicTable:SetDelegate(self)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:Hide()
|
|
self.GameObject:SetActiveEx(false)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:Show(teamList, teamId, memberIndex, groupId)
|
|
self.TeamList = teamList
|
|
self.TeamId = teamId
|
|
self.MemberIndex = memberIndex
|
|
self.GroupId = groupId
|
|
|
|
self:UpdateUseTimes()
|
|
self:UpdateCharacters()
|
|
|
|
self.GameObject:SetActiveEx(true)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:UpdateUseTimes()
|
|
local times = XDataCenter.StrongholdManager.GetBorrowCount()
|
|
local maxTimes = XStrongholdConfigs.GetBorrowMaxTimes()
|
|
|
|
local isOverTimes = times >= maxTimes
|
|
if not isOverTimes then
|
|
local itemId, count = XStrongholdConfigs.GetBorrowCostItemInfo(times)
|
|
local icon = XItemConfigs.GetItemIconById(itemId)
|
|
self.RImgIcon:SetRawImage(icon)
|
|
self.TxtNumber.text = count
|
|
self.TxtNumber.gameObject:SetActiveEx(true)
|
|
else
|
|
self.TxtNumber.gameObject:SetActiveEx(false)
|
|
end
|
|
|
|
self.TxtTimes.text = times .. "/" .. maxTimes
|
|
self.TxtTimes.color = CONDITION_COLOR[isOverTimes]
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:UpdateCharacters()
|
|
local teamList = self.TeamList
|
|
local groupId = self.GroupId
|
|
local stageIndex = self.TeamId
|
|
|
|
self.PlayerIds = XDataCenter.StrongholdManager.GetAssistantPlayerIds(groupId, stageIndex, teamList)
|
|
if not self:CheckInPlayerIds(self.PlayerId) then
|
|
self.PlayerId = self.PlayerIds[1]
|
|
end
|
|
|
|
--将选中角色提到第一位
|
|
local find = false
|
|
local selectCharacterId = self.PlayerId
|
|
for index, inCharacterId in pairs(self.PlayerIds) do
|
|
if inCharacterId == selectCharacterId then
|
|
tableRemove(self.PlayerIds, index)
|
|
find = true
|
|
break
|
|
end
|
|
end
|
|
if find then
|
|
tableInsert(self.PlayerIds, 1, selectCharacterId)
|
|
end
|
|
|
|
local index = self:GetPlayerIndex()
|
|
self.DynamicTable:SetDataSource(self.PlayerIds)
|
|
self.DynamicTable:ReloadDataASync(index)
|
|
|
|
local isEmpty = IsTableEmpty(self.PlayerIds)
|
|
self.PanelEmptyListOthers.gameObject:SetActiveEx(isEmpty)
|
|
|
|
self.PlayAnimationCb("ShuaXin")
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:IsLoading()
|
|
return self.DynamicTable and self.DynamicTable:IsAsyncLoading()
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:OnDynamicTableEvent(event, index, grid)
|
|
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
|
|
local playerId = self.PlayerIds[index]
|
|
local characterId = XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(playerId)
|
|
local groupId = self.GroupId
|
|
grid:Refresh(characterId, groupId, self.TeamId, self.TeamList, playerId)
|
|
|
|
local isSelected = playerId == self.PlayerId
|
|
grid:SetSelect(isSelected)
|
|
if isSelected then
|
|
self.LastSelectGrid = grid
|
|
end
|
|
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
|
|
local playerId = self.PlayerIds[index]
|
|
|
|
if self.LastSelectGrid then
|
|
self.LastSelectGrid:SetSelect(false)
|
|
end
|
|
self.LastSelectGrid = grid
|
|
self.LastSelectGrid:SetSelect(true)
|
|
|
|
self:SelectCharacter(playerId)
|
|
end
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:SelectCharacter(playerId)
|
|
if not self:CheckInPlayerIds(playerId) then
|
|
playerId = self.PlayerIds[1]
|
|
end
|
|
self.PlayerId = playerId
|
|
|
|
local characterId = XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(playerId)
|
|
local teamList = self.TeamList
|
|
local oldTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|
local isInCurTeam = oldTeamId == self.TeamId
|
|
|
|
local times = XDataCenter.StrongholdManager.GetBorrowCount()
|
|
local maxTimes = XStrongholdConfigs.GetBorrowMaxTimes()
|
|
local isOverTimes = times >= maxTimes
|
|
self.BtnJoinTeam.gameObject:SetActiveEx(not isInCurTeam and not isOverTimes)
|
|
self.BtnJoinDisable.gameObject:SetActiveEx(not isInCurTeam and isOverTimes)
|
|
self.BtnQuitTeam.gameObject:SetActiveEx(isInCurTeam)
|
|
|
|
self:UpdateEquips()
|
|
self.SelectCharacterCb(characterId, playerId)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:UpdateEquips()
|
|
if self:IsEmpty() then
|
|
self.PanelEquip.gameObject:SetActiveEx(false)
|
|
return
|
|
end
|
|
self.PanelEquip.gameObject:SetActiveEx(true)
|
|
|
|
local isCheckEquipPosResonanced = false
|
|
local playerId = self.PlayerId
|
|
local assistantInfo = XDataCenter.StrongholdManager.GetAssistantInfo(playerId)
|
|
local equips = assistantInfo.Equips
|
|
|
|
local weapon = {}
|
|
local equipSiteDic = {}
|
|
local weaponResonanceCount = 0
|
|
for _, equip in pairs(equips) do
|
|
if XDataCenter.EquipManager.IsWeaponByTemplateId(equip.TemplateId) then
|
|
weapon = equip
|
|
weaponResonanceCount = #equip.ResonanceInfo
|
|
else
|
|
local site = XDataCenter.EquipManager.GetEquipSiteByEquipData(equip)
|
|
equipSiteDic[site] = equip
|
|
end
|
|
end
|
|
|
|
self.WeaponGrid = self.WeaponGrid or XUiExpeditionEquipGrid.New(self.GridWeapon, nil, self.RootUi)
|
|
local usingWeaponId = weapon.TemplateId
|
|
if usingWeaponId then
|
|
self.WeaponGrid:Refresh(usingWeaponId, weapon.Breakthrough, 0, true, weapon.Level, weaponResonanceCount)
|
|
end
|
|
|
|
for i = 1, 6 do
|
|
self.WearingAwarenessGrids[i] = self.WearingAwarenessGrids[i] or XUiExpeditionEquipGrid.New(CS.UnityEngine.Object.Instantiate(self.GridAwareness), nil, self.RootUi)
|
|
self.WearingAwarenessGrids[i].Transform:SetParent(self["PanelAwareness" .. i], false)
|
|
|
|
local equip = equipSiteDic[i]
|
|
if not equip then
|
|
self.WearingAwarenessGrids[i].GameObject:SetActiveEx(false)
|
|
else
|
|
local resonanceCount = #equip.ResonanceInfo
|
|
self.WearingAwarenessGrids[i].GameObject:SetActiveEx(true)
|
|
self.WearingAwarenessGrids[i]:Refresh(equip.TemplateId, equip.Breakthrough, i, false, equip.Level, resonanceCount)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:AutoAddListener()
|
|
CsXUiHelper.RegisterClickEvent(self.BtnJoinTeam, handler(self, self.OnClickBtnJoinTeam))
|
|
CsXUiHelper.RegisterClickEvent(self.BtnQuitTeam, handler(self, self.OnBtnQuitTeamClick))
|
|
CsXUiHelper.RegisterClickEvent(self.BtnRefresh, handler(self, self.OnClickBtnRefresh))
|
|
CsXUiHelper.RegisterClickEvent(self.BtnJoinDisable, handler(self, self.OnBtnJoinDisableClick))
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:OnClickBtnRefresh()
|
|
local cb = function()
|
|
local groupId = self.GroupId
|
|
local teamList = self.TeamList
|
|
XDataCenter.StrongholdManager.KickOutInvalidMembersInTeamList(teamList, groupId)
|
|
self:UpdateCharacters()
|
|
self:SelectCharacter()
|
|
end
|
|
XDataCenter.StrongholdManager.GetStrongholdAssistCharacterListRequest(cb)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:OnClickBtnJoinTeam()
|
|
local groupId = self.GroupId
|
|
local teamList = self.TeamList
|
|
local teamId = self.TeamId
|
|
local playerId = self.PlayerId
|
|
local characterId = XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(playerId)
|
|
local team = self:GetTeam()
|
|
local member = self:GetMember()
|
|
|
|
if not self:CheckCanJoin(teamList, groupId, characterId, playerId, teamId) then
|
|
return
|
|
end
|
|
|
|
local swapFunc = function()
|
|
local oldTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|
if IsNumberValid(oldTeamId) then
|
|
--switch team
|
|
local oldCharacterId = member:GetInTeamCharacterId()
|
|
local oldPlayerId = member:GetPlayerId()
|
|
local oldTeam = teamList[oldTeamId]
|
|
local oldMember = oldTeam:GetInTeamMemberByCharacterId(characterId, playerId)
|
|
|
|
local oldCharacterType = self:GetCharacterType(oldCharacterId)
|
|
if oldTeam:ExistDifferentCharacterType(oldCharacterType) then
|
|
oldTeam:Clear()
|
|
end
|
|
|
|
oldMember:SetInTeam(oldCharacterId, oldPlayerId)
|
|
end
|
|
|
|
local characterType = self:GetCharacterType()
|
|
if team:ExistDifferentCharacterType(characterType) then
|
|
--队伍中已经存在其他类型的角色(构造体/授格者)时,清空队伍
|
|
team:Clear()
|
|
end
|
|
|
|
member:SetInTeam(characterId, playerId)
|
|
|
|
self.CloseUiFunc()
|
|
end
|
|
|
|
local setTeamFunc = function()
|
|
local characterType = self:GetCharacterType()
|
|
if team:ExistDifferentCharacterType(characterType) then
|
|
--队伍中已经存在其他类型的角色(构造体/授格者)
|
|
local content = CSXTextManagerGetText("TeamCharacterTypeNotSame")
|
|
XUiManager.DialogTip(nil, content, XUiManager.DialogType.Normal, nil, swapFunc)
|
|
else
|
|
swapFunc()
|
|
end
|
|
end
|
|
|
|
local callFunc = function()
|
|
local isInTeam = XDataCenter.StrongholdManager.CheckInTeamList(characterId, teamList, playerId)
|
|
if isInTeam then
|
|
--在别的队伍中,可以交换
|
|
local inTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|
local title = CsXTextManagerGetText("StrongholdDeployTipTitle")
|
|
local showCharacterId = XRobotManager.GetCharacterId(characterId)
|
|
local characterName = XCharacterConfigs.GetCharacterName(showCharacterId)
|
|
local content = CsXTextManagerGetText("StrongholdDeployTipContent", characterName, inTeamId, teamId)
|
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, setTeamFunc)
|
|
else
|
|
--不在在别的队伍中,直接上阵
|
|
setTeamFunc()
|
|
end
|
|
end
|
|
|
|
local onJoinTeam = function()
|
|
local times = XDataCenter.StrongholdManager.GetBorrowCount()
|
|
local maxTimes = XStrongholdConfigs.GetBorrowMaxTimes()
|
|
if times >= maxTimes then
|
|
XUiManager.TipText("StrongholdBorrowMaxTimes")
|
|
return
|
|
end
|
|
|
|
local itemId, count = XStrongholdConfigs.GetBorrowCostItemInfo(times)
|
|
if not XDataCenter.ItemManager.CheckItemCountById(itemId, count) then
|
|
XUiManager.TipText("StrongholdBorrowCostLack")
|
|
return
|
|
end
|
|
|
|
local itemName = XItemConfigs.GetItemNameById(itemId)
|
|
local title = CsXTextManagerGetText("StrongholdDeployAssistantTipTitle")
|
|
local content = CsXTextManagerGetText("StrongholdDeployAssistantTipContent", itemName, count)
|
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, callFunc)
|
|
end
|
|
|
|
XDataCenter.PracticeManager.OnJoinTeam(characterId, function()
|
|
XDataCenter.PracticeManager.OpenUiFubenPractice(characterId, true)
|
|
end, onJoinTeam)
|
|
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:CheckCanJoin(teamList, groupId, characterId, playerId, teamId)
|
|
|
|
--队伍已上阵支援角色
|
|
local overCount = XDataCenter.StrongholdManager.CheckTeamListExistAssitantCharacter(teamList)
|
|
if overCount then
|
|
XUiManager.TipText("StrongholdBorrowCountOver")
|
|
return false
|
|
end
|
|
|
|
--在有关卡进度的队伍中
|
|
local isInTeamLock = XDataCenter.StrongholdManager.CheckInTeamListLock(groupId, characterId, teamList, playerId)
|
|
if isInTeamLock then
|
|
XUiManager.TipText("StrongholdElectricDeployInTeamLock")
|
|
return false
|
|
end
|
|
|
|
--队伍是否已上阵相同型号角色
|
|
local sameCharacter = XDataCenter.StrongholdManager.CheckTeamListExistSameCharacter(characterId, teamList, playerId, teamId, self.MemberIndex)
|
|
if sameCharacter then
|
|
XUiManager.TipText("StrongholdElectricDeploySameCharacter")
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:OnBtnJoinDisableClick()
|
|
XUiManager.TipText("StrongholdBorrowMaxTimes")
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:OnBtnQuitTeamClick()
|
|
local teamList = self.TeamList
|
|
local teamId = self.TeamId
|
|
local playerId = self.PlayerId
|
|
local characterId = XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(playerId)
|
|
local inTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|
if teamId ~= inTeamId then return end
|
|
|
|
local team = self:GetTeam()
|
|
local member = team:GetInTeamMemberByCharacterId(characterId, playerId)
|
|
member:KickOutTeam()
|
|
|
|
self.CloseUiFunc()
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:GetTeam()
|
|
return self.TeamList[self.TeamId]
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:GetMember()
|
|
local team = self:GetTeam()
|
|
return team:GetMember(self.MemberIndex)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:GetPlayerCharacterId()
|
|
return XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(self.PlayerId)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:GetPlayerIndex()
|
|
local selectPlayerId = self.PlayerId
|
|
if not IsNumberValid(selectPlayerId) then return -1 end
|
|
|
|
local playerIds = self.PlayerIds
|
|
if IsTableEmpty(playerIds) then return -1 end
|
|
|
|
for index, inPlayerId in ipairs(playerIds) do
|
|
if selectPlayerId == inPlayerId then
|
|
return index
|
|
end
|
|
end
|
|
|
|
return -1
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:CheckInPlayerIds(playerId)
|
|
if not IsNumberValid(playerId) then return false end
|
|
|
|
local playerIds = self.PlayerIds
|
|
if IsTableEmpty(playerIds) then return false end
|
|
|
|
for _, inPlayerId in pairs(playerIds) do
|
|
if playerId == inPlayerId then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:IsEmpty()
|
|
return XTool.IsTableEmpty(self.PlayerIds)
|
|
end
|
|
|
|
function XUiPanelStrongholdRoomCharacterOthers:GetCharacterType(characterId)
|
|
characterId = characterId or XDataCenter.StrongholdManager.GetAssistantPlayerCharacterId(self.PlayerId)
|
|
if not IsNumberValid(characterId) then return end
|
|
|
|
local showCharacterId = XRobotManager.GetCharacterId(characterId)
|
|
return XCharacterConfigs.GetCharacterType(showCharacterId)
|
|
end
|
|
|
|
return XUiPanelStrongholdRoomCharacterOthers |