From d0fb999ec6e114f167d338c4749992b72fabdc57 Mon Sep 17 00:00:00 2001 From: MC_XiaoHei Date: Sun, 24 Aug 2025 15:13:29 +0800 Subject: [PATCH] feat: finish leaves command --- .../0055-No-block-update-command.patch | 22 +-- ...item-drops-due-to-update-suppression.patch | 4 +- .../0138-Lithium-Sleeping-Block-Entity.patch | 4 +- ...003-Leaves-Server-Config-And-Command.patch | 18 -- .../org/leavesmc/leaves/LeavesConfig.java | 52 +++-- .../leaves/bot/ServerBotGameMode.java | 4 +- .../bot/agent/actions/AbstractBotAction.java | 4 +- .../agent/actions/AbstractTimerBotAction.java | 4 +- .../agent/actions/AbstractUseBotAction.java | 2 +- .../bot/agent/actions/ServerLookAction.java | 2 +- .../bot/agent/actions/ServerMoveAction.java | 4 +- .../agent/actions/ServerRotationAction.java | 2 +- .../bot/agent/configs/AbstractBotConfig.java | 4 +- .../agent/configs/AlwaysSendDataConfig.java | 2 +- .../bot/agent/configs/LocatorBarConfig.java | 2 +- .../configs/SimulationDistanceConfig.java | 2 +- .../bot/agent/configs/SkipSleepConfig.java | 2 +- .../bot/agent/configs/SpawnPhantomConfig.java | 2 +- .../bot/agent/configs/TickTypeConfig.java | 2 +- .../ArgumentNode.java | 2 +- .../leaves/command/CommandArgument.java | 67 ------- .../leaves/command/CommandArgumentResult.java | 92 --------- .../leaves/command/CommandArgumentType.java | 59 ------ .../CommandContext.java | 4 +- .../{neo_command => command}/CommandNode.java | 2 +- .../CommandUtils.java | 9 +- .../CustomArgumentNode.java | 2 +- .../CustomArgumentType.java | 2 +- .../leaves/command/LeavesCommand.java | 38 ---- .../leaves/command/LeavesCommandUtil.java | 181 ------------------ .../leaves/command/LeavesRootCommand.java | 126 ------------ .../leaves/command/LeavesSubcommand.java | 7 - .../command/LeavesSuggestionBuilder.java | 49 ----- .../command/LeavesSuggestionCommand.java | 15 -- .../{neo_command => command}/LiteralNode.java | 2 +- .../WrappedArgument.java | 2 +- .../bot/BotArgument.java | 6 +- .../bot/BotCommand.java | 28 ++- .../bot/BotSubcommand.java | 4 +- .../bot/subcommands/ActionCommand.java | 16 +- .../bot/subcommands/ConfigCommand.java | 12 +- .../bot/subcommands/CreateCommand.java | 8 +- .../bot/subcommands/ListCommand.java | 8 +- .../bot/subcommands/LoadCommand.java | 8 +- .../bot/subcommands/RemoveCommand.java | 12 +- .../bot/subcommands/SaveCommand.java | 10 +- .../bot/subcommands/action/ListCommand.java | 8 +- .../bot/subcommands/action/StartCommand.java | 10 +- .../bot/subcommands/action/StopCommand.java | 10 +- .../leaves/LeavesCommand.java | 32 ++-- .../command/leaves/LeavesSubcommand.java | 22 +++ .../subcommands/BlockUpdateCommand.java | 101 ++++++++++ .../leaves/subcommands/ConfigCommand.java | 27 +-- .../leaves/subcommands/CounterCommand.java | 170 ++++++++++++++++ .../leaves/subcommands/ReloadCommand.java | 30 +++ .../subcommands/ReportCommand.java | 97 ++++++---- .../leaves/subcommands/UpdateCommand.java | 31 +++ .../subcommands/BlockUpdateCommand.java | 33 ---- .../command/subcommands/ConfigCommand.java | 92 --------- .../command/subcommands/CounterCommand.java | 106 ---------- .../command/subcommands/ReloadCommand.java | 20 -- .../command/subcommands/UpdateCommand.java | 16 -- 62 files changed, 584 insertions(+), 1130 deletions(-) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/ArgumentNode.java (98%) delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgument.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentResult.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentType.java rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/CommandContext.java (97%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/CommandNode.java (98%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/CommandUtils.java (92%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/CustomArgumentNode.java (97%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/CustomArgumentType.java (93%) delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommandUtil.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesRootCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSubcommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionBuilder.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionCommand.java rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/LiteralNode.java (96%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/WrappedArgument.java (98%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/BotArgument.java (92%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/BotCommand.java (56%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/BotSubcommand.java (79%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/ActionCommand.java (65%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/ConfigCommand.java (93%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/CreateCommand.java (95%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/ListCommand.java (94%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/LoadCommand.java (92%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/RemoveCommand.java (94%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/SaveCommand.java (86%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/action/ListCommand.java (87%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/action/StartCommand.java (93%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/bot/subcommands/action/StopCommand.java (95%) rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/leaves/LeavesCommand.java (50%) create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesSubcommand.java create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/BlockUpdateCommand.java rename leaves-server/src/main/java/org/leavesmc/leaves/{neo_command => command}/leaves/subcommands/ConfigCommand.java (84%) create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/CounterCommand.java create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReloadCommand.java rename leaves-server/src/main/java/org/leavesmc/leaves/command/{ => leaves}/subcommands/ReportCommand.java (67%) create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/UpdateCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/BlockUpdateCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ConfigCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReloadCommand.java delete mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/UpdateCommand.java diff --git a/leaves-server/minecraft-patches/features/0055-No-block-update-command.patch b/leaves-server/minecraft-patches/features/0055-No-block-update-command.patch index 601f6272..1b07fcea 100644 --- a/leaves-server/minecraft-patches/features/0055-No-block-update-command.patch +++ b/leaves-server/minecraft-patches/features/0055-No-block-update-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] No block update command diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index 5d4eb61af0b0f39a5d4c37f4a303fa24b3a2936d..48bb795216ca3fb301813080de403a048bbfa98c 100644 +index 9cce442c16ced8d9320a5760580ff13f02cbf8f1..6c67c3b9e7c70366c2889932fd4c0265218656d4 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -381,7 +381,7 @@ public class ServerPlayerGameMode { @@ -13,12 +13,12 @@ index 5d4eb61af0b0f39a5d4c37f4a303fa24b3a2936d..48bb795216ca3fb301813080de403a04 this.level.captureDrops = new java.util.ArrayList<>(); // CraftBukkit end - BlockState blockState1 = block.playerWillDestroy(this.level, pos, blockState, this.player); -+ BlockState blockState1 = org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update ++ BlockState blockState1 = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update boolean flag = this.level.removeBlock(pos, false); if (flag) { block.destroy(this.level, pos, blockState1); diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index ef8a072838558caab19e8a85f4b59cac570c2635..590252ca203124f0b720a73f174c92fbe49bc685 100644 +index 6202ea6f6f8e6b751434848fb6551c61162d076b..a8c20ef3be53bd462e4c352a08f4b7201a8af373 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -1089,6 +1089,11 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl @@ -26,7 +26,7 @@ index ef8a072838558caab19e8a85f4b59cac570c2635..590252ca203124f0b720a73f174c92fb @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft) { + // Leaves start - no block update -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; + } + // Leaves end - no block update @@ -38,7 +38,7 @@ index ef8a072838558caab19e8a85f4b59cac570c2635..590252ca203124f0b720a73f174c92fb BlockState blockState = oldState; BlockState blockState1 = currentState; + // Leaves start - no block update -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; + } + // Leaves end - no block update @@ -51,7 +51,7 @@ index ef8a072838558caab19e8a85f4b59cac570c2635..590252ca203124f0b720a73f174c92fb int i = flags & -34; - + // Leaves start - no block update -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + this.updatePOIOnBlockStateChange(pos, blockState, blockState1); + return; + } @@ -60,19 +60,19 @@ index ef8a072838558caab19e8a85f4b59cac570c2635..590252ca203124f0b720a73f174c92fb blockState.updateIndirectNeighbourShapes(this, pos, i, recursionLeft - 1); // Don't call an event for the old block to limit event spam boolean cancelledUpdates = false; // Paper - Fix block place logic diff --git a/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/net/minecraft/world/level/block/piston/PistonBaseBlock.java -index 16aa9f5996dc6eda95541fddb01e00e41305357a..31ab92e0769aa4ce09da5073ad9b734eeebac9c5 100644 +index 16aa9f5996dc6eda95541fddb01e00e41305357a..6bd7d937bab8baf7c657e689e8a1b4069c207ff9 100644 --- a/net/minecraft/world/level/block/piston/PistonBaseBlock.java +++ b/net/minecraft/world/level/block/piston/PistonBaseBlock.java @@ -105,6 +105,7 @@ public class PistonBaseBlock extends DirectionalBlock { } private void checkIfExtend(Level level, BlockPos pos, BlockState state) { -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update Direction direction = state.getValue(FACING); boolean neighborSignal = this.getNeighborSignal(level, pos, direction); if (neighborSignal && !state.getValue(EXTENDED)) { diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index 263bf2b795057c2d5218bf9cfb684e526601aa77..da1e77ccd8805ac0cb0729720b4a1742da67d35c 100644 +index 8942aa2ca4796c7c36c0955141627ea905e0ec64..2d2b7f3284171517d1e68cef802ae197e2e6f8bb 100644 --- a/net/minecraft/world/level/redstone/NeighborUpdater.java +++ b/net/minecraft/world/level/redstone/NeighborUpdater.java @@ -34,6 +34,11 @@ public interface NeighborUpdater { @@ -80,7 +80,7 @@ index 263bf2b795057c2d5218bf9cfb684e526601aa77..da1e77ccd8805ac0cb0729720b4a1742 LevelAccessor level, Direction direction, BlockPos pos, BlockPos neighborPos, BlockState neighborState, int flags, int recursionLeft ) { + // Leaves start - no block update -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; + } + // Leaves end - no block update @@ -91,7 +91,7 @@ index 263bf2b795057c2d5218bf9cfb684e526601aa77..da1e77ccd8805ac0cb0729720b4a1742 static void executeUpdate(Level level, BlockState state, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston, BlockPos sourcePos) { // Paper end - Add source block to BlockPhysicsEvent -+ if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update try { // CraftBukkit start org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), org.bukkit.craftbukkit.block.CraftBlock.at(level, sourcePos)); // Paper - Add source block to BlockPhysicsEvent diff --git a/leaves-server/minecraft-patches/features/0132-Prevent-loss-of-item-drops-due-to-update-suppression.patch b/leaves-server/minecraft-patches/features/0132-Prevent-loss-of-item-drops-due-to-update-suppression.patch index bb8e2049..c8d405e8 100644 --- a/leaves-server/minecraft-patches/features/0132-Prevent-loss-of-item-drops-due-to-update-suppression.patch +++ b/leaves-server/minecraft-patches/features/0132-Prevent-loss-of-item-drops-due-to-update-suppression.patch @@ -6,13 +6,13 @@ Subject: [PATCH] Prevent loss of item drops due to update suppression when diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index f258bc30014f94243ad832b33dcb6c9acd1f2f08..9a4eb1f8e01517707befa30b3ccacc7c84c0abe9 100644 +index 6c67c3b9e7c70366c2889932fd4c0265218656d4..3cc4ebfb9f083e8872460d6c47ad1d76d2cba990 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -382,7 +382,18 @@ public class ServerPlayerGameMode { this.level.captureDrops = new java.util.ArrayList<>(); // CraftBukkit end - BlockState blockState1 = org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update + BlockState blockState1 = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update - boolean flag = this.level.removeBlock(pos, false); + // Leaves start - Prevent loss of item drops due to update suppression when breaking blocks + boolean flag; diff --git a/leaves-server/minecraft-patches/features/0138-Lithium-Sleeping-Block-Entity.patch b/leaves-server/minecraft-patches/features/0138-Lithium-Sleeping-Block-Entity.patch index f57a4304..3c435c1d 100644 --- a/leaves-server/minecraft-patches/features/0138-Lithium-Sleeping-Block-Entity.patch +++ b/leaves-server/minecraft-patches/features/0138-Lithium-Sleeping-Block-Entity.patch @@ -447,13 +447,13 @@ index a63330b232dc41f0a5bb36bb94dfb84f01504699..7fbce8302739ab016f1b64f8227c6d72 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index f31a48530e965f01507c335f50d898ed72767e3c..e5b12f0be3c21b14b1fd8a33b20a9292e3b7b8df 100644 +index 3699a9688c15afb2219e504ce6f3f27ea038b575..fc3517a1f14b72f127ab1e9342750491066a56cc 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -1224,6 +1224,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl int i = flags & -34; // Leaves start - no block update - if (org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) org.leavesmc.leaves.lithium.common.hopper.HopperHelper.updateHopperOnUpdateSuppression(this, pos, flags, chunkAt, oldState != currentState); // Leaves - Lithium Sleeping Block Entity this.updatePOIOnBlockStateChange(pos, blockState, blockState1); return; diff --git a/leaves-server/paper-patches/features/0003-Leaves-Server-Config-And-Command.patch b/leaves-server/paper-patches/features/0003-Leaves-Server-Config-And-Command.patch index 97e25a1a..0bd858fc 100644 --- a/leaves-server/paper-patches/features/0003-Leaves-Server-Config-And-Command.patch +++ b/leaves-server/paper-patches/features/0003-Leaves-Server-Config-And-Command.patch @@ -17,24 +17,6 @@ index 62e2d5704c348955bc8284dc2d54c933b7bcdd06..7ef20f0138fad39a1d23edd7b26ddc88 @Override public void executeAsync(final Runnable runnable) { MCUtil.scheduleAsyncTask(this.catching(runnable, "asynchronous")); -diff --git a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java -index 5c52b1563d20d7e977a5bb958c18b19dec5c365a..65664441c5692620a8b22513ded497b7951a3245 100644 ---- a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java -+++ b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java -@@ -106,6 +106,13 @@ public class BukkitCommandNode extends LiteralCommandNode { - List results = null; - Location pos = context.getSource().getLocation(); - try { -+ // Leaves start - custom suggestion -+ if (this.command instanceof org.leavesmc.leaves.command.LeavesSuggestionCommand suggestionCommand) { -+ org.leavesmc.leaves.command.LeavesSuggestionBuilder suggestionBuilder = new org.leavesmc.leaves.command.LeavesSuggestionBuilder(builder.createOffset(builder.getInput().lastIndexOf(' ') + 1)); -+ suggestionCommand.suggest(sender, this.literal, args, pos.clone(), suggestionBuilder); -+ return suggestionBuilder.build(); -+ } -+ // Leaves end - custom suggestion - results = this.command.tabComplete(sender, this.literal, args, pos.clone()); - } catch (CommandException ex) { - sender.sendMessage(Component.text("An internal error occurred while attempting to tab-complete this command", NamedTextColor.RED)); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 32fe51b19323e3c4c56e7f9e621e6e808ee5fe38..2eba1d900b20a781c4bb08caa2b30bfeb2d02b9d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java index 3bb30b2e..9ad9406b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java @@ -7,7 +7,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.command.Command; import org.bukkit.configuration.MemorySection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.permissions.Permission; @@ -16,7 +15,6 @@ import org.bukkit.plugin.PluginManager; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.Actions; -import org.leavesmc.leaves.command.LeavesCommand; import org.leavesmc.leaves.config.GlobalConfigManager; import org.leavesmc.leaves.config.annotations.GlobalConfig; import org.leavesmc.leaves.config.annotations.GlobalConfigCategory; @@ -30,7 +28,8 @@ import org.leavesmc.leaves.config.api.impl.ConfigValidatorImpl.IntConfigValidato import org.leavesmc.leaves.config.api.impl.ConfigValidatorImpl.ListConfigValidator; import org.leavesmc.leaves.config.api.impl.ConfigValidatorImpl.LongConfigValidator; import org.leavesmc.leaves.config.api.impl.ConfigValidatorImpl.StringConfigValidator; -import org.leavesmc.leaves.neo_command.bot.BotCommand; +import org.leavesmc.leaves.command.bot.BotCommand; +import org.leavesmc.leaves.command.leaves.LeavesCommand; import org.leavesmc.leaves.profile.LeavesMinecraftSessionService; import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRule; import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRules; @@ -94,8 +93,7 @@ public final class LeavesConfig { GlobalConfigManager.init(); - registerCommand("leaves", new LeavesCommand()); - org.leavesmc.leaves.neo_command.leaves.LeavesCommand.INSTANCE.register(); + LeavesCommand.INSTANCE.register(); } public static void reload() { @@ -121,11 +119,6 @@ public final class LeavesConfig { } } - public static void registerCommand(String name, Command command) { - MinecraftServer.getServer().server.getCommandMap().register(name, "leaves", command); - MinecraftServer.getServer().server.syncCommands(); - } - public static ModifyConfig modify = new ModifyConfig(); @GlobalConfigCategory("modify") @@ -196,10 +189,8 @@ public final class LeavesConfig { public void verify(Boolean old, Boolean value) throws IllegalArgumentException { if (old != null && !old.equals(value)) { Bukkit.getOnlinePlayers().stream() - .filter(sender -> - BotCommand.hasPermission(sender) - || BotCommand.hasPermission(sender, "action") - ).forEach(org.bukkit.entity.Player::updateCommands); + .filter(sender -> BotCommand.hasPermission(sender, "action")) + .forEach(org.bukkit.entity.Player::updateCommands); } } } @@ -213,8 +204,7 @@ public final class LeavesConfig { if (old != null && !old.equals(value)) { Bukkit.getOnlinePlayers().stream() .filter(sender -> - BotCommand.hasPermission(sender) - || BotCommand.hasPermission(sender, "config") + BotCommand.hasPermission(sender, "config") ).forEach(org.bukkit.entity.Player::updateCommands); } } @@ -229,9 +219,7 @@ public final class LeavesConfig { if (old != null && !old.equals(value)) { Bukkit.getOnlinePlayers().stream() .filter(sender -> - BotCommand.hasPermission(sender) - || BotCommand.hasPermission(sender, "save") - || BotCommand.hasPermission(sender, "load") + BotCommand.hasPermission(sender, "save") || BotCommand.hasPermission(sender, "load") ).forEach(org.bukkit.entity.Player::updateCommands); } } @@ -678,9 +666,20 @@ public final class LeavesConfig { } } - @GlobalConfig(value = "no-block-update-command") + @GlobalConfig(value = "no-block-update-command", validator = NoBlockUpdateValidator.class) public boolean noBlockUpdateCommand = false; + private static class NoBlockUpdateValidator extends BooleanConfigValidator { + @Override + public void verify(Boolean old, Boolean value) throws IllegalArgumentException { + if (old != null && !old.equals(value)) { + Bukkit.getOnlinePlayers().stream() + .filter(sender -> LeavesCommand.hasPermission(sender, "blockupdate")) + .forEach(org.bukkit.entity.Player::updateCommands); + } + } + } + @GlobalConfig("no-tnt-place-update") public boolean noTNTPlaceUpdate = false; @@ -709,9 +708,20 @@ public final class LeavesConfig { public static class HopperCounterConfig { @TransferConfig(value = "modify.hopper-counter", transformer = HopperCounterTransfer.class) @TransferConfig("modify.counter.enable") - @GlobalConfig("enable") + @GlobalConfig(value = "enable", validator = HopperCounterValidator.class) public boolean enable = false; + private static class HopperCounterValidator extends BooleanConfigValidator { + @Override + public void verify(Boolean old, Boolean value) throws IllegalArgumentException { + if (old != null && !old.equals(value)) { + Bukkit.getOnlinePlayers().stream() + .filter(sender -> LeavesCommand.hasPermission(sender, "counter")) + .forEach(org.bukkit.entity.Player::updateCommands); + } + } + } + @TransferConfig("modify.counter.unlimited-speed") @GlobalConfig("unlimited-speed") public boolean unlimitedSpeed = false; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotGameMode.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotGameMode.java index bf16fe7f..c636ab69 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotGameMode.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotGameMode.java @@ -19,6 +19,8 @@ import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate; + public class ServerBotGameMode extends ServerPlayerGameMode { public ServerBotGameMode(ServerBot bot) { @@ -62,7 +64,7 @@ public class ServerBotGameMode extends ServerPlayerGameMode { this.level.sendBlockUpdated(pos, blockState, blockState, 3); return false; } else { - BlockState blockState1 = org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update + BlockState blockState1 = isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update boolean flag = this.level.removeBlock(pos, false); if (flag) { block.destroy(this.level, pos, blockState1); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractBotAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractBotAction.java index 86286b94..eb798ee2 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractBotAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractBotAction.java @@ -10,8 +10,8 @@ import org.leavesmc.leaves.LeavesLogger; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.event.bot.BotActionExecuteEvent; import org.leavesmc.leaves.event.bot.BotActionStopEvent; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.WrappedArgument; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.WrappedArgument; import org.leavesmc.leaves.util.UpdateSuppressionException; import java.util.ArrayList; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractTimerBotAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractTimerBotAction.java index 9685e47f..15d904ce 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractTimerBotAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractTimerBotAction.java @@ -2,12 +2,12 @@ package org.leavesmc.leaves.bot.agent.actions; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import java.util.function.Supplier; import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; -import static org.leavesmc.leaves.neo_command.ArgumentNode.ArgumentSuggestions.strings; +import static org.leavesmc.leaves.command.ArgumentNode.ArgumentSuggestions.strings; public abstract class AbstractTimerBotAction> extends AbstractBotAction { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractUseBotAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractUseBotAction.java index 1a367cfb..69b8fd9f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractUseBotAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/AbstractUseBotAction.java @@ -6,7 +6,7 @@ import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.event.bot.BotActionStopEvent; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import java.util.function.Supplier; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerLookAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerLookAction.java index c65d2199..bbf11568 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerLookAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerLookAction.java @@ -14,7 +14,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.entity.bot.actions.CraftLookAction; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; public class ServerLookAction extends AbstractBotAction { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMoveAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMoveAction.java index 6ed01137..3d3db621 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMoveAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerMoveAction.java @@ -7,13 +7,13 @@ import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.entity.bot.action.MoveAction.MoveDirection; import org.leavesmc.leaves.entity.bot.actions.CraftMoveAction; import org.leavesmc.leaves.event.bot.BotActionStopEvent; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import java.util.Arrays; import java.util.Map; import static java.util.stream.Collectors.toMap; -import static org.leavesmc.leaves.neo_command.ArgumentNode.ArgumentSuggestions.strings; +import static org.leavesmc.leaves.command.ArgumentNode.ArgumentSuggestions.strings; public class ServerMoveAction extends AbstractStateBotAction { private static final Map NAME_TO_DIRECTION = Arrays.stream(MoveDirection.values()).collect(toMap( diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerRotationAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerRotationAction.java index 7218a740..86f9fdaf 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerRotationAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerRotationAction.java @@ -7,7 +7,7 @@ import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.entity.bot.actions.CraftRotationAction; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import java.text.DecimalFormat; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AbstractBotConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AbstractBotConfig.java index 81d05050..7ee528b8 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AbstractBotConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AbstractBotConfig.java @@ -8,8 +8,8 @@ import net.minecraft.nbt.CompoundTag; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.WrappedArgument; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.WrappedArgument; import java.lang.reflect.Method; import java.util.List; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AlwaysSendDataConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AlwaysSendDataConfig.java index b82fec5d..01c2ac71 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AlwaysSendDataConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/AlwaysSendDataConfig.java @@ -4,7 +4,7 @@ import com.mojang.brigadier.arguments.BoolArgumentType; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; public class AlwaysSendDataConfig extends AbstractBotConfig { private boolean value; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java index ee3e119a..2a81bad7 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java @@ -5,7 +5,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.waypoints.ServerWaypointManager; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; public class LocatorBarConfig extends AbstractBotConfig { private boolean value; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SimulationDistanceConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SimulationDistanceConfig.java index 1c6b832f..75d3f481 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SimulationDistanceConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SimulationDistanceConfig.java @@ -5,7 +5,7 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import static net.minecraft.network.chat.Component.literal; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SkipSleepConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SkipSleepConfig.java index 14e297fd..5577ce2d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SkipSleepConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SkipSleepConfig.java @@ -4,7 +4,7 @@ import com.mojang.brigadier.arguments.BoolArgumentType; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; public class SkipSleepConfig extends AbstractBotConfig { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SpawnPhantomConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SpawnPhantomConfig.java index 6b5dbdde..25ec048f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SpawnPhantomConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/SpawnPhantomConfig.java @@ -5,7 +5,7 @@ import net.minecraft.nbt.CompoundTag; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import java.util.List; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/TickTypeConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/TickTypeConfig.java index 961f6563..109d9930 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/TickTypeConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/TickTypeConfig.java @@ -7,7 +7,7 @@ import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.neo_command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; public class TickTypeConfig extends AbstractBotConfig { private ServerBot.TickType value; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/ArgumentNode.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/ArgumentNode.java similarity index 98% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/ArgumentNode.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/ArgumentNode.java index 0f70d0a0..d9b802d2 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/ArgumentNode.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/ArgumentNode.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgument.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgument.java deleted file mode 100644 index bc0c3dca..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.leavesmc.leaves.command; - -import org.apache.commons.lang3.tuple.Pair; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.BiFunction; - -public class CommandArgument { - - public static final CommandArgument EMPTY = new CommandArgument(); - - private static final Pair, String> EMPTY_SUGGESTION_RESULT = Pair.of(List.of(), null); - private static final BiFunction, String>> EMPTY_SUGGESTION = (sender, arg) -> EMPTY_SUGGESTION_RESULT; - - private final List, String>>> suggestions; - private final List> argumentTypes; - - private CommandArgument(CommandArgumentType... argumentTypes) { - this.argumentTypes = List.of(argumentTypes); - this.suggestions = new ArrayList<>(); - for (int i = 0; i < argumentTypes.length; i++) { - suggestions.add(EMPTY_SUGGESTION); - } - } - - public static CommandArgument of(CommandArgumentType... argumentTypes) { - return new CommandArgument(argumentTypes); - } - - public List> getArgumentTypes() { - return argumentTypes; - } - - public CommandArgument setSuggestion(int n, BiFunction, String>> suggestion) { - this.suggestions.set(n, suggestion); - return this; - } - - public CommandArgument setSuggestion(int n, Pair, String> suggestion) { - return this.setSuggestion(n, (sender, arg) -> suggestion); - } - - public CommandArgument setSuggestion(int n, List tabComplete) { - return this.setSuggestion(n, Pair.of(tabComplete, null)); - } - - public Pair, String> suggestion(int n, CommandSender sender, String arg) { - if (suggestions.size() > n) { - return suggestions.get(n).apply(sender, arg); - } else { - return EMPTY_SUGGESTION.apply(sender, arg); - } - } - - public CommandArgumentResult parse(int index, String @NotNull [] args) { - Object[] result = new Object[argumentTypes.size()]; - Arrays.fill(result, null); - for (int i = index, j = 0; i < args.length && j < result.length; i++, j++) { - result[j] = argumentTypes.get(j).parse(args[i]); - } - return new CommandArgumentResult(new ArrayList<>(Arrays.asList(result))); - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentResult.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentResult.java deleted file mode 100644 index a56cd7b8..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentResult.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.leavesmc.leaves.command; - -import net.minecraft.core.BlockPos; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Objects; - -public class CommandArgumentResult { - - private final List result; - - public CommandArgumentResult(List result) { - this.result = result; - } - - public int readInt(int def) { - return Objects.requireNonNullElse(read(Integer.class), def); - } - - public double readDouble(double def) { - return Objects.requireNonNullElse(read(Double.class), def); - } - - public float readFloat(float def) { - return Objects.requireNonNullElse(read(Float.class), def); - } - - public String readString(String def) { - return Objects.requireNonNullElse(read(String.class), def); - } - - public boolean readBoolean(boolean def) { - return Objects.requireNonNullElse(read(Boolean.class), def); - } - - public BlockPos readPos() { - Integer[] pos = {read(Integer.class), read(Integer.class), read(Integer.class)}; - for (Integer po : pos) { - if (po == null) { - return null; - } - } - return new BlockPos(pos[0], pos[1], pos[2]); - } - - public @Nullable Vector readVector() { - Double[] pos = {read(Double.class), read(Double.class), read(Double.class)}; - for (Double po : pos) { - if (po == null) { - return null; - } - } - return new Vector(pos[0], pos[1], pos[2]); - } - - public @NotNull Vector readVectorYZ(double x) { - Double[] pos = {x, read(Double.class), read(Double.class)}; - for (Double po : pos) { - if (po == null) { - throw new IllegalArgumentException("Failed to read vector!"); - } - } - return new Vector(pos[0], pos[1], pos[2]); - } - - public Object readObject() { - if (result.isEmpty()) { - return null; - } - return result.removeFirst(); - } - - public T read(Class tClass, T def) { - return Objects.requireNonNullElse(read(tClass), def); - } - - public T read(Class tClass) { - if (result.isEmpty()) { - return null; - } - - Object obj = result.removeFirst(); - if (tClass.isInstance(obj)) { - return tClass.cast(obj); - } else { - return null; - } - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentType.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentType.java deleted file mode 100644 index b39f6f46..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandArgumentType.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.leavesmc.leaves.command; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Function; - -public abstract class CommandArgumentType { - - public static final CommandArgumentType STRING = CommandArgumentType.string(); - public static final CommandArgumentType INTEGER = CommandArgumentType.of(Integer.class, Integer::parseInt); - public static final CommandArgumentType DOUBLE = CommandArgumentType.of(Double.class, Double::parseDouble); - public static final CommandArgumentType FLOAT = CommandArgumentType.of(Float.class, Float::parseFloat); - public static final CommandArgumentType BOOLEAN = CommandArgumentType.of(Boolean.class, Boolean::parseBoolean); - - private final Class type; - - private CommandArgumentType(Class type) { - this.type = type; - } - - @NotNull - @Contract(value = "_, _ -> new", pure = true) - public static CommandArgumentType of(Class type, Function parse) { - return new CommandArgumentType<>(type) { - @Override - public E parse(@NotNull String arg) { - try { - return parse.apply(arg); - } catch (Exception ignore) { - return null; - } - } - }; - } - - @NotNull - @Contract(value = "_ -> new", pure = true) - public static > CommandArgumentType ofEnum(Class type) { - return of(type, (string -> Enum.valueOf(type, string.toUpperCase()))); - } - - @NotNull - @Contract(value = " -> new", pure = true) - private static CommandArgumentType string() { - return new CommandArgumentType<>(String.class) { - @Override - public String parse(@NotNull String arg) { - return arg; - } - }; - } - - public Class getType() { - return type; - } - - public abstract E parse(@NotNull String arg); -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandContext.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandContext.java similarity index 97% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandContext.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/CommandContext.java index d075ccc7..8d572553 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandContext.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandContext.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.Command; import com.mojang.brigadier.RedirectModifier; @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; -import static org.leavesmc.leaves.neo_command.CommandNode.getNameForNode; +import static org.leavesmc.leaves.command.CommandNode.getNameForNode; @SuppressWarnings({"ClassCanBeRecord", "unused"}) public class CommandContext { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandNode.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandNode.java similarity index 98% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandNode.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/CommandNode.java index 41859e21..ccf1449e 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandNode.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandNode.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandUtils.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandUtils.java similarity index 92% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandUtils.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/CommandUtils.java index d6a04cf0..8077fb94 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CommandUtils.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/CommandUtils.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.google.common.base.Functions; import com.google.common.collect.Iterables; @@ -23,6 +23,13 @@ import java.util.Map; public class CommandUtils { + public static void registerPermissions(String base, @NotNull List children) { + List permissions = new ArrayList<>(); + permissions.add(base); + permissions.addAll(children.stream().map((it) -> base + "." + it.getName()).toList()); + registerPermissions(permissions); + } + public static void registerPermissions(@NotNull List permissions) { PluginManager pluginManager = Bukkit.getServer().getPluginManager(); for (String perm : permissions) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentNode.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentNode.java similarity index 97% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentNode.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentNode.java index 75fdc784..6d302270 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentNode.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentNode.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentType.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentType.java similarity index 93% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentType.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentType.java index 458ac711..3e44ede1 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/CustomArgumentType.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/CustomArgumentType.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommand.java deleted file mode 100644 index caea88aa..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.leavesmc.leaves.command; - -import net.minecraft.Util; -import org.leavesmc.leaves.command.subcommands.BlockUpdateCommand; -import org.leavesmc.leaves.command.subcommands.ConfigCommand; -import org.leavesmc.leaves.command.subcommands.CounterCommand; -import org.leavesmc.leaves.command.subcommands.ReloadCommand; -import org.leavesmc.leaves.command.subcommands.ReportCommand; -import org.leavesmc.leaves.command.subcommands.UpdateCommand; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -public final class LeavesCommand extends LeavesRootCommand { - - public static final String BASE_PERM = "bukkit.command.leaves."; - - // subcommand label -> subcommand - private static final Map SUBCOMMANDS = Util.make(() -> { - final Map, LeavesSubcommand> commands = new HashMap<>(); - commands.put(Set.of("config"), new ConfigCommand()); - commands.put(Set.of("update"), new UpdateCommand()); - commands.put(Set.of("counter"), new CounterCommand()); - commands.put(Set.of("reload"), new ReloadCommand()); - commands.put(Set.of("report"), new ReportCommand()); - commands.put(Set.of("blockupdate"), new BlockUpdateCommand()); - - return commands.entrySet().stream() - .flatMap(entry -> entry.getKey().stream().map(s -> Map.entry(s, entry.getValue()))) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - }); - - public LeavesCommand() { - super("leaves", "Leaves related commands", "bukkit.command.leaves", SUBCOMMANDS); - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommandUtil.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommandUtil.java deleted file mode 100644 index afb48b7e..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesCommandUtil.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.leavesmc.leaves.command; - -import com.google.common.base.Functions; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import net.minecraft.resources.ResourceLocation; -import org.bukkit.command.CommandSender; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.framework.qual.DefaultQualifier; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@DefaultQualifier(NonNull.class) -public class LeavesCommandUtil { - - private LeavesCommandUtil() { - } - - // Code from Mojang - copyright them - public static List getListMatchingLast( - final CommandSender sender, - final String[] args, - final String... matches - ) { - return getListMatchingLast(sender, args, Arrays.asList(matches)); - } - - public static boolean matches(final String s, final String s1) { - return s1.regionMatches(true, 0, s, 0, s.length()); - } - - public static List getListMatchingLast( - final CommandSender sender, - final String[] strings, - final Collection collection - ) { - return getListMatchingLast(sender, strings, collection, LeavesCommand.BASE_PERM, "bukkit.command.leaves"); - } - - public static List getListMatchingLast( - final CommandSender sender, - final String[] strings, - final Collection collection, - final String basePermission, - final String overridePermission - ) { - String last = strings[strings.length - 1]; - ArrayList results = Lists.newArrayList(); - - if (!collection.isEmpty()) { - - for (String s1 : Iterables.transform(collection, Functions.toStringFunction())) { - if (matches(last, s1) && (sender.hasPermission(basePermission + s1) || sender.hasPermission(overridePermission))) { - results.add(s1); - } - } - - if (results.isEmpty()) { - for (Object object : collection) { - if (object instanceof ResourceLocation && matches(last, ((ResourceLocation) object).getPath())) { - results.add(String.valueOf(object)); - } - } - } - } - - return results; - } - // end copy stuff - - public static List getListClosestMatchingLast( - final CommandSender sender, - final String last, - final Collection collection, - final String overridePermission - ) { - ArrayList candidates = Lists.newArrayList(); - - if (collection.isEmpty() || !sender.hasPermission(overridePermission)) { - return Collections.emptyList(); - } - - String lastLower = last.toLowerCase(); - for (String item : Iterables.transform(collection, Functions.toStringFunction())) { - String itemLower = item.toLowerCase(); - if (itemLower.startsWith(lastLower)) { - candidates.add(Candidate.of(item, 0)); - } else if (itemLower.contains(lastLower)) { - candidates.add(Candidate.of(item, damerauLevenshteinDistance(lastLower, itemLower))); - } - } - candidates.sort(Comparator.comparingInt(c -> c.score)); - - List results = new ArrayList<>(candidates.size()); - for (Candidate candidate : candidates) { - results.add(candidate.item); - } - - return results; - } - - /** - * Computes the Dameraur-Levenshtein Distance between two strings. Adapted - * from the algorithm at Wikipedia: Damerau–Levenshtein distance - * - * @param s1 The first string being compared. - * @param s2 The second string being compared. - * @return The number of substitutions, deletions, insertions, and - * transpositions required to get from s1 to s2. - */ - @SuppressWarnings("DuplicatedCode") - private static int damerauLevenshteinDistance(@Nullable String s1, @Nullable String s2) { - if (s1 == null && s2 == null) { - return 0; - } - if (s1 != null && s2 == null) { - return s1.length(); - } - if (s1 == null && s2 != null) { - return s2.length(); - } - - int s1Len = s1.length(); - int s2Len = s2.length(); - int[][] H = new int[s1Len + 2][s2Len + 2]; - - int INF = s1Len + s2Len; - H[0][0] = INF; - for (int i = 0; i <= s1Len; i++) { - H[i + 1][1] = i; - H[i + 1][0] = INF; - } - for (int j = 0; j <= s2Len; j++) { - H[1][j + 1] = j; - H[0][j + 1] = INF; - } - - Map sd = new HashMap<>(); - for (char Letter : (s1 + s2).toCharArray()) { - if (!sd.containsKey(Letter)) { - sd.put(Letter, 0); - } - } - - for (int i = 1; i <= s1Len; i++) { - int DB = 0; - for (int j = 1; j <= s2Len; j++) { - int i1 = sd.get(s2.charAt(j - 1)); - int j1 = DB; - - if (s1.charAt(i - 1) == s2.charAt(j - 1)) { - H[i + 1][j + 1] = H[i][j]; - DB = j; - } else { - H[i + 1][j + 1] = Math.min(H[i][j], Math.min(H[i + 1][j], H[i][j + 1])) + 1; - } - - H[i + 1][j + 1] = Math.min(H[i + 1][j + 1], H[i1][j1] + (i - i1 - 1) + 1 + (j - j1 - 1)); - } - sd.put(s1.charAt(i - 1), i); - } - - return H[s1Len + 1][s2Len + 1]; - } - - // Copy from org/bukkit/command/defaults/HelpCommand.java - - private record Candidate(String item, int score) { - private static Candidate of(String item, int score) { - return new Candidate(item, score); - } - } -} \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesRootCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesRootCommand.java deleted file mode 100644 index 90bda53e..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesRootCommand.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.leavesmc.leaves.command; - -import it.unimi.dsi.fastutil.Pair; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionDefault; -import org.bukkit.plugin.PluginManager; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import static net.kyori.adventure.text.Component.text; -import static net.kyori.adventure.text.format.NamedTextColor.RED; - -public abstract class LeavesRootCommand extends Command implements LeavesSuggestionCommand { - - protected final String basePermission; - protected final Map subcommands; - - protected LeavesRootCommand( - @NotNull String name, - @NotNull String description, - @NotNull String basePermission, - @NotNull Map subCommands - ) { - super(name, description, String.format("/%s [%s]", name, String.join(" | ", subCommands.keySet())), Collections.emptyList()); - this.basePermission = basePermission; - this.subcommands = subCommands; - - final List permissions = new ArrayList<>(); - permissions.add(basePermission); - permissions.addAll(subCommands.keySet().stream().map(s -> basePermission + "." + s).toList()); - this.setPermission(String.join(";", permissions)); - final PluginManager pluginManager = Bukkit.getServer().getPluginManager(); - for (final String perm : permissions) { - if (pluginManager.getPermission(perm) == null) { - pluginManager.addPermission(new Permission(perm, PermissionDefault.OP)); - } - } - } - - protected boolean testPermission(final CommandSender sender, final String permission) { - if (sender.hasPermission(basePermission) || sender.hasPermission(basePermission + "." + permission)) { - return true; - } - sender.sendMessage(Bukkit.permissionMessage()); - return false; - } - - @Override - public boolean execute(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) { - if (!testPermission(sender) || !isEnabled()) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(unknownMessage()); - return true; - } - final Pair subCommand = resolveCommand(args[0]); - - if (subCommand == null) { - sender.sendMessage(unknownMessage()); - return true; - } - - if (!testPermission(sender, subCommand.first())) { - return true; - } - final String[] choppedArgs = Arrays.copyOfRange(args, 1, args.length); - subCommand.second().execute(sender, subCommand.first(), choppedArgs); - return true; - } - - @Override - public void suggest(final @NotNull CommandSender sender, final @NotNull String alias, final @NotNull String @NotNull [] args, final @Nullable Location location, @NotNull LeavesSuggestionBuilder builder) throws IllegalArgumentException { - if (!testPermission(sender) || !isEnabled()) { - return; - } - if (args.length <= 1) { - LeavesCommandUtil.getListMatchingLast(sender, args, usableSubcommands(), basePermission + ".", basePermission).forEach(builder::suggest); - return; - } - final @Nullable Pair subCommand = resolveCommand(args[0]); - if (subCommand != null) { - subCommand.second().suggest(sender, subCommand.first(), Arrays.copyOfRange(args, 1, args.length), location, builder); - } - } - - public Component unknownMessage() { - return text(String.format("Usage: /%s [%s]", this.getName(), String.join(" | ", usableSubcommands())), RED); - } - - @Nullable - public Pair resolveCommand(String label) { - label = label.toLowerCase(Locale.ENGLISH); - LeavesSubcommand subCommand = subcommands.get(label); - - if (subCommand != null && subCommand.isEnabled()) { - return Pair.of(label, subCommand); - } - - return null; - } - - public Collection usableSubcommands() { - List subcommandList = new ArrayList<>(); - for (var entry : subcommands.entrySet()) { - if (entry.getValue().isEnabled()) { - subcommandList.add(entry.getKey()); - } - } - return subcommandList; - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSubcommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSubcommand.java deleted file mode 100644 index c026b634..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSubcommand.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.leavesmc.leaves.command; - -import org.bukkit.command.CommandSender; - -public interface LeavesSubcommand extends LeavesSuggestionCommand { - void execute(CommandSender sender, String subCommand, String[] args); -} \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionBuilder.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionBuilder.java deleted file mode 100644 index 1eb02281..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionBuilder.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.leavesmc.leaves.command; - -import com.mojang.brigadier.Message; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; - -import java.util.concurrent.CompletableFuture; - -public class LeavesSuggestionBuilder { - - private SuggestionsBuilder vanillaBuilder; - - public LeavesSuggestionBuilder(SuggestionsBuilder builder) { - this.vanillaBuilder = builder; - } - - public CompletableFuture build() { - return vanillaBuilder.buildFuture(); - } - - public LeavesSuggestionBuilder suggest(String text) { - vanillaBuilder.suggest(text); - return this; - } - - public LeavesSuggestionBuilder suggest(String text, Message tooltip) { - vanillaBuilder.suggest(text, tooltip); - return this; - } - - public LeavesSuggestionBuilder suggest(int value) { - vanillaBuilder.suggest(value); - return this; - } - - public LeavesSuggestionBuilder suggest(int value, Message tooltip) { - vanillaBuilder.suggest(value, tooltip); - return this; - } - - public LeavesSuggestionBuilder createOffset(int start) { - vanillaBuilder = vanillaBuilder.createOffset(start); - return this; - } - - public String getInput() { - return vanillaBuilder.getInput(); - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionCommand.java deleted file mode 100644 index ed0f1c5f..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/LeavesSuggestionCommand.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.leavesmc.leaves.command; - -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface LeavesSuggestionCommand { - default void suggest(@NotNull CommandSender sender, @NotNull String alias, @NotNull String @NotNull [] args, @Nullable Location location, LeavesSuggestionBuilder builder) throws IllegalArgumentException { - } - - default boolean isEnabled() { - return true; - } -} \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/LiteralNode.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/LiteralNode.java similarity index 96% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/LiteralNode.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/LiteralNode.java index 94eb69a9..96d80637 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/LiteralNode.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/LiteralNode.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.ArgumentBuilder; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/WrappedArgument.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java similarity index 98% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/WrappedArgument.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java index cda1a019..db8e6747 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/WrappedArgument.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command; +package org.leavesmc.leaves.command; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotArgument.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotArgument.java similarity index 92% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotArgument.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotArgument.java index ee16c072..21bd2202 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotArgument.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotArgument.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot; +package org.leavesmc.leaves.command.bot; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; @@ -11,8 +11,8 @@ import org.bukkit.entity.Player; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.entity.bot.Bot; import org.leavesmc.leaves.entity.bot.CraftBot; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.CustomArgumentType; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CustomArgumentType; import java.util.Collection; import java.util.concurrent.CompletableFuture; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotCommand.java similarity index 56% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotCommand.java index ce526286..c4f846c6 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotCommand.java @@ -1,22 +1,19 @@ -package org.leavesmc.leaves.neo_command.bot; +package org.leavesmc.leaves.command.bot; import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.neo_command.CommandNode; -import org.leavesmc.leaves.neo_command.CommandUtils; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.bot.subcommands.ActionCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.ConfigCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.CreateCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.ListCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.LoadCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.RemoveCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.SaveCommand; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.bot.subcommands.ActionCommand; +import org.leavesmc.leaves.command.bot.subcommands.ConfigCommand; +import org.leavesmc.leaves.command.bot.subcommands.CreateCommand; +import org.leavesmc.leaves.command.bot.subcommands.ListCommand; +import org.leavesmc.leaves.command.bot.subcommands.LoadCommand; +import org.leavesmc.leaves.command.bot.subcommands.RemoveCommand; +import org.leavesmc.leaves.command.bot.subcommands.SaveCommand; -import java.util.ArrayList; -import java.util.List; +import static org.leavesmc.leaves.command.CommandUtils.registerPermissions; public class BotCommand extends LiteralNode { public static final BotCommand INSTANCE = new BotCommand(); @@ -37,10 +34,7 @@ public class BotCommand extends LiteralNode { @Override protected ArgumentBuilder compile() { - List permissions = new ArrayList<>(); - permissions.add(PERM_BASE); - permissions.addAll(this.children.stream().map(CommandNode::getName).toList()); - CommandUtils.registerPermissions(permissions); + registerPermissions(PERM_BASE, this.children); return super.compile(); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotSubcommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotSubcommand.java similarity index 79% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotSubcommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotSubcommand.java index 10998310..f6d215eb 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/BotSubcommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/BotSubcommand.java @@ -1,8 +1,8 @@ -package org.leavesmc.leaves.neo_command.bot; +package org.leavesmc.leaves.command.bot; import net.minecraft.commands.CommandSourceStack; import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.neo_command.LiteralNode; +import org.leavesmc.leaves.command.LiteralNode; public abstract class BotSubcommand extends LiteralNode { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ActionCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java similarity index 65% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ActionCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java index 268efef0..ac3d142f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ActionCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java @@ -1,16 +1,16 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.CustomArgumentNode; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.action.ListCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.action.StartCommand; -import org.leavesmc.leaves.neo_command.bot.subcommands.action.StopCommand; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CustomArgumentNode; +import org.leavesmc.leaves.command.bot.BotSubcommand; +import org.leavesmc.leaves.command.bot.subcommands.action.ListCommand; +import org.leavesmc.leaves.command.bot.subcommands.action.StartCommand; +import org.leavesmc.leaves.command.bot.subcommands.action.StopCommand; public class ActionCommand extends BotSubcommand { @@ -27,7 +27,7 @@ public class ActionCommand extends BotSubcommand { public static class BotArgument extends CustomArgumentNode { protected BotArgument() { - super("bot", new org.leavesmc.leaves.neo_command.bot.BotArgument()); + super("bot", new org.leavesmc.leaves.command.bot.BotArgument()); children( StartCommand::new, StopCommand::new, diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ConfigCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ConfigCommand.java similarity index 93% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ConfigCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ConfigCommand.java index c609e0d4..7247303b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ConfigCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ConfigCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; @@ -11,10 +11,10 @@ import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.Configs; import org.leavesmc.leaves.bot.agent.configs.AbstractBotConfig; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.CustomArgumentNode; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CustomArgumentNode; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.bot.BotSubcommand; import java.util.Collection; import java.util.function.Supplier; @@ -41,7 +41,7 @@ public class ConfigCommand extends BotSubcommand { private static class BotArgument extends CustomArgumentNode { protected BotArgument() { - super("bot", new org.leavesmc.leaves.neo_command.bot.BotArgument()); + super("bot", new org.leavesmc.leaves.command.bot.BotArgument()); Configs.getConfigs().stream() .map(this::configNodeCreator) .forEach(this::children); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/CreateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java similarity index 95% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/CreateCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java index da03268b..b4f51dda 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/CreateCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -20,9 +20,9 @@ import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.BotCreateState; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.event.bot.BotCreateEvent; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.bot.BotSubcommand; import static net.kyori.adventure.text.Component.text; import static net.minecraft.commands.arguments.DimensionArgument.getDimension; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ListCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java similarity index 94% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ListCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java index 00952077..6f444ebe 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/ListCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.exceptions.CommandSyntaxException; import io.papermc.paper.adventure.PaperAdventure; @@ -16,9 +16,9 @@ import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.bot.BotSubcommand; import java.util.List; import java.util.Objects; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/LoadCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java similarity index 92% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/LoadCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java index aebc4efa..00fc8d46 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/LoadCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -11,9 +11,9 @@ import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.bot.BotSubcommand; import java.util.Set; import java.util.concurrent.CompletableFuture; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/RemoveCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/RemoveCommand.java similarity index 94% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/RemoveCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/RemoveCommand.java index 34b11317..a850599b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/RemoveCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/RemoveCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -10,10 +10,10 @@ import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.event.bot.BotRemoveEvent; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.CustomArgumentNode; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CustomArgumentNode; +import org.leavesmc.leaves.command.bot.BotSubcommand; import org.leavesmc.leaves.plugin.MinecraftInternalPlugin; import java.util.regex.Matcher; @@ -44,7 +44,7 @@ public class RemoveCommand extends BotSubcommand { private static class BotArgument extends CustomArgumentNode { public BotArgument() { - super("bot", new org.leavesmc.leaves.neo_command.bot.BotArgument()); + super("bot", new org.leavesmc.leaves.command.bot.BotArgument()); children(RemoveTimeArgument::new); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/SaveCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java similarity index 86% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/SaveCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java index 0c15afbc..28b69dd8 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/SaveCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands; +package org.leavesmc.leaves.command.bot.subcommands; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.kyori.adventure.text.format.NamedTextColor; @@ -9,9 +9,9 @@ import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.event.bot.BotRemoveEvent; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.CustomArgumentNode; -import org.leavesmc.leaves.neo_command.bot.BotSubcommand; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CustomArgumentNode; +import org.leavesmc.leaves.command.bot.BotSubcommand; import static io.papermc.paper.adventure.PaperAdventure.asAdventure; import static net.kyori.adventure.text.Component.join; @@ -33,7 +33,7 @@ public class SaveCommand extends BotSubcommand { private static class BotArgument extends CustomArgumentNode { private BotArgument() { - super("bot", new org.leavesmc.leaves.neo_command.bot.BotArgument()); + super("bot", new org.leavesmc.leaves.command.bot.BotArgument()); } @Override diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/ListCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java similarity index 87% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/ListCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java index 54f90df9..2d39b36c 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/ListCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java @@ -1,13 +1,13 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands.action; +package org.leavesmc.leaves.command.bot.subcommands.action; import com.mojang.brigadier.exceptions.CommandSyntaxException; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.actions.AbstractBotAction; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.bot.subcommands.ActionCommand; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.bot.subcommands.ActionCommand; import java.util.List; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StartCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java similarity index 93% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StartCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java index 7611e284..f5db7acb 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StartCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands.action; +package org.leavesmc.leaves.command.bot.subcommands.action; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; @@ -11,9 +11,9 @@ import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.Actions; import org.leavesmc.leaves.bot.agent.actions.AbstractBotAction; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.WrappedArgument; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.WrappedArgument; import java.util.List; import java.util.Map; @@ -26,7 +26,7 @@ import static net.kyori.adventure.text.JoinConfiguration.spaces; import static net.kyori.adventure.text.event.HoverEvent.showText; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; import static net.kyori.adventure.text.format.NamedTextColor.GRAY; -import static org.leavesmc.leaves.neo_command.bot.subcommands.ActionCommand.BotArgument.getBot; +import static org.leavesmc.leaves.command.bot.subcommands.ActionCommand.BotArgument.getBot; public class StartCommand extends LiteralNode { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StopCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java similarity index 95% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StopCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java index d7b7eda1..13aa77ea 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/bot/subcommands/action/StopCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.neo_command.bot.subcommands.action; +package org.leavesmc.leaves.command.bot.subcommands.action; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -10,10 +10,10 @@ import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.actions.AbstractBotAction; import org.leavesmc.leaves.event.bot.BotActionStopEvent; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.bot.subcommands.ActionCommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.bot.subcommands.ActionCommand; import java.util.HashSet; import java.util.List; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/LeavesCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesCommand.java similarity index 50% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/LeavesCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesCommand.java index 8da87769..368778ab 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/LeavesCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesCommand.java @@ -1,32 +1,38 @@ -package org.leavesmc.leaves.neo_command.leaves; +package org.leavesmc.leaves.command.leaves; import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.neo_command.CommandNode; -import org.leavesmc.leaves.neo_command.CommandUtils; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.leaves.subcommands.ConfigCommand; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand; +import org.leavesmc.leaves.command.leaves.subcommands.ConfigCommand; +import org.leavesmc.leaves.command.leaves.subcommands.CounterCommand; +import org.leavesmc.leaves.command.leaves.subcommands.ReloadCommand; +import org.leavesmc.leaves.command.leaves.subcommands.ReportCommand; +import org.leavesmc.leaves.command.leaves.subcommands.UpdateCommand; -import java.util.ArrayList; -import java.util.List; +import static org.leavesmc.leaves.command.CommandUtils.registerPermissions; public class LeavesCommand extends LiteralNode { public static final LeavesCommand INSTANCE = new LeavesCommand(); private static final String PERM_BASE = "bukkit.command.leaves"; private LeavesCommand() { - super("leaves_new"); - children(ConfigCommand::new); + super("leaves"); + children( + BlockUpdateCommand::new, + ConfigCommand::new, + CounterCommand::new, + ReloadCommand::new, + ReportCommand::new, + UpdateCommand::new + ); } @Override protected ArgumentBuilder compile() { - List permissions = new ArrayList<>(); - permissions.add(PERM_BASE); - permissions.addAll(this.children.stream().map(CommandNode::getName).toList()); - CommandUtils.registerPermissions(permissions); + registerPermissions(PERM_BASE, this.children); return super.compile(); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesSubcommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesSubcommand.java new file mode 100644 index 00000000..fa20c4c8 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/LeavesSubcommand.java @@ -0,0 +1,22 @@ +package org.leavesmc.leaves.command.leaves; + +import net.minecraft.commands.CommandSourceStack; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.command.LiteralNode; + +public abstract class LeavesSubcommand extends LiteralNode { + + protected LeavesSubcommand(String name) { + super(name); + } + + @Override + public boolean requires(@NotNull CommandSourceStack source) { + return hasPermission(source.getSender()); + } + + protected boolean hasPermission(CommandSender sender) { + return LeavesCommand.hasPermission(sender, this.name); + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/BlockUpdateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/BlockUpdateCommand.java new file mode 100644 index 00000000..f9d5e841 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/BlockUpdateCommand.java @@ -0,0 +1,101 @@ +package org.leavesmc.leaves.command.leaves.subcommands; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandSourceStack; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.LeavesConfig; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; + +import static net.kyori.adventure.text.Component.join; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.JoinConfiguration.spaces; +import static net.kyori.adventure.text.format.NamedTextColor.AQUA; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; + +public class BlockUpdateCommand extends LeavesSubcommand { + private static boolean noBlockUpdate = false; + + public static boolean isNoBlockUpdate() { + return LeavesConfig.modify.noBlockUpdateCommand && noBlockUpdate; + } + + public BlockUpdateCommand() { + super("blockupdate"); + children( + EnableNode::new, + DisableNode::new + ); + } + + @Override + protected boolean execute(@NotNull CommandContext context) throws CommandSyntaxException { + context.getSender().sendMessage(join(spaces(), + text("Block update is", GRAY), + text(noBlockUpdate ? "disabled" : "enabled", AQUA) + )); + return true; + } + + @Override + public boolean requires(@NotNull CommandSourceStack source) { + return LeavesConfig.modify.noBlockUpdateCommand && super.requires(source); + } + + private class EnableNode extends LiteralNode { + + private EnableNode() { + super("enable"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + CommandSender sender = context.getSender(); + if (!noBlockUpdate) { + sender.sendMessage(join(spaces(), + text("Block update is already", GRAY), + text("enabled", AQUA) + )); + return true; + } + noBlockUpdate = false; + Bukkit.getOnlinePlayers().stream() + .filter(BlockUpdateCommand.this::hasPermission) + .forEach(player -> player.sendMessage(join(spaces(), + text("Block update is", GRAY), + text("enabled", AQUA) + ))); + return true; + } + } + + private class DisableNode extends LiteralNode { + + private DisableNode() { + super("disable"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + CommandSender sender = context.getSender(); + if (noBlockUpdate) { + sender.sendMessage(join(spaces(), + text("Block update is already", GRAY), + text("disabled", AQUA) + )); + return true; + } + noBlockUpdate = true; + Bukkit.getOnlinePlayers().stream() + .filter(BlockUpdateCommand.this::hasPermission) + .forEach(player -> player.sendMessage(join(spaces(), + text("Block update is", GRAY), + text("disabled", AQUA) + ))); + return true; + } + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/subcommands/ConfigCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java similarity index 84% rename from leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/subcommands/ConfigCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java index 6e203d93..ea319e4a 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/neo_command/leaves/subcommands/ConfigCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java @@ -1,19 +1,16 @@ -package org.leavesmc.leaves.neo_command.leaves.subcommands; +package org.leavesmc.leaves.command.leaves.subcommands; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.commands.CommandSourceStack; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.leavesmc.leaves.command.LeavesCommandUtil; import org.leavesmc.leaves.config.GlobalConfigManager; import org.leavesmc.leaves.config.VerifiedConfig; -import org.leavesmc.leaves.neo_command.ArgumentNode; -import org.leavesmc.leaves.neo_command.CommandContext; -import org.leavesmc.leaves.neo_command.LiteralNode; -import org.leavesmc.leaves.neo_command.leaves.LeavesCommand; +import org.leavesmc.leaves.command.ArgumentNode; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; import java.util.concurrent.CompletableFuture; @@ -21,20 +18,15 @@ import static net.kyori.adventure.text.Component.join; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.JoinConfiguration.spaces; import static net.kyori.adventure.text.format.NamedTextColor.*; -import static org.leavesmc.leaves.neo_command.CommandUtils.getListClosestMatchingLast; +import static org.leavesmc.leaves.command.CommandUtils.getListClosestMatchingLast; -public class ConfigCommand extends LiteralNode { +public class ConfigCommand extends LeavesSubcommand { public ConfigCommand() { super("config"); children(PathArgument::new); } - @Override - public boolean requires(@NotNull CommandSourceStack source) { - return LeavesCommand.hasPermission(source.getSender(), "config"); - } - private static class PathArgument extends ArgumentNode { public PathArgument() { @@ -93,18 +85,13 @@ public class ConfigCommand extends LiteralNode { @Override protected CompletableFuture getSuggestions(@NotNull CommandContext context, @NotNull SuggestionsBuilder builder) { String path = context.getArgument(PathArgument.class); - String value = context.getArgumentOrDefault(ValueArgument.class, ""); VerifiedConfig verifiedConfig = GlobalConfigManager.getVerifiedConfig(path); if (verifiedConfig == null) { return builder .suggest("", net.minecraft.network.chat.Component.literal("This config path does not exist.")) .buildFuture(); } - LeavesCommandUtil.getListMatchingLast( - context.getSender(), - new String[]{value}, - verifiedConfig.validator().valueSuggest() - ).forEach(builder::suggest); + verifiedConfig.validator().valueSuggest().forEach(builder::suggest); return builder.buildFuture(); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/CounterCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/CounterCommand.java new file mode 100644 index 00000000..2fec3238 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/CounterCommand.java @@ -0,0 +1,170 @@ +package org.leavesmc.leaves.command.leaves.subcommands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.DyeColor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.LeavesConfig; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; +import org.leavesmc.leaves.util.HopperCounter; + +import static net.kyori.adventure.text.Component.join; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.JoinConfiguration.spaces; +import static net.kyori.adventure.text.format.NamedTextColor.AQUA; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; + +public class CounterCommand extends LeavesSubcommand { + + public CounterCommand() { + super("counter"); + children( + EnableNode::new, + DisableNode::new, + ResetAllNode::new + ); + for (DyeColor color : DyeColor.values()) { + children(() -> new ColorNode(color)); + } + } + + @Override + public boolean requires(@NotNull CommandSourceStack source) { + return LeavesConfig.modify.hopperCounter.enable && super.requires(source); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + context.getSender().sendMessage(join(spaces(), + text("Hopper counter is", GRAY), + text(HopperCounter.isEnabled() ? "enabled" : "disabled", AQUA) + )); + return true; + } + + private static class EnableNode extends LiteralNode { + + private EnableNode() { + super("enable"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + CommandSender sender = context.getSender(); + if (HopperCounter.isEnabled()) { + sender.sendMessage(join(spaces(), + text("Hopper counter is already", GRAY), + text("disabled", AQUA) + )); + return true; + } + HopperCounter.setEnabled(true); + sender.sendMessage(join(spaces(), + text("Hopper counter is now", GRAY), + text("enabled", AQUA) + )); + return true; + } + } + + private static class DisableNode extends LiteralNode { + + private DisableNode() { + super("disable"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + CommandSender sender = context.getSender(); + if (!HopperCounter.isEnabled()) { + sender.sendMessage(join(spaces(), + text("Hopper counter is already", GRAY), + text("disabled", AQUA) + )); + return true; + } + HopperCounter.setEnabled(false); + sender.sendMessage(join(spaces(), + text("Hopper counter is now", GRAY), + text("disabled", AQUA) + )); + return true; + } + } + + private static class ResetAllNode extends LiteralNode { + + private ResetAllNode() { + super("reset"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + HopperCounter.resetAll(MinecraftServer.getServer(), false); + context.getSender().sendMessage(text("Restarted all counters", GRAY)); + return true; + } + } + + private static class ColorNode extends LiteralNode { + private final DyeColor color; + private final HopperCounter counter; + + private ColorNode(@NotNull DyeColor color) { + super(color.getName()); + this.color = color; + this.counter = HopperCounter.getCounter(color); + children( + ResetNode::new, + RealtimeNode::new + ); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + displayCounter(context.getSender(), false); + return true; + } + + private void displayCounter(CommandSender sender, boolean realTime) { + for (Component component : counter.format(MinecraftServer.getServer(), realTime)) { + sender.sendMessage(component); + } + } + + private class ResetNode extends LiteralNode { + + private ResetNode() { + super("reset"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + counter.reset(MinecraftServer.getServer()); + context.getSender().sendMessage(join(spaces(), + text("Restarted counter", GRAY), + text(color.getName(), TextColor.color(color.getTextColor())) + )); + return true; + } + } + + private class RealtimeNode extends LiteralNode { + + private RealtimeNode() { + super("realtime"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) { + displayCounter(context.getSender(), true); + return true; + } + } + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReloadCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReloadCommand.java new file mode 100644 index 00000000..72be57c2 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReloadCommand.java @@ -0,0 +1,30 @@ +package org.leavesmc.leaves.command.leaves.subcommands; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.LeavesConfig; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; + +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.GREEN; + +public class ReloadCommand extends LeavesSubcommand { + + public ReloadCommand() { + super("reload"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) throws CommandSyntaxException { + LeavesConfig.reload(); + CommandSender sender = context.getSender(); + sender.sendMessage(text("Leaves config reload complete", GREEN)); + Bukkit.getOnlinePlayers().stream() + .filter(player -> player.hasPermission("leaves.command.config.notify") && player != sender) + .forEach(player -> player.sendMessage(text("Leaves config reloaded", GREEN))); + return true; + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReportCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReportCommand.java similarity index 67% rename from leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReportCommand.java rename to leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReportCommand.java index 924fa03b..99984ee2 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReportCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ReportCommand.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.command.subcommands; +package org.leavesmc.leaves.command.leaves.subcommands; import io.papermc.paper.plugin.configuration.PluginMeta; import io.papermc.paper.plugin.entrypoint.Entrypoint; @@ -8,22 +8,18 @@ import io.papermc.paper.plugin.provider.type.paper.PaperPluginParent; import io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; import net.minecraft.server.MinecraftServer; import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.world.flag.FeatureFlagSet; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.leavesmc.leaves.command.LeavesCommandUtil; -import org.leavesmc.leaves.command.LeavesSubcommand; -import org.leavesmc.leaves.command.LeavesSuggestionBuilder; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LiteralNode; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; import org.leavesmc.leaves.plugin.provider.configuration.LeavesPluginMeta; import java.net.URLEncoder; @@ -33,17 +29,43 @@ import java.util.List; import java.util.TreeMap; import java.util.concurrent.CompletableFuture; +import static net.kyori.adventure.text.Component.join; import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.JoinConfiguration.noSeparators; +import static net.kyori.adventure.text.JoinConfiguration.spaces; import static net.kyori.adventure.text.format.NamedTextColor.AQUA; -import static net.kyori.adventure.text.format.NamedTextColor.RED; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; +import static net.kyori.adventure.text.format.TextDecoration.UNDERLINED; -public class ReportCommand implements LeavesSubcommand { +public class ReportCommand extends LeavesSubcommand { + private static final String BASE_URL = "https://github.com/LeavesMC/Leaves/issues/new?template="; + private static final String BUG_REPORT_URL = BASE_URL + "1-bug-report.yml&leaves-version=${version}&plugin-list=${plugins}%0a%0a${datapacks}"; + private static final String NOT_VANILLA_URL = BASE_URL + "2-not-vanilla.yml&leaves-version=${version}"; - private static final String BUG_REPORT_URL = "https://github.com/LeavesMC/Leaves/issues/new?template=1-bug-report.yml&leaves-version=${version}&plugin-list=${plugins}%0a%0a${datapacks}"; - private static final String NOT_VANILLA_URL = "https://github.com/LeavesMC/Leaves/issues/new?template=2-not-vanilla.yml&leaves-version=${version}"; - private static final String COMMAND_PERM = "bukkit.command.leaves.report"; + public ReportCommand() { + super("report"); + children( + () -> new ReportTypeNode("bug-report", BUG_REPORT_URL), + () -> new ReportTypeNode("not-vanilla", NOT_VANILLA_URL) + ); + } - private static String generatePluginMessage() { + private static class ReportTypeNode extends LiteralNode { + private final String url; + + private ReportTypeNode(String type, String url) { + super(type); + this.url = url; + } + + @Override + protected boolean execute(CommandContext context) { + CompletableFuture.runAsync(() -> sendOnSuccess(context.getSender(), url, name)); + return true; + } + } + + private static @NotNull String generatePluginMessage() { final StringBuilder pluginList = new StringBuilder(); final TreeMap> paperPlugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); @@ -98,7 +120,7 @@ public class ReportCommand implements LeavesSubcommand { return pluginList.toString(); } - private static String generateDataPackMessage() { + private static @NotNull String generateDataPackMessage() { final StringBuilder dataPackList = new StringBuilder(); PackRepository packRepository = MinecraftServer.getServer().getPackRepository(); @@ -130,39 +152,30 @@ public class ReportCommand implements LeavesSubcommand { return dataPackList.toString(); } - @Override - public void execute(CommandSender sender, String subCommand, String[] args) { - if (args.length < 1) { - sender.sendMessage(text("Please select a report template: \"bug-report\" or \"not-vanilla\"", RED)); - return; - } - if (args[0].equals("bug-report")) { - CompletableFuture.runAsync(() -> sendOnSuccess(sender, BUG_REPORT_URL, Component.text("Successfully generated report url for \"bug-report\"", AQUA))); - return; - } else if (args[0].equals("not-vanilla")) { - CompletableFuture.runAsync(() -> sendOnSuccess(sender, NOT_VANILLA_URL, Component.text("Successfully generated report url for \"not-vanilla\"", AQUA))); - return; - } - sender.sendMessage(text("The template" + args[0] + " does not exist! Please select a correct template: \"bug-report\" or \"not-vanilla\"", RED)); - } - - @Override - public void suggest(@NotNull CommandSender sender, @NotNull String alias, @NotNull String @NotNull [] args, @Nullable Location location, LeavesSuggestionBuilder builder) throws IllegalArgumentException { - if (args.length <= 1) { - LeavesCommandUtil.getListMatchingLast(sender, args, List.of("bug-report", "not-vanilla"), COMMAND_PERM + ".", COMMAND_PERM).forEach(builder::suggest); - } - } - - private void sendOnSuccess(CommandSender sender, String template, Component component) { + private static void sendOnSuccess(@NotNull CommandSender sender, @NotNull String template, String type) { String finalUrl = template .replace("${version}", URLEncoder.encode(Bukkit.getVersionMessage(), StandardCharsets.UTF_8)) .replace("${plugins}", URLEncoder.encode(generatePluginMessage(), StandardCharsets.UTF_8)) .replace("${datapacks}", URLEncoder.encode(generateDataPackMessage(), StandardCharsets.UTF_8)); + Component base = join(noSeparators(), + text("Successfully generated report url for ", GRAY), + text(type, AQUA), + text(",", GRAY) + ); if (sender instanceof ConsoleCommandSender) { - sender.sendMessage(component.append(text(", please copy it as you are running this command in console"))); - sender.sendMessage(text(finalUrl, AQUA).decorate(TextDecoration.UNDERLINED)); + sender.sendMessage(join(spaces(), + base, + text("please open it in your browser:", GRAY), + text(finalUrl, AQUA) + )); } else { - sender.sendMessage(component.append(text(", click this message to open")).decorate(TextDecoration.UNDERLINED).hoverEvent(Component.text("Click to open the report url", NamedTextColor.WHITE)).clickEvent(ClickEvent.openUrl(finalUrl))); + sender.sendMessage(join(spaces(), + base, + text("click here to continue", AQUA) + .decorate(UNDERLINED) + .hoverEvent(text("Open the report url")) + .clickEvent(ClickEvent.openUrl(finalUrl)) + )); } } } \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/UpdateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/UpdateCommand.java new file mode 100644 index 00000000..0193466c --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/UpdateCommand.java @@ -0,0 +1,31 @@ +package org.leavesmc.leaves.command.leaves.subcommands; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.leaves.LeavesSubcommand; +import org.leavesmc.leaves.util.LeavesUpdateHelper; + +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; + +public class UpdateCommand extends LeavesSubcommand { + + public UpdateCommand() { + super("update"); + } + + @Override + protected boolean execute(@NotNull CommandContext context) throws CommandSyntaxException { + CommandSender sender = context.getSender(); + if (sender instanceof ConsoleCommandSender) { + sender.sendMessage(text("Trying to update Leaves...", GRAY)); + } else { + sender.sendMessage(text("Trying to update Leaves, see the console for more info", GRAY)); + } + LeavesUpdateHelper.tryUpdateLeaves(); + return true; + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/BlockUpdateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/BlockUpdateCommand.java deleted file mode 100644 index 18477f57..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/BlockUpdateCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.leavesmc.leaves.command.subcommands; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.JoinConfiguration; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.command.LeavesSubcommand; - -public class BlockUpdateCommand implements LeavesSubcommand { - - private static boolean noBlockUpdate = false; - - public static boolean isNoBlockUpdate() { - return LeavesConfig.modify.noBlockUpdateCommand && noBlockUpdate; - } - - @Override - public void execute(@NotNull CommandSender sender, @NotNull String commandLabel, String @NotNull [] args) { - noBlockUpdate = !noBlockUpdate; - Bukkit.broadcast(Component.join(JoinConfiguration.noSeparators(), - Component.text("Block update status: ", NamedTextColor.GRAY), - Component.text(!noBlockUpdate, noBlockUpdate ? NamedTextColor.AQUA : NamedTextColor.GRAY) - ), "bukkit.command.leaves.blockupdate"); - } - - @Override - public boolean isEnabled() { - return LeavesConfig.modify.noBlockUpdateCommand; - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ConfigCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ConfigCommand.java deleted file mode 100644 index e5349244..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ConfigCommand.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.leavesmc.leaves.command.subcommands; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.JoinConfiguration; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.leavesmc.leaves.command.LeavesCommandUtil; -import org.leavesmc.leaves.command.LeavesSubcommand; -import org.leavesmc.leaves.command.LeavesSuggestionBuilder; -import org.leavesmc.leaves.config.GlobalConfigManager; -import org.leavesmc.leaves.config.VerifiedConfig; - -import static net.kyori.adventure.text.Component.text; - -public class ConfigCommand implements LeavesSubcommand { - - @Override - public void execute(CommandSender sender, String subCommand, String[] args) { - if (args.length < 1) { - sender.sendMessage(text("Leaves Config", NamedTextColor.GRAY)); - return; - } - - VerifiedConfig verifiedConfig = GlobalConfigManager.getVerifiedConfig(args[0]); - if (verifiedConfig == null) { - sender.sendMessage(Component.join(JoinConfiguration.spaces(), - text("Config", NamedTextColor.GRAY), - text(args[0], NamedTextColor.RED), - text("is Not Found.", NamedTextColor.GRAY) - )); - return; - } - - if (args.length > 1) { - try { - verifiedConfig.set(args[1]); - sender.sendMessage(Component.join(JoinConfiguration.spaces(), - text("Config", NamedTextColor.GRAY), - text(args[0], NamedTextColor.AQUA), - text("changed to", NamedTextColor.GRAY), - text(verifiedConfig.getString(), NamedTextColor.AQUA) - )); - Bukkit.getOnlinePlayers().stream().filter(player -> player.hasPermission("leaves.command.config.notify") && player != sender).forEach( - player -> player.sendMessage(Component.join(JoinConfiguration.spaces(), - text(sender.getName() + ":", NamedTextColor.GRAY), - text("Config", NamedTextColor.GRAY), - text(args[0], NamedTextColor.AQUA), - text("changed to", NamedTextColor.GRAY), - text(verifiedConfig.getString(), NamedTextColor.AQUA) - )) - ); - } catch (IllegalArgumentException exception) { - sender.sendMessage(Component.join(JoinConfiguration.spaces(), - text("Config", NamedTextColor.GRAY), - text(args[0], NamedTextColor.RED), - text("modify error by", NamedTextColor.GRAY), - text(exception.getMessage(), NamedTextColor.RED) - )); - } - } else { - sender.sendMessage(Component.join(JoinConfiguration.spaces(), - text("Config", NamedTextColor.GRAY), - text(args[0], NamedTextColor.AQUA), - text("value is", NamedTextColor.GRAY), - text(verifiedConfig.getString(), NamedTextColor.AQUA) - )); - } - } - - @Override - public void suggest(@NotNull CommandSender sender, @NotNull String subCommand, String @NotNull [] args, @Nullable Location location, @NotNull LeavesSuggestionBuilder builder) { - if (args.length <= 1) { - String arg = args[0]; - int dotIndex = arg.lastIndexOf("."); - builder.createOffset(builder.getInput().lastIndexOf(' ') + dotIndex + 2); - LeavesCommandUtil.getListClosestMatchingLast(sender, arg.substring(dotIndex + 1), GlobalConfigManager.getVerifiedConfigSubPaths(arg), "bukkit.command.leaves.config") - .forEach(builder::suggest); - } - if (args.length == 2) { - VerifiedConfig verifiedConfig = GlobalConfigManager.getVerifiedConfig(args[0]); - if (verifiedConfig != null) { - LeavesCommandUtil.getListMatchingLast(sender, args, verifiedConfig.validator().valueSuggest()).forEach(builder::suggest); - } else { - builder.suggest(""); - } - } - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java deleted file mode 100644 index f2f87cd9..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.leavesmc.leaves.command.subcommands; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.JoinConfiguration; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextColor; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.item.DyeColor; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.command.LeavesCommandUtil; -import org.leavesmc.leaves.command.LeavesSubcommand; -import org.leavesmc.leaves.command.LeavesSuggestionBuilder; -import org.leavesmc.leaves.util.HopperCounter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class CounterCommand implements LeavesSubcommand { - - @Override - public void execute(CommandSender sender, String subCommand, String[] args) { - if (args.length < 1) { - sender.sendMessage(Component.join(JoinConfiguration.noSeparators(), - Component.text("Hopper Counter: ", NamedTextColor.GRAY), - Component.text(HopperCounter.isEnabled(), HopperCounter.isEnabled() ? NamedTextColor.AQUA : NamedTextColor.GRAY) - )); - } - - if (!HopperCounter.isEnabled()) { - if (args[0].equals("enable")) { - HopperCounter.setEnabled(true); - sender.sendMessage(Component.text("Hopper Counter now is enabled", NamedTextColor.AQUA)); - } else { - sender.sendMessage(Component.text("Hopper Counter is not enabled", NamedTextColor.RED)); - } - } - - DyeColor color = DyeColor.byName(args[0], null); - if (color != null) { - HopperCounter counter = HopperCounter.getCounter(color); - if (args.length < 2) { - displayCounter(sender, counter, false); - return; - } - switch (args[1]) { - case "reset" -> { - counter.reset(MinecraftServer.getServer()); - sender.sendMessage(Component.join(JoinConfiguration.noSeparators(), - Component.text("Restarted "), - Component.text(color.getName(), TextColor.color(color.getTextColor())), - Component.text(" counter") - )); - } - case "realtime" -> displayCounter(sender, counter, true); - } - } - - switch (args[0]) { - case "reset" -> { - HopperCounter.resetAll(MinecraftServer.getServer(), false); - sender.sendMessage(Component.text("Restarted all counters")); - } - case "disable" -> { - HopperCounter.setEnabled(false); - HopperCounter.resetAll(MinecraftServer.getServer(), true); - sender.sendMessage(Component.text("Hopper Counter now is disabled", NamedTextColor.GRAY)); - } - } - } - - private void displayCounter(CommandSender sender, @NotNull HopperCounter counter, boolean realTime) { - for (Component component : counter.format(MinecraftServer.getServer(), realTime)) { - sender.sendMessage(component); - } - } - - @Override - public void suggest(@NotNull CommandSender sender, @NotNull String alias, @NotNull String @NotNull [] args, @Nullable Location location, LeavesSuggestionBuilder builder) throws IllegalArgumentException { - if (args.length <= 1) { - if (!HopperCounter.isEnabled()) { - builder.suggest("enable"); - return; - } - - List list = new ArrayList<>(Arrays.stream(DyeColor.values()).map(DyeColor::getName).toList()); - list.add("reset"); - list.add("disable"); - LeavesCommandUtil.getListMatchingLast(sender, args, list).forEach(builder::suggest); - } - if (args.length == 2) { - if (DyeColor.byName(args[0], null) != null) { - LeavesCommandUtil.getListMatchingLast(sender, args, "reset", "realtime").forEach(builder::suggest); - } - } - } - - @Override - public boolean isEnabled() { - return LeavesConfig.modify.hopperCounter.enable; - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReloadCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReloadCommand.java deleted file mode 100644 index 4697c546..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/ReloadCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.leavesmc.leaves.command.subcommands; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.leavesmc.leaves.LeavesConfig; -import org.leavesmc.leaves.command.LeavesSubcommand; - -import static net.kyori.adventure.text.Component.text; -import static net.kyori.adventure.text.format.NamedTextColor.GREEN; - -public class ReloadCommand implements LeavesSubcommand { - @Override - public void execute(CommandSender sender, String subCommand, String[] args) { - LeavesConfig.reload(); - sender.sendMessage(text("Leaves config reload complete.", GREEN)); - Bukkit.getOnlinePlayers().stream().filter(player -> player.hasPermission("leaves.command.config.notify") && player != sender).forEach( - player -> player.sendMessage(text("Leaves config reload complete.", GREEN)) - ); - } -} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/UpdateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/UpdateCommand.java deleted file mode 100644 index 4af4c88f..00000000 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/UpdateCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.leavesmc.leaves.command.subcommands; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.command.CommandSender; -import org.leavesmc.leaves.command.LeavesSubcommand; -import org.leavesmc.leaves.util.LeavesUpdateHelper; - -public class UpdateCommand implements LeavesSubcommand { - - @Override - public void execute(CommandSender sender, String subCommand, String[] args) { - sender.sendMessage(Component.text("Trying to update Leaves, see the console for more info.", NamedTextColor.GRAY)); - LeavesUpdateHelper.tryUpdateLeaves(); - } -}