RCC文档Perms

权限系统

你能用什么、能进哪里,都由它算出来。大部分人不用碰它——这一页是给想知道自己缺什么的人看的。

你能用哪些命令、能进哪些世界、菜单里能看到几项,都由权限系统算出来。

大部分人一辈子不用碰它——进服就在某个组里,该有的都有了。这一页是给两种人看的:想知道自己缺什么权限的人,和管权限的人。

我现在有什么

菜单里的「权限」,或者:

/rsp user <你的名字> info

/rsp/rswperm 的别名。会列出你所在的组、以及从组里继承下来的规则。

想问某一件具体的事:

/rsp user <玩家> check rcc.fly

组是继承制的

一个组可以有多个父组,权限从父组流下来。所以「给新人加一项能力」的做法是改 visitor 组,而不是挨个给人加。

阶梯是这套继承关系的一种受管形态:一串有先后的组,第 i 级的父组里恰好有第 i-1 级。比如:

visitor  →  member  →  admin

在阶梯上,判定是向上放行的:一件事只要 member 能做,admin 自动能做,不需要为 admin 再配一遍。

DAG 已经能表达继承了,为什么还要阶梯

因为阶梯多买到一样东西:顺序。有了顺序才有这四件事——

在两级之间插一级是原子的(不用手改两条父子关系);删掉中间一级会自动接回去;能比较「谁比谁高」;升级降级就是沿阶梯走一格。

纯继承图里这些全要手工维护,而手工维护的顺序迟早会和实际继承关系对不上。

判定是怎么算出来的

一个人对一个节点的最终结果,是把所有相关的规则排个序,取第一名。排序规则是固定的七档:

顺位 比什么 谁赢
1 键的具体度 更具体的赢
2 上下文具体度 更具体的赢
3 继承距离 更近的赢
4 权重 更大的赢
5 拒绝赢
6 键名 字典序
7 出处 字典序

第 1 档必须排在第 3 档前面。否则「先给一整包权限,再挖掉其中一项」这种写法会失效——挖洞那条比整包更具体,但可能来自更远的父组。

第 6、7 档看着像凑数,其实是必需的:少了它们,两条完全同级的规则谁赢就取决于插件的加载顺序,同一份配置在两次重启之间会给出不同结果

为什么我这条权限没生效

/rsp why <玩家> <节点>

这条命令把全部候选规则按上面的顺序列出来,告诉你最后是哪一条赢了。

末尾还会列出这次判定用到的每个上下文提供方,标注 [通] / [失败] / [已隔离]

这一段不是调试信息,是必需的

带条件的规则(比如「只在地皮世界里生效」)需要有人告诉权限系统「他现在在哪个世界」。提供这个信息的是别的插件。

如果那个插件没起来,条件判断不出来,这条规则就不出现在候选表里——和「你压根没配这条规则」长得一模一样。两种情况下你看到的都只是「少了一行」。

所以 why 必须把提供方的状态一起说出来,否则你会去改一条本来就没问题的配置。

事件门禁

除了命令权限,还能拦原版行为——破坏方块、开容器、攻击实体这些。

/rsp guard list
/rsp guard on <id>
/rsp guard off <id>

改完立刻生效,不用重启。

guard list 分三档显示,这个区分很重要:

[开]           配置开着 + 事件订上了 —— 真的在拦人
[开·订阅失败]  配置开着,但事件订不上 —— 拦不住任何人
[关]           配置关着

一条「配置开着但事件 id 在这个 BDS 版本上不存在」的门禁,在别处看起来和一条正在拦人的门禁完全一样。两者中间隔着一整个安全假设。

管理员命令

user  <玩家> info | check <节点> | setgroup | addgroup <组> | delgroup <组>
user  <玩家> set <节点> <true|false> | unset <节点> | promote | demote [阶梯]
group list | info <组> | create | delete | set | unset | parent add|del
track list | show <阶梯> | insert <阶梯> <组> [插在谁上面] | remove
why <玩家> <节点>
nodes | guard list|on|off <id> | providers | status | reload

promote / demote 沿阶梯走一格,比 delgroupaddgroup 安全——它不会在两条命令之间留下一个「什么组都不在」的瞬间。

网页管理界面

权限插件带一个网页界面,默认关着。要开的话得同时满足两件事:配置里 enabled 设成 true,并且填一个非空的 token。

token 是空的就不会启动,日志里会写明原因。一个不需要认证、又能改全服权限的界面,比没有界面糟得多。

默认只监听 127.0.0.1。绑到别的地址上会在日志里留一条警告——那不代表不让你这么做,只是提醒你确认它在防火墙后面。

常见问题

我被降组了?

/rsp user <你> info 看当前组。组没变但权限变了,多半是组本身的配置改了,/rsp why 能看到是哪条规则赢的。

为什么我在某个世界能飞,换个世界就不能?

两种可能:一是权限带了世界条件,二是那个世界本身不允许飞行(见多世界那页)。/rsp why <你> rcc.fly 能区分——如果候选表里根本没有相关规则,那就是世界的事,不是权限的事。

权限组名字能改吗?

能,但改名不会自动改掉引用它的地方(阶梯、准入条件都按名字记)。改之前先 /rsp providers/rsp track list 看一眼谁在引用。

没装权限插件的服务器还能跑吗?

能。别的插件连不上权限系统时会走「离线」路径,不是报错——一个可选依赖没装是正常情况,不该让整台服务器起不来。

权限系统知道地皮和世界的事吗?

它的代码里一个和世界、地皮相关的名字都没有。 上下文由别的插件主动登记进来。所以没装世界插件的服务器上,每次判定连一次多余的跨插件调用都不会发生。