diff --git a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs index 408db45c..5c8f1070 100644 --- a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs +++ b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs @@ -20,6 +20,7 @@ using System.Threading; using System.Threading.Tasks; using BetterGenshinImpact.GameTask.AutoFight; using BetterGenshinImpact.GameTask.AutoLeyLineOutcrop; +using BetterGenshinImpact.GameTask.AutoStygianOnslaught; namespace BetterGenshinImpact.Core.Script.Dependence; @@ -357,4 +358,22 @@ public class Dispatcher CancellationToken cancellationToken = customCt ?? CancellationContext.Instance.Cts.Token; await new AutoLeyLineOutcropTask(param).Start(cancellationToken); } + + + /// + /// 运行自动幽境危战任务 + /// + /// 自动幽境危战任务参数 + /// 自定义取消令牌 + /// + public async Task RunAutoStygianOnslaughtTask(AutoStygianOnslaughtParam param, CancellationToken? customCt = null) + { + if (param == null) + { + throw new ArgumentNullException(nameof(param), "自动幽境危战任务参数不能为空"); + } + + CancellationToken cancellationToken = customCt ?? CancellationContext.Instance.Cts.Token; + await new AutoStygianOnslaughtTask(param).Start(cancellationToken); + } } diff --git a/BetterGenshinImpact/Core/Script/EngineExtend.cs b/BetterGenshinImpact/Core/Script/EngineExtend.cs index 982b70e2..176f6737 100644 --- a/BetterGenshinImpact/Core/Script/EngineExtend.cs +++ b/BetterGenshinImpact/Core/Script/EngineExtend.cs @@ -15,6 +15,7 @@ using BetterGenshinImpact.GameTask.AutoFight; using BetterGenshinImpact.GameTask.AutoFight.Model; using BetterGenshinImpact.GameTask.AutoLeyLineOutcrop; using BetterGenshinImpact.GameTask.AutoSkip; +using BetterGenshinImpact.GameTask.AutoStygianOnslaught; namespace BetterGenshinImpact.Core.Script; @@ -75,6 +76,7 @@ public class EngineExtend engine.AddHostType("AutoDomainParam", typeof(AutoDomainParam)); engine.AddHostType("AutoFightParam", typeof(AutoFightParam)); engine.AddHostType("AutoLeyLineOutcropParam", typeof(AutoLeyLineOutcropParam)); + engine.AddHostType("AutoStygianOnslaughtParam", typeof(AutoStygianOnslaughtParam)); //鼠标回调 engine.AddHostType("KeyMouseHook", typeof(KeyMouseHook)); // 添加C#的类型 diff --git a/BetterGenshinImpact/GameTask/AutoDomain/Model/ResinUseRecord.cs b/BetterGenshinImpact/GameTask/AutoDomain/Model/ResinUseRecord.cs index 0edd13b0..b00c489a 100644 --- a/BetterGenshinImpact/GameTask/AutoDomain/Model/ResinUseRecord.cs +++ b/BetterGenshinImpact/GameTask/AutoDomain/Model/ResinUseRecord.cs @@ -62,7 +62,7 @@ public class ResinUseRecord return list; } - public static List BuildFromDomainParam(AutoStygianOnslaughtConfig taskParam) + public static List BuildFromDomainParam(AutoStygianOnslaughtParam taskParam) { List list = []; if (taskParam.SpecifyResinUse) diff --git a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtParam.cs b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtParam.cs new file mode 100644 index 00000000..3c54d42e --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtParam.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.GameTask.Model; + +namespace BetterGenshinImpact.GameTask.AutoStygianOnslaught; + +public class AutoStygianOnslaughtParam:BaseTaskParam +{ + + public int BossNum { get; set; } + // 结束后是否自动分解圣遗物 + public bool AutoArtifactSalvage { get; set; } + + // 指定树脂的使用次数 + public bool SpecifyResinUse{ get; set; } + + // 自定义使用树脂优先级 + public List ResinPriorityList{ get; set; }=["浓缩树脂","原粹树脂"]; + // 使用原粹树脂刷取副本次数 + public int OriginalResinUseCount { get; set; } + + //使用浓缩树脂刷取副本次数 + public int CondensedResinUseCount { get; set; } + + // 使用须臾树脂刷取副本次数 + public int TransientResinUseCount { get; set; } + + // 使用脆弱树脂刷取副本次数 + public int FragileResinUseCount { get; set; } + // 指定战斗队伍 + public string FightTeamName { get; set; } + // 战斗脚本包路径 + public string CombatScriptBagPath { get; set; } + public void SetDefault() + { + var config = TaskContext.Instance().Config.AutoStygianOnslaughtConfig; + SetAutoStygianOnslaughtConfig(config); + } + public void SetAutoStygianOnslaughtConfig(AutoStygianOnslaughtConfig config) + { + BossNum = config.BossNum; + AutoArtifactSalvage = config.AutoArtifactSalvage; + SpecifyResinUse = config.SpecifyResinUse; + ResinPriorityList = config.ResinPriorityList == null ? new List { "浓缩树脂", "原粹树脂" }: new List(config.ResinPriorityList); + OriginalResinUseCount = config.OriginalResinUseCount; + CondensedResinUseCount = config.CondensedResinUseCount; + TransientResinUseCount = config.TransientResinUseCount; + FragileResinUseCount = config.FragileResinUseCount; + FightTeamName = config.FightTeamName; + SetCombatStrategyPath(config.StrategyName); + } + public AutoStygianOnslaughtParam() : base(null, null) + { + SetDefault(); + } + public AutoStygianOnslaughtParam(string combatScriptBagPath) : base(null, null) + { + SetDefault(); + CombatScriptBagPath=combatScriptBagPath; + } + public void SetResinPriorityList(params string[] priorities) + { + ResinPriorityList.Clear(); + ResinPriorityList.AddRange(priorities); + } + + + /// + /// 设置战斗策略路径 + /// + /// 策略名称 + public void SetCombatStrategyPath(string? strategyName = null) + { + if (string.IsNullOrEmpty(strategyName)) + { + strategyName = TaskContext.Instance().Config.AutoFightConfig.StrategyName; + } + + if (string.IsNullOrWhiteSpace(strategyName) ||"根据队伍自动选择".Equals(strategyName)) + { + CombatScriptBagPath= Global.Absolute(@"User\AutoFight\"); + return; + } + + CombatScriptBagPath= Global.Absolute(@"User\AutoFight\" + strategyName + ".txt"); + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs index c740de29..a8d6d1e3 100644 --- a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs +++ b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs @@ -79,12 +79,21 @@ public class AutoStygianOnslaughtTask : StateMachineBase, /// protected override ILogger Logger => TaskControl.Logger; - private readonly AutoStygianOnslaughtConfig _taskParam; + private readonly AutoStygianOnslaughtParam _taskParam; private readonly CombatScriptBag _combatScriptBag; private List _resinPriorityListWhenSpecifyUse; private LowerHeadThenWalkToTask? _lowerHeadThenWalkToTask; + public AutoStygianOnslaughtTask(AutoStygianOnslaughtParam taskParam) + { + AutoFightAssets.DestroyInstance(); + _taskParam = taskParam; + _combatScriptBag = CombatScriptParser.ReadAndParse(taskParam.CombatScriptBagPath); + _resinPriorityListWhenSpecifyUse = ResinUseRecord.BuildFromDomainParam(taskParam); - public AutoStygianOnslaughtTask(AutoStygianOnslaughtConfig taskParam, string path) + // 注册所有状态处理器 + RegisterAllStateHandlers(); + } + public AutoStygianOnslaughtTask(AutoStygianOnslaughtParam taskParam, string path) { AutoFightAssets.DestroyInstance(); _taskParam = taskParam; diff --git a/BetterGenshinImpact/Model/OneDragonTaskItem.cs b/BetterGenshinImpact/Model/OneDragonTaskItem.cs index 2c16502e..0dd568f1 100644 --- a/BetterGenshinImpact/Model/OneDragonTaskItem.cs +++ b/BetterGenshinImpact/Model/OneDragonTaskItem.cs @@ -127,7 +127,9 @@ public partial class OneDragonTaskItem : ObservableObject return; } - await new AutoStygianOnslaughtTask(TaskContext.Instance().Config.AutoStygianOnslaughtConfig, path).Start(CancellationContext.Instance.Cts.Token); + AutoStygianOnslaughtParam param = new AutoStygianOnslaughtParam(); + param.SetAutoStygianOnslaughtConfig(TaskContext.Instance().Config.AutoStygianOnslaughtConfig); + await new AutoStygianOnslaughtTask(param, path).Start(CancellationContext.Instance.Cts.Token); }; break; case "领取每日奖励": diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index d99fe3a8..3c6d2a8a 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -422,8 +422,10 @@ public partial class TaskSettingsPageViewModel : ViewModel } SwitchAutoStygianOnslaughtEnabled = true; + AutoStygianOnslaughtParam param = new AutoStygianOnslaughtParam(); + param.SetAutoStygianOnslaughtConfig(Config.AutoStygianOnslaughtConfig); await new TaskRunner() - .RunSoloTaskAsync(new AutoStygianOnslaughtTask(Config.AutoStygianOnslaughtConfig, path)); + .RunSoloTaskAsync(new AutoStygianOnslaughtTask(param, path)); SwitchAutoStygianOnslaughtEnabled = false; }