    001    package net.minecraft.client.renderer.texturefx;
    002
    003    import cpw.mods.fml.client.FMLTextureFX;
    004    import cpw.mods.fml.relauncher.Side;
    005    import cpw.mods.fml.relauncher.SideOnly;
    006    import java.awt.image.BufferedImage;
    007    import java.io.IOException;
    008    import javax.imageio.ImageIO;
    009    import net.minecraft.client.Minecraft;
    010    import net.minecraft.item.Item;
    011    import net.minecraft.util.ChunkCoordinates;
    012
    013    @SideOnly(Side.CLIENT)
    014    public class TextureCompassFX extends FMLTextureFX
    015    {
    016        /** A reference to the Minecraft object. */
    017        private Minecraft mc;
    018
    019        /** Holds the image of the compass from items.png in rgb format. */
    020        private int[] compassIconImageData = new int[256];
    021        public double field_76868_i;
    022        public double field_76866_j;
    023        public static TextureCompassFX field_82391_c;
    024        public static int stileSizeBase = 16;
    025        public static int stileSizeSquare = 256;
    026        public static int stileSizeMask = 15;
    027        public static int stileSizeSquareMask = 255;
    028
    029        public TextureCompassFX(Minecraft par1Minecraft)
    030        {
    031            super(Item.compass.getIconFromDamage(0));
    032            this.mc = par1Minecraft;
    033            this.tileImage = 1;
    034
    035            setup();
    036        }
    037
    038        @Override
    039        public void setup()
    040        {
    041            super.setup();
    042            stileSizeBase = tileSizeBase;
    043            stileSizeSquare = tileSizeSquare;
    044            stileSizeMask = tileSizeMask;
    045            stileSizeSquareMask = tileSizeSquareMask;
    046            compassIconImageData = new int[tileSizeSquare];
    047
    048            try
    049            {
    050                BufferedImage var2 = ImageIO.read(mc.texturePackList.getSelectedTexturePack().getResourceAsStream("/gui/items.png"));
    051                int var3 = this.iconIndex % 16 * tileSizeBase;
    052                int var4 = this.iconIndex / 16 * tileSizeBase;
    053                var2.getRGB(var3, var4, tileSizeBase, tileSizeBase, this.compassIconImageData, 0, tileSizeBase);
    054            }
    055            catch (IOException var5)
    056            {
    057                var5.printStackTrace();
    058            }
    059
    060            field_82391_c = this;
    061        }
    062
    063        public void onTick()
    064        {
    065            if (this.mc.theWorld != null && this.mc.thePlayer != null)
    066            {
    067                func_82390_a(this.mc.thePlayer.posX, this.mc.thePlayer.posZ, (double)this.mc.thePlayer.rotationYaw, false, false);
    068            }
    069            else
    070            {
    071                func_82390_a(0.0D, 0.0D, 0.0D, true, false);
    072            }
    073        }
    074
    075        public static void func_82390_a(double par0, double par2, double par4, boolean par6, boolean par7)
    076        {
    077            int[] var8 = field_82391_c.compassIconImageData;
    078            byte[] var9 = field_82391_c.imageData;
    079            int var17;
    080            int var16;
    081
    082            for (int var10 = 0; var10 < stileSizeSquare; ++var10)
    083            {
    084                int var11 = var8[var10] >> 24 & 255;
    085                int var12 = var8[var10] >> 16 & 255;
    086                int var13 = var8[var10] >> 8 & 255;
    087                int var14 = var8[var10] >> 0 & 255;
    088
    089                if (field_82391_c.anaglyphEnabled)
    090                {
    091                    int var15 = (var12 * 30 + var13 * 59 + var14 * 11) / 100;
    092                    var16 = (var12 * 30 + var13 * 70) / 100;
    093                    var17 = (var12 * 30 + var14 * 70) / 100;
    094                    var12 = var15;
    095                    var13 = var16;
    096                    var14 = var17;
    097                }
    098
    099                var9[var10 * 4 + 0] = (byte)var12;
    100                var9[var10 * 4 + 1] = (byte)var13;
    101                var9[var10 * 4 + 2] = (byte)var14;
    102                var9[var10 * 4 + 3] = (byte)var11;
    103            }
    104
    105            double var27 = 0.0D;
    106
    107            if (field_82391_c.mc.theWorld != null && !par6)
    108            {
    109                ChunkCoordinates var29 = field_82391_c.mc.theWorld.getSpawnPoint();
    110                double var28 = (double)var29.posX - par0;
    111                double var32 = (double)var29.posZ - par2;
    112                var27 = (par4 - 90.0D) * Math.PI / 180.0D - Math.atan2(var32, var28);
    113
    114                if (!field_82391_c.mc.theWorld.provider.isSurfaceWorld())
    115                {
    116                    var27 = Math.random() * Math.PI * 2.0D;
    117                }
    118            }
    119
    120            double var30;
    121
    122            if (par7)
    123            {
    124                field_82391_c.field_76868_i = var27;
    125            }
    126            else
    127            {
    128                for (var30 = var27 - field_82391_c.field_76868_i; var30 < -Math.PI; var30 += (Math.PI * 2D))
    129                {
    130                    ;
    131                }
    132
    133                while (var30 >= Math.PI)
    134                {
    135                    var30 -= (Math.PI * 2D);
    136                }
    137
    138                if (var30 < -1.0D)
    139                {
    140                    var30 = -1.0D;
    141                }
    142
    143                if (var30 > 1.0D)
    144                {
    145                    var30 = 1.0D;
    146                }
    147
    148                field_82391_c.field_76866_j += var30 * 0.1D;
    149                field_82391_c.field_76866_j *= 0.8D;
    150                field_82391_c.field_76868_i += field_82391_c.field_76866_j;
    151            }
    152
    153            var30 = Math.sin(field_82391_c.field_76868_i);
    154            double var31 = Math.cos(field_82391_c.field_76868_i);
    155            int var19;
    156            int var18;
    157            int var21;
    158            int var20;
    159            short var23;
    160            int var22;
    161            int var25;
    162            int var24;
    163            int var26;
    164
    165            for (var16 = -(stileSizeBase >> 2); var16 <= (stileSizeBase >> 2); ++var16)
    166            {
    167                var17 = (int)((stileSizeBase >> 1) + 0.5D + var31 * (double)var16 * 0.3D);
    168                var18 = (int)((stileSizeBase >> 1) - 0.5D - var30 * (double)var16 * 0.3D * 0.5D);
    169                var19 = var18 * stileSizeBase + var17;
    170                var20 = 100;
    171                var21 = 100;
    172                var22 = 100;
    173                var23 = 255;
    174
    175                if (field_82391_c.anaglyphEnabled)
    176                {
    177                    var24 = (var20 * 30 + var21 * 59 + var22 * 11) / 100;
    178                    var25 = (var20 * 30 + var21 * 70) / 100;
    179                    var26 = (var20 * 30 + var22 * 70) / 100;
    180                    var20 = var24;
    181                    var21 = var25;
    182                    var22 = var26;
    183                }
    184
    185                var9[var19 * 4 + 0] = (byte)var20;
    186                var9[var19 * 4 + 1] = (byte)var21;
    187                var9[var19 * 4 + 2] = (byte)var22;
    188                var9[var19 * 4 + 3] = (byte)var23;
    189            }
    190
    191
    192            for (var16 = -(stileSizeBase>>2); var16 <= stileSizeBase; ++var16)
    193            {
    194                var17 = (int)((stileSizeBase >> 1) + 0.5D + var30 * (double)var16 * 0.3D);
    195                var18 = (int)((stileSizeBase >> 1) - 0.5D + var31 * (double)var16 * 0.3D * 0.5D);
    196                var19 = var18 * stileSizeBase + var17;
    197                var20 = var16 >= 0 ? 255 : 100;
    198                var21 = var16 >= 0 ? 20 : 100;
    199                var22 = var16 >= 0 ? 20 : 100;
    200                var23 = 255;
    201
    202                if (field_82391_c.anaglyphEnabled)
    203                {
    204                    var24 = (var20 * 30 + var21 * 59 + var22 * 11) / 100;
    205                    var25 = (var20 * 30 + var21 * 70) / 100;
    206                    var26 = (var20 * 30 + var22 * 70) / 100;
    207                    var20 = var24;
    208                    var21 = var25;
    209                    var22 = var26;
    210                }
    211
    212                var9[var19 * 4 + 0] = (byte)var20;
    213                var9[var19 * 4 + 1] = (byte)var21;
    214                var9[var19 * 4 + 2] = (byte)var22;
    215                var9[var19 * 4 + 3] = (byte)var23;
    216            }
    217        }
    218    }