private bool CoverIce(IChunk chunk, IBiomeRepository biomes, Coordinates3D location) { const int maxDistance = 4; var adjacent = new[] { location + new Coordinates3D(-maxDistance, 0, 0), location + new Coordinates3D(maxDistance, 0, 0), location + new Coordinates3D(0, 0, maxDistance), location + new Coordinates3D(0, 0, -maxDistance) }; for (var i = 0; i < adjacent.Length; i++) { var check = adjacent[i]; if (check.X < 0 || check.X >= Chunk.Width || check.Z < 0 || check.Z >= Chunk.Depth || check.Y < 0 || check.Y >= Chunk.Height) { return(false); } var biome = biomes.GetBiome(chunk.Biomes[check.X * Chunk.Width + check.Z]); if (chunk.GetBlockID(check).Equals(biome.SurfaceBlock) || chunk.GetBlockID(check).Equals(biome.FillerBlock)) { return(true); } } return(false); }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(world.Seed); var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 2; for (var x = 0; x < 16; x++) { for (var z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (noise.Value2D(blockX, blockZ) > 0) { var blockLocation = new Coordinates3D(x, height, z); var plantPosition = blockLocation + Coordinates3D.Up; if (chunk.GetBlockID(blockLocation) == biome.SurfaceBlock && plantPosition.Y < Chunk.Height) { var chance = chanceNoise.Value2D(blockX, blockZ); if (chance < 1) { var bushNoise = chanceNoise.Value2D(blockX * 0.7, blockZ * 0.7); var grassNoise = chanceNoise.Value2D(blockX * 0.3, blockZ * 0.3); if (biome.Plants.Contains(PlantSpecies.Deadbush) && bushNoise > 1 && chunk.GetBlockID(blockLocation) == SandBlock.BlockId) { GenerateDeadBush(chunk, plantPosition); continue; } if (biome.Plants.Contains(PlantSpecies.TallGrass) && grassNoise > 0.3 && grassNoise < 0.95) { var meta = grassNoise > 0.3 && grassNoise < 0.45 && biome.Plants.Contains(PlantSpecies.Fern) ? (byte)0x2 : (byte)0x1; GenerateTallGrass(chunk, plantPosition, meta); } } else { var flowerTypeNoise = chanceNoise.Value2D(blockX * 1.2, blockZ * 1.2); if (biome.Plants.Contains(PlantSpecies.Rose) && flowerTypeNoise > 0.8 && flowerTypeNoise < 1.5) { GenerateRose(chunk, plantPosition); } else if (biome.Plants.Contains(PlantSpecies.Dandelion) && flowerTypeNoise <= 0.8) { GenerateDandelion(chunk, plantPosition); } } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 2; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (noise.Value2D(blockX, blockZ) > 0) { var blockLocation = new Coordinates3D(x, height, z); var plantPosition = blockLocation + Coordinates3D.Up; if (chunk.GetBlockID(blockLocation) == biome.SurfaceBlock && plantPosition.Y < Chunk.Height) { var chance = chanceNoise.Value2D(blockX, blockZ); if (chance < 1) { var bushNoise = chanceNoise.Value2D(blockX * 0.7, blockZ * 0.7); var grassNoise = chanceNoise.Value2D(blockX * 0.3, blockZ * 0.3); if (biome.Plants.Contains(PlantSpecies.Deadbush) && bushNoise > 1 && chunk.GetBlockID(blockLocation) == SandBlock.BlockID) { GenerateDeadBush(chunk, plantPosition); continue; } if (biome.Plants.Contains(PlantSpecies.TallGrass) && grassNoise > 0.3 && grassNoise < 0.95) { byte meta = (grassNoise > 0.3 && grassNoise < 0.45 && biome.Plants.Contains(PlantSpecies.Fern)) ? (byte)0x2 : (byte)0x1; GenerateTallGrass(chunk, plantPosition, meta); continue; } } else { var flowerTypeNoise = chanceNoise.Value2D(blockX * 1.2, blockZ * 1.2); if (biome.Plants.Contains(PlantSpecies.Rose) && flowerTypeNoise > 0.8 && flowerTypeNoise < 1.5) { GenerateRose(chunk, plantPosition); } else if (biome.Plants.Contains(PlantSpecies.Dandelion) && flowerTypeNoise <= 0.8) { GenerateDandelion(chunk, plantPosition); } } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { for (var x = 0; x < Chunk.Width; x++) { for (var z = 0; z < Chunk.Depth; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var height = chunk.HeightMap[x * Chunk.Width + z]; for (var y = height; y <= WaterLevel; y++) { var blockLocation = new Coordinates3D(x, y, z); int blockId = chunk.GetBlockID(blockLocation); if (blockId.Equals(AirBlock.BlockId)) { chunk.SetBlockID(blockLocation, biome.WaterBlock); var below = blockLocation + Coordinates3D.Down; if (!chunk.GetBlockID(below).Equals(AirBlock.BlockId) && !chunk.GetBlockID(below).Equals(biome.WaterBlock)) { if (!biome.WaterBlock.Equals(LavaBlock.BlockId) && !biome.WaterBlock.Equals(StationaryLavaBlock.BlockId)) { var random = new Random(world.Seed); if (random.Next(100) < 40) { chunk.SetBlockID(below, ClayBlock.BlockId); } else { chunk.SetBlockID(below, SandBlock.BlockId); } } } } } for (var y = 4; y < height / 8; y++) { var blockLocation = new Coordinates3D(x, y, z); int blockId = chunk.GetBlockID(blockLocation); if (blockId.Equals(AirBlock.BlockId)) { chunk.SetBlockID(blockLocation, LavaBlock.BlockId); } } } } }
protected static void GenerateSphere(IChunk chunk, Coordinates3D location, int radius, byte block, byte meta = 0x0) { for (var i = -radius; i <= radius; i = i + 1) { for (var j = -radius; j <= radius; j = j + 1) { for (var k = -radius; k <= radius; k = k + 1) { var max = (int)Math.Sqrt(i * i + j * j + k * k); if (max <= radius) { var x = location.X + i; var y = location.Y + k; var z = location.Z + j; if (x < 0 || x >= Chunk.Width || z < 0 || z >= Chunk.Depth || y < 0 || y >= Chunk.Height) { continue; } var currentBlock = new Coordinates3D(x, y, z); if (chunk.GetBlockID(currentBlock).Equals(0)) { chunk.SetBlockID(currentBlock, block); chunk.SetMetadata(currentBlock, meta); } } } } } }
void ScheduleUpdatesForChunk(IWorld world, IChunk chunk) { int _x = chunk.Coordinates.X * Chunk.Width; int _z = chunk.Coordinates.Z * Chunk.Depth; Coordinates3D coords, _coords; for (byte x = 0; x < Chunk.Width; x++) { for (byte z = 0; z < Chunk.Depth; z++) { for (int y = 0; y < chunk.GetHeight(x, z); y++) { _coords.X = x; _coords.Y = y; _coords.Z = z; var id = chunk.GetBlockID(_coords); if (id == 0) { continue; } coords.X = _x + x; coords.Y = y; coords.Z = _z + z; var provider = BlockRepository.GetBlockProvider(id); provider.BlockLoadedFromChunk(coords, this, world); } } } }
private void GenerateHeightMap(IChunk chunk) { Coordinates3D coords; var map = new byte[Chunk.Width, Chunk.Depth]; for (byte x = 0; x < Chunk.Width; x++) { for (byte z = 0; z < Chunk.Depth; z++) { for (byte y = (byte)(chunk.GetHeight(x, z) + 2); y > 0; y--) { if (y >= Chunk.Height) { continue; } coords.X = x; coords.Y = y - 1; coords.Z = z; var id = chunk.GetBlockID(coords); if (id == 0) { continue; } var provider = BlockRepository.GetBlockProvider(id); if (provider.LightOpacity != 0) { map[x, z] = y; break; } } } } HeightMaps[chunk.Coordinates] = map; }
private void GenerateHeightMap(IChunk chunk) { Coordinates3D coords; var map = new byte[Chunk.Width, Chunk.Depth]; for (byte x = 0; x < Chunk.Width; x++) { for (byte z = 0; z < Chunk.Depth; z++) { for (byte y = (byte)(chunk.GetHeight(x, z) + 2); y > 0; y--) { if (y >= Chunk.Height) continue; coords.X = x; coords.Y = y - 1; coords.Z = z; var id = chunk.GetBlockID(coords); if (id == 0) continue; var provider = BlockRepository.GetBlockProvider(id); if (provider.LightOpacity != 0) { map[x, z] = y; break; } } } } HeightMaps[chunk.Coordinates] = map; }
protected static void GenerateSphere(IChunk chunk, Coordinates3D location, int radius, byte block, byte meta = 0x0) { for (int i = -radius; i <= radius; i = (i + 1)) { for (int j = -radius; j <= radius; j = (j + 1)) { for (int k = -radius; k <= radius; k = (k + 1)) { int max = (int)Math.Sqrt((i * i) + (j * j) + (k * k)); if (max <= radius) { int x = location.X + i; int y = location.Y + k; int z = location.Z + j; if (x < 0 || x >= Chunk.Width || z < 0 || z >= Chunk.Depth || y < 0 || y >= Chunk.Height) { continue; } var currentBlock = new Coordinates3D(x, y, z); if (chunk.GetBlockID(currentBlock).Equals(0)) { chunk.SetBlockID(currentBlock, block); chunk.SetMetadata(currentBlock, meta); } } } } } }
internal void LoadChunk(IChunk chunk) { QueuePacket(new ChunkPreamblePacket(chunk.Coordinates.X, chunk.Coordinates.Z)); QueuePacket(CreatePacket(chunk)); Server.Scheduler.ScheduleEvent("client.finalize-chunks", this, TimeSpan.Zero, server => { return; LoadedChunks.Add(chunk.Coordinates); foreach (var kvp in chunk.TileEntities) { var coords = kvp.Key; var descriptor = new BlockDescriptor { Coordinates = coords + new Coordinates3D(chunk.X, 0, chunk.Z), Metadata = chunk.GetMetadata(coords), ID = chunk.GetBlockID(coords), BlockLight = chunk.GetBlockLight(coords), SkyLight = chunk.GetSkyLight(coords) }; var provider = Server.BlockRepository.GetBlockProvider(descriptor.ID); provider.TileEntityLoadedForClient(descriptor, World, kvp.Value, this); } }); }
protected void GenerateVanillaCircle(IChunk chunk, Coordinates3D location, int radius, byte block, byte meta = 0x0, double corner = 0) { for (int i = -radius; i <= radius; i = (i + 1)) { for (int j = -radius; j <= radius; j = (j + 1)) { int max = (int)Math.Sqrt((i * i) + (j * j)); if (max <= radius) { if (i.Equals(-radius) && j.Equals(-radius) || i.Equals(-radius) && j.Equals(radius) || i.Equals(radius) && j.Equals(-radius) || i.Equals(radius) && j.Equals(radius)) { if (corner + radius * 0.2 < 0.4 || corner + radius * 0.2 > 0.7 || corner.Equals(0)) { continue; } } int x = location.X + i; int z = location.Z + j; var currentBlock = new Coordinates3D(x, location.Y, z); if (chunk.GetBlockID(currentBlock).Equals(0)) { chunk.SetBlockID(currentBlock, block); chunk.SetMetadata(currentBlock, meta); } } } } }
public static bool NeighboursBlock(IChunk chunk, Coordinates3D location, byte block, byte meta = 0x0) { var surrounding = new[] { location + Coordinates3D.Left, location + Coordinates3D.Right, location + Coordinates3D.Forwards, location + Coordinates3D.Backwards, }; for (int i = 0; i < surrounding.Length; i++) { var toCheck = surrounding[i]; if (toCheck.X < 0 || toCheck.X >= Chunk.Width || toCheck.Z < 0 || toCheck.Z >= Chunk.Depth || toCheck.Y < 0 || toCheck.Y >= Chunk.Height) { return(false); } if (chunk.GetBlockID(toCheck).Equals(block)) { if (meta != 0x0 && chunk.GetMetadata(toCheck) != meta) { return(false); } return(true); } } return(false); }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 2; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (biome.Plants.Contains(PlantSpecies.Cactus) && chanceNoise.Value2D(blockX, blockZ) > 1.7) { var blockLocation = new Coordinates3D(x, height, z); var cactiPosition = blockLocation + Coordinates3D.Up; if (chunk.GetBlockID(blockLocation).Equals(SandBlock.BlockID)) { var HeightChance = chanceNoise.Value2D(blockX, blockZ); var CactusHeight = (HeightChance < 1.4) ? 2 : 3; Decoration.GenerateColumn(chunk, cactiPosition, CactusHeight, CactusBlock.BlockID); } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { for (int x = 0; x < Chunk.Width; x++) { for (int z = 0; z < Chunk.Depth; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var height = chunk.HeightMap[x * Chunk.Width + z]; for (int y = height; y <= WaterLevel; y++) { var blockLocation = new Coordinates3D(x, y, z); int blockId = chunk.GetBlockID(blockLocation); if (blockId.Equals(AirBlock.BlockID)) { chunk.SetBlockID(blockLocation, biome.WaterBlock); var below = blockLocation + Coordinates3D.Down; if (!chunk.GetBlockID(below).Equals(AirBlock.BlockID) && !chunk.GetBlockID(below).Equals(biome.WaterBlock)) { if (!biome.WaterBlock.Equals(LavaBlock.BlockID) && !biome.WaterBlock.Equals(StationaryLavaBlock.BlockID)) { var random = new Random(world.Seed); if (random.Next(100) < 40) { chunk.SetBlockID(below, ClayBlock.BlockID); } else { chunk.SetBlockID(below, SandBlock.BlockID); } } } } } for (int y = 4; y < height / 8; y++) { var blockLocation = new Coordinates3D(x, y, z); int blockId = chunk.GetBlockID(blockLocation); if (blockId.Equals(AirBlock.BlockID)) { chunk.SetBlockID(blockLocation, LavaBlock.BlockID); } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); if (biome.Temperature < 0.15) { var height = chunk.HeightMap[x * Chunk.Width + z]; for (int y = height; y < Chunk.Height; y++) { var location = new Coordinates3D(x, y, z); if (chunk.GetBlockID(location).Equals(StationaryWaterBlock.BlockID) || chunk.GetBlockID(location).Equals(WaterBlock.BlockID)) { chunk.SetBlockID(location, IceBlock.BlockID); } else { var below = chunk.GetBlockID(location); byte[] whitelist = { DirtBlock.BlockID, GrassBlock.BlockID, IceBlock.BlockID, LeavesBlock.BlockID }; if (y == height && whitelist.Any(w => w == below)) { if (chunk.GetBlockID(location).Equals(IceBlock.BlockID) && CoverIce(chunk, biomes, location)) { chunk.SetBlockID((location + Coordinates3D.Up), SnowfallBlock.BlockID); } else if (!chunk.GetBlockID(location).Equals(SnowfallBlock.BlockID) && !chunk.GetBlockID(location).Equals(AirBlock.BlockID)) { chunk.SetBlockID((location + Coordinates3D.Up), SnowfallBlock.BlockID); } } } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(world.Seed); var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 1; for (var x = 0; x < 16; x++) { for (var z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var height = chunk.HeightMap[x * Chunk.Width + z]; var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); if (biome.Plants.Contains(PlantSpecies.SugarCane)) { if (noise.Value2D(blockX, blockZ) > 0.65) { var blockLocation = new Coordinates3D(x, height, z); var sugarCaneLocation = blockLocation + Coordinates3D.Up; var neighborsWater = Decoration.NeighboursBlock(chunk, blockLocation, WaterBlock.BlockId) || Decoration.NeighboursBlock(chunk, blockLocation, StationaryWaterBlock.BlockId); if (chunk.GetBlockID(blockLocation).Equals(GrassBlock.BlockId) && neighborsWater || chunk.GetBlockID(blockLocation).Equals(SandBlock.BlockId) && neighborsWater) { var random = new Random(world.Seed); var heightChance = random.NextDouble(); var caneHeight = 3; if (heightChance < 0.05) { caneHeight = 4; } else if (heightChance > 0.1 && height < 0.25) { caneHeight = 2; } Decoration.GenerateColumn(chunk, sugarCaneLocation, caneHeight, SugarcaneBlock.BlockId); } } } } } }
bool CoverIce(IChunk chunk, IBiomeRepository biomes, Coordinates3D location) { const int maxDistance = 4; var adjacent = new[] { location + new Coordinates3D(-maxDistance, 0, 0), location + new Coordinates3D(maxDistance, 0, 0), location + new Coordinates3D(0, 0, maxDistance), location + new Coordinates3D(0, 0, -maxDistance), }; for (int i = 0; i < adjacent.Length; i++) { var check = adjacent[i]; if (check.X < 0 || check.X >= Chunk.Width || check.Z < 0 || check.Z >= Chunk.Depth || check.Y < 0 || check.Y >= Chunk.Height) return false; var biome = biomes.GetBiome(chunk.Biomes[check.X * Chunk.Width + check.Z]); if (chunk.GetBlockID(check).Equals(biome.SurfaceBlock) || chunk.GetBlockID(check).Equals(biome.FillerBlock)) return true; } return false; }
private BlockDescriptor GetBlockDataFromChunk(Coordinates3D adjustedCoordinates, IChunk chunk, Coordinates3D coordinates) { return(new BlockDescriptor { ID = chunk.GetBlockID(adjustedCoordinates), Metadata = chunk.GetMetadata(adjustedCoordinates), BlockLight = chunk.GetBlockLight(adjustedCoordinates), SkyLight = chunk.GetSkyLight(adjustedCoordinates), Coordinates = coordinates }); }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 1; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var height = chunk.HeightMap[x * Chunk.Width + z]; var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); if (biome.Plants.Contains(PlantSpecies.SugarCane)) { if (noise.Value2D(blockX, blockZ) > 0.65) { var blockLocation = new Coordinates3D(x, height, z); var sugarCaneLocation = blockLocation + Coordinates3D.Up; var neighborsWater = Decoration.NeighboursBlock(chunk, blockLocation, WaterBlock.BlockID) || Decoration.NeighboursBlock(chunk, blockLocation, StationaryWaterBlock.BlockID); if (chunk.GetBlockID(blockLocation).Equals(GrassBlock.BlockID) && neighborsWater || chunk.GetBlockID(blockLocation).Equals(SandBlock.BlockID) && neighborsWater) { var random = new Random(world.Seed); double heightChance = random.NextDouble(); int caneHeight = 3; if (heightChance < 0.05) caneHeight = 4; else if (heightChance > 0.1 && height < 0.25) caneHeight = 2; Decoration.GenerateColumn(chunk, sugarCaneLocation, caneHeight, SugarcaneBlock.BlockID); } } } } } }
public static bool NeighboursBlock(IChunk chunk, Coordinates3D location, byte block, byte meta = 0x0) { var surrounding = new[] { location + Coordinates3D.Left, location + Coordinates3D.Right, location + Coordinates3D.Forwards, location + Coordinates3D.Backwards, }; for (int i = 0; i < surrounding.Length; i++) { var toCheck = surrounding[i]; if (toCheck.X < 0 || toCheck.X >= Chunk.Width || toCheck.Z < 0 || toCheck.Z >= Chunk.Depth || toCheck.Y < 0 || toCheck.Y >= Chunk.Height) return false; if (chunk.GetBlockID(toCheck).Equals(block)) { if (meta != 0x0 && chunk.GetMetadata(toCheck) != meta) return false; return true; } } return false; }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); if (biome.Temperature < 0.15) { var height = chunk.HeightMap[x * Chunk.Width + z]; for (int y = height; y < Chunk.Height; y++) { var location = new Coordinates3D(x, y, z); if (chunk.GetBlockID(location).Equals(StationaryWaterBlock.BlockID) || chunk.GetBlockID(location).Equals(WaterBlock.BlockID)) chunk.SetBlockID(location, IceBlock.BlockID); else { var below = chunk.GetBlockID(location); byte[] whitelist = { DirtBlock.BlockID, GrassBlock.BlockID, IceBlock.BlockID, LeavesBlock.BlockID }; if (y == height && whitelist.Any(w => w == below)) { if (chunk.GetBlockID(location).Equals(IceBlock.BlockID) && CoverIce(chunk, biomes, location)) chunk.SetBlockID((location + Coordinates3D.Up), SnowfallBlock.BlockID); else if (!chunk.GetBlockID(location).Equals(SnowfallBlock.BlockID) && !chunk.GetBlockID(location).Equals(AirBlock.BlockID)) chunk.SetBlockID((location + Coordinates3D.Up), SnowfallBlock.BlockID); } } } } } } }
protected static void GenerateSphere(IChunk chunk, Coordinates3D location, int radius, byte block, byte meta = 0x0) { for (int i = -radius; i <= radius; i = (i + 1)) { for (int j = -radius; j <= radius; j = (j + 1)) { for (int k = -radius; k <= radius; k = (k + 1)) { int max = (int)Math.Sqrt((i * i) + (j * j) + (k * k)); if (max <= radius) { int x = location.X + i; int y = location.Y + k; int z = location.Z + j; if (x < 0 || x >= Chunk.Width || z < 0 || z >= Chunk.Depth || y < 0 || y >= Chunk.Height) continue; var currentBlock = new Coordinates3D(x, y, z); if (chunk.GetBlockID(currentBlock).Equals(0)) { chunk.SetBlockID(currentBlock, block); chunk.SetMetadata(currentBlock, meta); } } } } } }
public byte GetBlockId(Coordinates3D coordinates) { return(Chunk.GetBlockID(coordinates)); }
private void GenerateHeightMap(IChunk chunk) { var map = new byte[Chunk.Width, Chunk.Depth]; for (int x = 0; x < Chunk.Width; x++) { for (int z = 0; z < Chunk.Depth; z++) { for (byte y = Chunk.Height - 1; y > 0; y--) { var id = chunk.GetBlockID(new Coordinates3D(x, y - 1, z)); var provider = BlockRepository.GetBlockProvider(id); if (provider.LightOpacity != 0) { map[x, z] = y; break; } } } } HeightMaps[chunk.Coordinates] = map; }
void ScheduleUpdatesForChunk(IWorld world, IChunk chunk) { chunk.UpdateHeightMap(); int _x = chunk.Coordinates.X * Chunk.Width; int _z = chunk.Coordinates.Z * Chunk.Depth; Coordinates3D coords, _coords; for (byte x = 0; x < Chunk.Width; x++) { for (byte z = 0; z < Chunk.Depth; z++) { for (int y = 0; y < chunk.GetHeight(x, z); y++) { _coords.X = x; _coords.Y = y; _coords.Z = z; var id = chunk.GetBlockID(_coords); if (id == 0) continue; coords.X = _x + x; coords.Y = y; coords.Z = _z + z; var provider = BlockRepository.GetBlockProvider(id); provider.BlockLoadedFromChunk(coords, this, world); } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { Noise = new Perlin(world.Seed); ChanceNoise = new ClampNoise(Noise); ChanceNoise.MaxValue = 2; Coordinates2D?lastTree = null; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (lastTree != null && lastTree.Value.DistanceTo(new Coordinates2D(x, z)) < biome.TreeDensity) { continue; } if (Noise.Value2D(blockX, blockZ) > 0.3) { var location = new Coordinates3D(x, height, z); var id = chunk.GetBlockID(location); var provider = world.BlockRepository.GetBlockProvider(id); if (id == DirtBlock.BlockID || id == GrassBlock.BlockID || id == SnowfallBlock.BlockID || (id != StationaryWaterBlock.BlockID && id != WaterBlock.BlockID && id != LavaBlock.BlockID && id != StationaryLavaBlock.BlockID && provider.BoundingBox == null)) { if (provider.BoundingBox == null) { location.Y--; } var oakNoise = ChanceNoise.Value2D(blockX * 0.6, blockZ * 0.6); var birchNoise = ChanceNoise.Value2D(blockX * 0.2, blockZ * 0.2); var spruceNoise = ChanceNoise.Value2D(blockX * 0.35, blockZ * 0.35); var baseCoordinates = location + Coordinates3D.Up; if (biome.Trees.Contains(TreeSpecies.Oak) && oakNoise > 1.01 && oakNoise < 1.25) { var oak = new OakTree().GenerateAt(world, chunk, baseCoordinates); if (oak) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Birch) && birchNoise > 0.3 && birchNoise < 0.95) { var birch = new BirchTree().GenerateAt(world, chunk, baseCoordinates); if (birch) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Spruce) && spruceNoise < 0.75) { var random = new Random(world.Seed); var type = random.Next(1, 2); var generated = false; if (type.Equals(1)) { generated = new PineTree().GenerateAt(world, chunk, baseCoordinates); } else { generated = new ConiferTree().GenerateAt(world, chunk, baseCoordinates); } if (generated) { lastTree = new Coordinates2D(x, z); continue; } } } } } } }
private BlockDescriptor GetBlockDataFromChunk(Coordinates3D adjustedCoordinates, IChunk chunk, Coordinates3D coordinates) { return new BlockDescriptor { ID = chunk.GetBlockID(adjustedCoordinates), Metadata = chunk.GetMetadata(adjustedCoordinates), BlockLight = chunk.GetBlockLight(adjustedCoordinates), SkyLight = chunk.GetSkyLight(adjustedCoordinates), Coordinates = coordinates }; }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var perlin = new Perlin(world.Seed); perlin.Lacunarity = 1; perlin.Amplitude = 7; perlin.Frequency = 0.015; var chanceNoise = new ClampNoise(perlin); var noise = new ScaledNoise(perlin); var random = new Random(world.Seed); var lowWeightOffset = new int[2] { 2, 3 }; var highWeightOffset = new int[2] { 2, 2 }; foreach (var data in Ores) { var midpoint = (data.MaxY + data.MinY) / 2; var weightOffsets = data.MaxY > 30 ? highWeightOffset : lowWeightOffset; const int weightPasses = 4; for (var i = 0; i < data.Veins; i++) { double weight = 0; for (var j = 0; j < weightPasses; j++) { weight += random.NextDouble(); } weight /= data.Rarity; weight = weightOffsets[0] - Math.Abs(weight - weightOffsets[1]); double x = random.Next(0, Chunk.Width); double z = random.Next(0, Chunk.Depth); var y = weight * midpoint; double randomOffsetX = (float)random.NextDouble() - 1; double randomOffsetY = (float)random.NextDouble() - 1; double randomOffsetZ = (float)random.NextDouble() - 1; var abundance = random.Next(0, data.Abundance); for (var k = 0; k < abundance; k++) { x += randomOffsetX; y += randomOffsetY; z += randomOffsetZ; if (x >= 0 && z >= 0 && y >= data.MinY && x < Chunk.Width && y < data.MaxY && z < Chunk.Depth) { var biome = biomes.GetBiome(chunk.Biomes[(int)(x * Chunk.Width + z)]); if (biome.Ores.Contains(data.Type) && chunk .GetBlockID(new Coordinates3D((int)x, (int)y, (int)z)) .Equals(StoneBlock.BlockId)) { chunk.SetBlockID(new Coordinates3D((int)x, (int)y, (int)z), data.Id); } } var blockX = MathHelper.ChunkToBlockX((int)x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ((int)z, chunk.Coordinates.Z); double offsetX = 0; double offsetY = 0; double offsetZ = 0; var offset = random.Next(0, 3); var offset2 = random.NextDouble(); if (offset.Equals(0) && offset2 < 0.4) { offsetX += 1; } else if (offset.Equals(1) && offset2 >= 0.4 && offset2 < 0.65) { offsetY += 1; } else { offsetZ += 1; } var newX = (int)(x + offsetX); var newY = (int)(y + offsetY); var newZ = (int)(z + offsetZ); if (newX >= 0 && newZ >= 0 && newY >= data.MinY && newX < Chunk.Width && newY < data.MaxY && newZ < Chunk.Depth) { var Biome = biomes.GetBiome(chunk.Biomes[newX * Chunk.Width + newZ]); var coordinates = new Coordinates3D(newX, newY, newZ); if (Biome.Ores.Contains(data.Type) && chunk.GetBlockID(coordinates).Equals(StoneBlock.BlockId)) { chunk.SetBlockID(coordinates, data.Id); } } } } } }
protected void GenerateVanillaCircle(IChunk chunk, Coordinates3D location, int radius, byte block, byte meta = 0x0, double corner = 0) { for (int i = -radius; i <= radius; i = (i + 1)) { for (int j = -radius; j <= radius; j = (j + 1)) { int max = (int)Math.Sqrt((i * i) + (j * j)); if (max <= radius) { if (i.Equals(-radius) && j.Equals(-radius) || i.Equals(-radius) && j.Equals(radius) || i.Equals(radius) && j.Equals(-radius) || i.Equals(radius) && j.Equals(radius)) { if (corner + radius * 0.2 < 0.4 || corner + radius * 0.2 > 0.7 || corner.Equals(0)) continue; } int x = location.X + i; int z = location.Z + j; var currentBlock = new Coordinates3D(x, location.Y, z); if (chunk.GetBlockID(currentBlock).Equals(0)) { chunk.SetBlockID(currentBlock, block); chunk.SetMetadata(currentBlock, meta); } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { //Test Seed: 291887241 var perlin = new Perlin(); perlin.Lacunarity = 1; perlin.Amplitude = 7; perlin.Frequency = 0.015; perlin.Seed = world.Seed; var chanceNoise = new ClampNoise(perlin); var noise = new ScaledNoise(perlin); var random = new Random(world.Seed); var lowWeightOffset = new int[2] { 2, 3 }; var highWeightOffset = new int[2] { 2, 2 }; foreach (var data in Ores) { var midpoint = (data.MaxY + data.MinY) / 2; var weightOffsets = (data.MaxY > 30) ? highWeightOffset : lowWeightOffset; const int weightPasses = 4; for (int i = 0; i < data.Veins; i++) { double weight = 0; for (int j = 0; j < weightPasses; j++) { weight += random.NextDouble(); } weight /= data.Rarity; weight = weightOffsets[0] - Math.Abs(weight - weightOffsets[1]); double x = random.Next(0, Chunk.Width); double z = random.Next(0, Chunk.Depth); double y = weight * midpoint; double randomOffsetX = (float)random.NextDouble() - 1; double randomOffsetY = (float)random.NextDouble() - 1; double randomOffsetZ = (float)random.NextDouble() - 1; int abundance = random.Next(0, data.Abundance); for (int k = 0; k < abundance; k++) { x += randomOffsetX; y += randomOffsetY; z += randomOffsetZ; if (x >= 0 && z >= 0 && y >= data.MinY && x < Chunk.Width && y < data.MaxY && z < Chunk.Depth) { var biome = biomes.GetBiome(chunk.Biomes[(int)(x * Chunk.Width + z)]); if (biome.Ores.Contains(data.Type) && chunk.GetBlockID(new Coordinates3D((int)x, (int)y, (int)z)).Equals(StoneBlock.BlockID)) chunk.SetBlockID(new Coordinates3D((int)x, (int)y, (int)z), data.ID); } var blockX = MathHelper.ChunkToBlockX((int)(x), chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ((int)(z), chunk.Coordinates.Z); double offsetX = 0; double offsetY = 0; double offsetZ = 0; int offset = random.Next(0, 3); double offset2 = random.NextDouble(); if (offset.Equals(0) && offset2 < 0.4) offsetX += 1; else if (offset.Equals(1) && offset2 >= 0.4 && offset2 < 0.65) offsetY += 1; else offsetZ += 1; var newX = (int)(x + offsetX); var newY = (int)(y + offsetY); var newZ = (int)(z + offsetZ); if (newX >= 0 && newZ >= 0 && newY >= data.MinY && newX < Chunk.Width && newY < data.MaxY && newZ < Chunk.Depth) { IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[newX * Chunk.Width + newZ]); var coordinates = new Coordinates3D((int)newX, (int)newY, (int)newZ); if (Biome.Ores.Contains(data.Type) && chunk.GetBlockID(coordinates).Equals(StoneBlock.BlockID)) { chunk.SetBlockID(coordinates, data.ID); } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { Noise = new Perlin(); Noise.Seed = world.Seed; ChanceNoise = new ClampNoise(Noise); ChanceNoise.MaxValue = 2; Coordinates2D? lastTree = null; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (lastTree != null && lastTree.Value.DistanceTo(new Coordinates2D(x, z)) < biome.TreeDensity) continue; if (Noise.Value2D(blockX, blockZ) > 0.3) { var location = new Coordinates3D(x, height, z); var id = chunk.GetBlockID(location); var provider = world.BlockRepository.GetBlockProvider(id); if (id == DirtBlock.BlockID || id == GrassBlock.BlockID || id == SnowfallBlock.BlockID || (id != StationaryWaterBlock.BlockID && id != WaterBlock.BlockID && id != LavaBlock.BlockID && id != StationaryLavaBlock.BlockID && provider.BoundingBox == null)) { if (provider.BoundingBox == null) location.Y--; var oakNoise = ChanceNoise.Value2D(blockX * 0.6, blockZ * 0.6); var birchNoise = ChanceNoise.Value2D(blockX * 0.2, blockZ * 0.2); var spruceNoise = ChanceNoise.Value2D(blockX * 0.35, blockZ * 0.35); var baseCoordinates = location + Coordinates3D.Up; if (biome.Trees.Contains(TreeSpecies.Oak) && oakNoise > 1.01 && oakNoise < 1.25) { var oak = new OakTree().GenerateAt(world, chunk, baseCoordinates); if (oak) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Birch) && birchNoise > 0.3 && birchNoise < 0.95) { var birch = new BirchTree().GenerateAt(world, chunk, baseCoordinates); if (birch) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Spruce) && spruceNoise < 0.75) { var random = new Random(world.Seed); var type = random.Next(1, 2); var generated = false; if (type.Equals(1)) generated = new PineTree().GenerateAt(world, chunk, baseCoordinates); else generated = new ConiferTree().GenerateAt(world, chunk, baseCoordinates); if (generated) { lastTree = new Coordinates2D(x, z); continue; } } } } } } }