长屋核心

创作者: Ezomic
已更新:2026-08-18 11:17:41
105KB

关于此 MOD

Ezomic模组的共享基础库。已为您作为依赖项安装。

长屋核心

为Ezomic英灵神殿模组共享的库。它处理那些每台机器只需处理一次而非每个模组各自处理的部分:检查客户端和服务器是否运行相同的模组、在你连接时应用主机的设置,以及在各自想要额外玩家物品栏行的模组之间进行仲裁。

你通常会在以下情况下获得它: 长屋礼包这是一个无资源的单一DLL,基于Valheim 1.0.7、Unity 6000.0.75、BepInEx 5.4.23.5和Harmony 2.9构建。

功能

  • 版本检查。 每个Ezomic模组都会注册其guid、版本和构建ID。当客户端连接时,两端会交换该列表,服务器会拒绝列表不匹配的客户端。原因会写入双方日志,并附加到客户端的“不兼容版本”屏幕上,否则该屏幕不会显示任何有用信息。

  • 主机配置。 服务器会为每个已注册的模组发送其设置,客户端在连接期间会一直使用这些设置。客户端的配置文件中不会写入任何内容,断开连接后客户端自身的设置值会恢复。

  • 共享库存高度。 模组会占用额外的玩家库存行,而不是写入 物品栏.高度 它们自己。Core 会汇总所有声明并只写入一次字段,因此两个都想添加行的模组会都得到各自的行,并且它会在加载期间保护这些行的内容。

  • 服务器聊天行。 服务器可以在每个玩家的聊天窗口中加一行字,署名由自己决定。原版做不到这一点:原版的聊天消息署名必须是一个已连接的玩家,而服务器不是玩家。Crier 用它来显示在 Longhouse 网站上写的聊天内容。

前三项可以在配置文件中关闭。聊天线路则没什么可关的:除了运行 Crier 的服务器,没有任何东西会发送它。

此仓库还包含 shared/Prefabs.cs 和 共享/生物群系索引.cs,这些是模组链接到自身项目的源文件。它们并非 DLL 的一部分。参见 模组作者.

安装

安装 BepInEx 5.4.2350 首先。这些模组使用 BepInEx 5 API,无法在 BepInEx 6 上加载。

如果安装了长屋包,模组管理器会处理它,它会将核心模组和其他所有成员模组一起固定。若要单独安装,请将 EzomicCore.dll 在 BepInEx\plugins\Core\.

在专用服务器和客户端上都要安装它。只有服务器端才能真正拒绝连接,因此没有安装 Core 的服务器不会进行任何检查,无论其客户端运行什么。

Core 对各个模组来说是一个可选的软依赖。每个模组都会检查 Core 是否已加载,如果没有,就会记录一条信息说明其正在独立运行,并在没有版本检查和主机配置的情况下继续运作。唯一的例外是 Delve,它完全需要 Core。

配置

BepInEx\config\ezomic.valheim.core.cfg,一切都在一个 多人游戏 节。

按键 默认 效果
强制执行版本 真 当两端就安装了哪些Ezomic模组或模组版本存在分歧时,拒绝连接。关闭此选项并不会使不匹配变得安全,只会让它悄无声息。
强制构建 真 当两端声称版本相同但由不同源码构建时也拒绝。如果你在多台机器上自行构建模组,请关闭此选项:构建ID取决于源码路径,因此不同文件夹中的同一提交会生成不同的ID。
强制执行配置 真 连接期间应用主机设置。在服务器端,这决定是否发送这些设置;在客户端,则决定是否接受这些设置。

多人游戏

模组列表将在以下时间发布: ZNet.OnNewConnection,在双方派出 对等端信息,所以等检查运行时它已经到了。所有不一致都会一次性报告,而不是每次重连尝试才报告一个。

每个已注册模组会按以下顺序进行比较:版本字符串,然后是构建 ID(程序集的模块版本 ID,由编译器根据编译输入生成),最后是模组数据文件的哈希值(如果模组声明了该值)。如果远端运行的是较旧版本的 Core,缺少构建 ID 或数据哈希,则视为未知,而非不匹配。

一个模组注册为 所有人 或 仅主机. 所有人 意味着两端需要相同版本。 仅主机 意味着没有它的客户端会被放行,但拥有它的客户端仍会与主机进行双向检查。Skaft 是 仅主机,例如:这是客户端侧的锤子修复,服务器不会因为客户端拥有它而获得或失去任何东西。

客户端也会检查,但只是为了写一份可读的日志,并把详情显示在拒绝界面上。真正关闭连接的地方只有一处,而且在服务器端。

配置同步。 注册模组会同步其整个配置文件,但按键绑定和模组保留的内容除外 本地在客户端内存中交换数值,原始值会被保留,并在以下情况下恢复 网络关闭 运行次数,涵盖退出至菜单、被踢出以及连接中断的情况。如果安装了 ConfigurationManager,强制设置的条目会显示为灰色,强行编辑后主机的值会立即恢复。

按键绑定 (键码 和 键盘快捷键 条目)绝不会被强加给客户端,除非拥有它们的模组调用 同步套件 对他们明确地。

客户端可以设置 EnforceConfig = false 并保留其自身的设置。版本检查是服务器强制执行的;配置同步则是协作性的。

背包行

《英灵神殿》1.0 自带物品栏行数功能,并且会清除超出其认定行数的任何内容。Core 顺应这一机制,而非与之对抗。

  • 网格上限为 9行那是原版的限制条件。 玩家.设置背包容量 没有办法绕过它。
  • 从商人处购买的行获胜。 已购买行数的角色会以更高的基准值出现,模组声明则获得剩余部分,上限为9。当声明被截断时,Core会记录一条警告,并列出具体数字。不会有任何内容被丢弃。
  • 角色的 库存行 键值会写回原版的自身计数,而不是膨胀后的计数,因此它不会在多次登录间累加,卸载Core后也会留下一个正常的角色。原版随后会将额外行中的所有内容掉落到地上,对于不再有任何内容提供的行来说,这是诚实的结果。
  • 任何物品栏在从磁盘读取时都会被拓宽,之后再缩减回去,但绝不会缩减到低于物品实际占用的空间。如果没有这一机制,保存在其加载到的网格下方某一行的物品会被无声地销毁。这同样适用于坟墓以及玩家,因此它涵盖所有容器,而不仅仅是玩家的物品栏。
  • 物品栏网格后方的木质面板会随之调整大小,根据屏幕上的网格进行测量,以便覆盖来自任何来源的行。容器窗口会被下推,如果它会掉到屏幕下方,则会被抬回屏幕上,与物品栏重叠。

如果行补丁未能全部应用,核心将完全不驱动行,并记录错误。未经负载保护就声称拥有行,是唯一会摧毁物品的组合。

模组作者

从以下位置注册 醒绑定配置后:

private void Awake() { YokeConfig.Bind(Config); Suite.Register(PluginGuid, PluginName, PluginVersion, Config); }

Suite.Register(guid, name, version, config, requirement = Requirement.Everyone, owner = null) 将其模组加入版本检查并吸收其配置以进行同步。 仅限房主 是另一个选项;使用 所有人 对于任何注册预制体或更改物品数据的操作,因为无法解析预制体哈希的客户端会丢弃ZDO而不是报错。

API 的其余部分:

  • 套件.同步(条目, ...) 强制添加一个条目到同步集合中。极少需要这样做,因为注册时已经同步了所有内容,除非是要强制某个按键绑定必须匹配。
  • 本地化(条目, …) 让一项设置不被主机掌控:界面缩放、颜色、悬停文本、首选单位,任何不匹配也不会导致不同步的内容。
  • Suite.Data(contents, guid = null) 将一个数据文件折叠进版本校验中,适用于那种由 DLL 加一个文本文件决定其行为的模组。它会对内容进行哈希,并规范化换行符,因此 CRLF 的差异不会被视为不匹配。
  • 套房.解释拒绝原因(原因) 设置附加到下一个连接失败界面的文本。在断开某人连接之前调用它。
  • 套件.显示(订单, 高级, 名称) 返回一个针对以下对象的 ConfigurationManager 特性对象: 配置说明 标签,这样游戏内设置窗口就是按顺序排列的,而不是按字母顺序。
  • 背包行.领取(插件指南, 3) 要求增加三行玩家席位,替换该guid之前请求的内容。 领取(PluginGuid, 0) 把它们还回去。每帧调用开销很低。 背包行数.总数 是所有人都声称的; 额外物品栏行 实际高度可能更高。

保持核心为软依赖。检查 Chainloader.PluginInfos 对于 伊佐米克·瓦尔海姆核心 然后放上 套房 在单独标记的方法中调用 [MethodImpl(MethodImplOptions.NoInlining)]JIT 在首次编译某个方法时,会解析该方法所需的程序集,因此一个 套房 直接坐在 苏醒 在检查能阻止之前就把程序集拉了进来,导致缺失程序集的异常在插件加载期间发生。

共享源

shared/Prefabs.cs 和 共享/生物群系索引.cs 存在于该仓库中,不包含在DLL内。模组会链接它们:

<Compile Include="..\core\shared\Prefabs.cs" Link="shared\Prefabs.cs" /> <Compile Include="..\core\shared\BiomeIndex.cs" Link="shared\BiomeIndex.cs" />

它们之所以是DLL中的源文件而非类,是因为一个无法注册其预制体或对物品进行分类的模组不会降级运行,而是完全不起作用;而将它们放入Core中,则会使Core成为每个使用它们的模组的强制性依赖。运行时回退则意味着会有第二条仅在无人测试的环境中才会运行的代码路径。

预制体 是运行时预制体注册表。 预制体.保留(名称, 建造, 物品, 建造工具) 加 预制体.更新() 来自插件的 更新 构建一次预制体,并将其重新注册到每个世界中:包括 ZNetScene 的两套查找表、当它是物品时的 ObjectDB,以及当它是建筑部件时的工具建造菜单。它每次都检查实时场景,而不是依赖某个标志位,这一点很重要,因为 ZNetScene 和 ObjectDB 会在每次世界加载时重建,包括往返菜单的一次行程。如果一个注册表通过静态布尔值来回答“已经完成了吗?”,就会提前返回一个从未听说过该预制体的场景,而该预制体的每个 ZDO 随后都会被丢弃,且不会向任何日志写入任何内容。这些步骤也可以单独使用: 已知, 持有者, 克隆, 捐赠者, 注册, 注册物品, 工具碎片, 工具内, 添加到工具,以及 掉落 停止保留。设置 日志预制体 到插件自己的日志记录器。

生物群系索引 回答物品来自哪个生物群系,依据游戏自身的表格推导: 植被系统生成列表及其角色掉落、熔炼和烹饪配方,再加上一个小型覆盖字符串,用于处理那些上述内容都覆盖不到的少数情况(比如铁碎屑,它只存在于沉没墓穴中)。最早出现的生物群系优先。 生物群系索引.按名称获取生物群系(name) 是查找; 生物群系键 和 覆盖 代表们是由主持人模组填入的。约克和赫斯拉将其连接起来。

修复任一文件都意味着要重建所有链接到它的模组。

故障排除

一个模组的日志行写道 **未强制执行,核心版本门控应用失败**. Core的某个补丁组未能应用,通常发生在游戏更新之后。Core日志 出现降级 而是列出缺失内容的列表,而不是其正常的 准备就绪。 读取它上面的错误信息。

客户端因“不同的构建版本”而被拒绝连接。 两端版本号相同但二进制文件不同。重新构建版本落后的那一端,或设置 强制构建 = 假 如果你在多个工作文件夹中从源代码构建。

插件文件夹中的一个模组未被勾选。 版本检查只能看到调用了 注册套件其他任何内容,包括第三方模组,它都看不到。

客户端设置未跟随服务器。 检查 强制配置 两端都要检查,并确认该模组是否已向 Core 注册。按键绑定按设计已被排除在外。

错误报告

Discord 是最快的途径,如果你不确定看到的是否是 bug,这也是正确的选择。问题在 仓库 也适用,而且适合各种长款。

附上 BepInEx\LogOutput.log,并说明你是在专用服务器、主机还是单人模式下。对于被拒绝的连接,两端的日志远比单端日志有价值得多。如果是原版机制而非模组功能出了问题,请检查 AppData\LocalLow\IronGate\Valheim\Player.log 此外:帧中途抛出的异常会记录在那里,而不是BepInEx日志中。

Bug 与建议

两人都前往该地点。 longhouse.thijssensoftware.nl/bugs 是用来处理损坏的事物,并且 长屋.thijssensoftware.nl/ideas 这是为了让模组接下来该做什么。你也可以在那里为其他人的想法投票。

登录需要一个Steam或Discord账号。我根据那份名单来安排工作,所以投票决定我接下来做什么。

Discord

discord.gg/hJzAVaZ5wb 是放置模组信息、更新、支持、错误报告和兼容性问题的板块。

服务器

还有一个运行该整合包的小型欧盟服务器,如果你想找个地方玩的话:困难战斗难度,资源1倍,其余全部原版。连接信息在Discord里。

许可证

麻省理工。罗宾·泰森,泰森软件。见 许可证,以及 更新日志.md 何时发货了什么。

长屋的一部分

核心是以下组织的成员: 长屋包,它固定了一组服务器将接受的版本。使用 Core 不需要该包,它单独运行时行为相同。

Valheim: 英灵神殿 的热门 MOD

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

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