예제 #1
0
        /// <summary>
        /// Called to update the entity's position/logic.
        /// </summary>
        public override void OnUpdate()
        {
            base.OnUpdate();

            if (GetTimeSinceHit() > 0)
            {
                SetTimeSinceHit(GetTimeSinceHit() - 1);
            }

            if (GetDamageTaken() > 0)
            {
                SetDamageTaken(GetDamageTaken() - 1);
            }

            PrevPosX = PosX;
            PrevPosY = PosY;
            PrevPosZ = PosZ;
            int   i = 5;
            float d = 0.0F;

            for (int j = 0; j < i; j++)
            {
                float         d2            = (BoundingBox.MinY + ((BoundingBox.MaxY - BoundingBox.MinY) * (j + 0)) / i) - 0.125F;
                float         d8            = (BoundingBox.MinY + ((BoundingBox.MaxY - BoundingBox.MinY) * (j + 1)) / i) - 0.125F;
                AxisAlignedBB axisalignedbb = AxisAlignedBB.GetBoundingBoxFromPool(BoundingBox.MinX, d2, BoundingBox.MinZ, BoundingBox.MaxX, d8, BoundingBox.MaxZ);

                if (WorldObj.IsAABBInMaterial(axisalignedbb, Material.Water))
                {
                    d += 1.0F / i;
                }
            }

            double d1 = Math.Sqrt(MotionX * MotionX + MotionZ * MotionZ);

            if (d1 > 0.14999999999999999D)
            {
                double d3 = Math.Cos(((double)RotationYaw * Math.PI) / 180D);
                double d9 = Math.Sin(((double)RotationYaw * Math.PI) / 180D);

                for (int i1 = 0; (double)i1 < 1.0D + d1 * 60D; i1++)
                {
                    double d16 = Rand.NextFloat() * 2.0F - 1.0F;
                    double d19 = (double)(Rand.Next(2) * 2 - 1) * 0.69999999999999996D;

                    if (Rand.NextBool())
                    {
                        double d21 = (PosX - d3 * d16 * 0.80000000000000004D) + d9 * d19;
                        double d23 = PosZ - d9 * d16 * 0.80000000000000004D - d3 * d19;
                        WorldObj.SpawnParticle("splash", d21, PosY - 0.125D, d23, MotionX, MotionY, MotionZ);
                    }
                    else
                    {
                        double d22 = PosX + d3 + d9 * d16 * 0.69999999999999996D;
                        double d24 = (PosZ + d9) - d3 * d16 * 0.69999999999999996D;
                        WorldObj.SpawnParticle("splash", d22, PosY - 0.125D, d24, MotionX, MotionY, MotionZ);
                    }
                }
            }

            if (WorldObj.IsRemote)
            {
                if (BoatPosRotationIncrements > 0)
                {
                    float  d4  = PosX + (BoatX - PosX) / BoatPosRotationIncrements;
                    float  d10 = PosY + (BoatY - PosY) / BoatPosRotationIncrements;
                    float  d13 = PosZ + (BoatZ - PosZ) / BoatPosRotationIncrements;
                    double d17;

                    for (d17 = BoatYaw - (double)RotationYaw; d17 < -180D; d17 += 360D)
                    {
                    }

                    for (; d17 >= 180D; d17 -= 360D)
                    {
                    }

                    RotationYaw   += (float)d17 / BoatPosRotationIncrements;
                    RotationPitch += ((float)BoatPitch - RotationPitch) / BoatPosRotationIncrements;
                    BoatPosRotationIncrements--;
                    SetPosition(d4, d10, d13);
                    SetRotation(RotationYaw, RotationPitch);
                }
                else
                {
                    float d5  = PosX + MotionX;
                    float d11 = PosY + MotionY;
                    float d14 = PosZ + MotionZ;
                    SetPosition(d5, d11, d14);

                    if (OnGround)
                    {
                        MotionX *= 0.5F;
                        MotionY *= 0.5F;
                        MotionZ *= 0.5F;
                    }

                    MotionX *= 0.99000000953674316F;
                    MotionY *= 0.94999998807907104F;
                    MotionZ *= 0.99000000953674316F;
                }

                return;
            }

            if (d < 1.0F)
            {
                float d6 = d * 2F - 1.0F;
                MotionY += 0.039999999105930328F * d6;
            }
            else
            {
                if (MotionY < 0.0F)
                {
                    MotionY /= 2F;
                }

                MotionY += 0.0070000002160668373F;
            }

            if (RiddenByEntity != null)
            {
                MotionX += RiddenByEntity.MotionX * 0.20000000000000001F;
                MotionZ += RiddenByEntity.MotionZ * 0.20000000000000001F;
            }

            float d7 = 0.40000000000000002F;

            if (MotionX < -d7)
            {
                MotionX = -d7;
            }

            if (MotionX > d7)
            {
                MotionX = d7;
            }

            if (MotionZ < -d7)
            {
                MotionZ = -d7;
            }

            if (MotionZ > d7)
            {
                MotionZ = d7;
            }

            if (OnGround)
            {
                MotionX *= 0.5F;
                MotionY *= 0.5F;
                MotionZ *= 0.5F;
            }

            MoveEntity(MotionX, MotionY, MotionZ);

            if (IsCollidedHorizontally && d1 > 0.20000000000000001F)
            {
                if (!WorldObj.IsRemote)
                {
                    SetDead();

                    for (int k = 0; k < 3; k++)
                    {
                        DropItemWithOffset(Block.Planks.BlockID, 1, 0.0F);
                    }

                    for (int l = 0; l < 2; l++)
                    {
                        DropItemWithOffset(Item.Stick.ShiftedIndex, 1, 0.0F);
                    }
                }
            }
            else
            {
                MotionX *= 0.99000000953674316F;
                MotionY *= 0.94999998807907104F;
                MotionZ *= 0.99000000953674316F;
            }

            RotationPitch = 0.0F;
            double d12 = RotationYaw;
            double d15 = PrevPosX - PosX;
            double d18 = PrevPosZ - PosZ;

            if (d15 * d15 + d18 * d18 > 0.001D)
            {
                d12 = (float)((Math.Atan2(d18, d15) * 180D) / Math.PI);
            }

            double d20;

            for (d20 = d12 - (double)RotationYaw; d20 >= 180D; d20 -= 360D)
            {
            }

            for (; d20 < -180D; d20 += 360D)
            {
            }

            if (d20 > 20D)
            {
                d20 = 20D;
            }

            if (d20 < -20D)
            {
                d20 = -20D;
            }

            RotationYaw += (float)d20;
            SetRotation(RotationYaw, RotationPitch);
            List <Entity> list = WorldObj.GetEntitiesWithinAABBExcludingEntity(this, BoundingBox.Expand(0.20000000298023224F, 0.0F, 0.20000000298023224F));

            if (list != null && list.Count > 0)
            {
                for (int j1 = 0; j1 < list.Count; j1++)
                {
                    Entity entity = (Entity)list[j1];

                    if (entity != RiddenByEntity && entity.CanBePushed() && (entity is EntityBoat))
                    {
                        entity.ApplyEntityCollision(this);
                    }
                }
            }

            for (int k1 = 0; k1 < 4; k1++)
            {
                int l1 = MathHelper2.Floor_double(PosX + ((double)(k1 % 2) - 0.5D) * 0.80000000000000004D);
                int i2 = MathHelper2.Floor_double(PosY);
                int j2 = MathHelper2.Floor_double(PosZ + ((double)(k1 / 2) - 0.5D) * 0.80000000000000004D);

                if (WorldObj.GetBlockId(l1, i2, j2) == Block.Snow.BlockID)
                {
                    WorldObj.SetBlockWithNotify(l1, i2, j2, 0);
                }
            }

            if (RiddenByEntity != null && RiddenByEntity.IsDead)
            {
                RiddenByEntity = null;
            }
        }
예제 #2
0
        /// <summary>
        /// Called to update the entity's position/logic.
        /// </summary>
        public override void OnUpdate()
        {
            base.OnUpdate();

            if (FishPosRotationIncrements > 0)
            {
                float  d  = PosX + (FishX - PosX) / FishPosRotationIncrements;
                float  d1 = PosY + (FishY - PosY) / FishPosRotationIncrements;
                float  d2 = PosZ + (FishZ - PosZ) / FishPosRotationIncrements;
                double d4;

                for (d4 = FishYaw - RotationYaw; d4 < -180D; d4 += 360D)
                {
                }

                for (; d4 >= 180D; d4 -= 360D)
                {
                }

                RotationYaw   += (float)d4 / FishPosRotationIncrements;
                RotationPitch += (float)(FishPitch - RotationPitch) / FishPosRotationIncrements;
                FishPosRotationIncrements--;
                SetPosition(d, d1, d2);
                SetRotation(RotationYaw, RotationPitch);
                return;
            }

            if (!WorldObj.IsRemote)
            {
                ItemStack itemstack = Angler.GetCurrentEquippedItem();

                if (Angler.IsDead || !Angler.IsEntityAlive() || itemstack == null || itemstack.GetItem() != Item.FishingRod || GetDistanceSqToEntity(Angler) > 1024D)
                {
                    SetDead();
                    Angler.FishEntity = null;
                    return;
                }

                if (Bobber != null)
                {
                    if (Bobber.IsDead)
                    {
                        Bobber = null;
                    }
                    else
                    {
                        PosX = Bobber.PosX;
                        PosY = Bobber.BoundingBox.MinY + Bobber.Height * 0.80000000000000004F;
                        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)
                    {
                        SetDead();
                    }

                    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 <Entity> list   = WorldObj.GetEntitiesWithinAABBExcludingEntity(this, BoundingBox.AddCoord(MotionX, MotionY, MotionZ).Expand(1.0F, 1.0F, 1.0F));
            double        d3     = 0.0F;

            for (int j = 0; j < list.Count; j++)
            {
                Entity entity1 = list[j];

                if (!entity1.CanBeCollidedWith() || entity1 == Angler && TicksInAir < 5)
                {
                    continue;
                }

                float                f2                    = 0.3F;
                AxisAlignedBB        axisalignedbb         = entity1.BoundingBox.Expand(f2, f2, f2);
                MovingObjectPosition movingobjectposition1 = axisalignedbb.CalculateIntercept(vec3d, vec3d1);

                if (movingobjectposition1 == null)
                {
                    continue;
                }

                double d6 = vec3d.DistanceTo(movingobjectposition1.HitVec);

                if (d6 < d3 || d3 == 0.0F)
                {
                    entity = entity1;
                    d3     = d6;
                }
            }

            if (entity != null)
            {
                movingobjectposition = new MovingObjectPosition(entity);
            }

            if (movingobjectposition != null)
            {
                if (movingobjectposition.EntityHit != null)
                {
                    if (movingobjectposition.EntityHit.AttackEntityFrom(DamageSource.CauseThrownDamage(this, Angler), 0))
                    {
                        Bobber = movingobjectposition.EntityHit;
                    }
                }
                else
                {
                    InGround = true;
                }
            }

            if (InGround)
            {
                return;
            }

            MoveEntity(MotionX, MotionY, MotionZ);
            float f = MathHelper2.Sqrt_double(MotionX * MotionX + MotionZ * MotionZ);

            RotationYaw = (float)((Math.Atan2(MotionX, MotionZ) * 180D) / Math.PI);

            for (RotationPitch = (float)((Math.Atan2(MotionY, f) * 180D) / Math.PI); 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;
            float d5 = 0.0F;

            for (int l = 0; l < k; l++)
            {
                float         d8             = ((BoundingBox.MinY + ((BoundingBox.MaxY - BoundingBox.MinY) * (l + 0)) / k) - 0.125F) + 0.125F;
                float         d9             = ((BoundingBox.MinY + ((BoundingBox.MaxY - BoundingBox.MinY) * (l + 1)) / k) - 0.125F) + 0.125F;
                AxisAlignedBB axisalignedbb1 = AxisAlignedBB.GetBoundingBoxFromPool(BoundingBox.MinX, d8, BoundingBox.MinZ, BoundingBox.MaxX, d9, BoundingBox.MaxZ);

                if (WorldObj.IsAABBInMaterial(axisalignedbb1, Material.Water))
                {
                    d5 += 1.0F / k;
                }
            }

            if (d5 > 0.0F)
            {
                if (TicksCatchable > 0)
                {
                    TicksCatchable--;
                }
                else
                {
                    int c = 500;

                    if (WorldObj.CanLightningStrikeAt(MathHelper2.Floor_double(PosX), MathHelper2.Floor_double(PosY) + 1, MathHelper2.Floor_double(PosZ)))
                    {
                        c = 300;
                    }

                    if (Rand.Next(c) == 0)
                    {
                        TicksCatchable = Rand.Next(30) + 10;
                        MotionY       -= 0.20000000298023224F;
                        WorldObj.PlaySoundAtEntity(this, "random.splash", 0.25F, 1.0F + (Rand.NextFloat() - Rand.NextFloat()) * 0.4F);
                        float f3 = MathHelper2.Floor_double(BoundingBox.MinY);

                        for (int i1 = 0; (float)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; (float)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.20000000000000001F;
            }

            float d7 = d5 * 2F - 1.0F;

            MotionY += 0.039999999105930328F * d7;

            if (d5 > 0.0F)
            {
                f1       = (float)((double)f1 * 0.90000000000000002D);
                MotionY *= 0.80000000000000004F;
            }

            MotionX *= f1;
            MotionY *= f1;
            MotionZ *= f1;
            SetPosition(PosX, PosY, PosZ);
        }