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 }