This commit is contained in:
BruceChen 2022-10-26 08:54:54 +08:00
parent a1259edcae
commit f8aefaf129
39 changed files with 353 additions and 66 deletions

View file

@ -1,6 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Brigadier.NET;
using Microsoft.Extensions.Logging;
using MinecraftClient.Commands;
namespace MinecraftClient namespace MinecraftClient
{ {
@ -22,6 +25,8 @@ namespace MinecraftClient
/// </summary> /// </summary>
public abstract string CmdDesc { get; } public abstract string CmdDesc { get; }
public abstract void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher);
/// <summary> /// <summary>
/// Get the translated version of command description. /// Get the translated version of command description.
/// </summary> /// </summary>
@ -32,6 +37,24 @@ namespace MinecraftClient
return CmdUsage + s + Translations.TryGet(CmdDesc); return CmdUsage + s + Translations.TryGet(CmdDesc);
} }
public void LogUsage(Logger.ILogger logger)
{
logger.Info($"{Translations.Get("error.usage")}: {Settings.Config.Main.Advanced.InternalCmdChar.ToChar()}{CmdUsage}");
}
public static int LogExecuteResult(Logger.ILogger logger, bool result)
{
logger.Info(Translations.Get(result ? "general.done" : "general.fail"));
return result ? 1 : 0;
}
public static int LogExecuteResult(Logger.ILogger logger, int result)
{
logger.Info(Translations.Get(result > 0 ? "general.done" : "general.fail"));
return result;
}
/// <summary> /// <summary>
/// Usage message, eg: 'name [args]' /// Usage message, eg: 'name [args]'
/// </summary> /// </summary>

View file

@ -1,4 +1,7 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using Brigadier.NET;
using Brigadier.NET.Builder;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +11,48 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "animation <mainhand|offhand>"; } } public override string CmdUsage { get { return "animation <mainhand|offhand>"; } }
public override string CmdDesc { get { return "cmd.animation.desc"; } } public override string CmdDesc { get { return "cmd.animation.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
dispatcher.Register(l =>
l.Literal("help").Then(l =>
l.Literal(CmdName).Executes(c => {
LogUsage(handler.Log);
return 1;
})
)
);
dispatcher.Register(l =>
l.Literal(CmdName).Then(l =>
l.Literal("mainhand")
.Executes(c => {
return LogExecuteResult(handler.Log, handler.DoAnimation(0));
})
)
);
dispatcher.Register(l =>
l.Literal(CmdName).Then(l =>
l.Literal("0")
.Redirect(dispatcher.GetRoot().GetChild(CmdName).GetChild("mainhand"))
)
);
dispatcher.Register(l =>
l.Literal(CmdName).Then(l =>
l.Literal("offhand")
.Executes(c => {
return LogExecuteResult(handler.Log, handler.DoAnimation(1));
})
)
);
dispatcher.Register(l =>
l.Literal(CmdName).Then(l =>
l.Literal("1")
.Redirect(dispatcher.GetRoot().GetChild(CmdName).GetChild("offhand"))
)
);
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -13,6 +14,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "bed leave|sleep <x> <y> <z>|sleep <radius>"; } } public override string CmdUsage { get { return "bed leave|sleep <x> <y> <z>|sleep <radius>"; } }
public override string CmdDesc { get { return "cmd.bed.desc"; } } public override string CmdDesc { get { return "cmd.bed.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
string[] args = GetArgs(command); string[] args = GetArgs(command);

View file

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "blockinfo <x> <y> <z> [-s]"; } } public override string CmdUsage { get { return "blockinfo <x> <y> <z> [-s]"; } }
public override string CmdDesc { get { return "cmd.blockinfo.desc"; } } public override string CmdDesc { get { return "cmd.blockinfo.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetTerrainEnabled()) if (!handler.GetTerrainEnabled())

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "bots [list|unload <bot name|all>]"; } } public override string CmdUsage { get { return "bots [list|unload <bot name|all>]"; } }
public override string CmdDesc { get { return "cmd.bots.desc"; } } public override string CmdDesc { get { return "cmd.bots.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -9,6 +10,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "changeslot <1-9>"; } } public override string CmdUsage { get { return "changeslot <1-9>"; } }
public override string CmdDesc { get { return "cmd.changeSlot.desc"; } } public override string CmdDesc { get { return "cmd.changeSlot.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetInventoryEnabled()) if (!handler.GetInventoryEnabled())

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -12,6 +13,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "chunk status [chunkX chunkZ|locationX locationY locationZ]"; } } public override string CmdUsage { get { return "chunk status [chunkX chunkZ|locationX locationY locationZ]"; } }
public override string CmdDesc { get { return "cmd.chunk.desc"; } } public override string CmdDesc { get { return "cmd.chunk.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MinecraftClient.Commands
{
public class CommandSource
{
public string UserName { get; set; } = string.Empty;
}
}

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "connect <server> [account]"; } } public override string CmdUsage { get { return "connect <server> [account]"; } }
public override string CmdDesc { get { return "cmd.connect.desc"; } } public override string CmdDesc { get { return "cmd.connect.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "debug [on|off]"; } } public override string CmdUsage { get { return "debug [on|off]"; } }
public override string CmdDesc { get { return "cmd.debug.desc"; } } public override string CmdDesc { get { return "cmd.debug.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "dig <x> <y> <z>"; } } public override string CmdUsage { get { return "dig <x> <y> <z>"; } }
public override string CmdDesc { get { return "cmd.dig.desc"; } } public override string CmdDesc { get { return "cmd.dig.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetTerrainEnabled()) if (!handler.GetTerrainEnabled())

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Brigadier.NET;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -13,6 +14,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "/dropitem <itemtype>"; } } public override string CmdUsage { get { return "/dropitem <itemtype>"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetInventoryEnabled()) if (!handler.GetInventoryEnabled())

View file

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Brigadier.NET;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "enchant <top|middle|bottom>"; } } public override string CmdUsage { get { return "enchant <top|middle|bottom>"; } }
public override string CmdDesc { get { return "cmd.enchant.desc"; } } public override string CmdDesc { get { return "cmd.enchant.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetInventoryEnabled()) if (!handler.GetInventoryEnabled())

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
using Brigadier.NET;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
@ -13,6 +14,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "entity <id|entitytype> <attack|use>"; } } public override string CmdUsage { get { return "entity <id|entitytype> <attack|use>"; } }
public override string CmdDesc { get { return ""; } } public override string CmdDesc { get { return ""; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (handler.GetEntityHandlingEnabled()) if (handler.GetEntityHandlingEnabled())

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Brigadier.NET;
using DynamicExpresso; using DynamicExpresso;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -11,6 +12,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "execif <condition/expression> ---> <command>"; } } public override string CmdUsage { get { return "execif <condition/expression> ---> <command>"; } }
public override string CmdDesc { get { return "cmd.execif.desc"; } } public override string CmdDesc { get { return "cmd.execif.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "execmulti <command 1> -> <command2> -> <command 3> -> ..."; } } public override string CmdUsage { get { return "execmulti <command 1> -> <command2> -> <command 3> -> ..."; } }
public override string CmdDesc { get { return "cmd.execmulti.desc"; } } public override string CmdDesc { get { return "cmd.execmulti.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "exit"; } } public override string CmdUsage { get { return "exit"; } }
public override string CmdDesc { get { return "cmd.exit.desc"; } } public override string CmdDesc { get { return "cmd.exit.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars)
{ {
Program.Exit(); Program.Exit();

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "health"; } } public override string CmdUsage { get { return "health"; } }
public override string CmdDesc { get { return "cmd.health.desc"; } } public override string CmdDesc { get { return "cmd.health.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
return Translations.Get("cmd.health.response", handler.GetHealth(), handler.GetSaturation(), handler.GetLevel(), handler.GetTotalExperience()); return Translations.Get("cmd.health.response", handler.GetHealth(), handler.GetSaturation(), handler.GetLevel(), handler.GetTotalExperience());

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Brigadier.NET;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -13,6 +14,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return GetBasicUsage(); } } public override string CmdUsage { get { return GetBasicUsage(); } }
public override string CmdDesc { get { return "cmd.inventory.desc"; } } public override string CmdDesc { get { return "cmd.inventory.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (handler.GetInventoryEnabled()) if (handler.GetInventoryEnabled())

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -9,6 +10,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "list"; } } public override string CmdUsage { get { return "list"; } }
public override string CmdDesc { get { return "cmd.list.desc"; } } public override string CmdDesc { get { return "cmd.list.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
return Translations.Get("cmd.list.players", String.Join(", ", handler.GetOnlinePlayers())); return Translations.Get("cmd.list.players", String.Join(", ", handler.GetOnlinePlayers()));

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "log <text>"; } } public override string CmdUsage { get { return "log <text>"; } }
public override string CmdDesc { get { return "cmd.log.desc"; } } public override string CmdDesc { get { return "cmd.log.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -11,6 +12,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "look <x y z|yaw pitch|up|down|east|west|north|south>"; } } public override string CmdUsage { get { return "look <x y z|yaw pitch|up|down|east|west|north|south>"; } }
public override string CmdDesc { get { return "cmd.look.desc"; } } public override string CmdDesc { get { return "cmd.look.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (handler.GetTerrainEnabled()) if (handler.GetTerrainEnabled())

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -11,6 +12,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "move <on|off|get|up|down|east|west|north|south|center|x y z|gravity [on|off]> [-f]"; } } public override string CmdUsage { get { return "move <on|off|get|up|down|east|west|north|south|center|x y z|gravity [on|off]> [-f]"; } }
public override string CmdDesc { get { return "walk or start walking. \"-f\": force unsafe movements like falling or touching fire"; } } public override string CmdDesc { get { return "walk or start walking. \"-f\": force unsafe movements like falling or touching fire"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
List<string> args = GetArgs(command.ToLower()).ToList(); List<string> args = GetArgs(command.ToLower()).ToList();

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "reco [account]"; } } public override string CmdUsage { get { return "reco [account]"; } }
public override string CmdDesc { get { return "cmd.reco.desc"; } } public override string CmdDesc { get { return "cmd.reco.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient? handler, string command, Dictionary<string, object>? localVars)
{ {
string[] args = GetArgs(command); string[] args = GetArgs(command);

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "reload"; } } public override string CmdUsage { get { return "reload"; } }
public override string CmdDesc { get { return "cmd.reload.desc"; } } public override string CmdDesc { get { return "cmd.reload.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
handler.Log.Info(Translations.TryGet("cmd.reload.started")); handler.Log.Info(Translations.TryGet("cmd.reload.started"));

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "respawn"; } } public override string CmdUsage { get { return "respawn"; } }
public override string CmdDesc { get { return "cmd.respawn.desc"; } } public override string CmdDesc { get { return "cmd.respawn.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
handler.SendRespawnPacket(); handler.SendRespawnPacket();

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "script <scriptname>"; } } public override string CmdUsage { get { return "script <scriptname>"; } }
public override string CmdDesc { get { return "cmd.script.desc"; } } public override string CmdDesc { get { return "cmd.script.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "send <text>"; } } public override string CmdUsage { get { return "send <text>"; } }
public override string CmdDesc { get { return "cmd.send.desc"; } } public override string CmdDesc { get { return "cmd.send.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "set varname=value"; } } public override string CmdUsage { get { return "set varname=value"; } }
public override string CmdDesc { get { return "cmd.set.desc"; } } public override string CmdDesc { get { return "cmd.set.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -10,6 +11,10 @@ namespace MinecraftClient.Commands
public override string CmdDesc { get { return "cmd.setrnd.desc"; } } public override string CmdDesc { get { return "cmd.setrnd.desc"; } }
private static readonly Random rand = new(); private static readonly Random rand = new();
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (HasArg(command)) if (HasArg(command))

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -9,6 +10,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "Sneak"; } } public override string CmdUsage { get { return "Sneak"; } }
public override string CmdDesc { get { return "cmd.sneak.desc"; } } public override string CmdDesc { get { return "cmd.sneak.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (sneaking) if (sneaking)

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -9,6 +10,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "tps"; } } public override string CmdUsage { get { return "tps"; } }
public override string CmdDesc { get { return "cmd.tps.desc"; } } public override string CmdDesc { get { return "cmd.tps.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
var tps = Math.Round(handler.GetServerTPS(), 2); var tps = Math.Round(handler.GetServerTPS(), 2);

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
{ {
@ -8,6 +9,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "useitem"; } } public override string CmdUsage { get { return "useitem"; } }
public override string CmdDesc { get { return "cmd.useitem.desc"; } } public override string CmdDesc { get { return "cmd.useitem.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (handler.GetInventoryEnabled()) if (handler.GetInventoryEnabled())

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Brigadier.NET;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
namespace MinecraftClient.Commands namespace MinecraftClient.Commands
@ -9,6 +10,10 @@ namespace MinecraftClient.Commands
public override string CmdUsage { get { return "useblock <x> <y> <z>"; } } public override string CmdUsage { get { return "useblock <x> <y> <z>"; } }
public override string CmdDesc { get { return "cmd.useblock.desc"; } } public override string CmdDesc { get { return "cmd.useblock.desc"; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
if (!handler.GetTerrainEnabled()) if (!handler.GetTerrainEnabled())

View file

@ -183,6 +183,7 @@ namespace MinecraftClient
return; return;
var buffer = ConsoleInteractive.ConsoleReader.GetBufferContent(); var buffer = ConsoleInteractive.ConsoleReader.GetBufferContent();
ConsoleIO.WriteLine("AutoComplete " + buffer);
autocomplete_engine.AutoComplete(buffer.Text[..buffer.CursorPosition]); autocomplete_engine.AutoComplete(buffer.Text[..buffer.CursorPosition]);
} }
} }

View file

@ -2,9 +2,13 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Sockets; using System.Net.Sockets;
using System.Security.Cryptography.Pkcs;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using Brigadier.NET;
using Brigadier.NET.Exceptions;
using MinecraftClient.ChatBots; using MinecraftClient.ChatBots;
using MinecraftClient.Commands;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
using MinecraftClient.Logger; using MinecraftClient.Logger;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
@ -25,8 +29,10 @@ namespace MinecraftClient
{ {
public static int ReconnectionAttemptsLeft = 0; public static int ReconnectionAttemptsLeft = 0;
private static readonly List<string> cmd_names = new(); public static readonly CommandSource cmd_source = new();
private static readonly Dictionary<string, Command> cmds = new(); public static readonly CommandDispatcher<CommandSource> dispatcher = new();
//private static readonly List<string> cmd_names = new();
//private static readonly Dictionary<string, Command> cmds = new();
private readonly Dictionary<Guid, PlayerInfo> onlinePlayers = new(); private readonly Dictionary<Guid, PlayerInfo> onlinePlayers = new();
private static bool commandsLoaded = false; private static bool commandsLoaded = false;
@ -584,17 +590,18 @@ namespace MinecraftClient
/// <returns>True if successfully registered</returns> /// <returns>True if successfully registered</returns>
public bool RegisterCommand(string cmdName, string cmdDesc, string cmdUsage, ChatBot.CommandRunner callback) public bool RegisterCommand(string cmdName, string cmdDesc, string cmdUsage, ChatBot.CommandRunner callback)
{ {
if (cmds.ContainsKey(cmdName.ToLower())) // if (cmds.ContainsKey(cmdName.ToLower()))
{ // {
return false; // return false;
} // }
else // else
{ // {
Command cmd = new ChatBot.ChatBotCommand(cmdName, cmdDesc, cmdUsage, callback); // Command cmd = new ChatBot.ChatBotCommand(cmdName, cmdDesc, cmdUsage, callback);
cmds.Add(cmdName.ToLower(), cmd); // cmds.Add(cmdName.ToLower(), cmd);
cmd_names.Add(cmdName.ToLower()); // cmd_names.Add(cmdName.ToLower());
return true; // return true;
} // }
return true;
} }
/// <summary> /// <summary>
@ -608,13 +615,14 @@ namespace MinecraftClient
/// <returns></returns> /// <returns></returns>
public bool UnregisterCommand(string cmdName) public bool UnregisterCommand(string cmdName)
{ {
if (cmds.ContainsKey(cmdName.ToLower())) // if (cmds.ContainsKey(cmdName.ToLower()))
{ // {
cmds.Remove(cmdName.ToLower()); // cmds.Remove(cmdName.ToLower());
cmd_names.Remove(cmdName.ToLower()); // cmd_names.Remove(cmdName.ToLower());
return true; // return true;
} // }
else return false; // else return false;
return true;
} }
/// <summary> /// <summary>
@ -627,52 +635,79 @@ namespace MinecraftClient
public bool PerformInternalCommand(string command, ref string? response_msg, Dictionary<string, object>? localVars = null) public bool PerformInternalCommand(string command, ref string? response_msg, Dictionary<string, object>? localVars = null)
{ {
/* Process the provided command */ /* Process the provided command */
ParseResults<CommandSource> parse;
string command_name = command.Split(' ')[0].ToLower(); try
if (command_name == "help")
{ {
if (Command.HasArg(command)) parse = dispatcher.Parse(command, cmd_source);
{
string help_cmdname = Command.GetArgs(command)[0].ToLower();
if (help_cmdname == "help")
{
response_msg = Translations.Get("icmd.help");
}
else if (cmds.ContainsKey(help_cmdname))
{
response_msg = cmds[help_cmdname].GetCmdDescTranslated();
}
else response_msg = Translations.Get("icmd.unknown", command_name);
}
else response_msg = Translations.Get("icmd.list", String.Join(", ", cmd_names.ToArray()), Config.Main.Advanced.InternalCmdChar.ToChar());
} }
else if (cmds.ContainsKey(command_name)) catch (Exception e)
{ {
response_msg = cmds[command_name].Run(this, command, localVars); Log.Error(e.GetFullMessage());
return true;
foreach (ChatBot bot in bots.ToArray())
{
try
{
bot.OnInternalCommand(command_name, string.Join(" ", Command.GetArgs(command)), response_msg);
}
catch (Exception e)
{
if (e is not ThreadAbortException)
{
Log.Warn(Translations.Get("icmd.error", bot.ToString() ?? string.Empty, e.ToString()));
}
else throw; //ThreadAbortException should not be caught
}
}
}
else
{
response_msg = Translations.Get("icmd.unknown", command_name);
return false;
} }
return true; try
{
int res = dispatcher.Execute(parse);
Log.Info("res = " + res);
return true;
}
catch (CommandSyntaxException e)
{
Log.Warn(e.GetFullMessage());
return true;
}
catch (Exception e)
{
Log.Error(e.GetFullMessage());
return true;
}
//string command_name = command.Split(' ')[0].ToLower();
//if (command_name == "help")
//{
// if (Command.HasArg(command))
// {
// string help_cmdname = Command.GetArgs(command)[0].ToLower();
// if (help_cmdname == "help")
// {
// response_msg = Translations.Get("icmd.help");
// }
// else if (cmds.ContainsKey(help_cmdname))
// {
// response_msg = cmds[help_cmdname].GetCmdDescTranslated();
// }
// else response_msg = Translations.Get("icmd.unknown", command_name);
// }
// else response_msg = Translations.Get("icmd.list", String.Join(", ", cmd_names.ToArray()), Config.Main.Advanced.InternalCmdChar.ToChar());
//}
//else if (cmds.ContainsKey(command_name))
//{
// response_msg = cmds[command_name].Run(this, command, localVars);
// foreach (ChatBot bot in bots.ToArray())
// {
// try
// {
// bot.OnInternalCommand(command_name, string.Join(" ", Command.GetArgs(command)), response_msg);
// }
// catch (Exception e)
// {
// if (e is not ThreadAbortException)
// {
// Log.Warn(Translations.Get("icmd.error", bot.ToString() ?? string.Empty, e.ToString()));
// }
// else throw; //ThreadAbortException should not be caught
// }
// }
//}
//else
//{
// response_msg = Translations.Get("icmd.unknown", command_name);
// return false;
//}
//return true;
} }
public void LoadCommands() public void LoadCommands()
@ -689,10 +724,11 @@ namespace MinecraftClient
try try
{ {
Command cmd = (Command)Activator.CreateInstance(type)!; Command cmd = (Command)Activator.CreateInstance(type)!;
cmds[Settings.ToLowerIfNeed(cmd.CmdName)] = cmd; cmd.RegisterCommand(this, dispatcher);
cmd_names.Add(Settings.ToLowerIfNeed(cmd.CmdName)); // cmds[Settings.ToLowerIfNeed(cmd.CmdName)] = cmd;
foreach (string alias in cmd.GetCMDAliases()) // cmd_names.Add(Settings.ToLowerIfNeed(cmd.CmdName));
cmds[Settings.ToLowerIfNeed(alias)] = cmd; // foreach (string alias in cmd.GetCMDAliases())
// cmds[Settings.ToLowerIfNeed(alias)] = cmd;
} }
catch (Exception e) catch (Exception e)
{ {

View file

@ -33,6 +33,7 @@
<Content Include="Resources\containers\ContainerType.PlayerInventory.txt" /> <Content Include="Resources\containers\ContainerType.PlayerInventory.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Brigadier.NET" Version="1.2.13" />
<PackageReference Include="DnsClient" Version="1.6.1" /> <PackageReference Include="DnsClient" Version="1.6.1" />
<PackageReference Include="DotNetZip" Version="1.16.0" /> <PackageReference Include="DotNetZip" Version="1.16.0" />
<PackageReference Include="DSharpPlus" Version="4.2.0" /> <PackageReference Include="DSharpPlus" Version="4.2.0" />

View file

@ -2082,6 +2082,13 @@ namespace MinecraftClient.Protocol.Handlers
/// <returns>Completed text</returns> /// <returns>Completed text</returns>
IEnumerable<string> IAutoComplete.AutoComplete(string BehindCursor) IEnumerable<string> IAutoComplete.AutoComplete(string BehindCursor)
{ {
var sug = McClient.dispatcher.GetCompletionSuggestions(McClient.dispatcher.Parse(BehindCursor[1..], McClient.cmd_source));
sug.Wait();
foreach (var hint in sug.Result.List)
{
log.Info(hint);
}
//log.Info(McClient.dispatcher.GetSmartUsage(McClient.dispatcher.Parse(BehindCursor, McClient.cmd_source), McClient.cmd_source));
if (String.IsNullOrEmpty(BehindCursor)) if (String.IsNullOrEmpty(BehindCursor))
return Array.Empty<string>(); return Array.Empty<string>();

View file

@ -4,6 +4,8 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Brigadier.NET;
using MinecraftClient.Commands;
using MinecraftClient.Inventory; using MinecraftClient.Inventory;
using MinecraftClient.Mapping; using MinecraftClient.Mapping;
using static MinecraftClient.Settings; using static MinecraftClient.Settings;
@ -1676,6 +1678,10 @@ namespace MinecraftClient
public override string CmdUsage { get { return _cmdUsage; } } public override string CmdUsage { get { return _cmdUsage; } }
public override string CmdDesc { get { return _cmdDesc; } } public override string CmdDesc { get { return _cmdDesc; } }
public override void RegisterCommand(McClient handler, CommandDispatcher<CommandSource> dispatcher)
{
}
public override string Run(McClient handler, string command, Dictionary<string, object>? localVars) public override string Run(McClient handler, string command, Dictionary<string, object>? localVars)
{ {
return Runner(command, GetArgs(command)); return Runner(command, GetArgs(command));