Skip to content

命令系统

概述

命令系统提供了游戏管理的完整命令接口,支持权限控制和 Tab 补全。系统采用子命令模式,通过主命令 /disaster 访问所有功能。

核心类

CommandManager(命令管理器)

路径cn.enderrealm.disaster.commands.CommandManager

命令管理器负责注册和处理所有命令。

java
public class CommandManager implements CommandExecutor, TabCompleter {
    private final disaster plugin;
    private final Map<String, SubCommand> subCommands = new HashMap<>();
    private final Map<String, String> commandPermissions = new HashMap<>();
    
    public CommandManager(disaster plugin) {
        this.plugin = plugin;
        registerSubCommands();
        
        // 注册主命令
        plugin.getCommand("disaster").setExecutor(this);
        plugin.getCommand("disaster").setTabCompleter(this);
    }
}

命令注册

java
private void registerSubCommands() {
    // 注册所有子命令和对应权限
    subCommands.put("help", new HelpCommand(plugin));
    commandPermissions.put("help", "disaster.help");
    
    subCommands.put("create", new CreateCommand(plugin));
    commandPermissions.put("create", "disaster.create");
    
    subCommands.put("set", new SetCommand(plugin));
    commandPermissions.put("set", "disaster.set");

    subCommands.put("join", new JoinCommand(plugin, plugin.getRoomManager()));
    commandPermissions.put("join", "disaster.join");

    subCommands.put("quit", new QuitCommand(plugin, plugin.getRoomManager()));
    commandPermissions.put("quit", "disaster.quit");
    
    subCommands.put("test0", new Test0Command(plugin));
    commandPermissions.put("test0", "disaster.test0");
}

命令处理

java
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (args.length == 0) {
        // 没有参数,显示帮助
        subCommands.get("help").execute(sender, args);
        return true;
    }
    
    String subCommandName = args[0].toLowerCase();
    
    // 检查 help 命令别名
    if (subCommandName.equals("help") || subCommandName.equals("?")) {
        subCommands.get("help").execute(sender, args);
        return true;
    }
    
    // 查找并执行子命令
    SubCommand subCommand = subCommands.get(subCommandName);
    if (subCommand != null) {
        // 检查权限
        String permissionNode = commandPermissions.get(subCommandName);
        if (permissionNode != null && !sender.hasPermission(permissionNode)) {
            if (sender instanceof Player) {
                sender.sendMessage(plugin.getLanguageManager().getText("no-permission", (Player) sender));
            } else {
                sender.sendMessage(plugin.getLanguageManager().getText("no-permission", null));
            }
            return true;
        }
        
        // 执行命令
        subCommand.execute(sender, args);
    } else {
        // 未知命令,显示帮助
        subCommands.get("help").execute(sender, args);
    }
    
    return true;
}

Tab 补全

java
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
    List<String> completions = new ArrayList<>();
    
    if (args.length == 1) {
        // 第一个参数,提供所有子命令
        for (String subCmd : subCommands.keySet()) {
            String permissionNode = commandPermissions.get(subCmd);
            if (permissionNode == null || sender.hasPermission(permissionNode)) {
                if (subCmd.startsWith(args[0].toLowerCase())) {
                    completions.add(subCmd);
                }
            }
        }
    } else if (args.length > 1) {
        // 后续参数,交给子命令处理
        String subCommandName = args[0].toLowerCase();
        SubCommand subCommand = subCommands.get(subCommandName);
        
        if (subCommand != null) {
            String permissionNode = commandPermissions.get(subCommandName);
            if (permissionNode == null || sender.hasPermission(permissionNode)) {
                List<String> subCompletions = subCommand.tabComplete(sender, args);
                if (subCompletions != null) {
                    completions.addAll(subCompletions);
                }
            }
        }
    }
    
    return completions;
}

SubCommand(子命令接口)

路径cn.enderrealm.disaster.commands.subcommands.SubCommand

所有子命令必须实现的接口。

java
public interface SubCommand {
    // 执行命令
    void execute(CommandSender sender, String[] args);
    
    // Tab 补全
    List<String> tabComplete(CommandSender sender, String[] args);
}

命令列表

/disaster help

显示帮助信息。

权限disaster.help

实现HelpCommand

java
public class HelpCommand implements SubCommand {
    @Override
    public void execute(CommandSender sender, String[] args) {
        sender.sendMessage("§6=== Disaster 灾难生存 ===");
        sender.sendMessage("§e/disaster help §7- 显示帮助信息");
        sender.sendMessage("§e/disaster create §7- 创建新房间");
        sender.sendMessage("§e/disaster join §7- 加入房间");
        sender.sendMessage("§e/disaster quit §7- 退出房间");
        sender.sendMessage("§e/disaster set §7- 设置游戏参数");
    }
}

/disaster create

创建一个新的游戏房间。

权限disaster.create

实现CreateCommand

java
public class CreateCommand implements SubCommand {
    @Override
    public void execute(CommandSender sender, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("§c此命令只能由玩家执行");
            return;
        }
        
        Player player = (Player) sender;
        
        // 检查玩家是否已在房间中
        if (plugin.getRoomManager().isPlayerInRoom(player)) {
            player.sendMessage(plugin.getLanguageManager().getText("already-in-room", player));
            return;
        }
        
        // 创建新房间
        Room room = plugin.getRoomManager().createRoom();
        if (room != null) {
            room.addPlayer(player);
            player.sendMessage(plugin.getLanguageManager().getText("room-created", player));
        } else {
            player.sendMessage(plugin.getLanguageManager().getText("room-create-failed", player));
        }
    }
}

/disaster join

加入一个可用的游戏房间。

权限disaster.join

实现JoinCommand

java
public class JoinCommand implements SubCommand {
    private final RoomManager roomManager;
    
    @Override
    public void execute(CommandSender sender, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("§c此命令只能由玩家执行");
            return;
        }
        
        Player player = (Player) sender;
        
        // 检查玩家是否已在房间中
        if (roomManager.isPlayerInRoom(player)) {
            player.sendMessage(plugin.getLanguageManager().getText("already-in-room", player));
            return;
        }
        
        // 加入房间
        roomManager.joinRoom(player);
    }
}

/disaster quit

退出当前游戏房间。

权限disaster.quit

实现QuitCommand

java
public class QuitCommand implements SubCommand {
    private final RoomManager roomManager;
    
    @Override
    public void execute(CommandSender sender, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("§c此命令只能由玩家执行");
            return;
        }
        
        Player player = (Player) sender;
        
        // 检查玩家是否在房间中
        Room room = roomManager.getPlayerRoom(player);
        if (room == null) {
            player.sendMessage(plugin.getLanguageManager().getText("not-in-room", player));
            return;
        }
        
        // 退出房间
        room.removePlayer(player);
        player.sendMessage(plugin.getLanguageManager().getText("left-room", player));
    }
}

/disaster set

设置游戏相关参数。

权限disaster.set

实现SetCommand

java
public class SetCommand implements SubCommand {
    @Override
    public void execute(CommandSender sender, String[] args) {
        if (args.length < 2) {
            sender.sendMessage("§c用法: /disaster set <参数> <值>");
            return;
        }
        
        String param = args[1].toLowerCase();
        String value = args.length > 2 ? args[2] : "";
        
        switch (param) {
            case "minplayers":
                // 设置最小玩家数
                break;
            case "maxplayers":
                // 设置最大玩家数
                break;
            case "countdown":
                // 设置倒计时时间
                break;
            case "gametime":
                // 设置游戏时间
                break;
            default:
                sender.sendMessage("§c未知参数: " + param);
                break;
        }
    }
}

权限节点

权限节点描述默认值
disaster.help查看帮助信息true
disaster.create创建房间true
disaster.join加入房间true
disaster.quit退出房间true
disaster.set设置游戏参数op
disaster.test0测试命令op

配置示例

yaml
# plugin.yml
commands:
  disaster:
    description: Disaster 灾难生存游戏命令
    usage: /disaster <子命令>
    aliases: [dis]

permissions:
  disaster.help:
    description: 查看帮助信息
    default: true
  disaster.create:
    description: 创建房间
    default: true
  disaster.join:
    description: 加入房间
    default: true
  disaster.quit:
    description: 退出房间
    default: true
  disaster.set:
    description: 设置游戏参数
    default: op
  disaster.test0:
    description: 测试命令
    default: op

相关文档