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    }