hch
2026-02-06 2b3fe1175765e0df62caba9dc160c0dbfefb0a8a
Main/System/Guild/GuildManager.cs
@@ -8,8 +8,14 @@
using UnityEngine;
public class GuildManager : GameSystemManager<GuildManager>
public partial class GuildManager : GameSystemManager<GuildManager>
{
    // 家族自定义记录类型
    public const int MemberChangeActionType = 12;      //公会变更记录
    public const int FamilyActionsType = 15;     // 公会记录徽章类型15
    public const int ZBGFamilyActionType = 16;  // 珍宝阁记录类型
    public const int GuildBossActionType = 18;  //讨伐
    // 申请的公会列表
    private List<int> m_FairyRequesteds = new List<int>();
    // 公会自定义记录附加数据,按类型存储
@@ -32,27 +38,43 @@
    public byte[] donateCntList;
    public event Action DonateCntListEvent;
    public event Action<bool> EnterOrQuitGuildEvent;   //进入或退出公会事件
    public event Action<bool> EnterOrQuitGuildEvent;   //true进入或false退出公会事件
    public override void Init()
    {
        ParseConfig();
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEx;
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
        TimeMgr.Instance.OnHourEvent += UpdateZBGRedpoint;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEx;
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
        TimeMgr.Instance.OnHourEvent -= UpdateZBGRedpoint;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
    }
    private void OnRefreshFairyInfo()
    {
        UpdateRequestRedpoint();
    }
    void OnBeforePlayerDataInitialize()
    {
        ClearGuildData();
        donateCntList = null;
    }
    void OnBeforePlayerDataInitializeEx()
    {
        isQueryZBGYet = false;
    }
    void OnPlayerLoginOk()
@@ -60,10 +82,10 @@
        UpdateDonateRedPoint();
        QueryZBGFamilyInfo();
    }
    void PlayerDataRefreshEvent(PlayerDataType type)
    {
        if(type == PlayerDataType.default33)
        if (type == PlayerDataType.default33)
        {
            UpdateDonateRedPoint();
        }
@@ -71,13 +93,18 @@
    void ClearGuildData()
    {
        PlayerDatas.Instance.baseData.FamilyId = 0;
        m_FairyRequesteds.Clear();
        familyActions.Clear();
        guildChanged = false;
        applyList.Clear();
        PlayerDatas.Instance.fairyData.ClearData();
        isQueryZBGYet = false;
        zhenbaogeCutState = 0;
        familyZBGActions.Clear();
        sortPlayerCut.Clear();
    }
    //退出公会
    public void AfterQuitGuild()
    {
@@ -87,23 +114,24 @@
        UIManager.Instance.GetUI<MainWin>()?.ClickFunc(0);
        isQueryZBGYet = false;
        zhenbaogeCutState = 0;
        familyZBGActions.Clear();
        sortPlayerCut.Clear();
        // 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);
    }
@@ -137,7 +165,7 @@
    public int renameFairyNameMoneyType;
    //珍宝阁(行商)
    public int zhenbaogeCutState = 0;
@@ -146,7 +174,7 @@
    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>();
@@ -155,7 +183,7 @@
    public int zbgOrgPriceValue;
    public int zbgChangFamilyCD;
    public List<int> cutCntListForTalk = new List<int>();
    public int familyRecordMaxCount;
    void ParseConfig()
    {
@@ -194,6 +222,14 @@
        zbgOrgPriceValue = int.Parse(config.Numerical2);
        zbgChangFamilyCD = int.Parse(config.Numerical3);
        cutCntListForTalk = JsonMapper.ToObject<List<int>>(config.Numerical4);
        config = FuncConfigConfig.Get("FamilyNote");
        familyRecordMaxCount = int.Parse(config.Numerical1);
        config = FuncConfigConfig.Get("FamilyBillboardSet");
        pageCnt = int.Parse(config.Numerical1);
        queryPointNum = int.Parse(config.Numerical2);
    }
@@ -384,7 +420,6 @@
    #region 仙盟商店开启
    public int fairyStoreLimit = 0;
    public bool fairyStoreOpen
@@ -422,13 +457,36 @@
    #region  公会自定义记录
    public void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package)
    {
        if (PlayerDatas.Instance.fairyData == null ||
            PlayerDatas.Instance.fairyData.fairy == null ||
            PlayerDatas.Instance.fairyData.fairy.FamilyID != _package.FamilyID)
        if (PlayerDatas.Instance.baseData.FamilyId != _package.FamilyID)
        {
            return;
        }
        // 行商 砍价
        if (UpdateHawkerAction(_package))
        {
            return;
        }
        // 徽章
        if (GuildEmblemModel.Instance.UpdateEmblemAction(_package))
        {
            return;
        }
        // 公会讨伐
        if (GuildBossManager.Instance.UpdateGuildBossInfo(_package))
        {
            return;
        }
        //上面各个功能要return
        UpdataCommonAction(_package);
    }
    // 通用记录 只适用单条数据的记录情况 或有服务端保证列表全部信息直接覆盖,其他功能比较复杂各自负责存储
    void UpdataCommonAction(HA513_tagMCFamilyActionInfo _package)
    {
        if (!familyActions.ContainsKey((int)_package.FamilyID))
        {
            familyActions.Add((int)_package.FamilyID, new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>());
@@ -436,11 +494,10 @@
        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;
@@ -476,10 +533,70 @@
    // 查找的公会ID:公会数据
    public Dictionary<int, FairyData> guildsDict = new Dictionary<int, FairyData>();
    public int myFairyRank;
    // 按查询页存储
    public List<int> pageIndexList = new List<int>();  //正常是按页查询,顺序添加即可
    public int curPageIndex;
    public int totalPageCount;
    public int lastPage = -1;
    public int pageCnt; //每页查询条数
    int queryPointNum;  //查询点
    public bool isPowerSort
    {
        get
        {
            return LocalSave.GetBool($"GuildApplyList_IsPowerSort_{PlayerDatas.Instance.PlayerId}");
        }
        set
        {
            LocalSave.SetBool($"GuildApplyList_IsPowerSort_{PlayerDatas.Instance.PlayerId}", value);
        }
    }
    public FairyData GetFairyDataByRank(int rank)
    {
        if (rank < 1)
            return null;
        int index = rank - 1;
        FairyData fairyData = GetFairyDataByIndex(index);
        return fairyData;
    }
    public FairyData GetFairyDataByIndex(int index)
    {
        if (pageIndexList.IsNullOrEmpty() || index < 0 || index >= pageIndexList.Count)
            return null;
        int fairyID = pageIndexList[index];
        FairyData fairyData = GetFairyData(fairyID);
        return fairyData;
    }
    public FairyData GetFairyData(int fairyID)
    {
        return guildsDict.TryGetValue(fairyID, out var data) ? data : null;
    }
    public void ResetQueryParam()
    {
        pageCnt = 20;
        lastPage = -1;
        queryPointNum = 12;
    }
    public void ListenRankPage(int index)
    {
        int page = index / pageCnt;
        if (index > page * pageCnt + queryPointNum)
        {
            if (lastPage >= page)
                return;
            lastPage = page;
            SendFindGuild(string.Empty, page + 1, pageCnt);
        }
    }
    //查找公会列表
    public void OnRefreshGuildViewList(HA523_tagMCFamilyViewList vNetData)
@@ -494,7 +611,7 @@
            SetFairyViewData(data, guildInfo);
            pageIndexList.Add((int)guildInfo.FamilyID);
        }
        myFairyRank = (int)vNetData.Rank;   //0-没有公会或没有在榜上;>0-对应排名
        if (OnRefreshFairyList != null)
        {
@@ -527,6 +644,21 @@
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendFindGuildNoDecrypt(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)
    {
@@ -543,7 +675,6 @@
        data.EmblemWord = view.EmblemWord;
        data.totalFightPower = view.FightPowerEx * Constants.ExpPointValue + view.FightPower;
        data.MemberCount = view.MemberCount;
    }
    #endregion
@@ -552,7 +683,7 @@
    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);
    private Redpoint applyRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, 1070201);
    //申请加入的玩家信息
    public void OnRefreshRequestJoinPlayerInfo(HA522_tagMCFamilyReqJoinInfo vNetData)
@@ -581,6 +712,9 @@
        }
        UpdateRequestRedpoint();
    }
    void UpdateRequestRedpoint()
    {
@@ -636,6 +770,12 @@
                    SysNotifyMgr.Instance.ShowTip("jiazu_lhs_202580");
                    return;
                }
                if (guildsDict[id].JoinLVMin > PlayerDatas.Instance.baseData.realmLevel && RealmConfig.HasKey(guildsDict[id].JoinLVMin))
                {
                    SysNotifyMgr.Instance.ShowTip("GuildApply01", RealmConfig.Get(guildsDict[id].JoinLVMin).Name);
                    return;
                }
            }
        }
@@ -663,39 +803,64 @@
        return 0;
    }
    public void SendJoinFamilyReply(int tagPlayerID, bool isOK)
    {
        CA621_tagCMJoinFamilyReply pack = new CA621_tagCMJoinFamilyReply();
        pack.TagPlayerID = (uint)tagPlayerID;
        pack.IsOK = (byte)(isOK ? 1 : 0);
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendChangeFamilyJoin(int joinReview, int joinLVMin)
    {
        CA622_tagCMChangeFamilyJoin pack = new CA622_tagCMChangeFamilyJoin();
        pack.JoinReview = (byte)joinReview;
        pack.JoinLVMin = (ushort)joinLVMin;
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendRequestJoinFamilyByPlayer(int tagPlayerID)
    {
        CA601_tagCMRequestJoinFamilyByPlayer pack = new CA601_tagCMRequestJoinFamilyByPlayer();
        pack.TagPlayerID = (uint)tagPlayerID;
        GameNetSystem.Instance.SendInfo(pack);
    }
    List<string> optionStrings = null;
    List<int> options = null;
    public bool TryGetApplyOptions(out List<int> optionKeys, out List<string> optionValues)
    {
        optionKeys = null;
        optionValues = null;
        if (options == null)
        {
            options = new List<int>();
            options = new List<int>(RealmConfig.GetKeys());
            options.Sort();
            options.Remove(0);
        }
        if (optionStrings == null)
        {
            optionStrings = new List<string>();
            foreach (int lv in options)
            {
                if (!RealmConfig.HasKey(lv))
                    continue;
                RealmConfig realmConfig = RealmConfig.Get(lv);
                optionStrings.Add(UIHelper.AppendColor(OfficialRankManager.Instance.GetOfficialRankColor(realmConfig.Quality), realmConfig.Name));
            }
        }
        if (options.IsNullOrEmpty() || optionStrings.IsNullOrEmpty() || options.Count != optionStrings.Count)
            return false;
        optionKeys = options;
        optionValues = optionStrings;
        return true;
    }
    #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)
    {
@@ -764,7 +929,7 @@
    #endregion
    #region 珍宝阁
    public void UpdateZhenbaogeInfo(HA512_tagMCFamilyZhenbaogeInfo netPack)
    {
@@ -781,10 +946,15 @@
    //登录后首次打开查询,换新仙盟查询
    public void QueryZBGFamilyInfo()
    {
        if (PlayerDatas.Instance.baseData.FamilyId == 0)
        {
            return;
        }
        if (isQueryZBGYet)
            return;
        QueryFamilyAction((int)PlayerDatas.Instance.baseData.FamilyId, 16);
        QueryFamilyAction((int)PlayerDatas.Instance.baseData.FamilyId, ZBGFamilyActionType);
        isQueryZBGYet = true;
    }
@@ -792,15 +962,21 @@
    //更新砍价信息
    public void UpdateHawkerAction(HA513_tagMCFamilyActionInfo vNetData)
    public bool UpdateHawkerAction(HA513_tagMCFamilyActionInfo vNetData)
    {
        if (vNetData.ActionType != ZBGFamilyActionType)
        {
            return;
            return false;
        }
        bool restart = false;
        if (vNetData.FamilyActionList.Length == 1 && vNetData.FamilyActionList[0].Value1 == 1)
        for (int i = 0; i < vNetData.FamilyActionList.Length; i++)
        {
            int playerID = (int)vNetData.FamilyActionList[i].Value1;
            if (playerID != 1)
            {
                continue;
            }
            if (familyZBGActions.ContainsKey(1) && familyZBGActions[1].Time != vNetData.FamilyActionList[0].Time)
            {
                familyZBGActions.Clear();
@@ -808,6 +984,7 @@
                restart = true;
            }
        }
        for (int i = 0; i < vNetData.FamilyActionList.Length; i++)
        {
@@ -834,6 +1011,8 @@
        UpdateFamilyActionEvent?.Invoke(restart);
        UpdateZBGRedpoint();
        return true;
    }
    //砍价人数
@@ -871,7 +1050,7 @@
    }
    public Dictionary <int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>();
    public Dictionary<int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>();
    //未议价成员
    public void CalcNoCutMembers()
@@ -883,7 +1062,7 @@
            return;
        }
        foreach(var playerID in fairy.memberIDList)
        foreach (var playerID in fairy.memberIDList)
        {
            if (!familyZBGActions.ContainsKey(playerID))
            {
@@ -894,12 +1073,11 @@
    #endregion
    #region 红点
    Redpoint hallRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.guildHallRedpointID);
    Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.guildHallRedpointID * 10);
    Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.donateRedpointID);
    //珍宝阁(行商)
    Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.MainGuildRedpoint * 100 + 1);
    Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.hawkerRedpointID);
    void UpdateDonateRedPoint()
    {
@@ -930,7 +1108,7 @@
            }
        }
    }
    public void UpdateZBGRedpoint()
    {
        zbgRedpoint.state = RedPointState.None;
@@ -939,6 +1117,8 @@
        {
            return;
        }
        if (TimeUtility.ServerNow.Hour < 10)
            return;
        if (zhenbaogeCutState == 0)
        {