From b6587773411d2bbb5bdfbb1bbca6c46f54186dc0 Mon Sep 17 00:00:00 2001 From: MC_XiaoHei Date: Wed, 24 Sep 2025 23:33:31 +0800 Subject: [PATCH] feat: try to impl custom --- .../leaves/command/LeavesCommandContext.java | 57 +++++++++++++++++++ .../leaves/command/LeavesWrappedArgument.java | 35 ++++++++++++ .../leaves/entity/bot/BotManager.java | 5 ++ .../entity/bot/action/CustomBotAction.java | 51 +++++++++++++++++ .../org/leavesmc/leaves/util}/ExtraData.java | 2 +- .../leavesmc/leaves/bot/agent/Actions.java | 4 ++ .../bot/agent/actions/AbstractBotAction.java | 6 +- .../agent/actions/AbstractTimerBotAction.java | 6 +- .../agent/actions/AbstractUseBotAction.java | 6 +- .../agent/actions/ServerCustomBotAction.java | 54 ++++++++++++++++++ .../bot/agent/actions/ServerLookAction.java | 4 +- .../bot/agent/actions/ServerMoveAction.java | 6 +- .../agent/actions/ServerRotationAction.java | 6 +- .../bot/agent/configs/AbstractBotConfig.java | 8 +-- .../agent/configs/AlwaysSendDataConfig.java | 4 +- .../bot/agent/configs/LocatorBarConfig.java | 4 +- .../configs/SimulationDistanceConfig.java | 6 +- .../bot/agent/configs/SkipSleepConfig.java | 4 +- .../bot/agent/configs/SpawnPhantomConfig.java | 6 +- .../bot/agent/configs/TickTypeConfig.java | 4 +- .../leaves/command/CommandContext.java | 4 +- .../leaves/command/WrappedArgument.java | 15 +---- .../bot/subcommands/ActionCommand.java | 1 + .../bot/subcommands/CreateCommand.java | 1 + .../command/bot/subcommands/ListCommand.java | 1 + .../command/bot/subcommands/LoadCommand.java | 1 + .../command/bot/subcommands/SaveCommand.java | 1 + .../bot/subcommands/action/ListCommand.java | 1 + .../bot/subcommands/action/StartCommand.java | 1 + .../bot/subcommands/action/StopCommand.java | 1 + .../subcommands/BlockUpdateCommand.java | 1 + .../leaves/subcommands/ConfigCommand.java | 1 + .../leaves/subcommands/ReloadCommand.java | 1 + .../leaves/entity/bot/CraftBotManager.java | 17 ++++++ .../bot/actions/CraftCustomBotAction.java | 11 ++++ 35 files changed, 284 insertions(+), 52 deletions(-) create mode 100644 leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesCommandContext.java create mode 100644 leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesWrappedArgument.java create mode 100644 leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/CustomBotAction.java rename {leaves-server/src/main/java/org/leavesmc/leaves/bot/agent => leaves-api/src/main/java/org/leavesmc/leaves/util}/ExtraData.java (85%) create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerCustomBotAction.java create mode 100644 leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftCustomBotAction.java diff --git a/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesCommandContext.java b/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesCommandContext.java new file mode 100644 index 00000000..53f4fa22 --- /dev/null +++ b/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesCommandContext.java @@ -0,0 +1,57 @@ +package org.leavesmc.leaves.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; +import com.mojang.brigadier.context.ParsedCommandNode; +import com.mojang.brigadier.context.StringRange; +import com.mojang.brigadier.tree.CommandNode; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface LeavesCommandContext { + + com.mojang.brigadier.context.CommandContext getChild(); + + com.mojang.brigadier.context.CommandContext getLastChild(); + + Command getCommand(); + + CommandSourceStack getSource(); + + CommandSender getSender(); + + @NotNull V getArgument(final String name, final Class clazz); + + int getInteger(final String name); + + boolean getBoolean(final String name); + + String getString(final String name); + + V getArgumentOrDefault(final String name, final Class clazz, final V defaultValue); + + String getStringOrDefault(final String name, final String defaultValue); + + int getIntegerOrDefault(final String name, final int defaultValue); + + float getFloatOrDefault(final String name, final float defaultValue); + + RedirectModifier getRedirectModifier(); + + StringRange getRange(); + + String getInput(); + + CommandNode getRootNode(); + + List> getNodes(); + + boolean hasNodes(); + + boolean isForked(); + + com.mojang.brigadier.context.CommandContext rawContext(); +} diff --git a/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesWrappedArgument.java b/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesWrappedArgument.java new file mode 100644 index 00000000..7ecdd4f0 --- /dev/null +++ b/leaves-api/src/main/java/org/leavesmc/leaves/command/LeavesWrappedArgument.java @@ -0,0 +1,35 @@ +package org.leavesmc.leaves.command; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; + +import java.util.concurrent.CompletableFuture; + +@SuppressWarnings("unused") +public interface LeavesWrappedArgument { + + LeavesWrappedArgument suggestsAsync(AsyncSuggestionProvider provider); + + LeavesWrappedArgument suggests(SuggestionApplier provider); + + LeavesWrappedArgument setOptional(boolean optional); + + boolean isOptional(); + + @FunctionalInterface + interface SuggestionApplier { + void applySuggestions(final LeavesCommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException; + } + + @FunctionalInterface + interface AsyncSuggestionProvider { + CompletableFuture getSuggestions(final LeavesCommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException; + } + + interface ArgumentHandler { + LeavesWrappedArgument create(String name, com.mojang.brigadier.arguments.ArgumentType type); + + void fork(int forkId); + } +} diff --git a/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/BotManager.java b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/BotManager.java index c434364f..2e671cc5 100644 --- a/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/BotManager.java +++ b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/BotManager.java @@ -4,6 +4,7 @@ import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.entity.bot.action.BotAction; +import org.leavesmc.leaves.entity.bot.action.CustomBotAction; import java.util.Collection; import java.util.UUID; @@ -45,4 +46,8 @@ public interface BotManager { > T newAction(@NotNull Class type); BotCreator botCreator(@NotNull String realName, @NotNull Location location); + + boolean registerCustomAction(@NotNull CustomBotAction customBotAction, boolean resendCommandTree); + + boolean registerCustomAction(@NotNull CustomBotAction customBotAction); } diff --git a/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/CustomBotAction.java b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/CustomBotAction.java new file mode 100644 index 00000000..0f7d35ff --- /dev/null +++ b/leaves-api/src/main/java/org/leavesmc/leaves/entity/bot/action/CustomBotAction.java @@ -0,0 +1,51 @@ +package org.leavesmc.leaves.entity.bot.action; + +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.command.LeavesWrappedArgument; +import org.leavesmc.leaves.entity.bot.Bot; +import org.leavesmc.leaves.util.ExtraData; + +@SuppressWarnings("unused") +public abstract class CustomBotAction { + private LeavesWrappedArgument.ArgumentHandler factory; + + public abstract boolean doTick(@NotNull Bot bot); + + public abstract String getName(); + + public void init() { + } + + public void loadCommand(CommandContext context) { + } + + public void provideActionData(@NotNull ExtraData data) { + } + + public void provideArgumentFactory(LeavesWrappedArgument.ArgumentHandler factory) { + this.factory = factory; + } + + protected LeavesWrappedArgument addArgument(String name, ArgumentType type) { + if (factory == null) { + throw new IllegalStateException("Argument factory not provided! Are you calling addArgument() outside of init() method?"); + } + return factory.create(name, type); + } + + protected void fork(int forkId) { + if (factory == null) { + throw new IllegalStateException("Argument factory not provided! Are you calling fork() outside of init() method?"); + } + factory.fork(forkId); + } + + @ApiStatus.Internal + public interface InternalCustomBotAction extends BotAction { + + } +} diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/ExtraData.java b/leaves-api/src/main/java/org/leavesmc/leaves/util/ExtraData.java similarity index 85% rename from leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/ExtraData.java rename to leaves-api/src/main/java/org/leavesmc/leaves/util/ExtraData.java index 46c852ab..86143042 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/ExtraData.java +++ b/leaves-api/src/main/java/org/leavesmc/leaves/util/ExtraData.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.bot.agent; +package org.leavesmc.leaves.util; import org.apache.commons.lang3.tuple.Pair; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java index 214165eb..0bc418c7 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/Actions.java @@ -38,6 +38,10 @@ public class Actions { register(new ServerSwapAction(), SwapAction.class); } + public static boolean register(@NotNull CustomBotAction customBotAction) { + return register(new ServerCustomBotAction(customBotAction), customBotAction.getClass()); + } + public static boolean register(@NotNull AbstractBotAction action, Class type) { if (!actionsByName.containsKey(action.getName())) { actionsByName.put(action.getName(), action); 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 b59b0be5..bbd12ff1 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 @@ -8,8 +8,8 @@ import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesLogger; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.WrappedArgument; import org.leavesmc.leaves.event.bot.BotActionExecuteEvent; import org.leavesmc.leaves.event.bot.BotActionStopEvent; @@ -181,7 +181,7 @@ public abstract class AbstractBotAction> { } @SuppressWarnings("RedundantThrows") - public void loadCommand(@NotNull CommandContext context) throws CommandSyntaxException { + public void loadCommand(@NotNull LeavesCommandContext context) throws CommandSyntaxException { } @NotNull 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 817b5ec0..ecf4d4e3 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,8 +2,8 @@ package org.leavesmc.leaves.bot.agent.actions; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; -import org.leavesmc.leaves.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; import java.util.function.Supplier; @@ -22,7 +22,7 @@ public abstract class AbstractTimerBotAction } @Override - public void loadCommand(@NotNull CommandContext context) { + public void loadCommand(@NotNull LeavesCommandContext context) { this.setStartDelayTick(context.getIntegerOrDefault("delay", 0)); this.setDoIntervalTick(context.getIntegerOrDefault("interval", 20)); this.setDoNumber(context.getIntegerOrDefault("do_number", 1)); 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 2d2fa41b..86a38e68 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 @@ -5,8 +5,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.event.bot.BotActionStopEvent; import java.util.function.Supplier; @@ -30,7 +30,7 @@ public abstract class AbstractUseBotAction> ex } @Override - public void loadCommand(@NotNull CommandContext context) { + public void loadCommand(@NotNull LeavesCommandContext context) { super.loadCommand(context); this.useTickTimeout = context.getIntegerOrDefault("use_timeout", -1); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerCustomBotAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerCustomBotAction.java new file mode 100644 index 00000000..d051e9b2 --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerCustomBotAction.java @@ -0,0 +1,54 @@ +package org.leavesmc.leaves.bot.agent.actions; + +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.bot.ServerBot; +import org.leavesmc.leaves.command.LeavesWrappedArgument; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; +import org.leavesmc.leaves.entity.bot.action.CustomBotAction; +import org.leavesmc.leaves.entity.bot.actions.CraftCustomBotAction; + +public class ServerCustomBotAction extends AbstractBotAction { + private final CustomBotAction customBotAction; + + public ServerCustomBotAction(@NotNull CustomBotAction customBotAction) { + super(customBotAction.getName(), () -> new ServerCustomBotAction(customBotAction)); + this.customBotAction = customBotAction; + customBotAction.provideArgumentFactory(new LeavesWrappedArgument.ArgumentHandler() { + @Override + public LeavesWrappedArgument create(String name, ArgumentType type) { + return addArgument(name, type); + } + + @Override + public void fork(int forkId) { + ServerCustomBotAction.this.fork(forkId); + } + }); + customBotAction.init(); + } + + @Override + public String getActionDataString(@NotNull ExtraData data) { + customBotAction.provideActionData(data); + return super.getActionDataString(data); + } + + @Override + public void loadCommand(@NotNull LeavesCommandContext context) throws CommandSyntaxException { + super.loadCommand(context); + customBotAction.loadCommand(context.rawContext()); + } + + @Override + public boolean doTick(@NotNull ServerBot bot) { + return customBotAction.doTick(bot.getBukkitEntity()); + } + + @Override + public Object asCraft() { + return new CraftCustomBotAction(this); + } +} 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 8333826d..0c499365 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 @@ -13,7 +13,7 @@ import org.bukkit.entity.Entity; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.entity.bot.actions.CraftLookAction; public class ServerLookAction extends AbstractBotAction { @@ -31,7 +31,7 @@ public class ServerLookAction extends AbstractBotAction { } @Override - public void loadCommand(@NotNull CommandContext context) throws CommandSyntaxException { + public void loadCommand(@NotNull LeavesCommandContext context) throws CommandSyntaxException { PlayerSelectorArgumentResolver playerSelectorResolver = context.getArgumentOrDefault("player", PlayerSelectorArgumentResolver.class, null); FinePositionResolver positionResolver = context.getArgumentOrDefault("location", FinePositionResolver.class, null); CommandSourceStack source = context.getSource(); 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 4023b469..a7a1509e 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 @@ -2,8 +2,8 @@ package org.leavesmc.leaves.bot.agent.actions; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.arguments.EnumArgumentType; import org.leavesmc.leaves.entity.bot.action.MoveAction.MoveDirection; import org.leavesmc.leaves.entity.bot.actions.CraftMoveAction; @@ -18,7 +18,7 @@ public class ServerMoveAction extends AbstractStateBotAction { } @Override - public void loadCommand(@NotNull CommandContext context) { + public void loadCommand(@NotNull LeavesCommandContext context) { this.direction = context.getArgument("direction", MoveDirection.class); } 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 85f51064..3be55610 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,8 +7,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; -import org.leavesmc.leaves.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.entity.bot.actions.CraftRotationAction; import java.text.DecimalFormat; @@ -47,7 +47,7 @@ public class ServerRotationAction extends AbstractBotAction> { } @SuppressWarnings("RedundantThrows") - public void applySuggestions(final CommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException { + public void applySuggestions(final LeavesCommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException { } public AbstractBotConfig setBot(ServerBot bot) { @@ -50,7 +50,7 @@ public abstract class AbstractBotConfig> { public abstract void setValue(T value) throws CommandSyntaxException; - public abstract T loadFromCommand(@NotNull CommandContext context) throws CommandSyntaxException; + public abstract T loadFromCommand(@NotNull LeavesCommandContext context) throws CommandSyntaxException; public String getName() { return name; 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 59ba3583..808d6d53 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.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; public class AlwaysSendDataConfig extends AbstractBotConfig { private boolean value; @@ -25,7 +25,7 @@ public class AlwaysSendDataConfig extends AbstractBotConfig { private boolean value; @@ -32,7 +32,7 @@ public class LocatorBarConfig extends AbstractBotConfig { @@ -23,7 +23,7 @@ public class SkipSleepConfig extends AbstractBotConfig } @Override - public Boolean loadFromCommand(@NotNull CommandContext context) { + public Boolean loadFromCommand(@NotNull LeavesCommandContext context) { return context.getBoolean(getName()); } 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 f155beda..cd7dfbf4 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 @@ -4,8 +4,8 @@ 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.bot.agent.ExtraData; -import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.util.ExtraData; +import org.leavesmc.leaves.command.LeavesCommandContext; public class SpawnPhantomConfig extends AbstractBotConfig { private boolean value; @@ -32,7 +32,7 @@ public class SpawnPhantomConfig extends AbstractBotConfig { @@ -16,7 +16,7 @@ public class TickTypeConfig extends AbstractBotConfig source; public CommandContext(com.mojang.brigadier.context.CommandContext source) { @@ -119,7 +119,7 @@ public class CommandContext { return source.isForked(); } - public com.mojang.brigadier.context.CommandContext getMojangContext() { + public com.mojang.brigadier.context.CommandContext rawContext() { return source; } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java index 0c3326fb..b0f6e4a7 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/WrappedArgument.java @@ -2,15 +2,12 @@ package org.leavesmc.leaves.command; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; import io.papermc.paper.command.brigadier.CommandSourceStack; import io.papermc.paper.command.brigadier.Commands; import java.util.concurrent.CompletableFuture; -public class WrappedArgument { +public class WrappedArgument implements LeavesWrappedArgument { private final String name; private final ArgumentType type; private AsyncSuggestionProvider asyncSuggestionProvider = null; @@ -55,14 +52,4 @@ public class WrappedArgument { } return builder; } - - @FunctionalInterface - public interface SuggestionApplier { - void applySuggestions(final CommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException; - } - - @FunctionalInterface - public interface AsyncSuggestionProvider { - CompletableFuture getSuggestions(final CommandContext context, final SuggestionsBuilder builder) throws CommandSyntaxException; - } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java index d0736996..99085738 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ActionCommand.java @@ -6,6 +6,7 @@ import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.arguments.BotArgumentType; import org.leavesmc.leaves.command.bot.BotSubcommand; import org.leavesmc.leaves.command.bot.subcommands.action.ListCommand; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java index 3b0ae0cf..70555b4d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/CreateCommand.java @@ -19,6 +19,7 @@ import org.leavesmc.leaves.bot.BotCreateState; import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import org.leavesmc.leaves.command.bot.BotSubcommand; import org.leavesmc.leaves.event.bot.BotCreateEvent; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java index 3464717d..77a85d9a 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/ListCommand.java @@ -16,6 +16,7 @@ import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.bot.BotSubcommand; import java.util.List; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java index 7a5e3481..6c8d942d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java @@ -13,6 +13,7 @@ import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.bot.BotSubcommand; import java.util.Set; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java index f0dac9af..cf7b5056 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/SaveCommand.java @@ -9,6 +9,7 @@ import org.leavesmc.leaves.bot.BotList; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.arguments.BotArgumentType; import org.leavesmc.leaves.command.bot.BotSubcommand; import org.leavesmc.leaves.event.bot.BotRemoveEvent; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java index 1547891e..ea2d02cb 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/ListCommand.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.actions.AbstractBotAction; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.LiteralNode; import org.leavesmc.leaves.command.bot.subcommands.ActionCommand; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java index 126c8ea2..8f9ea4d0 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StartCommand.java @@ -12,6 +12,7 @@ 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.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.LiteralNode; import org.leavesmc.leaves.command.WrappedArgument; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java index 16d75583..dc48f7b3 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/action/StopCommand.java @@ -11,6 +11,7 @@ import org.leavesmc.leaves.bot.ServerBot; import org.leavesmc.leaves.bot.agent.actions.AbstractBotAction; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.CommandContext; import org.leavesmc.leaves.command.LiteralNode; import org.leavesmc.leaves.command.bot.subcommands.ActionCommand; import org.leavesmc.leaves.event.bot.BotActionStopEvent; 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 index 86aa3a54..a47e6cbd 100644 --- 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 @@ -7,6 +7,7 @@ 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.LeavesCommandContext; import org.leavesmc.leaves.command.LiteralNode; import org.leavesmc.leaves.command.leaves.LeavesSubcommand; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java index 2d7505b2..bb5eeb1e 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/leaves/subcommands/ConfigCommand.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.command.ArgumentNode; import org.leavesmc.leaves.command.CommandContext; +import org.leavesmc.leaves.command.LeavesCommandContext; import org.leavesmc.leaves.command.CommandUtils; import org.leavesmc.leaves.command.leaves.LeavesSubcommand; import org.leavesmc.leaves.config.GlobalConfigManager; 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 index bf4d4428..1867c983 100644 --- 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 @@ -6,6 +6,7 @@ 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.LeavesCommandContext; import org.leavesmc.leaves.command.leaves.LeavesSubcommand; import static net.kyori.adventure.text.Component.text; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/CraftBotManager.java b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/CraftBotManager.java index 550985c4..01bb157c 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/CraftBotManager.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/CraftBotManager.java @@ -2,7 +2,9 @@ package org.leavesmc.leaves.entity.bot; import com.google.common.collect.Lists; import net.minecraft.server.MinecraftServer; +import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.bot.BotCreateState; @@ -11,6 +13,7 @@ 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.entity.bot.action.BotAction; +import org.leavesmc.leaves.entity.bot.action.CustomBotAction; import org.leavesmc.leaves.event.bot.BotCreateEvent; import java.util.Collection; @@ -71,4 +74,18 @@ public class CraftBotManager implements BotManager { public BotCreator botCreator(@NotNull String realName, @NotNull Location location) { return BotCreateState.builder(realName, location).createReason(BotCreateEvent.CreateReason.PLUGIN); } + + @Override + public boolean registerCustomAction(@NotNull CustomBotAction customBotAction, boolean resendCommandTree) { + boolean result = Actions.register(customBotAction); + if (result && resendCommandTree) { + Bukkit.getOnlinePlayers().forEach(Player::updateCommands); + } + return result; + } + + @Override + public boolean registerCustomAction(@NotNull CustomBotAction customBotAction) { + return registerCustomAction(customBotAction, true); + } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftCustomBotAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftCustomBotAction.java new file mode 100644 index 00000000..730590db --- /dev/null +++ b/leaves-server/src/main/java/org/leavesmc/leaves/entity/bot/actions/CraftCustomBotAction.java @@ -0,0 +1,11 @@ +package org.leavesmc.leaves.entity.bot.actions; + +import org.leavesmc.leaves.bot.agent.actions.ServerCustomBotAction; +import org.leavesmc.leaves.entity.bot.action.CustomBotAction; + +public class CraftCustomBotAction extends CraftBotAction implements CustomBotAction.InternalCustomBotAction { + + public CraftCustomBotAction(ServerCustomBotAction serverAction) { + super(serverAction, CraftCustomBotAction::new); + } +}