示例#1
0
 public override void StartServerSide(ICoreServerAPI api)
 {
     this.api = api;
     rand.SetWorldSeed(api.World.Seed + 56498846451);
     api.Event.InitWorldGenerator(Init, "standard");
     api.Event.MapRegionGeneration(OnMapRegionGen, "standard");
     api.Event.ChunkColumnGeneration(OnChunkColumnGeneration, EnumWorldGenPass.TerrainFeatures, "standard");
 }
示例#2
0
        public override void GeneratePartial(IServerChunk[] chunks, int chunkX, int chunkZ, int chunkdX, int chunkdZ)
        {
            int fromChunkx = chunkX + chunkdX;
            int fromChunkz = chunkZ + chunkdZ;

            int fromBaseX = fromChunkx * chunksize;
            int fromBaseZ = fromChunkz * chunksize;

            subDepositsToPlace.Clear();

            float qfac = 1f;// chunks.Length / 8f;

            for (int i = 0; i < Deposits.Length; i++)
            {
                DepositVariant variant = Deposits[i];

                /*if (variant.Code != "sphalerite" || chunkdX != 0 || chunkdZ != 0)
                 * {
                 *  continue;
                 * }*/

                float quantityFactor = variant.WithOreMap ? variant.GetOreMapFactor(fromChunkx, fromChunkz) : 1;

                float qModified = qfac * variant.TriesPerChunk * quantityFactor * chanceMultiplier;
                int   quantity  = (int)qModified;
                quantity += chunkRand.NextInt(100) < 100 * (qModified - quantity) ? 1 : 0;

                while (quantity-- > 0)
                {
                    tmpPos.Set(fromBaseX + chunkRand.NextInt(chunksize), -99, fromBaseZ + chunkRand.NextInt(chunksize));
                    long crseed = chunkRand.NextInt(10000000);
                    depositRand.SetWorldSeed(crseed);
                    depositRand.InitPositionSeed(fromChunkx, fromChunkz);

                    GenDeposit(chunks, chunkX, chunkZ, tmpPos, variant);
                }
            }

            foreach (var val in subDepositsToPlace)
            {
                depositRand.SetWorldSeed(chunkRand.NextInt(10000000));
                depositRand.InitPositionSeed(fromChunkx, fromChunkz);

                val.Value.GeneratorInst.GenDeposit(blockAccessor, chunks, chunkX, chunkZ, val.Key, ref subDepositsToPlace);
            }
        }
示例#3
0
        public override void GeneratePartial(IServerChunk[] chunks, int chunkX, int chunkZ, int cdx, int cdz)
        {
            int quantityCaves = chunkRand.NextInt(100) < TerraGenConfig.CavesPerChunkColumn * 100 ? 1 : 0;

            while (quantityCaves-- > 0)
            {
                int posX = cdx * chunksize + chunkRand.NextInt(chunksize);
                int posY = chunkRand.NextInt(worldheight - 20) + 8;
                int posZ = cdz * chunksize + chunkRand.NextInt(chunksize);

                float horAngle       = chunkRand.NextFloat() * GameMath.TWOPI;
                float vertAngle      = (chunkRand.NextFloat() - 0.5f) * 0.25f;
                float horizontalSize = chunkRand.NextFloat() * 2 + chunkRand.NextFloat();
                float verticalSize   = 0.75f + chunkRand.NextFloat() * 0.4f;

                if (chunkRand.NextFloat() < 0.04f)
                {
                    horizontalSize = chunkRand.NextFloat() * 2 + chunkRand.NextFloat() + chunkRand.NextFloat();
                    verticalSize   = 0.25f + chunkRand.NextFloat() * 0.2f;
                }
                else
                if (chunkRand.NextFloat() < 0.01f)
                {
                    horizontalSize = 0.75f + chunkRand.NextFloat();
                    verticalSize   = chunkRand.NextFloat() * 2 + chunkRand.NextFloat();
                }

                bool extraBranchy       = (posY < TerraGenConfig.seaLevel / 2) ? chunkRand.NextFloat() < 0.02f : false;
                bool largeNearLavaLayer = chunkRand.NextFloat() < 0.3f;

                float curviness = chunkRand.NextFloat() < 0.01f ? 0.035f : (chunkRand.NextFloat() < 0.03f ? 0.5f : 0.1f);

                int maxIterations = chunkRange * chunksize - chunksize / 2;
                maxIterations = maxIterations - chunkRand.NextInt(maxIterations / 4);

                caveRand.SetWorldSeed(chunkRand.NextInt(10000000));
                caveRand.InitPositionSeed(chunkX + cdx, chunkZ + cdz);
                CarveTunnel(chunks, chunkX, chunkZ, posX, posY, posZ, horAngle, vertAngle, horizontalSize, verticalSize, 0, maxIterations, 0, extraBranchy, curviness, largeNearLavaLayer);
            }
        }
示例#4
0
        public void OnApply(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack, bool isbreak = false)
        {
            if (Quantity == 0 || Radius == 0)
            {
                return;
            }

            float radSq = Radius * Radius;
            float q     = Quantity;

            Block block = blockAccessRev.GetBlock(blockSel.Position);

            if (isbreak)
            {
                block = blockAccessRev.GetBlock(0);
            }

            int quantityBlocks = (int)(GameMath.PI * radSq);

            if (!worldEdit.MayPlace(block, (int)q))
            {
                return;
            }

            if (oldBlockId >= 0)
            {
                worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            }
            lcgRand.SetWorldSeed(rand.Next());
            lcgRand.InitPositionSeed(blockSel.Position.X / blockAccessRev.ChunkSize, blockSel.Position.Z / blockAccessRev.ChunkSize);

            int xRadInt = (int)Math.Ceiling(Radius);
            int yRadInt = (int)Math.Ceiling(Radius);
            int zRadInt = (int)Math.Ceiling(Radius);

            HashSet <BlockPos> viablePositions = new HashSet <BlockPos>();
            BlockPos           dpos, ddpos;
            Block            testblock;
            EnumAirBrushMode mode = Mode;

            for (int dx = -xRadInt; dx <= xRadInt; dx++)
            {
                for (int dy = -yRadInt; dy <= yRadInt; dy++)
                {
                    for (int dz = -zRadInt; dz <= zRadInt; dz++)
                    {
                        if (dx * dx + dy * dy + dz * dz > radSq)
                        {
                            continue;
                        }

                        dpos      = blockSel.Position.AddCopy(dx, dy, dz);
                        testblock = blockAccessRev.GetBlock(dpos);
                        if (testblock.Replaceable >= 6000)
                        {
                            continue;
                        }

                        for (int i = 0; i < BlockFacing.NumberOfFaces; i++)
                        {
                            if (Apply == EnumAirBrushApply.SelectedFace && BlockFacing.ALLFACES[i] != blockSel.Face)
                            {
                                continue;
                            }

                            ddpos = dpos.AddCopy(BlockFacing.ALLFACES[i]);
                            Block dblock = blockAccessRev.GetBlock(ddpos);
                            if (dblock.Replaceable >= 6000 && (dblock.IsLiquid() == block.IsLiquid()))
                            {
                                // We found an air block beside a solid block -> let's remember that air block and keep looking
                                if (mode == EnumAirBrushMode.Add)
                                {
                                    viablePositions.Add(ddpos);
                                }
                                else
                                // We found an air block beside a solid block -> let's remember that solid block for removal and we can stop here
                                {
                                    viablePositions.Add(dpos);
                                }
                            }
                        }
                    }
                }
            }

            List <BlockPos> viablePositionsList = new List <BlockPos>(viablePositions);

            while (q-- > 0)
            {
                if (viablePositionsList.Count == 0)
                {
                    break;
                }

                if (q < 1 && rand.NextDouble() > q)
                {
                    break;
                }

                int index = rand.Next(viablePositionsList.Count);
                dpos = viablePositionsList[index];
                viablePositionsList.RemoveAt(index);

                if (mode == EnumAirBrushMode.Add)
                {
                    block.TryPlaceBlockForWorldGen(blockAccessRev, dpos, BlockFacing.UP, lcgRand);
                }
                else
                {
                    blockAccessRev.SetBlock(block.BlockId, dpos, withItemStack);
                }
            }

            if (oldBlockId >= 0)
            {
                blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetBlockId(blockSel.Position));
            }

            blockAccessRev.Commit();


            return;
        }