更新: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 类从其数据流中读写的数据类型):
为了在代码中使用你的配置变量,只需调用(以上面的示例为例)Plugin.TestVariable.Value
如果你也想使用自定义配置方式,同样支持。
如果你有任何问题或需要帮助,请在以下平台找我: 英灵神殿模组Discord服务器.
如果你想查看代码了解ModConfigEnforcer的工作原理,我已经把 GitHub 仓库已公开。

修改前置工具
2026-09-12 14:33:53
修改前置工具

史诗战利品
randyknapp2026-09-09 21:20:10
为英灵神殿添加战利品掉落、魔法物品和附魔。

制作 建造 熔炼 烹饪 燃料 从容器中取出
aedenthorn2025-06-30 08:34:14
让你在制作、建造、使用熔炉和窑炉、添加燃料、烹饪食物等时,可以使用附近容器中的资源。

种植一切
Advize2025-09-09 11:15:37
重写了bkeyes93的种植增强模组。允许你的种植者种植浆果丛、蓟、蒲公英、蘑菇、此前无法获取的树种以及其他装饰性植物。还包括许多其他杂项功能(详见

无限制传送门
frostedplaything4102023-09-02 17:39:40
无限制传送门是一个客户端模组,允许玩家通过传送门传送任何物品。该模组提供广泛的自定义选项,让玩家能够控制物品限制、移除限制,

农场格子
Sarcenzzz2023-06-14 11:38:34
允许所有通过种植器种下的植物自动对齐并放置在网格中,确保它们有足够的生长空间。

更好的UI
MKMasa2021-04-15 09:19:42
这个模组对游戏界面做了一些细微的调整。你可以编辑并选择想要启用的更新内容。

更好的射箭
Ishid42026-09-10 16:16:51
为弓术玩法添加了许多功能和改动,包括全新的箭袋系统、可回收的箭矢、更精准的瞄准以及逼真的箭矢物理效果。