原版权限太粗:想让管理员用旁观抓外挂,他却能顺手切创造
在管理生存服的时候,我一直有个很头疼的权限痛点:巡查管理员需要切换成旁观模式(Spectator)钻地底下去看有没有人开透视挖矿、或者看刷怪塔卡不卡;可在原版 Minecraft 和 Paper/Folia 核心里,只要你给了他 OP 或者原版的 minecraft.command.gamemode 权限,他就能顺手敲 /gamemode creative 切创造模式往外掏东西,甚至按键盘上的 F3+F4 快捷键秒切模式、用 /execute as ... run gamemode 绕过插件检查。
要想做到“只准巡查管理切生存和旁观、绝对禁止切创造和冒险”,靠原版那点粗颗粒度的权限节点根本防不住。
接管命令根、拦截 F3+F4 与防递归委托
2026 年 8 月 31 日(9 月 9 日正式整理入库 IGNGserver/modeguard 7fa2313 v1.0.1),我专门写了一个小而狠的守卫插件 ModeGuard。
第一道防线设在命令层:插件启动时用自定义的 GamemodeShell 直接替换接管 Brigadier 命令树里的 gamemode 根节点,把单人切换和群体选择器拆成独立的细粒度权限。这里有个很容易踩的坑——如果接管命令后再直接调原版命令名,会在 Brigadier 里触发无限递归栈溢出;我巧妙地保留了带命名空间的 minecraft:gamemode 原始节点不替换,校验通过后在底层委托给它执行,既拦住了越权,又保留了原版完整的选择器语法。
第二道防线设在网络包与事件层:专门监听并拦截客户端按 F3+F4 快捷轮盘发上来的 GAMEMODE_SWITCHER 切换请求,没有对应目标模式权限的一律当场驳回。
Folia 实体线程 30 秒巡检与硬核死亡豁免
万一有人通过别的第三方插件后门或者奇怪的指令偷偷改了模式怎么办?我在每个玩家所属的 Folia EntityScheduler 实体线程里挂了一个 30 秒一次的轻量巡检任务:一旦发现某个玩家当前处于他没有权限持有的游戏模式(比如偷切了创造),30 秒内就会被自动强制拉回生存模式并记录审计日志。
同时为了防止误伤正常玩法,如果服务器开了硬核模式(Hardcore),玩家正常死亡后变成旁观模式灵魂状态时,插件会自动给他写上一枚持久化豁免标记(PDC),哪怕重启服务器也不会被巡检任务误判拉回生存复活。