diff --git a/README.md b/README.md new file mode 100644 index 0000000..73b2c33 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +As of v1.3.0, a command for getting/setting coins of a player could look like this: +```java +public class CoinsCommand { + + @Getter + private final CommandNode> rootNode; + private final CommandArgument, OfflinePlayer> playerArg; + private final CommandArgument, Integer> amountArg; + + public CoinsCommand() { + rootNode = ScrowAPI.getCommandManager().createNode("coins"); + this.playerArg = ScrowAPI.getCommandManager().createArgument("player", OfflinePlayerArgumentType.getInstance()); + this.amountArg = ScrowAPI.getCommandManager().createArgument("amount", IntegerArgumentType.getInstance()); + + { + var setLiteral = ScrowAPI.getCommandManager().createNode("set"); + rootNode.addLiteral(setLiteral); + setLiteral.addArgument(playerArg); + setLiteral.addArgument(amountArg); + setLiteral.setExecutor(this::setCoins); + } + { + var getLiteral = ScrowAPI.getCommandManager().createNode("get"); + rootNode.addLiteral(getLiteral); + getLiteral.addArgument(playerArg); + getLiteral.setExecutor(this::getCoins); + } + } + + private void getCoins(CommandContext ctx) { + var player = ctx.getArg(playerArg); + + ScrowAPI.getEconomyService() + .getCoins(player.getUniqueId()) + .subscribeOn(Schedulers.boundedElastic()) + .publishOn(ScrowAPI.getMinecraftScheduler()) + .subscribe(amount -> { + if (player == ctx.getSender()) { + ctx.getSender().sendMessage("You have " + amount + "$"); + } else { + ctx.getSender().sendMessage(player.getName() + " has " + amount + "$"); + } + }, err -> { + ctx.getSender().sendMessage("Unable to get coins: " + err.getMessage()); + Bukkit.getLogger().log(Level.SEVERE, "Unable to get coins of " + player.getUniqueId(), err); + }); + } + + private void setCoins(CommandContext ctx) { + var player = ctx.getArg(playerArg); + var amount = ctx.getArg(amountArg); + + ScrowAPI.getEconomyService() + .setCoins(player.getUniqueId(), amount) + .subscribeOn(Schedulers.boundedElastic()) + .publishOn(ScrowAPI.getMinecraftScheduler()) + .subscribe(__ -> { + ctx.getSender().sendMessage(player.getName() + " now has " + amount + "$"); + }, err -> { + ctx.getSender().sendMessage("Unable to set coins: " + err.getMessage()); + Bukkit.getLogger().log(Level.SEVERE, "Unable to set coins of " + player.getUniqueId() + " to " + amount, err); + }); + } +} +``` +Registered with +```java +ScrowAPI.getCommandManager().register(new CoinsCommand().getRootNode()); +``` \ No newline at end of file diff --git a/kencommandapi-bukkit/build.gradle.kts b/kencommandapi-bukkit/build.gradle.kts index b79124e..30b531f 100644 --- a/kencommandapi-bukkit/build.gradle.kts +++ b/kencommandapi-bukkit/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "de.kentoj" -version = "1.2.0" +version = "1.3.0" fun scrowRepo(handler: RepositoryHandler) = handler.maven { name = "scrow" @@ -38,7 +38,7 @@ dependencies { // https://mvnrepository.com/artifact/org.jetbrains/annotations implementation("org.jetbrains:annotations:26.0.2-1") - api("de.kentoj:kencommandapi-core:1.2.0") + api("de.kentoj:kencommandapi-core:1.3.0") api("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") implementation("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java new file mode 100644 index 0000000..0ae0609 --- /dev/null +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java @@ -0,0 +1,26 @@ +package de.kentoj.kencommandapi; + +import de.kentoj.kencommandapi.api.KenCommandApi; +import de.kentoj.kencommandapi.api.processing.CommandContext; +import de.kentoj.kencommandapi.api.structure.node.CommandNode; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class BukkitKenCommand extends Command { + + private final CommandNode> rootNode; + private final KenCommandApi> commandManager; + + protected BukkitKenCommand(KenCommandApi> commandManager, CommandNode> rootNode) { + super(rootNode.getNames()[0]); + this.rootNode = rootNode; + this.commandManager = commandManager; + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { + commandManager.invoke(rootNode, sender, args); + return false; + } +} diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java index 7a15eb4..7679469 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java @@ -2,9 +2,13 @@ package de.kentoj.kencommandapi; import de.kentoj.kencommandapi.api.processing.CommandContext; import de.kentoj.kencommandapi.api.processing.ParsedArgument; +import de.kentoj.kencommandapi.api.structure.node.CommandNode; import de.kentoj.kencommandapi.impl.AbstractKenCommandApi; +import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import java.lang.reflect.Field; import java.util.Map; public class BukkitKenCommandApi extends AbstractKenCommandApi> { @@ -13,4 +17,15 @@ public class BukkitKenCommandApi extends AbstractKenCommandApi createContext(CommandSender sender, Map, ?>> parsedArguments) { return new BukkitCommandContext(sender, parsedArguments); } + + public void register(CommandNode> rootNode) { + try { + Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); + field.setAccessible(true); + SimpleCommandMap commandMap = (SimpleCommandMap) field.get(Bukkit.getPluginManager()); + commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(this, rootNode)); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } } diff --git a/kencommandapi-core/build.gradle.kts b/kencommandapi-core/build.gradle.kts index ac4d4a9..ebc9545 100644 --- a/kencommandapi-core/build.gradle.kts +++ b/kencommandapi-core/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "de.kentoj" -version = "1.2.0" +version = "1.3.0" repositories { mavenCentral()