using System;  
 | 
using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using System.Text;  
 | 
  
 | 
using UnityEngine;  
 | 
  
 | 
  
 | 
public class FairyModel : GameSystemManager<FairyModel>  
 | 
{  
 | 
  
 | 
      
 | 
    public Dictionary<int, Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>>();  
 | 
    public event Action<int, int> 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<UnionPanel>(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<PlayerFairyData.FairyData> fairyList = new List<PlayerFairyData.FairyData>();  
 | 
    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<int> m_FairyRequesteds = new List<int>();  
 | 
    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<PlayerFairyData.FairyMember> sortFairyMembers = new List<PlayerFairyData.FairyMember>();  
 | 
    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<int> 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<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>());  
 | 
        }  
 | 
  
 | 
        familyActions[(int)_package.FamilyID][_package.ActionType] = _package.FamilyActionList;  
 | 
        FamilyActionInfoEvent?.Invoke((int)_package.FamilyID, _package.ActionType);  
 | 
    }  
 | 
} 
 |