[{"data":1,"prerenderedAt":23},["ShallowReactive",2],{"doc-perms":3},{"html":4,"toc":5},"\u003Cp>你能用哪些命令、能进哪些世界、菜单里能看到几项，都由权限系统算出来。\u003C\u002Fp>\n\u003Cp>大部分人一辈子不用碰它——进服就在某个组里，该有的都有了。这一页是给两种人看的：想知道自己缺什么权限的人，和管权限的人。\u003C\u002Fp>\n\u003Ch2 id=\"我现在有什么\">我现在有什么\u003C\u002Fh2>\n\u003Cp>菜单里的「权限」，或者：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002Frsp user &lt;你的名字&gt; info\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>\u002Frsp\u003C\u002Fcode> 是 \u003Ccode>\u002Frswperm\u003C\u002Fcode> 的别名。会列出你所在的组、以及从组里继承下来的规则。\u003C\u002Fp>\n\u003Cp>想问某一件具体的事：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002Frsp user &lt;玩家&gt; check rcc.fly\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"组是继承制的\">组是继承制的\u003C\u002Fh2>\n\u003Cp>一个组可以有多个父组，权限从父组流下来。所以「给新人加一项能力」的做法是改 \u003Ccode>visitor\u003C\u002Fcode> 组，而不是挨个给人加。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>阶梯\u003C\u002Fstrong>是这套继承关系的一种受管形态：一串有先后的组，第 i 级的父组里恰好有第 i-1 级。比如：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>visitor  →  member  →  admin\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>在阶梯上，\u003Cstrong>判定是向上放行的\u003C\u002Fstrong>：一件事只要 \u003Ccode>member\u003C\u002Fcode> 能做，\u003Ccode>admin\u003C\u002Fcode> 自动能做，不需要为 \u003Ccode>admin\u003C\u002Fcode> 再配一遍。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>DAG 已经能表达继承了，为什么还要阶梯\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>因为阶梯多买到一样东西：\u003Cstrong>顺序\u003C\u002Fstrong>。有了顺序才有这四件事——\u003C\u002Fp>\n\u003Cp>在两级之间插一级是原子的（不用手改两条父子关系）；删掉中间一级会自动接回去；能比较「谁比谁高」；升级降级就是沿阶梯走一格。\u003C\u002Fp>\n\u003Cp>纯继承图里这些全要手工维护，而手工维护的顺序迟早会和实际继承关系对不上。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"判定是怎么算出来的\">判定是怎么算出来的\u003C\u002Fh2>\n\u003Cp>一个人对一个节点的最终结果，是把所有相关的规则排个序，取第一名。排序规则是固定的七档：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth style=\"text-align:center\">顺位\u003C\u002Fth>\n\u003Cth>比什么\u003C\u002Fth>\n\u003Cth>谁赢\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">1\u003C\u002Ftd>\n\u003Ctd>键的具体度\u003C\u002Ftd>\n\u003Ctd>更具体的赢\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">2\u003C\u002Ftd>\n\u003Ctd>上下文具体度\u003C\u002Ftd>\n\u003Ctd>更具体的赢\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">3\u003C\u002Ftd>\n\u003Ctd>继承距离\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>更近的赢\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">4\u003C\u002Ftd>\n\u003Ctd>权重\u003C\u002Ftd>\n\u003Ctd>更大的赢\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">5\u003C\u002Ftd>\n\u003Ctd>值\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>拒绝赢\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">6\u003C\u002Ftd>\n\u003Ctd>键名\u003C\u002Ftd>\n\u003Ctd>字典序\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:center\">7\u003C\u002Ftd>\n\u003Ctd>出处\u003C\u002Ftd>\n\u003Ctd>字典序\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>第 1 档必须排在第 3 档前面。否则「先给一整包权限，再挖掉其中一项」这种写法会失效——挖洞那条比整包更具体，但可能来自更远的父组。\u003C\u002Fp>\n\u003Cp>第 6、7 档看着像凑数，其实是必需的：少了它们，两条完全同级的规则谁赢就取决于插件的加载顺序，\u003Cstrong>同一份配置在两次重启之间会给出不同结果\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch2 id=\"为什么我这条权限没生效\">为什么我这条权限没生效\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>\u002Frsp why &lt;玩家&gt; &lt;节点&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这条命令把全部候选规则按上面的顺序列出来，告诉你最后是哪一条赢了。\u003C\u002Fp>\n\u003Cp>末尾还会列出这次判定用到的每个\u003Cstrong>上下文提供方\u003C\u002Fstrong>，标注 \u003Ccode>[通]\u003C\u002Fcode> \u002F \u003Ccode>[失败]\u003C\u002Fcode> \u002F \u003Ccode>[已隔离]\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>这一段不是调试信息，是必需的\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>带条件的规则（比如「只在地皮世界里生效」）需要有人告诉权限系统「他现在在哪个世界」。提供这个信息的是别的插件。\u003C\u002Fp>\n\u003Cp>如果那个插件没起来，条件判断不出来，这条规则就不出现在候选表里——\u003Cstrong>和「你压根没配这条规则」长得一模一样\u003C\u002Fstrong>。两种情况下你看到的都只是「少了一行」。\u003C\u002Fp>\n\u003Cp>所以 \u003Ccode>why\u003C\u002Fcode> 必须把提供方的状态一起说出来，否则你会去改一条本来就没问题的配置。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"事件门禁\">事件门禁\u003C\u002Fh2>\n\u003Cp>除了命令权限，还能拦原版行为——破坏方块、开容器、攻击实体这些。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002Frsp guard list\n\u002Frsp guard on &lt;id&gt;\n\u002Frsp guard off &lt;id&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>改完立刻生效，不用重启。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Ccode>guard list\u003C\u002Fcode> 分三档显示，这个区分很重要：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>[开]           配置开着 + 事件订上了 —— 真的在拦人\n[开·订阅失败]  配置开着，但事件订不上 —— 拦不住任何人\n[关]           配置关着\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>一条「配置开着但事件 id 在这个 BDS 版本上不存在」的门禁，在别处看起来和一条正在拦人的门禁完全一样。两者中间隔着一整个安全假设。\u003C\u002Fp>\n\u003Ch2 id=\"管理员命令\">管理员命令\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>user  &lt;玩家&gt; info | check &lt;节点&gt; | setgroup | addgroup &lt;组&gt; | delgroup &lt;组&gt;\nuser  &lt;玩家&gt; set &lt;节点&gt; &lt;true|false&gt; | unset &lt;节点&gt; | promote | demote [阶梯]\ngroup list | info &lt;组&gt; | create | delete | set | unset | parent add|del\ntrack list | show &lt;阶梯&gt; | insert &lt;阶梯&gt; &lt;组&gt; [插在谁上面] | remove\nwhy &lt;玩家&gt; &lt;节点&gt;\nnodes | guard list|on|off &lt;id&gt; | providers | status | reload\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>promote\u003C\u002Fcode> \u002F \u003Ccode>demote\u003C\u002Fcode> 沿阶梯走一格，比 \u003Ccode>delgroup\u003C\u002Fcode> 加 \u003Ccode>addgroup\u003C\u002Fcode> 安全——它不会在两条命令之间留下一个「什么组都不在」的瞬间。\u003C\u002Fp>\n\u003Ch2 id=\"网页管理界面\">网页管理界面\u003C\u002Fh2>\n\u003Cp>权限插件带一个网页界面，默认\u003Cstrong>关着\u003C\u002Fstrong>。要开的话得同时满足两件事：配置里 \u003Ccode>enabled\u003C\u002Fcode> 设成 \u003Ccode>true\u003C\u002Fcode>，并且填一个非空的 token。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>token 是空的就不会启动\u003C\u002Fstrong>，日志里会写明原因。一个不需要认证、又能改全服权限的界面，比没有界面糟得多。\u003C\u002Fp>\n\u003Cp>默认只监听 \u003Ccode>127.0.0.1\u003C\u002Fcode>。绑到别的地址上会在日志里留一条警告——那不代表不让你这么做，只是提醒你确认它在防火墙后面。\u003C\u002Fp>\n\u003Ch2 id=\"常见问题\">常见问题\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>我被降组了？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>先 \u003Ccode>\u002Frsp user &lt;你&gt; info\u003C\u002Fcode> 看当前组。组没变但权限变了，多半是组本身的配置改了，\u003Ccode>\u002Frsp why\u003C\u002Fcode> 能看到是哪条规则赢的。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>为什么我在某个世界能飞，换个世界就不能？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>两种可能：一是权限带了世界条件，二是那个世界本身不允许飞行（见\u003Ca href=\"\u002Fdocs\u002Fworld\">多世界\u003C\u002Fa>那页）。\u003Ccode>\u002Frsp why &lt;你&gt; rcc.fly\u003C\u002Fcode> 能区分——如果候选表里根本没有相关规则，那就是世界的事，不是权限的事。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>权限组名字能改吗？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>能，但改名不会自动改掉引用它的地方（阶梯、准入条件都按名字记）。改之前先 \u003Ccode>\u002Frsp providers\u003C\u002Fcode> 和 \u003Ccode>\u002Frsp track list\u003C\u002Fcode> 看一眼谁在引用。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>没装权限插件的服务器还能跑吗？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>能。别的插件连不上权限系统时会走「离线」路径，不是报错——一个可选依赖没装是正常情况，不该让整台服务器起不来。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>权限系统知道地皮和世界的事吗？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>它的代码里一个和世界、地皮相关的名字都没有。\u003C\u002Fstrong> 上下文由别的插件主动登记进来。所以没装世界插件的服务器上，每次判定连一次多余的跨插件调用都不会发生。\u003C\u002Fp>\n",[6,9,11,13,15,17,19,21],{"id":7,"text":7,"depth":8},"我现在有什么",2,{"id":10,"text":10,"depth":8},"组是继承制的",{"id":12,"text":12,"depth":8},"判定是怎么算出来的",{"id":14,"text":14,"depth":8},"为什么我这条权限没生效",{"id":16,"text":16,"depth":8},"事件门禁",{"id":18,"text":18,"depth":8},"管理员命令",{"id":20,"text":20,"depth":8},"网页管理界面",{"id":22,"text":22,"depth":8},"常见问题",1787498101347]