无任意不兼容标志

创作者: IAmOnTheInternetAndItIsScary
已更新:2026-04-02 07:05:16
139KB

关于此 MOD

移除RtD模组的不兼容限制,使其能与其他流行的英灵神殿模组兼容。

无任意不兼容标记

一个BepInEx补丁程序,可移除RtD模组的不兼容限制,使其能与其他热门英灵神殿模组同时使用。

它有什么用?

此补丁会移除 [BepIn不兼容] 来自RtD模组的属性,让你能够将它们与之前被阻止的模组一起使用。这些模组本身可以正常协同工作——这只是移除了限制。

受影响的RtD模组:

  • 深洋
  • 藤蔓
  • 怪物
  • 灵魂与灵魂附加包
  • 生物群系数据库
  • 怪物回归
  • 地下城
  • 童话之路
  • RtD园艺
  • 恐怖之路
  • RtD物品
  • RtDMagic
  • 传说
  • 神话回归
  • 锻造任务

之前被阻止的模组(现已兼容):

  • 饼干牛奶魔法坐骑
  • 曲奇牛奶·皇家鸡
  • 饼干牛奶.建造部件
  • 饼干牛奶.带我飞大师
  • 饼干牛奶.Discord控制
  • 饼干牛奶.终极服务器控制
  • 瑟尔齐·北境深渊
  • 瑟尔齐·战争火与冰
  • 瑟尔齐·蒙斯特鲁姆
  • 瑟尔齐军械库
  • 瑟尔齐的巫术
  • 瑟尔齐·战争
  • blacks7ar.魔法插件
  • 黑s7ar.魔法重制
  • 黑星之种床
  • 黑星矿场
  • blacks7ar.弓插件
  • 兰迪·纳普的模组:史诗战利品
  • 瓦爾海姆增強插件

安装

重要提示: 这是一个补丁程序,不是普通插件!

  1. 下载 无任意不兼容标记.dll
  2. 把它放进 BepInEx/插件补丁/ 文件夹(不是插件!)
  3. 启动游戏
  4. 补丁程序将在启动时自动处理RtD模组

工作原理

补丁程序采用双层方案,将Cecil IL补丁与Harmony运行时补丁相结合。所有修改仅在内存中进行——磁盘上的文件绝不会被改动。

启动时,你会看到:

正在处理 RtDVines.dll... 已从 RtDVines 中剥离 19 个不兼容属性 已阉割 RtDVines.Fail() 已从 RtDVines.Awake() 中移除 4 个 Fail() 调用 ✓ Cecil IL 补丁完成 - RtD 检测代码已失效 ✓ Harmony 回退:已准备好绕过不兼容检查 ✓ Harmony 回退:已准备好躲避 ContainsKey 检测 ✓ Harmony 回退:已准备好隐藏程序集名称 ✓ Harmony 回退:已准备好过滤 GetAssemblies ✓ 找到 RtD 模组:RtDVines ✓ 已成功绕过 1 个 RtD 模组的不兼容检查

技术细节

RtD模组在它们的Awake()方法中添加了四个检测检查:

  1. 字节码完整性检查:验证其“格挡”方法未被修改

    MethodInfo method = typeof(RtDMod).GetMethod("Block", ...); byte[] ilAsByteArray = method?.GetMethodBody()?.GetILAsByteArray(); if (method == null || ilAsByteArray == null || ilAsByteArray.Length <= 2) Fail();
    
  2. 插件信息字典检查在BepInEx的插件注册表中查找我们的GUID

    如果(Chainloader.PluginInfos.ContainsKey("IAmOnTheInternetAndItIsScary.NoArbitraryIncompatibilityFlag"))则失败();
    
  3. 组件名称扫描在所有已加载的程序集中搜索我们的名称

    如果(应用域.当前域.获取程序集().任意(a => a.获取名称().名称.包含("NoArbitraryIncompatibilityFlag"))) 失败();
    
  4. 模块名称扫描在所有已加载的程序集模块中搜索我们的名称

    如果 (AppDomain.CurrentDomain.GetAssemblies().Any(a => a.ManifestModule.Name.IndexOf("NoArbitraryIncompatibilityFlag", StringComparison.OrdinalIgnoreCase) >= 0)) Fail();
    

补丁程序采用双层防御策略。Cecil层在BepInEx的预加载阶段运行,此时任何插件代码尚未执行。BepInEx将每个RtD DLL加载到内存中作为 程序集定义 物品,将其交给我们的 补丁() 方法,我们修改IL指令,BepInEx将修改后的版本加载到CLR中。磁盘上的原始DLL从未被改动。

塞西尔IL补丁(主防御)

  1. 移除不兼容属性:移除所有 [BepIn不兼容] 从类型自定义属性。这是主要目标——移除实际的不兼容性声明。

  2. 中性化失败() 方法: 将方法体替换为仅有 返回即使检测检查以某种方式执行,调用 失败() 什么也不做。

    // 之前:private static void Fail() { throw new Exception("Mod integrity check failed."); } // 之后:private static void Fail() { return; // 什么都不做 }
    
  3. 去除静态构造函数抛出异常:NOPs在以下位置抛出语句 .cctor查找包含完整性检查字符串的静态构造函数并替换 加载字符串 + 创建异常对象 + 投掷 与 无操作 说明。

  4. 从 Awake() 中移除 Fail() 调用: 将所有调用置空 失败() 在Awake方法中。查找所有 调用失败 说明并将其替换为 无操作 (无操作)。

和谐运行时补丁(回退保护)

和谐层提供备用保护,以防塞西尔层遗漏某些内容,或未来的RtD模组使用不同的模式:

  1. 不兼容绕过:补丁 插件信息.不兼容项 返回空数组的 getter,用于 RtD 模组(通过 “Soloredis.” GUID 前缀识别)。

  2. 包含潜行:补丁 字典<字符串, 插件信息>.包含键 仅针对我们的特定GUID且仅当从RtD代码调用时返回false。使用堆栈跟踪分析来识别调用方。

  3. 程序集名称隐藏:补丁 获取程序集名称() 在从RtD模组调用时,返回“HiddenAssembly”而不是“NoArbitraryIncompatibilityFlag”。使用递归防护来防止在GetAssemblies调用期间出现问题。

  4. 程序集获取筛选:补丁 获取应用程序域中的程序集 仅在从RtD模组调用时,才从结果中过滤掉我们的程序集。使用递归防护(获取内部程序集 标志)以防止无限循环——前缀将标志设为真,后缀在过滤后将其设为假,而GetName_Postfix会检查此标志,当它为真时跳过处理。

常见问题

问:这安全吗?
A:是的。补丁程序只是移除了兼容性限制。模组仍能正常运行,只是不再阻止其他模组了。

问:这会破坏我的游戏吗?
答:不会。如果你遇到任何问题,那都与这个补丁程序无关。你可以随时移除补丁程序以恢复原始行为。

问:这会修改磁盘上的文件吗?
答:不会。所有修改都仅在内存中进行。BepInEx 将 DLL 加载到内存中,我们修改 IL,修改后的版本被加载进游戏。原始文件保持不变。

问:RtD模组更新后需要重新安装吗?
A:不会。补丁程序每次启动时都会运行,并自动处理任何版本的RtD模组。

Q:我可以从旧版本的修补程序升级吗?
A:是的。只需用新的DLL替换旧的DLL即可,在 补丁程序 文件夹。

问:这个能和旧版本的RtD模组兼容吗?
是的。该补丁程序适用于当前所有RtD模组版本。

问:如果我想停止使用这个补丁工具怎么办?
A: 只需从该位置移除DLL文件 补丁程序 文件夹。RtD 模组将恢复其原有行为。

问:为什么会有这个补丁程序?
被屏蔽的模组与RtD模组兼容良好。这些不兼容限制是武断的,阻止了玩家使用能够正常协同工作的模组组合。

问:你会持续更新这个吗?
答:是的。只要这些模组持续被封锁,这个补丁工具就会持续更新以应对。由玩家制作,为玩家服务。

问:RtD作者声称使用此补丁会导致漏洞、低帧率、高内存占用和世界损坏。这是真的吗?
不。这完全是错误的。该补丁程序只会移除不兼容限制——它不会修改游戏逻辑、添加新内容或改变模组的工作方式。被阻止的模组会完全按照它们原本的方式运行。使用该补丁程序不会导致性能问题、不会增加内存占用,也不存在存档损坏的风险。

问:被禁用的模组真的能和RtD模组一起用吗?
A:是的。屏蔽列表中的所有模组一直都能与RtD模组完美兼容。这些不兼容限制是随意的,并非基于实际的技术冲突。玩家们一直在成功使用这些模组组合。

Valheim: 英灵神殿 的热门 MOD

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

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