反编译Minecraft1.5.2 als.java类出现void方法错误使用问题求助
反编译Minecraft 1.5.2代码时遇到的void方法误用问题
我在反编译Minecraft 1.5.2代码时,发现als.java文件存在明显错误:代码中把返回值为void的方法用于减法运算,还试图将void类型赋值给int变量。用Fernflower(IntelliJ IDEA内置反编译器)和JD-GUI反编译,结果完全一致,反编译代码如下:
/* * Decompiled with CFR 0.152. */ import java.util.Random; public class als extends aly implements amh { public als(int n2, boolean bl2) { super(n2, bl2); this.cF = true; } public int a(int n2, Random random, int n3) { return wk.bY.cp; } public int d(aab aab2, int n2, int n3, int n4) { return wk.bY.cp; } protected int i_(int n2) { return 2; } protected aly i() { return apa.cq; } protected aly j() { return apa.cp; } public int d() { return 37; } public lx a(int n2, int n3) { boolean bl2; boolean bl3 = bl2 = this.a || (n3 & 8) != 0; if (n2 == 0) { if (bl2) { return apa.aU.m(n2); } return apa.aT.m(n2); } if (n2 == 1) { if (bl2) { return apa.cq.cQ; } return this.cQ; } return apa.an.m(1); } protected boolean c(int n2) { return this.a || (n2 & 8) != 0; } protected int d(aak aak2, int n2, int n3, int n4, int n5) { return this.a_(aak2, n2, n3, n4).a(); } private int m(aab aab2, int n2, int n3, int n4, int n5) { if (!this.d(n5)) { return this.e(aab2, n2, n3, n4, n5); } return Math.max(this.e(aab2, n2, n3, n4, n5) - this.f((aak)aab2, n2, n3, n4, n5), 0); } public boolean d(int n2) { return (n2 & 4) == 4; } protected boolean d(aab aab2, int n2, int n3, int n4, int n5) { int n6 = this.e(aab2, n2, n3, n4, n5); if (n6 >= 15) { return true; } if (n6 == 0) { return false; } int n7 = this.f((aak)aab2, n2, n3, n4, n5); if (n7 == 0) { return true; } return n6 >= n7; } protected int e(aab aab2, int n2, int n3, int n4, int n5) { int n6; int n7 = super.e(aab2, n2, n3, n4, n5); int n8 = als.j(n5); int n9 = n2 + r.a[n8]; int n10 = aab2.a(n9, n3, n6 = n4 + r.b[n8]); if (n10 > 0) { if (apa.r[n10].q_()) { n7 = apa.r[n10].b_(aab2, n9, n3, n6, r.f[n8]); } else if (n7 < 15 && apa.l(n10) && (n10 = aab2.a(n9 += r.a[n8], n3, n6 += r.b[n8])) > 0 && apa.r[n10].q_()) { n7 = apa.r[n10].b_(aab2, n9, n3, n6, r.f[n8]); } } return n7; } public aqa a_(aak aak2, int n2, int n3, int n4) { return (aqa)aak2.r(n2, n3, n4); } public boolean a(aab aab2, int n2, int n3, int n4, sq sq2, int n5, float f2, float f3, float f4) { int n6 = aab2.h(n2, n3, n4); boolean bl2 = this.a | (n6 & 8) != 0; boolean bl3 = !this.d(n6); int n7 = bl3 ? 4 : 0; aab2.a((double)n2 + 0.5, (double)n3 + 0.5, (double)n4 + 0.5, "random.click", 0.3f, bl3 ? 0.55f : 0.5f); aab2.b(n2, n3, n4, (n7 |= bl2 ? 8 : 0) | n6 & 3, 2); this.c(aab2, n2, n3, n4, aab2.s); return true; } protected void f(aab aab2, int n2, int n3, int n4, int n5) { int n6; int n7; int n8; if (!(aab2.a(n2, n3, n4, this.cz) || (n8 = this.m(aab2, n2, n3, n4, n7 = aab2.h(n2, n3, n4))) == (n6 = this.a_(aab2, n2, n3, n4).a()) && this.c(n7) == this.d(aab2, n2, n3, n4, n7))) { if (this.h(aab2, n2, n3, n4, n7)) { aab2.a(n2, n3, n4, this.cz, this.i_(0), -1); } else { aab2.a(n2, n3, n4, this.cz, this.i_(0), 0); } } } private void c(aab aab2, int n2, int n3, int n4, Random random) { int n5 = aab2.h(n2, n3, n4); int n6 = this.m(aab2, n2, n3, n4, n5); int n7 = this.a_(aab2, n2, n3, n4).a(); this.a_(aab2, n2, n3, n4).a(n6); if (n7 != n6 || !this.d(n5)) { boolean bl2; boolean bl3 = this.d(aab2, n2, n3, n4, n5); boolean bl4 = bl2 = this.a || (n5 & 8) != 0; if (bl2 && !bl3) { aab2.b(n2, n3, n4, n5 & 0xFFFFFFF7, 2); } else if (!bl2 && bl3) { aab2.b(n2, n3, n4, n5 | 8, 2); } this.h_(aab2, n2, n3, n4); } } public void a(aab aab2, int n2, int n3, int n4, Random random) { if (this.a) { int n5 = aab2.h(n2, n3, n4); aab2.f(n2, n3, n4, this.j().cz, n5 | 8, 4); } this.c(aab2, n2, n3, n4, random); } public void a(aab aab2, int n2, int n3, int n4) { super.a(aab2, n2, n3, n4); aab2.a(n2, n3, n4, this.b(aab2)); } public void a(aab aab2, int n2, int n3, int n4, int n5, int n6) { super.a(aab2, n2, n3, n4, n5, n6); aab2.s(n2, n3, n4); this.h_(aab2, n2, n3, n4); } public boolean b(aab aab2, int n2, int n3, int n4, int n5, int n6) { super.b(aab2, n2, n3, n4, n5, n6); aqp aqp2 = aab2.r(n2, n3, n4); if (aqp2 != null) { return aqp2.b(n5, n6); } return false; } public void a(ly ly2) { this.cQ = ly2.a(this.a ? "comparator_lit" : "comparator"); } public aqp b(aab aab2) { return new aqa(); } }
我反编译的目的是自行优化Minecraft代码,这是第一个发现此类问题的类,推测近1500个文件中可能存在大量同类问题。当时我猜测或许需要修改f方法并返回其中声明的变量,后续发现父类aly中存在protected int f方法,疑惑是否应该调用该方法。七个月后,我觉得当初这个问题很愚蠢。
内容的提问来源于stack exchange,提问作者TheEntropyShard
相关产品推荐
相关产品推荐

