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 { // 申请的公会列表 private List m_FairyRequesteds = new List(); // 公会自定义记录附加数据,按类型存储 // 公会ID, 类型ID, 数据 public Dictionary> familyActions = new Dictionary>(); public event Action 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 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()?.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 guildWorkToLevel = new Dictionary(); //退出惩罚 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 familyZBGActions = new Dictionary(); public List sortPlayerCut = new List(); public event Action UpdateFamilyActionEvent; public int zbgPriceType; public int zbgOrgPriceValue; public int zbgChangFamilyCD; public List cutCntListForTalk = new List(); 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(config.Numerical1); beQuitGuildPunishTime = JsonMapper.ToObject(config.Numerical2); quitGuildPunishMoneyType = int.Parse(config.Numerical3); quitGuildPunishMoney = JsonMapper.ToObject(config.Numerical4); beQuitGuildPunishMoney = JsonMapper.ToObject(config.Numerical5); config = FuncConfigConfig.Get("FamilyRename"); renameFairyNameCD = int.Parse(config.Numerical2); var arr = ConfigParse.GetMultipleStr(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>(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()); } 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 guildsDict = new Dictionary(); // 按查询页存储 public List pageIndexList = new List(); //正常是按页查询,顺序添加即可 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 applyList = new List(); 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 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()) { 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(familyZBGActions[1].UseData); } public void OnZhenbaogeOP(byte type) { var pack = new CA616_tagCMZhenbaogeOP(); pack.OpType = type; GameNetSystem.Instance.SendInfo(pack); } public Dictionary tmpNoCutMembers = new Dictionary(); //未议价成员 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.donateRedpointID); //珍宝阁(行商) Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.hawkerRedpointID); 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, }