001 package net.minecraft.crash; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.ArrayList; 006 import java.util.Iterator; 007 import java.util.List; 008 import java.util.concurrent.Callable; 009 import net.minecraft.util.MathHelper; 010 011 public class CrashReportCategory 012 { 013 private final CrashReport field_85078_a; 014 private final String field_85076_b; 015 private final List field_85077_c = new ArrayList(); 016 private StackTraceElement[] field_85075_d = new StackTraceElement[0]; 017 018 public CrashReportCategory(CrashReport par1CrashReport, String par2Str) 019 { 020 this.field_85078_a = par1CrashReport; 021 this.field_85076_b = par2Str; 022 } 023 024 @SideOnly(Side.CLIENT) 025 public static String func_85074_a(double par0, double par2, double par4) 026 { 027 return String.format("%.2f,%.2f,%.2f - %s", new Object[] {Double.valueOf(par0), Double.valueOf(par2), Double.valueOf(par4), func_85071_a(MathHelper.floor_double(par0), MathHelper.floor_double(par2), MathHelper.floor_double(par4))}); 028 } 029 030 public static String func_85071_a(int par0, int par1, int par2) 031 { 032 StringBuilder var3 = new StringBuilder(); 033 034 try 035 { 036 var3.append(String.format("World: (%d,%d,%d)", new Object[] {Integer.valueOf(par0), Integer.valueOf(par1), Integer.valueOf(par2)})); 037 } 038 catch (Throwable var16) 039 { 040 var3.append("(Error finding world loc)"); 041 } 042 043 var3.append(", "); 044 int var4; 045 int var5; 046 int var6; 047 int var7; 048 int var8; 049 int var9; 050 int var10; 051 int var11; 052 int var12; 053 054 try 055 { 056 var4 = par0 >> 4; 057 var5 = par2 >> 4; 058 var6 = par0 & 15; 059 var7 = par1 >> 4; 060 var8 = par2 & 15; 061 var9 = var4 << 4; 062 var10 = var5 << 4; 063 var11 = (var4 + 1 << 4) - 1; 064 var12 = (var5 + 1 << 4) - 1; 065 var3.append(String.format("Chunk: (at %d,%d,%d in %d,%d; contains blocks %d,0,%d to %d,255,%d)", new Object[] {Integer.valueOf(var6), Integer.valueOf(var7), Integer.valueOf(var8), Integer.valueOf(var4), Integer.valueOf(var5), Integer.valueOf(var9), Integer.valueOf(var10), Integer.valueOf(var11), Integer.valueOf(var12)})); 066 } 067 catch (Throwable var15) 068 { 069 var3.append("(Error finding chunk loc)"); 070 } 071 072 var3.append(", "); 073 074 try 075 { 076 var4 = par0 >> 9; 077 var5 = par2 >> 9; 078 var6 = var4 << 5; 079 var7 = var5 << 5; 080 var8 = (var4 + 1 << 5) - 1; 081 var9 = (var5 + 1 << 5) - 1; 082 var10 = var4 << 9; 083 var11 = var5 << 9; 084 var12 = (var4 + 1 << 9) - 1; 085 int var13 = (var5 + 1 << 9) - 1; 086 var3.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(var4), Integer.valueOf(var5), Integer.valueOf(var6), Integer.valueOf(var7), Integer.valueOf(var8), Integer.valueOf(var9), Integer.valueOf(var10), Integer.valueOf(var11), Integer.valueOf(var12), Integer.valueOf(var13)})); 087 } 088 catch (Throwable var14) 089 { 090 var3.append("(Error finding world loc)"); 091 } 092 093 return var3.toString(); 094 } 095 096 /** 097 * Adds a Crashreport section with the given name with the value set to the result of the given Callable; 098 */ 099 public void addCrashSectionCallable(String par1Str, Callable par2Callable) 100 { 101 try 102 { 103 this.addCrashSection(par1Str, par2Callable.call()); 104 } 105 catch (Throwable var4) 106 { 107 this.addCrashSectionThrowable(par1Str, var4); 108 } 109 } 110 111 /** 112 * Adds a Crashreport section with the given name with the given value (convered .toString()) 113 */ 114 public void addCrashSection(String par1Str, Object par2Obj) 115 { 116 this.field_85077_c.add(new CrashReportCategoryEntry(par1Str, par2Obj)); 117 } 118 119 /** 120 * Adds a Crashreport section with the given name with the given Throwable 121 */ 122 public void addCrashSectionThrowable(String par1Str, Throwable par2Throwable) 123 { 124 this.addCrashSection(par1Str, par2Throwable); 125 } 126 127 public int func_85073_a(int par1) 128 { 129 StackTraceElement[] var2 = Thread.currentThread().getStackTrace(); 130 this.field_85075_d = new StackTraceElement[var2.length - 3 - par1]; 131 System.arraycopy(var2, 3 + par1, this.field_85075_d, 0, this.field_85075_d.length); 132 return this.field_85075_d.length; 133 } 134 135 public boolean func_85069_a(StackTraceElement par1StackTraceElement, StackTraceElement par2StackTraceElement) 136 { 137 if (this.field_85075_d.length != 0 && par1StackTraceElement != null) 138 { 139 StackTraceElement var3 = this.field_85075_d[0]; 140 141 if (var3.isNativeMethod() == par1StackTraceElement.isNativeMethod() && var3.getClassName().equals(par1StackTraceElement.getClassName()) && var3.getFileName().equals(par1StackTraceElement.getFileName()) && var3.getMethodName().equals(par1StackTraceElement.getMethodName())) 142 { 143 if (par2StackTraceElement != null != this.field_85075_d.length > 1) 144 { 145 return false; 146 } 147 else if (par2StackTraceElement != null && !this.field_85075_d[1].equals(par2StackTraceElement)) 148 { 149 return false; 150 } 151 else 152 { 153 this.field_85075_d[0] = par1StackTraceElement; 154 return true; 155 } 156 } 157 else 158 { 159 return false; 160 } 161 } 162 else 163 { 164 return false; 165 } 166 } 167 168 public void func_85070_b(int par1) 169 { 170 StackTraceElement[] var2 = new StackTraceElement[this.field_85075_d.length - par1]; 171 System.arraycopy(this.field_85075_d, 0, var2, 0, var2.length); 172 this.field_85075_d = var2; 173 } 174 175 public void func_85072_a(StringBuilder par1StringBuilder) 176 { 177 par1StringBuilder.append("-- ").append(this.field_85076_b).append(" --\n"); 178 par1StringBuilder.append("Details:"); 179 Iterator var2 = this.field_85077_c.iterator(); 180 181 while (var2.hasNext()) 182 { 183 CrashReportCategoryEntry var3 = (CrashReportCategoryEntry)var2.next(); 184 par1StringBuilder.append("\n\t"); 185 par1StringBuilder.append(var3.func_85089_a()); 186 par1StringBuilder.append(": "); 187 par1StringBuilder.append(var3.func_85090_b()); 188 } 189 190 if (this.field_85075_d != null && this.field_85075_d.length > 0) 191 { 192 par1StringBuilder.append("\nStacktrace:"); 193 StackTraceElement[] var6 = this.field_85075_d; 194 int var7 = var6.length; 195 196 for (int var4 = 0; var4 < var7; ++var4) 197 { 198 StackTraceElement var5 = var6[var4]; 199 par1StringBuilder.append("\n\tat "); 200 par1StringBuilder.append(var5.toString()); 201 } 202 } 203 } 204 205 public static void func_85068_a(CrashReportCategory par0CrashReportCategory, int par1, int par2, int par3, int par4, int par5) 206 { 207 par0CrashReportCategory.addCrashSectionCallable("Block type", new CallableBlockType(par4)); 208 par0CrashReportCategory.addCrashSectionCallable("Block data value", new CallableBlockDataValue(par5)); 209 par0CrashReportCategory.addCrashSectionCallable("Block location", new CallableBlockLocation(par1, par2, par3)); 210 } 211 }