From b28ebf3ca9970fed5b2037ec089a6fa7690067e6 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:44:56 +0800 Subject: [PATCH 1/4] =?UTF-8?q?rft:=20=E8=BF=9C=E7=A8=8B=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1=E7=A7=BB=E9=99=A4=E5=8F=8D?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RemoteControl/RemoteControlService.cs | 16 ++++----- .../ViewModels/UI/TaskQueueViewModel.cs | 33 +++++-------------- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/MaaWpfGui/Services/RemoteControl/RemoteControlService.cs b/src/MaaWpfGui/Services/RemoteControl/RemoteControlService.cs index 6d6ed91fdc..d7f4fda76e 100644 --- a/src/MaaWpfGui/Services/RemoteControl/RemoteControlService.cs +++ b/src/MaaWpfGui/Services/RemoteControl/RemoteControlService.cs @@ -644,35 +644,35 @@ namespace MaaWpfGui.Services.RemoteControl switch (item) { case "Base": - taskRet &= InvokeInstanceFunction(Instances.TaskQueueViewModel, "AppendInfrast"); + taskRet &= Instances.TaskQueueViewModel.AppendInfrast(); break; case "WakeUp": - taskRet &= InvokeStaticFunction(Instances.TaskQueueViewModel.GetType(), "AppendStart"); + taskRet &= TaskQueueViewModel.AppendStart(); break; case "Combat": - taskRet &= InvokeInstanceFunction(Instances.TaskQueueViewModel, "AppendFight"); + taskRet &= Instances.TaskQueueViewModel.AppendFight(); break; case "Recruiting": - taskRet &= InvokeStaticFunction(Instances.TaskQueueViewModel.GetType(), "AppendRecruit"); + taskRet &= TaskQueueViewModel.AppendRecruit(); break; case "Mall": - taskRet &= InvokeInstanceFunction(Instances.TaskQueueViewModel, "AppendMall"); + taskRet &= TaskQueueViewModel.AppendMall(); break; case "Mission": - taskRet &= InvokeStaticFunction(Instances.TaskQueueViewModel.GetType(), "AppendAward"); + taskRet &= TaskQueueViewModel.AppendAward(); break; case "AutoRoguelike": - taskRet &= InvokeStaticFunction(Instances.TaskQueueViewModel.GetType(), "AppendRoguelike"); + taskRet &= TaskQueueViewModel.AppendRoguelike(); break; case "Reclamation": - taskRet &= InvokeStaticFunction(Instances.TaskQueueViewModel.GetType(), "AppendReclamation"); + taskRet &= TaskQueueViewModel.AppendReclamation(); break; default: diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index cf1a8c9b20..469ebf9982 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -1543,13 +1543,13 @@ namespace MaaWpfGui.ViewModels.UI } } - private static bool AppendStart() + public static bool AppendStart() { var (type, param) = StartUpTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.StartUp, type, param); } - private bool AppendFight() + public bool AppendFight() { int medicine = 0; if (FightTask.UseMedicine) @@ -1701,9 +1701,8 @@ namespace MaaWpfGui.ViewModels.UI Instances.AsstProxy.AsstSetInfrastTaskParams(); } - private bool AppendInfrast() + public bool AppendInfrast() { - // 被RemoteControlService反射调用,暂不移除 if (InfrastTask.CustomInfrastEnabled && (!File.Exists(InfrastTask.CustomInfrastFile) || InfrastTask.CustomInfrastPlanInfoList.Count == 0)) { AddLog(LocalizationHelper.GetString("CustomizeInfrastSelectionEmpty"), UiLogColor.Error); @@ -1714,48 +1713,32 @@ namespace MaaWpfGui.ViewModels.UI return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Infrast, type, param); } - private readonly Dictionary> _blackCharacterListMapping = new() + public static bool AppendMall() { - { string.Empty, ["讯使", "嘉维尔", "坚雷"] }, - { "Official", ["讯使", "嘉维尔", "坚雷"] }, - { "Bilibili", ["讯使", "嘉维尔", "坚雷"] }, - { "YoStarEN", ["Courier", "Gavial", "Dur-nar"] }, - { "YoStarJP", ["クーリエ", "ガヴィル", "ジュナー"] }, - { "YoStarKR", ["쿠리어", "가비알", "듀나"] }, - { "txwy", ["訊使", "嘉維爾", "堅雷"] }, - }; - - private bool AppendMall() - { - // 被RemoteControlService反射调用,暂不移除 var (type, param) = MallTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Mall, type, param); } - private static bool AppendAward() + public static bool AppendAward() { - // 被RemoteControlService反射调用,暂不移除 var (type, param) = AwardTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Award, type, param); } - private static bool AppendRecruit() + public static bool AppendRecruit() { - // 被RemoteControlService反射调用,暂不移除 var (type, param) = RecruitTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Recruit, type, param); } - private static bool AppendRoguelike() + public static bool AppendRoguelike() { - // 被RemoteControlService反射调用,暂不移除 var (type, param) = RoguelikeTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Roguelike, type, param); } - private static bool AppendReclamation() + public static bool AppendReclamation() { - // 被RemoteControlService反射调用,暂不移除 var (type, param) = ReclamationTask.Serialize(); return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Reclamation, type, param); } From 563c9507d5f3f74d8cc39735d78e782b670cf6cf Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:23:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?rft:=20Wpf=E8=BF=81=E7=A7=BB=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=AE=B1-=E5=85=AC=E6=8B=9B=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Main/AsstProxy.cs | 25 ------------------- .../ViewModels/UI/RecognizerViewModel.cs | 16 +++++++++++- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index b185b1f7be..90cc381c78 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -2163,31 +2163,6 @@ namespace MaaWpfGui.Main return AsstSetTaskParamsWithEncoding(id, taskParams); } - /// - /// 公招识别。 - /// - /// 会去点击标签的 Tag 等级。 - /// 是否设置 9 小时。 - /// 3 星招募时间 - /// 4 星招募时间 - /// 5 星招募时间 - /// 是否成功。 - public bool AsstStartRecruitCalc(int[] selectLevel, bool setTime, int chooseLevel3Time, int chooseLevel4Time, int chooseLevel5Time) - { - var task = new AsstRecruitTask() - { - SelectList = selectLevel.ToList(), - ConfirmList = [-1], // 仅公招识别时将-1加入comfirm_level - SetRecruitTime = setTime, - ChooseLevel3Time = chooseLevel3Time, - ChooseLevel4Time = chooseLevel4Time, - ChooseLevel5Time = chooseLevel5Time, - ServerType = Instances.SettingsViewModel.ServerType, - }; - var (type, taskParams) = task.Serialize(); - return AsstAppendTaskWithEncoding(TaskType.RecruitCalc, type, taskParams) && AsstStart(); - } - /// /// 仓库识别。 /// diff --git a/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs b/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs index 4f690e2d19..23ea5bd572 100644 --- a/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs @@ -23,11 +23,13 @@ using System.Windows.Threading; using HandyControl.Controls; using MaaWpfGui.Constants; using MaaWpfGui.Helper; +using MaaWpfGui.Models.AsstTasks; using MaaWpfGui.States; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Serilog; using Stylet; +using static MaaWpfGui.Main.AsstProxy; using Timer = System.Timers.Timer; namespace MaaWpfGui.ViewModels.UI @@ -219,7 +221,19 @@ namespace MaaWpfGui.ViewModels.UI levelList.Add(6); } - Instances.AsstProxy.AsstStartRecruitCalc(levelList.ToArray(), RecruitAutoSetTime, TaskQueueViewModel.RecruitTask.ChooseLevel3Time, TaskQueueViewModel.RecruitTask.ChooseLevel4Time, TaskQueueViewModel.RecruitTask.ChooseLevel5Time); + var task = new AsstRecruitTask() + { + SelectList = levelList, + ConfirmList = [-1], // 仅公招识别时将-1加入comfirm_level + SetRecruitTime = RecruitAutoSetTime, + ChooseLevel3Time = TaskQueueViewModel.RecruitTask.ChooseLevel3Time, + ChooseLevel4Time = TaskQueueViewModel.RecruitTask.ChooseLevel4Time, + ChooseLevel5Time = TaskQueueViewModel.RecruitTask.ChooseLevel5Time, + ServerType = Instances.SettingsViewModel.ServerType, + }; + var (type, taskParams) = task.Serialize(); + bool ret = Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.RecruitCalc, type, taskParams); + ret &= Instances.AsstProxy.AsstStart(); } private bool _recruitmentShowPotential = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.RecruitmentShowPotential, bool.TrueString)); From 419b3ae82d0ccf390e7a54cc24735f50b3fed9cd Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:28:03 +0800 Subject: [PATCH 3/4] =?UTF-8?q?rft:=20Wpf=E5=9F=BA=E5=BB=BA=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8F=82=E6=95=B0=E6=9B=B4=E6=96=B0=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Main/AsstProxy.cs | 26 +++++++++---------- .../ViewModels/UI/TaskQueueViewModel.cs | 11 +++++--- .../InfrastSettingsUserControlModel.cs | 3 ++- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index 90cc381c78..9ea8b0da92 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -2036,6 +2036,8 @@ namespace MaaWpfGui.Main private readonly Dictionary _taskStatus = []; private static JObject SerializeFightTaskParams( + public IReadOnlyDictionary TaskStatus => _taskStatus; + string stage, int maxMedicine, int maxStone, @@ -2150,19 +2152,6 @@ namespace MaaWpfGui.Main return MaaService.AsstBackToHome(_handle); } - public bool AsstSetInfrastTaskParams() - { - const TaskType Type = TaskType.Infrast; - int id = _taskStatus.FirstOrDefault(i => i.Value == Type).Key; - if (id == 0) - { - return false; - } - - var taskParams = InfrastSettingsUserControlModel.Instance.Serialize().Params; - return AsstSetTaskParamsWithEncoding(id, taskParams); - } - /// /// 仓库识别。 /// @@ -2215,6 +2204,17 @@ namespace MaaWpfGui.Main return true; } + public bool AsstSetTaskParamsEncoded(AsstTaskId id, JObject? taskParams = null) + { + if (id == 0) + { + return false; + } + + taskParams ??= []; + return AsstSetTaskParams(_handle, id, JsonConvert.SerializeObject(taskParams)); + } + public bool ContainsTask(TaskType type) { return _taskStatus.ContainsValue(type); diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index 469ebf9982..152ad44e53 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -27,6 +27,7 @@ using MaaWpfGui.Extensions; using MaaWpfGui.Helper; using MaaWpfGui.Main; using MaaWpfGui.Models; +using MaaWpfGui.Models.AsstTasks; using MaaWpfGui.Services; using MaaWpfGui.States; using MaaWpfGui.Utilities; @@ -36,6 +37,7 @@ using MaaWpfGui.ViewModels.UserControl.TaskQueue; using Newtonsoft.Json.Linq; using Serilog; using Stylet; +using static MaaWpfGui.Main.AsstProxy; using Application = System.Windows.Application; using IContainer = StyletIoC.IContainer; using Screen = Stylet.Screen; @@ -1691,14 +1693,17 @@ namespace MaaWpfGui.ViewModels.UI Instances.AsstProxy.AsstSetFightTaskParams(FightTask.RemainingSanityStage, 0, 0, int.MaxValue, 1, string.Empty, 0, false); } - public void SetInfrastParams() + public static void SetInfrastParams() { - if (!Instances.AsstProxy.ContainsTask(AsstProxy.TaskType.Infrast)) + const TaskType Type = TaskType.Infrast; + int id = Instances.AsstProxy.TaskStatus.FirstOrDefault(i => i.Value == Type).Key; + if (id == default) { return; } - Instances.AsstProxy.AsstSetInfrastTaskParams(); + var taskParams = InfrastSettingsUserControlModel.Instance.Serialize().Params; + Instances.AsstProxy.AsstSetTaskParamsEncoded(id, taskParams); } public bool AppendInfrast() diff --git a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/InfrastSettingsUserControlModel.cs b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/InfrastSettingsUserControlModel.cs index 0903932f66..958b3d0d56 100644 --- a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/InfrastSettingsUserControlModel.cs +++ b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/InfrastSettingsUserControlModel.cs @@ -23,6 +23,7 @@ using MaaWpfGui.Models; using MaaWpfGui.Models.AsstTasks; using MaaWpfGui.Services; using MaaWpfGui.Utilities.ValueType; +using MaaWpfGui.ViewModels.UI; using Microsoft.Win32; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -440,7 +441,7 @@ public class InfrastSettingsUserControlModel : TaskViewModel } SetAndNotify(ref _customInfrastPlanIndex, value); - Instances.TaskQueueViewModel.SetInfrastParams(); + TaskQueueViewModel.SetInfrastParams(); ConfigurationHelper.SetValue(ConfigurationKeys.CustomInfrastPlanIndex, value.ToString()); } } From 3096f8e311a0d8a773768f54a1cc4862e7802361 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:33:20 +0800 Subject: [PATCH 4/4] =?UTF-8?q?rft:=20Wpf=E5=88=B7=E7=90=86=E6=99=BA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Main/AsstProxy.cs | 96 +---------- .../Models/AsstTasks/AsstBaseTask.cs | 8 +- .../Models/AsstTasks/AsstFightTask.cs | 126 ++++++++++++++ .../ViewModels/UI/TaskQueueViewModel.cs | 155 +++++++----------- .../FightSettingsUserControlModel.cs | 67 +++++--- 5 files changed, 233 insertions(+), 219 deletions(-) create mode 100644 src/MaaWpfGui/Models/AsstTasks/AsstFightTask.cs diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index 9ea8b0da92..d184708d36 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -947,7 +947,7 @@ namespace MaaWpfGui.Main } } - private void ProcSubTaskMsg(AsstMsg msg, JObject details) + private static void ProcSubTaskMsg(AsstMsg msg, JObject details) { // 下面几行注释暂时没用到,先注释起来... // string taskChain = details["taskchain"].ToString(); @@ -2035,97 +2035,8 @@ namespace MaaWpfGui.Main private readonly Dictionary _taskStatus = []; - private static JObject SerializeFightTaskParams( public IReadOnlyDictionary TaskStatus => _taskStatus; - string stage, - int maxMedicine, - int maxStone, - int maxTimes, - int series, - string dropsItemId, - int dropsItemQuantity, - bool isMainFight = true) - { - var taskParams = new JObject - { - ["stage"] = stage, - ["medicine"] = maxMedicine, - ["stone"] = maxStone, - ["times"] = maxTimes, - ["series"] = series, - ["report_to_penguin"] = SettingsViewModel.GameSettings.EnablePenguin, - ["report_to_yituliu"] = SettingsViewModel.GameSettings.EnableYituliu, - }; - if (dropsItemQuantity != 0 && !string.IsNullOrWhiteSpace(dropsItemId)) - { - taskParams["drops"] = new JObject - { - [dropsItemId] = dropsItemQuantity, - }; - } - - taskParams["client_type"] = SettingsViewModel.GameSettings.ClientType; - taskParams["penguin_id"] = SettingsViewModel.GameSettings.PenguinId; - taskParams["DrGrandet"] = TaskQueueViewModel.FightTask.IsDrGrandet; - taskParams["expiring_medicine"] = isMainFight && TaskQueueViewModel.FightTask.UseExpiringMedicine ? 9999 : 0; - taskParams["server"] = Instances.SettingsViewModel.ServerType; - return taskParams; - } - - /// - /// 刷理智。 - /// - /// 关卡名。 - /// 最大使用理智药数量。 - /// 最大吃石头数量。 - /// 指定次数。 - /// 连战次数。 - /// 指定掉落 ID。 - /// 指定掉落数量。 - /// 是否是主任务,决定c#侧是否记录任务id - /// 是否成功。 - public bool AsstAppendFight(string stage, int maxMedicine, int maxStone, int maxTimes, int series, string dropsItemId, int dropsItemQuantity, bool isMainFight = true) - { - var taskParams = SerializeFightTaskParams(stage, maxMedicine, maxStone, maxTimes, series, dropsItemId, dropsItemQuantity, isMainFight); - AsstTaskId id = AsstAppendTaskWithEncoding(AsstTaskType.Fight, taskParams); - if (isMainFight) - { - _taskStatus.Add(id, TaskType.Fight); - } - else - { - _taskStatus.Add(id, TaskType.FightRemainingSanity); - } - - return id != 0; - } - - /// - /// 设置刷理智任务参数。 - /// - /// 关卡名。 - /// 最大使用理智药数量。 - /// 最大吃石头数量。 - /// 指定次数。 - /// 连战次数。 - /// 指定掉落 ID。 - /// 指定掉落数量。 - /// 是否是主任务,决定c#侧是否记录任务id - /// 是否成功。 - public bool AsstSetFightTaskParams(string stage, int maxMedicine, int maxStone, int maxTimes, int series, string dropsItemId, int dropsItemQuantity, bool isMainFight = true) - { - var type = isMainFight ? TaskType.Fight : TaskType.FightRemainingSanity; - var id = _taskStatus.FirstOrDefault(t => t.Value == type).Key; - if (id == 0) - { - return false; - } - - var taskParams = SerializeFightTaskParams(stage, maxMedicine, maxStone, maxTimes, series, dropsItemId, dropsItemQuantity); - return AsstSetTaskParamsWithEncoding(id, taskParams); - } - public bool AsstAppendCloseDown(string clientType) { if (!AsstStop()) @@ -2215,11 +2126,6 @@ namespace MaaWpfGui.Main return AsstSetTaskParams(_handle, id, JsonConvert.SerializeObject(taskParams)); } - public bool ContainsTask(TaskType type) - { - return _taskStatus.ContainsValue(type); - } - /// /// 启动。 /// diff --git a/src/MaaWpfGui/Models/AsstTasks/AsstBaseTask.cs b/src/MaaWpfGui/Models/AsstTasks/AsstBaseTask.cs index 351cf4a8cf..7e81d9887d 100644 --- a/src/MaaWpfGui/Models/AsstTasks/AsstBaseTask.cs +++ b/src/MaaWpfGui/Models/AsstTasks/AsstBaseTask.cs @@ -11,7 +11,6 @@ // but WITHOUT ANY WARRANTY // #nullable enable -using System; using MaaWpfGui.Services; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -19,12 +18,9 @@ using Newtonsoft.Json.Linq; namespace MaaWpfGui.Models.AsstTasks; [JsonObject(MemberSerialization.OptIn)] -public class AsstBaseTask +public abstract class AsstBaseTask { public virtual AsstTaskType TaskType { get; private set; } - public virtual (AsstTaskType TaskType, JObject Params) Serialize() - { - throw new NotImplementedException(); - } + public abstract (AsstTaskType TaskType, JObject Params) Serialize(); } diff --git a/src/MaaWpfGui/Models/AsstTasks/AsstFightTask.cs b/src/MaaWpfGui/Models/AsstTasks/AsstFightTask.cs new file mode 100644 index 0000000000..e65453be4d --- /dev/null +++ b/src/MaaWpfGui/Models/AsstTasks/AsstFightTask.cs @@ -0,0 +1,126 @@ +// +// MaaWpfGui - A part of the MaaCoreArknights project +// Copyright (C) 2021 MistEO and Contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License v3.0 only as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY +// +#nullable enable +using System.Collections.Generic; +using MaaWpfGui.Services; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace MaaWpfGui.Models.AsstTasks; + +public class AsstFightTask : AsstBaseTask +{ + public override AsstTaskType TaskType => AsstTaskType.Fight; + + /// + /// Gets or sets 关卡id + /// + [JsonProperty("stage")] + public string Stage { get; set; } = string.Empty; + + /// + /// Gets or sets 最大吃药数量 + /// + [JsonProperty("medicine")] + public int Medicine { get; set; } + + /// + /// Gets or sets 临期药品数量 + /// + [JsonProperty("expiring_medicine")] + public int ExpiringMedicine { get; set; } + + /// + /// Gets or sets 最大碎石数量 + /// + [JsonProperty("stone")] + public int Stone { get; set; } + + /// + /// Gets or sets 最大次数 + /// + [JsonProperty("times")] + public int MaxTimes { get; set; } = 1; + + /// + /// Gets or sets 连战次数 + /// + [JsonProperty("series")] + public int Series { get; set; } = 1; + + /// + /// Gets or sets a value indicating whether gets or sets 葛朗台 + /// + [JsonProperty("DrGrandet")] + public bool IsDrGrandet { get; set; } + + /// + /// Gets or sets 掉落物品id, 数量 + /// + public Dictionary Drops { get; set; } = []; + + /// + /// Gets or sets a value indicating whether 是否回报企鹅物流,默认 false + /// + [JsonProperty("report_to_penguin")] + public bool ReportToPenguin { get; set; } + + /// + /// Gets or sets 企鹅物流回报id, 可选,默认为空。仅在 为 true 时有效 + /// + public string PenguinId { get; set; } = string.Empty; + + /// + /// Gets or sets a value indicating whether 是否回报一图流,默认 false + /// + [JsonProperty("report_to_yituliu")] + public bool ReportToYituliu { get; set; } + + /// + /// Gets or sets 一图流回报id,可选,默认为空。仅在 为 true 时有效 + /// + public string YituliuId { get; set; } = string.Empty; + + /// + /// Gets or sets 服务器,可选,默认 "CN", 会影响上传。选项:"CN" | "US" | "JP" | "KR" + /// + [JsonProperty("server")] + public string ServerType { get; set; } = string.Empty; + + /// + /// Gets or sets 客户端类型 + /// + [JsonProperty("client_type")] + public string ClientType { get; set; } = string.Empty; + + public override (AsstTaskType TaskType, JObject Params) Serialize() + { + var param = JObject.FromObject(this); + if (ReportToPenguin && !string.IsNullOrWhiteSpace(PenguinId)) + { + param["penguin_id"] = PenguinId; + } + + if (ReportToYituliu && !string.IsNullOrWhiteSpace(YituliuId)) + { + param["yituliu_id"] = YituliuId; + } + + if (Drops.Count > 0) + { + param["drops"] = JObject.FromObject(Drops); + } + + return (AsstTaskType.Custom, param); + } +} diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index 152ad44e53..17f90efa1d 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -41,6 +41,7 @@ using static MaaWpfGui.Main.AsstProxy; using Application = System.Windows.Application; using IContainer = StyletIoC.IContainer; using Screen = Stylet.Screen; +using Task = System.Threading.Tasks.Task; namespace MaaWpfGui.ViewModels.UI { @@ -1351,7 +1352,7 @@ namespace MaaWpfGui.ViewModels.UI case "Custom": { var (type, param) = CustomTask.Serialize(); - taskRet &= Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Reclamation, type, param); + taskRet &= Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Reclamation, type, param); break; } @@ -1548,56 +1549,15 @@ namespace MaaWpfGui.ViewModels.UI public static bool AppendStart() { var (type, param) = StartUpTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.StartUp, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.StartUp, type, param); } public bool AppendFight() { - int medicine = 0; - if (FightTask.UseMedicine) - { - if (!int.TryParse(FightTask.MedicineNumber, out medicine)) - { - medicine = 0; - } - } - - int stone = 0; - if (FightTask.UseStone) - { - if (!int.TryParse(FightTask.StoneNumber, out stone)) - { - stone = 0; - } - } - - int times = int.MaxValue; - if (FightTask.HasTimesLimited) - { - if (!int.TryParse(FightTask.MaxTimes, out times)) - { - times = 0; - } - } - - if (!int.TryParse(FightTask.Series, out var series)) - { - series = 1; - } - - int dropsQuantity = 0; - if (FightTask.IsSpecifiedDrops) - { - if (!int.TryParse(FightTask.DropsQuantity, out dropsQuantity)) - { - dropsQuantity = 0; - } - } - string curStage = FightTask.Stage; - bool mainFightRet = Instances.AsstProxy.AsstAppendFight(curStage, medicine, stone, times, series, FightTask.DropsItemId, dropsQuantity); - + var (type, mainParam) = FightTask.Serialize(); + bool mainFightRet = Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.FightRemainingSanity, type, mainParam); if (!mainFightRet) { AddLog(LocalizationHelper.GetString("UnsupportedStages") + ": " + curStage, UiLogColor.Error); @@ -1614,14 +1574,32 @@ namespace MaaWpfGui.ViewModels.UI } AddLog(LocalizationHelper.GetString("AnnihilationTaskTip"), UiLogColor.Info); - mainFightRet = Instances.AsstProxy.AsstAppendFight(stage, medicine, 0, int.MaxValue, series, string.Empty, 0); + var task = mainParam.ToObject(); + task.Stage = stage; + task.Stone = 0; + task.MaxTimes = int.MaxValue; + task.Drops = []; + mainFightRet = Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.FightRemainingSanity, type, task.Serialize().Params); break; } } if (mainFightRet && FightTask.UseRemainingSanityStage && !string.IsNullOrEmpty(FightTask.RemainingSanityStage)) { - return Instances.AsstProxy.AsstAppendFight(FightTask.RemainingSanityStage, 0, 0, int.MaxValue, 1, string.Empty, 0, false); + var task = new AsstFightTask() + { + Stage = FightTask.RemainingSanityStage, + MaxTimes = int.MaxValue, + Series = 1, + IsDrGrandet = FightTask.IsDrGrandet, + ReportToPenguin = SettingsViewModel.GameSettings.EnablePenguin, + ReportToYituliu = SettingsViewModel.GameSettings.EnableYituliu, + PenguinId = SettingsViewModel.GameSettings.PenguinId, + YituliuId = SettingsViewModel.GameSettings.PenguinId, + ServerType = Instances.SettingsViewModel.ServerType, + ClientType = SettingsViewModel.GameSettings.ClientType, + }; + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.FightRemainingSanity, type, task.Serialize().Params); } return mainFightRet; @@ -1634,63 +1612,42 @@ namespace MaaWpfGui.ViewModels.UI /// public void SetFightParams() { - if (!EnableSetFightParams || !Instances.AsstProxy.ContainsTask(AsstProxy.TaskType.Fight)) + var type = TaskType.Fight; + var id = Instances.AsstProxy.TaskStatus.FirstOrDefault(t => t.Value == type).Key; + if (!EnableSetFightParams || id == default) { return; } - int medicine = 0; - if (FightTask.UseMedicine) - { - if (!int.TryParse(FightTask.MedicineNumber, out medicine)) - { - medicine = 0; - } - } - - int stone = 0; - if (FightTask.UseStone) - { - if (!int.TryParse(FightTask.StoneNumber, out stone)) - { - stone = 0; - } - } - - int times = int.MaxValue; - if (FightTask.HasTimesLimited) - { - if (!int.TryParse(FightTask.MaxTimes, out times)) - { - times = 0; - } - } - - if (!int.TryParse(FightTask.Series, out var series)) - { - series = 1; - } - - int dropsQuantity = 0; - if (FightTask.IsSpecifiedDrops) - { - if (!int.TryParse(FightTask.DropsQuantity, out dropsQuantity)) - { - dropsQuantity = 0; - } - } - - Instances.AsstProxy.AsstSetFightTaskParams(FightTask.Stage, medicine, stone, times, series, FightTask.DropsItemId, dropsQuantity); + var taskParams = FightTask.Serialize().Params; + Instances.AsstProxy.AsstSetTaskParamsEncoded(id, taskParams); } - public void SetFightRemainingSanityParams() + public static void SetFightRemainingSanityParams() { - if (!Instances.AsstProxy.ContainsTask(AsstProxy.TaskType.FightRemainingSanity)) + var type = TaskType.FightRemainingSanity; + var id = Instances.AsstProxy.TaskStatus.FirstOrDefault(t => t.Value == type).Key; + if (id == default) { return; } - Instances.AsstProxy.AsstSetFightTaskParams(FightTask.RemainingSanityStage, 0, 0, int.MaxValue, 1, string.Empty, 0, false); + var task = new AsstFightTask() + { + Stage = FightTask.RemainingSanityStage, + MaxTimes = int.MaxValue, + Series = 1, + IsDrGrandet = FightTask.IsDrGrandet, + ReportToPenguin = SettingsViewModel.GameSettings.EnablePenguin, + ReportToYituliu = SettingsViewModel.GameSettings.EnableYituliu, + PenguinId = SettingsViewModel.GameSettings.PenguinId, + YituliuId = SettingsViewModel.GameSettings.PenguinId, + ServerType = Instances.SettingsViewModel.ServerType, + ClientType = SettingsViewModel.GameSettings.ClientType, + }; + + var taskParams = task.Serialize().Params; + Instances.AsstProxy.AsstSetTaskParamsEncoded(id, taskParams); } public static void SetInfrastParams() @@ -1715,37 +1672,37 @@ namespace MaaWpfGui.ViewModels.UI } var (type, param) = InfrastTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Infrast, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Infrast, type, param); } public static bool AppendMall() { var (type, param) = MallTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Mall, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Mall, type, param); } public static bool AppendAward() { var (type, param) = AwardTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Award, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Award, type, param); } public static bool AppendRecruit() { var (type, param) = RecruitTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Recruit, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Recruit, type, param); } public static bool AppendRoguelike() { var (type, param) = RoguelikeTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Roguelike, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Roguelike, type, param); } public static bool AppendReclamation() { var (type, param) = ReclamationTask.Serialize(); - return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Reclamation, type, param); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Reclamation, type, param); } /// diff --git a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs index 142178af2a..c2a1e28843 100644 --- a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs +++ b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs @@ -17,7 +17,11 @@ using System.Collections.ObjectModel; using System.Windows; using MaaWpfGui.Constants; using MaaWpfGui.Helper; +using MaaWpfGui.Models.AsstTasks; +using MaaWpfGui.Services; using MaaWpfGui.Utilities.ValueType; +using MaaWpfGui.ViewModels.UI; +using Newtonsoft.Json.Linq; namespace MaaWpfGui.ViewModels.UserControl.TaskQueue; @@ -251,7 +255,7 @@ public class FightSettingsUserControlModel : TaskViewModel } SetAndNotify(ref _remainingSanityStage, value); - Instances.TaskQueueViewModel.SetFightRemainingSanityParams(); + TaskQueueViewModel.SetFightRemainingSanityParams(); ConfigurationHelper.SetValue(ConfigurationKeys.RemainingSanityStage, value); } } @@ -313,12 +317,12 @@ public class FightSettingsUserControlModel : TaskViewModel set => UseMedicineWithNull = value; } - private string _medicineNumber = ConfigurationHelper.GetValue(ConfigurationKeys.UseMedicineQuantity, "999"); + private int _medicineNumber = ConfigurationHelper.GetValue(ConfigurationKeys.UseMedicineQuantity, 999); /// /// Gets or sets the amount of medicine used. /// - public string MedicineNumber + public int MedicineNumber { get => _medicineNumber; set @@ -329,9 +333,8 @@ public class FightSettingsUserControlModel : TaskViewModel } SetAndNotify(ref _medicineNumber, value); - Instances.TaskQueueViewModel.SetFightParams(); - ConfigurationHelper.SetValue(ConfigurationKeys.UseMedicineQuantity, MedicineNumber); + ConfigurationHelper.SetValue(ConfigurationKeys.UseMedicineQuantity, value.ToString()); } } @@ -356,7 +359,7 @@ public class FightSettingsUserControlModel : TaskViewModel SetAndNotify(ref _useStoneWithNull, value); if (value != false) { - MedicineNumber = "999"; + MedicineNumber = 999; if (!UseMedicine) { UseMedicineWithNull = value; @@ -384,12 +387,12 @@ public class FightSettingsUserControlModel : TaskViewModel set => UseStoneWithNull = value; } - private string _stoneNumber = ConfigurationHelper.GetValue(ConfigurationKeys.UseStoneQuantity, "0"); + private int _stoneNumber = ConfigurationHelper.GetValue(ConfigurationKeys.UseStoneQuantity, 0); /// /// Gets or sets the amount of originiums used. /// - public string StoneNumber + public int StoneNumber { get => _stoneNumber; set @@ -401,7 +404,7 @@ public class FightSettingsUserControlModel : TaskViewModel SetAndNotify(ref _stoneNumber, value); Instances.TaskQueueViewModel.SetFightParams(); - ConfigurationHelper.SetValue(ConfigurationKeys.UseStoneQuantity, StoneNumber); + ConfigurationHelper.SetValue(ConfigurationKeys.UseStoneQuantity, value.ToString()); } } @@ -431,12 +434,12 @@ public class FightSettingsUserControlModel : TaskViewModel set => HasTimesLimitedWithNull = value; } - private string _maxTimes = ConfigurationHelper.GetValue(ConfigurationKeys.TimesLimitedQuantity, "5"); + private int _maxTimes = ConfigurationHelper.GetValue(ConfigurationKeys.TimesLimitedQuantity, 5); /// /// Gets or sets the max number of times. /// - public string MaxTimes + public int MaxTimes { get => _maxTimes; set @@ -448,17 +451,16 @@ public class FightSettingsUserControlModel : TaskViewModel SetAndNotify(ref _maxTimes, value); Instances.TaskQueueViewModel.SetFightParams(); - ConfigurationHelper.SetValue(ConfigurationKeys.TimesLimitedQuantity, MaxTimes); + ConfigurationHelper.SetValue(ConfigurationKeys.TimesLimitedQuantity, value.ToString()); } } - private string _series = ConfigurationHelper.GetValue(ConfigurationKeys.SeriesQuantity, "1"); + private int _series = ConfigurationHelper.GetValue(ConfigurationKeys.SeriesQuantity, 1); /// /// Gets or sets the max number of times. /// - // 所以为啥这玩意是 string 呢?改配置的时候把上面那些也都改成 int 吧 - public string Series + public int Series { get => _series; set @@ -470,7 +472,7 @@ public class FightSettingsUserControlModel : TaskViewModel SetAndNotify(ref _series, value); Instances.TaskQueueViewModel.SetFightParams(); - ConfigurationHelper.SetValue(ConfigurationKeys.SeriesQuantity, value); + ConfigurationHelper.SetValue(ConfigurationKeys.SeriesQuantity, value.ToString()); } } @@ -612,19 +614,19 @@ public class FightSettingsUserControlModel : TaskViewModel DropsItemName = LocalizationHelper.GetString("NotSelected"); } - private string _dropsQuantity = ConfigurationHelper.GetValue(ConfigurationKeys.DropsQuantity, "5"); + private int _dropsQuantity = ConfigurationHelper.GetValue(ConfigurationKeys.DropsQuantity, 5); /// /// Gets or sets the quantity of drops. /// - public string DropsQuantity + public int DropsQuantity { get => _dropsQuantity; set { SetAndNotify(ref _dropsQuantity, value); Instances.TaskQueueViewModel.SetFightParams(); - ConfigurationHelper.SetValue(ConfigurationKeys.DropsQuantity, DropsQuantity); + ConfigurationHelper.SetValue(ConfigurationKeys.DropsQuantity, value.ToString()); } } @@ -771,6 +773,33 @@ public class FightSettingsUserControlModel : TaskViewModel return value; } + public override (AsstTaskType Type, JObject Params) Serialize() + { + var task = new AsstFightTask() + { + Stage = Stage, + Medicine = UseMedicine ? MedicineNumber : 0, + Stone = UseStone ? StoneNumber : 0, + Series = Series, + MaxTimes = HasTimesLimited ? MaxTimes : int.MaxValue, + ExpiringMedicine = UseExpiringMedicine ? 9999 : 0, + IsDrGrandet = IsDrGrandet, + ReportToPenguin = SettingsViewModel.GameSettings.EnablePenguin, + ReportToYituliu = SettingsViewModel.GameSettings.EnableYituliu, + PenguinId = SettingsViewModel.GameSettings.PenguinId, + YituliuId = SettingsViewModel.GameSettings.PenguinId, + ServerType = Instances.SettingsViewModel.ServerType, + ClientType = SettingsViewModel.GameSettings.ClientType, + }; + + if (IsSpecifiedDrops) + { + task.Drops.Add(DropsItemId, DropsQuantity); + } + + return task.Serialize(); + } + #region 双入口设置可见性 private bool _customInfrastPlanShowInFightSettings = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.CustomInfrastPlanShowInFightSettings, bool.FalseString));