Skip to content

@Command 注解

注解式命令系统,支持主子命令结构和别名。

@Command

java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Command {
    String name();                  // 主命令名
    String[] aliases() default {};  // 别名
    String description() default "";
    String usage() default "";
}

@CommandBody

java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CommandBody {
    String name() default "";  // 子命令名(空 = 主命令本身)
    String desc() default "";
}

方法签名固定为:void execute(CommandSender sender, String[] args)

命令格式

<主命令> [子命令] [参数...]
  • name = "" → 输入主命令时触发
  • name = "xxx" → 输入 主命令 xxx 时触发

完整示例

java
import cn.org.bukkit.bngeuit.command.Command;
import cn.org.bukkit.bngeuit.command.CommandBody;
import cn.org.bukkit.bngeuit.command.CommandSender;
import cn.org.bukkit.bngeuit.command.GroupCommandSender;

@Command(name = "test", aliases = {"t"}, description = "测试命令")
public class TestCommand {

    @CommandBody  // 主命令:test
    public void execute(CommandSender sender, String[] args) {
        sender.sendMessage("参数: " + String.join(" ", args));
    }

    @CommandBody(name = "info", desc = "查看信息")  // 子命令:test info
    public void info(CommandSender sender, String[] args) {
        sender.sendMessage("TestPlugin v1.0");
    }
}

使用效果:

test              → execute(),无子命令
test hello world  → execute(),args = ["hello", "world"]
test info         → info()
t info            → 别名 "t" = "test"

CommandSender

实现场景特有方法
GroupCommandSender群聊getGroupOpenid()
ConsoleSender控制台
java
@CommandBody
public void execute(CommandSender sender, String[] args) {
    if (sender instanceof GroupCommandSender gcs) {
        String groupId = gcs.getGroupOpenid();
    }
    sender.sendMessage("回复");
}

自动注册

插件 JAR 中的 @Command 类会被自动扫描并注册,无需手动操作。