001    package net.minecraft.src;
002    
003    public class EntityLookHelper
004    {
005        private EntityLiving entity;
006    
007        /**
008         * The amount of change that is made each update for an entity facing a direction.
009         */
010        private float deltaLookYaw;
011    
012        /**
013         * The amount of change that is made each update for an entity facing a direction.
014         */
015        private float deltaLookPitch;
016    
017        /** Whether or not the entity is trying to look at something. */
018        private boolean isLooking = false;
019        private double posX;
020        private double posY;
021        private double posZ;
022    
023        public EntityLookHelper(EntityLiving par1EntityLiving)
024        {
025            this.entity = par1EntityLiving;
026        }
027    
028        /**
029         * Sets position to look at using entity
030         */
031        public void setLookPositionWithEntity(Entity par1Entity, float par2, float par3)
032        {
033            this.posX = par1Entity.posX;
034    
035            if (par1Entity instanceof EntityLiving)
036            {
037                this.posY = par1Entity.posY + (double)par1Entity.getEyeHeight();
038            }
039            else
040            {
041                this.posY = (par1Entity.boundingBox.minY + par1Entity.boundingBox.maxY) / 2.0D;
042            }
043    
044            this.posZ = par1Entity.posZ;
045            this.deltaLookYaw = par2;
046            this.deltaLookPitch = par3;
047            this.isLooking = true;
048        }
049    
050        /**
051         * Sets position to look at
052         */
053        public void setLookPosition(double par1, double par3, double par5, float par7, float par8)
054        {
055            this.posX = par1;
056            this.posY = par3;
057            this.posZ = par5;
058            this.deltaLookYaw = par7;
059            this.deltaLookPitch = par8;
060            this.isLooking = true;
061        }
062    
063        /**
064         * Updates look
065         */
066        public void onUpdateLook()
067        {
068            this.entity.rotationPitch = 0.0F;
069    
070            if (this.isLooking)
071            {
072                this.isLooking = false;
073                double var1 = this.posX - this.entity.posX;
074                double var3 = this.posY - (this.entity.posY + (double)this.entity.getEyeHeight());
075                double var5 = this.posZ - this.entity.posZ;
076                double var7 = (double)MathHelper.sqrt_double(var1 * var1 + var5 * var5);
077                float var9 = (float)(Math.atan2(var5, var1) * 180.0D / Math.PI) - 90.0F;
078                float var10 = (float)(-(Math.atan2(var3, var7) * 180.0D / Math.PI));
079                this.entity.rotationPitch = this.updateRotation(this.entity.rotationPitch, var10, this.deltaLookPitch);
080                this.entity.rotationYawHead = this.updateRotation(this.entity.rotationYawHead, var9, this.deltaLookYaw);
081            }
082            else
083            {
084                this.entity.rotationYawHead = this.updateRotation(this.entity.rotationYawHead, this.entity.renderYawOffset, 10.0F);
085            }
086    
087            float var11 = MathHelper.wrapAngleTo180_float(this.entity.rotationYawHead - this.entity.renderYawOffset);
088    
089            if (!this.entity.getNavigator().noPath())
090            {
091                if (var11 < -75.0F)
092                {
093                    this.entity.rotationYawHead = this.entity.renderYawOffset - 75.0F;
094                }
095    
096                if (var11 > 75.0F)
097                {
098                    this.entity.rotationYawHead = this.entity.renderYawOffset + 75.0F;
099                }
100            }
101        }
102    
103        private float updateRotation(float par1, float par2, float par3)
104        {
105            float var4 = MathHelper.wrapAngleTo180_float(par2 - par1);
106    
107            if (var4 > par3)
108            {
109                var4 = par3;
110            }
111    
112            if (var4 < -par3)
113            {
114                var4 = -par3;
115            }
116    
117            return par1 + var4;
118        }
119    }