玩家角色

玩家角色

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 角色分配给 Gegy
  • role remove Gegy admin:从 Gegy 移除 admin 角色
  • role list Gegy:列出已应用于 Gegy 的所有角色
  • role reload:重新加载 roles.json 配置文件