Impl AttackModifier Plugin Commands (#140, #141)

Update version to v1.7.3
Update CommandVersion to v1.4.3
This commit is contained in:
2022-11-06 20:15:20 +08:00
parent cd25afe0c7
commit 42e5c94601
7 changed files with 8799 additions and 6591 deletions

File diff suppressed because it is too large Load Diff

View File

@ -714,7 +714,7 @@ namespace GrasscutterTools.Forms
id = id / 1000 * 1000 + (int)NUDArtifactStars.Value * 100 + id % 100; id = id / 1000 * 1000 + (int)NUDArtifactStars.Value * 100 + id % 100;
if (CmbMainAttribution.SelectedIndex < 0) if (CmbMainAttribution.SelectedIndex < 0)
{ {
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value}"); SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value}");
else else
SetCommand("/giveart", $"{id} {NUDArtifactLevel.Value}"); SetCommand("/giveart", $"{id} {NUDArtifactLevel.Value}");
@ -746,7 +746,7 @@ namespace GrasscutterTools.Forms
subAttrs += $"{kv.Key} "; subAttrs += $"{kv.Key} ";
} }
} }
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value} {mainAttr} {subAttrs}"); SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value} {mainAttr} {subAttrs}");
else else
SetCommand("/giveart", $"{id} {mainAttr} {subAttrs}{NUDArtifactLevel.Value}"); SetCommand("/giveart", $"{id} {mainAttr} {subAttrs}{NUDArtifactLevel.Value}");
@ -783,7 +783,7 @@ namespace GrasscutterTools.Forms
/// </summary> /// </summary>
private void ChangeTPArtifact() private void ChangeTPArtifact()
{ {
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
{ {
NUDArtifactLevel.Minimum = 0; NUDArtifactLevel.Minimum = 0;
NUDArtifactLevel.Maximum = 20; NUDArtifactLevel.Maximum = 20;
@ -826,7 +826,7 @@ namespace GrasscutterTools.Forms
if (!string.IsNullOrEmpty(name)) if (!string.IsNullOrEmpty(name))
{ {
var id = ItemMap.ToId(name); var id = ItemMap.ToId(name);
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} x{NUDWeaponAmout.Value} lv{NUDWeaponLevel.Value} r{NUDWeaponRefinement.Value}"); SetCommand("/give", $"{id} x{NUDWeaponAmout.Value} lv{NUDWeaponLevel.Value} r{NUDWeaponRefinement.Value}");
else else
SetCommand("/give", $"{id} {NUDWeaponAmout.Value} {NUDWeaponLevel.Value} {NUDWeaponRefinement.Value}"); SetCommand("/give", $"{id} {NUDWeaponAmout.Value} {NUDWeaponLevel.Value} {NUDWeaponRefinement.Value}");
@ -881,7 +881,7 @@ namespace GrasscutterTools.Forms
else else
{ {
NUDGameItemLevel.Enabled = true; NUDGameItemLevel.Enabled = true;
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} x{NUDGameItemAmout.Value} lv{NUDGameItemLevel.Value}"); SetCommand("/give", $"{id} x{NUDGameItemAmout.Value} lv{NUDGameItemLevel.Value}");
else else
SetCommand("/give", $"{id} {NUDGameItemAmout.Value} {NUDGameItemLevel.Value}"); SetCommand("/give", $"{id} {NUDGameItemAmout.Value} {NUDGameItemLevel.Value}");
@ -1048,12 +1048,12 @@ namespace GrasscutterTools.Forms
/// <param name="level">等级</param> /// <param name="level">等级</param>
private void GenAvatar(int level, int constellation, int skillLevel) private void GenAvatar(int level, int constellation, int skillLevel)
{ {
if (Check(CommandVersion.V1_4_1)) if (CommandVersion.Check(CommandVersion.V1_4_1))
{ {
int avatarId = GameData.Avatars.Ids[CmbAvatar.SelectedIndex]; int avatarId = GameData.Avatars.Ids[CmbAvatar.SelectedIndex];
SetCommand("/give", $"{avatarId} lv{level} c{constellation} sl{skillLevel}"); SetCommand("/give", $"{avatarId} lv{level} c{constellation} sl{skillLevel}");
} }
else if (Check(CommandVersion.V1_2_2)) else if (CommandVersion.Check(CommandVersion.V1_2_2))
{ {
int avatarId = GameData.Avatars.Ids[CmbAvatar.SelectedIndex]; int avatarId = GameData.Avatars.Ids[CmbAvatar.SelectedIndex];
SetCommand("/give", $"{avatarId} lv{level} c{constellation}"); SetCommand("/give", $"{avatarId} lv{level} c{constellation}");
@ -1075,7 +1075,7 @@ namespace GrasscutterTools.Forms
var level = NUDAvatarLevel.Value; var level = NUDAvatarLevel.Value;
var constellation = NUDAvatarConstellation.Value; var constellation = NUDAvatarConstellation.Value;
var skillLevel = NUDAvatarSkillLevel.Value; var skillLevel = NUDAvatarSkillLevel.Value;
if (Check(CommandVersion.V1_4_1)) if (CommandVersion.Check(CommandVersion.V1_4_1))
SetCommand("/give avatars", $"lv{level} c{constellation} sl{skillLevel}"); SetCommand("/give avatars", $"lv{level} c{constellation} sl{skillLevel}");
else else
SetCommand("/give avatars", $"lv{level} c{constellation}"); SetCommand("/give avatars", $"lv{level} c{constellation}");
@ -1150,27 +1150,54 @@ namespace GrasscutterTools.Forms
#region - Spawns - #region - Spawns -
#region -- --
/// <summary> /// <summary>
/// 初始化实体列表 /// 初始化实体列表
/// </summary> /// </summary>
private void InitEntityList() private void InitEntityList()
{ {
FLPEntityType.SuspendLayout(); // 初始化列表类型过滤器
FLPEntityType.Controls.Clear(); MenuSpawnEntityFilter.SuspendLayout();
foreach (var m in GameData.Monsters.Concat(GameData.Gatgets)) MenuSpawnEntityFilter.Items.Clear();
void AddTypes(ItemMapGroup group)
{ {
var rb = new RadioButton foreach (var kv in group)
{ {
AutoSize = true, var item = new ToolStripMenuItem
Text = m.Key, {
Tag = m.Value.Lines Text = kv.Key,
Tag = kv.Value.Lines,
}; };
rb.CheckedChanged += RbEntity_CheckedChanged; item.Click += OnEntityTypeFilterClick;
FLPEntityType.Controls.Add(rb); MenuSpawnEntityFilter.Items.Add(item);
} }
FLPEntityType.ResumeLayout(); }
if (FLPEntityType.Controls.Count > 0) //MenuSpawnEntityFilter.Items.Add(new ToolStripLabel("Monsters"));
(FLPEntityType.Controls[0] as RadioButton).Checked = true; AddTypes(GameData.Monsters);
MenuSpawnEntityFilter.Items.Add(new ToolStripSeparator());
//MenuSpawnEntityFilter.Items.Add(new ToolStripLabel("Gadgets"));
AddTypes(GameData.Gadgets);
MenuSpawnEntityFilter.ResumeLayout();
// 默认显示所有怪物
SelectedEntityTypeLines = GameData.Monsters.AllLines.ToArray();
LoadEntityList();
}
/// <summary>
/// 当前选中的实体类型行
/// </summary>
private string[] SelectedEntityTypeLines;
/// <summary>
/// 实体类型过滤器类型选中时触发
/// </summary>
private void OnEntityTypeFilterClick(object sender, EventArgs e)
{
var btn = sender as ToolStripMenuItem;
SelectedEntityTypeLines = btn.Tag as string[];
LoadEntityList();
} }
/// <summary> /// <summary>
@ -1178,14 +1205,7 @@ namespace GrasscutterTools.Forms
/// </summary> /// </summary>
private void LoadEntityList() private void LoadEntityList()
{ {
foreach (RadioButton rb in FLPEntityType.Controls) UIUtil.ListBoxFilter(ListEntity, SelectedEntityTypeLines, TxtEntityFilter.Text);
{
if (rb.Checked)
{
UIUtil.ListBoxFilter(ListEntity, rb.Tag as string[], TxtEntityFilter.Text);
break;
}
}
} }
/// <summary> /// <summary>
@ -1197,45 +1217,39 @@ namespace GrasscutterTools.Forms
} }
/// <summary> /// <summary>
/// 生成召唤实体命令 /// 实体列表类型过滤按钮点击时触发
/// </summary> /// </summary>
/// <returns>是否生成成功</returns> private void BtnFilterEntity_Click(object sender, EventArgs e)
private bool GenSpawnEntityCommand()
{ {
var selectedItem = ListEntity.SelectedItem as string; MenuSpawnEntityFilter.Show(BtnFilterEntity, 0, BtnFilterEntity.Height);
if (!string.IsNullOrEmpty(selectedItem)) }
/// <summary>
/// 实体列表选中项改变时触发
/// </summary>
private void ListEntity_SelectedIndexChanged(object sender, EventArgs e)
{ {
var id = ItemMap.ToId(selectedItem); // 根据当前所在页面确定要做的事情
//// 自定义攻击Gadget特供版 // 攻击修改界面
//SetCommand("/at", $"set n {id}"); if (TCSpawnSettings.SelectedTab == TPAttackModArgs)
//return true; {
OnAttackModifierInputChanged(sender, e);
if (Check(CommandVersion.V1_3_1)) }
SetCommand("/spawn", $"{id} x{NUDEntityAmout.Value} lv{NUDEntityLevel.Value}" + (ChkInfiniteHP.Checked ? " hp0" : "")); // 攻击注入界面
else if (TCSpawnSettings.SelectedTab == TPAttackInfusedArgs)
{
// 无事发生,因为要页面上点击按钮才会生成命令
}
// 生成参数界面 或其它
else else
SetCommand("/spawn", $"{id} {NUDEntityAmout.Value} {NUDEntityLevel.Value}"); {
return true; // 触发输入改变事件
SpawnEntityInputChanged(sender, e);
} }
return false;
} }
/// <summary> #endregion
/// 生成页面输入改变时触发
/// </summary>
private void SpawnEntityInputChanged(object sender, EventArgs e)
{
GenSpawnEntityCommand();
}
/// <summary>
/// 列表过滤选项切换时触发
/// </summary>
private void RbEntity_CheckedChanged(object sender, EventArgs e)
{
if ((sender as RadioButton).Checked)
LoadEntityList();
}
#region -- -- #region -- --
@ -1294,9 +1308,10 @@ namespace GrasscutterTools.Forms
/// </summary> /// </summary>
private void BtnSaveSpawnLog_Click(object sender, EventArgs e) private void BtnSaveSpawnLog_Click(object sender, EventArgs e)
{ {
if (GenSpawnEntityCommand()) // 不再重新生成,直接记录当前命令行的内容
//if (GenSpawnEntityCommand())
{ {
var cmd = new GameCommand($"{ListEntity.SelectedItem} Lv{NUDEntityLevel.Value} x{NUDEntityAmout.Value}", TxtCommand.Text); var cmd = new GameCommand($"{ListEntity.SelectedItem} | {TxtCommand.Text}", TxtCommand.Text);
SpawnCommands.Add(cmd); SpawnCommands.Add(cmd);
ListSpawnLogs.Items.Add(cmd.Name); ListSpawnLogs.Items.Add(cmd.Name);
SaveSpawnRecord(); SaveSpawnRecord();
@ -1331,6 +1346,140 @@ namespace GrasscutterTools.Forms
#endregion -- -- #endregion -- --
#region -- --
/// <summary>
/// 生成页面输入改变时触发
/// </summary>
private void SpawnEntityInputChanged(object sender, EventArgs e)
{
if (ListEntity.SelectedIndex == -1) return;
var selectedItem = ListEntity.SelectedItem as string;
var id = ItemMap.ToId(selectedItem);
if (CommandVersion.Check(CommandVersion.V1_3_1))
{
var args = id.ToString();
void CheckAndConnect(NumericUpDown input, int value, string prefix)
{
if (input.Value > value)
args += prefix + input.Value;
}
CheckAndConnect(NUDEntityAmout, 1, " x");
CheckAndConnect(NUDEntityLevel, 1, " lv");
CheckAndConnect(NUDEntityHp, -1, " hp");
CheckAndConnect(NUDEntityMaxHp, 0, " maxhp");
CheckAndConnect(NUDEntityAtk, -1, " atk");
CheckAndConnect(NUDEntityDef, -1, " def");
if (NUDEntityPosX.Value != 0 || NUDEntityPosY.Value != 0 || NUDEntityPosZ.Value != 0)
args += $" {NUDEntityPosX.Value} {NUDEntityPosY.Value} {NUDEntityPosZ.Value}";
SetCommand("/spawn", args);
}
else
{
SetCommand("/spawn", $"{id} {NUDEntityAmout.Value} {NUDEntityLevel.Value}");
}
}
#endregion
#region -- --
/// <summary>
/// 攻击修改插件链接标签点击时触发
/// </summary>
private void LnkAttackModifierPlugin_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
OpenURL("https://github.com/NotThorny/AttackModifier");
}
/// <summary>
/// 攻击修改输入改变事件
/// </summary>
private void OnAttackModifierInputChanged(object sender, EventArgs e)
{
if (ListEntity.SelectedIndex == -1) return;
var selectedItem = ListEntity.SelectedItem as string;
var id = ItemMap.ToId(selectedItem);
char skill;
if (RbAtE.Checked)
{
skill = 'e';
TxtAtEntityE.Text = selectedItem;
}
else if (RbAtQ.Checked)
{
skill = 'q';
TxtAtEntityQ.Text = selectedItem;
}
else
{
skill = 'n';
TxtAtEntityN.Text = selectedItem;
}
SetCommand("/at", $"set {skill} {id}");
}
/// <summary>
/// 攻击修改页面命令事件
/// </summary>
private void OnAttackModifierCommand(object sender, EventArgs e)
{
SetCommand("/at", (sender as Control).Tag as string);
}
#endregion
#region -- --
/// <summary>
/// 攻击注入插件链接标签点击时触发
/// </summary>
private void LnkAttackInfusedWithItem_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
OpenURL("https://github.com/snoobi-seggs/AttackInfusedWithItem");
}
/// <summary>
/// 攻击注入页面命令事件
/// </summary>
private void OnAttackInfusedCommand(object sender, EventArgs e)
{
SetCommand("/at", (sender as Control).Tag as string);
}
/// <summary>
/// 点击攻击注入按钮时触发
/// </summary>
private void BtnAttackInfuse_Click(object sender, EventArgs e)
{
if (ListEntity.SelectedIndex == -1) return;
var selectedItem = ListEntity.SelectedItem as string;
var id = ItemMap.ToId(selectedItem);
var args = string.Empty;
var flag = false;
void ConnectArg(NumericUpDown input)
{
if (flag || input.Value != 0)
{
flag = true;
args = " " + input.Value + args;
}
}
ConnectArg(NUDAiwiRotateZ);
ConnectArg(NUDAiwiRotateY);
ConnectArg(NUDAiwiRotateX);
ConnectArg(NUDAiwiSpread);
ConnectArg(NUDAiwiCount);
ConnectArg(NUDAiwiHeight);
ConnectArg(NUDAiwiRadius);
SetCommand("/at", id.ToString() + args);
//SetCommand("/at", $"{id} {NUDAiwiRadius.Value} {NUDAiwiHeight.Value} {NUDAiwiCount.Value} {NUDAiwiSpread.Value} {NUDAiwiRotateX.Value} {NUDAiwiRotateY.Value} {NUDAiwiRotateZ.Value}");
}
#endregion
#endregion - Spawns - #endregion - Spawns -
#region - Scenes - #region - Scenes -
@ -1370,7 +1519,7 @@ namespace GrasscutterTools.Forms
// 可以直接弃用 scene 命令 // 可以直接弃用 scene 命令
var name = ListScenes.SelectedItem as string; var name = ListScenes.SelectedItem as string;
var id = ItemMap.ToId(name); var id = ItemMap.ToId(name);
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
{ {
SetCommand("/scene", id.ToString()); SetCommand("/scene", id.ToString());
} }
@ -1392,7 +1541,7 @@ namespace GrasscutterTools.Forms
{ {
if (CmbClimateType.SelectedIndex < 0) if (CmbClimateType.SelectedIndex < 0)
return; return;
if (Check(CommandVersion.V1_2_2)) if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/weather", CmbClimateType.SelectedIndex < climateTypes.Length ? climateTypes[CmbClimateType.SelectedIndex] : "none"); SetCommand("/weather", CmbClimateType.SelectedIndex < climateTypes.Length ? climateTypes[CmbClimateType.SelectedIndex] : "none");
else else
SetCommand("/weather", $"0 {CmbClimateType.SelectedIndex}"); SetCommand("/weather", $"0 {CmbClimateType.SelectedIndex}");
@ -1957,13 +2106,6 @@ namespace GrasscutterTools.Forms
TTip.Show(message, control, 0, control.Size.Height, 3000); TTip.Show(message, control, 0, control.Size.Height, 3000);
} }
/// <summary>
/// 检查命令版本
/// </summary>
/// <param name="version">最低要求版本</param>
/// <returns>当前版本是否满足</returns>
private bool Check(Version version) => CommandVersion.Current >= version;
#endregion - General - #endregion - General -
#region - Command Logs - #region - Command Logs -
@ -2313,7 +2455,7 @@ namespace GrasscutterTools.Forms
{ {
if (GOODData.Avatars.TryGetValue(character.Name, out var character_id)) if (GOODData.Avatars.TryGetValue(character.Name, out var character_id))
{ {
if (Check(CommandVersion.V1_4_1)) if (CommandVersion.Check(CommandVersion.V1_4_1))
{ {
// 取最低的技能等级 // 取最低的技能等级
var skillLevel = Math.Min(Math.Min(character.Talents.Auto, character.Talents.Skill), character.Talents.Burst); var skillLevel = Math.Min(Math.Min(character.Talents.Auto, character.Talents.Skill), character.Talents.Burst);

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,12 @@ namespace GrasscutterTools.Game
/// </summary> /// </summary>
public static CommandVersion Latest() => new CommandVersion(List[List.Length - 1]); public static CommandVersion Latest() => new CommandVersion(List[List.Length - 1]);
/// <summary>
/// 检查命令版本
/// </summary>
/// <param name="version">最低要求版本</param>
/// <returns>当前版本是否满足</returns>
public bool Check(Version version) => Current >= version;
#region - Version List - #region - Version List -
@ -120,11 +126,16 @@ namespace GrasscutterTools.Game
/// </summary> /// </summary>
public static readonly Version V1_4_2 = new Version(1, 4, 2); public static readonly Version V1_4_2 = new Version(1, 4, 2);
/// <summary>
/// 2022/11/15
/// </summary>
public static readonly Version V1_4_3 = new Version(1, 4, 3);
// More... // More...
/// <summary> /// <summary>
/// 2022/10/18 /// Date
/// </summary> /// </summary>
//public static readonly Version V1_4_3 = new Version(1, 4, 2); //public static readonly Version V1_4_4 = new Version(1, 4, 4);
public static Version[] List { get; } = new Version[] { public static Version[] List { get; } = new Version[] {
V1_2_1, V1_2_1,
@ -135,7 +146,8 @@ namespace GrasscutterTools.Game
V1_4_0, V1_4_0,
V1_4_1, V1_4_1,
V1_4_2, V1_4_2,
//V1_4_3, V1_4_3,
//V1_4_4,
}; };
#endregion - Version List - #endregion - Version List -

View File

@ -32,7 +32,7 @@ namespace GrasscutterTools.Game
AvatarColors = new ItemMap(Resources.AvatarColor); AvatarColors = new ItemMap(Resources.AvatarColor);
Items = new ItemMap(Resources.Item); Items = new ItemMap(Resources.Item);
Monsters = new ItemMapGroup(Resources.Monsters); Monsters = new ItemMapGroup(Resources.Monsters);
Gatgets = new ItemMapGroup(Resources.Gadget); Gadgets = new ItemMapGroup(Resources.Gadget);
Scenes = new ItemMap(Resources.Scene); Scenes = new ItemMap(Resources.Scene);
Weapons = new ItemMap(Resources.Weapon); Weapons = new ItemMap(Resources.Weapon);
WeaponColors = new ItemMap(Resources.WeaponColor); WeaponColors = new ItemMap(Resources.WeaponColor);
@ -58,7 +58,7 @@ namespace GrasscutterTools.Game
public static ItemMapGroup Monsters { get; private set; } public static ItemMapGroup Monsters { get; private set; }
public static ItemMapGroup Gatgets { get; private set; } public static ItemMapGroup Gadgets { get; private set; }
public static ItemMap Scenes { get; private set; } public static ItemMap Scenes { get; private set; }

View File

@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示: //通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.7.2")] [assembly: AssemblyVersion("1.7.3")]
[assembly: AssemblyFileVersion("1.7.0")] [assembly: AssemblyFileVersion("1.7.0")]

View File

@ -32,10 +32,13 @@ namespace GrasscutterTools.Utils
filter = filter.Trim(); filter = filter.Trim();
listBox.BeginUpdate(); listBox.BeginUpdate();
listBox.Items.Clear(); listBox.Items.Clear();
if (source != null && source.Length > 0)
{
if (string.IsNullOrEmpty(filter)) if (string.IsNullOrEmpty(filter))
listBox.Items.AddRange(source); listBox.Items.AddRange(source);
else else
listBox.Items.AddRange(source.Where(n => n.Contains(filter)).ToArray()); listBox.Items.AddRange(source.Where(n => n.Contains(filter)).ToArray());
}
listBox.EndUpdate(); listBox.EndUpdate();
} }
} }