using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; public class FairyModel : GameSystemManager { public Dictionary> familyActions = new Dictionary>(); public event Action FamilyActionInfoEvent; public event Action fairyCreateTimesUpdate; public override void Init() { ParseConfig(); PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo; PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine; TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; } private void OnSyntonyEvent(TimeMgr.SyntonyType _type) { if (_type == TimeMgr.SyntonyType.GetFairyInfo) { if (m_RequestFairyInfoCount > 1) { C0F07_tagCGetFamilyInfo pack = new C0F07_tagCGetFamilyInfo(); pack.Type = 0; GameNetSystem.Instance.SendInfo(pack); TimeMgr.Instance.Register(TimeMgr.SyntonyType.GetFairyInfo, 1); m_RequestFairyInfoCount = 1; } else { m_RequestFairyInfoCount = 0; } } } public void OnBeforePlayerDataInitialize() { m_FairyRequesteds.Clear(); m_RequestFairyInfoCount = 0; fairyCreateTimes = 0; familyActions.Clear(); } private void OnRefreshFairyInfo() { UpdateAddFairyRedpoint(); } private void OnRefreshFairyMine() { if (!PlayerDatas.Instance.fairyData.HasFairy) { familyActions.Clear(); } } public void GotoFairyWin(int functionOrder = 0) { if (functionOrder == 0) { if (PlayerDatas.Instance.fairyData.HasFairy) { functionOrder = 1; if (RedpointCenter.Instance.GetRedpointState(10701) == RedPointState.Simple) { functionOrder = 1; } else if (RedpointCenter.Instance.GetRedpointState(10702) == RedPointState.Simple) { functionOrder = 2; } else if (RedpointCenter.Instance.GetRedpointState(10704) == RedPointState.Simple) { functionOrder = 4; } else if (RedpointCenter.Instance.GetRedpointState(10705) == RedPointState.Simple) { functionOrder = 5; } } else { functionOrder = 3; } } // WindowCenter.Instance.Open(false, functionOrder); } #region 发包 public void SendKickFairy(uint playerID) { var pak = new C0F09_tagCDeleteFamilyMember(); pak.MemberID = playerID; GameNetSystem.Instance.SendInfo(pak); } public void SendApplyFairy(uint id) { int limit = FuncOpenLVConfig.Get((int)FuncOpenEnum.Fairy).LimitLV; if (PlayerDatas.Instance.baseData.LV < limit) { ServerTipDetails.DisplayNormalTip(Language.Get("L1106", limit)); return; } if (PlayerDatas.Instance.fairyData.HasFairy) { ServerTipDetails.DisplayNormalTip(Language.Get("HasFairyTip")); return; } CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily(); rqPack.Type = 0; rqPack.TagFamilyID = id; GameNetSystem.Instance.SendInfo(rqPack); } #endregion public int presentChangeMember { get; set; } private bool m_IsOnAllot = false; public bool IsOnAllot { get { return m_IsOnAllot; } set { m_IsOnAllot = value; } } private int m_RequestFairyInfoCount = 0; #region 配置 public int createFairyCost { get; private set; } public int createFairyFreeCount { get; private set; } public readonly int changeFairyNameItem = 947; public int freeNotifyCount { get; private set; } public int changeNotifyCost { get; private set; } public int fairyCreateTimes { get; private set; } void ParseConfig() { var config = FuncConfigConfig.Get("CreateFamily"); createFairyCost = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("FamilyMatchSet"); fairyLeagueLimit = int.Parse(config.Numerical1); } public static string GetFairyGradeLabel(int rank) { rank = Mathf.CeilToInt((float)rank / 4); switch (rank) { case 1: return Language.Get("Fairy_S"); case 2: return Language.Get("Fairy_A"); case 3: return Language.Get("Fairy_B"); case 4: return Language.Get("Fairy_C"); default: return Language.Get("Fairy_D"); } } #endregion public List fairyList = new List(); public int page = 0; public int presentFairy = -1; public void OnSearchPageList() { SendSearchFairyList(page, PlayerFairyData.PageCnt); } public void SendSearchFairyList(int _page, int _pageCnt) { CA401_tagCGViewFamilyPage searchPack = new CA401_tagCGViewFamilyPage(); searchPack.PageIndex = (ushort)_page; searchPack.ShowCount = (byte)_pageCnt; searchPack.SortRulex = 0; searchPack.ViewType = 3; GameNetSystem.Instance.SendInfo(searchPack); } private List m_FairyRequesteds = new List(); public void UpdateFairyRequested(HA501_tagMCNotifyRequestJoinFamilyInfo _package) { m_FairyRequesteds.Clear(); for (int i = 0; i < _package.RequestCount; i++) { m_FairyRequesteds.Add((int)_package.RequestJoinFamilyIDList[i]); } } public void ReceivePackage(HA40D_tagGCServerCreatFamilyTimes package) { fairyCreateTimes = (int)package.Times; if (fairyCreateTimesUpdate != null) { fairyCreateTimesUpdate(); } } public bool FairyRequested(int _fairyId) { return m_FairyRequesteds.Contains(_fairyId); } public void UpdateFairyInfo() { if (m_RequestFairyInfoCount == 0) { C0F07_tagCGetFamilyInfo pack = new C0F07_tagCGetFamilyInfo(); pack.Type = 0; GameNetSystem.Instance.SendInfo(pack); TimeMgr.Instance.Register(TimeMgr.SyntonyType.GetFairyInfo, 1); } m_RequestFairyInfoCount++; } public bool InSameFairy(int playerId) { if (!PlayerDatas.Instance.fairyData.HasFairy) { return false; } return PlayerDatas.Instance.fairyData.GetMember(playerId) != null; } #region 成员列表排序 private int m_SortType = 4; public int sortType { get { return m_SortType; } set { m_SortType = value; } } private bool m_Up = false; public bool up { get { return m_Up; } set { m_Up = value; } } public List sortFairyMembers = new List(); public void OnSort(int type) { if (sortType == type) { up = !up; } else { up = false; } sortType = type; if (sortFairyMembers.Count > 0) { sortFairyMembers.Sort(Compare); } } public int Compare(PlayerFairyData.FairyMember x, PlayerFairyData.FairyMember y) { int attach = up ? 1 : -1; //在线0 挂机1 离线2 uint olx = 2 - (x.Exattr2 > 1 ? 2 : x.Exattr2); uint oly = 2 - (y.Exattr2 > 1 ? 2 : y.Exattr2); switch (sortType) { case 1: { if (x.LV.CompareTo(y.LV) != 0) return attach * x.LV.CompareTo(y.LV); if (olx.CompareTo(oly) != 0) return -olx.CompareTo(oly); if (x.Exattr2.CompareTo(y.Exattr2) != 0) return x.Exattr2.CompareTo(y.Exattr2); if (x.FamilyLV.CompareTo(y.FamilyLV) != 0) return -x.FamilyLV.CompareTo(y.FamilyLV); if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0) return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue); } break; case 2: { if (x.FamilyLV.CompareTo(y.FamilyLV) != 0) return attach * x.FamilyLV.CompareTo(y.FamilyLV); if (olx.CompareTo(oly) != 0) return -olx.CompareTo(oly); if (x.Exattr2.CompareTo(y.Exattr2) != 0) return x.Exattr2.CompareTo(y.Exattr2); if (x.LV.CompareTo(y.LV) != 0) return -x.LV.CompareTo(y.LV); if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0) return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue); } break; case 3: { if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0) return attach * x.FamilyActiveValue.CompareTo(y.FamilyActiveValue); if (olx.CompareTo(oly) != 0) return -olx.CompareTo(oly); if (x.Exattr2.CompareTo(y.Exattr2) != 0) return x.Exattr2.CompareTo(y.Exattr2); if (x.FamilyLV.CompareTo(y.FamilyLV) != 0) return -x.FamilyLV.CompareTo(y.FamilyLV); if (x.LV.CompareTo(y.LV) != 0) return -x.LV.CompareTo(y.LV); } break; case 4: { if (olx.CompareTo(oly) != 0) return attach * olx.CompareTo(oly); if (x.Exattr2.CompareTo(y.Exattr2) != 0) return attach * x.Exattr2.CompareTo(y.Exattr2); if (x.FamilyLV.CompareTo(y.FamilyLV) != 0) return -x.FamilyLV.CompareTo(y.FamilyLV); if (x.LV.CompareTo(y.LV) != 0) return -x.LV.CompareTo(y.LV); if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0) return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue); } break; } return 1; } #endregion #region 仙盟名限制 public bool CheckFairyNameLimit(string _name, out int errorCode) { errorCode = 0; if (string.IsNullOrEmpty(_name)) { errorCode = 0; return false; } if (DirtyWordConfig.IsDirtWord(_name) || UIHelper.HasSpecialCharac(_name) || DirtyNameConfig.IsDirtName(_name)) { errorCode = 1; return false; } return true; } public void ShowFairyNameErrorTip(int _errorCode) { switch (_errorCode) { case 0: SysNotifyMgr.Instance.ShowTip("FamilyNameChangeNoNull"); break; case 1: SysNotifyMgr.Instance.ShowTip("FamilyNameChangeUnlegal"); break; } } public void SendChangeFairyName(string _name, int _itemIndex) { LanguageVerify.Instance.VerifyFairy(_name, 2, PlayerDatas.Instance.fairyData.fairy.FamilyName, PlayerDatas.Instance.fairyData.mine.FamilyLV, (bool ok, string content) => { CA611_tagCMRenameFamily _pak = new CA611_tagCMRenameFamily(); _pak.NewName = content; _pak.ItemIndex = (byte)_itemIndex; _pak.NewNameLen = (byte)Encoding.UTF8.GetBytes(content).Length; GameNetSystem.Instance.SendInfo(_pak); }); } public event Action UpdateFairyChangeNameEvent; public void UpdateFairyChangeName(H0F07_tagFamilyRenameResult _package) { if (UpdateFairyChangeNameEvent != null) { UpdateFairyChangeNameEvent(_package.Reasult); } } #endregion #region 红点 private void OnFuncStateChangeEvent(int _id) { if (_id == (int)FuncOpenEnum.Fairy) { UpdateAddFairyRedpoint(); } } private Redpoint m_FairyListRedpoint = new Redpoint(107, 10703); private Redpoint m_AddFairyRedpoint = new Redpoint(10703, 1070301); private const string FairyKey = "FairyAdd"; public void UpdateAddFairyRedpoint() { m_AddFairyRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy)) { return; } if (PlayerDatas.Instance.fairyData.HasFairy) { return; } var _list = PlayerDatas.Instance.fairyData.GetFairyListByPage(0); if (_list != null && _list.Count > 0) { for (int i = 0; i < _list.Count; i++) { var _cfg = FamilyConfig.Get(_list[i].FamilyLV); if (_cfg != null) { if (_list[i].AcceptJoin == 1 && _list[i].MemberCount < _cfg.MemberMax) { m_AddFairyRedpoint.state = RedPointState.Simple; break; } } } } } public void OnPlayerLoginOk() { page = 0; OnSearchPageList(); UpdateFairyInfo(); } #endregion #region 仙盟商店开启 public int fairyStoreLimit { get; private set; } public bool fairyStoreOpen { get { if (PlayerDatas.Instance.fairyData.HasFairy) { var fairy = PlayerDatas.Instance.fairyData.fairy; if (fairy != null && fairy.FamilyLV >= fairyStoreLimit) { return true; } } return false; } } public void ProcessErrorTip() { if (!PlayerDatas.Instance.fairyData.HasFairy) { SysNotifyMgr.Instance.ShowTip("DailyQuestwinUnionLimit"); } else if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < fairyStoreLimit) { SysNotifyMgr.Instance.ShowTip("FairyStoreOpenLimit", fairyStoreLimit); } } #endregion #region 仙盟联赛开启 public int fairyLeagueLimit { get; private set; } public bool SatisfyOpenFairyLeagueLv() { if (PlayerDatas.Instance.fairyData.HasFairy) { var fairy = PlayerDatas.Instance.fairyData.fairy; if (fairy != null && fairy.FamilyLV >= fairyLeagueLimit) { return true; } } return false; } #endregion //家族行为数据 因type不同而逻辑不同,使用请根据功能需求各自接收处理 public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo _package) { if (_package.ActionType != 13 && _package.ActionType != 14) return; if (!familyActions.ContainsKey((int)_package.FamilyID)) { familyActions.Add((int)_package.FamilyID, new Dictionary()); } familyActions[(int)_package.FamilyID][_package.ActionType] = _package.FamilyActionList; FamilyActionInfoEvent?.Invoke((int)_package.FamilyID, _package.ActionType); } }