Exemple #1
0
        public override void onUpdate()
        {
            base.onUpdate();
            if (field_6149_an > 0)
            {
                double d  = posX + (field_6148_ao - posX) / field_6149_an;
                double d1 = posY + (field_6147_ap - posY) / field_6149_an;
                double d2 = posZ + (field_6146_aq - posZ) / field_6149_an;
                double d4;
                for (d4 = field_6145_ar - rotationYaw; d4 < -180D; d4 += 360D)
                {
                }
                for (; d4 >= 180D; d4 -= 360D)
                {
                }
                rotationYaw   += (float)(d4 / field_6149_an);
                rotationPitch += (float)((field_6144_as - rotationPitch) / field_6149_an);
                field_6149_an--;
                setPosition(d, d1, d2);
                setRotation(rotationYaw, rotationPitch);
                return;
            }
            if (!worldObj.singleplayerWorld)
            {
                ItemStack itemstack = angler.getCurrentEquippedItem();
                if (angler.isDead || !angler.isEntityAlive() || itemstack == null ||
                    itemstack.getItem() != Item.fishingRod || getDistanceSqToEntity(angler) > 1024D)
                {
                    setEntityDead();
                    angler.fishEntity = null;
                    return;
                }
                if (bobber != null)
                {
                    if (bobber.isDead)
                    {
                        bobber = null;
                    }
                    else
                    {
                        posX = bobber.posX;
                        posY = bobber.boundingBox.minY + bobber.height * 0.80000000000000004D;
                        posZ = bobber.posZ;
                        return;
                    }
                }
            }
            if (shake > 0)
            {
                shake--;
            }
            if (inGround)
            {
                int i = worldObj.getBlockId(xTile, yTile, zTile);
                if (i != inTile)
                {
                    inGround      = false;
                    motionX      *= rand.nextFloat() * 0.2F;
                    motionY      *= rand.nextFloat() * 0.2F;
                    motionZ      *= rand.nextFloat() * 0.2F;
                    ticksInGround = 0;
                    ticksInAir    = 0;
                }
                else
                {
                    ticksInGround++;
                    if (ticksInGround == 1200)
                    {
                        setEntityDead();
                    }
                    return;
                }
            }
            else
            {
                ticksInAir++;
            }
            Vec3D vec3d  = Vec3D.createVector(posX, posY, posZ);
            Vec3D vec3d1 = Vec3D.createVector(posX + motionX, posY + motionY, posZ + motionZ);
            MovingObjectPosition movingobjectposition = worldObj.rayTraceBlocks(vec3d, vec3d1);

            vec3d  = Vec3D.createVector(posX, posY, posZ);
            vec3d1 = Vec3D.createVector(posX + motionX, posY + motionY, posZ + motionZ);
            if (movingobjectposition != null)
            {
                vec3d1 = Vec3D.createVector(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord,
                                            movingobjectposition.hitVec.zCoord);
            }
            Entity entity = null;
            List   list   = worldObj.getEntitiesWithinAABBExcludingEntity(this,
                                                                          boundingBox.addCoord(motionX, motionY, motionZ).
                                                                          expand(1.0D, 1.0D, 1.0D));
            double d3 = 0.0D;

            for (int j = 0; j < list.size(); j++)
            {
                var entity1 = (Entity)list.get(j);
                if (!entity1.canBeCollidedWith() || entity1 == angler && ticksInAir < 5)
                {
                    continue;
                }
                float                f2                    = 0.3F;
                AxisAlignedBB        axisalignedbb         = entity1.boundingBox.expand(f2, f2, f2);
                MovingObjectPosition movingobjectposition1 = axisalignedbb.func_706_a(vec3d, vec3d1);
                if (movingobjectposition1 == null)
                {
                    continue;
                }
                double d6 = vec3d.distanceTo(movingobjectposition1.hitVec);
                if (d6 < d3 || d3 == 0.0D)
                {
                    entity = entity1;
                    d3     = d6;
                }
            }

            if (entity != null)
            {
                movingobjectposition = new MovingObjectPosition(entity);
            }
            if (movingobjectposition != null)
            {
                if (movingobjectposition.entityHit != null)
                {
                    if (movingobjectposition.entityHit.attackEntityFrom(angler, 0))
                    {
                        bobber = movingobjectposition.entityHit;
                    }
                }
                else
                {
                    inGround = true;
                }
            }
            if (inGround)
            {
                return;
            }
            moveEntity(motionX, motionY, motionZ);
            float f = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ);

            rotationYaw = (float)((Math.atan2(motionX, motionZ) * 180D) / 3.1415927410125732D);
            for (rotationPitch = (float)((Math.atan2(motionY, f) * 180D) / 3.1415927410125732D);
                 rotationPitch - prevRotationPitch < -180F;
                 prevRotationPitch -= 360F)
            {
            }
            for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F)
            {
            }
            for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F)
            {
            }
            for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F)
            {
            }
            rotationPitch = prevRotationPitch + (rotationPitch - prevRotationPitch) * 0.2F;
            rotationYaw   = prevRotationYaw + (rotationYaw - prevRotationYaw) * 0.2F;
            float f1 = 0.92F;

            if (onGround || isCollidedHorizontally)
            {
                f1 = 0.5F;
            }
            int    k  = 5;
            double d5 = 0.0D;

            for (int l = 0; l < k; l++)
            {
                double d8 = ((boundingBox.minY + ((boundingBox.maxY - boundingBox.minY) * (l + 0)) / k) -
                             0.125D) + 0.125D;
                double d9 = ((boundingBox.minY + ((boundingBox.maxY - boundingBox.minY) * (l + 1)) / k) -
                             0.125D) + 0.125D;
                AxisAlignedBB axisalignedbb1 = AxisAlignedBB.getBoundingBoxFromPool(boundingBox.minX, d8,
                                                                                    boundingBox.minZ, boundingBox.maxX,
                                                                                    d9, boundingBox.maxZ);
                if (worldObj.isAABBInMaterial(axisalignedbb1, Material.water))
                {
                    d5 += 1.0D / k;
                }
            }

            if (d5 > 0.0D)
            {
                if (ticksCatchable > 0)
                {
                    ticksCatchable--;
                }
                else if (rand.nextInt(500) == 0)
                {
                    ticksCatchable = rand.nextInt(30) + 10;
                    motionY       -= 0.20000000298023224D;
                    worldObj.playSoundAtEntity(this, "random.splash", 0.25F,
                                               1.0F + (rand.nextFloat() - rand.nextFloat()) * 0.4F);
                    float f3 = MathHelper.floor_double(boundingBox.minY);
                    for (int i1 = 0; i1 < 1.0F + width * 20F; i1++)
                    {
                        float f4 = (rand.nextFloat() * 2.0F - 1.0F) * width;
                        float f6 = (rand.nextFloat() * 2.0F - 1.0F) * width;
                        worldObj.spawnParticle("bubble", posX + f4, f3 + 1.0F, posZ + f6, motionX,
                                               motionY - (rand.nextFloat() * 0.2F), motionZ);
                    }

                    for (int j1 = 0; j1 < 1.0F + width * 20F; j1++)
                    {
                        float f5 = (rand.nextFloat() * 2.0F - 1.0F) * width;
                        float f7 = (rand.nextFloat() * 2.0F - 1.0F) * width;
                        worldObj.spawnParticle("splash", posX + f5, f3 + 1.0F, posZ + f7, motionX,
                                               motionY, motionZ);
                    }
                }
            }
            if (ticksCatchable > 0)
            {
                motionY -= (rand.nextFloat() * rand.nextFloat() * rand.nextFloat()) * 0.20000000000000001D;
            }
            double d7 = d5 * 2D - 1.0D;

            motionY += 0.039999999105930328D * d7;
            if (d5 > 0.0D)
            {
                f1       = (float)(f1 * 0.90000000000000002D);
                motionY *= 0.80000000000000004D;
            }
            motionX *= f1;
            motionY *= f1;
            motionZ *= f1;
            setPosition(posX, posY, posZ);
        }