模组配置执行器

创作者: Pfhoenix
已更新:2023-03-12 12:27:04
405KB

关于此 MOD

Mod Config Enforcer是面向模组作者的实用模组。它允许模组作者支持服务器设置配置,并通过其模组将这些设置强制应用于连接的客户端。

更新:4.0版本改动之大,已完全淘汰此前所有版本。任何依赖2.X版本的模组都将不再受支持,必须自行更新。 MCE现在将与Better Networking模组冲突,因为两个模组都对Valheim的网络子系统进行了修改。你可以通过MCE的新配置文件禁用其网络优化功能。MCE现在为Steam用户移除了缓冲区限制,使得在使用同样依赖MCE的模组时不再需要Better Networking。此变更对于以优化方式支持发送大型数据包是必要的。

更新:3.0 版本是一次重大版本变更,因为它破坏了向后兼容性。如果你是用户,除非你正在使用的某个依赖 MCE 的模组要求你更新,否则不要更新 MCE。这次变更带来的麻烦比 2.0 版本的破坏要小得多,而最大的好处是模组作者现在可以利用 MCE 同步他们的配置,而无需对 MCE 产生硬性依赖。这意味着在单人游玩时,MCE 并非必需。模组作者现在只需少量代码,就能让自己的模组“兼容 MCE”,无需强制下载或捆绑。

Mod Config Enforcer 是一个面向模组作者的实用模组。它允许模组作者支持服务器设置配置,并利用他们的模组将这些设置强制应用于连接的客户端。该模组允许模组作者定义仅限本地(无服务器强制)以及服务器强制的配置变量。

手动安装:下载 ModConfigEnforcer.dll 并将其复制到你的 Valheim\Bepinex\plugins 文件夹中。

如果你是因为另一个模组依赖MCE来强制执行服务器配置而下载它,那就已经完成了!正确设置后,你会在plugins文件夹中看到两个新创建的DLL文件:ZstdNet.dll和libzstd.dll。这些文件是MCE压缩和解压ZPackage数据所必需的,以实现最佳性能。


硬依赖用法仍然受支持,因为这是使用 MCE 进行更复杂配置管理的最佳方式,但它不再是唯一的选择。MCE v3 现在支持约定式配置,这种方式非常容易设置,非常适合那些仅使用 ConfigEntry 对象进行 Bepinex 配置的较小模组。要让模组与 MCE 兼容并支持自动配置发现,只需遵循以下示例:

public class Plugin : BaseUnityPlugin { // 此字段必须存在并设置为一个对象,以便MCE处理你的模组对象 AutomatedConfigDiscovery; // 此字段将被MCE发现并读取 public ConfigEntry<int> Something; // 此字段将被MCE发现并读取,其值应为你希望服务器同步到客户端的文件的完整路径 public string File_TestFile = "C:\Steam\steamapps\common\Valheim\BepInEx\plugins\testfile.txt"; // 此字段将被MCE忽略,因此不会从服务器同步到客户端 [NonSerialized] public ConfigEntry<bool> OtherVar; public Awake() { // 必须在Awake中在此处设置,以确保MCE的自动配置发现能正确找到你的模组 AutomatedConfigDiscovery = this; // 你希望MCE发现的所有ConfigEntry字段必须在你的模组Awake结束前绑定 Something = Config.Bind("Section", "Something", 0, "Description"); OtherVar = Config.Bind("Section", "Other Var", true, "一个因带有[NonSerialized]属性而被MCE忽略的配置设置"); } // 这些完全是可选的。如果你没有它们,你的模组只是不会在这些事件发生时收到回调 void ServerConfigReceived() {} void ConfigReloaded() {} // 如果需要文件同步,则此方法必须存在 void FileChanged() {} }

如果你的插件类(名称不必是“Plugin”,只需它继承自 BaseUnityPlugin,这也是你的模组与 Valheim 兼容所必需的)不包含名为“AutomatedConfigDiscovery”的字段(拼写需一致,但大小写不敏感),MCE 就不会对你的模组进行自动配置发现处理。你可以将该变量设置为任意对象实例。该变量引用的对象将是 MCE 扫描 ConfigEntries 以及你的模组回调方法的目标。任何带有 NonSerialized 属性的 ConfigEntry 字段(如上方示例所示)都会被 MCE 的自动配置发现所忽略。

另一个示例如下:

public class Plugin : BaseUnityPlugin { // 为了让MCE处理你的模组,此字段必须存在并被设置为一个对象 public object AutomatedConfigDiscovery; public WhateverYouWantToCallThis ConfigStuff = new WhateverYouWantToCallThis(); public Awake() { // 必须在Awake中设置此处,以确保MCE的自动配置发现能正确找到你的模组 AutomatedConfigDiscovery = ConfigStuff; // 所有你希望MCE发现的ConfigEntry字段必须在Awake结束前为你的模组绑定完成 Something = Config.Bind("Section", "Something", 0, "Description"); OtherVar = Config.Bind("Section", "Other Var", true, "由于带有[NonSerialized]属性,此配置设置将被MCE忽略"); } } public class WhateverYouWantToCallThis { // 此字段将被MCE发现并读取 public ConfigEntry<int> Something; // 此字段将被MCE忽略,因此不会从服务器同步到客户端 [NonSerialized] public ConfigEntry<bool> OtherVar; // 以下方法完全可选。如果你没有它们,你的模组在这些事件发生时将不会收到回调。 void ServerConfigReceived() {} void ConfigReloaded() {} }

对于手动注册和使用模组,以下内容仍然适用:

模组作者:下载并设置完成后,在你的模组项目中,添加对ModConfigEnforcer.dll文件的引用。你的C#插件类文件至少应如下所示:

using System.Reflection; using BepInEx; using BepInEx.Logging; using HarmonyLib; using ModConfigEnforcer; namespace YourMod { [BepInPlugin("you.yourmod", ModName, Plugin.Version)] public class Plugin : BaseUnityPlugin { public const string Version = "1.0"; public const string ModName = "Your Mod"; Harmony _Harmony; public static ConfigVariable<bool> TestVariable; private void Awake() { ConfigManager.RegisterMod(ModName, Config, ServerConfigReceived, ConfigReloaded); TestVariable = ConfigManager.RegisterModConfigVariable<bool>(ModName, "Test Variable", true, "General", "Just a test variable, doesn't do anything.", false); FileVariable = ConfigManager.RegisterModFileWatcher(ModName, Path.Combine(Path.GetDirectoryName(Info.Location), "test.png"), false, FileChanged); _Harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), null); } private void OnDestroy() { if (_Harmony != null) _Harmony.UnpatchSelf(); } private void ServerConfigReceived() { } private void ConfigReloaded() { } private void FileChanged() { } } }

ConfigVariable<bool> 类型来自 MCE。它用于管理你的模组的配置值,具体取决于该值是否应由服务器设置。它使用 C# 泛型类型——目前支持以下任意类型(限制取决于 ZPackage 类从其数据流中读写的数据类型):

  • 整数
  • 无符号整数
  • 布尔值
  • 字节
  • 字节数组
  • 角色
  • 带符号字节
  • 长
  • 无符号长整型
  • 浮点数
  • 双倍
  • 字符串
  • ZPackage
  • 列表<string>
  • 三维向量
  • 四元数
  • ZDOID
  • 命中数据

为了在代码中使用你的配置变量,只需调用(以上面的示例为例)Plugin.TestVariable.Value

如果你也想使用自定义配置方式,同样支持。

如果你有任何问题或需要帮助,请在以下平台找我: 英灵神殿模组Discord服务器.

如果你想查看代码了解ModConfigEnforcer的工作原理,我已经把 GitHub 仓库已公开。

Valheim: 英灵神殿 的热门 MOD

探索适用于 Valheim: 英灵神殿 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 Valheim: 英灵神殿 的全部潜力 — 今天就探索这些顶级 MOD!