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    }