跳到正文

DamageSource Is Not Null Plus

作者:vomiter

尝试修复“NullPointerException:LivingDeathEvent.getSource() 返回 null”

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

DamageSource Is Not Null: Plus

DamageSource Is Not Null: Plus 需要 DSNNULL Basic 的核心保护层,并将覆盖范围扩展到许多第三方模组实体和自定义伤害路径。如果你是普通玩家、服务器腐竹或整合包作者,这很可能就是你需要的那一版。

项目结构

DSNNULL 项目现已拆分为两部分:

DSNNULL Basic

核心模块。提供共享的防护逻辑、回退处理以及面向原版的基础保护。

DSNNULL Plus

扩展模块。基于 Basic 构建,为受支持的第三方模组和模组实体增加额外的兼容覆盖。

之所以进行这样的拆分,是因为在单个包中同时维护核心系统和所有模组实体覆盖变得越来越困难。将它们分离可以让项目更易于维护、扩展和调试。


关于 DamageSource 空指针异常的说明

原版 Minecraft 和模组加载器都假定 DamageSource 永远不会为 null。

然而,一些模组仍会错误地触发伤害或死亡逻辑并传入 null 的 DamageSource,这可能导致如下崩溃:

LivingDeathEvent.getSource() is null

这些崩溃会中断游戏进程,并产生难以调试的问题,因为堆栈跟踪中很少包含真正将 null 传入伤害处理管线的那个方法。本模组提供了一层防御,防止此类问题导致崩溃,同时它也会捕获 null 被传入管线的位置,从而让实际调试更加容易。


调试工具

本模组包含调试工具,可帮助定位缺失的覆盖范围和易受影响的实体。

/dsnnull debug testall

该命令会对已注册的生物实体执行启发式扫描,并尝试识别仍易受 null DamageSource 影响的实体。

如果某些实体未通过扫描,请在问题追踪器上报告,并附上 latest.log,以便在后续更新中扩展覆盖范围。


关于 3.0.0 和基于转换器的覆盖

自 3.0.0 版本 起,DSNNULL Plus 使用基于转换器的方式,自动将覆盖范围扩展到更广泛的类和伤害路径。

这显著提升了自动补丁覆盖率,尤其是对于那些原本需要大量手动兼容 mixin 的模组实体。

然而,由于这也增加了模组与运行时交互的广度,在非常庞大或复杂的整合包中可能会引入兼容性风险。

如果你遇到启动崩溃,并且移除 DSNNULL Plus 后崩溃消失,请将完整的 latest.log 提交到问题追踪器,以便调查该情况。

这对于识别意外的转换器交互并改进未来兼容性尤其有帮助。


局限性

DamageSource Is Not Null: Plus 是一个防御性缓解模组,并非保证万能的修复方案。

由于模组化 Minecraft 的运作方式,它无法保证在所有可能的情况下都提供保护。

一些模组仍可能:

  • 绕过受保护的路径
  • 覆盖或替换核心伤害逻辑
  • 在本模组能够拦截问题之前就崩溃
  • 需要尚未添加的针对具体情况的兼容支持

环境

  • Forge – 1.20.1
  • NeoForge – 1.21.1

支持

如果你想支持我的模组开发工作,包括维护、更新和兼容性工作,可以通过以下 Patreon 链接:

https://patreon.com/vomiter_scp

常见问题

DamageSource Is Not Null Plus 支持哪些 Minecraft 版本?

DamageSource Is Not Null Plus 支持 Minecraft Java 版 1.18.2–1.21.1,共 4 个版本,可用的加载器:Fabric / Forge / NeoForge。下载时注意选择和你游戏版本一致的文件。

DamageSource Is Not Null Plus 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / Forge / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

vomiter 的其他作品

查看全部 →