权限管理

维护 PRIVILEGED 名单与打印指令清单的三条指令。

基本信息

指令 实现类 权限等级 作用
/opis_addpriv CommandAddPrivileged 3 把玩家加入 PRIVILEGED 名单
/opis_rmpriv CommandRmPrivileged 3 把玩家移出名单
/opis_help CommandHelp 3 列出 13 条指令与说明

注册位置:modOpis.java:226、:227、:233(modOpis.java:233 在三条被注释掉的客户端指令之后)。

功能

双层权限模型

Opis 的权限判定不单靠 FML 的 getRequiredPermissionLevel(),而是两层:

  • FML 权限层:getRequiredPermissionLevel() 返回 3 的指令共 10 条(/opis_stop、/opis_reset、/opis_delay、/opis_ticks、/opis_kill、/opis_killall、/opis_addpriv、/opis_rmpriv、/opis_enttrace、/opis_help)在标准 canCommandSenderUseCommand 里要求 OP 级
  • 名单层:上列 10 条里有 9 条(除 /opis_help 外)额外覆写了 canCommandSenderUseCommand,逻辑一致:
if (sender instanceof EntityPlayerMP) return PlayerTracker.INSTANCE.isPrivileged((EntityPlayerMP) sender);
if (sender instanceof DedicatedServer) return true;
if (!(sender instanceof DedicatedServer) && !(sender instanceof EntityPlayerMP)) return true;
return false;

即服务端控制台恒放行;玩家必须先被加入 PRIVILEGED 名单。这让非 OP 的普通玩家也能管理自己的分析权限。唯一例外是 /opis_help,它的覆写内容是 return true(CommandHelp.java:39),不查名单。

而 /opis(CommandOpis)、/opis_start、/opis_te、/opis_ent、/opis_chunk、/opis_nent 六条的 canCommandSenderUseCommand 只 return true,完全不做名单校验;其中 /opis 另有一道 Message.COMMAND_OPEN_SWING 的 accessLevel 闸门。

/opis_addpriv <name>

CommandAddPrivileged.java:25-29:直接 PlayerTracker.INSTANCE.addPrivilegedPlayer(astring[0]),回复 Player %s added to Opis user list。不做存在性校验,astring[0] 不检查长度也没有 try/catch。

/opis_rmpriv <name>

CommandRmPrivileged.java:24-31:先 isInPrivilegedList(astring[0]) 判断:

  • 在名单里:rmPrivilegedPlayer 后回复 Player %s removed from Opis user list.
  • 不在名单里:回复 Player %s not found in list.

/opis_help

CommandHelp.java:24-32 硬编码 13 条指令,格式为 /<name> : <description>:

/opis_start、/opis_stop、/opis_reset、/opis_delay、/opis_ticks、/opis_chunk、/opis_te、/opis_ent、/opis_nent、/opis_kill、/opis_killall、/opis_addpriv、/opis_rmpriv

该列表与实际注册的 16 条指令不一致,缺少 3 条:/opis(面板入口)、/opis_enttrace(CommandEntityCreate 未实现 IOpisCommand,没有 getCommandNameOpis())、/opis_help(自身不列自己)。

/opis_help 自身覆写了 canCommandSenderUseCommand 返回 true(CommandHelp.java:38-40),但因为 getRequiredPermissionLevel() 是 3,标准 OP 判定仍会先拦下非 OP。

数值

数值名 值
三条指令的权限等级 3
/opis_help 输出的指令条数 13
实际注册的服务端指令总数 16
配置中的 ACCESS_RIGHTS:privileged 默认值 空数组 {}

交互

触发 行为
服务端控制台 /opis_addpriv Steve Steve 成为已授权玩家
已授权玩家 /opis_addpriv Alex 生效(名单层放行)
未授权玩家 /opis_addpriv Alex 被拒
/opis_rmpriv Steve(在名单) 移出并确认
/opis_rmpriv Steve(不在名单) 提示未找到
控制台 /opis_help 输出 13 行 /名字 : 说明

相关条目

  • config - 名单持久化与 accessLevel 的配置定义
  • entity-tools - 同样受名单层保护的三条破坏性指令
  • run-control - 权限等级 3 的启动/停止指令
  • network-protocol - accessLevel 枚举与权限在封包层的对应关系