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 }