コード例 #1
0
        /// <summary>
        /// Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
        /// use this to react to sunlight and start to burn.
        /// </summary>
        public override void OnLivingUpdate()
        {
            if (WorldObj.IsDaytime() && !WorldObj.IsRemote)
            {
                float f = GetBrightness(1.0F);

                if (f > 0.5F && WorldObj.CanBlockSeeTheSky(MathHelper2.Floor_double(PosX), MathHelper2.Floor_double(PosY), MathHelper2.Floor_double(PosZ)) && Rand.NextFloat() * 30F < (f - 0.4F) * 2.0F)
                {
                    SetFire(8);
                }
            }

            base.OnLivingUpdate();
        }
コード例 #2
0
        /// <summary>
        /// Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
        /// use this to react to sunlight and start to burn.
        /// </summary>
        public override void OnLivingUpdate()
        {
            if (IsWet())
            {
                AttackEntityFrom(DamageSource.Drown, 1);
            }

            IsAttacking = EntityToAttack != null;
            MoveSpeed   = EntityToAttack == null ? 0.3F : 6.5F;

            if (!WorldObj.IsRemote)
            {
                if (GetCarried() == 0)
                {
                    if (Rand.Next(20) == 0)
                    {
                        int i  = MathHelper2.Floor_double((PosX - 2D) + Rand.NextDouble() * 4D);
                        int l  = MathHelper2.Floor_double(PosY + Rand.NextDouble() * 3D);
                        int j1 = MathHelper2.Floor_double((PosZ - 2D) + Rand.NextDouble() * 4D);
                        int l1 = WorldObj.GetBlockId(i, l, j1);

                        if (CanCarryBlocks[l1])
                        {
                            SetCarried(WorldObj.GetBlockId(i, l, j1));
                            SetCarryingData(WorldObj.GetBlockMetadata(i, l, j1));
                            WorldObj.SetBlockWithNotify(i, l, j1, 0);
                        }
                    }
                }
                else if (Rand.Next(2000) == 0)
                {
                    int j  = MathHelper2.Floor_double((PosX - 1.0D) + Rand.NextDouble() * 2D);
                    int i1 = MathHelper2.Floor_double(PosY + Rand.NextDouble() * 2D);
                    int k1 = MathHelper2.Floor_double((PosZ - 1.0D) + Rand.NextDouble() * 2D);
                    int i2 = WorldObj.GetBlockId(j, i1, k1);
                    int j2 = WorldObj.GetBlockId(j, i1 - 1, k1);

                    if (i2 == 0 && j2 > 0 && Block.BlocksList[j2].RenderAsNormalBlock())
                    {
                        WorldObj.SetBlockAndMetadataWithNotify(j, i1, k1, GetCarried(), GetCarryingData());
                        SetCarried(0);
                    }
                }
            }

            for (int k = 0; k < 2; k++)
            {
                WorldObj.SpawnParticle("portal", PosX + (Rand.NextDouble() - 0.5D) * (double)Width, (PosY + Rand.NextDouble() * (double)Height) - 0.25D, PosZ + (Rand.NextDouble() - 0.5D) * (double)Width, (Rand.NextDouble() - 0.5D) * 2D, -Rand.NextDouble(), (Rand.NextDouble() - 0.5D) * 2D);
            }

            if (WorldObj.IsDaytime() && !WorldObj.IsRemote)
            {
                float f = GetBrightness(1.0F);

                if (f > 0.5F && WorldObj.CanBlockSeeTheSky(MathHelper2.Floor_double(PosX), MathHelper2.Floor_double(PosY), MathHelper2.Floor_double(PosZ)) && Rand.NextFloat() * 30F < (f - 0.4F) * 2.0F)
                {
                    EntityToAttack = null;
                    TeleportRandomly();
                }
            }

            if (IsWet())
            {
                EntityToAttack = null;
                TeleportRandomly();
            }

            IsJumping = false;

            if (EntityToAttack != null)
            {
                FaceEntity(EntityToAttack, 100F, 100F);
            }

            if (!WorldObj.IsRemote && IsEntityAlive())
            {
                if (EntityToAttack != null)
                {
                    if ((EntityToAttack is EntityPlayer) && ShouldAttackPlayer((EntityPlayer)EntityToAttack))
                    {
                        MoveStrafing = MoveForward = 0.0F;
                        MoveSpeed    = 0.0F;

                        if (EntityToAttack.GetDistanceSqToEntity(this) < 16D)
                        {
                            TeleportRandomly();
                        }

                        TeleportDelay = 0;
                    }
                    else if (EntityToAttack.GetDistanceSqToEntity(this) > 256D && TeleportDelay++ >= 30 && TeleportToEntity(EntityToAttack))
                    {
                        TeleportDelay = 0;
                    }
                }
                else
                {
                    TeleportDelay = 0;
                }
            }

            base.OnLivingUpdate();
        }