yyl
2026-02-09 5a4e34c8a85737c0fa5b5775122da31155cbaef3
Main/System/Main/AutoFightModel.cs
@@ -1,7 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using LitJson;
using UnityEngine;
@@ -39,6 +37,7 @@
    //自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止
    public bool isPause = false;    //如打BOSS的情况,暂停自动战斗 后续可以补充每X秒检测下是否有异常
    public event Action AutoAttackEvent;
    bool m_IsAutoAttack = false;
    public bool isAutoAttack
    {
@@ -52,6 +51,7 @@
                return;
            m_IsAutoAttack = value;
            Debug.Log("isAutoAttack:" + m_IsAutoAttack);
            AutoAttackEvent?.Invoke();
        }
    }
@@ -81,22 +81,144 @@
        }
    }
    public bool isAutoChangeBetterEquip
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_AutoChangeBetterEquip, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_AutoChangeBetterEquip, value);
        }
    }
    public int startServerTime;  // 开始时的服务器时间戳
    bool m_HasAutoExchanged = false;
    public bool hasAutoExchanged    // 是否已自动交换过
    {
        get
        {
            return m_HasAutoExchanged;
        }
        set
        {
            if (m_HasAutoExchanged == value)
                return;
            m_HasAutoExchanged = value;
            if (!value)
            {
                startServerTime = TimeUtility.AllSeconds;
            }
        }
    }
    bool m_IsAutoExchangeDecomposeOld = false;
    public bool isAutoExchangeDecomposeOld    //是否替换后自动分解原装备
    {
        get
        {
            return m_IsAutoExchangeDecomposeOld;
        }
        set
        {
            if (m_IsAutoExchangeDecomposeOld == value)
                return;
            m_IsAutoExchangeDecomposeOld = value;
            if (value)
            {
                hasAutoExchanged = false;
            }
        }
    }
    //自动挑战首领
    public bool isAutoChallengeBoss
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_ChallengeBoss, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_ChallengeBoss, value);
        }
    }
    //当前战败了x次;-1代表停止继续挑战
    private int m_NowChallengeCount = 0;
    public float lastChallengeTime = 0;
    public int nowChallengeCount
    {
        get { return m_NowChallengeCount; }
        set
        {
            m_NowChallengeCount = value;
            lastChallengeTime = Time.time;
            // Debug.Log($"当前在主线Boss战败了{m_NowChallengeCount}次,上次战败时间是{lastChallengeTime}");
            if (m_NowChallengeCount >= tryChallengeCount)
            {
                m_NowChallengeCount = -1;   //代表停止继续挑战BOSS, 但不是停止战斗
                isAutoChallengeBoss = false; //取消勾选自动挑战boss
            }
        }
    }
    //自动挑战首领,战败x次停止
    public int tryChallengeCount
    {
        get
        {
            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_TryChallengeCount, 0);
            return Math.Min(Math.Max(value, 1), maxTryChallengeCount);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_TryChallengeCount, value);
        }
    }
    //自动完成任务
    public bool isAutoFinishTask
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_AutoFinishTask, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_AutoFinishTask, value);
        }
    }
    public event Action ChangeAutoEvent;
    public int maxSpeed = 3; //最高速度 索引
    public int maxCost; //最高消耗
    public int[] autoCostWithBlessLV; //自动战斗消耗倍数关联祝福等级
    public int speed2UnlockMissionID;
    public int speed3UnlockCTGID;
    public int openAutoChallengeBossCond;//数值1:自动挑战首领解锁的关卡(需过关)
    public int maxTryChallengeCount;//最大战败次数(下拉列表的最大值)解锁月卡有效
    public int maxTryChallengeCD;   //打主线boss战败后,间隔x秒后重试
    public int openAutoFinishCond;//自动完成任务需祝福树X级
    public int autoCloseWinCD;
    public int autoChangeBetterEquipWaitTimeS;//装备对比界面打开x秒后,为玩家替换高战力装备
    public override void Init()
    {
        ParseConfig();
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerInit;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
        EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
        EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
        BlessLVManager.Instance.OnBlessLVUpdateEvent += UpdateRedpint;
        TaskManager.Instance.OnTaskUpdate += OnTaskUpdate;
        InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
    }
@@ -104,7 +226,12 @@
    {
        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
        BlessLVManager.Instance.OnBlessLVUpdateEvent -= UpdateRedpint;
        TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate;
        InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
    }
@@ -113,8 +240,14 @@
        var config = FuncConfigConfig.Get("AutoGuaji");
        autoCostWithBlessLV = JsonMapper.ToObject<int[]>(config.Numerical1);
        speed2UnlockMissionID = int.Parse(config.Numerical2);
        speed3UnlockCTGID = int.Parse(config.Numerical3);
        maxCost = autoCostWithBlessLV.Length;
        autoCloseWinCD = int.Parse(config.Numerical3);
        autoChangeBetterEquipWaitTimeS = int.Parse(config.Numerical5);
        config = FuncConfigConfig.Get("AutoGuaji1");
        openAutoChallengeBossCond = int.Parse(config.Numerical1);
        maxTryChallengeCount = int.Parse(config.Numerical2);
        maxTryChallengeCD = int.Parse(config.Numerical3);
        openAutoFinishCond = int.Parse(config.Numerical4);
    }
@@ -122,7 +255,97 @@
    {
        fightingHeroSkinID = 0;
        heroGuid = "";
        startServerTime = 0;
        hasAutoExchanged = false;
    }
    private void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        nowChallengeCount = 0;
        isAutoExchangeDecomposeOld = true;
    }
    Dictionary<string, int> winWaitCloseDict = new Dictionary<string, int>();
    void OnSecondEvent()
    {
        ProccessCloseWin();
    }
    void ProccessCloseWin()
    {
        if (!isAutoAttack)
            return;
        if (isAutoChallengeBoss)
        {
            if (UIManager.Instance.IsOpened<BattleVictoryWin>())
            {
                if (!winWaitCloseDict.ContainsKey("BattleVictoryWin"))
                {
                    winWaitCloseDict["BattleVictoryWin"] = 0;
                }
                if (winWaitCloseDict["BattleVictoryWin"] == 0)
                {
                    winWaitCloseDict["BattleVictoryWin"] = (int)Time.time;
                }
                else if (Time.time - winWaitCloseDict["BattleVictoryWin"] > AutoFightModel.Instance.autoCloseWinCD)
                {
                    UIManager.Instance.CloseWindow<BattleVictoryWin>();
                    winWaitCloseDict["BattleVictoryWin"] = 0;
                }
            }
            if (UIManager.Instance.IsOpened<BattleFailWin>())
            {
                if (!winWaitCloseDict.ContainsKey("BattleFailWin"))
                {
                    winWaitCloseDict["BattleFailWin"] = 0;
                }
                if (winWaitCloseDict["BattleFailWin"] == 0)
                {
                    winWaitCloseDict["BattleFailWin"] = (int)Time.time;
                }
                else if (Time.time - winWaitCloseDict["BattleFailWin"] > autoCloseWinCD)
                {
                    UIManager.Instance.CloseWindow<BattleFailWin>();
                    winWaitCloseDict["BattleFailWin"] = 0;
                }
            }
        }
        if (isAutoFinishTask)
        {
            if (TaskManager.Instance.GetMainTaskState() == 2 && UIManager.Instance.IsOpened<HomeWin>()
            && !UIManager.Instance.ExistAnyFullScreenOrMaskWin("") && !NewBieCenter.Instance.inGuiding)
            {
                //领取任务奖励
                CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward();
                getReward.RewardType = 66;
                getReward.DataEx = (uint)TaskManager.Instance.mainTask.TaskID;
                GameNetSystem.Instance.SendInfo(getReward);
                return;
            }
            if (UIManager.Instance.IsOpened<CommonGetItemWin>() && ItemLogicUtility.Instance.getItemEventName == "Task")
            {
                if (!winWaitCloseDict.ContainsKey("CommonGetItemWin"))
                {
                    winWaitCloseDict["CommonGetItemWin"] = 0;
                }
                if (winWaitCloseDict["CommonGetItemWin"] == 0)
                {
                    winWaitCloseDict["CommonGetItemWin"] = (int)Time.time;
                }
                else if (Time.time - winWaitCloseDict["CommonGetItemWin"] > autoCloseWinCD)
                {
                    UIManager.Instance.CloseWindow<CommonGetItemWin>();
                    winWaitCloseDict["CommonGetItemWin"] = 0;
                }
            }
        }
    }
    public void SaveAutoFightSetting()
    {
@@ -157,7 +380,7 @@
        long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item);
        if (showFightPower < 0)
        if (showFightPower <= 0)
        {
            EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
            return true;
@@ -173,6 +396,7 @@
        }
    }
    #region 主线战斗(自动和手动)
@@ -248,7 +472,7 @@
        fightingHeroSkinID = teamHero.SkinID;
        //战斗时没有GUID ,通过heroid查找
        var hero = TeamManager.Instance.GetTeam(TeamType.Story).GetHeroByHeroID(teamHero.heroId);
        var hero = TeamManager.Instance.GetTeam(BattlePreSetType.Story).GetHeroByHeroID(teamHero.heroId);
        if (hero != null)
        {
            heroGuid = hero.guid;
@@ -264,5 +488,92 @@
    #endregion
    //新增消耗倍数红点
    Redpoint redpoint1 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 1);
    //新增战斗倍数红点
    Redpoint redpoint2 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 2);
    void UpdateRedpint()
    {
        //提示红点记录到第几个索引,每次解锁新的消耗红点都提示
        var costIndex = LocalSave.GetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID);
        if (costIndex + 1 < autoCostWithBlessLV.Length)
        {
            redpoint1.state = autoCostWithBlessLV[Math.Min(costIndex + 1, autoCostWithBlessLV.Length - 1)] <= BlessLVManager.Instance.m_TreeLV ?
                                RedPointState.Simple : RedPointState.None;
        }
        else
        {
            redpoint1.state = RedPointState.None;
        }
        var speedIndex = LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID);
        redpoint2.state = RedPointState.None;
        if (speedIndex == 0 && TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID &&
            !InvestModel.Instance.IsActiveFightSpeed(3))
        {
            redpoint2.state = RedPointState.Simple;
        }
        else if (speedIndex < 2 && InvestModel.Instance.IsActiveFightSpeed(3))
        {
            redpoint2.state = RedPointState.Simple;
        }
    }
    public void ClickCostRed()
    {
        int index = 0;
        for (int i = 0; i < autoCostWithBlessLV.Length; i++)
        {
            if (autoCostWithBlessLV[i] <= BlessLVManager.Instance.m_TreeLV)
            {
                index = i;
            }
            else
            {
                break;
            }
        }
        LocalSave.SetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID, index);
        UpdateRedpint();
    }
    public void ClickSpeedRed()
    {
        int index = 0;
        if (!InvestModel.Instance.IsActiveFightSpeed(3))
        {
            if (TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID)
            {
                index = 1;
            }
        }
        else
        {
            index = 2;
        }
        LocalSave.SetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID, index);
        UpdateRedpint();
    }
    void OnTaskUpdate()
    {
        //任务刷新比较频繁
        if (TaskManager.Instance.mainTask.TaskID < speed2UnlockMissionID)
        {
            return;
        }
        if (LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID) > 0)
            return;
        if (redpoint2.state == RedPointState.Simple)
            return;
        UpdateRedpint();
    }
    void OnInvestUpdate(int type)
    {
        if (type > 2)
            return;
        UpdateRedpint();
    }
}