using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; namespace Snxxz.UI { [XLua.LuaCallCSharp] public class FairyModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk { DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { ParseConfig(); ParseFakeFairy(); PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo; PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine; TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; dungeonModel.dungeonCoolDownEvent += OnBeginTimeEvent; StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; GlobalTimeEvent.Instance.secondEvent += SecondEvent; } 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 override void UnInit() { } public void OnBeforePlayerDataInitialize() { fairyRequestRedPoint.state = RedPointState.Quantity; ClearAllFairyRequest(); m_FairyRequesteds.Clear(); m_RequestFairyInfoCount = 0; completeGuardSky = false; fairyLeagueDugeonCoolDown = false; } private void OnRefreshFairyInfo() { if (PlayerDatas.Instance.fairyData.HasFairy) { if (!AddFairyRed) { LocalSave.SetBool(StringUtility.Contact(FairyKey, PlayerDatas.Instance.PlayerId), true); } AddFairyRed = true; ClearAllFairyRequest(); } UpdateRedpoint(); UpdateAddFairyRedpoint(); } private void OnRefreshFairyMine() { UpdateRedpoint(); } public void GotoFairyWin(int functionOrder = 0) { if (functionOrder == 0) { if (PlayerDatas.Instance.fairyData.HasFairy) { functionOrder = 2; 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 auctionModel = ModelCenter.Instance.GetModel(); if (!auctionModel.SatisfyQuitFairy((int)playerID)) { SysNotifyMgr.Instance.ShowTip("Paimai7"); return; } 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_tagCGRequesJoinFamily rqPack = new CA602_tagCGRequesJoinFamily(); rqPack.Type = 0; rqPack.AddFamilyID = 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 createFairyLv { get; private set; } public int createFairyCost { get; private set; } public readonly int changeFairyNameItem = 947; public int freeNotifyCount { get; private set; } public int changeNotifyCost { get; private set; } public int fairyFeastDeskNpc { get; private set; } void ParseConfig() { var config = FuncConfigConfig.Get("CreateFamilyMinLV"); createFairyLv = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("CreateFamilyNeedMoney"); createFairyCost = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("FamilyBroadcast"); freeNotifyCount = int.Parse(config.Numerical1); changeNotifyCost = int.Parse(config.Numerical2); config = FuncConfigConfig.Get("FamilyShop"); fairyStoreLimit = int.Parse(config.Numerical2); config = FuncConfigConfig.Get("FamilyPartyDeskNpcID"); fairyFeastDeskNpc = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("SWRHFamilyLV"); guardSkyOpenFairyLv = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("TechFamilyLV"); fairyMethodToLimit = int.Parse(config.Numerical1); config = FuncConfigConfig.Get("FamilyMatchSet"); fairyLeagueLimit = int.Parse(config.Numerical1); } #endregion public List fairyList = new List(); public int page = 0; public int presentFairy = -1; public bool fairySalaryGet { get; private set; } 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); } public void SendGetFairySalary() { CA504_tagCMPlayerGetReward _pak = new CA504_tagCMPlayerGetReward(); _pak.RewardType = (byte)GotServerRewardType.Def_RewardType_FairyDayAward; _pak.DataEx = (uint)0; _pak.DataExStrLen = 0; _pak.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(_pak); } public event Action UpdateFairySalaryEvent; public void UpdateFairySalary(int _state) { fairySalaryGet = _state == 1; if (UpdateFairySalaryEvent != null) { UpdateFairySalaryEvent(); } UpdateRedpoint(); } 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.RequestAddFamilyInfo[i].RequestFamilyID); } } 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; bool olx = x.Exattr2 == 0; bool oly = y.Exattr2 == 0; 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 void SendInviteFairy(int _playerId, string _playerName) { C0F05_tagCAddFamilyPlayer _pak = new C0F05_tagCAddFamilyPlayer(); _pak.TagID = (uint)_playerId; _pak.TagName = _playerName; GameNetSystem.Instance.SendInfo(_pak); } public Dictionary fairyRequestDict = new Dictionary(); public event Action UpdateFairyRequestEvent; private Redpoint fairyRequestRedPoint = new Redpoint(33); public Redpoint FairyRequestRedPoint { get { return fairyRequestRedPoint; } } public void UpdateFairyRequest(H0F04_tagFamilyAskIfJoin vNetData) { if (!fairyRequestDict.ContainsKey((int)vNetData.FamilyID)) { FairyRequest _request = new FairyRequest() { fairyId = (int)vNetData.FamilyID, leaderId = (int)vNetData.LeaderID, leaderName = vNetData.LeaderName, fairyName = vNetData.FamilyName, }; fairyRequestDict.Add((int)vNetData.FamilyID, _request); } fairyRequestRedPoint.count = fairyRequestDict.Count; if (UpdateFairyRequestEvent != null) { UpdateFairyRequestEvent(); } } public void RemoveFairyRequest(int _fairyId) { if (fairyRequestDict.ContainsKey(_fairyId)) { fairyRequestDict.Remove(_fairyId); } fairyRequestRedPoint.count = fairyRequestDict.Count; if (UpdateFairyRequestEvent != null) { UpdateFairyRequestEvent(); } } public void ClearAllFairyRequest() { fairyRequestRedPoint.count = 0; fairyRequestDict.Clear(); if (WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Close(); } if (UpdateFairyRequestEvent != null) { UpdateFairyRequestEvent(); } } public void AgreeFairyRequest(int _fairyId) { if (fairyRequestDict.ContainsKey(_fairyId)) { C0F08_tagAskJoinFamilyReply _pak = new C0F08_tagAskJoinFamilyReply(); _pak.TagPlayerID = (uint)fairyRequestDict[_fairyId].leaderId; _pak.IsOK = 1; GameNetSystem.Instance.SendInfo(_pak); if (WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Close(); } } } public class FairyRequest { public int fairyId; public int leaderId; public string leaderName; public string fairyName; } #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 守卫人皇 public bool completeGuardSky { get;private set; } public int guardSkyOpenFairyLv { get; private set; } public bool SatisfyGuardSkyFairyLv() { var fairyData = PlayerDatas.Instance.fairyData; if (!fairyData.HasFairy || fairyData.fairy == null) { return false; } return fairyData.fairy.FamilyLV >= guardSkyOpenFairyLv; } public event Action guardSkyCompleteEvent; public void UpdateGuardSky(bool _hasJoin) { completeGuardSky = _hasJoin; if (guardSkyCompleteEvent != null) { guardSkyCompleteEvent(); } } #endregion #region 红点 private Redpoint m_SalaryRedpoint = new Redpoint(10701, 1070110); public Redpoint fairySalaryRedpoint { get { return m_SalaryRedpoint; } } private void UpdateRedpoint() { m_SalaryRedpoint.state = RedPointState.None; if (!PlayerDatas.Instance.fairyData.HasFairy) { return; } m_SalaryRedpoint.state = fairySalaryGet ? RedPointState.None : RedPointState.Simple; } 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"; private bool AddFairyRed = false; public void UpdateAddFairyRedpoint() { m_AddFairyRedpoint.state = RedPointState.None; if (AddFairyRed) { return; } if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy)) { return; } if (PlayerDatas.Instance.fairyData.HasFairy) { return; } if (fakeFairyIds.Count > 0) { m_AddFairyRedpoint.state = RedPointState.Simple; 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.memberCnt) { m_AddFairyRedpoint.state = RedPointState.Simple; break; } } } } } public void OnPlayerLoginOk() { page = 0; OnSearchPageList(); AddFairyRed = LocalSave.GetBool(StringUtility.Contact(FairyKey, PlayerDatas.Instance.PlayerId)); UpdateFairyInfo(); } #endregion #region 假仙盟 public List fakeFairyNames { get; private set; } public int fakeFairyCount { get; private set; } public List fakeFairyIds { get; private set; } public event Action fakeFairyUpdateEvent; public const int FakeFairyStartIndex = 100000000; private void ParseFakeFairy() { fakeFairyIds = new List(); fakeFairyNames = new List(); var config = FuncConfigConfig.Get("FakeFamilyName"); fakeFairyNames.AddRange(LitJson.JsonMapper.ToObject(config.Numerical1)); fakeFairyCount = int.Parse(config.Numerical2); } public void UpdateFakeId(uint[] _ids) { fakeFairyIds.Clear(); if (_ids != null && _ids.Length > 0) { for (int i = 0; i < _ids.Length; i++) { fakeFairyIds.Add((int)_ids[i]); } } if (fakeFairyUpdateEvent != null) { fakeFairyUpdateEvent(); } } #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 fairyMethodToLimit { get; private set; } public bool fairyMethodToOpen { get { if (PlayerDatas.Instance.fairyData.HasFairy) { var fairy = PlayerDatas.Instance.fairyData.fairy; if (fairy != null && fairy.FamilyLV >= fairyMethodToLimit) { return true; } } return false; } } public void ProcessMethodToErrorTip() { if (!PlayerDatas.Instance.fairyData.HasFairy) { SysNotifyMgr.Instance.ShowTip("DailyQuestwinUnionLimit"); } else if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < fairyMethodToLimit) { SysNotifyMgr.Instance.ShowTip("FairyMethodToLimit", fairyMethodToLimit); } } #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 public bool InFairyLeagueDungeon { get { if (StageLoad.Instance.currentStage is DungeonStage) { var mapId = dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID); if (mapId == FairyLeagueModel.FAIRY_LEAGUE_DUNGEON) { return true; } } return false; } } private bool fairyLeagueDugeonCoolDown = false; DateTime fairyLeagueBeginTime = DateTime.Now; private void OnBeginTimeEvent(DungeonCoolDownType type) { if (type == DungeonCoolDownType.WaitStart) { if (InFairyLeagueDungeon) { fairyLeagueBeginTime = dungeonModel.GetCoolDownEndTime(DungeonCoolDownType.WaitStart); if (TimeUtility.ServerNow < fairyLeagueBeginTime) { fairyLeagueDugeonCoolDown = true; } } } } private void OnStageLoadFinish() { if (InFairyLeagueDungeon) { fairyLeagueBeginTime = dungeonModel.GetCoolDownEndTime(DungeonCoolDownType.WaitStart); if (TimeUtility.ServerNow < fairyLeagueBeginTime) { fairyLeagueDugeonCoolDown = true; } } else { fairyLeagueDugeonCoolDown = false; } bool isDungeon = StageLoad.Instance.currentStage is DungeonStage; if (!isDungeon) { PlayerDatas.Instance.fairyData.ClearFairyData(); } } private void SecondEvent() { if (fairyLeagueDugeonCoolDown && TimeUtility.ServerNow >= fairyLeagueBeginTime) { fairyLeagueDugeonCoolDown = false; if (InFairyLeagueDungeon) { var effect = EffectMgr.Instance.PlayUIEffect(3054, 4500, WindowCenter.Instance.uiRoot.tipsCanvas, false); if (effect != null) { SnxxzGame.Instance.StartCoroutine(Co_DestroyEffect(effect)); } } } } IEnumerator Co_DestroyEffect(UIEffect effect) { yield return WaitingForSecondConst.WaitMS3000; if (effect != null) { effect.StopImediatly(); } } } }