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