客户端混入拦截

客户端混入拦截

一个服务端模组,用于自动拦截本会导致服务器崩溃的客户端Mixin注入,使此前无法启动的模组包能够成功启动。

Bug修复

简介

本模组是一个专门为服务端环境设计的兼容性模组(在客户端不会生效)。在服务器启动时,它会识别可能将客户端代码带入服务器并导致崩溃的 Mixin,对它们进行拦截或精细过滤,同时尽可能保留原模组的服务端功能。

但是,本模组并非万能的修复工具,也不能替代原模组作者在核心层面正确隔离环境的需求。


问题分类

类别 通俗解释 处理方式
DIRECT_CLIENT_TARGET 该 Mixin 直接修改了一个仅客户端存在的类,且此注入已升级为会导致启动终止的致命错误。 在 Mixin 官方错误处理阶段将致命错误降级,使服务器能够继续加载。
CLIENT_REFERENCE Mixin 的目标类可以在服务器上加载,但其字段、方法签名或方法体仍引用了客户端平台的类。 尝试仅移除有问题的字段/方法并清理其依赖关系;仅在无法进行局部处理时才禁用整个 Mixin。

例如,某个 Mixin 的目标是一个服务器上存在的普通实体类,但其某个方法调用了 Minecraft(客户端实例)或渲染类。完全禁用整个 Mixin 是不必要的——本模组优先只过滤代码中危险的部分。


不会盲目拦截所有客户端相关代码

为了尽量减少误判,本模组会尊重模组现有的环境防护机制:

  • Mixin 配置中的 client 列表;
  • Mixin 配置中声明的 IMixinConfigPlugin;
  • @Pseudo 注解;
  • Forge、NeoForge、Fabric 或 Architectury 中常见的环境注解和运行时环境检查;
  • Mixin 本身能够正常跳过的客户端目标。

特别是,仅当某个 Mixin 在错误处理器中实际进入 ERROR 状态时,DIRECT_CLIENT_TARGET 才会被记录。仅仅因为目标类名位于 .client. 包内、目标在服务器上不存在,或 Mixin 正常跳过目标——这些情况都不会自动将模组加入报告。


查看报告

每次独立服务器启动时都会重新生成 ClientMixinMod.txt 文件。示例输出:

# Client Mixin Intercept Report / 客户端 Mixin 拦截报告
# Direct client targets / 直接注入客户端类
[DIRECT_CLIENT_TARGET]
example_mod

Unguarded platform-client references / 未受环境保护的平台客户端引用

[CLIENT_REFERENCE] another_mod

该文件记录模组的 modid,已去重并排序:

  • 列在 DIRECT_CLIENT_TARGET 下——该模组触发了达到致命错误级别的客户端目标注入,本模组已将其拦截;
  • 列在 CLIENT_REFERENCE 下——该模组的 Mixin 包含未受保护的平台客户端引用,已在字节码层面进行过滤;
  • 同一个模组可能同时出现在两个类别中;
  • 被列出并不意味着整个模组编写错误,也不代表其所有功能都会失效——只是表示在当前服务器环境中,至少有一段 Mixin 代码需要处理。

注意:本模组仍有可能出现误判,尽管它已通过开发测试(在包含 200+ 模组的多个整合包的服务端环境中测试)并达到100% 准确率。