Skip to content

[dev] 交接捕食伤害溢出证据与抗性修复回归计划 - #2298

Draft
wanquanw wants to merge 8 commits into
mainfrom
codex/damage-overflow-runtime
Draft

wanquanw wants to merge 8 commits into
mainfrom
codex/damage-overflow-runtime

Conversation

@wanquanw

@wanquanw wanquanw commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

当前状态:等待后续决策

用户已要求暂停进一步实现。两份 PR 继续保持 Draft;保留已验证的抗性先算比例补丁与现有诊断,不修改暴击、捕食极值或实体适用范围,不合并、不发布,不安排自动后续操作。

新确认:暴击来源与上游行为

  • 核对实际安装的 AttributesLib / Apothic Attributes 1.3.7 JAR:CRIT_CHANCE 默认 0.05,CRIT_DAMAGE 默认 1.5。applyAttribs 遍历 EntityAttributeModificationEvent.getTypes(),向生物添加这些通用属性。
  • 上游 apothCriticalStrike 只要求伤害来源为 LivingEntity,并不限于玩家,因此蟾蜍捕食也进入暴击判定。这不是 Alex's Mobs 为蟾蜍单独设计的随机暴击能力。
  • 项目 config、KubeJS 与 CDC 检查未发现蟾蜍专属暴击率或暴伤覆盖;本轮日志中的 5% / 1.5 与 AttributesLib 默认值一致。
  • CDC 的 AttributeEventsMixin 把多重暴击改为加算,并未扩大适用实体范围;上游本来就使用生物范围。
  • 当前 CDC 单次暴击为 MAX + MAX * 0.5;撤掉 CDC 加算逻辑后,上游单次暴击仍为 MAX * 1.5,两者均超出 float 范围。因此只关闭 CDC 加算开关不能解决这个极值兼容问题。

待决策范围

后续再决定是否定向处理捕食使用的 Float.MAX_VALUE、限制暴击的实体/攻击适用范围,或对有限输入的暴击输出采用局部有限饱和策略。上述均未实施,不把范围收缩当作所有伤害计算数值安全的替代。原始 0.5.0.11 环境未重跑,当前生产者归因仅针对已验证的 main 基线。

以下保留前期实现与实测记录;下一步动作以本节的等待决策状态为准。


交接内容

记录蟾蜍捕食非有限伤害的调查证据、当前补丁与验收步骤。配套实现:Jasons-impart/Create-Delight-Core#126,最新执行顺序修正 a095011

本 PR 仅交接 docs/plan/nether-predation-nonfinite-damage-fix-plan.md,不提交 CDC 子模块指针、发行 JAR、个人配置或存档。

当前结论

  • 已确认抗性中的 Float.MAX_VALUE * 25 首先溢出,后续吸收计算产生 NaN;用户选定 damage * (factor / 25.0F)
  • 2026-09-18 首版实测启动失败:探针先执行导致修复匹配为零,7 个父 Trace 仍走旧公式。游戏能够启动不代表补丁命中。
  • CDC 已改为单个 postApply 入口先修复再观察,新增错误顺序回归并 JVM 执行生产组合产物。完整 build、mapped/SRG 及本次导出类验证通过。
  • 新测试构建哈希和本地失败证据位置已记录;已在退出游戏后替换原运行目录 JAR 并核对哈希,诊断保持开启,真实启动和非暴击捕食已验证,暴击另触发异常,详见最新证据。

接手与验收

获取 CDC 最新分支构建,在原实例启动确认 Applied ratio-first ... before probes。用新绯红蚊重复捕食,确认先 25 / 25 = 1MAX * 1 = MAX,继续观察 Damage、吸收、生命阶段;另外回归抗性、Sundering 和旁路。

当前主世界已复现相同 BigDecimal 异常链,原下界 0.5.0.11 尚未重跑,MMT 玩家适用范围未调整。不将本次抗性修复视作全部问题闭环。保持 Draft,通过游戏验证后再决定同步子模块和 Packwiz 产物。

2026-09-18 00:34 最新游戏证据

CDC a095011 已真实启动并出现抗性修复成功标记。6 条已记录非暴击捕食均先 25/25=1 再 MAX*1=MAX,后续 Damage、零吸收与生命处理未观察到非有限值。

另一次捕食的 Hurt #11 / 父 #10 由 CDC AttributeEventsMixin 的 useAdditiveMulticrit 首次写入 MAX -> Infinity。运行属性为暴击率 0.05、暴伤 1.5;结合源码,溢出发生在 MAX 加上 MAX*0.5 的加法。此方法内部运算由源码推导,探针直接证据是属性返回和事件写入。

随后 TetraWear.ArmorHoning -> AttributesLib.getAValue -> BigDecimal 抛出 Infinite or NaN,Neruina 暂停蟾蜍,重现原反馈的异常类型和消费端链。异常早于抗性阶段,是独立的暴击溢出;原 0.5.0.11 未重跑,不能断言原版生产者相同。

本轮保留抗性修复,仅更新调查证据,没有修改暴击/捕食规则。暴击结果本身超出 float 范围,不能仅重排计算解决;后续评估捕食极值定向处理或暴击局部有限饱和策略。保持 Draft。

汇总截图调用链、极值来源、MMT适用范围以及050x/main基线差异。
关联 CDC PR #126,明确已完成诊断构建和未完成游戏回归的边界。
本次仅提交调查文档,保留本地诊断开关、个人配置与运行载荷。

验证:diff 格式及知识库校验通过;真实首次溢出生产者待复现确认。
明确历史 050x 产物与当前本地诊断部署的区别,补充探针入口、哈希和备份位置。
记录 Hurt 返回 MAX、Damage 入口 Infinity 的一致结果,以及未复现原 BigDecimal 异常的边界。
补充合并字节码中的 AttributesLib 抗性分支候选,关联 CDC 5fde0d2 的跨事件探针、验证和本地部署哈希。

只更新调查文档,不改个人配置、子模块指针或发行产物;下一步验证新探针实际启动并再次捕食。
记录7个独立父Trace的抗性乘法溢出及吸收NaN,确认诊断启动覆盖。后续转入抗性算术修复评审,并保留原下界现场差异。仅更新文档。
记录用户选择、CDC cc8bdc6 实现、测试边界、当前运行JAR哈希与备份路径。
下一轮验证补丁命中与后续伤害链,不预先认定原下界异常全部闭环。

仅更新调查文档,保留个人配置、子模块指针与发行产物。
@wanquanw wanquanw changed the title [dev] 交接下界捕食伤害溢出调查与修复计划 [dev] 交接捕食伤害溢出证据与抗性修复回归计划 Sep 17, 2026
第三轮七个父 Trace 仍为旧抗性公式溢出,原因是探针先执行使修复零匹配。记录 CDC a095011 的顺序修正、失败证据及新构建哈希。

完整构建、mapped/SRG 和导出类校验通过;待退出游戏替换后再验证启动与捕食。仅提交调查文档,不更新子模块指针或发行载荷。
确认游戏已退出后备份旧测试包,将 a095011 的非 all reobf JAR 部署原运行目录并核对 SHA-256,诊断开关保持开启。游戏重启和捕食回归仍待完成。
记录 CDC a095011 游戏验证:非暴击路径有限,暴击加法溢出并复现 TetraWear/AttributesLib/Neruina 链。明确下一步需要数值策略而非重排运算,本轮不修改规则。
@wanquanw

Copy link
Copy Markdown
Contributor Author

理论解决方案与取舍(待决策,未实施)

当前建议:保留已验证的抗性先算比例修复,下一步优先评估暴击计算的局部有限饱和处理;生物暴击适用范围另作玩法决策。 本评论记录讨论,不代表已批准或开始实现。PR 继续保持 Draft。

两类溢出需要分别处理

类型 本次实例 处理方式
中间值超限,但最终数学结果可表示 MAX * 25 / 25 调整运算顺序为 MAX * (25 / 25);当前抗性补丁已在游戏中验证命中。
最终数学结果本身超出 float 范围 暴击的 MAX + MAX * 0.5 或上游的 MAX * 1.5 必须定义超范围结果的处理规则;仅调整括号或暂用 double 再直接转 float 都不足以解决。

优先建议:暴击计算局部有限饱和

有限、合法输入产生的正向超限伤害,将该次暴击计算结果饱和到 Float.MAX_VALUE。语义是“伤害已达到接口可表达的最大值,继续增伤仍保持最大值”,避免把 Infinity 写入事件。

  • 正常范围沿用现有计算,尽量保持普通战斗结果与浮点舍入行为。
  • 在暴击运算处识别超限,必要时用 double 判断结果,再安全转换;具体边界与多重暴击累计方式须在实现前确定。
  • 不将已有 NaN、Infinity、异常属性或所有异常数值统一改成零/MAX;这些输入继续诊断,另行明确策略。
  • 保留暴击判定、粒子、事件取消、后续减伤及死亡流程。
  • 这是候选数值规则,不是已经实施的全局 clamp。

局限:只修暴击不能保证整条伤害链安全。后续 MMT、Sundering 等增伤仍可能再次放大 MAX,需保留探针,针对实际发现的生产点继续验证。不能仅在最终伤害出口截断,因为 TetraWear 等监听器可能在出口之前已经抛错。

其他方向及取舍

  1. 限制蟾蜍或非玩家战斗参与暴击。 可以避免当前触发条件,也可能符合整合包玩法设计,但属于范围调整,不能代替数值安全。只处理涉及玩家的攻击仍会包含蟾蜍攻击玩家;普通攻击通常不用 MAX,并不意味着所有极值来源消失。
  2. 定向替换捕食的 MAX 或重新定义捕食语义。 更靠近极值来源,但不能随意改成目标生命值或某个大常数:护甲、抗性、吸收与事件修改可能使捕食不再致死。应先决定捕食是否受这些规则影响,再设计实现;直接死亡/移除又会改变事件、掉落和死亡流程。
  3. TetraWear 消费端防御。 可作为第二层保护,例如没有适用装备时跳过无用途的研磨计算。但只保护消费端并不能阻止 Infinity 流向其他监听器,不宜作为主要修复。

建议推进顺序与待决策项

推荐顺序:保留抗性重排 → 决策暴击局部饱和 → 保留探针回归其他增伤组合。生物暴击范围和特殊捕食机制另行评估,避免一次异常修复同时改变整套战斗规则。

后续需决定:是否接受有限输入超限时饱和到 MAX、该规则的适用边界,以及是否另行调整生物暴击或捕食语义。确定方案后,再验证普通伤害、极值、多重暴击、抗性/Sundering、吸收、事件取消和捕食死亡行为。

当前仅记录理论方案,暂停进一步实现,不合并、不发布。上述归因针对已验证的 main 基线;原始 0.5.0.11 环境尚未重跑。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant