队伍指令
基本信息
| 属性 | 值 |
|---|---|
| 根指令 | /team |
| 根类 | serverutils.command.team.CmdTeam(extends CmdTreeBase) |
| 根指令源码 | src/main/java/serverutils/command/team/CmdTeam.java:8-26 |
| 子命令数 | 15 + 1 个自动生成的 help |
| 注册 | ServerUtilitiesCommands.java:30,无条件(无配置开关) |
| 权限 | 根类不加限制,各子命令自带 Level |
队伍是本模组的核心数据模型。几乎所有玩法数据(领地区块、权限、家、战备)都挂在队伍上,因此 /team 是使用频率最高的一组指令。
队伍类型
serverutils.lib.data.TeamType(src/main/java/serverutils/lib/data/TeamType.java:7-11)定义 4 种队伍类型:
| 类型 | 字符串 | isPlayer | isServer | 存档 | isNone |
|---|---|---|---|---|---|
PLAYER |
player |
是 | 否 | 是 | 否 |
SERVER |
server |
否 | 是 | 是 | 否 |
SERVER_NO_SAVE |
server_no_save |
否 | 是 | 否 | 否 |
NONE |
none |
否 | 否 | 否 | 是 |
NONE 是「无队伍」哨兵值,isNone 为真;SERVER_NO_SAVE 表示服务器所有但不写入存档。
成员关系等级
serverutils.lib.EnumTeamStatus(src/main/java/serverutils/lib/EnumTeamStatus.java:19-26)用数值表达关系强弱,status 越大权限越高:
| 枚举 | 字符串 | status | 颜色 | canBeSet |
|---|---|---|---|---|
ENEMY |
enemy |
-10 | RED |
是 |
NONE |
none |
0 | WHITE |
是 |
INVITED |
invited |
10 | DARK_AQUA |
是 |
ALLY |
ally |
30 | DARK_GREEN |
是 |
MEMBER |
member |
50 | BLUE |
否 |
MOD |
mod |
80 | BLUE |
是 |
OWNER |
owner |
100 | GOLD |
否 |
canBeSet = false 的 MEMBER 与 OWNER 不可通过 /team status 设置,只能由加入/转让流程赋予。VALID_VALUES 静态集合在类加载时按 canBeSet 过滤(EnumTeamStatus.java:41-46),用于报错提示。isEqualOrGreaterThan() 用 status >= 比较(EnumTeamStatus.java:73-75),因此 ENEMY 之外没有负值特例。
子命令表
| 子命令 | 类 | 权限 | 参数 | 作用 |
|---|---|---|---|---|
/team create |
CmdCreate |
ALL | <id> [颜色] |
创建玩家队伍并加入 |
/team create_server_team |
CmdCreateServerTeam |
OP_OR_SP | <id> |
创建 TeamType.SERVER 队伍 |
/team settings |
CmdSettings |
ALL | — | 打开本队设置 GUI |
/team settings_for |
CmdSettingsFor |
OP | <队伍> |
打开指定队伍设置 GUI |
/team join |
CmdJoin |
ALL | <队伍> |
加入队伍 |
/team leave |
CmdLeave |
ALL | — | 离开当前队伍 |
/team kick |
CmdKick |
OP | <玩家> |
踢出队员 |
/team request_invite |
CmdRequestInvite |
ALL | <队伍> |
申请加入(需审批) |
/team transfer_ownership |
CmdTransferOwnership |
ALL | <玩家> |
转让队长 |
/team status |
CmdStatus |
ALL | <玩家> [关系] |
设置自己与某人的关系 |
/team status_for |
CmdStatusFor |
OP | <队伍> <玩家> <关系> |
以管理员身份设置关系 |
/team info |
CmdInfo |
ALL | <队伍> |
查看队伍信息 |
/team get |
CmdGet |
ALL | — | 获取当前队伍 |
/team list |
CmdList |
ALL | — | 列出队伍 |
/team delete |
CmdDelete |
OP_OR_SP | <队伍> |
删除队伍 |
/team help |
CmdTreeHelp |
— | — | 自动生成(new CmdTreeHelp(this)) |
CmdTeam 构造函数的 addSubcommand 顺序为 settings, create, leave, transfer_ownership, kick, join, status, status_for, request_invite, delete, create_server_team, info, get, list, settings_for, help(CmdTeam.java:12-27)。
队伍 ID 规则
CmdCreate.isValidTeamID(String)(src/main/java/serverutils/command/team/CmdCreate.java:25-37)逐字符校验,空串直接判为无效(返回 false)。isValidChar(:39-41)只接受 4 类字符:
| 字符类 | 允许值 |
|---|---|
| 下划线 | _ |
| 竖线 | | |
| 小写字母 | a–z |
| 数字 | 0–9 |
因此队伍 ID 不支持大写字母,且 /team create 与 /team create_server_team 共用此校验(CmdCreateServerTeam.java:24)。
创建流程
/team create <id> [颜色](team/CmdCreate.java:44-90)依次检查:
ServerUtilitiesGameRules.canCreateTeam(world)—— 同时受teams.disable_teams配置与世界游戏规则serverutilities:disable_team_creation约束(ServerUtilitiesGameRules.java:10-13)- 发送者必须是玩家(
getCommandSenderAsPlayer) - 玩家当前不能已有队伍,否则报
must_leave - ID 通过
isValidTeamID - ID 不得已存在
universe.clearCache()后用generateTeamUID((short) 0)生成 UID,new ForgeTeam(..., TeamType.PLAYER)- 颜色:给了第 2 个参数则
EnumTeamColor.NAME_MAP.get(args[1]),否则用世界随机数取色 - 设置
team.owner、加入 universe,依次post()ForgeTeamCreatedEvent与ForgeTeamPlayerJoinedEvent
设置 GUI 的权限门槛
/team settings(team/CmdSettings.java:22-35)继承 CmdEditConfigBase,getGroup() 返回 p.team.getSettings()。两个失败分支都会先发关闭 GUI 的封包再抛异常:
- 玩家无队伍 →
ServerUtilitiesAPI.sendCloseGuiPacket(player)+ 报错no_team - 玩家不是该队 moderator →
sendCloseGuiPacket+ 原版commands.generic.permission
/team settings_for 则直接取 CommandUtils.getTeam(sender, args[0]),是管理员版本。