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"); }
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); } }
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); } }
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; }