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