    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    }