bukkit: Implement ItemStackArgument (#257)

Fully featured on 1.13+, falls back to Material parser on legacy versions.

Also some general cleanup to the Bukkit impl
This commit is contained in:
Jason 2021-04-29 18:20:53 -07:00 committed by Jason
parent e5d6ce7b90
commit e3cc7d43cb
20 changed files with 899 additions and 180 deletions

View file

@ -27,15 +27,18 @@ import cloud.commandframework.CommandTree;
import cloud.commandframework.arguments.CommandArgument;
import cloud.commandframework.brigadier.CloudBrigadierManager;
import cloud.commandframework.bukkit.BukkitBrigadierMapper;
import cloud.commandframework.bukkit.internal.CraftBukkitReflection;
import cloud.commandframework.context.CommandContext;
import cloud.commandframework.permission.CommandPermission;
import com.destroystokyo.paper.brigadier.BukkitBrigadierCommandSource;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginIdentifiableCommand;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Method;
import java.util.function.BiPredicate;
import java.util.regex.Pattern;
@ -46,18 +49,30 @@ class PaperBrigadierListener<C> implements Listener {
PaperBrigadierListener(final @NonNull PaperCommandManager<C> paperCommandManager) {
this.paperCommandManager = paperCommandManager;
this.brigadierManager = new CloudBrigadierManager<>(
this.paperCommandManager,
() -> new CommandContext<>(
this.paperCommandManager.getCommandSenderMapper()
.apply(Bukkit.getConsoleSender()),
this.paperCommandManager
)
);
this.brigadierManager.brigadierSenderMapper(
sender -> this.paperCommandManager.getCommandSenderMapper().apply(sender.getBukkitSender())
);
this.brigadierManager = new CloudBrigadierManager<>(this.paperCommandManager, () -> new CommandContext<>(
this.paperCommandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()),
this.paperCommandManager
));
this.brigadierManager.brigadierSenderMapper(sender ->
this.paperCommandManager.getCommandSenderMapper().apply(sender.getBukkitSender()));
new BukkitBrigadierMapper<>(this.paperCommandManager, this.brigadierManager);
if (!CraftBukkitReflection.craftBukkit()) {
return;
}
final Class<?> vanillaCommandWrapperClass = CraftBukkitReflection.needOBCClass("command.VanillaCommandWrapper");
final Method getListenerMethod = CraftBukkitReflection.needMethod(
vanillaCommandWrapperClass, "getListener", CommandSender.class);
this.brigadierManager.backwardsBrigadierSenderMapper(cloud -> {
try {
return (BukkitBrigadierCommandSource) getListenerMethod
.invoke(null, this.paperCommandManager.getBackwardsCommandSenderMapper().apply(cloud));
} catch (final ReflectiveOperationException e) {
throw new RuntimeException(e);
}
});
}
protected @NonNull CloudBrigadierManager<C, BukkitBrigadierCommandSource> brigadierManager() {