lcy
2026-07-16 34179ffa10e510ba71522cb2bd1fd978b7fcbbe1
Main/System/GuildAtkDefBat/GuildAtkDefBatManager.cs
@@ -49,6 +49,8 @@
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnReconnect += OnBeforePlayerDataInitializeEventOnReconnect;
        GuildManager.Instance.EnterOrQuitGuildEvent += OnEnterOrQuitGuildEvent;
        StoreModel.Instance.RefreshBuyShopLimitEvent += OnRefreshShopLimit;
        ParseConfig();
    }
@@ -56,7 +58,20 @@
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnReconnect -= OnBeforePlayerDataInitializeEventOnReconnect;
        GuildManager.Instance.EnterOrQuitGuildEvent -= OnEnterOrQuitGuildEvent;
        StoreModel.Instance.RefreshBuyShopLimitEvent -= OnRefreshShopLimit;
    }
    private void OnBeforePlayerDataInitializeEventOnReconnect()
    {
        atkDefBatLogs.Clear();
    }
    private void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        hasClosedMainGuildAtkDefBatTip = false;
        ResetBattleData();
    }
    private void OnRefreshShopLimit()
@@ -64,9 +79,15 @@
        UpdateRedpoint();
    }
    private void OnBeforePlayerDataInitializeEventOnRelogin()
    private void OnEnterOrQuitGuildEvent(bool isEnter)
    {
        ResetBattleData();
        if (!isEnter)
        {
            ResetBattleData();
            CurrentChallengeTargetPlayerID = 0;
            OnUpdateAtkDefBatInfoEvent?.Invoke();
            UpdateRedpoint();
        }
    }
    void ParseConfig()
@@ -209,7 +230,6 @@
        targetInfo.ServerID = sourceData.ServerID;
        targetInfo.EmblemID = sourceData.EmblemID;
        targetInfo.EmblemWord = UIHelper.ServerStringTrim(sourceData.EmblemWord);
        targetInfo.IsDismiss = sourceData.IsDismiss;
        targetInfo.TotalStar = sourceData.TotalStar;
        targetInfo.OverState = sourceData.OverState;
        targetInfo.BatMemCount = sourceData.BatMemCount;
@@ -377,6 +397,22 @@
        return MyFamilyMembers.ContainsKey(PlayerDatas.Instance.PlayerId);
    }
    private bool hasClosedMainGuildAtkDefBatTip;
    public bool ShouldShowMainGuildAtkDefBatTip()
    {
        if (hasClosedMainGuildAtkDefBatTip)
            return false;
        if (!IsOpen())
            return false;
        return BatState == 3 && HasFamilyJoinEligibility() && HasMyJoinEligibility();
    }
    public void ClearMainGuildAtkDefBatTip()
    {
        hasClosedMainGuildAtkDefBatTip = true;
    }
    /// <summary>
    /// 获取攻防战的当前显示状态标识
    /// </summary>
@@ -393,8 +429,8 @@
        if (BatState == 1 && MyFamilyInfo != null)
        {
            int overState = MyFamilyInfo.OverState;
            if (overState == 1 || overState == 3) return 4;
            if (overState == 2 || overState == 4) return 5;
            if (overState == 1) return 4;
            if (overState == 2) return 5;
        }
        return 1;
@@ -415,7 +451,7 @@
    /// <summary>
    /// 获取己方公会排序后的参战成员列表
    /// 排序规则:Star降序 → BatCnt升序 → PlayerID升序
    /// 过滤未战斗成员,排序规则:Star降序 → BatCnt升序 → PlayerID升序
    /// </summary>
    public List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem> GetSortedFamilyMembers()
    {
@@ -423,7 +459,7 @@
        if (members == null || members.Count <= 0)
            return new List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem>();
        var list = members.Values.ToList();
        var list = members.Values.Where(member => member.BatCnt > 0).ToList();
        list.Sort((a, b) =>
        {
            if (b.Star != a.Star)
@@ -733,18 +769,60 @@
    }
    /// <summary>
    /// 获取当前我的功能累计活跃度
    /// 统计从当天开始往前 prepareDayBefore 天的累计活跃贡献之和
    /// 获取界面展示用的公会攻防战活跃值。
    /// 口径:显示下一次备战名单生成所使用的 prepareDayBefore 天窗口。
    /// 后端会在进入备战期 0 点判定参战条件,统计备战日前 prepareDayBefore 天。
    /// 前端按 cycleConfig[1] 找下一次备战日,再倒推 prepareDayBefore 天;窗口中尚未发生的未来日期按 0 处理,
    /// 避免 activityData 只有星期 key 时误读到上一轮同星期的旧活跃。
    /// </summary>
    public long GetMyActivityLevel()
    {
        int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID());
        int daysUntilPrepare = GetDaysUntilNextPrepareStart();
        return GetActivityLevelBeforePrepare(daysUntilPrepare);
    }
        long total = 0;
        for (int i = 0; i < prepareDayBefore; i++)
    /// <summary>
    /// 获取距离下一次备战期开始还有几天。
    /// 只从 cycleConfig[1] 读取备战期配置,支持策划自由配置备战星期。
    /// 如果今天就是备战日,也取下一次备战日,避免把已进入备战期后的活跃算入当前名单口径。
    /// </summary>
    private int GetDaysUntilNextPrepareStart()
    {
        int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID());
        int[] prepareWeekdays = cycleConfig != null && cycleConfig.Length > 1 ? cycleConfig[1] : null;
        if (prepareWeekdays.IsNullOrEmpty())
            return 1;
        int minDaysUntilPrepare = 7;
        foreach (int prepareWeekday in prepareWeekdays)
        {
            // (currentWeekday - i) 转成 1-7 范围
            int targetWeekday = ((currentWeekday - i - 1 + 7) % 7) + 1;
            int daysUntilPrepare = prepareWeekday > currentWeekday
                ? prepareWeekday - currentWeekday
                : prepareWeekday + 7 - currentWeekday;
            if (daysUntilPrepare < minDaysUntilPrepare)
                minDaysUntilPrepare = daysUntilPrepare;
        }
        return minDaysUntilPrepare;
    }
    /// <summary>
    /// 统计下一次备战日前 prepareDayBefore 天的活跃值。
    /// offsetFromPrepare 表示目标日期距离备战开始还有几天:1=备战前一天,prepareDayBefore=窗口最早一天。
    /// dayOffsetFromToday 大于 0 表示目标日期在今天之后,未来活跃按 0,不读取 activityData。
    /// </summary>
    private long GetActivityLevelBeforePrepare(int daysUntilPrepare)
    {
        long total = 0;
        int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID());
        for (int offsetFromPrepare = prepareDayBefore; offsetFromPrepare >= 1; offsetFromPrepare--)
        {
            int dayOffsetFromToday = daysUntilPrepare - offsetFromPrepare;
            if (dayOffsetFromToday > 0)
                continue;
            int targetWeekday = ((currentWeekday + dayOffsetFromToday - 1 + 7) % 7) + 1;
            if (activityData.TryGetValue(targetWeekday, out long contribution))
                total += contribution;
@@ -811,8 +889,7 @@
    /// <summary>
    /// 获取我的剩余开启次数
    /// 仅在休战期(BatState==1)可开启
    /// 对手公会未解散: 有参与战斗(BatCnt>0)的玩家可开启1次
    /// 对手公会已解散: 所有参赛成员均可开启1次
    /// 参战且已战斗成员可开启1次
    /// 每人最多1次
    /// </summary>
    public int GetMyOpenRemainCount()
@@ -828,15 +905,15 @@
        if (!MyFamilyMembers.TryGetValue(myPlayerId, out var myMem))
            return 0;
        // 未参与战斗不能开启
        if (myMem.BatCnt <= 0)
            return 0;
        // 已开启过则不能再次开启
        if (myMem.GridNum > 0)
            return 0;
        // 对手公会已解散: 所有参赛成员均可开启
        if (EnemyFamilyInfo != null && EnemyFamilyInfo.IsDismiss == 1)
            return 1;
        // 对手公会未解散: 参战成员均可开启1次(已开启的被 GridNum 过滤)
        // 参战且已战斗成员可开启1次(已开启的被 GridNum 过滤)
        return 1;
    }