
玩家角色
Fabric服务器角色与权限管理
Fabric 玩家角色模组
这是一个简单的实现,允许通过类似 Discord 的"角色"系统为玩家分配自定义权限。 角色及其权限在 JSON 文件中定义,可轻松修改并在运行时重新加载,以便快速迭代。
roles.json 文件位于配置目录中(<root>/config/roles.json)。示例配置可能如下所示:
{
"admin": {
"level": 100,
"overrides": {
"name_decoration": {
"style": ["red", "bold"],
"suffix": {"text": "*"}
},
"permission_level": 4,
"command_feedback": true,
"commands": {
".*": "allow"
}
}
},
"spectator": {
"level": 10,
"overrides": {
"commands": {
"gamemode (spectator|adventure)": "allow"
}
}
},
"mute": {
"level": 1,
"overrides": {
"mute": true
}
},
"everyone": {
"overrides": {
"commands": {
"help": "allow",
".*": "deny"
}
}
}
}
这里发生了什么?这个 JSON 文件声明了三个角色:admin、spectator 和 everyone。
everyone 是默认角色:每个玩家都会拥有该角色,且无法移除。
其他指定的角色作为 everyone 角色之上的覆盖层(overrides)生效。
覆盖层(Overrides)
在每个角色声明中,我们列出了一组覆盖层。覆盖层是本模组用于根据角色改变游戏行为的通用系统。
目前支持的覆盖层类型包括 commands、name_decoration、chat_type、mute、command_feedback、permission_level 和 entity_selectors。
重要的是要考虑当多个角色针对相同的事物时覆盖层如何应用。此类冲突通过始终选择等级最高的角色来解决。
例如,在上述示例中:尽管 everyone 声明除 help 之外的每个命令都被禁止,但由于 admin 和 spectator 的等级更高,它们将覆盖此行为。
命令(Commands)
commands 覆盖层用于控制玩家可以使用哪些命令。
每条覆盖项指定一个要匹配的正则表达式模式,然后指定当模组遇到该模式时如何响应的策略。
例如,模式 .* 匹配所有可能的命令,而 gamemode (spectator|adventure) 仅匹配使用 spectator 和 adventure 模式的 gamemode 命令。
可与这些模式配合使用的策略包括 allow 和 deny:
allow 将确保允许玩家使用此命令,而 deny 将阻止玩家使用此命令。
例如:
"commands": {
"gamemode (spectator|adventure)": "allow"
}
commands 覆盖层还可以使用 hidden 规则结果,该规则允许使用命令,同时将其从命令提示中隐藏。
名称装饰(Name Decoration)
name_decoration 覆盖层修改具有某个角色的玩家名称的显示方式。这可用于覆盖名称颜色以及添加前缀或后缀文本。
此优先级低于计分板队伍颜色。
名称装饰可能声明如下:
"name_decoration": {
"prefix": {"text": "[前缀] ", "color": "green"},
"suffix": {"text": "-后缀"},
"style": ["#ff0000", "bold", "underline"],
"contexts": ["chat", "tab_list"]
}
可以选择性声明三个字段:
style:接受文本格式类型或十六进制颜色的列表prefix:接受一个在名称之前添加的文本组件suffix:接受一个在名称之后追加的文本组件contexts:接受一组可能的上下文,定义该装饰应应用的位置- 接受:
chat和tab_list - 默认:应用于所有可能的上下文
- 接受:
聊天类型(Chat Types)
chat_type 覆盖层允许为具有某个角色的所有玩家替换聊天消息装饰。
这与原版的 minecraft:chat_type 注册表集成,后者可通过数据包进行修改。
chat_type 覆盖层只声明应使用的 chat_type:
"chat_type": "minecraft:say_command"
此示例将替换具有给定角色的所有玩家的消息,以应用 say_command 样式。
需要注意的是,原版聊天类型注册表在服务器启动时从数据包加载,不能像玩家角色配置那样进行热重载。
声明自定义聊天类型
可以使用自定义数据包在 data/<namespace>/chat_type/<name> 中声明自定义聊天类型。
例如,我们可以声明一个 data/mydatapack/chat_type/admin.json:
{
"chat": {
"decoration": {
"parameters": ["sender", "content"],
"style": {},
"translation_key": "%s: %s <- 管理员说了这句话!"
}
},
"narration": {
"decoration": {
"parameters": ["sender", "content"],
"style": {},
"translation_key": "chat.type.text.narrate"
},
"priority": "chat"
}
}
随后可以在覆盖层中引用,如:
"chat_type": "mydatapack:admin"
权限等级(Permission Level)
permission_level 覆盖层为分配了角色的玩家设置原版权限等级。
这在与本模组不支持的其它模组以及原版功能交互时非常有用。
权限等级声明如下:
"permission_level": 4
禁言(Mute)
mute 覆盖层功能非常简单,可防止分配了该角色的玩家在聊天中发言。
禁言声明如下:
"mute": true
命令反馈(Command Feedback)
默认情况下,所有管理员玩家在另一位玩家执行命令时都会收到全局反馈。
command_feedback 覆盖层允许特定角色接收同类的反馈。
命令反馈声明如下:
"command_feedback": true
实体选择器(Entity Selectors)
通常,只有权限等级为二级或更高的命令源才能使用实体选择器。
entity_selectors 覆盖层允许特定角色使用实体选择器。
实体选择器可以这样允许:
"entity_selectors": true
其它配置
角色还可以通过配置文件应用到命令方块或函数执行器中。 例如:
{
"commands": {
"apply": {
"command_block": true,
"function": true
},
"overrides": {
}
}
}
角色继承另一个角色的覆盖层也可能很有用。
这可以通过 includes 声明来引用具有较低等级的角色实现。
例如:
{
"foo": {
"includes": ["bar"],
"overrides": {
"commands": {
".*": "allow"
}
}
},
"bar": {
"overrides": {
"name_decoration": {
"style": "red"
}
}
}
}
使用此配置,foo 角色将继承红色的 name_decoration。
在游戏中应用角色
修改 roles.json 文件后,可以使用 /role reload 重新加载。
所有角色管理都通过 role 命令及其各种子命令完成。例如:
role assign Gegy admin:将admin角色分配给Gegyrole remove Gegy admin:从Gegy移除admin角色role list Gegy:列出已应用于Gegy的所有角色role reload:重新加载roles.json配置文件
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。