lcy
2026-07-16 34179ffa10e510ba71522cb2bd1fd978b7fcbbe1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
 
public class GuildAtkDefBatBattlePanelWin : OneLevelWin
{
    [SerializeField] GuildEmblemCell myEmblemCell;
    [SerializeField] TextEx myNameText;
    [SerializeField] TextEx myServerText;
    [SerializeField] TextEx myStarCntText;
 
    [SerializeField] RectTransform enemyRect;
    [SerializeField] GuildEmblemCell enemyEmblemCell;
    [SerializeField] TextEx enemyNameText;
    [SerializeField] TextEx enemyServerText;
    [SerializeField] TextEx enemyStarCntText;
 
    [SerializeField] RectTransform noJoinRect;
 
    [SerializeField] TextEx timeText;
 
    [SerializeField] ButtonEx funPresetDefBtn;
    [SerializeField] ButtonEx funPresetAtkBtn;
    [SerializeField] ButtonEx recordBtn;
 
    [SerializeField] ButtonEx rankButton;
 
    [SerializeField] ButtonEx myEmblemBtn;
    [SerializeField] ButtonEx enemyEmblemBtn;
    [SerializeField] TextEx[] top3NameText;
    [SerializeField] TextEx rankTipText;
    [SerializeField] ImageEx atkCntImage;
    [SerializeField] ScrollerController scroller;
 
    // 战场scroller数据
    private bool m_IsMySide;
 
    // 缓存打开时的 displayState,用于过天判断是否发生变化以关闭窗口
    private int m_CachedDisplayState;
    private List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem> m_SortedDefenders;
    private List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem> m_RemainingDefenders;
    private bool m_DeferBattleScrollerRefresh;
    private static bool s_HasPendingScrollPosition;
    private static float s_PendingScrollPosition;
 
    protected override void InitComponent()
    {
        base.InitComponent();
        funPresetDefBtn.AddListener(() =>
        {
            if (GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState() == 3)
            {
                SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat7");
                return;
            }
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.GuildAtkDefBat);
        });
        funPresetAtkBtn.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Story);
        });
        recordBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<GuildAtkDefBatRecordWin>();
        });
        rankButton.SetListener(() =>
        {
            UIManager.Instance.OpenWindow<GuildAtkDefBatRankWin>();
        });
 
        // 己方公会徽章点击 - 自己的公会
        myEmblemBtn.AddListener(() =>
        {
            SysNotifyMgr.Instance.ShowTip("GuildTip01");
        });
 
        // 敌方公会徽章点击
        enemyEmblemBtn.AddListener(() =>
        {
            var enemyInfo = GuildAtkDefBatManager.Instance.EnemyFamilyInfo;
            if (enemyInfo == null)
                return;
 
            int familyID = (int)enemyInfo.FamilyID;
            int serverID = (int)enemyInfo.ServerID;
 
            // 自己的公会
            if (PlayerDatas.Instance.fairyData.HasFairy && PlayerDatas.Instance.fairyData.fairy.FamilyID == familyID)
            {
                SysNotifyMgr.Instance.ShowTip("GuildTip01");
                return;
            }
 
            // 系统公会
            if (GuildAtkDefBatManager.Instance.IsSystemFamily(enemyInfo.FamilyID))
                return;
 
            // 查看公会信息
            GuildManager.Instance.SendViewGuild(familyID, serverID);
        });
    }
 
    protected override void OnPreOpen()
    {
        // 根据当前时期设置默认Tab:备战期->我方战场,激战期->敌方战场
        int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState();
        if (displayState == 2)
            functionOrder = 0; // 备战期默认我方战场
        else if (displayState == 3)
            functionOrder = 1; // 激战期默认敌方战场
 
        m_DeferBattleScrollerRefresh = true;
        base.OnPreOpen();
        m_DeferBattleScrollerRefresh = false;
        scroller.OnRefreshCell += OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent += OnUpdateAtkDefBatInfoEvent;
        GuildManager.Instance.OnUpdateViewFamilyInfo += OnUpdateViewFamilyInfo;
        TimeMgr.Instance.OnDayEvent += OnDayRefresh;
        m_CachedDisplayState = displayState;
        Display();
    }
 
    protected override void OnPreClose()
    {
        base.OnPreClose();
        scroller.OnRefreshCell -= OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent -= OnUpdateAtkDefBatInfoEvent;
        GuildManager.Instance.OnUpdateViewFamilyInfo -= OnUpdateViewFamilyInfo;
        TimeMgr.Instance.OnDayEvent -= OnDayRefresh;
    }
 
    private void OnUpdateAtkDefBatInfoEvent()
    {
        OnDayRefresh();
        Display();
        RefreshBattleScroller(true);
    }
 
    private void OnDayRefresh()
    {
        int currentState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState();
        if (currentState != m_CachedDisplayState)
            CloseWindow();
    }
 
    private void OnSecondEvent()
    {
        DisplayTime();
    }
 
    protected override void OnTabButtonClicked(int index)
    {
        // 对敌方Tab进行锁定管理:备战期锁定(阻止GroupButtonEx.OnPointerClick执行SelectBtn),其他时期解锁
        tabButtons[1].isLock = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState() == 2;
 
        // 备战期点击敌方战场Tab时阻止切换并提示
        if (tabButtons[1].isLock && index == 1)
        {
            SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat2");
            return;
        }
        base.OnTabButtonClicked(index);
    }
 
    void DisplayTime()
    {
        timeText.text = Language.Get("PhantasmPavilion10", UIHelper.AppendColor(TextColType.LightGreen, GuildAtkDefBatManager.Instance.GetGetCountdownToCurrentPeriodEndString()));
    }
 
    void Display()
    {
        DisplayInfo();
        DisplayTime();
    }
 
    protected override void NextFrameAfterOpen()
    {
        base.NextFrameAfterOpen();
        RefreshBattleScroller();
    }
 
    void DisplayInfo()
    {
        var myFamilyInfo = GuildAtkDefBatManager.Instance.MyFamilyInfo;
        if (myFamilyInfo != null)
        {
            myNameText.text = myFamilyInfo.FamilyName;
            myServerText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
            myEmblemCell.Display((int)myFamilyInfo.EmblemID, myFamilyInfo.EmblemWord, 0.7f);
            myStarCntText.text = myFamilyInfo.TotalStar.ToString();
        }
        else
        {
            myStarCntText.text = "0";
        }
 
        var enemyFamilyInfo = GuildAtkDefBatManager.Instance.EnemyFamilyInfo;
        if (enemyFamilyInfo != null)
        {
            bool isSystemFamily = GuildAtkDefBatManager.Instance.IsSystemFamily(enemyFamilyInfo.FamilyID);
            if (isSystemFamily)
            {
                string enemyName = Language.Get("GuildAtkDefBat31");
                enemyNameText.text = enemyName;
                enemyEmblemCell.Display(FamilyEmblemConfig.GetFirstDefaultEmblem(), GuildManager.Instance.LimitEmblemWord(enemyName), 0.7f);
                enemyServerText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
                enemyStarCntText.text = enemyFamilyInfo.TotalStar.ToString();
            }
            else
            {
                enemyNameText.text = enemyFamilyInfo.FamilyName;
                enemyEmblemCell.Display((int)enemyFamilyInfo.EmblemID, enemyFamilyInfo.EmblemWord, 0.7f);
                enemyServerText.text = ServerListCenter.Instance.GetServerName((int)enemyFamilyInfo.ServerID);
                enemyStarCntText.text = enemyFamilyInfo.TotalStar.ToString();
            }
        }
        else
        {
            enemyStarCntText.text = "0";
        }
 
        int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState();
        noJoinRect.SetActive(displayState == 1 && enemyFamilyInfo == null);
        enemyRect.SetActive(displayState != 1 && enemyFamilyInfo != null);
 
        ShowTop3();
    }
 
    void ShowTop3()
    {
        atkCntImage.SetActive(GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState() == 3);
        var sortedMembers = GuildAtkDefBatManager.Instance.GetSortedFamilyMembers();
 
        int top3Count = Mathf.Min(top3NameText.Length, sortedMembers.Count);
        for (int i = 0; i < top3NameText.Length; i++)
        {
            if (i < top3Count)
            {
                top3NameText[i].text = sortedMembers[i].Name;
            }
            else
            {
                top3NameText[i].text = Language.Get("L1124");
            }
        }
 
        rankTipText.text = Language.Get("GuildAtkDefBat37",
            GuildAtkDefBatManager.Instance.GetMyRemainingChallengeCount(),
            GuildAtkDefBatManager.Instance.challengeCount);
    }
 
    protected override void OpenSubUIByTabIndex()
    {
        if (m_DeferBattleScrollerRefresh)
            return;
 
        RefreshBattleScroller();
    }
 
    public void SaveScrollPositionForNextOpen()
    {
        if (scroller == null || scroller.m_Scorller == null)
            return;
 
        s_PendingScrollPosition = scroller.m_Scorller.ScrollPosition;
        s_HasPendingScrollPosition = true;
    }
 
    /// <summary>
    /// 刷新战场Scroller数据
    /// </summary>
    private void RefreshBattleScroller(bool keepScrollPosition = false)
    {
        int oldCellCount = scroller.GetNumberOfCells(scroller.m_Scorller);
        int newCellCount = RefreshBattleScrollerData();
 
        if (keepScrollPosition && oldCellCount == newCellCount)
        {
            scroller.m_Scorller.RefreshActiveCellViews();
            return;
        }
 
        // 重新构建Scroller
        scroller.Refresh();
 
        // 添加HeaderCell(第一条)
        scroller.AddCell(ScrollerDataType.Header, 0);
 
        // 剩余成员每2个一组添加NormalCell
        int normalCellCount = newCellCount - 1;
        for (int i = 0; i < normalCellCount; i++)
        {
            scroller.AddCell(ScrollerDataType.Normal, i + 1);
        }
 
        scroller.Restart();
        TryRestorePendingScrollPosition();
    }
 
    private void TryRestorePendingScrollPosition()
    {
        if (!s_HasPendingScrollPosition || scroller == null || scroller.m_Scorller == null)
            return;
 
        scroller.m_Scorller.ScrollPosition = s_PendingScrollPosition;
        s_HasPendingScrollPosition = false;
    }
 
    private int RefreshBattleScrollerData()
    {
        // 根据当前Tab设置己方/敌方
        switch (functionOrder)
        {
            case 0:
                m_IsMySide = true;
                break;
            case 1:
                m_IsMySide = false;
                break;
            default:
                m_IsMySide = true;
                break;
        }
 
        // 获取排序后的防守成员列表
        m_SortedDefenders = GuildAtkDefBatManager.Instance.GetSortedDefenders(m_IsMySide);
        if (m_SortedDefenders == null)
        {
            m_SortedDefenders = new List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem>();
        }
 
        // 前3个用于HeaderCell,剩下的给NormalCell
        int headerCount = Mathf.Min(3, m_SortedDefenders.Count);
        m_RemainingDefenders = new List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem>();
        for (int i = headerCount; i < m_SortedDefenders.Count; i++)
        {
            m_RemainingDefenders.Add(m_SortedDefenders[i]);
        }
 
        int normalCellCount = Mathf.CeilToInt((float)m_RemainingDefenders.Count / 2);
        return normalCellCount + 1;
    }
 
    /// <summary>
    /// Scroller Cell刷新回调
    /// </summary>
    private void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        if (type == ScrollerDataType.Header)
        {
            var headerCell = cell as GuildAtkDefBatBattlePanelHeaderCell;
            if (headerCell != null)
            {
                headerCell.Display(m_IsMySide, m_SortedDefenders);
            }
        }
        else if (type == ScrollerDataType.Normal)
        {
            var normalCell = cell as GuildAtkDefBatBattlePanelNormalCell;
            if (normalCell != null)
            {
                // cell.index 从1开始(0是HeaderCell)
                int normalCellIndex = cell.index - 1;
                int startIdx = normalCellIndex * 2;
 
                HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem mem1 = null;
                HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem mem2 = null;
 
                if (startIdx < m_RemainingDefenders.Count)
                {
                    mem1 = m_RemainingDefenders[startIdx];
                }
                if (startIdx + 1 < m_RemainingDefenders.Count)
                {
                    mem2 = m_RemainingDefenders[startIdx + 1];
                }
 
                normalCell.Display(m_IsMySide, mem1, mem2);
            }
        }
    }
 
    private void OnUpdateViewFamilyInfo(int familyID)
    {
        if (!GuildManager.Instance.viewGuildsDict.ContainsKey(familyID))
            return;
 
        if (!UIManager.Instance.IsOpened<GuildPreviewWin>())
        {
            GuildPreviewWin.SetShowOpearteBtn(false);
            UIManager.Instance.OpenWindow<GuildPreviewWin>(familyID);
        }
    }
}