RuntimeOCD

RuntimeOCD

检测模组之间的 XML 相关兼容性问题并记录日志。也会自动解决其中部分问题。请阅读完整描述以获取详细信息。与 v2 版本兼容。

实用工具

center

当游戏从模组加载XML文件时,RuntimeOCD会强制对其进行分析,以检测它们之间可能存在的冲突。一旦检测到冲突,会记录日志以供故障排查或调试使用。只有主机能看到这些日志条目。日志和配置文件会被写入 Roaming/7DaysToDie/RuntimeOCD

除此之外,RuntimeOCD会动态修补特定明确定义的冲突,以提升兼容性并/或防止游戏在无实际问题的场景下向玩家显示特定错误信息(详情见下文)。

作为一个玩家,RuntimeOCD 对你来说是 有益的,因为它让故障排查更轻松,能帮助你更早发现问题或至少提前预判问题,避免浪费数小时甚至数天的试玩时间,并且在少数情况下还能自动提升模组之间的兼容性。

如果你是模组作者,RuntimeOCD 对你来说非常 有用,因为它能帮助你让你的模组与其他模组兼容,即使你自己不使用这个模组,因为使用它的玩家在遇到问题时能向你提供更有意义的信息。

如果你就是 Byteblazar,那么 RuntimeOCD 对你来说是 糟糕 的,因为它给你增加了更多需要维护的内容,让一些模组作者讨厌你(因为玩家报告的问题比以前更多),也让一些玩家讨厌你(因为它做不到立竿见影的效果,而且你没有把全部时间投入到他们更在意的模组制作上)。

你还在读。很好。现在,我们来深入了解细节。


相关XML术语表

  • 元素:XML中定义的元素。
  • 类型:元素的XML节点名称(如 block、buff、item、property、enemy 等)。它们在XML中被称为“名称”,但此处为避免与“name”属性混淆,我称之为“类型”。
  • 后代节点:在XML树中位于另一个元素之下的元素,即另一个元素的子元素,或子元素的子元素等。祖先节点则是相反的概念。
  • 兄弟元素:与另一个元素具有相同父元素的元素。

这整个是一个元素:

<类型 属性="值">
  请提供您需要翻译的游戏内容,我将按照要求逐行翻译为中文。
</type>

这是四种元素:

<Rick_Sanchez>
  <Beth_Sanchez>
    <Summer_Smith/>
    <Morty_Smith/>
  </Beth_Sanchez>
</Rick_Sanchez>

莫蒂和夏天是贝丝的孩子,贝丝是瑞克的孩子,因此莫蒂、夏天和贝丝是瑞克的后代。夏天和莫蒂都是贝丝的孩子,所以他们是兄弟姐妹(至少在这个宇宙里是这样……)


冲突检测

以下记录的是不同类型的冲突,按严重程度从高到低排序。

重要提示:请注意,RuntimeOCD检测到的并非所有冲突都必然有害,有些甚至是刻意为之(即并非真正的冲突)。通常来说,你可以安全忽略大部分由旨在修补其他模组的模组引发的"冲突",因为这就是它们存在的全部意义;但当模组进行非常通用的修改,无意中影响到其他模组时,这才需要你注意并学会预料意外情况。

类别: 移除 (R)

操作: remove

描述: 当模组B直接或间接移除由模组A添加或修改的元素时。

严重程度: 高。当一个模组随意移除其他模组的元素而不考虑这些模组的作用时,极大概率会引发问题。

可视化:

[spoiler]

img

粗鲁。

[/spoiler]

类别: 元素覆盖 (EO)

操作: set

描述: 当模组B直接或间接覆盖了模组A添加或修改过的元素时。

严重程度: 高。与移除相同,可能安全进行,但若处理不当,极易引发问题。不过,至少这个操作会留下一些东西。

视觉化:

[spoiler]

img

模组B显然需要救赎。

[/spoiler]

分类: 兄弟冲突 (SC)

操作: append, prepend, insertBefore, insertAfter

描述: 当兄弟元素相互覆盖时。此外,当 Mod B 添加一个元素 (B) 作为另一个元素 (A) 的兄弟元素时(A 直接由 Mod A 添加或修改),该元素与新增元素 (B) 具有相同的类型和相同的名称属性。

严重程度: 中。与兄弟姐妹同名可能没问题,也可能有问题,这取决于你所在国家的法律,以及具体涉及的元素类型,因为游戏对每种类型的处理方式不同。对于大多数类型,游戏可能会自行报错,但对于某些类型,它只会默默保留最后添加的同名项并丢弃之前的,这可能导致玩家视角下的意外行为,因此.RuntimeOCD会对所有这些情况发出警告。

可视化:

[spoiler]

img

Mod B是谁?最后到的那个人。

[/spoiler]

类别: 属性覆盖 (AO)

操作: set, setattribute, removeattribute

描述: 当模组B修改或移除由模组A直接添加或修改的元素的属性时。

严重程度: 中等。若非故意为之,它成为冲突与成为特性的可能性相当。这完全取决于所涉及的模组具体行为,但问题潜在影响不如移除或元素覆盖那般显著,因为至少这不会直接影响目标元素的后代。

可视化:

[spoiler]

img

...我敢肯定Mod A会想念他们的。

[/spoiler]

类别: 强制性父母身份 (FP)

操作: append, prepend, insertAfter, insertBefore

描述: 当模组B给模组A带来可能不想要的后代时。这是指模组B为模组A直接添加或修改的元素添加了一个子元素。实际上,任何后代元素的添加都算,不仅仅是子元素,但我认为“强制祖先”这个说法不够有趣。

严重程度: 低。尽管名称如此,这类问题通常不会引发故障,更多是意外行为,但将其纳入是因为信息越多=你的掌控力越强。

可视化:

[spoiler]

img

承认吧:你早就料到这一篇会限制级,对吧?

[/spoiler]

我想现在大家都会同意 Mod B 就是个失败品。 所有在读这段文字的作者们:请尽量不要做出像Mod B这样的东西。 所有人都会感谢你们的。


冲突解决

如上所述,RuntimeOCD 也会即时修补通用且定义明确的冲突。

第一个冲突发生在两个或多个模组试图为同一个方块添加 BuffsWhenWalkedOn 属性时。BuffsWhenWalkedOn 告诉游戏,当玩家站在特定类型的方块上时触发增益效果。在这种情况下,RuntimeOCD会合并这些模组中的 BuffsWhenWalkedOn 属性,从而使站在目标方块上时能同时触发所有效果。

RuntimeOCD还能防止游戏在模组试图添加已存在的挑战类别时抛出错误。

从v0.11.0.0版本开始,RuntimeOCD还提升了模组间屏幕效果(如灰度、模糊等)的兼容性。它创建了一个堆栈来追踪所有激活的屏幕效果,确保每种效果的最强实例被应用,而较弱的版本仅在最强者被原始来源禁用时才生效。模组作者请注意:模组仍然可以通过将强度设为0来无条件禁用屏幕效果,前提是禁用来源(增益、物品等)本身未应用该屏幕效果。

自v0.12.0.0版本起,RuntimeOCD还提升了触发音频混音器过渡(眩晕/致聋效果)的模组之间的兼容性。此功能的工作方式与屏幕效果堆栈类似。


为什么要用这个模组?

起初,这只是一个副业项目。原因是有很多人提到我的一个模组(7 Days of Insomnia)与其他模组之间存在兼容性问题,尽管我从一开始就注重兼容性来编写那个模组。虽然通过XML方式修改这款游戏在很多方面都很出色,但解决兼容性问题很快就变成了一场“谁的模组最后加载”的竞赛——这需要给文件夹命名时,开头堆砌越来越多的字母“Z”。于是,我并没有仅仅解决手头的具体问题,然后继续推进其他项目,而是创建了这个工具。它虽然远非完美,也绝非万能解药,但希望能足够好用,为大家带来改变。


安装

  • 手动下载zip文件。
  • 将压缩包解压。你可以选择右键点击压缩文件,使用原生Windows系统的解压工具,但我们这些技术爱好者更偏爱7-zip
  • 将解压后的模组文件夹放入游戏目录下的“Mods”文件夹中。许多教程会指导你使用游戏文件夹内的Mods文件夹,但建议使用以下路径的"Mods"文件夹:

C:\Users\你的用户名\AppData\Roaming\7DaysToDie\Mods

如果你是新手并想了解更多,这里有FNS提供的故障排除指南


img img img

img