using System; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using UnityEngine; /// /// 公会日志界面 /// public class GuildNoteWin : UIBase { [SerializeField] Color32 nameColor; [SerializeField] Transform noNote; [SerializeField] Transform hasNote; [SerializeField] GuildNoteNormalCell guildNoteNormalCell; [SerializeField] ScrollerController scroller; [SerializeField] TextEx maxCount; protected override void OnPreOpen() { GuildManager.Instance.EnterOrQuitGuildEvent += OnEnterOrQuitGuildEvent; GuildManager.Instance.FamilyActionInfoEvent += OnFamilyActionInfoEvent; scroller.OnGetDynamicSize += OnGetChatDynamicSize; scroller.OnRefreshCell += OnRefreshCell; maxCount.text = Language.Get("Guild_82", GuildManager.Instance.familyRecordMaxCount); GuildManager.Instance.QueryFamilyAction(PlayerDatas.Instance.fairyData.fairy.FamilyID, GuildManager.MemberChangeActionType); } protected override void OnPreClose() { GuildManager.Instance.EnterOrQuitGuildEvent -= OnEnterOrQuitGuildEvent; GuildManager.Instance.FamilyActionInfoEvent -= OnFamilyActionInfoEvent; scroller.OnGetDynamicSize -= OnGetChatDynamicSize; scroller.OnRefreshCell -= OnRefreshCell; } private void OnEnterOrQuitGuildEvent(bool isEnter) { DelayCloseWindow().Forget(); } private bool OnGetChatDynamicSize(ScrollerDataType type, int index, out float height) { height = 0; if (list.IsNullOrEmpty() || index < 0 || index >= list.Count) return false; var data = list[index]; switch (type) { case ScrollerDataType.Header: height = 19; return true; case ScrollerDataType.Normal: height = guildNoteNormalCell.GetHeight(data.Info); return true; } return true; } private void OnRefreshCell(ScrollerDataType type, CellView cell) { if (type == ScrollerDataType.Header) { var _cell = cell.GetComponent(); _cell?.Display(cell.index, list); } else { var _cell = cell.GetComponent(); _cell?.Display(cell.index, list); } } private void OnFamilyActionInfoEvent(int familyID, int actionType) { if (familyID != PlayerDatas.Instance.fairyData.fairy.FamilyID) return; if (actionType != GuildManager.MemberChangeActionType) return; Display(); } List list; private void Display() { if (!GuildManager.Instance.TryGetFamilyActions(GuildManager.MemberChangeActionType, out var actions)) { hasNote.SetActive(false); noNote.SetActive(true); return; } list = GetShowGuildNoteDataList(actions); bool isNullOrEmpty = list.IsNullOrEmpty(); if (isNullOrEmpty) { hasNote.SetActive(false); noNote.SetActive(true); return; } scroller.Refresh(); if (!isNullOrEmpty) { for (int i = 0; i < list.Count; i++) { if (list[i].ShowType == 0) { scroller.AddCell(ScrollerDataType.Header, i); } else { scroller.AddCell(ScrollerDataType.Normal, i); } } } scroller.Restart(); if (!isNullOrEmpty) { scroller.JumpIndex(list.Count - 1); } noNote.SetActive(isNullOrEmpty); hasNote.SetActive(!isNullOrEmpty); } private List GetShowGuildNoteDataList(HA513_tagMCFamilyActionInfo.tagMCFamilyAction[] actions) { List list = GetGuildNoteDataList(actions); if (list.IsNullOrEmpty()) return null; var result = new List(); int lastDay = -1; foreach (var noteData in list) { // 获取当前条目所属日期 DateTime currentTime = TimeUtility.GetTime(noteData.Time); int currentDay = TimeUtility.GetPassDays((int)noteData.Time); // 检查是否需要插入日期标题 if (lastDay == -1 || currentDay != lastDay) { // 获取目标天的凌晨时间戳 DateTime dayStartTime = TimeUtility.GetDayStartTime(currentTime.Year, currentTime.Month, currentTime.Day); int dayStartSeconds = (int)(dayStartTime - TimeUtility.OriginalTime).TotalSeconds; result.Add(new GuildNoteData { ShowType = 0, // 标题类型 Time = (uint)dayStartSeconds, Info = currentTime.ToString("yyyy-MM-dd"), }); } result.Add(noteData); lastDay = currentDay; } return result; } private List GetGuildNoteDataList(HA513_tagMCFamilyActionInfo.tagMCFamilyAction[] actions) { if (actions.IsNullOrEmpty()) return null; var result = new List(); int maxCount = GuildManager.Instance.familyRecordMaxCount; // 倒序遍历actions,并限制数量 int count = 0; for (int i = actions.Length - 1; i >= 0 && count < maxCount; i--) { var action = actions[i]; string info = GetInfo(action); result.Add(new GuildNoteData { ShowType = 1, // 内容类型 Time = action.Time, Info = info, }); count++; } return result.OrderBy(a => a.Time).ToList(); } private string GetInfo(HA513_tagMCFamilyActionInfo.tagMCFamilyAction data) { if (data == null || data.Value1 != 2) return string.Empty; switch (data.Value2) { case 0: return Language.Get("Guild_52", GetColorStr(data.Name)); case 1: return Language.Get("Guild_53", GetColorStr(data.Name)); case 2: return Language.Get("Guild_55", GetColorStr(data.Name)); case 4: if (data.Value3 > data.Value4) { return Language.Get("Guild_54", GetColorStr(data.Name), GetColorStr(RichTextMsgReplaceConfig.GetRichReplace("FAMILY", (int)data.Value3))); } else { return Language.Get("Guild_83", GetColorStr(data.Name), GetColorStr(RichTextMsgReplaceConfig.GetRichReplace("FAMILY", (int)data.Value3))); } case 3: default: return string.Empty; } } private string GetColorStr(string name) { return UIHelper.AppendColor(nameColor, name); } } public class GuildNoteData { public uint Time; //时间戳 public int ShowType; //显示用途类型 0-标题(年-月-日) 1-内容 public string Info; //信息 }