Biome *MapgenV7::getBiomeAtPoint(v3s16 p) { float heat = NoisePerlin2D(&noise_heat->np, p.X, p.Z, seed); float humidity = NoisePerlin2D(&noise_humidity->np, p.X, p.Z, seed); s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Z); return bmgr->getBiome(heat, humidity, groundlevel); }
int MapgenV7::getGroundLevelAtPoint(v2s16 p) { // Base terrain calculation s16 y = baseTerrainLevelAtPoint(p.X, p.Y); // Ridge/river terrain calculation float width = 0.2; float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2; // actually computing the depth of the ridge is much more expensive; // if inside a river, simply guess if (fabs(uwatern) <= width) return water_level - 10; // Mountain terrain calculation int iters = 128; // don't even bother iterating more than 128 times.. while (iters--) { //current point would have been air if (!getMountainTerrainAtPoint(p.X, y, p.Y)) return y; y++; } return y; }
int MapgenV7::getSpawnLevelAtPoint(v2s16 p) { // Base terrain calculation s16 y = baseTerrainLevelAtPoint(p.X, p.Y); // Ridge/river terrain calculation float width = 0.2; float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2; // if inside a river this is an unsuitable spawn point if (fabs(uwatern) <= width) return MAX_MAP_GENERATION_LIMIT; // Mountain terrain calculation int iters = 128; while (iters--) { if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { // Air, y is ground level if (y <= water_level || y > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point else return y; } y++; } // Unsuitable spawn point, no ground surface found return MAX_MAP_GENERATION_LIMIT; }
int MapgenV7::getSpawnLevelAtPoint(v2s16 p) { // If rivers are enabled, first check if in a river if (spflags & MGV7_RIDGES) { float width = 0.2; float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2; if (fabs(uwatern) <= width) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point } // Terrain noise 'offset' is the average level of that terrain. // At least 50% of terrain will be below the higher of base and alt terrain // 'offset's. // Raising the maximum spawn level above 'water_level + 16' is necessary // for when terrain 'offset's are set much higher than water_level. s16 max_spawn_y = MYMAX(MYMAX(noise_terrain_alt->np.offset, noise_terrain_base->np.offset), water_level + 16); // Base terrain calculation s16 y = baseTerrainLevelAtPoint(p.X, p.Y); // If mountains are disabled, terrain level is base terrain level. // Avoids mid-air spawn where mountain terrain would have been. if (!(spflags & MGV7_MOUNTAINS)) { if (y < water_level || y > max_spawn_y) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point // y + 2 because y is surface level and due to biome 'dust' return y + 2; } // Search upwards for first node without mountain terrain int iters = 256; while (iters > 0 && y <= max_spawn_y) { if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { if (y <= water_level || y > max_spawn_y) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point // y + 1 due to biome 'dust' return y + 1; } y++; iters--; } // Unsuitable spawn point return MAX_MAP_GENERATION_LIMIT; }
int MapgenV7::getGroundLevelAtPoint(v2s16 p) { s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Y); float heat = NoisePerlin2D(bmgr->np_heat, p.X, p.Y, seed); float humidity = NoisePerlin2D(bmgr->np_humidity, p.X, p.Y, seed); Biome *b = bmgr->getBiome(heat, humidity, groundlevel); s16 y = groundlevel; if (y > water_level) { int iters = 1024; // don't even bother iterating more than 1024 times.. while (iters--) { float ridgenoise = NoisePerlin3D(noise_ridge->np, p.X, y, p.Y, seed); if (ridgenoise * (float)(y * y) < 15.0) break; y--; } } return y + b->top_depth; }
int MapgenV7P::getSpawnLevelAtPoint(v2s16 p) { // If enabled, first check if inside a river if (spflags & MGV7P_RIDGES) { float width = 0.2; float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2; if (fabs(uwatern) <= width) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point } // Base/mountain terrain calculation s16 y = baseTerrainLevelAtPoint(p.X, p.Y); if (spflags & MGV7P_MOUNTAINS) y = MYMAX(mountainLevelAtPoint(p.X, p.Y), y); if (y < water_level || y > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point else return y + 2; // +2 because surface is at y and due to biome 'dust' }
int MapgenV7::getSpawnLevelAtPoint(v2s16 p) { // Base terrain calculation s16 y = baseTerrainLevelAtPoint(p.X, p.Y); // If enabled, check if inside a river if (spflags & MGV7_RIDGES) { float width = 0.2; float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2; if (fabs(uwatern) <= width) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point } // If mountains are disabled, terrain level is base terrain level // Avoids spawn on non-existant mountain terrain if (!(spflags & MGV7_MOUNTAINS)) { if (y <= water_level || y > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point else return y; } // Mountain terrain calculation int iters = 128; while (iters--) { if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { // If air above if (y <= water_level || y > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point else return y; } y++; } // Unsuitable spawn point, no mountain surface found return MAX_MAP_GENERATION_LIMIT; }