hch
2026-03-20 c8aea6cbef51b3dd41b4d911bc7e6bf89a6e2e2d
Main/System/Main/AutoFightModel.cs
@@ -26,18 +26,22 @@
    {
        get
        {
            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Cost, 0);
            return Math.Min(Math.Max(value, 1), maxCost);
            string value = QuickSetting.Instance.GetQuickSetting(QuickSettingType.AutoFight_Cost, 0);
            // value 是16进制转数字
            int result = Convert.ToInt32(string.IsNullOrEmpty(value) ? "1" : value, 16);  // 16进制转int
            return Math.Min(Math.Max(result, 1), maxCost);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value);
            //数字value 转16进制
            string hexValue = Convert.ToString(value, 16);
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, hexValue, 0);
        }
    }
    //自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止
    public bool isPause = false;    //如打BOSS的情况,暂停自动战斗 后续可以补充每X秒检测下是否有异常
    public event Action AutoAttackEvent;
    bool m_IsAutoAttack = false;
    public bool isAutoAttack
    {
@@ -51,6 +55,7 @@
                return;
            m_IsAutoAttack = value;
            Debug.Log("isAutoAttack:" + m_IsAutoAttack);
            AutoAttackEvent?.Invoke();
        }
    }
@@ -80,6 +85,57 @@
        }
    }
    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
    {
@@ -102,14 +158,16 @@
        set
        {
            m_NowChallengeCount = value;
            lastChallengeTime = value == 0 ? 0 : Time.time;
            Debug.Log($"当前在主线Boss战败了{m_NowChallengeCount}次,上次战败时间是{lastChallengeTime}");
            lastChallengeTime = Time.time;
            // Debug.Log($"当前在主线Boss战败了{m_NowChallengeCount}次,上次战败时间是{lastChallengeTime}");
            if (m_NowChallengeCount >= tryChallengeCount)
            {
                m_NowChallengeCount = -1;   //代表停止继续挑战
                m_NowChallengeCount = -1;   //代表停止继续挑战BOSS, 但不是停止战斗
                isAutoChallengeBoss = false; //取消勾选自动挑战boss
            }
        }
    }
    //自动挑战首领,战败x次停止
    public int tryChallengeCount
@@ -117,7 +175,7 @@
        get
        {
            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_TryChallengeCount, 0);
            return Math.Min(Math.Max(value, 1), maxCost);
            return Math.Min(Math.Max(value, 1), maxTryChallengeCount);
        }
        set
        {
@@ -139,6 +197,9 @@
    }
    public event Action ChangeAutoEvent;
    public int maxSpeed = 3; //最高速度 索引
    public int maxCost; //最高消耗
    public int[] autoCostWithBlessLV; //自动战斗消耗倍数关联祝福等级
@@ -149,6 +210,7 @@
    public int maxTryChallengeCD;   //打主线boss战败后,间隔x秒后重试
    public int openAutoFinishCond;//自动完成任务需祝福树X级
    public int autoCloseWinCD;
    public int autoChangeBetterEquipWaitTimeS;//装备对比界面打开x秒后,为玩家替换高战力装备
    public override void Init()
    {
@@ -168,7 +230,7 @@
    {
        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
        BlessLVManager.Instance.OnBlessLVUpdateEvent -= UpdateRedpint;
        TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate;
@@ -184,6 +246,7 @@
        speed2UnlockMissionID = int.Parse(config.Numerical2);
        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);
@@ -196,11 +259,14 @@
    {
        fightingHeroSkinID = 0;
        heroGuid = "";
        startServerTime = 0;
        hasAutoExchanged = false;
    }
    private void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        nowChallengeCount = 0;
        isAutoExchangeDecomposeOld = true;
    }
    Dictionary<string, int> winWaitCloseDict = new Dictionary<string, int>();
@@ -208,81 +274,81 @@
    {
        ProccessCloseWin();
    }
   void ProccessCloseWin()
    void ProccessCloseWin()
    {
        if (!isAutoAttack)
            return;
      if (isAutoChallengeBoss)
      {
         if (UIManager.Instance.IsOpened<BattleVictoryWin>())
         {
            if (!winWaitCloseDict.ContainsKey("BattleVictoryWin"))
            {
               winWaitCloseDict["BattleVictoryWin"] = 0;
            }
        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 (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 (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>()
                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;
         }
            {
                //领取任务奖励
                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 (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;
            }
         }
      }
   }
                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()
@@ -318,7 +384,7 @@
        long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item);
        if (showFightPower < 0)
        if (showFightPower <= 0)
        {
            EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
            return true;
@@ -410,7 +476,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;