From ae954fceb8bf1693468884b0f6d4d8905ad7058b Mon Sep 17 00:00:00 2001 From: zjl Date: Sat, 18 Jan 2025 22:37:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=B0=83=E6=95=B4=E2=80=9C=E6=8C=89?= =?UTF-8?q?=E6=97=A5=E9=94=84=E5=9C=B0=E6=91=A9=E6=8B=89=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E2=80=9D=E4=B8=BA=E2=80=9C=E6=8C=89=E6=97=A5=E6=91=A9=E6=8B=89?= =?UTF-8?q?=E6=94=B6=E7=9B=8A=E7=BB=9F=E8=AE=A1=E2=80=9D=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=9F=E8=AE=A1=E7=AA=81=E5=8F=91=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=A7=94=E6=89=98=E6=94=B6=E7=9B=8A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BetterGenshinImpact/GameTask/LogParse/LogParse.cs | 5 +++-- .../GameTask/LogParse/MoraStatistics.cs | 10 ++++++++++ .../GameTask/LogParse/TravelsDiaryDetailManager.cs | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/BetterGenshinImpact/GameTask/LogParse/LogParse.cs b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs index 8feb53e5..83ef540e 100644 --- a/BetterGenshinImpact/GameTask/LogParse/LogParse.cs +++ b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs @@ -325,7 +325,8 @@ namespace LogParse (name: "最后小怪日期", value: ms => ms.LastSmallTime), (name: "精英", value: ms => ms.EliteGameStatistics.ToString()), (name: "精英详细", value: ms => ms.EliteDetails), (name: "最后精英日期", value: ms => ms.LastEliteTime), - (name: "总计锄地摩拉", value: ms => ms.TotalMoraKillingMonstersMora.ToString()) + (name: "总计锄地摩拉", value: ms => ms.TotalMoraKillingMonstersMora.ToString()), + (name: "突发事件获取摩拉", value: ms => ms.EmergencyBonus) ]; //锄地部分新曾字段 (string name, Func value)[] col2Configs=[..msColConfigs.ToList().Where(item=>item.name!="日期" && item.name!="最后小怪日期" && item.name!="最后精英日期"), @@ -386,7 +387,7 @@ namespace LogParse .OrderBy(group => group.Key) .Reverse().ToList(); - html.AppendLine($"

按日锄地摩拉统计

"); + html.AppendLine($"

按日摩拉收益统计

"); html.AppendLine(""); html.AppendLine(" "); diff --git a/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs b/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs index 50ca2b3e..ae62e5ea 100644 --- a/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs +++ b/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs @@ -25,6 +25,16 @@ namespace LogParse public List SmallMonsterActionItems => this.MonsterActionItems.Except(EliteMonsterActionItems).ToList(); + public string EmergencyBonus + { + get + { + var ls = this.ActionItems.Where(item => item.ActionId == 28).ToList(); + var count = ls.Count(); + return ls.Sum(item=>item.Num)+((count==0 || count>=10)?"":$"({count}/10)"); + } + } + public string LastEliteTime => EliteMonsterActionItems.MaxBy(item => item?.Time)?.Time ?? null; public string LastSmallTime => SmallMonsterActionItems.MaxBy(item => item?.Time)?.Time ?? null; diff --git a/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs b/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs index a8db8801..721192f5 100644 --- a/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs +++ b/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs @@ -50,8 +50,8 @@ public class TravelsDiaryDetailManager var _temp = JsonSerializer.Deserialize>(File.ReadAllText(tddfile)); if (_temp != null) { - //只统计杀怪的 - actionItems.AddRange(_temp.Data.List.Where(item => item.ActionId == 37)); + //统计杀怪或突发事件奖励 + actionItems.AddRange(_temp.Data.List.Where(item => item.ActionId == 37 || item.ActionId == 28)); } } } From 919818a424ac22722fe0f65c7359f8700098b1db Mon Sep 17 00:00:00 2001 From: zjl Date: Sun, 19 Jan 2025 22:11:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E5=99=A8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=A2=9E=E5=8A=A0=20=E2=80=9C=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=8A=80=E8=83=BDCD=E4=BC=98=E5=8C=96=E5=87=BA=E6=8B=9B?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E2=80=9D=E9=85=8D=E7=BD=AE=E3=80=82=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E5=A1=AB=E5=85=A5=E4=BA=BA=E6=88=96=E4=BA=BA=E5=92=8C?= =?UTF-8?q?cd=EF=BC=8C=E6=9D=A5=E5=86=B3=E5=AE=9A=E5=BD=93=E6=AD=A4?= =?UTF-8?q?=E4=BA=BA=E5=85=83=E7=B4=A0=E6=88=98=E6=8A=80cd=E6=9C=AA?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E6=97=B6=EF=BC=8C=E8=B7=B3=E8=BF=87=E6=AD=A4?= =?UTF-8?q?=E4=BA=BA=E5=87=BA=E6=8B=9B=EF=BC=8C=E6=9D=A5=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=88=98=E6=96=97=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=8F=AF=E5=A1=AB?= =?UTF-8?q?=E5=85=A5=E4=BA=BA=E5=90=8D=E6=88=96=E4=BA=BA=E5=90=8D=E6=95=B0?= =?UTF-8?q?=E5=AD=97=EF=BC=88=E7=94=A8=E9=80=97=E5=8F=B7=E5=88=86=E9=9A=94?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E5=A4=9A=E7=A7=8D=E7=94=A8=E5=88=86=E5=8F=B7?= =?UTF-8?q?=E5=88=86=E9=9A=94=EF=BC=8C=E4=BE=8B=E5=A6=82:=E7=99=BD?= =?UTF-8?q?=E6=9C=AF;=E9=92=9F=E7=A6=BB,12;=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E4=BA=BA=E5=90=8D=EF=BC=8C=E5=88=99=E7=94=A8=E5=86=85=E7=BD=AE?= =?UTF-8?q?cd=E6=A3=80=E6=9F=A5=EF=BC=88=E6=88=96=E5=A1=AB=E5=85=A5?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=B9=9F=E5=B0=8F=E4=BA=8E0=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=98=AF=E4=BA=BA=E5=90=8D=E5=92=8C?= =?UTF-8?q?=E6=95=B0=E5=AD=97=EF=BC=8C=E5=88=99=E6=8A=8A=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=BD=93=E5=81=9A=E5=87=BA=E6=8B=9Bcd(=E7=A7=92)=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoFight/AutoFightConfig.cs | 7 ++ .../GameTask/AutoFight/AutoFightParam.cs | 2 + .../GameTask/AutoFight/AutoFightTask.cs | 79 ++++++++++++++++++- .../View/Pages/TaskSettingsPage.xaml | 29 ++++++- .../Pages/View/ScriptGroupConfigView.xaml | 28 +++++++ 5 files changed, 141 insertions(+), 4 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs index 4ecfa868..c2077b4d 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs @@ -25,6 +25,13 @@ public partial class AutoFightConfig : ObservableObject /// [ObservableProperty] private bool _fightFinishDetectEnabled = true; + /// + /// 根据技能CD优化出招人员 + /// 根据填入人或人和cd,来决定当此人元素战技cd未结束时,跳过此人出招,来优化战斗流程,可填入人名或人名数字(用逗号分隔), + /// 多种用分号分隔,例如:白术;钟离,12;,如果人名,则用内置cd检查,如果是人名和数字,则把数字当做出招cd(秒)。 + /// + [ObservableProperty] private string _actionSchedulerByCd = ""; + [Serializable] public partial class FightFinishDetectConfig : ObservableObject { diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs index 72003705..3e4ac777 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs @@ -26,6 +26,7 @@ public class AutoFightParam : BaseTaskParam FightFinishDetectEnabled = autoFightConfig.FightFinishDetectEnabled; PickDropsAfterFightEnabled = autoFightConfig.PickDropsAfterFightEnabled; KazuhaPickupEnabled = autoFightConfig.KazuhaPickupEnabled; + ActionSchedulerByCd = autoFightConfig.ActionSchedulerByCd; FinishDetectConfig.FastCheckEnabled = autoFightConfig.FinishDetectConfig.FastCheckEnabled; FinishDetectConfig.FastCheckParams = autoFightConfig.FinishDetectConfig.FastCheckParams; @@ -47,6 +48,7 @@ public class AutoFightParam : BaseTaskParam public int Timeout { get; set; } = 120; public bool KazuhaPickupEnabled = true; + public string ActionSchedulerByCd = ""; } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs index 256c2a40..16ab96c9 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs @@ -202,6 +202,7 @@ public class AutoFightTask : ISoloTask throw new Exception("识别队伍角色失败"); } + var actionSchedulerByCd = ParseStringToDictionary(_taskParam.ActionSchedulerByCd); var combatCommands = _combatScriptBag.FindCombatScript(combatScenes.Avatars); // 新的取消token @@ -221,7 +222,8 @@ public class AutoFightTask : ISoloTask return; }*/ var fightEndFlag = false; - string lastFighttName = ""; + string lastFightName = ""; + string skipFightName = ""; //统计切换人打架次数 var countFight = 0; // 战斗操作 @@ -242,6 +244,30 @@ public class AutoFightTask : ISoloTask break; } + //根据元素技能冷却事件优化出招流程,只有当人物切换后才会触发检查 + double skillCd; + if (lastFightName != command.Name && actionSchedulerByCd.TryGetValue(command.Name,out skillCd)) + { + var avatar = combatScenes.Avatars.FirstOrDefault(a => a.Name == command.Name); + if (skillCd < 0) + { + skillCd = FindMax([avatar.SkillCd,avatar.SkillHoldCd]); + } + var dif=(DateTime.UtcNow - avatar.LastSkillTime); + //当技能未冷却时,跳过此次出招 + if ((DateTime.UtcNow -avatar.LastSkillTime).TotalSeconds < skillCd) + { + if (skipFightName != command.Name) + { + Logger.LogInformation($"{command.Name}cd冷却为{skillCd}秒,剩余{skillCd-dif.TotalSeconds}秒,跳过此次行动"); + } + skipFightName = command.Name; + continue; + } + } + + + command.Execute(combatScenes); //统计战斗人次 if (i == combatCommands.Count - 1 || command.Name != combatCommands[i + 1].Name) @@ -249,7 +275,7 @@ public class AutoFightTask : ISoloTask countFight++; } - lastFighttName = command.Name; + lastFightName = command.Name; if (!fightEndFlag && _taskParam is { FightFinishDetectEnabled: true }) { //处于最后一个位置,或者当前执行人和下一个人名字不一样的情况,满足一定条件(开启快速检查,并且检查时间大于0或人名存在配置)检查战斗 @@ -341,7 +367,7 @@ public class AutoFightTask : ISoloTask { var time = DateTime.UtcNow - kazuha.LastSkillTime; //当万叶cd大于3时或战斗人次少于2时(通常无怪物情况下),此时不再触发万叶拾取, - if (!(countFight < 2 || lastFighttName == "枫原万叶" && time.TotalSeconds > 3)) + if (!(countFight < 2 || lastFightName == "枫原万叶" && time.TotalSeconds > 3)) { Logger.LogInformation("使用枫原万叶长E拾取掉落物"); await Delay(300, ct); @@ -470,6 +496,53 @@ public class AutoFightTask : ISoloTask (g >= 240 && g <= 255) && (b >= 240 && b <= 255); } + static double FindMax(double[] numbers) + { + if (numbers == null || numbers.Length == 0) + { + throw new ArgumentException("The array is empty or null."); + } + + double max = numbers[0]>10000 ? 0 : numbers[0]; + foreach (var num in numbers) + { + var cpnum = numbers[0]>10000 ? 0 : num; + max = Math.Max(max, num); + } + + return max; + } + private static Dictionary ParseStringToDictionary(string input,double defaultValue=-1) + { + var dictionary = new Dictionary(); + + if (string.IsNullOrEmpty(input)) + { + return dictionary; // 返回空字典 + } + + string[] pairs = input.Split(';', StringSplitOptions.RemoveEmptyEntries); + + foreach (var pair in pairs) + { + var parts = pair.Split(',', StringSplitOptions.TrimEntries); + + if (parts.Length > 0) + { + string name = parts[0]; + double value = defaultValue; + + if (parts.Length > 1 && double.TryParse(parts[1], out var parsedValue)) + { + value = parsedValue; + } + + dictionary[name] = value; + } + } + + return dictionary; + } private bool HasFightFlagByYolo(ImageRegion imageRegion) { diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 8f419032..2616568c 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -428,7 +428,34 @@ - + + + + + + + + + + + + + diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 6975a47c..970e8715 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -370,6 +370,34 @@ + + + + + + + + + + + + +