    001package net.minecraft.client.renderer.texture;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.client.Minecraft;
    006import net.minecraft.util.ChunkCoordinates;
    007import net.minecraft.world.World;
    008
    009@SideOnly(Side.CLIENT)
    010public class TextureCompass extends TextureStitched
    011{
    012    public static TextureCompass compassTexture;
    013
    014    /** Current compass heading in radians */
    015    public double currentAngle;
    016
    017    /** Speed and direction of compass rotation */
    018    public double angleDelta;
    019
    020    public TextureCompass()
    021    {
    022        super("compass");
    023        compassTexture = this;
    024    }
    025
    026    public void updateAnimation()
    027    {
    028        Minecraft minecraft = Minecraft.getMinecraft();
    029
    030        if (minecraft.theWorld != null && minecraft.thePlayer != null)
    031        {
    032            this.updateCompass(minecraft.theWorld, minecraft.thePlayer.posX, minecraft.thePlayer.posZ, (double)minecraft.thePlayer.rotationYaw, false, false);
    033        }
    034        else
    035        {
    036            this.updateCompass((World)null, 0.0D, 0.0D, 0.0D, true, false);
    037        }
    038    }
    039
    040    /**
    041     * Updates the compass based on the given x,z coords and camera direction
    042     */
    043    public void updateCompass(World par1World, double par2, double par4, double par6, boolean par8, boolean par9)
    044    {
    045        double d3 = 0.0D;
    046
    047        if (par1World != null && !par8)
    048        {
    049            ChunkCoordinates chunkcoordinates = par1World.getSpawnPoint();
    050            double d4 = (double)chunkcoordinates.posX - par2;
    051            double d5 = (double)chunkcoordinates.posZ - par4;
    052            par6 %= 360.0D;
    053            d3 = -((par6 - 90.0D) * Math.PI / 180.0D - Math.atan2(d5, d4));
    054
    055            if (!par1World.provider.isSurfaceWorld())
    056            {
    057                d3 = Math.random() * Math.PI * 2.0D;
    058            }
    059        }
    060
    061        if (par9)
    062        {
    063            this.currentAngle = d3;
    064        }
    065        else
    066        {
    067            double d6;
    068
    069            for (d6 = d3 - this.currentAngle; d6 < -Math.PI; d6 += (Math.PI * 2D))
    070            {
    071                ;
    072            }
    073
    074            while (d6 >= Math.PI)
    075            {
    076                d6 -= (Math.PI * 2D);
    077            }
    078
    079            if (d6 < -1.0D)
    080            {
    081                d6 = -1.0D;
    082            }
    083
    084            if (d6 > 1.0D)
    085            {
    086                d6 = 1.0D;
    087            }
    088
    089            this.angleDelta += d6 * 0.1D;
    090            this.angleDelta *= 0.8D;
    091            this.currentAngle += this.angleDelta;
    092        }
    093
    094        int i;
    095
    096        for (i = (int)((this.currentAngle / (Math.PI * 2D) + 1.0D) * (double)this.textureList.size()) % this.textureList.size(); i < 0; i = (i + this.textureList.size()) % this.textureList.size())
    097        {
    098            ;
    099        }
    100
    101        if (i != this.frameCounter)
    102        {
    103            this.frameCounter = i;
    104            this.textureSheet.copyFrom(this.originX, this.originY, (Texture)this.textureList.get(this.frameCounter), false); //FML: We rotate the textures in init.
    105        }
    106    }
    107}