这是一个简单的实现,允许通过类似 Discord 的“角色”为玩家分配自定义权限。
角色及其权限在 JSON 文件中定义,该文件可以在运行时轻松修改和重新加载,以便快速迭代。
roles.json 文件位于配置目录中(/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 角色的基础上作为覆盖层生效。
在每个角色声明中,我们列出了一组覆盖项。覆盖项是本模组用于根据角色改变游戏行为的通用系统。
目前支持的覆盖项类型有 commands、namedecoration、chattype、mute、commandfeedback、permissionlevel 和 entity_selectors。
当多个角色针对同一事物时,考虑覆盖项如何应用非常重要。此类冲突的解决方式是始终选择等级最高的角色。
因此,在示例中:尽管 everyone 声明除 help 外的所有命令都不允许,但由于 admin 和 spectator 的等级更高,它们将覆盖此行为。
commands 覆盖项用于操纵玩家可以使用的命令。
每个覆盖项条目指定一个正则表达式模式进行匹配,然后指定当模组遇到该模式时的响应策略。
例如,模式 .* 匹配所有可能的命令,而 gamemode (spectator|adventure) 仅匹配旁观者和冒险模式的 gamemode 命令。
然后可以与这些模式一起使用的策略是 allow 和 deny:
allow 将确保玩家被允许使用此命令,而 deny 将阻止玩家使用此命令。
例如:
"commands": {
"gamemode (spectator|adventure)": "allow"
}
命令覆盖项还可以使用 hidden 规则结果,这将允许使用命令,同时将其从命令建议中隐藏。
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_type 覆盖项允许为所有拥有角色的玩家替换聊天消息装饰。
这与 Vanilla 的 minecraft:chat_type 注册表集成,可以通过数据包进行修改。
chattype 覆盖项简单地声明应使用的 chattype:
"chat_type": "minecraft:say_command"
此示例将替换拥有给定角色的玩家的所有消息,应用 say_command 样式。
需要注意的是,Vanilla 聊天类型注册表在服务器启动时从数据包加载,不能像玩家角色配置那样热重载。
自定义聊天类型可以通过自定义数据包在 data//chat_type/ 中声明。
例如,我们可以声明一个 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": 4
mute 覆盖项的功能非常简单,即阻止分配的玩家在聊天中输入。
禁言这样声明:
"mute": true
默认情况下,所有操作员在另一个玩家运行命令时都会收到全局反馈。
command_feedback 覆盖项允许特定角色接收相同类型的反馈。
命令反馈这样声明:
"command_feedback": true
通常,只有权限等级为 2 或更高的命令源才能使用实体选择器。
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 角色分配给 Gegy
role remove Gegy admin:从 Gegy 移除 admin 角色role list Gegy:列出已应用于 Gegy 的所有角色role reload:重新加载 roles.json 配置文件友情链接: 网易我的世界 | 泰拉瑞亚 | ocent云计算 | 米饭Minecraft插件文档 | 友链合作
历史访问人数:79,705 | 历史访问人次:168,090
今日访问人数:10,345 | 今日访问人次:11,253
昨日访问人数:20,761 | 昨日访问人次:24,774
Copyright © 2019-2026 我的世界服务器列表站. All rights reserved.
❤ Powered by GermMC 京ICP备17023959号-6