コード例 #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()
        {
            base.OnLivingUpdate();

            if (IsWet())
            {
                AttackEntityFrom(DamageSource.Drown, 1);
            }

            int i = MathHelper2.Floor_double(PosX);
            int k = MathHelper2.Floor_double(PosZ);

            if (WorldObj.GetBiomeGenForCoords(i, k).GetFloatTemperature() > 1.0F)
            {
                AttackEntityFrom(DamageSource.OnFire, 1);
            }

            for (int j = 0; j < 4; j++)
            {
                int l  = MathHelper2.Floor_double(PosX + (double)((float)((j % 2) * 2 - 1) * 0.25F));
                int i1 = MathHelper2.Floor_double(PosY);
                int j1 = MathHelper2.Floor_double(PosZ + (double)((float)(((j / 2) % 2) * 2 - 1) * 0.25F));

                if (WorldObj.GetBlockId(l, i1, j1) == 0 && WorldObj.GetBiomeGenForCoords(l, j1).GetFloatTemperature() < 0.8F && Block.Snow.CanPlaceBlockAt(WorldObj, l, i1, j1))
                {
                    WorldObj.SetBlockWithNotify(l, i1, j1, Block.Snow.BlockID);
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Generates a node in the current cave system recursion tree.
        /// </summary>
        protected virtual void GenerateCaveNode(long par1, int par3, int par4, byte[] par5ArrayOfByte, double par6, double par8, double par10, float par12, float par13, float par14, int par15, int par16, double par17)
        {
            double d      = par3 * 16 + 8;
            double d1     = par4 * 16 + 8;
            float  f      = 0.0F;
            float  f1     = 0.0F;
            Random random = new Random((int)par1);

            if (par16 <= 0)
            {
                int i = Range * 16 - 16;
                par16 = i - random.Next(i / 4);
            }

            bool flag = false;

            if (par15 == -1)
            {
                par15 = par16 / 2;
                flag  = true;
            }

            int  j     = random.Next(par16 / 2) + par16 / 4;
            bool flag1 = random.Next(6) == 0;

            for (; par15 < par16; par15++)
            {
                double d2 = 1.5D + (double)(MathHelper2.Sin(((float)par15 * (float)Math.PI) / (float)par16) * par12 * 1.0F);
                double d3 = d2 * par17;
                float  f2 = MathHelper2.Cos(par14);
                float  f3 = MathHelper2.Sin(par14);
                par6  += MathHelper2.Cos(par13) * f2;
                par8  += f3;
                par10 += MathHelper2.Sin(par13) * f2;

                if (flag1)
                {
                    par14 *= 0.92F;
                }
                else
                {
                    par14 *= 0.7F;
                }

                par14 += f1 * 0.1F;
                par13 += f * 0.1F;
                f1    *= 0.9F;
                f     *= 0.75F;
                f1    += (random.NextFloat() - random.NextFloat()) * random.NextFloat() * 2.0F;
                f     += (random.NextFloat() - random.NextFloat()) * random.NextFloat() * 4F;

                if (!flag && par15 == j && par12 > 1.0F && par16 > 0)
                {
                    GenerateCaveNode(random.Next(), par3, par4, par5ArrayOfByte, par6, par8, par10, random.NextFloat() * 0.5F + 0.5F, par13 - ((float)Math.PI / 2F), par14 / 3F, par15, par16, 1.0D);
                    GenerateCaveNode(random.Next(), par3, par4, par5ArrayOfByte, par6, par8, par10, random.NextFloat() * 0.5F + 0.5F, par13 + ((float)Math.PI / 2F), par14 / 3F, par15, par16, 1.0D);
                    return;
                }

                if (!flag && random.Next(4) == 0)
                {
                    continue;
                }

                double d4 = par6 - d;
                double d5 = par10 - d1;
                double d6 = par16 - par15;
                double d7 = par12 + 2.0F + 16F;

                if ((d4 * d4 + d5 * d5) - d6 * d6 > d7 * d7)
                {
                    return;
                }

                if (par6 < d - 16D - d2 * 2D || par10 < d1 - 16D - d2 * 2D || par6 > d + 16D + d2 * 2D || par10 > d1 + 16D + d2 * 2D)
                {
                    continue;
                }

                d4 = MathHelper2.Floor_double(par6 - d2) - par3 * 16 - 1;
                int k = (MathHelper2.Floor_double(par6 + d2) - par3 * 16) + 1;
                d5 = MathHelper2.Floor_double(par8 - d3) - 1;
                int l = MathHelper2.Floor_double(par8 + d3) + 1;
                d6 = MathHelper2.Floor_double(par10 - d2) - par4 * 16 - 1;
                int i1 = (MathHelper2.Floor_double(par10 + d2) - par4 * 16) + 1;

                if (d4 < 0)
                {
                    d4 = 0;
                }

                if (k > 16)
                {
                    k = 16;
                }

                if (d5 < 1)
                {
                    d5 = 1;
                }

                if (l > 120)
                {
                    l = 120;
                }

                if (d6 < 0)
                {
                    d6 = 0;
                }

                if (i1 > 16)
                {
                    i1 = 16;
                }

                bool flag2 = false;

                for (int j1 = (int)d4; !flag2 && j1 < k; j1++)
                {
                    for (int l1 = (int)d6; !flag2 && l1 < i1; l1++)
                    {
                        for (int i2 = l + 1; !flag2 && i2 >= d5 - 1; i2--)
                        {
                            int j2 = (j1 * 16 + l1) * 128 + i2;

                            if (i2 < 0 || i2 >= 128)
                            {
                                continue;
                            }

                            if (par5ArrayOfByte[j2] == Block.WaterMoving.BlockID || par5ArrayOfByte[j2] == Block.WaterStill.BlockID)
                            {
                                flag2 = true;
                            }

                            if (i2 != d5 - 1 && j1 != d4 && j1 != k - 1 && l1 != d6 && l1 != i1 - 1)
                            {
                                i2 = (int)d5;
                            }
                        }
                    }
                }

                if (flag2)
                {
                    continue;
                }


                for (int k1 = (int)d4; k1 < k; k1++)
                {
                    double d8 = (((double)(k1 + par3 * 16) + 0.5D) - par6) / d2;

                    label0 : for (int k2 = (int)d6; k2 < i1; k2++)
                    {
                        double d9    = (((double)(k2 + par4 * 16) + 0.5D) - par10) / d2;
                        int    l2    = (k1 * 16 + k2) * 128 + l;
                        bool   flag3 = false;

                        if (d8 * d8 + d9 * d9 >= 1.0D)
                        {
                            continue;
                        }

                        int i3 = l - 1;

                        do
                        {
                            if (i3 < d5)
                            {
                                goto label0;
                            }

                            double d10 = (((double)i3 + 0.5D) - par8) / d3;

                            if (d10 > -0.69999999999999996D && d8 * d8 + d10 * d10 + d9 * d9 < 1.0D)
                            {
                                byte byte0 = par5ArrayOfByte[l2];

                                if (byte0 == Block.Grass.BlockID)
                                {
                                    flag3 = true;
                                }

                                if (byte0 == Block.Stone.BlockID || byte0 == Block.Dirt.BlockID || byte0 == Block.Grass.BlockID)
                                {
                                    if (i3 < 10)
                                    {
                                        par5ArrayOfByte[l2] = (byte)Block.LavaMoving.BlockID;
                                    }
                                    else
                                    {
                                        par5ArrayOfByte[l2] = 0;

                                        if (flag3 && par5ArrayOfByte[l2 - 1] == Block.Dirt.BlockID)
                                        {
                                            par5ArrayOfByte[l2 - 1] = WorldObj.GetBiomeGenForCoords(k1 + par3 * 16, k2 + par4 * 16).TopBlock;
                                        }
                                    }
                                }
                            }

                            l2--;
                            i3--;
                        }while (true);
                    }
                }

                if (flag)
                {
                    break;
                }
            }
        }