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;
if (CmbMainAttribution.SelectedIndex < 0)
{
if (Check(CommandVersion.V1_2_2))
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value}");
else
SetCommand("/giveart", $"{id} {NUDArtifactLevel.Value}");
@ -746,7 +746,7 @@ namespace GrasscutterTools.Forms
subAttrs += $"{kv.Key} ";
}
}
if (Check(CommandVersion.V1_2_2))
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value} {mainAttr} {subAttrs}");
else
SetCommand("/giveart", $"{id} {mainAttr} {subAttrs}{NUDArtifactLevel.Value}");
@ -783,7 +783,7 @@ namespace GrasscutterTools.Forms
/// </summary>
private void ChangeTPArtifact()
{
if (Check(CommandVersion.V1_2_2))
if (CommandVersion.Check(CommandVersion.V1_2_2))
{
NUDArtifactLevel.Minimum = 0;
NUDArtifactLevel.Maximum = 20;
@ -826,7 +826,7 @@ namespace GrasscutterTools.Forms
if (!string.IsNullOrEmpty(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}");
else
SetCommand("/give", $"{id} {NUDWeaponAmout.Value} {NUDWeaponLevel.Value} {NUDWeaponRefinement.Value}");
@ -881,7 +881,7 @@ namespace GrasscutterTools.Forms
else
{
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}");
else
SetCommand("/give", $"{id} {NUDGameItemAmout.Value} {NUDGameItemLevel.Value}");
@ -1048,12 +1048,12 @@ namespace GrasscutterTools.Forms
/// <param name="level">等级</param>
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];
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];
SetCommand("/give", $"{avatarId} lv{level} c{constellation}");
@ -1075,7 +1075,7 @@ namespace GrasscutterTools.Forms
var level = NUDAvatarLevel.Value;
var constellation = NUDAvatarConstellation.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}");
else
SetCommand("/give avatars", $"lv{level} c{constellation}");
@ -1150,27 +1150,54 @@ namespace GrasscutterTools.Forms
#region - Spawns -
#region -- --
/// <summary>
/// 初始化实体列表
/// </summary>
private void InitEntityList()
{
FLPEntityType.SuspendLayout();
FLPEntityType.Controls.Clear();
foreach (var m in GameData.Monsters.Concat(GameData.Gatgets))
// 初始化列表类型过滤器
MenuSpawnEntityFilter.SuspendLayout();
MenuSpawnEntityFilter.Items.Clear();
void AddTypes(ItemMapGroup group)
{
var rb = new RadioButton
foreach (var kv in group)
{
AutoSize = true,
Text = m.Key,
Tag = m.Value.Lines
};
rb.CheckedChanged += RbEntity_CheckedChanged;
FLPEntityType.Controls.Add(rb);
var item = new ToolStripMenuItem
{
Text = kv.Key,
Tag = kv.Value.Lines,
};
item.Click += OnEntityTypeFilterClick;
MenuSpawnEntityFilter.Items.Add(item);
}
}
FLPEntityType.ResumeLayout();
if (FLPEntityType.Controls.Count > 0)
(FLPEntityType.Controls[0] as RadioButton).Checked = true;
//MenuSpawnEntityFilter.Items.Add(new ToolStripLabel("Monsters"));
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>
@ -1178,14 +1205,7 @@ namespace GrasscutterTools.Forms
/// </summary>
private void LoadEntityList()
{
foreach (RadioButton rb in FLPEntityType.Controls)
{
if (rb.Checked)
{
UIUtil.ListBoxFilter(ListEntity, rb.Tag as string[], TxtEntityFilter.Text);
break;
}
}
UIUtil.ListBoxFilter(ListEntity, SelectedEntityTypeLines, TxtEntityFilter.Text);
}
/// <summary>
@ -1197,45 +1217,39 @@ namespace GrasscutterTools.Forms
}
/// <summary>
/// 生成召唤实体命令
/// 实体列表类型过滤按钮点击时触发
/// </summary>
/// <returns>是否生成成功</returns>
private bool GenSpawnEntityCommand()
private void BtnFilterEntity_Click(object sender, EventArgs e)
{
var selectedItem = ListEntity.SelectedItem as string;
if (!string.IsNullOrEmpty(selectedItem))
MenuSpawnEntityFilter.Show(BtnFilterEntity, 0, BtnFilterEntity.Height);
}
/// <summary>
/// 实体列表选中项改变时触发
/// </summary>
private void ListEntity_SelectedIndexChanged(object sender, EventArgs e)
{
// 根据当前所在页面确定要做的事情
// 攻击修改界面
if (TCSpawnSettings.SelectedTab == TPAttackModArgs)
{
var id = ItemMap.ToId(selectedItem);
//// 自定义攻击Gadget特供版
//SetCommand("/at", $"set n {id}");
//return true;
if (Check(CommandVersion.V1_3_1))
SetCommand("/spawn", $"{id} x{NUDEntityAmout.Value} lv{NUDEntityLevel.Value}" + (ChkInfiniteHP.Checked ? " hp0" : ""));
else
SetCommand("/spawn", $"{id} {NUDEntityAmout.Value} {NUDEntityLevel.Value}");
return true;
OnAttackModifierInputChanged(sender, e);
}
// 攻击注入界面
else if (TCSpawnSettings.SelectedTab == TPAttackInfusedArgs)
{
// 无事发生,因为要页面上点击按钮才会生成命令
}
// 生成参数界面 或其它
else
{
// 触发输入改变事件
SpawnEntityInputChanged(sender, e);
}
return false;
}
/// <summary>
/// 生成页面输入改变时触发
/// </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();
}
#endregion
#region -- --
@ -1294,9 +1308,10 @@ namespace GrasscutterTools.Forms
/// </summary>
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);
ListSpawnLogs.Items.Add(cmd.Name);
SaveSpawnRecord();
@ -1331,6 +1346,140 @@ namespace GrasscutterTools.Forms
#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 -
#region - Scenes -
@ -1370,7 +1519,7 @@ namespace GrasscutterTools.Forms
// 可以直接弃用 scene 命令
var name = ListScenes.SelectedItem as string;
var id = ItemMap.ToId(name);
if (Check(CommandVersion.V1_2_2))
if (CommandVersion.Check(CommandVersion.V1_2_2))
{
SetCommand("/scene", id.ToString());
}
@ -1392,7 +1541,7 @@ namespace GrasscutterTools.Forms
{
if (CmbClimateType.SelectedIndex < 0)
return;
if (Check(CommandVersion.V1_2_2))
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/weather", CmbClimateType.SelectedIndex < climateTypes.Length ? climateTypes[CmbClimateType.SelectedIndex] : "none");
else
SetCommand("/weather", $"0 {CmbClimateType.SelectedIndex}");
@ -1957,13 +2106,6 @@ namespace GrasscutterTools.Forms
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 -
#region - Command Logs -
@ -2313,7 +2455,7 @@ namespace GrasscutterTools.Forms
{
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);

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,12 @@ namespace GrasscutterTools.Game
/// </summary>
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 -
@ -120,11 +126,16 @@ namespace GrasscutterTools.Game
/// </summary>
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...
/// <summary>
/// 2022/10/18
/// Date
/// </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[] {
V1_2_1,
@ -135,7 +146,8 @@ namespace GrasscutterTools.Game
V1_4_0,
V1_4_1,
V1_4_2,
//V1_4_3,
V1_4_3,
//V1_4_4,
};
#endregion - Version List -

View File

@ -32,7 +32,7 @@ namespace GrasscutterTools.Game
AvatarColors = new ItemMap(Resources.AvatarColor);
Items = new ItemMap(Resources.Item);
Monsters = new ItemMapGroup(Resources.Monsters);
Gatgets = new ItemMapGroup(Resources.Gadget);
Gadgets = new ItemMapGroup(Resources.Gadget);
Scenes = new ItemMap(Resources.Scene);
Weapons = new ItemMap(Resources.Weapon);
WeaponColors = new ItemMap(Resources.WeaponColor);
@ -58,7 +58,7 @@ namespace GrasscutterTools.Game
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; }

View File

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

View File

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