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 XUiPanelStrongholdRoomCharacterSelf = XClass(nil, "XUiPanelStrongholdRoomCharacterSelf") function XUiPanelStrongholdRoomCharacterSelf:Ctor(ui, selectCharacterCb, closeUiFunc, playAnimationCb) self.GameObject = ui.gameObject self.Transform = ui.transform self.SelectCharacterCb = selectCharacterCb self.CloseUiFunc = closeUiFunc self.PlayAnimationCb = playAnimationCb XTool.InitUiObject(self) self.IsUpdateTeamPrefab = false --是否来自预设的更新队伍 self.DialogTipCount = 0 --打开弹窗的数量,确定时不减少 self.IsHasOpenDialogTip = false --是否有打开过弹窗 self:InitDynamicTable() self:AutoAddListener() self.GridCharacter.gameObject:SetActiveEx(false) end function XUiPanelStrongholdRoomCharacterSelf:InitDynamicTable() self.DynamicTable = XDynamicTableNormal.New(self.SViewCharacterList) self.DynamicTable:SetProxy(XUiGridStrongholdCharacter) self.DynamicTable:SetDelegate(self) end function XUiPanelStrongholdRoomCharacterSelf:Hide() self.GameObject:SetActiveEx(false) end function XUiPanelStrongholdRoomCharacterSelf:Show(teamList, teamId, memberIndex, groupId, isSelectIsomer, pos) self.TeamList = teamList self.TeamId = teamId self.MemberIndex = memberIndex self.GroupId = groupId self.IsSelectIsomer = isSelectIsomer self.Pos = pos if self:IsPrefab() then self.TxtEchelonName.text = CsXTextManagerGetText("StrongholdTeamTitle", teamId) self.PanelTxt.gameObject:SetActiveEx(false) else local stageIndex = self.TeamId self.TxtEchelonName.text = XDataCenter.StrongholdManager.GetGroupStageName(groupId, stageIndex) local requireAbility = XDataCenter.StrongholdManager.GetGroupRequireAbility(groupId) self.TxtRequireAbility.text = requireAbility self.PanelTxt.gameObject:SetActiveEx(true) self:RefreshCharacterTypeTips() end self:UpdateCharacters() self.GameObject:SetActiveEx(true) end function XUiPanelStrongholdRoomCharacterSelf:RefreshCharacterTypeTips() if self:IsPrefab() then return end local groupId = self.GroupId local stageIndex = self.TeamId local stageId = XDataCenter.StrongholdManager.GetGroupStageId(groupId, stageIndex) local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(stageId) if not XFubenConfigs.IsStageCharacterLimitConfigExist(characterLimitType) then self.PanelRequireCharacter.gameObject:SetActiveEx(false) return end local icon = XFubenConfigs.GetStageCharacterLimitImageTeamEdit(characterLimitType) self.ImgRequireCharacter:SetSprite(icon) self.PanelRequireCharacter.gameObject:SetActiveEx(true) if characterLimitType == XFubenConfigs.CharacterLimitType.IsomerDebuff or characterLimitType == XFubenConfigs.CharacterLimitType.NormalDebuff then local text = XFubenConfigs.GetStageMixCharacterLimitTips(characterLimitType, self:GetTeamDynamicCharacterTypes(), true) self.TxtRequireCharacter.text = text return end local limitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(stageId) local tips = XFubenConfigs.GetStageCharacterLimitTextSelectCharacter(characterLimitType, self:GetSelectCharacterType(), limitBuffId) self.TxtRequireCharacter.text = tips end function XUiPanelStrongholdRoomCharacterSelf:GetTeamDynamicCharacterTypes() local result = {} local team = self:GetTeam() local members = team:GetAllMembers() for pos, member in pairs(members) do if not member then goto Continue end local charId = member:GetCharacterId() > 0 and member:GetCharacterId() or member:GetRobotId() if charId <= 0 then goto Continue end if pos ~= self.Pos and self.CharacterId ~= charId then local type = member:GetCharacterType() if type then table.insert(result, type) end end ::Continue:: end local oldTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(self.CharacterId, self.TeamList) local isInCurTeam = oldTeamId == self.TeamId if not isInCurTeam then local type = self:GetSelectCharacterType() if self.CharacterId then local template = XCharacterConfigs.GetCharacterTemplate(self.CharacterId) type = template.Type end table.insert(result, type) else local member = team:GetMember(self.Pos) local charId = member:GetCharacterId() > 0 and member:GetCharacterId() or member:GetRobotId() local isInTeam = XDataCenter.StrongholdManager.GetCharacterInTeamId(charId, self.TeamList) == self.TeamId if charId > 0 and isInTeam and charId ~= self.CharacterId then table.insert(result, member:GetCharacterType()) end end return result end function XUiPanelStrongholdRoomCharacterSelf:UpdateCharacters() local teamList = self.TeamList local groupId = self.GroupId local stageIndex = self.TeamId local characterType = self:GetSelectCharacterType() self.CharacterIds = XDataCenter.StrongholdManager.GetCanUseCharacterOrRobotIds(groupId, stageIndex, characterType, teamList) if not self:CheckInCharacterIds(self.CharacterId) then self.CharacterId = self.CharacterIds[1] end --将选中角色提到第一位 local find = false local selectCharacterId = self.CharacterId for index, inCharacterId in pairs(self.CharacterIds) do if inCharacterId == selectCharacterId then tableRemove(self.CharacterIds, index) find = true break end end if find then tableInsert(self.CharacterIds, 1, selectCharacterId) end local index = self:GetCharacterIndex() self.DynamicTable:SetDataSource(self.CharacterIds) self.DynamicTable:ReloadDataASync(index) local isEmpty = IsTableEmpty(self.CharacterIds) self.PanelEmptyList.gameObject:SetActiveEx(isEmpty) self.PlayAnimationCb("ShuaXin") end function XUiPanelStrongholdRoomCharacterSelf:IsLoading() return self.DynamicTable and self.DynamicTable:IsAsyncLoading() end function XUiPanelStrongholdRoomCharacterSelf:OnDynamicTableEvent(event, index, grid) if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then local characterId = self.CharacterIds[index] local groupId = self.GroupId grid:Refresh(characterId, groupId, self.TeamId, self.TeamList) local isSelected = characterId == self.CharacterId grid:SetSelect(isSelected) if isSelected then self.LastSelectGrid = grid end elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then local characterId = self.CharacterIds[index] if self.LastSelectGrid then self.LastSelectGrid:SetSelect(false) end self.LastSelectGrid = grid self.LastSelectGrid:SetSelect(true) self:SelectCharacter(characterId) end end function XUiPanelStrongholdRoomCharacterSelf:SelectCharacter(characterId) if not self:CheckInCharacterIds(characterId) then characterId = self.CharacterIds[1] end self.CharacterId = characterId self:RefreshOperationBtns() self.SelectCharacterCb(characterId) self:RefreshCharacterTypeTips() end function XUiPanelStrongholdRoomCharacterSelf:RefreshOperationBtns() local characterId = self.CharacterId local teamList = self.TeamList local oldTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList) local isInCurTeam = oldTeamId == self.TeamId self.BtnJoinTeam.gameObject:SetActiveEx(not isInCurTeam) self.BtnQuitTeam.gameObject:SetActiveEx(isInCurTeam) local isRobot = XRobotManager.CheckIsRobotId(characterId) local useFashion = true if isRobot then useFashion = XRobotManager.CheckUseFashion(characterId) end self.BtnPartner:SetDisable(isRobot, not isRobot) self.BtnFashion:SetDisable(not useFashion, useFashion) self.BtnConsciousness:SetDisable(isRobot, not isRobot) self.BtnWeapon:SetDisable(isRobot, not isRobot) end function XUiPanelStrongholdRoomCharacterSelf:AutoAddListener() CsXUiHelper.RegisterClickEvent(self.BtnJoinTeam, handler(self, self.OnClickBtnJoinTeam)) CsXUiHelper.RegisterClickEvent(self.BtnQuitTeam, handler(self, self.OnBtnQuitTeamClick)) CsXUiHelper.RegisterClickEvent(self.BtnTeamPrefab, handler(self, self.OnBtnTeamPrefabClick)) self.BtnPartner.CallBack = function() self:OnClickBtnPartner() end self.BtnFashion.CallBack = function() self:OnClickBtnFashion() end self.BtnConsciousness.CallBack = function() self:OnBtnConsciousnessClick() end self.BtnWeapon.CallBack = function() self:OnBtnWeaponClick() end end function XUiPanelStrongholdRoomCharacterSelf:OnClickBtnPartner() if self:IsRobot() then XUiManager.TipText("StrongholdRobotRefusePartner") return end XDataCenter.PartnerManager.GoPartnerCarry(self.CharacterId, false) end function XUiPanelStrongholdRoomCharacterSelf:OnBtnConsciousnessClick() if self:IsRobot() then XUiManager.TipText("StrongholdRobotRefuseAwareness") return end XLuaUiManager.Open("UiEquipAwarenessReplace", self.CharacterId, nil, true) end function XUiPanelStrongholdRoomCharacterSelf:OnBtnWeaponClick() if self:IsRobot() then XUiManager.TipText("StrongholdRobotRefuseWeapon") return end XLuaUiManager.Open("UiEquipReplaceNew", self.CharacterId, nil, true) end function XUiPanelStrongholdRoomCharacterSelf:OnClickBtnFashion() if self:IsRobot() then --XUiManager.TipText("StrongholdRobotRefuseFashion") --return local characterId = XRobotManager.GetCharacterId(self.CharacterId) local isOwn = XDataCenter.CharacterManager.IsOwnCharacter(characterId) if not isOwn then XUiManager.TipText("CharacterLock") return else XLuaUiManager.Open("UiFashion", characterId, nil, nil, XUiConfigs.OpenUiType.RobotFashion) end else XLuaUiManager.Open("UiFashion", self.CharacterId) end end function XUiPanelStrongholdRoomCharacterSelf:OnClickBtnJoinTeam(btnSelfObj, prefabCharId, prefabMemberIndex) local groupId = self.GroupId local teamList = self.TeamList local teamId = self.TeamId local characterId = prefabCharId or self.CharacterId local team = self:GetTeam() local member = self:GetMember(prefabMemberIndex) local playerId = XPlayer.Id if not self:CheckCanJoin(characterId, teamList, groupId, prefabMemberIndex) then return end local swapFunc = function() local oldCharacterId = member:GetInTeamCharacterId() local oldPlayerId = member:GetPlayerId() local oldTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList) if IsNumberValid(oldTeamId) then --swap team local oldTeam = teamList[oldTeamId] local oldMember = oldTeam:GetInTeamMemberByCharacterId(characterId) local oldCharacterType = self:GetCharacterType(oldCharacterId) if oldTeam:ExistDifferentCharacterType(oldCharacterType) then oldTeam:Clear() end oldMember:SetInTeam(oldCharacterId, oldPlayerId) end local characterType = self:GetCharacterType(characterId) if team:ExistDifferentCharacterType(characterType) then --队伍中已经存在其他类型的角色(构造体/授格者)时,清空队伍 team:Clear() end member:SetInTeam(characterId, playerId) if self.IsUpdateTeamPrefab then self:CheckIsCloseView() else self.CloseUiFunc() end end local setTeamFunc = function() local characterType = self:GetCharacterType(characterId) if team:ExistDifferentCharacterType(characterType) then --队伍中已经存在其他类型的角色(构造体/授格者) local content = CSXTextManagerGetText("TeamCharacterTypeNotSame") self:AddDialogTipCount() XUiManager.DialogTip( nil, content, XUiManager.DialogType.Normal, handler(self, self.DialogCloseCallback), swapFunc ) else swapFunc() end end local onJoinTeam = function() local isInTeam = XDataCenter.StrongholdManager.CheckInTeamList(characterId, teamList, nil, teamId) if isInTeam then --在别的队伍中,可以交换 local inTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList) local title = CsXTextManagerGetText("StrongholdDeployTipTitle") local showCharacterId = XRobotManager.GetCharacterId(characterId) local characterName = XCharacterConfigs.GetCharacterName(showCharacterId) local content = CsXTextManagerGetText("StrongholdDeployTipContent", characterName, inTeamId, teamId) self:AddDialogTipCount() XUiManager.DialogTip( title, content, XUiManager.DialogType.Normal, handler(self, self.DialogCloseCallback), setTeamFunc ) else --不在在别的队伍中,直接上阵 setTeamFunc() end end XDataCenter.PracticeManager.OnJoinTeam(characterId, function() XDataCenter.PracticeManager.OpenUiFubenPractice(characterId, true) end, onJoinTeam) end --能否编入队伍 function XUiPanelStrongholdRoomCharacterSelf:CheckCanJoin(characterId, teamList, groupId, prefabMemberIndex) --电能支援 local isElectric = XDataCenter.StrongholdManager.CheckInElectricTeam(characterId) if isElectric then XUiManager.TipText("StrongholdElectricDeployInElectricTeam") return false end --队伍是否已上阵相同型号角色 local sameCharacter = XDataCenter.StrongholdManager.CheckTeamListExistSameCharacter(characterId, teamList) if sameCharacter then local key = prefabMemberIndex and "StrongholdElectricDeployUsePrefabSameCharacter" or "StrongholdElectricDeploySameCharacter" XUiManager.TipText(key) return false end --在有关卡进度的队伍中 local isInTeamLock = XDataCenter.StrongholdManager.CheckInTeamListLock(groupId, characterId, teamList) if isInTeamLock then XUiManager.TipText("StrongholdElectricDeployInTeamLock") return false end return true end function XUiPanelStrongholdRoomCharacterSelf:OnBtnQuitTeamClick() local teamList = self.TeamList local teamId = self.TeamId local characterId = self.CharacterId local inTeamId = XDataCenter.StrongholdManager.GetCharacterInTeamId(characterId, teamList) if teamId ~= inTeamId then return end local team = self:GetTeam() local member = team:GetInTeamMemberByCharacterId(characterId) member:KickOutTeam() self.CloseUiFunc() end function XUiPanelStrongholdRoomCharacterSelf:OnBtnTeamPrefabClick() --如果从主界面的队伍预设进入,GroupId为空,采用上次拿到的GroupId, local groupId = self.GroupId and self.GroupId or XDataCenter.StrongholdManager.GetLastGroupId() if not groupId then return end local stageIndex = self.TeamId local stageId = XDataCenter.StrongholdManager.GetGroupStageId(groupId, stageIndex) local characterLimitType = IsNumberValid(stageId) and XFubenConfigs.GetStageCharacterLimitType(stageId) local limitBuffId = IsNumberValid(stageId) and XFubenConfigs.GetStageCharacterLimitBuffId(stageId) local stageInfo = IsNumberValid(stageId) and XDataCenter.FubenManager.GetStageInfo(stageId) or {} local stageType = stageInfo.Type local closeCb = function() if self.IsUpdateTeamPrefab and (XTool.IsNumberValid(self.DialogTipCount) or not self.IsHasOpenDialogTips) then self.CloseUiFunc() end self.IsUpdateTeamPrefab = false self.DialogTipCount = 0 end XLuaUiManager.Open("UiRoomTeamPrefab", nil, nil, characterLimitType, limitBuffId, stageType, nil, closeCb, stageId) end function XUiPanelStrongholdRoomCharacterSelf:GetTeam() return self.TeamList[self.TeamId] end function XUiPanelStrongholdRoomCharacterSelf:GetMember(prefabMemberIndex) local team = self:GetTeam() local memberIndex = prefabMemberIndex or self.MemberIndex return team:GetMember(memberIndex) end function XUiPanelStrongholdRoomCharacterSelf:GetSelectCharacterType() return self.IsSelectIsomer and XCharacterConfigs.CharacterType.Isomer or XCharacterConfigs.CharacterType.Normal end function XUiPanelStrongholdRoomCharacterSelf:GetCharacterType(characterId) characterId = characterId or self.CharacterId if not IsNumberValid(characterId) then return end local showCharacterId = XRobotManager.GetCharacterId(characterId) return XCharacterConfigs.GetCharacterType(showCharacterId) end function XUiPanelStrongholdRoomCharacterSelf:IsPrefab() return not IsNumberValid(self.GroupId) end function XUiPanelStrongholdRoomCharacterSelf:IsRobot() return XRobotManager.CheckIsRobotId(self.CharacterId) end function XUiPanelStrongholdRoomCharacterSelf:GetCharacterIndex() local selectCharacterId = self.CharacterId if not IsNumberValid(selectCharacterId) then return -1 end local characterIds = self.CharacterIds if IsTableEmpty(characterIds) then return -1 end for index, characterId in ipairs(characterIds) do if selectCharacterId == characterId then return index end end return -1 end function XUiPanelStrongholdRoomCharacterSelf:CheckInCharacterIds(characterId) if not IsNumberValid(characterId) then return false end local characterIds = self.CharacterIds if IsTableEmpty(characterIds) then return false end for _, inCharacterId in pairs(characterIds) do if characterId == inCharacterId then return true end end return false end function XUiPanelStrongholdRoomCharacterSelf:UpdateTeamPrefab(team) self.IsUpdateTeamPrefab = true self.IsCloseRoomTeamPrefab = true local teamData = team and team.TeamData local firstFightPos = team and team.FirstFightPos local captainPos = team and team.CaptainPos local updateTeam = function(teamData, firstFightPos, captainPos) for index, characterId in ipairs(teamData or {}) do self:OnClickBtnJoinTeam(nil, characterId, index) end local team = self:GetTeam() team:SetCaptainPos(captainPos) team:SetFirstPos(firstFightPos) end for _, characterId in ipairs(teamData or {}) do if characterId > 0 then local characterType = self:GetCharacterType(characterId) local team = self:GetTeam() if team:ExistDifferentCharacterType(characterType) then local content = CSXTextManagerGetText("TeamCharacterTypeNotSame") local sureCallback = function() team:Clear() updateTeam(teamData, firstFightPos, captainPos) end self:AddDialogTipCount() XUiManager.DialogTip( nil, content, XUiManager.DialogType.Normal, handler(self, self.DialogCloseCallback), sureCallback ) return end updateTeam(teamData, firstFightPos, captainPos) return end end end function XUiPanelStrongholdRoomCharacterSelf:AddDialogTipCount() self.IsHasOpenDialogTips = true self.DialogTipCount = self.DialogTipCount + 1 end function XUiPanelStrongholdRoomCharacterSelf:DeleteDialogTipCount() self.DialogTipCount = self.DialogTipCount - 1 end function XUiPanelStrongholdRoomCharacterSelf:CheckIsCloseView() if not self.IsUpdateTeamPrefab then return end if not XLuaUiManager.IsUiShow("UiDialog") and XTool.IsNumberValid(self.DialogTipCount) and self.IsHasOpenDialogTips then if XLuaUiManager.IsUiShow("UiRoomTeamPrefab") then XLuaUiManager.Close("UiRoomTeamPrefab") end end end function XUiPanelStrongholdRoomCharacterSelf:DialogCloseCallback() self:DeleteDialogTipCount() self:CheckIsCloseView() end function XUiPanelStrongholdRoomCharacterSelf:IsEmpty() return IsTableEmpty(self.CharacterIds) end return XUiPanelStrongholdRoomCharacterSelf