using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using UnityEngine; public class GuildAtkDefBatChangeMemberWin : UIBase { [SerializeField] ScrollerController scroller; private static HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem s_SourceMember; private HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem m_SourceMember; private List m_FilteredMembers; public static void Open(HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem sourceMember) { s_SourceMember = sourceMember; UIManager.Instance.OpenWindow(); } protected override void InitComponent() { base.InitComponent(); } protected override void OnPreOpen() { base.OnPreOpen(); scroller.OnRefreshCell += OnRefreshCell; m_SourceMember = s_SourceMember; if (m_SourceMember == null) { CloseWindow(); return; } // 1. 获取所有己方参战成员 var allMembers = GuildAtkDefBatManager.Instance.MyFamilyMembers.Values.ToList(); // 2. 排除被替换的成员 m_FilteredMembers = allMembers.Where(m => m.PlayerID != m_SourceMember.PlayerID).ToList(); // 3. 排序:防守成员靠前(DefType 升序 -> PosNum 升序 -> PlayerID 升序),非防守成员靠后(PlayerID 升序) m_FilteredMembers.Sort((a, b) => { bool aIsDef = a.DefType != 0; bool bIsDef = b.DefType != 0; if (aIsDef != bIsDef) return aIsDef ? -1 : 1; if (aIsDef && bIsDef) { int defTypeCompare = a.DefType.CompareTo(b.DefType); if (defTypeCompare != 0) return defTypeCompare; int posCompare = a.PosNum.CompareTo(b.PosNum); if (posCompare != 0) return posCompare; } return a.PlayerID.CompareTo(b.PlayerID); }); // 4. 填充 Scroller RefreshScroller(); } private void RefreshScroller() { scroller.Refresh(); for (int i = 0; i < m_FilteredMembers.Count; i++) { scroller.AddCell(ScrollerDataType.Header, i); } scroller.Restart(); } private void OnRefreshCell(ScrollerDataType type, CellView cell) { var changeCell = cell as GuildAtkDefBatChangeMemberCell; if (changeCell == null) return; int index = cell.index; if (index < 0 || index >= m_FilteredMembers.Count) return; var mem = m_FilteredMembers[index]; changeCell.Display(mem, OnChangeButtonClick); } private void OnChangeButtonClick(HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem selectedMem) { bool isDefender = selectedMem.DefType != 0; if (isDefender) { // 选中的是防守成员:弹出互换确认框 string msg = string.Format( Language.Get("GuildAtkDefBat45"), m_SourceMember.Name, selectedMem.Name); ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), msg, (isOk) => { if (isOk) { DoChangeMember(selectedMem); } }); } else { // 选中的不是防守成员:直接执行更换 DoChangeMember(selectedMem); } } private void DoChangeMember(HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem selectedMem) { GuildAtkDefBatManager.Instance.SendChangeBatMember(m_SourceMember.PlayerID, selectedMem.PlayerID); SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat3"); CloseWindow(); } protected override void OnPreClose() { base.OnPreClose(); scroller.OnRefreshCell -= OnRefreshCell; if (ReferenceEquals(s_SourceMember, m_SourceMember)) { s_SourceMember = null; } } }