using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using Cysharp.Threading.Tasks;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
public class GuildAtkDefBatChangeMemberWin : UIBase
|
{
|
[SerializeField] ScrollerController scroller;
|
|
private static HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem s_SourceMember;
|
|
private HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem m_SourceMember;
|
private List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem> m_FilteredMembers;
|
|
public static void Open(HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem sourceMember)
|
{
|
s_SourceMember = sourceMember;
|
UIManager.Instance.OpenWindowAsync<GuildAtkDefBatChangeMemberWin>().Forget();
|
}
|
|
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;
|
}
|
}
|
}
|