命令系统
概述
命令系统提供了游戏管理的完整命令接口,支持权限控制和 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