diff --git a/src/main/java/net/minestom/server/command/builder/CommandExecutor.java b/src/main/java/net/minestom/server/command/builder/CommandExecutor.java index 4d973c11d..ebd25dcb2 100644 --- a/src/main/java/net/minestom/server/command/builder/CommandExecutor.java +++ b/src/main/java/net/minestom/server/command/builder/CommandExecutor.java @@ -12,11 +12,11 @@ import org.jetbrains.annotations.NotNull; public interface CommandExecutor { /** - * Executes the command callback once the syntax has been called (or the default executor) + * Executes the command callback once the syntax has been called (or the default executor). * - * @param source the sender of the command + * @param sender the sender of the command * @param args contains all the parsed arguments, * the id is the one initialized when creating the argument object */ - void apply(@NotNull CommandSender source, @NotNull Arguments args); + void apply(@NotNull CommandSender sender, @NotNull Arguments args); } \ No newline at end of file diff --git a/src/main/java/net/minestom/server/utils/Vector.java b/src/main/java/net/minestom/server/utils/Vector.java index f88382a8f..eaec3efdd 100644 --- a/src/main/java/net/minestom/server/utils/Vector.java +++ b/src/main/java/net/minestom/server/utils/Vector.java @@ -233,7 +233,7 @@ public class Vector { } /** - * Gets a new vector. + * Gets a new vector with the same values. * * @return vector */ @@ -264,4 +264,13 @@ public class Vector { public void setZ(float z) { this.z = z; } + + /** + * Gets a new {@link Position} from this vector. + * + * @return this vector as a position + */ + public Position toPosition() { + return new Position(x, y, z); + } } diff --git a/src/test/java/demo/Main.java b/src/test/java/demo/Main.java index ca3e39824..ff2cf2a91 100644 --- a/src/test/java/demo/Main.java +++ b/src/test/java/demo/Main.java @@ -3,8 +3,7 @@ package demo; import demo.blocks.BurningTorchBlock; import demo.blocks.StoneBlock; import demo.blocks.UpdatableBlockDemo; -import demo.commands.GamemodeCommand; -import demo.commands.TestCommand; +import demo.commands.*; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; import net.minestom.server.instance.block.BlockManager; @@ -30,13 +29,13 @@ public class Main { CommandManager commandManager = MinecraftServer.getCommandManager(); commandManager.register(new TestCommand()); commandManager.register(new GamemodeCommand()); - /*commandManager.register(new EntitySelectorCommand()); + commandManager.register(new EntitySelectorCommand()); commandManager.register(new HealthCommand()); commandManager.register(new SimpleCommand()); commandManager.register(new GamemodeCommand()); commandManager.register(new DimensionCommand()); commandManager.register(new ShutdownCommand()); - commandManager.register(new TeleportCommand());*/ + commandManager.register(new TeleportCommand()); commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage("unknown command")); diff --git a/src/test/java/demo/commands/HealthCommand.java b/src/test/java/demo/commands/HealthCommand.java index 5bbbf3668..eb61d4a02 100644 --- a/src/test/java/demo/commands/HealthCommand.java +++ b/src/test/java/demo/commands/HealthCommand.java @@ -17,15 +17,15 @@ public class HealthCommand extends Command { setDefaultExecutor(this::defaultExecutor); - Argument arg0 = ArgumentType.Word("mode").from("set", "add"); + Argument modeArg = ArgumentType.Word("mode").from("set", "add"); - Argument arg1 = ArgumentType.Integer("value").between(0, 100); + Argument valueArg = ArgumentType.Integer("value").between(0, 100); - setArgumentCallback(this::modeCallback, arg0); - setArgumentCallback(this::valueCallback, arg1); + setArgumentCallback(this::onModeError, modeArg); + setArgumentCallback(this::onValueError, valueArg); - addSyntax(this::execute2, arg0, arg1); - addSyntax(this::execute, arg0); + addSyntax(this::sendSuggestionMessage, modeArg); + addSyntax(this::onHealthCommand, modeArg, valueArg); } private boolean condition(CommandSender sender, String commandString) { @@ -40,11 +40,11 @@ public class HealthCommand extends Command { sender.sendMessage("Correct usage: health [set/add] [number]"); } - private void modeCallback(CommandSender sender, String value, int error) { + private void onModeError(CommandSender sender, String value, int error) { sender.sendMessage("SYNTAX ERROR: '" + value + "' should be replaced by 'set' or 'add'"); } - private void valueCallback(CommandSender sender, String value, int error) { + private void onValueError(CommandSender sender, String value, int error) { switch (error) { case ArgumentNumber.NOT_NUMBER_ERROR: sender.sendMessage("SYNTAX ERROR: '" + value + "' isn't a number!"); @@ -55,14 +55,14 @@ public class HealthCommand extends Command { } } - private void execute(CommandSender sender, Arguments args) { + private void sendSuggestionMessage(CommandSender sender, Arguments args) { sender.sendMessage("/health " + args.getWord("mode") + " [Integer]"); } - private void execute2(CommandSender sender, Arguments args) { - Player player = (Player) sender; - String mode = args.getWord("mode"); - int value = args.getInteger("value"); + private void onHealthCommand(CommandSender sender, Arguments args) { + final Player player = (Player) sender; + final String mode = args.getWord("mode"); + final int value = args.getInteger("value"); switch (mode.toLowerCase()) { case "set": @@ -72,6 +72,7 @@ public class HealthCommand extends Command { player.setHealth(player.getHealth() + value); break; } + player.sendMessage("You have now " + player.getHealth() + " health"); } diff --git a/src/test/java/demo/commands/TeleportCommand.java b/src/test/java/demo/commands/TeleportCommand.java index 95107b699..7e6cd8ca5 100644 --- a/src/test/java/demo/commands/TeleportCommand.java +++ b/src/test/java/demo/commands/TeleportCommand.java @@ -1,42 +1,45 @@ package demo.commands; import net.minestom.server.MinecraftServer; +import net.minestom.server.command.CommandSender; +import net.minestom.server.command.builder.Arguments; import net.minestom.server.command.builder.Command; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.entity.Player; import net.minestom.server.utils.Position; +import net.minestom.server.utils.location.RelativeVec; public class TeleportCommand extends Command { + public TeleportCommand() { super("tp"); setDefaultExecutor((source, args) -> source.sendMessage("Usage: /tp x y z")); - Argument x = ArgumentType.Float("x"); - Argument y = ArgumentType.Float("y"); - Argument z = ArgumentType.Float("z"); - Argument playerArg = ArgumentType.Word("pl"); + Argument posArg = ArgumentType.RelativeVec3("pos"); + Argument playerArg = ArgumentType.Word("player"); - setArgumentCallback((source, value, error) -> { - System.out.println("error: " + error); - }, x); - - addSyntax((sender, args) -> { - Player pl = MinecraftServer.getConnectionManager().getPlayer(args.getWord("pl")); - if (pl != null && sender.isPlayer()) { - Player player = (Player) sender; - player.teleport(pl.getPosition()); - } - }, playerArg); - - addSyntax((source, args) -> { - final float posX = args.getFloat("x"); - final float posY = args.getFloat("y"); - final float posZ = args.getFloat("z"); - - ((Player) source).teleport(new Position(posX, posY, posZ)); - source.sendMessage("TELEPORTING"); - }, x, y, z); + addSyntax(this::onPlayerTeleport, playerArg); + addSyntax(this::onPositionTeleport, posArg); } + + private void onPlayerTeleport(CommandSender sender, Arguments args) { + Player pl = MinecraftServer.getConnectionManager().getPlayer(args.getWord("player")); + if (pl != null && sender.isPlayer()) { + Player player = (Player) sender; + player.teleport(pl.getPosition()); + } + } + + private void onPositionTeleport(CommandSender sender, Arguments args) { + final Player player = sender.asPlayer(); + + final RelativeVec relativeVec = args.getRelativeVector("pos"); + final Position position = relativeVec.fromRelativePosition(player).toPosition(); + + player.teleport(position); + player.sendMessage("You have been teleported to " + position); + } + }