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 }