using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; public class GuildAtkDefBatWin : UIBase { [SerializeField] GuildEmblemCell myEmblemCell; [SerializeField] TextEx myNameText; [SerializeField] TextEx myServerText; [SerializeField] ImageEx myLightImage; [SerializeField] ImageEx myTextImage; [SerializeField] TextEx myStarCntText; [SerializeField] GuildAtkDefBatPlayerShowCell[] myModels; [SerializeField] RectTransform enemyRect; [SerializeField] GuildEmblemCell enemyEmblemCell; [SerializeField] TextEx enemyNameText; [SerializeField] TextEx enemyServerText; [SerializeField] ImageEx enemyLightImage; [SerializeField] ImageEx enemyTextImage; [SerializeField] TextEx enemyStarCntText; [SerializeField] GuildAtkDefBatPlayerShowCell[] enemyModels; [SerializeField] RectTransform noJoinRect; [SerializeField] RectTransform joinConditionRect; [SerializeField] TextEx joinCntText; [SerializeField] TextEx activityLevelText; [SerializeField] TextEx timeText; [SerializeField] ImageEx stateImage; [SerializeField] ButtonEx goButton; [SerializeField] ButtonEx backButton; [SerializeField] ButtonEx rankButton; [SerializeField] ButtonEx recordButton; [SerializeField] ButtonEx shopButton; [SerializeField] ButtonEx treasureButton; [SerializeField] ButtonEx myEmblemBtn; [SerializeField] ButtonEx enemyEmblemBtn; [SerializeField] ButtonEx ruleButton; protected override void InitComponent() { backButton.AddListener(CloseWindow); rankButton.AddListener(() => { UIManager.Instance.OpenWindow(); }); recordButton.AddListener(() => { UIManager.Instance.OpenWindow(); }); shopButton.AddListener(() => { UIManager.Instance.OpenWindow(); }); treasureButton.AddListener(() => { UIManager.Instance.OpenWindow(); }); ruleButton.AddListener(() => { SmallTipWin.showText = Language.Get("GuildAtkDefBatRule2"); SmallTipWin.worldPos = ruleButton.transform.position; UIManager.Instance.OpenWindow(); }); goButton.AddListener(async () => { // 检查是否有正在进行的战斗(参考ArenaTabHandler的模式) BattleField guildAtkDefBatBattle = BattleManager.Instance.GetBattleFieldByMapID(GuildAtkDefBatManager.DataMapID); if (guildAtkDefBatBattle != null) { GuildAtkDefBatBattleWin battleWin; if (!UIManager.Instance.IsOpened()) { battleWin = UIManager.Instance.OpenWindow(); } else { battleWin = UIManager.Instance.GetUI(); } battleWin.SetBattleField(guildAtkDefBatBattle); CloseWindow(); return; } // 对手公会已解散,不可进入战斗 var enemyInfo = GuildAtkDefBatManager.Instance.EnemyFamilyInfo; if (enemyInfo != null && enemyInfo.IsDismiss == 1) { SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat6"); return; } bool hasEligibility = GuildAtkDefBatManager.Instance.HasMyJoinEligibility(); if (!hasEligibility) { SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat1"); return; } UIManager.Instance.OpenWindow(); }); // 己方公会徽章点击 - 自己的公会 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() { GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; GuildAtkDefBatManager.Instance.OnUpdateeFamilyActionInfoEvent += OnUpdateeFamilyActionInfoEvent; GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent += OnUpdateAtkDefBatInfoEvent; GuildManager.Instance.OnUpdateViewFamilyInfo += OnUpdateViewFamilyInfo; GuildAtkDefBatManager.Instance.ClearMainRedpoint(); Display(); } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; GuildAtkDefBatManager.Instance.OnUpdateeFamilyActionInfoEvent -= OnUpdateeFamilyActionInfoEvent; GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent -= OnUpdateAtkDefBatInfoEvent; GuildManager.Instance.OnUpdateViewFamilyInfo -= OnUpdateViewFamilyInfo; } private void OnUpdateViewFamilyInfo(int familyID) { if (!GuildManager.Instance.viewGuildsDict.ContainsKey(familyID)) return; if (!UIManager.Instance.IsOpened()) { GuildPreviewWin.SetShowOpearteBtn(false); UIManager.Instance.OpenWindow(familyID); } } private void OnUpdateeFamilyActionInfoEvent() { Display(); } private void OnUpdateAtkDefBatInfoEvent() { Display(); } private void OnSecondEvent() { DisplayTime(); } void Display() { DisplayInfo(); DisplayCoreMembers(); DisplayStateImage(); DisplayTime(); DisplayButton(); } void DisplayStateImage() { int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState(); stateImage.SetSprite(displayState switch { 5 => "GuildAtkDefBatState4", _ => $"GuildAtkDefBatState{displayState}" }); } void DisplayTime() { int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState(); timeText.text = Language.Get(displayState switch { 2 => "GuildAtkDefBat28", 3 => "GuildAtkDefBat29", _ => "GuildAtkDefBat30", }, UIHelper.AppendColor(TextColType.LightGreen, GuildAtkDefBatManager.Instance.GetGetCountdownToCurrentPeriodEndString())); } void DisplayButton() { int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState(); goButton.SetActive(displayState == 2 || displayState == 3); } /// /// 展示左右两侧核心成员的角色模型+坐骑 /// void DisplayCoreMembers() { int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState(); // displayState == 1 未参战,不显示角色 bool showMembers = displayState != 1; // 己方成员展示 var myMembers = showMembers ? GuildAtkDefBatManager.Instance.GetSortedCoreMembers(true, displayState) : null; DisplayMemberModels(myModels, myMembers); // 敌方成员展示 var enemyMembers = showMembers ? GuildAtkDefBatManager.Instance.GetSortedCoreMembers(false, displayState) : null; DisplayMemberModels(enemyModels, enemyMembers); } /// /// 将成员数据填充到模型展示Cell中 /// void DisplayMemberModels(GuildAtkDefBatPlayerShowCell[] models, List members) { if (members == null || members.Count <= 0) { for (int i = 0; i < models.Length; i++) models[i].SetActive(false); return; } for (int i = 0; i < models.Length; i++) { if (i < members.Count) { models[i].SetActive(true); var mem = members[i]; // 解析外观数据 int heroSkinID = ResolveHeroSkinID((int)mem.ModelMark, (int)mem.Job); int horseSkinID = HorseManager.Instance.GetOtherPlayerHorseSkinID((int)mem.EquipShowSwitch); models[i].Display(heroSkinID, horseSkinID, (int)mem.PlayerID, (int)mem.ServerID, false); } else { models[i].SetActive(false); } } } /// /// 根据 ModelMark 和 Job 解析英雄皮肤ID /// int ResolveHeroSkinID(int modelMark, int job) { if (modelMark == 0) { PhantasmPavilionManager.Instance.TryGetDefaultID(PhantasmPavilionType.Model, job, out modelMark); } if (!ModelConfig.HasKey(modelMark)) return 0; var modelConfig = ModelConfig.Get(modelMark); return modelConfig.SkinID; } 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); bool isShowJoinConditionRect = displayState == 1 || displayState == 4 || displayState == 5; joinConditionRect.SetActive(isShowJoinConditionRect); if (isShowJoinConditionRect) { int prepareMemberLimit = GuildAtkDefBatManager.Instance.prepareMemberLimit; int myGuildMemberCnt = PlayerDatas.Instance.fairyData?.fairy?.MemberCount ?? 0; joinCntText.text = Language.Get("GuildAtkDefBat32", UIHelper.AppendColor(myGuildMemberCnt >= prepareMemberLimit ? TextColType.LightGreen : TextColType.Red, myGuildMemberCnt.ToString()), prepareMemberLimit); int prepareActiveLimit = GuildAtkDefBatManager.Instance.prepareActiveLimit; long nowActivityLevel = GuildAtkDefBatManager.Instance.GetMyActivityLevel(); activityLevelText.text = Language.Get("GuildAtkDefBat33", UIHelper.AppendColor(nowActivityLevel >= prepareActiveLimit ? TextColType.LightGreen : TextColType.Red, nowActivityLevel.ToString()), prepareActiveLimit); } bool isShowResult = displayState == 4 || displayState == 5; myLightImage.SetActive(isShowResult); enemyLightImage.SetActive(isShowResult); myLightImage.SetSprite(displayState == 4 ? "GuildAtkDefBatLightVictory" : "GuildAtkDefBatLightFail"); enemyLightImage.SetSprite(displayState == 4 ? "GuildAtkDefBatLightFail" : "GuildAtkDefBatLightVictory"); myTextImage.SetSprite(displayState == 4 ? "GuildAtkDefBatTextVictory" : "GuildAtkDefBatTextFail"); enemyTextImage.SetSprite(displayState == 4 ? "GuildAtkDefBatTextFail" : "GuildAtkDefBatTextVictory"); } }