队伍指令

基本信息

属性 值
根指令 /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)依次检查:

  1. ServerUtilitiesGameRules.canCreateTeam(world) —— 同时受 teams.disable_teams 配置与世界游戏规则 serverutilities:disable_team_creation 约束(ServerUtilitiesGameRules.java:10-13)
  2. 发送者必须是玩家(getCommandSenderAsPlayer)
  3. 玩家当前不能已有队伍,否则报 must_leave
  4. ID 通过 isValidTeamID
  5. ID 不得已存在
  6. universe.clearCache() 后用 generateTeamUID((short) 0) 生成 UID,new ForgeTeam(..., TeamType.PLAYER)
  7. 颜色:给了第 2 个参数则 EnumTeamColor.NAME_MAP.get(args[1]),否则用世界随机数取色
  8. 设置 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]),是管理员版本。

相关条目