Skip to content

Custom Command Arguments

Mazen edited this page May 14, 2023 · 2 revisions

Registering a custom argument is easy, just follow the following steps:

Creating Custom Argument Class

Just make a class to represent the type of that argument and make it extends AbstractArgument

Here's an example:

public final class ArgumentOfflinePlayer extends AbstractArgument<OfflinePlayer> {


	public ArgumentOfflinePlayer(@NotNull String id) {
		super(id, OfflinePlayer.class);
	}

	public ArgumentOfflinePlayer(@NotNull String id,
	                             boolean optional,
	                             boolean useRemainingSpace) {
		super(id, OfflinePlayer.class, optional, useRemainingSpace);
	}

	public ArgumentOfflinePlayer(@NotNull ArgumentData data) {
		super(data, OfflinePlayer.class);
	}
	
	@Override
	public OfflinePlayer parse(@NotNull Command<?> command, @NotNull String input) {
		return Bukkit.getOfflinePlayer(input);
	}


}

Finally, Register the argument type

example:

commandManager.typeRegistry().registerArgumentConverter(OfflinePlayer.class, ArgumentOfflinePlayer::new);

Example Usage

Simple example using Builders

var cmd = Command.builder(commandManager, "ban")
		.info(new CommandInfo("ban.perm", "Ban cmd"))
		.requirement(SpigotCommandRequirement.ONLY_PLAYER_EXECUTABLE)
		.cooldown(new CommandCooldown(5, TimeUnit.MINUTES))
		.syntax(SpigotCommandSyntaxBuilder.builder(Player.class, "ban")
			.flags("silent")
			.argument(new ArgumentOfflinePlayer("user"))
			.argument(Argument.Array("reason"))
			.execute((player, context) -> {

				String reason = context.getArgument("reason");

				OfflinePlayer offlineUser = context.getArgument("user");

				if(offlineUser == null) {
				  return;
				}

				System.out.println("Banning " + offlineUser.getName() + ", for " + reason);
				//TODO YOUR BAN CODE HERE

			})
			.build())
		.defaultExecutor((s, context) -> s.sendMessage(ChatColor.RED + "/ban <user> <reason...>"))
		.build();

Simple example using Annotations

@Command(name = "ban")
public class TestAnnotation {

	@Syntax(syntax = "<user> <reason>")
	public void ban(@NotNull Player executor,
	                @NotNull @Arg(id = "user")OfflinePlayer user,
	                @NotNull @Arg(id = "reason") @Greedy String reason) {

		System.out.println("Banning " + user.getName() + ", for " + reason);

	}

}