using System; using System.Collections.Generic; using LitJson; using UnityEngine; public class AutoFightModel : GameSystemManager { //战斗倍数:值越大越快,影响战斗表现,掉落速度等,这里的倍数是索引,对应配置里的实际速率 public int fightSpeed { get { int value = QuickSetting.Instance.GetQuickSettingValue(QuickSettingType.AutoFight_Speed, 0); return Math.Min(Math.Max(value, 1), maxSpeed); } set { var num = Math.Max(1, value); BattleManager.Instance.storyBattleField.SetSpeedRatio(BattleManager.Instance.speedGear[num - 1]); QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Speed, num); } } //消耗倍数 public int fightCost { get { int value = QuickSetting.Instance.GetQuickSettingValue(QuickSettingType.AutoFight_Cost, 0); return Math.Min(Math.Max(value, 1), maxCost); } set { QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value); } } //自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止 public bool isPause = false; //如打BOSS的情况,暂停自动战斗 后续可以补充每X秒检测下是否有异常 bool m_IsAutoAttack = false; public bool isAutoAttack { get { return m_IsAutoAttack; } set { if (m_IsAutoAttack == value) return; m_IsAutoAttack = value; Debug.Log("isAutoAttack:" + m_IsAutoAttack); } } //是否开启自动战斗设置 public bool isAutoAttackSet { get { return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_Open, 0); } set { QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Open, value); } } //更好装备停止战斗 public bool isStopFightByBetterEquip { get { return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_FightPower, 0); } set { QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_FightPower, value); } } 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 event Action OnAutoChallengeBossEvent; //自动挑战首领 public bool isAutoChallengeBoss { get { return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_ChallengeBoss, 0); } set { QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_ChallengeBoss, value); OnAutoChallengeBossEvent?.Invoke(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(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 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.AddListener(EventName.BATTLE_CAST_SKILL, OnSkillCast); BlessLVManager.Instance.OnBlessLVUpdateEvent += UpdateRedpint; TaskManager.Instance.OnTaskUpdate += OnTaskUpdate; InvestModel.Instance.onInvestUpdate += OnInvestUpdate; GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; } public override void Release() { BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin; EventBroadcast.Instance.RemoveListener(EventName.BATTLE_CAST_SKILL, OnSkillCast); BlessLVManager.Instance.OnBlessLVUpdateEvent -= UpdateRedpint; TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate; InvestModel.Instance.onInvestUpdate -= OnInvestUpdate; GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; } void ParseConfig() { var config = FuncConfigConfig.Get("AutoGuaji"); autoCostWithBlessLV = JsonMapper.ToObject(config.Numerical1); 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); maxTryChallengeCD = int.Parse(config.Numerical3); openAutoFinishCond = int.Parse(config.Numerical4); } void BeforePlayerInit() { fightingHeroSkinID = 0; heroGuid = ""; startServerTime = 0; hasAutoExchanged = false; } private void OnBeforePlayerDataInitializeEventOnRelogin() { nowChallengeCount = 0; isAutoExchangeDecomposeOld = true; } Dictionary winWaitCloseDict = new Dictionary(); void OnSecondEvent() { ProccessCloseWin(); } void ProccessCloseWin() { if (!isAutoAttack) return; if (isAutoChallengeBoss) { if (UIManager.Instance.IsOpened()) { 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(); winWaitCloseDict["BattleVictoryWin"] = 0; } } if (UIManager.Instance.IsOpened()) { 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(); winWaitCloseDict["BattleFailWin"] = 0; } } } if (isAutoFinishTask) { if (TaskManager.Instance.GetMainTaskState() == 2 && UIManager.Instance.IsOpened() && !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() && 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(); winWaitCloseDict["CommonGetItemWin"] = 0; } } } } public void SaveAutoFightSetting() { if (PlayerDatas.Instance.baseData.UseHarmerCount != fightCost) { PlayerDatas.Instance.baseData.UseHarmerCount = fightCost; BattleManager.Instance.MainFightRequest(1, (uint)fightCost); } StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField; if (storyBattleField != null && storyBattleField.GetBattleMode() != BattleMode.Stop) { //战斗中改变模式 isAutoAttack = isAutoAttackSet; storyBattleField.AutoSetBattleMode(); } QuickSetting.Instance.SendPackage(); ChangeAutoEvent?.Invoke(); } //自动处理装备,需要等待穿戴返回false,其他情况返回true public bool TryAutoFightDoEquip(ItemModel item) { if (!isAutoAttack) return false; if (item == null) return true; long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item); if (showFightPower < 0) { EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1); return true; } else { if (isStopFightByBetterEquip) return false; EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1); return true; } } #region 主线战斗(自动和手动) public void StartFight() { if (isAutoAttack) return; StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField; if (storyBattleField == null) { return; } if (!UIHelper.CheckMoneyCount(41, PlayerDatas.Instance.baseData.UseHarmerCount, 2)) { if (storyBattleField.GetBattleMode() != BattleMode.Stop) storyBattleField.HaveRest(); return; } BattleManager.Instance.storyBattleField.SetSpeedRatio(BattleManager.Instance.speedGear[fightSpeed - 1]); isAutoAttack = isAutoAttackSet; //手动会一直进入这个逻辑, 自动触发一次 storyBattleField.AutoSetBattleMode(); storyBattleField.operationAgent.DoNext(); } void OnCreateBattleField(string guid, BattleField battleField) { if (string.IsNullOrEmpty(guid) && BattleManager.Instance.storyBattleField != null) { BattleManager.Instance.storyBattleField.ChangeBattleModeEvent -= ChangeBattleModeEvent; BattleManager.Instance.storyBattleField.ChangeBattleModeEvent += ChangeBattleModeEvent; } } void ChangeBattleModeEvent(BattleMode _battleMode) { if (_battleMode == BattleMode.Stop) { isAutoAttack = false; } OnFightEvent?.Invoke(false); } public int fightingHeroSkinID; //当前战斗的英雄皮肤ID public string heroGuid; //战斗中的武将 public event Action OnFightEvent; //战斗模式变更通知 战斗释放技能通知 /// /// 技能释放 通知UI处理 /// /// 空为主线 /// 用于怒气等显示 /// 战斗中的武将 void OnSkillCast(string guid, SkillConfig skillConfig, TeamHero teamHero) { if (!string.IsNullOrEmpty(guid)) return; //防范回收报错 if (teamHero == null) return; //只通知玩家武将的战斗 if (teamHero.NPCID != 0) return; fightingHeroSkinID = teamHero.SkinID; //战斗时没有GUID ,通过heroid查找 var hero = TeamManager.Instance.GetTeam(BattlePreSetType.Story).GetHeroByHeroID(teamHero.heroId); if (hero != null) { heroGuid = hero.guid; } else { heroGuid = ""; } OnFightEvent?.Invoke(true); } #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(); } }