using System; using System.Collections; using System.Collections.Generic; using System.Text; 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; public override void Init() { ParseConfig(); // PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; } public override void Release() { // PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyMine; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; } public void OnBeforePlayerDataInitialize() { m_FairyRequesteds.Clear(); familyActions.Clear(); } private void OnRefreshFairyMine() { if (!PlayerDatas.Instance.fairyData.HasFairy) { //退出公会 familyActions.Clear(); } } #region 发包 public void SendKickFairy(uint playerID) { var pak = new CA605_tagCMDeleteFamilyMember(); pak.MemberID = playerID; GameNetSystem.Instance.SendInfo(pak); } //申请/撤销 加入公会 public void SendApplyFairy(uint id, int type) { if (FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true)) { return; } if (PlayerDatas.Instance.fairyData.HasFairy) { ServerTipDetails.DisplayNormalTip(Language.Get("HasFairyTip")); return; } CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily(); rqPack.Type = (byte)type; rqPack.TagFamilyID = id; GameNetSystem.Instance.SendInfo(rqPack); } #endregion #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(); void ParseConfig() { 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); } #endregion 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 bool FairyRequested(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; } 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.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); }); } #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 public void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package) { if (!familyActions.ContainsKey((int)_package.FamilyID)) { familyActions.Add((int)_package.FamilyID, new Dictionary()); } 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; } #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(); 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 = view.FamilyID; data.FamilyName = view.FamilyName; data.LeaderID = view.LeaderID; data.LeaderName = view.LeaderName; data.FamilyLV = view.FamilyLV; data.JoinReview = view.JoinReview; data.JoinLVMin = view.JoinLVMin; data.ServerID = view.ServerID; data.EmblemID = 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 = vNetData.ReqJoinList[i].PlayerID; apply.ReqTime = vNetData.ReqJoinList[i].ReqTime; apply.LV = vNetData.ReqJoinList[i].LV; apply.Job = vNetData.ReqJoinList[i].Job; apply.RealmLV = vNetData.ReqJoinList[i].RealmLV; apply.Face = vNetData.ReqJoinList[i].Face; apply.FacePic = vNetData.ReqJoinList[i].FacePic; apply.TitleID = vNetData.ReqJoinList[i].TitleID; apply.FightPower = vNetData.ReqJoinList[i].FightPower + vNetData.ReqJoinList[i].FightPowerEx * Constants.ExpPointValue; apply.ServerID = 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; } #endregion }