Skip to content

注册自定义命令

API 提供了一种注册命令的方法,即 SuperiorSkyblockAPI.registerCommand(<SuperiorCommand>)

在本教程中,我会着手创建一条新命令 /is near,用于返回附近的岛屿及其方位。

首先,我需要创建一个自定义的 SuperiorCommand 类:

Java
public final class NearCommand implements SuperiorCommand {

    @Override
    public List<String> getAliases() {
        // 别称列表. 首个参数为子命令的标签.
        return Arrays.asList("near", "nearby");
    }

    @Override
    public String getPermission() {
        // 命令的所需权限. 若不需要指定, 请填入 "".
        return "";
    }

    @Override
    public String getUsage(Locale locale) {
        // 命令用法. 应当只包含命令的标签及参数.
        return "near";
    }

    @Override
    public String getDescription(Locale locale) {
        // 命令的描述, 会显示在 /is help 中.
        return "Locate nearby islands.";
    }

    @Override
    public int getMinArgs() {
        // 包括标签在内命令所需的最小参数量.
        return 1;
    }

    @Override
    public int getMaxArgs() {
        // 包括标签在内命令所需的最大参数量.
        return 1;
    }

    @Override
    public boolean canBeExecutedByConsole() {
        // 命令是否可在控制台中执行.
        return false;
    }

    @Override
    public boolean displayCommand() {
        // 命令是否要显示在 /is help 列表中.
        return true;
    }

    @Override
    public void execute(SuperiorSkyblock plugin, CommandSender sender, String[] args) {
        // 待完成
    }

    @Override
    public List<String> tabComplete(SuperiorSkyblock plugin, CommandSender sender, String[] args) {
        // 待完成
        return new ArrayList<>();
    }

}

就是这样。接下来你就需要在 execute 部分下填入你自己的代码,并实现 TAB 键自动补全功能。

execute()tabComplete() 方法需要三个参数:

  • plugin:插件的实例。
  • sender:命令的执行者。
  • args:执行者为命令附加的参数。

编写代码之后,最终版本的代码是这样的:

Java
public final class NearCommand implements SuperiorCommand {
    
    // 其他方法...

    private static final int MAX_ISLAND_SIZE = 200;
    
    @Override
    public void execute(SuperiorSkyblock plugin, CommandSender sender, String[] args) {
        // 因为已经在上一部分中禁用了控制台执行命令, 发送者只能是玩家.
        SuperiorPlayer superiorPlayer = SuperiorSkyblockAPI.getPlayer((Player) sender);
        
        Island targetIsland = plugin.getGrid().getIslandAt(superiorPlayer.getLocation());
        
        if(targetIsland == null){
            sender.sendMessage("" + ChatColor.RED + ChatColor.BOLD + "错误 | " + ChatColor.GRAY + "你必须站在岛屿的一边.");
            return;
        }
        
        StringBuilder message = new StringBuilder();
        int islandsAmount = 0;
        
        for(BlockFace blockFace : BlockFace.values()){
            // 我只需要获取东南西北四个方向上的岛屿 - 我需要检查它们的 modX 或 modZ 是否在 -+1 范围内 .
            int modXAbs = Math.abs(blockFace.getModX()), modZAbs = Math.abs(blockFace.getModZ());
            if((modXAbs == 1 || modZAbs == 1) && modXAbs + modZAbs != 2){
                Location targetIslandLocation = targetIsland.getCenter(World.Environment.NORMAL)
                        .add(MAX_ISLAND_SIZE * 3 * blockFace.getModX(), 0, MAX_ISLAND_SIZE * 3 * blockFace.getModZ());
                if(plugin.getGrid().getIslandAt(targetIslandLocation) != null) {
                    islandsAmount++;
                    message.append(", ").append(blockFace.name());
                }
            }
        }
        
        String directionsMessage = message.length() == 0 ? "" : message.substring(2);
        
        switch (islandsAmount){
            case 0:
                sender.sendMessage("" + ChatColor.YELLOW + ChatColor.BOLD + "岛屿 | " + ChatColor.GRAY + "没有找到符合条件的岛屿.");
                break;
            case 1:
                sender.sendMessage("" + ChatColor.YELLOW + ChatColor.BOLD + "岛屿 | " + ChatColor.GRAY + "有一座岛屿位于 " + directionsMessage + ".");
                break;
            default:
                sender.sendMessage("" + ChatColor.YELLOW + ChatColor.BOLD + "岛屿 | " + ChatColor.GRAY + "有多座岛屿位于 " + directionsMessage + ".");
                break;
        }
    }

    @Override
    public List<String> tabComplete(SuperiorSkyblock plugin, CommandSender sender, String[] args) {
        // 命令不需要添加任何 TAB 补全.
        return new ArrayList<>();
    }

}

你需要做的最后一件事就是调用 SuperiorSkyblockAPI.registerCommand(<SuperiorCommand>)。然后,大功告成!你成功注册了自己的命令!这个命令应当支持所有 TAB 补全,包括 /is help 与参数限制的情况!你也可以不通过调用上述方法注册命令。你可以将插件导入外部 jar 文件,并将其放在 SuperiorSkyBlock2 的命令文件夹中。

贡献者

页面历史