下载未混淆版mc,25w46a之后的都可以,下载recaf,由于是直接修改字节码无需引入依赖,修改方法如图一所示
原理:
sectionX 和 sectionZ 是 int 类型。当执行 sectionX * sectionX 时,如果 sectionX 的绝对值超过 46340,结果就会超过 int 的最大值(2,147,483,647),从而发生整数溢出,变成一个负数。Mth.sqrt 接收到一个负数参数(因为溢出)会返回 NaN(Not a Number),导致后续的逻辑全部崩坏。
新代码的流程是:
将乘法运算提升到双精度浮点数(double),
外加使用安全的Math.hypot(x, y) 函数计算 \sqrt{x^2 + y^2} 的值。它内部处理了所有中间溢出或下溢出的情况,非常稳健。

修复前:

修复后:

原理:
sectionX 和 sectionZ 是 int 类型。当执行 sectionX * sectionX 时,如果 sectionX 的绝对值超过 46340,结果就会超过 int 的最大值(2,147,483,647),从而发生整数溢出,变成一个负数。Mth.sqrt 接收到一个负数参数(因为溢出)会返回 NaN(Not a Number),导致后续的逻辑全部崩坏。
新代码的流程是:
将乘法运算提升到双精度浮点数(double),
外加使用安全的Math.hypot(x, y) 函数计算 \sqrt{x^2 + y^2} 的值。它内部处理了所有中间溢出或下溢出的情况,非常稳健。

修复前:

修复后:

- 内容版权许可
- CC BY-SA 署名-相同方式共享