package net.minecraft.crash; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.Callable; import net.minecraft.util.MathHelper; public class CrashReportCategory { private final CrashReport theCrashReport; private final String field_85076_b; private final List field_85077_c = new ArrayList(); private StackTraceElement[] stackTrace = new StackTraceElement[0]; public CrashReportCategory(CrashReport par1CrashReport, String par2Str) { this.theCrashReport = par1CrashReport; this.field_85076_b = par2Str; } @SideOnly(Side.CLIENT) public static String func_85074_a(double par0, double par2, double par4) { return String.format("%.2f,%.2f,%.2f - %s", new Object[] {Double.valueOf(par0), Double.valueOf(par2), Double.valueOf(par4), getLocationInfo(MathHelper.floor_double(par0), MathHelper.floor_double(par2), MathHelper.floor_double(par4))}); } /** * Returns a string with world information on location.Args:x,y,z */ public static String getLocationInfo(int par0, int par1, int par2) { StringBuilder stringbuilder = new StringBuilder(); try { stringbuilder.append(String.format("World: (%d,%d,%d)", new Object[] {Integer.valueOf(par0), Integer.valueOf(par1), Integer.valueOf(par2)})); } catch (Throwable throwable) { stringbuilder.append("(Error finding world loc)"); } stringbuilder.append(", "); int l; int i1; int j1; int k1; int l1; int i2; int j2; int k2; int l2; try { l = par0 >> 4; i1 = par2 >> 4; j1 = par0 & 15; k1 = par1 >> 4; l1 = par2 & 15; i2 = l << 4; j2 = i1 << 4; k2 = (l + 1 << 4) - 1; l2 = (i1 + 1 << 4) - 1; stringbuilder.append(String.format("Chunk: (at %d,%d,%d in %d,%d; contains blocks %d,0,%d to %d,255,%d)", new Object[] {Integer.valueOf(j1), Integer.valueOf(k1), Integer.valueOf(l1), Integer.valueOf(l), Integer.valueOf(i1), Integer.valueOf(i2), Integer.valueOf(j2), Integer.valueOf(k2), Integer.valueOf(l2)})); } catch (Throwable throwable1) { stringbuilder.append("(Error finding chunk loc)"); } stringbuilder.append(", "); try { l = par0 >> 9; i1 = par2 >> 9; j1 = l << 5; k1 = i1 << 5; l1 = (l + 1 << 5) - 1; i2 = (i1 + 1 << 5) - 1; j2 = l << 9; k2 = i1 << 9; l2 = (l + 1 << 9) - 1; int i3 = (i1 + 1 << 9) - 1; stringbuilder.append(String.format("Region: (%d,%d; contains chunks %d,%d to %d,%d, blocks %d,0,%d to %d,255,%d)", new Object[] {Integer.valueOf(l), Integer.valueOf(i1), Integer.valueOf(j1), Integer.valueOf(k1), Integer.valueOf(l1), Integer.valueOf(i2), Integer.valueOf(j2), Integer.valueOf(k2), Integer.valueOf(l2), Integer.valueOf(i3)})); } catch (Throwable throwable2) { stringbuilder.append("(Error finding world loc)"); } return stringbuilder.toString(); } /** * Adds a Crashreport section with the given name with the value set to the result of the given Callable; */ public void addCrashSectionCallable(String par1Str, Callable par2Callable) { try { this.addCrashSection(par1Str, par2Callable.call()); } catch (Throwable throwable) { this.addCrashSectionThrowable(par1Str, throwable); } } /** * Adds a Crashreport section with the given name with the given value (convered .toString()) */ public void addCrashSection(String par1Str, Object par2Obj) { this.field_85077_c.add(new CrashReportCategoryEntry(par1Str, par2Obj)); } /** * Adds a Crashreport section with the given name with the given Throwable */ public void addCrashSectionThrowable(String par1Str, Throwable par2Throwable) { this.addCrashSection(par1Str, par2Throwable); } public int func_85073_a(int par1) { StackTraceElement[] astacktraceelement = Thread.currentThread().getStackTrace(); //BugFix: Causes AIOOB for stacks < 3 + par1 int len = astacktraceelement.length - 3 - par1; if (len <= 0) len = astacktraceelement.length; this.stackTrace = new StackTraceElement[len]; System.arraycopy(astacktraceelement, astacktraceelement.length - len, this.stackTrace, 0, this.stackTrace.length); return this.stackTrace.length; } public boolean func_85069_a(StackTraceElement par1StackTraceElement, StackTraceElement par2StackTraceElement) { if (this.stackTrace.length != 0 && par1StackTraceElement != null) { StackTraceElement stacktraceelement2 = this.stackTrace[0]; if (stacktraceelement2.isNativeMethod() == par1StackTraceElement.isNativeMethod() && stacktraceelement2.getClassName().equals(par1StackTraceElement.getClassName()) && stacktraceelement2.getFileName().equals(par1StackTraceElement.getFileName()) && stacktraceelement2.getMethodName().equals(par1StackTraceElement.getMethodName())) { if (par2StackTraceElement != null != this.stackTrace.length > 1) { return false; } else if (par2StackTraceElement != null && !this.stackTrace[1].equals(par2StackTraceElement)) { return false; } else { this.stackTrace[0] = par1StackTraceElement; return true; } } else { return false; } } else { return false; } } public void func_85070_b(int par1) { StackTraceElement[] astacktraceelement = new StackTraceElement[this.stackTrace.length - par1]; System.arraycopy(this.stackTrace, 0, astacktraceelement, 0, astacktraceelement.length); this.stackTrace = astacktraceelement; } public void func_85072_a(StringBuilder par1StringBuilder) { par1StringBuilder.append("-- ").append(this.field_85076_b).append(" --\n"); par1StringBuilder.append("Details:"); Iterator iterator = this.field_85077_c.iterator(); while (iterator.hasNext()) { CrashReportCategoryEntry crashreportcategoryentry = (CrashReportCategoryEntry)iterator.next(); par1StringBuilder.append("\n\t"); par1StringBuilder.append(crashreportcategoryentry.func_85089_a()); par1StringBuilder.append(": "); par1StringBuilder.append(crashreportcategoryentry.func_85090_b()); } if (this.stackTrace != null && this.stackTrace.length > 0) { par1StringBuilder.append("\nStacktrace:"); StackTraceElement[] astacktraceelement = this.stackTrace; int i = astacktraceelement.length; for (int j = 0; j < i; ++j) { StackTraceElement stacktraceelement = astacktraceelement[j]; par1StringBuilder.append("\n\tat "); par1StringBuilder.append(stacktraceelement.toString()); } } } public static void func_85068_a(CrashReportCategory par0CrashReportCategory, int par1, int par2, int par3, int par4, int par5) { par0CrashReportCategory.addCrashSectionCallable("Block type", new CallableBlockType(par4)); par0CrashReportCategory.addCrashSectionCallable("Block data value", new CallableBlockDataValue(par5)); par0CrashReportCategory.addCrashSectionCallable("Block location", new CallableBlockLocation(par1, par2, par3)); } }