    001    package net.minecraft.util;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.Random;
    006
    007    public class MathHelper
    008    {
    009        /**
    010         * A table of sin values computed from 0 (inclusive) to 2*pi (exclusive), with steps of 2*PI / 65536.
    011         */
    012        private static float[] SIN_TABLE = new float[65536];
    013
    014        /**
    015         * sin looked up in a table
    016         */
    017        public static final float sin(float par0)
    018        {
    019            return SIN_TABLE[(int)(par0 * 10430.378F) & 65535];
    020        }
    021
    022        /**
    023         * cos looked up in the sin table with the appropriate offset
    024         */
    025        public static final float cos(float par0)
    026        {
    027            return SIN_TABLE[(int)(par0 * 10430.378F + 16384.0F) & 65535];
    028        }
    029
    030        public static final float sqrt_float(float par0)
    031        {
    032            return (float)Math.sqrt((double)par0);
    033        }
    034
    035        public static final float sqrt_double(double par0)
    036        {
    037            return (float)Math.sqrt(par0);
    038        }
    039
    040        /**
    041         * Returns the greatest integer less than or equal to the float argument
    042         */
    043        public static int floor_float(float par0)
    044        {
    045            int var1 = (int)par0;
    046            return par0 < (float)var1 ? var1 - 1 : var1;
    047        }
    048
    049        @SideOnly(Side.CLIENT)
    050
    051        /**
    052         * returns par0 cast as an int, and no greater than Integer.MAX_VALUE-1024
    053         */
    054        public static int truncateDoubleToInt(double par0)
    055        {
    056            return (int)(par0 + 1024.0D) - 1024;
    057        }
    058
    059        /**
    060         * Returns the greatest integer less than or equal to the double argument
    061         */
    062        public static int floor_double(double par0)
    063        {
    064            int var2 = (int)par0;
    065            return par0 < (double)var2 ? var2 - 1 : var2;
    066        }
    067
    068        /**
    069         * Long version of floor_double
    070         */
    071        public static long floor_double_long(double par0)
    072        {
    073            long var2 = (long)par0;
    074            return par0 < (double)var2 ? var2 - 1L : var2;
    075        }
    076
    077        public static float abs(float par0)
    078        {
    079            return par0 >= 0.0F ? par0 : -par0;
    080        }
    081
    082        public static int abs_int(int par0)
    083        {
    084            return par0 >= 0 ? par0 : -par0;
    085        }
    086
    087        public static int ceiling_float_int(float par0)
    088        {
    089            int var1 = (int)par0;
    090            return par0 > (float)var1 ? var1 + 1 : var1;
    091        }
    092
    093        public static int ceiling_double_int(double par0)
    094        {
    095            int var2 = (int)par0;
    096            return par0 > (double)var2 ? var2 + 1 : var2;
    097        }
    098
    099        /**
    100         * Returns the value of the first parameter, clamped to be within the lower and upper limits given by the second and
    101         * third parameters.
    102         */
    103        public static int clamp_int(int par0, int par1, int par2)
    104        {
    105            return par0 < par1 ? par1 : (par0 > par2 ? par2 : par0);
    106        }
    107
    108        @SideOnly(Side.CLIENT)
    109
    110        /**
    111         * Returns the value of the first parameter, clamped to be within the lower and upper limits given by the second and
    112         * third parameters
    113         */
    114        public static float clamp_float(float par0, float par1, float par2)
    115        {
    116            return par0 < par1 ? par1 : (par0 > par2 ? par2 : par0);
    117        }
    118
    119        /**
    120         * Maximum of the absolute value of two numbers.
    121         */
    122        public static double abs_max(double par0, double par2)
    123        {
    124            if (par0 < 0.0D)
    125            {
    126                par0 = -par0;
    127            }
    128
    129            if (par2 < 0.0D)
    130            {
    131                par2 = -par2;
    132            }
    133
    134            return par0 > par2 ? par0 : par2;
    135        }
    136
    137        @SideOnly(Side.CLIENT)
    138
    139        /**
    140         * Buckets an integer with specifed bucket sizes.  Args: i, bucketSize
    141         */
    142        public static int bucketInt(int par0, int par1)
    143        {
    144            return par0 < 0 ? -((-par0 - 1) / par1) - 1 : par0 / par1;
    145        }
    146
    147        @SideOnly(Side.CLIENT)
    148
    149        /**
    150         * Tests if a string is null or of length zero
    151         */
    152        public static boolean stringNullOrLengthZero(String par0Str)
    153        {
    154            return par0Str == null || par0Str.length() == 0;
    155        }
    156
    157        public static int getRandomIntegerInRange(Random par0Random, int par1, int par2)
    158        {
    159            return par1 >= par2 ? par1 : par0Random.nextInt(par2 - par1 + 1) + par1;
    160        }
    161
    162        public static double getRandomDoubleInRange(Random par0Random, double par1, double par3)
    163        {
    164            return par1 >= par3 ? par1 : par0Random.nextDouble() * (par3 - par1) + par1;
    165        }
    166
    167        public static double average(long[] par0ArrayOfLong)
    168        {
    169            long var1 = 0L;
    170            long[] var3 = par0ArrayOfLong;
    171            int var4 = par0ArrayOfLong.length;
    172
    173            for (int var5 = 0; var5 < var4; ++var5)
    174            {
    175                long var6 = var3[var5];
    176                var1 += var6;
    177            }
    178
    179            return (double)var1 / (double)par0ArrayOfLong.length;
    180        }
    181
    182        /**
    183         * the angle is reduced to an angle between -180 and +180 by mod, and a 360 check
    184         */
    185        public static float wrapAngleTo180_float(float par0)
    186        {
    187            par0 %= 360.0F;
    188
    189            if (par0 >= 180.0F)
    190            {
    191                par0 -= 360.0F;
    192            }
    193
    194            if (par0 < -180.0F)
    195            {
    196                par0 += 360.0F;
    197            }
    198
    199            return par0;
    200        }
    201
    202        /**
    203         * the angle is reduced to an angle between -180 and +180 by mod, and a 360 check
    204         */
    205        public static double wrapAngleTo180_double(double par0)
    206        {
    207            par0 %= 360.0D;
    208
    209            if (par0 >= 180.0D)
    210            {
    211                par0 -= 360.0D;
    212            }
    213
    214            if (par0 < -180.0D)
    215            {
    216                par0 += 360.0D;
    217            }
    218
    219            return par0;
    220        }
    221
    222        /**
    223         * parses the string as integer or returns the second parameter if it fails
    224         */
    225        public static int parseIntWithDefault(String par0Str, int par1)
    226        {
    227            int var2 = par1;
    228
    229            try
    230            {
    231                var2 = Integer.parseInt(par0Str);
    232            }
    233            catch (Throwable var4)
    234            {
    235                ;
    236            }
    237
    238            return var2;
    239        }
    240
    241        /**
    242         * parses the string as integer or returns the second parameter if it fails. this value is capped to par2
    243         */
    244        public static int parseIntWithDefaultAndMax(String par0Str, int par1, int par2)
    245        {
    246            int var3 = par1;
    247
    248            try
    249            {
    250                var3 = Integer.parseInt(par0Str);
    251            }
    252            catch (Throwable var5)
    253            {
    254                ;
    255            }
    256
    257            if (var3 < par2)
    258            {
    259                var3 = par2;
    260            }
    261
    262            return var3;
    263        }
    264
    265        /**
    266         * parses the string as double or returns the second parameter if it fails.
    267         */
    268        public static double parseDoubleWithDefault(String par0Str, double par1)
    269        {
    270            double var3 = par1;
    271
    272            try
    273            {
    274                var3 = Double.parseDouble(par0Str);
    275            }
    276            catch (Throwable var6)
    277            {
    278                ;
    279            }
    280
    281            return var3;
    282        }
    283
    284        public static double func_82713_a(String par0Str, double par1, double par3)
    285        {
    286            double var5 = par1;
    287
    288            try
    289            {
    290                var5 = Double.parseDouble(par0Str);
    291            }
    292            catch (Throwable var8)
    293            {
    294                ;
    295            }
    296
    297            if (var5 < par3)
    298            {
    299                var5 = par3;
    300            }
    301
    302            return var5;
    303        }
    304
    305        static
    306        {
    307            for (int var0 = 0; var0 < 65536; ++var0)
    308            {
    309                SIN_TABLE[var0] = (float)Math.sin((double)var0 * Math.PI * 2.0D / 65536.0D);
    310            }
    311        }
    312    }