using System; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { //ÏÉÃË»ÕÕ ½âËøÍ¾¾¶ÀàÐÍ public enum FairyEmblemUnlockMethodType { Custom, // 0 - ¶¨ÖÆ LV, // 1 - µÈ¼¶×Ô¶¯½âËø Active, // 2 - »î¶¯»ñµÃ } public class FairyEmblemModel : Model, IBeforePlayerDataInitialize { public readonly int MaxItemRowCount = 6; // Ò»ÐÐչʾx¸ö»ÕÕ public readonly int FamilyActionsType = 15; // ¼Ò×åÐÐΪÀàÐÍ15 public readonly int FuncId = 237; public int defaultFamilyEmblemId; // ĬÈÏ»ÕÕÂID public bool isSendA408Pack = false; private int m_NowChooseEmblemId; public int nowChooseEmblemId { get { return m_NowChooseEmblemId; } set { m_NowChooseEmblemId = value; ChooseEmblemIdChangeEvent?.Invoke(); } } // Dictionary familyActions = new Dictionary(); public event Action ChooseEmblemIdChangeEvent; //Çл»±êǩҳ public event Action UpdateFamilyActionEvent; Redpoint entranceRedPoint = new Redpoint(10702, MainRedDot.FairyEmbleManageRepoint); //ÏÉÃ˹ÜÀíÃæ°åÈë¿Úºìµã public override void Init() { PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo; defaultFamilyEmblemId = int.Parse(FuncConfigConfig.Get("FairyEmblem").Numerical1); } public override void UnInit() { PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo; } private void OnRefreshFairyInfo() { UpdateRedPoint(); } public void OnBeforePlayerDataInitialize() { familyActions.Clear(); } public void UpdateRedPoint() { entranceRedPoint.state = RedPointState.None; // ½öÃËÖ÷ÄÜ¿´µ½ if (!IsCaptain()) return; // ÏÉÃË2¼¶³öÏÖ if (PlayerDatas.Instance.fairyData == null || PlayerDatas.Instance.fairyData.fairy.FamilyLV != 2) return; // Ö»³öÏÖÒ»´Î if (GetRedPointShow()) return; entranceRedPoint.state = RedPointState.Simple; } string localStr = "FairyEmblemEntranceRedPoint_"; public bool GetRedPointShow() { return LocalSave.GetBool(localStr + PlayerDatas.Instance.PlayerId); } public void SetRedPointShow() { LocalSave.SetBool(localStr + PlayerDatas.Instance.PlayerId, true); } public bool TryGetNowEmblemID(out int nowID) { nowID = 0; int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.Extra6; if (FamilyEmblemConfig.Has(emblemID) && IsUnLock(emblemID)) { nowID = (int)emblemID; return true; } if (FamilyEmblemConfig.Has(defaultFamilyEmblemId)) { nowID = defaultFamilyEmblemId; return true; } nowID = 0; return false; } // չʾָ¶¨»ÕÕ ±íÖÐÕÒ²»µ½»ÕÕ¾ÍÏÔʾĬÈ쵀 public void ShowEmblem(int emblemID, ImageEx imgTitle, float scale = 1.0f) { int nowEmblemID = emblemID; if (!FamilyEmblemConfig.Has(nowEmblemID)) { nowEmblemID = defaultFamilyEmblemId; } FamilyEmblemConfig config = FamilyEmblemConfig.Get(nowEmblemID); UIFrame frame = imgTitle.GetComponent(); if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image)) { if (frame == null) frame = imgTitle.gameObject.AddComponent(); List spriteList = UIFrameMgr.Inst.GetDynamicImage(config.Image); if (!spriteList.IsNullOrEmpty()) { imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height); } imgTitle.raycastTarget = false; frame.ResetFrame(config.Image); frame.enabled = true; } else { if (frame != null) frame.enabled = false; imgTitle.SetSprite(config.Image); imgTitle.SetNativeSize(); } imgTitle.rectTransform.localScale = new Vector3(scale, scale, scale); } //·¢°ü ²éÑ¯Íæ¼Òµ±Ç°ÏÉÃË»ÕÕ public void TrySendA408EmblemInfoPack() { //ÒѾ­·¢¹ý°üÁË if (isSendA408Pack) return; isSendA408Pack = true; var pack = new CA408_tagCGQueryFamilyAction(); pack.ActionType = 15; pack.FamilyID = PlayerDatas.Instance.baseData.FamilyId; GameNetSystem.Instance.SendInfo(pack); } //·¢°ü ¸ü¸ÄÏÉÃË»ÕÕ public void SendCA413ChangeFamilyEmblemPack(int emblemId) { var pack = new CA413_tagCGChangeFamilyEmblem(); pack.EmblemID = (byte)emblemId; GameNetSystem.Instance.SendInfo(pack); } public List GetShowList() { List showList = new List(); List keys = FamilyEmblemConfig.GetKeys(); for (int i = 0; i < keys.Count; i++) { showList.Add(int.Parse(keys[i])); } showList.Sort(Cmp); return showList; } // ÒѼ¤»î>δ¼¤»î private int Cmp(int a, int b) { bool isUnlock1 = IsUnLock(a); bool isUnlock2 = IsUnLock(b); if (isUnlock1 != isUnlock2) { return isUnlock2.CompareTo(isUnlock1); } // Èç¹û¼¤»î״̬Ïàͬ£¬±È½ÏÊÇ·ñΪÏÞʱ£ºÏÞʱ (true) > ÓÀ¾Ã (false) bool isLimitA = IsLimitTime(a, out var familyAction1); bool isLimitB = IsLimitTime(b, out var familyAction2); if (isLimitA != isLimitB) { return isLimitB.CompareTo(isLimitA); } // ÏÞʱ״̬Ïàͬ£¬±È½Ï SortNum int sortNumA = GetSortNum(a); int sortNumB = GetSortNum(b); if (sortNumA != sortNumB) { return sortNumA.CompareTo(sortNumB); } return a.CompareTo(b); } public int GetSortNum(int emblemID) { if (!FamilyEmblemConfig.Has(emblemID)) return 0; return FamilyEmblemConfig.Get(emblemID).SortNum; } // »ñµÃ»ÕÕÂÀ´Ô´ÀàÐÍ public FairyEmblemUnlockMethodType GetFairyEmblemUnlockType(int emblemID) { FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID); if (config == null) return FairyEmblemUnlockMethodType.LV; if (config.CustomFamilyID > 0) return FairyEmblemUnlockMethodType.Custom; return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active; } // Ö¸¶¨µÄ»ÕÕ½âËøÁËÂð public bool IsUnLock(int emblemId) { FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId); FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId); HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction; switch (type) { case FairyEmblemUnlockMethodType.Custom: //ËùÔÚÏÉÃ˲»ÊÇÖ¸¶¨µÄ¶¨ÖÆÏÉÃË Î´½âËø if (PlayerDatas.Instance.baseData.FamilyId != config.CustomFamilyID) return false; //·â°üÖÐûÓоÍËãδ½âËø if (!TryGetfamilyAction(emblemId, out familyAction)) return false; if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds) return false; return true; case FairyEmblemUnlockMethodType.LV: //ËùÔÚÏÉÃ˵ȼ¶Ð¡ÓÚ»ÕÕÂÒªÇóµÈ¼¶ δ½âËø if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.UnlockFamilyLV) return false; return true; case FairyEmblemUnlockMethodType.Active: //·â°üÖÐûÓоÍËãδ½âËø if (!TryGetfamilyAction(emblemId, out familyAction)) return false; if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds) return false; return true; default: return false; } } public bool IsUsing(int emblemId) { if (!TryGetNowEmblemID(out int Id)) { return false; } return emblemId == Id; } public bool IsLimitTime(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction) { familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction(); FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId); FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId); switch (type) { case FairyEmblemUnlockMethodType.LV: return false; case FairyEmblemUnlockMethodType.Custom: case FairyEmblemUnlockMethodType.Active: if (config.ExpireMinutes <= 0) return false; if (!TryGetfamilyAction(emblemId, out familyAction)) return false; return true; default: return false; } } public bool IsCaptain() { return (int)PlayerDatas.Instance.fairyData.mine.FamilyLV == 3; } // ³¢ÊÔ´Ó·â°üÖеõ½Ö¸¶¨µÄ»ÕÕÂʱЧÐÅÏ¢£¨»î¶¯Í¾¾¶»ñÈ¡µÄ»ÕÕÂ,¶¨ÖÆ»ÕÕ£© private bool TryGetfamilyAction(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction) { familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction(); if (!familyActions.TryGetValue(emblemId, out var info) || info == null) return false; familyAction = info; return true; } public bool TryGetEffectID(int emblemId, out int effectID) { effectID = 0; if (!FamilyEmblemConfig.Has(emblemId)) return false; FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId); if (!EffectConfig.Has(config.EffectID)) return false; effectID = config.EffectID; return true; } public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo vNetData) { if (vNetData.ActionType != FamilyActionsType || PlayerDatas.Instance.baseData == null || (int)vNetData.FamilyID != (int)PlayerDatas.Instance.baseData.FamilyId) return; for (int i = 0; i < vNetData.FamilyActionList.Length; i++) { HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction = vNetData.FamilyActionList[i]; familyActions[(int)familyAction.Value1] = familyAction; } UpdateFamilyActionEvent?.Invoke((int)vNetData.FamilyID, vNetData.ActionType); } } }