本文为OpenMod用户文档翻译,你也可以前往官网查看

介绍

OpenMod是.NET 插件框架,为您的服务器添加新功能。

OpenMod提供了在运行时下载、安装、更新和删除插件的命令。

安装步骤

  1. 这里下载最新的OpenMod.Unturned.Module-vX.X.X.zip。
  2. 将“OpenMod.Unturned”文件夹复制到Unturned安装目录中的“Modules”文件夹中。
  3. 启动服务器。第一次启动需要一段时间,因为OpenMod将下载其核心组件。
  4. 好了!现在您可以开始安装插件了。

查找插件

您可以在openmod插件页面nuget.org上找到插件列表。

安装和更新插件

有两种方法可以安装插件:

选项 1:从 NuGet 安装插件。您可以使用openmod install <package id>命令从 NuGet 安装插件,例如 openmod install Kr4ken.NewEssentials要安装特定版本,请使用openmod install <package id>@<version>。如果要启用预发行版本的安装,请添加-Pre选项:openmod install <package id> -Pre要更新插件,请再次运行openmod install <package id>

选项 2:手动安装插件。您可以通过将插件 dll 文件和插件的所有库移动到openmod/plugins来手动安装插件。您也可以使用openmod/pluginsopenmod install <package id>安装库。要更新插件,请将.dll文件替换为较新的文件。

您必须重新加载 OpenMod 才能在安装或更新插件后应用更改。openmod reload

删除插件

要删除已使用openmod install安装的插件,请使用openmod remove <package id> 。如果您改为手动安装插件,请删除.dll文件。

您必须使用openmod reload重新加载 OpenMod 才能在删除插件后应用更改。

自动更新

OpenMod可以在每次服务器启动时自动更新。您可以通过以下方式启用它

  • 使用参数启动服务器,或-OpenModAutoUpdate
  • 将环境变量设置为 。OpenMod_EnableAutoUpdatetrue

默认情况下,自动更新处于禁用状态。

配置文件

OpenMod使用YAML进行配置。
您可以在此处找到快速 YAML 指南。

特定于插件的配置存储在plugins/<plugin id>目录中。

翻译文件

翻译文件允许您翻译或自定义 OpenMod 或插件消息。
OpenMod 的翻译文件openmod.translations.yaml可以在目录OpenMod中找到:

commands:
  openmod:
    restricted: "This command is restricted."
  errors:
    out_of_range_error: "Too few arguments: missing parameter at index {Index} of type {Type.Name}"
    parse_error: "Parse error: could not parse {Value} to {Type.Name}"
    not_found: "Command was not found: {CommandName}"
    wrong_usage: "Wrong command usage. Correct usage: {Command} {Syntax}"

OpenMod使用 SmartFormat.NET 来解析翻译参数。有关详细信息,请参阅 SmartFormat.NET 维基

翻译文件当前不会自动更新。如果 OpenMod 或插件添加了新翻译,则必须手动将其添加到 yaml 文件或删除该文件,以便重新创建它。

权限

OpenMod有一个简单的基于角色的权限系统。权限定义用户可以执行哪些操作,哪些操作不能执行。

您可以通过编辑 OpenMod 目录中的 openmod.roles.yaml 文件或使用permissionpermissionrole命令来管理权限。您可以使用help permissionhelp permissionrole命令了解更多信息。

对 openmod.roles.yaml 文件的更改会立即应用。无需重新加载。

权限角色

角色基本上是一组权限和其他属性。如果将角色分配给用户,他们将自动继承该角色的所有权限。您还可以将父角色添加到角色以继承权限。

角色具有以下属性:

  • 父角色:继承其权限的父角色
  • 权限:角色具有的权限列表。
  • 显示名称:角色的人类可读名称。
  • 自动分配:自动将角色分配给新用户。不分配给现有用户
  • 数据:可以通过插件附加到角色的数据。
  • 优先级:如果权限冲突,此属性将定义首选角色。

权限语法

权限始终由两个组件组成:插件 ID 和权限。如果插件 ID 是 Kr4ken.NewEssentials,权限是 command.home,那么我们分配的完整权限形式将是 Kr4ken.NewEssentials:commands.home。

创建角色

若要创建新角色,请打开openmod.roles.yaml文件。您将看到类似以下内容:

roles:
- id: default
  parents: []
  permissions:
  - OpenMod.Core:help
  displayName: Default
  data: {}
  isAutoAssigned: true
- id: vip
  priority: 1
  parents:
  - default
  permissions:
  - Kr4ken.NewEssentials:commands.home
  - Kr4ken.NewEssentials:commands.tp  
  - Kr4ken.NewEssentials:kits.vip
  data: {}

此列表包含 2 个角色:默认角色和 VIP。请注意-如何启动新角色。

要添加新角色,只需复制默认角色并按如下所示添加:

roles:
- id: default
  parents: []
  permissions:
  - OpenMod.Core:help
  displayName: Default
  data: {}
  isAutoAssigned: true
- id: vip
  displayName: VIP
  priority: 1
  parents:
  - default
  permissions:
  - Kr4ken.NewEssentials:commands.home
  - Kr4ken.NewEssentials:commands.tp  
  - Kr4ken.NewEssentials:kits.vip
  data: {}
- id: megavip
  displayName: Mega VIP
  priority: 1
  parents:
  - vip
  permissions:
  - Kr4ken.NewEssentials:kits.megavip
  data: {}  

删除角色

要删除角色,请从文件openmod.roles.yaml中删除或将其注释掉。

管理角色权限

在前面的示例中,megavip 角色具有以下权限:

  • OpenMod.Core:commands.help(继承自默认值,它是vip的父级)
  • Kr4ken.NewEssentials:kits.vip (继承自vip)
  • Kr4ken.NewEssentials:kits.megavip

如果我们希望它有 vip 作为父级,但我们不希望它继承Kr4ken.NewEssentials:kits.vip权限怎么办?
在这种情况下,我们可以通过添加前缀为“!”来否定权限:

- id: megavip
  displayName: Mega VIP
  priority: 1
  parents:
  - default
  - vip
  permissions:
  - '!Kr4ken.NewEssentials:kits.vip' # Forcefully removes the permission, even if inherited
  - Kr4ken.NewEssentials:kits.megavip
  data: {} 

这!前缀将强制删除任何权限。

您还可以使用以下om pom命令添加和删除权限:om p add role megavip !Kr4ken.NewEssentials:kit.vip

如果您正在从OpenMod管理RocketMod权限,则必须添加RocketMod:到权限的开头。 例如,如果 RocketMod 权限为help ,则 OpenMod 中的等效权限为RocketMod:help

用户权限和分配角色

您可以使用om r add player <player> <role>命令为用户分配角色,例如om r add player Trojaner megavip 。同样,您可以通过键入om r remove player <player> <role>

权限可以直接附加到用户:om p add player Trojaner Kr4ken.NewEssentials:kits.vip。用户权限始终覆盖任何冲突的角色权限。您可以使用om p remove Trojaner Kr4ken.NewEssentials:kits.vip再次删除权限。

通配符

假设传送插件具有以下权限:

  • 传送插件:传送
  • 传送插件:传送点
  • TeleportPlugin:teleport.bring.request
  • TeleportPlugin:teleport.request

您可以使用 * 通配符添加所有这些,而不是逐个添加所有这些:

  • 传送插件:传送。

这将授予上面的所有权限。您也可以使用TeleportPlugin:*授予对该插件的完全访问权限。

仅添加 TeleportPlugin:teleport 权限不会授予像 TeleportPlugin:teleport.bring 这样的子权限。

查找命令权限

如果您不知道命令需要什么权限,可以使用help <command>来查找它。子命令的权限不是自动授予的,必须通过在父命令权限上使用通配符或直接指定它们来授予。

您还可以通过签出每个插件文件夹中生成的 help.md 文件来查找权限。

冷却时间

冷却时间增加了仅允许命令在给定时间跨度后再次成功执行的功能。

您可以通过在 OpenMod 目录内的 openmod.roles.yaml 文件中编辑角色的数据部分来管理冷却时间。

对 openmod.roles.yaml 文件的更改会立即应用。无需重新加载。

配置

配置文件openmod.yaml包含一个有关冷却时间的设置,该设置cooldowns:reloadPersistence设置为true

这将使冷却时间在整个服务器重新启动期间持续存在,并且通过将命令执行时间写入用户的文件中来重新加载 OpenMod。

命令冷却时间是通过 OpenMod 角色的数据配置配置的。配置的结构如下:

cooldowns:
- command: CommandId
  cooldown: cooldown time span

如果要为 Rocket 命令配置冷却时间,则命令ID在Commands.config.xml里将是前缀为Rocket.. 对于/heal命令,id 将为Rocket.heal

以下示例是默认文件的修改版本openmod.roles.yaml,用于将 30 秒的冷却时间应用于 help 命令。

roles:
- id: default
  priority: 0
  parents: []
  permissions:
  - OpenMod.Core:commands.help
  displayName: Default
  data:
    cooldowns:
    - command: OpenMod.Core.Commands.OpenModCommands.CommandHelp
      cooldown: 30 seconds
  isAutoAssigned: true
- id: vip
  priority: 1
  parents:
  - default
  permissions:
  - SomeKitsPlugin:kits.vip
  displayName: 
  data: {}
  isAutoAssigned: false

如果同一命令的多个冷却时间应用于用户,则将应用源自具有最高优先级的角色的冷却时间。

冷却时间跨度遵循多个部分的格式,每个部分定义一个十进制数及其值。这些可能值的列表如下:

  • 天 - 天、天和 d
  • 小时 - 小时、小时、小时、小时、小时
  • 分钟 - 分钟、分钟、分钟、分钟、米
  • 秒 - 秒、秒、秒、秒、秒
  • 毫秒 - 毫秒、毫秒、毫秒、毫秒、毫秒

以下所有内容都是有效的冷却时间跨度:

  • 10天20小时30分钟
  • 10 天 20 小时 30 分钟
  • 10天 20小时 30分
  • 10天20小时30米
  • 10.8 天
  • 30 秒 500 毫秒

权限

此插件仅包含一个权限 - OpenMod.Core:cooldowns.immune .此权限使继承者免受所有冷却时间的影响。

日志

OpenMod使用Serilog作为默认的记录器实现。

Serilog 是通过 OpenMod 文件夹中logging.yaml配置的。 您可以在此处找到Serilog配置的文档(您必须将其从JSON转换为YAML)。

Serilog 支持许多接收器作为日志记录目标。可以通过openmod install <package id>命令安装新的接收器,并在logging.yaml中配置它们。

例如,这是您将日志记录配置为MySQL / MariaDB而不是文件的方式:

  1. 安装 MariaDB 接收器:openmod install Serilog.Sinks.MariaDB
  2. 将 MariaDB Sink 添加到 logging.yaml:
Serilog:
  Using:
  - Serilog
  - Serilog.Sinks.Console
  - Serilog.Sinks.File
  - Serilog.Sinks.Async
  - Serilog.Sinks.MariaDB # Do not forget to add your sink here
  WriteTo:
  - Name: Async # By default OpenMod logs async for performance reasons
    Args:
      configure:
      - Name: MariaDB
        Args:
          connectionString: "server=..." # See https://www.connectionstrings.com/mysql/
          tableName: "logs"
          autoCreateTable: true
      - Name: Console
        Args:
          theme: "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console"
          outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
  Enrich:
  - FromLogContext
  MinimumLevel:
    Default: Information # Only log Information or higher by default
    Override:
      # You can configure when specific events should be logged
      # In this example, the Microsoft.EntityFrameworkCore events below are only logged if Warning or higher
      Microsoft.EntityFrameworkCore.Database.Command: Warning
      Microsoft.EntityFrameworkCore.Infrastructure: Warning
      Microsoft.EntityFrameworkCore.Database.Connection: Warning
      Microsoft.EntityFrameworkCore.Query: Warning

定时计划

执行 OpenMod 或系统命令的定期任务。
定时计划在 autoexec.yaml 文件中定义。

让我们看一下一份定时计划:

jobs:
  # Updates OpenMod every Sunday at 0:00 AM and then restarts.
  - name: OpenMod Auto Update
    schedule: '0 0 * * 0'
    task: openmod_command
    args:
      commands:
      - openmod upgrade
      - restart
    enabled: true  

让我们分解一下。

名称

设置定时计划的名称。必须是唯一的。

时间

设置定时计划的运行时间。

**@startup**:在 OpenMod 和所有插件加载后执行作业,包括重新加载。
**@reboot**:在 OpenMod 和所有插件加载后执行作业,不包括重新加载。
**@single_exec**:执行一次定时计划,然后将其从文件中删除。
crontab 表达式:定期执行定时计划,例如每分钟、每周日、每第三个星期一等。访问 https://crontab.guru/ 了解更多信息。

以下是一些示例 crontab 表达式:

  • 0 * * 0:每周日凌晨 0:00。
  • 0 3 * * *:每天凌晨 3 点。
  • */5 * * * *:每5分钟一班。
  • 0 1 * *:每月第一天上午 0:00。

任务

要执行的任务。有 2 个内置任务:

  • openmod_command:执行一个或多个 OpenMod 命令。需要定义 args.command。
  • system_command:执行一个或多个系统命令。需要定义 args.command。

插件可以添加更多任务类型。

启用

设置作业是否已启用。

例子

每天凌晨 3 点重新启动:

- name: Auto Restart
  schedule: '0 3 * * *'
  task: openmod_command
  args:
    commands:
    - restart
  enabled: true

每 5 分钟保存一次:

- name: Save
  schedule: '*/5 * * * *'
  task: openmod_command
  args:
    commands:
    - save
  enabled: true

在每月的第一天运行 wipe.sh。它的工作方式类似于终端(Linux)或cmd(Windows),因此您可以使用.sh或.bat等脚本或直接运行程序。

- name: Wipe
  schedule: '0 0 1 * *'
  task: system_command
  args:
    commands: 
    - ./wipe.sh
  enabled: true

启动时迁移经济(仅执行一次)

- name: Economy Migration
  schedule: '@single_exec'
  task: openmod_command
  args:
    commands: 
    - economy migrate
  enabled: true

在每次启动时清除包(不建议这样做,只是一个示例)。

- name: Package purge
  schedule: '@startup'
  task: openmod_command
  args:
    commands:
    - openmod purge
  enabled: true