using System;  
 | 
using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using System.Linq;  
 | 
using System.Text;  
 | 
using Cysharp.Threading.Tasks;  
 | 
using LitJson;  
 | 
using UnityEngine;  
 | 
  
 | 
  
 | 
public class GuildManager : GameSystemManager<GuildManager>  
 | 
{  
 | 
    // 申请的公会列表  
 | 
    private List<int> m_FairyRequesteds = new List<int>();  
 | 
    // 公会自定义记录附加数据,按类型存储  
 | 
    // 公会ID, 类型ID, 数据  
 | 
    public Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>>();  
 | 
    public event Action<int, int> FamilyActionInfoEvent;    //公会自定义记录, 其他功能从这获取  
 | 
  
 | 
    //要操作哪个成员的索引  
 | 
    int m_MemberOPIndex = -1;  
 | 
    public event Action MemberOPIndexEvent;  
 | 
    public int memberOPIndex  
 | 
    {  
 | 
        get { return m_MemberOPIndex; }  
 | 
        set  
 | 
        {  
 | 
            m_MemberOPIndex = value;  
 | 
            MemberOPIndexEvent?.Invoke();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public byte[] donateCntList;  
 | 
    public event Action DonateCntListEvent;  
 | 
    public event Action<bool> EnterOrQuitGuildEvent;   //进入或退出公会事件  
 | 
  
 | 
  
 | 
    public override void Init()  
 | 
    {  
 | 
        ParseConfig();  
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;  
 | 
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;  
 | 
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;  
 | 
    }  
 | 
    public override void Release()  
 | 
    {  
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;  
 | 
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;  
 | 
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;  
 | 
    }  
 | 
  
 | 
  
 | 
    void OnBeforePlayerDataInitialize()  
 | 
    {  
 | 
        ClearGuildData();  
 | 
    }  
 | 
  
 | 
    void OnPlayerLoginOk()  
 | 
    {  
 | 
        UpdateDonateRedPoint();  
 | 
          
 | 
    }  
 | 
      
 | 
    void PlayerDataRefreshEvent(PlayerDataType type)  
 | 
    {  
 | 
        if(type == PlayerDataType.default33)  
 | 
        {  
 | 
            UpdateDonateRedPoint();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    void ClearGuildData()  
 | 
    {  
 | 
        m_FairyRequesteds.Clear();  
 | 
        familyActions.Clear();  
 | 
        guildChanged = false;  
 | 
        applyList.Clear();  
 | 
        PlayerDatas.Instance.fairyData.ClearData();  
 | 
    }  
 | 
      
 | 
    //退出公会  
 | 
    public void AfterQuitGuild()  
 | 
    {  
 | 
        //退出公会  
 | 
        ClearGuildData();  
 | 
        //需要转到HomeWin界面 且关闭公会相关界面(父子继承关闭)  
 | 
        UIManager.Instance.GetUI<MainWin>()?.ClickFunc(0);  
 | 
  
 | 
  
 | 
        isQueryZBGYet = false;  
 | 
        zhenbaogeCutState = 0;  
 | 
        familyZBGActions.Clear();  
 | 
        sortPlayerCut.Clear();  
 | 
          
 | 
        UpdateZBGRedpoint();  
 | 
        UpdateDonateRedPoint();  
 | 
        EnterOrQuitGuildEvent?.Invoke(false);  
 | 
    }  
 | 
  
 | 
    //注意上线通知公会数据时也会触发  
 | 
    public async UniTask AfterEnterGuild()  
 | 
    {  
 | 
        //这里还没有公会数据, 后续的包会更新公会数据  
 | 
        await UniTask.Delay(100);  
 | 
        UpdateDonateRedPoint();  
 | 
        UpdateZBGRedpoint();  
 | 
        QueryZBGFamilyInfo();  
 | 
        EnterOrQuitGuildEvent?.Invoke(true);  
 | 
    }  
 | 
  
 | 
  
 | 
    #region 配置  
 | 
  
 | 
    public int createFairyCost  
 | 
    {  
 | 
        get;  
 | 
        private set;  
 | 
    }  
 | 
    public int createMoneyType;  
 | 
  
 | 
    public int requestPlayerCount;  //每个仙盟最大可接受申请加入玩家数  
 | 
    public int requestGuildCount;   //每个玩家最大可同时申请加入仙盟数  
 | 
  
 | 
    // 权限ID: 1-收人,2-变更职位,3-发布公告,4-踢人  
 | 
    // 职位: 0-成员,1-精英,2-副盟主,3-盟主  
 | 
    public Dictionary<int, int> guildWorkToLevel = new Dictionary<int, int>();  
 | 
  
 | 
    //退出惩罚  
 | 
    public int[] quitGuildPunishTime;  
 | 
    public int[] beQuitGuildPunishTime;  
 | 
    public int quitGuildPunishMoneyType;  
 | 
    public int[] quitGuildPunishMoney;  
 | 
    public int[] beQuitGuildPunishMoney;  
 | 
  
 | 
    //改名  
 | 
    public int renameFairyNameCD;  
 | 
    public int renameFairyNameCost;  
 | 
    public int renameFairyNameMoneyType;  
 | 
  
 | 
  
 | 
      
 | 
  
 | 
    //珍宝阁(行商)  
 | 
    public int zhenbaogeCutState = 0;  
 | 
    public int zhenbaogeBuyState = 0;  
 | 
    public bool needCheckCutCD = false;  
 | 
    public event Action UpdateZhenbaogeEvent;  
 | 
    public bool isQueryZBGYet = false;  
 | 
    public float lastZBGStartTime = 0; //过天刷新用  
 | 
    public const int ZBGFamilyActionType = 16;  
 | 
    //{id:数据} 砍价行为,value1为玩家ID,特殊约定为1时为家族的数据  
 | 
    public Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction> familyZBGActions = new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();  
 | 
    public List<int> sortPlayerCut = new List<int>();  
 | 
    public event Action<bool> UpdateFamilyActionEvent;  
 | 
    public int zbgPriceType;  
 | 
    public int zbgOrgPriceValue;  
 | 
    public int zbgChangFamilyCD;  
 | 
    public List<int> cutCntListForTalk = new List<int>();  
 | 
  
 | 
  
 | 
    void ParseConfig()  
 | 
    {  
 | 
        DirtyWordConfig.DirtyWordInit();  
 | 
        DirtyNameConfig.DirtyNameInit();  
 | 
  
 | 
        var config = FuncConfigConfig.Get("CreateFamily");  
 | 
        createFairyCost = int.Parse(config.Numerical1);  
 | 
        createMoneyType = int.Parse(config.Numerical2);  
 | 
  
 | 
        // config = FuncConfigConfig.Get("FamilyMatchSet");  
 | 
        // fairyLeagueLimit = int.Parse(config.Numerical1);  
 | 
  
 | 
        config = FuncConfigConfig.Get("FamilyReqJoin");  
 | 
        requestPlayerCount = int.Parse(config.Numerical1);  
 | 
        requestGuildCount = int.Parse(config.Numerical2);  
 | 
  
 | 
        config = FuncConfigConfig.Get("FamilyPower");  
 | 
        guildWorkToLevel = ConfigParse.ParseIntDict(config.Numerical1);  
 | 
  
 | 
        config = FuncConfigConfig.Get("FamilyLeave");  
 | 
        quitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical1);  
 | 
        beQuitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical2);  
 | 
        quitGuildPunishMoneyType = int.Parse(config.Numerical3);  
 | 
        quitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical4);  
 | 
        beQuitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical5);  
 | 
  
 | 
        config = FuncConfigConfig.Get("FamilyRename");  
 | 
        renameFairyNameCD = int.Parse(config.Numerical2);  
 | 
        var arr = ConfigParse.GetMultipleStr<int>(config.Numerical1);  
 | 
        renameFairyNameMoneyType = arr[0];  
 | 
        renameFairyNameCost = arr[1];  
 | 
  
 | 
        config = FuncConfigConfig.Get("Zhenbaoge");  
 | 
        zbgPriceType = int.Parse(config.Numerical1);  
 | 
        zbgOrgPriceValue = int.Parse(config.Numerical2);  
 | 
        zbgChangFamilyCD = int.Parse(config.Numerical3);  
 | 
        cutCntListForTalk = JsonMapper.ToObject<List<int>>(config.Numerical4);  
 | 
    }  
 | 
  
 | 
  
 | 
    #endregion  
 | 
  
 | 
  
 | 
    //我的请求加入公会的列表  
 | 
    public event Action MyRequestJoinEvent;  
 | 
    public void UpdateFairyRequested(HA501_tagMCNotifyRequestJoinFamilyInfo _package)  
 | 
    {  
 | 
        m_FairyRequesteds.Clear();  
 | 
        for (int i = 0; i < _package.RequestCount; i++)  
 | 
        {  
 | 
            m_FairyRequesteds.Add((int)_package.RequestJoinFamilyIDList[i]);  
 | 
        }  
 | 
        MyRequestJoinEvent?.Invoke();  
 | 
    }  
 | 
  
 | 
  
 | 
    public bool IsGuildRequested(int _fairyId)  
 | 
    {  
 | 
        return m_FairyRequesteds.Contains(_fairyId);  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
    public bool InSameFairy(int playerId)  
 | 
    {  
 | 
        if (!PlayerDatas.Instance.fairyData.HasFairy)  
 | 
        {  
 | 
            return false;  
 | 
        }  
 | 
        return PlayerDatas.Instance.fairyData.GetMember(playerId) != null;  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
    #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;  
 | 
        }  
 | 
        if (UIHelper.IsNumeric(_name))  
 | 
        {  
 | 
            errorCode = 2;  
 | 
            return false;  
 | 
        }  
 | 
        return true;  
 | 
    }  
 | 
  
 | 
  
 | 
    public void ShowFairyNameErrorTip(int _errorCode)  
 | 
    {  
 | 
        switch (_errorCode)  
 | 
        {  
 | 
            case 0:  
 | 
                //空  
 | 
                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeNoNull");  
 | 
                break;  
 | 
            case 1:  
 | 
                // 脏字  
 | 
                SysNotifyMgr.Instance.ShowTip("NameSensitive");  
 | 
                break;  
 | 
            case 2:  
 | 
                // 不能纯数字  
 | 
                SysNotifyMgr.Instance.ShowTip("NameError3");  
 | 
                break;  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public void SendChangeFairyName(string _name, int _itemIndex)  
 | 
    {  
 | 
        LanguageVerify.Instance.VerifyFairy(_name, 2, PlayerDatas.Instance.fairyData.fairy.FamilyName, PlayerDatas.Instance.fairyData.mine.FmLV, (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);  
 | 
        });  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    int GetJoinCD()  
 | 
    {  
 | 
        if (PlayerDatas.Instance.baseData.leaveFamilyTime == 0)  
 | 
            return 0;  
 | 
        var quitType = PlayerDatas.Instance.baseData.leaveGuildInfo % 10;  
 | 
        int quitCount = 0;  
 | 
        int punishTime = 0;  
 | 
        if (quitType == 0)  
 | 
        {  
 | 
            //被踢  
 | 
            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 10 % 10 - 1;  
 | 
            if (quitCount < 0) return 0;  
 | 
            if (beQuitGuildPunishTime.Length != 0)  
 | 
                punishTime = beQuitGuildPunishTime[Math.Min(quitCount, beQuitGuildPunishTime.Length - 1)];  
 | 
        }  
 | 
        else if (quitType == 1)  
 | 
        {  
 | 
            //主动退出  
 | 
            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 100 - 1;  
 | 
            if (quitCount < 0) return 0;  
 | 
            if (quitGuildPunishTime.Length != 0)  
 | 
                punishTime = quitGuildPunishTime[Math.Min(quitCount, quitGuildPunishTime.Length - 1)];  
 | 
        }  
 | 
  
 | 
        return punishTime * 60 - (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime);  
 | 
    }  
 | 
  
 | 
  
 | 
    // 创建公会  
 | 
    public void CreateGuild(string name, int emblemID, string emblemWord)  
 | 
    {  
 | 
        var cdSeconds = GetJoinCD();  
 | 
        if (cdSeconds > 0)  
 | 
        {  
 | 
            SysNotifyMgr.Instance.ShowTip("GuildSys4", TimeUtility.SecondsToHMSEx(cdSeconds));  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!UIHelper.CheckMoneyCount(createMoneyType, createFairyCost, 2))  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (emblemWord.Length > 1)  
 | 
        {  
 | 
            //预制体输入框限制,不限任意字符都只能输入1个字  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!CheckName(name))  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        var pack = new CA604_tagCMCreateFamily();  
 | 
        pack.Name = name;  
 | 
        pack.EmblemID = (ushort)emblemID;  
 | 
        pack.EmblemWord = emblemWord;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
  
 | 
    }  
 | 
  
 | 
    public bool CheckName(string name)  
 | 
    {  
 | 
        int error;  
 | 
  
 | 
        //获取name的字节长度,name可能是中文 或者其他占用3个字符的符号  
 | 
        if (!UIHelper.SatisfyNameLength(name, out error))  
 | 
        {  
 | 
            // TODO 暂时按中文长度提示, 不同语言可根据情况修改  
 | 
            if (error == 1)  
 | 
            {  
 | 
                SysNotifyMgr.Instance.ShowTip("NameError2", 7);  
 | 
                return false;  
 | 
            }  
 | 
            else if (error == 2)  
 | 
            {  
 | 
                SysNotifyMgr.Instance.ShowTip("NameError1", 2);  
 | 
                return false;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        if (!CheckFairyNameLimit(name, out error))  
 | 
        {  
 | 
            ShowFairyNameErrorTip(error);  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
        return true;  
 | 
    }  
 | 
  
 | 
    #endregion  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    #region 仙盟商店开启  
 | 
    public int fairyStoreLimit = 0;  
 | 
    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 void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package)  
 | 
    {  
 | 
        if (PlayerDatas.Instance.fairyData == null ||  
 | 
            PlayerDatas.Instance.fairyData.fairy == null ||  
 | 
            PlayerDatas.Instance.fairyData.fairy.FamilyID != _package.FamilyID)  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!familyActions.ContainsKey((int)_package.FamilyID))  
 | 
        {  
 | 
            familyActions.Add((int)_package.FamilyID, new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>());  
 | 
        }  
 | 
  
 | 
        familyActions[(int)_package.FamilyID][_package.ActionType] = _package.FamilyActionList;  
 | 
  
 | 
        UpdateHawkerAction(_package);  
 | 
  
 | 
        FamilyActionInfoEvent?.Invoke((int)_package.FamilyID, _package.ActionType);  
 | 
    }  
 | 
  
 | 
    public bool TryGetFamilyActions(int actionType, out HA513_tagMCFamilyActionInfo.tagMCFamilyAction[] familyAction)  
 | 
    {  
 | 
        familyAction = null;  
 | 
        if (!PlayerDatas.Instance.fairyData.HasFairy)  
 | 
        {  
 | 
            return false;  
 | 
        }  
 | 
        if (!familyActions.ContainsKey((int)PlayerDatas.Instance.fairyData.fairy.FamilyID))  
 | 
        {  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
        if (!familyActions[(int)PlayerDatas.Instance.fairyData.fairy.FamilyID].TryGetValue(actionType, out familyAction))  
 | 
            return false;  
 | 
        return true;  
 | 
    }  
 | 
  
 | 
    public void QueryFamilyAction(int familyID, int actionType)  
 | 
    {  
 | 
        var pack = new CA617_tagCMQueryFamilyAction();  
 | 
        pack.FamilyID = (uint)familyID;  
 | 
        pack.ActionType = (byte)actionType;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
    #endregion  
 | 
  
 | 
  
 | 
  
 | 
    #region 仙盟列表  
 | 
  
 | 
    public event Action OnRefreshFairyList;  
 | 
  
 | 
    // 查找的公会ID:公会数据  
 | 
    public Dictionary<int, FairyData> guildsDict = new Dictionary<int, FairyData>();  
 | 
    // 按查询页存储  
 | 
    public List<int> pageIndexList = new List<int>();  //正常是按页查询,顺序添加即可  
 | 
    public int curPageIndex;  
 | 
    public int totalPageCount;  
 | 
  
 | 
    //查找公会列表  
 | 
    public void OnRefreshGuildViewList(HA523_tagMCFamilyViewList vNetData)  
 | 
    {  
 | 
        curPageIndex = vNetData.PageIndex;  
 | 
        totalPageCount = vNetData.TotalPage;  
 | 
  
 | 
        foreach (var guildInfo in vNetData.FamilyList)  
 | 
        {  
 | 
            FairyData data = new FairyData();  
 | 
            guildsDict[(int)guildInfo.FamilyID] = data;  
 | 
            SetFairyViewData(data, guildInfo);  
 | 
            pageIndexList.Add((int)guildInfo.FamilyID);  
 | 
        }  
 | 
  
 | 
  
 | 
        if (OnRefreshFairyList != null)  
 | 
        {  
 | 
            OnRefreshFairyList();  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    //查找公会  
 | 
    public void SendFindGuild(string msg, int pageIndex = 0, int pageSize = 20)  
 | 
    {  
 | 
        if (pageIndex == 0)  
 | 
        {  
 | 
            //默认查询第一页即代表重新开始查询,清空之前的数据  
 | 
            guildsDict.Clear();  
 | 
            pageIndexList.Clear();  
 | 
        }  
 | 
        var pack = new CA620_tagCMViewFamilyPage();  
 | 
  
 | 
        if (!string.IsNullOrEmpty(msg) && UIHelper.IsNumeric(msg))  
 | 
        {  
 | 
            msg = DecryptGuildID(msg);  
 | 
        }  
 | 
  
 | 
        pack.Msg = msg;  
 | 
        pack.MsgLen = (byte)msg.Length;  
 | 
        pack.PageIndex = (byte)pageIndex;  
 | 
        pack.ShowCount = (byte)pageSize;  
 | 
  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
  
 | 
    public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view)  
 | 
    {  
 | 
        data.Rank = view.Rank;  
 | 
        data.FamilyID = (int)view.FamilyID;  
 | 
        data.FamilyName = view.FamilyName;  
 | 
        data.LeaderID = (int)view.LeaderID;  
 | 
        data.LeaderName = view.LeaderName;  
 | 
        data.FamilyLV = view.FamilyLV;  
 | 
        data.JoinReview = view.JoinReview;  
 | 
        data.JoinLVMin = view.JoinLVMin;  
 | 
        data.ServerID = (int)view.ServerID;  
 | 
        data.EmblemID = (int)view.EmblemID;  
 | 
        data.EmblemWord = view.EmblemWord;  
 | 
        data.totalFightPower = view.FightPowerEx * Constants.ExpPointValue + view.FightPower;  
 | 
        data.MemberCount = view.MemberCount;  
 | 
  
 | 
    }  
 | 
  
 | 
    #endregion  
 | 
  
 | 
    #region 申请列表  
 | 
    public event Action OnRefreshApplyList;  
 | 
    private List<FairyApply> applyList = new List<FairyApply>();  
 | 
    private Redpoint memberRedpoint = new Redpoint(107, 10702);  
 | 
    private Redpoint applyRedpoint = new Redpoint(10702, 1070201);  
 | 
  
 | 
    //申请加入的玩家信息  
 | 
    public void OnRefreshRequestJoinPlayerInfo(HA522_tagMCFamilyReqJoinInfo vNetData)  
 | 
    {  
 | 
        applyList.Clear();  
 | 
        for (int i = 0; i < vNetData.ReqCnt; i++)  
 | 
        {  
 | 
            FairyApply apply = new FairyApply();  
 | 
            apply.Name = vNetData.ReqJoinList[i].Name;  
 | 
            apply.PlayerID = (int)vNetData.ReqJoinList[i].PlayerID;  
 | 
            apply.ReqTime = (int)vNetData.ReqJoinList[i].ReqTime;  
 | 
            apply.LV = vNetData.ReqJoinList[i].LV;  
 | 
            apply.Job = vNetData.ReqJoinList[i].Job;  
 | 
            apply.RealmLV = vNetData.ReqJoinList[i].RealmLV;  
 | 
            apply.Face = (int)vNetData.ReqJoinList[i].Face;  
 | 
            apply.FacePic = (int)vNetData.ReqJoinList[i].FacePic;  
 | 
            apply.TitleID = (int)vNetData.ReqJoinList[i].TitleID;  
 | 
            apply.FightPower = vNetData.ReqJoinList[i].FightPower + vNetData.ReqJoinList[i].FightPowerEx * Constants.ExpPointValue;  
 | 
            apply.ServerID = (int)vNetData.ReqJoinList[i].ServerID;  
 | 
            apply.IsOnLine = vNetData.ReqJoinList[i].IsOnLine;  
 | 
            applyList.Add(apply);  
 | 
        }  
 | 
        if (OnRefreshApplyList != null)  
 | 
        {  
 | 
            OnRefreshApplyList();  
 | 
        }  
 | 
        UpdateRequestRedpoint();  
 | 
    }  
 | 
  
 | 
    void UpdateRequestRedpoint()  
 | 
    {  
 | 
        if (PlayerDatas.Instance.fairyData.HasFairy && PlayerDatas.Instance.fairyData.IsCanFunc(LimitFunc.CanCall))  
 | 
        {  
 | 
            applyRedpoint.state = applyList.Count > 0 ? RedPointState.Simple : RedPointState.None;  
 | 
        }  
 | 
        else  
 | 
        {  
 | 
            applyRedpoint.state = RedPointState.None;  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public List<FairyApply> GetApplyList()  
 | 
    {  
 | 
        return applyList;  
 | 
    }  
 | 
  
 | 
    //type 0申请/1撤销 加入公会  
 | 
    //id 0 代表一键加入  
 | 
    public void SendApplyGuild(int id, int type)  
 | 
    {  
 | 
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Guild, true))  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (PlayerDatas.Instance.fairyData.HasFairy)  
 | 
        {  
 | 
            SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_85890");  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (type == 0)  
 | 
        {  
 | 
            if (m_FairyRequesteds.Count >= requestGuildCount)  
 | 
            {  
 | 
                SysNotifyMgr.Instance.ShowTip("GuildSys9");  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            var cdSeconds = GetJoinCD();  
 | 
            if (cdSeconds > 0)  
 | 
            {  
 | 
                SysNotifyMgr.Instance.ShowTip("GuildSys2", TimeUtility.SecondsToHMSEx(cdSeconds));  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            if (id != 0 && guildsDict.ContainsKey(id))  
 | 
            {  
 | 
                if (guildsDict[id].MemberCount >= FamilyConfig.Get(guildsDict[id].FamilyLV).MemberMax)  
 | 
                {  
 | 
                    SysNotifyMgr.Instance.ShowTip("jiazu_lhs_202580");  
 | 
                    return;  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();  
 | 
        rqPack.Type = (byte)type;  
 | 
        rqPack.TagFamilyID = (uint)id;  
 | 
        GameNetSystem.Instance.SendInfo(rqPack);  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
    //0 加入,1 申请 2 已申请  
 | 
    public int GetRequestState(FairyData guildInfo)  
 | 
    {  
 | 
        if (IsGuildRequested(guildInfo.FamilyID))  
 | 
        {  
 | 
            return 2;  
 | 
        }  
 | 
  
 | 
        if (guildInfo.JoinReview != 0)  
 | 
        {  
 | 
            return 1;  
 | 
        }  
 | 
  
 | 
        return 0;  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
    #endregion  
 | 
  
 | 
    float lastChangeMarkTime = 0;   //打开界面情况下避免短时间多次立即请求,C/S通信也是有时间间隔  
 | 
    public bool guildChanged = false;  
 | 
    //Type:0-无;1-成员加入;2-成员退出;3-收人设置修改;4-公告修改;5-徽章修改;6-盟主变更;7-成员职位变更;8-成员上线;9-成员离线;  
 | 
    //公会数据变化,请求新的公会信息,如在打开公会列表时请求,其他功能根据自身情况请求  
 | 
    public void UpdateGuildDataChangeMark(HA521_tagMCFamilyChange netPack)  
 | 
    {  
 | 
        guildChanged = true;  
 | 
        if (Time.time - lastChangeMarkTime < 0.2f)  
 | 
        {  
 | 
            //小优化 如果有问题也可以去除  
 | 
            return;  
 | 
        }  
 | 
        lastChangeMarkTime = Time.time;  
 | 
        if (UIManager.Instance.IsOpened<GuildHallWin>())  
 | 
        {  
 | 
            RequestGuildData();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public void RequestGuildData()  
 | 
    {  
 | 
        if (guildChanged)  
 | 
        {  
 | 
            guildChanged = false;  
 | 
            var pack = new CA626_tagCMGetFamilyInfo();  
 | 
            GameNetSystem.Instance.SendInfo(pack);  
 | 
  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public void SendKickFairy(uint playerID)  
 | 
    {  
 | 
        var pak = new CA605_tagCMDeleteFamilyMember();  
 | 
        pak.MemberID = playerID;  
 | 
        GameNetSystem.Instance.SendInfo(pak);  
 | 
    }  
 | 
  
 | 
  
 | 
    //获取需要公会职位等级  
 | 
    public int GetNeedGuildJobLV(int guildFuncID)  
 | 
    {  
 | 
        if (guildWorkToLevel.ContainsKey(guildFuncID))  
 | 
        {  
 | 
            return guildWorkToLevel[guildFuncID];  
 | 
        }  
 | 
        return 0;  
 | 
    }  
 | 
  
 | 
  
 | 
    public void SendChangeMemberLV(int playerID, int lv)  
 | 
    {  
 | 
        var pack = new CA625_tagCMChangeFamilyMemLV();  
 | 
        pack.PlayerID = (uint)playerID;  
 | 
        pack.FmLV = (byte)lv;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
    public void KickMember(int playerID)  
 | 
    {  
 | 
        var pack = new CA605_tagCMDeleteFamilyMember();  
 | 
        pack.MemberID = (uint)playerID;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
    public void QuitGuild()  
 | 
    {  
 | 
  
 | 
        ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),  
 | 
        Language.Get("Guild_46"), (bool isOK) =>  
 | 
            {  
 | 
                if (isOK)  
 | 
                {  
 | 
                    if (PlayerDatas.Instance.fairyData.fairy.MemberCount > 1 &&  
 | 
                    PlayerDatas.Instance.fairyData.mine.FmLV == 3)  
 | 
                    {  
 | 
                        SysNotifyMgr.Instance.ShowTip("GuildSys15");  
 | 
                        return;  
 | 
                    }  
 | 
                    var pack = new CA603_tagCMLeaveFamily();  
 | 
                    GameNetSystem.Instance.SendInfo(pack);  
 | 
                }  
 | 
            });  
 | 
  
 | 
  
 | 
    }  
 | 
  
 | 
    #region 捐赠  
 | 
  
 | 
    public void UpdateDonateInfo(HA502_tagSCDonateCntInfo netPack)  
 | 
    {  
 | 
        donateCntList = netPack.DonateCntList;  
 | 
        DonateCntListEvent?.Invoke();  
 | 
        UpdateDonateRedPoint();  
 | 
    }  
 | 
    #endregion  
 | 
  
 | 
    #region 珍宝阁  
 | 
          
 | 
  
 | 
    public void UpdateZhenbaogeInfo(HA512_tagMCFamilyZhenbaogeInfo netPack)  
 | 
    {  
 | 
        //砍价状态:仙盟里记录已砍价才是真的已砍价状态,封包中的砍价状态用于判断cd间隔使用  
 | 
        needCheckCutCD = netPack.CutState == 1;  
 | 
        zhenbaogeBuyState = netPack.BuyState;  
 | 
        UpdateZhenbaogeEvent?.Invoke();  
 | 
        UpdateZBGRedpoint();  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    //登录后首次打开查询,换新仙盟查询  
 | 
    public void QueryZBGFamilyInfo()  
 | 
    {  
 | 
        if (isQueryZBGYet)  
 | 
            return;  
 | 
  
 | 
        QueryFamilyAction((int)PlayerDatas.Instance.baseData.FamilyId, ZBGFamilyActionType);  
 | 
  
 | 
        isQueryZBGYet = true;  
 | 
    }  
 | 
  
 | 
  
 | 
  
 | 
    //更新砍价信息  
 | 
    public void UpdateHawkerAction(HA513_tagMCFamilyActionInfo vNetData)  
 | 
    {  
 | 
        if (vNetData.ActionType != ZBGFamilyActionType)  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
        bool restart = false;  
 | 
        if (vNetData.FamilyActionList.Length == 1 && vNetData.FamilyActionList[0].Value1 == 1)  
 | 
        {  
 | 
            if (familyZBGActions.ContainsKey(1) && familyZBGActions[1].Time != vNetData.FamilyActionList[0].Time)  
 | 
            {  
 | 
                familyZBGActions.Clear();  
 | 
                sortPlayerCut.Clear();  
 | 
                restart = true;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        for (int i = 0; i < vNetData.FamilyActionList.Length; i++)  
 | 
        {  
 | 
            int playerID = (int)vNetData.FamilyActionList[i].Value1;  
 | 
            familyZBGActions[playerID] = vNetData.FamilyActionList[i];  
 | 
  
 | 
        }  
 | 
  
 | 
        if (familyZBGActions.ContainsKey((int)PlayerDatas.Instance.baseData.PlayerID))  
 | 
        {  
 | 
            //自己是否已砍价 从列表中查找  
 | 
            zhenbaogeCutState = 1;  
 | 
        }  
 | 
        else  
 | 
        {  
 | 
            zhenbaogeCutState = 0;  
 | 
        }  
 | 
  
 | 
  
 | 
        sortPlayerCut = familyZBGActions.Keys.ToList();  
 | 
        if (sortPlayerCut.Contains(1))  
 | 
            sortPlayerCut.Remove(1);  
 | 
        sortPlayerCut.Sort((a, b) => { return familyZBGActions[a].Time.CompareTo(familyZBGActions[b].Time); });  
 | 
  
 | 
        UpdateFamilyActionEvent?.Invoke(restart);  
 | 
        UpdateZBGRedpoint();  
 | 
    }  
 | 
  
 | 
    //砍价人数  
 | 
    public int GetZBGFamilyActionCount()  
 | 
    {  
 | 
        return Math.Max(0, familyZBGActions.Count - 1);  
 | 
    }  
 | 
  
 | 
    public int GetTalkState()  
 | 
    {  
 | 
        int cnt = GetZBGFamilyActionCount();  
 | 
        for (int i = 0; i < cutCntListForTalk.Count; i++)  
 | 
        {  
 | 
            if (cnt < cutCntListForTalk[i])  
 | 
            {  
 | 
                return i;  
 | 
            }  
 | 
        }  
 | 
        return 0;  
 | 
    }  
 | 
  
 | 
    public int[][] GetZBGItems()  
 | 
    {  
 | 
        if (!familyZBGActions.ContainsKey(1))  
 | 
            return null;  
 | 
  
 | 
        return JsonMapper.ToObject<int[][]>(familyZBGActions[1].UseData);  
 | 
    }  
 | 
  
 | 
    public void OnZhenbaogeOP(byte type)  
 | 
    {  
 | 
        var pack = new CA616_tagCMZhenbaogeOP();  
 | 
        pack.OpType = type;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
  
 | 
    public Dictionary <int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>();  
 | 
  
 | 
    //未议价成员  
 | 
    public void CalcNoCutMembers()  
 | 
    {  
 | 
        tmpNoCutMembers.Clear();  
 | 
        var fairy = PlayerDatas.Instance.fairyData;  
 | 
        if (fairy == null)  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        foreach(var playerID in fairy.memberIDList)  
 | 
        {  
 | 
            if (!familyZBGActions.ContainsKey(playerID))  
 | 
            {  
 | 
                tmpNoCutMembers[playerID] = fairy.GetMember(playerID);  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    #endregion  
 | 
  
 | 
  
 | 
    #region 红点  
 | 
      
 | 
    Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.guildHallRedpointID * 10);  
 | 
    //珍宝阁(行商)  
 | 
    Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.MainGuildRedpoint * 100 + 1);  
 | 
  
 | 
    void UpdateDonateRedPoint()  
 | 
    {  
 | 
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Guild))  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
        donateRedpoint.state = RedPointState.None;  
 | 
        if (PlayerDatas.Instance.fairyData.fairy == null)  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        //只有第一档的才需要红点  
 | 
        var config = FamilyDonateConfig.Get(1);  
 | 
        if (donateCntList == null)  
 | 
        {  
 | 
            if (UIHelper.CheckMoneyCount(config.MoneyType, config.MoneyValue))  
 | 
                donateRedpoint.state = RedPointState.Simple;  
 | 
            return;  
 | 
        }  
 | 
        if (donateCntList != null && donateCntList.Length > 0)  
 | 
        {  
 | 
            if (donateCntList[0] < config.DailyCnt)  
 | 
            {  
 | 
                if (UIHelper.CheckMoneyCount(config.MoneyType, config.MoneyValue))  
 | 
                    donateRedpoint.state = RedPointState.Simple;  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
      
 | 
    public void UpdateZBGRedpoint()  
 | 
    {  
 | 
        zbgRedpoint.state = RedPointState.None;  
 | 
  
 | 
        if (!PlayerDatas.Instance.fairyData.HasFairy)  
 | 
        {  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (zhenbaogeCutState == 0)  
 | 
        {  
 | 
            zbgRedpoint.state = RedPointState.Simple;  
 | 
        }  
 | 
        else if (zhenbaogeBuyState == 0)  
 | 
        {  
 | 
            if (familyZBGActions[1].Value3 > 0)  
 | 
            {  
 | 
                zbgRedpoint.state = RedPointState.Simple;  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    #endregion  
 | 
  
 | 
    #region 加密数字  
 | 
  
 | 
    //1. 将数字补充到10位,不足补0  
 | 
    //2. 将每个位的数字结合索引 映射到映射表中  
 | 
    //3. 将映射后的数字拼接成字符串  
 | 
    //4. 另外一个解密函数,将字符串还原成数字  
 | 
  
 | 
    int[] map = { 5, 2, 9, 1, 8, 3, 7, 0, 6, 4 };  
 | 
    int[] reverseMap;  
 | 
  
 | 
    public string EncryptGuildID(int num)  
 | 
    {  
 | 
        if (num < 0)  
 | 
        {  
 | 
            Debug.LogError("Invalid number: " + num);  
 | 
            return "";  
 | 
        }  
 | 
  
 | 
        string str = num.ToString().PadLeft(10, '0');  
 | 
        StringBuilder result = new StringBuilder();  
 | 
  
 | 
        for (int i = 0; i < str.Length; i++)  
 | 
        {  
 | 
            int digit = int.Parse(str[i].ToString());  
 | 
            int encryptedDigit = map[(digit + i) % 10]; // 结合位置查表  
 | 
            result.Append(encryptedDigit);  
 | 
        }  
 | 
        return "6" + result.ToString();  
 | 
    }  
 | 
  
 | 
    public string DecryptGuildID(string encryptedStr)  
 | 
    {  
 | 
        if (string.IsNullOrEmpty(encryptedStr) || encryptedStr.Length != 11)  
 | 
        {  
 | 
            // Debug.LogError("Invalid encrypted string: " + encryptedStr);  
 | 
            SysNotifyMgr.Instance.ShowTip("GuildSys6");  
 | 
            return "";  
 | 
        }  
 | 
  
 | 
        encryptedStr = encryptedStr.Substring(1);  
 | 
  
 | 
        if (reverseMap.IsNullOrEmpty())  
 | 
        {  
 | 
            reverseMap = new int[10];  
 | 
            reverseMap = GenerateReverseMap(map);  
 | 
        }  
 | 
        StringBuilder originalStr = new StringBuilder();  
 | 
  
 | 
        for (int i = 0; i < encryptedStr.Length; i++)  
 | 
        {  
 | 
            int encryptedDigit = int.Parse(encryptedStr[i].ToString());  
 | 
            int originalDigit = (reverseMap[encryptedDigit] - i + 10) % 10; // 反向查表并调整位置  
 | 
            originalStr.Append(originalDigit);  
 | 
        }  
 | 
        return originalStr.ToString().TrimStart('0'); // 去除前导零  
 | 
    }  
 | 
  
 | 
  
 | 
    int[] GenerateReverseMap(int[] map)  
 | 
    {  
 | 
        for (int i = 0; i < map.Length; i++)  
 | 
        {  
 | 
            reverseMap[map[i]] = i; // 反向映射:map[i] -> i  
 | 
        }  
 | 
        return reverseMap;  
 | 
    }  
 | 
  
 | 
  
 | 
    #endregion  
 | 
  
 | 
}  
 | 
  
 | 
// 权限ID: 1-收人,2-变更职位,3-发布公告,4-踢人  
 | 
public enum GuildFuncType  
 | 
{  
 | 
    Accept = 1,  
 | 
    ChangeJob = 2,  
 | 
    PublishNotice = 3,  
 | 
    Kick = 4,  
 | 
  
 | 
} 
 |