private Biome GetPrimaryAndHeight(Chunk chunk, int chunkPosX, int chunkPosZ, int x, int z, out double height) { Biome primaryBiome = chunk.GetBiome(chunkPosX, chunkPosZ, false); double x1, x2, y1, y2; x1 = x2 = y1 = y2 = primaryBiome.GetHeightValue(x, z); if (AttemptFindBiomeTransition(chunk, chunkPosX, chunkPosZ, primaryBiome, x, z, Chunk.BIOME_BLEND_DISTANCE, 1, 0, out int steps1, out double biomeHeight1)) { x2 = biomeHeight1; } if (AttemptFindBiomeTransition(chunk, chunkPosX, chunkPosZ, primaryBiome, x, z, Chunk.BIOME_BLEND_DISTANCE, -1, 0, out int steps2, out double biomeHeight2)) { x1 = biomeHeight2; } double biasX = (1.0 - steps1 / (double)(Chunk.BIOME_BLEND_DISTANCE + 1) + steps2 / (double)(Chunk.BIOME_BLEND_DISTANCE + 1)) / 2; if (AttemptFindBiomeTransition(chunk, chunkPosX, chunkPosZ, primaryBiome, x, z, Chunk.BIOME_BLEND_DISTANCE, 0, 1, out int steps3, out double biomeHeight3)) { y2 = biomeHeight3; } if (AttemptFindBiomeTransition(chunk, chunkPosX, chunkPosZ, primaryBiome, x, z, Chunk.BIOME_BLEND_DISTANCE, 0, -1, out int steps4, out double biomeHeight4)) { y1 = biomeHeight4; } double biasZ = (1.0 - steps3 / (double)(Chunk.BIOME_BLEND_DISTANCE + 1) + steps4 / (double)(Chunk.BIOME_BLEND_DISTANCE + 1)) / 2; height = x1; return(primaryBiome); }
private bool AttemptFindBiomeTransition(Chunk chunk, int chunkPosX, int chunkPosZ, Biome primaryBiome, int x, int z, int maxDistance, int xMove, int zMove, out int steps, out double height) { for (int dist = 1; dist <= maxDistance; dist++) { int newX = x + xMove * dist; int newZ = z + zMove * dist; Biome biome = chunk.GetBiome(chunkPosX + xMove * dist, chunkPosZ + zMove * dist, false); if (biome != primaryBiome) { steps = dist; height = biome.GetHeightValue(newX, newZ); return(true); } } steps = 0; height = 0; return(false); }