diff --git a/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs b/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs
index f7f7d1a2..99cea2cd 100644
--- a/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs
+++ b/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs
@@ -7,6 +7,8 @@ using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
+using Microsoft.Extensions.Logging;
+using static BetterGenshinImpact.GameTask.Common.TaskControl;
namespace BetterGenshinImpact.Core.Config;
@@ -38,7 +40,12 @@ public partial class PathingConditionConfig : ObservableObject
continue;
}
- var condition = PartyConditions.FirstOrDefault(c => c.Subject == "动作" && c.Object != null && c.Object.Contains(action));
+ if (!ConditionDefinitions.ActionCnDic.TryGetValue(action, out var actionCn))
+ {
+ continue; // 不校验
+ }
+
+ var condition = PartyConditions.FirstOrDefault(c => c.Subject == "动作" && c.Object.Contains(actionCn));
if (condition is { Result: not null })
{
return condition.Result;
@@ -47,14 +54,14 @@ public partial class PathingConditionConfig : ObservableObject
}
// 采集物匹配队伍名
- var materialCondition = PartyConditions.FirstOrDefault(c => c.Subject == "采集物" && c.Object != null && c.Object.Contains(materialName));
+ var materialCondition = PartyConditions.FirstOrDefault(c => c.Subject == "采集物" && c.Object.Contains(materialName));
if (materialCondition is { Result: not null })
{
return materialCondition.Result;
}
else
{
- materialCondition = PartyConditions.FirstOrDefault(c => c.Subject == "采集物" && c.Object != null && c.Object.Contains("全部"));
+ materialCondition = PartyConditions.FirstOrDefault(c => c.Subject == "采集物" && c.Object.Contains("全部"));
if (materialCondition is { Result: not null })
{
return materialCondition.Result;
@@ -81,11 +88,20 @@ public partial class PathingConditionConfig : ObservableObject
if (avatarCondition is { Object: not null } && avatarCondition.Object.Contains(avatar.Name))
{
partyConfig.GuardianAvatarIndex = avatar.Index.ToString();
- partyConfig.GuardianElementalSkillSecondInterval = avatar.SkillCd.ToString(CultureInfo.CurrentCulture);
- partyConfig.GuardianElementalSkillLongPress = avatarCondition.Result == "循环长E";
+ if (avatarCondition.Result == "循环长E")
+ {
+ partyConfig.GuardianElementalSkillLongPress = true;
+ partyConfig.GuardianElementalSkillSecondInterval = avatar.SkillHoldCd.ToString(CultureInfo.CurrentCulture);
+ }
+ else
+ {
+ partyConfig.GuardianElementalSkillLongPress = false;
+ partyConfig.GuardianElementalSkillSecondInterval = avatar.SkillCd.ToString(CultureInfo.CurrentCulture);
+ }
break;
}
}
+
if (!string.IsNullOrEmpty(partyConfig.GuardianAvatarIndex))
{
break;
@@ -105,6 +121,7 @@ public partial class PathingConditionConfig : ObservableObject
break;
}
}
+
if (!string.IsNullOrEmpty(partyConfig.MainAvatarIndex))
{
break;
diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Handler/ElementalCollectHandler.cs b/BetterGenshinImpact/GameTask/AutoPathing/Handler/ElementalCollectHandler.cs
index 94c0f419..4bcda2f5 100644
--- a/BetterGenshinImpact/GameTask/AutoPathing/Handler/ElementalCollectHandler.cs
+++ b/BetterGenshinImpact/GameTask/AutoPathing/Handler/ElementalCollectHandler.cs
@@ -108,7 +108,7 @@ public class ElementalCollectAvatarConfigs
// 风
new ElementalCollectAvatar("砂糖", ElementalType.Anemo, true, true),
new ElementalCollectAvatar("鹿野院平藏", ElementalType.Anemo, true, true),
- new ElementalCollectAvatar("散兵", ElementalType.Anemo, true, false),
+ new ElementalCollectAvatar("流浪者", ElementalType.Anemo, true, false),
new ElementalCollectAvatar("闲云", ElementalType.Anemo, true, false),
new ElementalCollectAvatar("万叶", ElementalType.Anemo, false, true),
new ElementalCollectAvatar("珐露珊", ElementalType.Anemo, false, true),
diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Model/Enum/ActionEnum.cs b/BetterGenshinImpact/GameTask/AutoPathing/Model/Enum/ActionEnum.cs
index dc090a68..2c6e5804 100644
--- a/BetterGenshinImpact/GameTask/AutoPathing/Model/Enum/ActionEnum.cs
+++ b/BetterGenshinImpact/GameTask/AutoPathing/Model/Enum/ActionEnum.cs
@@ -9,10 +9,12 @@ public class ActionEnum(string code, string msg)
public static readonly ActionEnum NahidaCollect = new("nahida_collect", "纳西妲长按E收集");
public static readonly ActionEnum PickAround = new("pick_around", "尝试在周围拾取");
public static readonly ActionEnum Fight = new("fight", "战斗");
- public static readonly ActionEnum NormalAttack = new("normal_attack", "普通攻击");
- public static readonly ActionEnum ElementalSkill = new("elemental_skill", "元素战技");
public static readonly ActionEnum UpDownGrabLeaf = new("up_down_grab_leaf", "四叶印");
+ public static readonly ActionEnum HydroCollect = new("hydro_collect", "水元素力采集");
+ public static readonly ActionEnum ElectroCollect = new("electro_collect", "雷元素力采集");
+ public static readonly ActionEnum AnemoCollect = new("anemo_collect", "风元素力采集");
+
// 还有要加入的其他动作
// 滚轮F
// 触发自动战斗任务
diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs
index 001188eb..0172ad9e 100644
--- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs
+++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs
@@ -139,7 +139,7 @@ public class PathExecutor(CancellationToken ct)
///
/// 切换队伍
///
- ///
+ ///
///
private async Task SwitchParty(string? partyName)
{
@@ -150,6 +150,12 @@ public class PathExecutor(CancellationToken ct)
return true;
}
+ if (!string.IsNullOrEmpty(RunnerContext.Instance.PartyName))
+ {
+ // 非空的情况下,先tp到安全位置(回血的七天神像)
+ await new TpTask(ct).Tp(TpTask.ReviveStatueOfTheSevenPointX, TpTask.ReviveStatueOfTheSevenPointY, true);
+ }
+
var success = await new SwitchPartyTask().Start(partyName, ct);
if (success)
{
@@ -214,9 +220,9 @@ public class PathExecutor(CancellationToken ct)
// 把所有需要切换的角色编号记录下来
Dictionary map = new()
{
- { "hydro_collect", ElementalType.Hydro },
- { "electro_collect", ElementalType.Electro },
- { "anemo_collect", ElementalType.Anemo }
+ { ActionEnum.HydroCollect.Code, ElementalType.Hydro },
+ { ActionEnum.ElectroCollect.Code, ElementalType.Electro },
+ { ActionEnum.AnemoCollect.Code, ElementalType.Anemo }
};
foreach (var (action, el) in map)
@@ -241,11 +247,14 @@ public class PathExecutor(CancellationToken ct)
return true;
}
}
+
+ Logger.LogError("此路径存在 {action} 收集动作,队伍中没有对应元素角色:{},无法执行此路径!", action, string.Join(",", ElementalCollectAvatarConfigs.GetAvatarNameList(el)));
+ return false;
+ }
+ else
+ {
+ return true;
}
-
- Logger.LogError("此路径存在 {action} 收集动作,队伍中没有对应元素角色:{},无法执行此路径!", action, string.Join(",", ElementalCollectAvatarConfigs.GetAvatarNameList(el)));
-
- return false;
}
private List ConvertWaypointsForTrack(List positions)
@@ -433,7 +442,7 @@ public class PathExecutor(CancellationToken ct)
var ms = s * 1000;
Debug.WriteLine($"元素战技释放间隔:{(now - _elementalSkillLastUseTime).TotalMilliseconds}ms");
- if ((now - _elementalSkillLastUseTime).TotalMilliseconds > ms)
+ if ((DateTime.UtcNow - _elementalSkillLastUseTime).TotalMilliseconds > ms)
{
// 可能刚切过人在冷却时间内
if (num <= 5 && (!string.IsNullOrEmpty(PartyConfig.MainAvatarIndex) && PartyConfig.GuardianAvatarIndex != PartyConfig.MainAvatarIndex))
@@ -442,7 +451,7 @@ public class PathExecutor(CancellationToken ct)
}
await UseElementalSkill();
- _elementalSkillLastUseTime = now;
+ _elementalSkillLastUseTime = DateTime.UtcNow;
}
}
}
@@ -519,7 +528,7 @@ public class PathExecutor(CancellationToken ct)
while (!ct.IsCancellationRequested)
{
stepsTaken++;
- if (stepsTaken > 20)
+ if (stepsTaken > 30)
{
Logger.LogWarning("精确接近超时");
break;
@@ -537,7 +546,7 @@ public class PathExecutor(CancellationToken ct)
await _rotateTask.WaitUntilRotatedTo(targetOrientation, 2);
// 小碎步接近
Simulation.SendInput.Keyboard.KeyDown(User32.VK.VK_W).Sleep(60).KeyUp(User32.VK.VK_W);
- await Delay(50, ct);
+ await Delay(20, ct);
}
Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W);
@@ -561,8 +570,9 @@ public class PathExecutor(CancellationToken ct)
if (waypoint.Action == ActionEnum.NahidaCollect.Code
|| waypoint.Action == ActionEnum.PickAround.Code
|| waypoint.Action == ActionEnum.Fight.Code
- || waypoint.Action == ActionEnum.NormalAttack.Code
- || waypoint.Action == ActionEnum.ElementalSkill.Code)
+ || waypoint.Action == ActionEnum.HydroCollect.Code
+ || waypoint.Action == ActionEnum.ElectroCollect.Code
+ || waypoint.Action == ActionEnum.AnemoCollect.Code)
{
var handler = ActionFactory.GetAfterHandler(waypoint.Action);
await handler.RunAsync(ct);
diff --git a/BetterGenshinImpact/GameTask/Common/Job/SwitchPartyTask.cs b/BetterGenshinImpact/GameTask/Common/Job/SwitchPartyTask.cs
index 3cb09579..adef2aa6 100644
--- a/BetterGenshinImpact/GameTask/Common/Job/SwitchPartyTask.cs
+++ b/BetterGenshinImpact/GameTask/Common/Job/SwitchPartyTask.cs
@@ -58,7 +58,7 @@ public class SwitchPartyTask
});
var currTeamName = string.Join("", currTeamNameRaList.Select(x => x.Text).Where(x => !string.IsNullOrWhiteSpace(x)));
- Logger.LogInformation("切换队伍,当前队伍名称: {Text}", currTeamName);
+ // Logger.LogInformation("切换队伍,当前队伍名称: {Text}", currTeamName);
if (currTeamName == partyName)
{
Logger.LogInformation("切换队伍,当前队伍[{Name}]即为目标队伍,无需切换", partyName);
@@ -138,7 +138,7 @@ public class SwitchPartyTask
{
page.ClickTo(textRegion.Right, textRegion.Bottom + textRegion.Height * 2);
await Delay(200, ct);
- Logger.LogInformation("切换到队伍: {Text}", textRegion.Text);
+ Logger.LogInformation("切换队伍成功: {Text}", textRegion.Text);
await ConfirmParty(page, ct);
return true;
}
diff --git a/BetterGenshinImpact/Model/ConditionDefinition.cs b/BetterGenshinImpact/Model/ConditionDefinition.cs
index 6207c7a0..798ba968 100644
--- a/BetterGenshinImpact/Model/ConditionDefinition.cs
+++ b/BetterGenshinImpact/Model/ConditionDefinition.cs
@@ -138,4 +138,12 @@ public class ConditionDefinitions
public static List AvatarSubjects { get; } = ["队伍中角色"];
public static List AvatarResultList { get; } = ["循环短E", "循环长E", "主要行走角色"];
+
+ public static Dictionary ActionCnDic { get; } = new()
+ {
+ { "nahida_collect", "纳西妲采集" },
+ { "hydro_collect", "水元素采集" },
+ { "electro_collect", "雷元素采集" },
+ { "anemo_collect", "风元素采集" },
+ };
}
diff --git a/BetterGenshinImpact/View/Pages/View/PathingConfigView.xaml b/BetterGenshinImpact/View/Pages/View/PathingConfigView.xaml
index 11e87926..4df0087e 100644
--- a/BetterGenshinImpact/View/Pages/View/PathingConfigView.xaml
+++ b/BetterGenshinImpact/View/Pages/View/PathingConfigView.xaml
@@ -117,7 +117,7 @@
+ Text="角色设置(存在多个符合条件的角色情况下,优先使用游戏内编队编号更小的)" />
diff --git a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs
index aca91356..7c37e4e3 100644
--- a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs
+++ b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs
@@ -241,7 +241,8 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware
var fileInfo = new FileInfo(filePath);
if (!fileInfo.Attributes.HasFlag(FileAttributes.Directory))
{
- SelectedScriptGroup?.AddProject(ScriptGroupProject.BuildPathingProject(fileInfo.Name, fileInfo.Directory!.Name));
+ var relativePath = Path.GetRelativePath(MapPathingViewModel.PathJsonPath, fileInfo.Directory!.FullName);
+ SelectedScriptGroup?.AddProject(ScriptGroupProject.BuildPathingProject(fileInfo.Name, relativePath));
}
}
else if (child is StackPanel childStackPanel)
@@ -251,21 +252,21 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware
}
}
- private Dictionary> LoadAllPathingScripts()
- {
- var folder = Global.Absolute(@"User\AutoPathing");
- var directories = Directory.GetDirectories(folder);
- var result = new Dictionary>();
-
- foreach (var directory in directories)
- {
- var dirInfo = new DirectoryInfo(directory);
- var files = dirInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly).ToList();
- result.Add(dirInfo.Name, files);
- }
-
- return result;
- }
+ // private Dictionary> LoadAllPathingScripts()
+ // {
+ // var folder = Global.Absolute(@"User\AutoPathing");
+ // var directories = Directory.GetDirectories(folder);
+ // var result = new Dictionary>();
+ //
+ // foreach (var directory in directories)
+ // {
+ // var dirInfo = new DirectoryInfo(directory);
+ // var files = dirInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly).ToList();
+ // result.Add(dirInfo.Name, files);
+ // }
+ //
+ // return result;
+ // }
private List LoadAllJsScriptProjects()
{