本文为OpenMod用户文档翻译,你也可以前往官网查看
介绍
OpenMod是.NET 插件框架,为您的服务器添加新功能。
OpenMod提供了在运行时下载、安装、更新和删除插件的命令。
安装步骤
- 从这里下载最新的OpenMod.Unturned.Module-vX.X.X.zip。
- 将“OpenMod.Unturned”文件夹复制到Unturned安装目录中的“Modules”文件夹中。
- 启动服务器。第一次启动需要一段时间,因为OpenMod将下载其核心组件。
- 好了!现在您可以开始安装插件了。
查找插件
您可以在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_EnableAutoUpdate
true
默认情况下,自动更新处于禁用状态。
配置文件
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 文件或使用permission
和permissionrole
命令来管理权限。您可以使用help permission
和help 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而不是文件的方式:
- 安装 MariaDB 接收器:
openmod install Serilog.Sinks.MariaDB
- 将 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:每周日凌晨 0:00。
- 0 3 * * *:每天凌晨 3 点。
- */5 * * * *:每5分钟一班。
- 0 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