| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
| 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);  | 
|   | 
|         UpdateDonateRedPoint();  | 
|         EnterOrQuitGuildEvent?.Invoke(false);  | 
|     }  | 
|   | 
|     public async UniTask AfterEnterGuild()  | 
|     {  | 
|         //这里还没有公会数据, 后续的包会更新公会数据  | 
|         await UniTask.Delay(100);  | 
|         UpdateDonateRedPoint();  | 
|         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;  | 
|   | 
|     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];  | 
|   | 
|     }  | 
|   | 
|   | 
|     #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 (!familyActions.ContainsKey((int)_package.FamilyID))  | 
|         {  | 
|             familyActions.Add((int)_package.FamilyID, new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>());  | 
|         }  | 
|   | 
|         familyActions[(int)_package.FamilyID][_package.ActionType] = _package.FamilyActionList;  | 
|         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 = (ushort)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 红点  | 
|     Redpoint hallRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.guildHallRedpointID);  | 
|     Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.MainGuildRedpoint * 100);  | 
|   | 
|     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;  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|     #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,  | 
|   | 
| } |