public IBiomeProvider GetBiome(double temperature, double rainfall, bool spawn) { List <IBiomeProvider> temperatureResults = new List <IBiomeProvider>(); foreach (var biome in BiomeProviders) { if (biome != null && biome.Temperature.Equals(temperature)) { temperatureResults.Add(biome); } } if (temperatureResults.Count.Equals(0)) { IBiomeProvider provider = null; float temperatureDifference = 100.0f; foreach (var biome in BiomeProviders) { if (biome != null) { var Difference = Math.Abs(temperature - biome.Temperature); if (provider == null || Difference < temperatureDifference) { provider = biome; temperatureDifference = (float)Difference; } } } temperatureResults.Add(provider); } foreach (var biome in BiomeProviders) { if (biome != null && biome.Rainfall.Equals(rainfall) && temperatureResults.Contains(biome) && (!spawn || biome.Spawn)) { return(biome); } } IBiomeProvider biomeProvider = null; float rainfallDifference = 100.0f; foreach (var biome in BiomeProviders) { if (biome != null) { var difference = Math.Abs(temperature - biome.Temperature); if ((biomeProvider == null || difference < rainfallDifference) && (!spawn || biome.Spawn)) { biomeProvider = biome; rainfallDifference = (float)difference; } } } return(biomeProvider ?? new PlainsBiome()); }
private static void testGetBiome(List <string> _params) { /* Using World.ChunkCache.ChunkProvider.GetBiomeProvider().GetBiomeAt * Instead of World.getbiome */ int x = int.Parse(_params[0]); int y = int.Parse(_params[1]); Printer.Print("testGetBiome at", x, y); World w = GameManager.Instance.World; ChunkCluster cc = w.ChunkCache; Printer.Print("testGetBiome ChunkCluster", cc); IChunkProvider icp = w.ChunkCache.ChunkProvider; Printer.Print("testGetBiome IChunkProvider", icp); IBiomeProvider bp = w.ChunkCache.ChunkProvider.GetBiomeProvider(); Printer.Print("testGetBiome IBiomeProvider", bp); BiomeDefinition bd = w.ChunkCache.ChunkProvider.GetBiomeProvider().GetBiomeAt(x, y); Printer.Print("testGetBiome BiomeDefinition", bd); }
public void RegisterBiomeProvider(IBiomeProvider provider) { BiomeProviders[provider.Id] = provider; }
public void RegisterBiomeProvider(IBiomeProvider provider) { BiomeProviders[provider.ID] = provider; }
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 (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); } } } } } }