mirror of
https://github.com/jie65535/GrasscutterCommandGenerator.git
synced 2025-12-18 10:52:38 +08:00
Optimized implementation
This commit is contained in:
@@ -26,13 +26,14 @@ using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Text.Json;
|
||||
|
||||
using GrasscutterTools.DispatchServer;
|
||||
using GrasscutterTools.Game;
|
||||
using GrasscutterTools.GOOD;
|
||||
using GrasscutterTools.OpenCommand;
|
||||
using GrasscutterTools.Properties;
|
||||
using GrasscutterTools.Utils;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace GrasscutterTools.Forms
|
||||
{
|
||||
@@ -210,75 +211,51 @@ namespace GrasscutterTools.Forms
|
||||
OpenFileDialog openFileDialog1 = new OpenFileDialog();
|
||||
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
if (DialogResult.Yes != MessageBox.Show(Resources.GOODImportText + openFileDialog1.FileName + "?",
|
||||
Resources.GOODImportTitle, MessageBoxButtons.YesNo))
|
||||
return;
|
||||
try
|
||||
{
|
||||
DialogResult dr = MessageBox.Show(Resources.GOODImportText + openFileDialog1.FileName + "?",
|
||||
Resources.GOODImportTitle, MessageBoxButtons.YesNo);
|
||||
switch (dr)
|
||||
{
|
||||
case DialogResult.Yes:
|
||||
break;
|
||||
case DialogResult.No:
|
||||
return;
|
||||
}
|
||||
var sr = new StreamReader(openFileDialog1.FileName);
|
||||
var commands_list = new List<String>();
|
||||
var doc = JsonDocument.Parse(sr.ReadToEnd());
|
||||
GOOD.GOOD good = JsonConvert.DeserializeObject<GOOD.GOOD>(File.ReadAllText(openFileDialog1.FileName));
|
||||
var commands_list = new List<string>();
|
||||
|
||||
JsonElement characters = doc.RootElement.GetProperty("characters");
|
||||
foreach (JsonElement character in characters.EnumerateArray())
|
||||
foreach (var character in good.Characters)
|
||||
{
|
||||
var character_name = character.GetProperty("key").GetString();
|
||||
var character_level = character.GetProperty("level").GetInt32().ToString();
|
||||
var character_constellation = character.GetProperty("constellation").GetInt32().ToString();
|
||||
if (character_name != "Traveler")
|
||||
if (character.Name != "Traveler")
|
||||
{
|
||||
var character_id = GameData.GOODAvatars[character_name]; // TODO: build separate GOOD-compatible database
|
||||
commands_list.Add("/give " + character_id + " lv" + character_level + "c" + character_constellation);
|
||||
var character_id = GOODData.Avatars[character.Name];
|
||||
commands_list.Add("/give " + character_id + " lv" + character.Level + "c" + character.Constellation);
|
||||
// TODO: Implement command to set talent level when giving character in Grasscutter
|
||||
}
|
||||
}
|
||||
|
||||
JsonElement weapons = doc.RootElement.GetProperty("weapons");
|
||||
foreach (JsonElement weapon in weapons.EnumerateArray())
|
||||
foreach (var weapon in good.Weapons)
|
||||
{
|
||||
var weapon_name = weapon.GetProperty("key").GetString();
|
||||
var weapon_level = weapon.GetProperty("level").GetInt32().ToString();
|
||||
var weapon_refinement = weapon.GetProperty("refinement").GetInt32().ToString();
|
||||
|
||||
var weapon_id = GameData.GOODWeapons[weapon_name];
|
||||
commands_list.Add("/give " + weapon_id + " lv" + weapon_level + "r" + weapon_refinement);
|
||||
var weapon_id = GOODData.Weapons[weapon.Name];
|
||||
commands_list.Add("/give " + weapon_id + " lv" + weapon.Level + "r" + weapon.RefinementLevel);
|
||||
// TODO: Implement command to give weapon directly to character in Grasscutter
|
||||
}
|
||||
|
||||
JsonElement artifacts = doc.RootElement.GetProperty("artifacts");
|
||||
foreach (JsonElement artifact in artifacts.EnumerateArray())
|
||||
foreach (var artifact in good.Artifacts)
|
||||
{
|
||||
var artifact_set = artifact.GetProperty("setKey").GetString();
|
||||
var artifact_slot = artifact.GetProperty("slotKey").GetString();
|
||||
var artifact_rarity = artifact.GetProperty("rarity").GetInt32();
|
||||
var artifact_level = artifact.GetProperty("level").GetInt32().ToString();
|
||||
var artifact_mainStat = artifact.GetProperty("mainStatKey").GetString();
|
||||
|
||||
var artifact_slot_map = new Dictionary<string, string> {
|
||||
{"goblet", "1"}, {"plume", "2"}, {"circlet", "3"}, {"flower", "4"}, {"sands", "5"}
|
||||
};
|
||||
|
||||
// Format: set rarity slot
|
||||
var artifact_id = GameData.GOODArtifactCats[artifact_set].ToString() + artifact_rarity.ToString() + artifact_slot_map[artifact_slot] + "4";
|
||||
var artifact_mainStat_id = GameData.GOODArtifactMainAttribution[artifact_mainStat];
|
||||
var artifact_id = GOODData.ArtifactCats[artifact.SetName].ToString() + artifact.Rarity.ToString() + artifact_slot_map[artifact.GearSlot] + "4";
|
||||
var artifact_mainStat_id = GOODData.ArtifactMainAttribution[artifact.MainStat];
|
||||
var artifact_substats = "";
|
||||
var artifact_substat_prefix = artifact_rarity + "0";
|
||||
var artifact_substat_prefix = artifact.Rarity + "0";
|
||||
int substat_count = 0;
|
||||
foreach (JsonElement substat in artifact.GetProperty("substats").EnumerateArray())
|
||||
foreach (var substat in artifact.SubStats)
|
||||
{
|
||||
var substat_value = substat.GetProperty("value").GetDouble();
|
||||
if (substat_value == 0)
|
||||
if (substat.Value <= 0)
|
||||
continue;
|
||||
substat_count++;
|
||||
var substat_key = substat.GetProperty("key").GetString();
|
||||
var substat_key_id = GameData.GOODArtifactSubAttribution[substat_key];
|
||||
var substat_indices = ArtifactUtils.SplitSubstats(substat_key, artifact_rarity, substat_value);
|
||||
var substat_key = substat.Stat;
|
||||
var substat_key_id = GOODData.ArtifactSubAttribution[substat_key];
|
||||
var substat_indices = ArtifactUtils.SplitSubstats(substat_key, artifact.Rarity, substat.Value);
|
||||
|
||||
foreach(int index in substat_indices)
|
||||
{
|
||||
@@ -288,35 +265,12 @@ namespace GrasscutterTools.Forms
|
||||
|
||||
// HACK: Add def+2 substat to counteract Grasscutter automatically adding another substat
|
||||
if (substat_count == 4)
|
||||
{
|
||||
artifact_substats += "101081 ";
|
||||
}
|
||||
commands_list.Add("/give " + artifact_id + " lv" + artifact_level + " " + artifact_mainStat_id + " " + artifact_substats);
|
||||
commands_list.Add("/give " + artifact_id + " lv" + artifact.Level + " " + artifact_mainStat_id + " " + artifact_substats);
|
||||
// TODO: Implement command to give artifact directly to character in Grasscutter
|
||||
}
|
||||
|
||||
ExpandCommandRunLog();
|
||||
foreach (string command in commands_list)
|
||||
{
|
||||
TxtCommandRunLog.AppendText(">");
|
||||
TxtCommandRunLog.AppendText(command);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
try
|
||||
{
|
||||
var msg = await OC.Invoke(command.Substring(1));
|
||||
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TxtCommandRunLog.AppendText("Error: ");
|
||||
TxtCommandRunLog.AppendText(ex.Message);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
break;
|
||||
}
|
||||
TxtCommandRunLog.ScrollToCaret();
|
||||
}
|
||||
|
||||
await RunCommands(commands_list.ToArray());
|
||||
MessageBox.Show(Resources.GOODImportSuccess);
|
||||
}
|
||||
catch (SecurityException ex)
|
||||
@@ -1217,42 +1171,51 @@ namespace GrasscutterTools.Forms
|
||||
|
||||
private async void BtnInvokeOpenCommand_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (OC == null || !OC.CanInvoke)
|
||||
{
|
||||
ShowTip(Resources.RequireOpenCommandTip, BtnInvokeOpenCommand);
|
||||
TCMain.SelectedTab = TPRemoteCall;
|
||||
return;
|
||||
}
|
||||
if (TxtCommand.Text.Length < 2)
|
||||
{
|
||||
ShowTip(Resources.CommandContentCannotBeEmpty, TxtCommand);
|
||||
return;
|
||||
}
|
||||
await RunCommands(TxtCommand.Text);
|
||||
}
|
||||
|
||||
private async Task<bool> RunCommands(params string[] commands)
|
||||
{
|
||||
if (OC == null || !OC.CanInvoke)
|
||||
{
|
||||
ShowTip(Resources.RequireOpenCommandTip, BtnInvokeOpenCommand);
|
||||
TCMain.SelectedTab = TPRemoteCall;
|
||||
return false;
|
||||
}
|
||||
|
||||
ExpandCommandRunLog();
|
||||
TxtCommandRunLog.AppendText(">");
|
||||
TxtCommandRunLog.AppendText(TxtCommand.Text);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
var cmd = TxtCommand.Text.Substring(1);
|
||||
var btn = sender as Button;
|
||||
btn.Enabled = false;
|
||||
try
|
||||
BtnInvokeOpenCommand.Enabled = false;
|
||||
BtnInvokeOpenCommand.Cursor = Cursors.WaitCursor;
|
||||
foreach (var command in commands)
|
||||
{
|
||||
var msg = await OC.Invoke(cmd);
|
||||
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
|
||||
TxtCommandRunLog.AppendText(">");
|
||||
TxtCommandRunLog.AppendText(command);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
//ShowTip(string.IsNullOrEmpty(msg) ? "OK" : msg, btn);
|
||||
var cmd = command.Substring(1);
|
||||
try
|
||||
{
|
||||
var msg = await OC.Invoke(cmd);
|
||||
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TxtCommandRunLog.AppendText("Error: ");
|
||||
TxtCommandRunLog.AppendText(ex.Message);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return false;
|
||||
}
|
||||
TxtCommandRunLog.ScrollToCaret();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TxtCommandRunLog.AppendText("Error: ");
|
||||
TxtCommandRunLog.AppendText(ex.Message);
|
||||
TxtCommandRunLog.AppendText(Environment.NewLine);
|
||||
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
TxtCommandRunLog.ScrollToCaret();
|
||||
btn.Cursor = Cursors.Default;
|
||||
btn.Enabled = true;
|
||||
BtnInvokeOpenCommand.Cursor = Cursors.Default;
|
||||
BtnInvokeOpenCommand.Enabled = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
private const int TxtCommandRunLogMinHeight = 150;
|
||||
|
||||
Reference in New Issue
Block a user