add 'below_sea_level' layer property

This commit is contained in:
MihailRis 2024-08-17 18:44:08 +03:00
parent 2a767a3638
commit c5877684eb
4 changed files with 22 additions and 6 deletions

View File

@ -1,6 +1,6 @@
layers = { layers = {
{block="base:grass_block", height=1}, {block="base:grass_block", height=1, below_sea_level=false},
{block="base:dirt", height=1}, {block="base:dirt", height=5, below_sea_level=false},
{block="base:stone", height=-1}, {block="base:stone", height=-1},
{block="base:bazalt", height=1}, {block="base:bazalt", height=1},
} }

View File

@ -748,7 +748,13 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
lua::pop(L); lua::pop(L);
lua::requirefield(L, "height"); lua::requirefield(L, "height");
int height = lua::tointeger(L, -1); int height = lua::tointeger(L, -1);
lua::pop(L, 2); lua::pop(L);
bool below_sea_level = true;
if (lua::getfield(L, "below_sea_level")) {
below_sea_level = lua::toboolean(L, -1);
lua::pop(L);
}
lua::pop(L);
if (hasResizeableLayer) { if (hasResizeableLayer) {
lastLayersHeight += height; lastLayersHeight += height;
@ -759,7 +765,7 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
} }
hasResizeableLayer = true; hasResizeableLayer = true;
} }
layers.push_back(BlocksLayer {name, height, {}}); layers.push_back(BlocksLayer {name, height, below_sea_level, {}});
} catch (const std::runtime_error& err) { } catch (const std::runtime_error& err) {
lua::pop(L, 2); lua::pop(L, 2);
throw std::runtime_error( throw std::runtime_error(

View File

@ -11,6 +11,7 @@ class Content;
struct BlocksLayer { struct BlocksLayer {
std::string block; std::string block;
int height; int height;
bool below_sea_level;
struct { struct {
blockid_t id; blockid_t id;

View File

@ -16,10 +16,11 @@ WorldGenerator::WorldGenerator(
#include "util/timeutil.hpp" #include "util/timeutil.hpp"
void WorldGenerator::generate(voxel* voxels, int chunkX, int chunkZ, int seed) { void WorldGenerator::generate(voxel* voxels, int chunkX, int chunkZ, int seed) {
timeutil::ScopeLogTimer log(555);
auto heightmap = def.script->generateHeightmap( auto heightmap = def.script->generateHeightmap(
{chunkX*CHUNK_W, chunkZ*CHUNK_D}, {CHUNK_W, CHUNK_D} {chunkX*CHUNK_W, chunkZ*CHUNK_D}, {CHUNK_W, CHUNK_D}
); );
timeutil::ScopeLogTimer log(555); uint seaLevel = 64;
auto values = heightmap->getValues(); auto values = heightmap->getValues();
const auto& layers = def.script->getLayers(); const auto& layers = def.script->getLayers();
uint lastLayersHeight = def.script->getLastLayersHeight(); uint lastLayersHeight = def.script->getLastLayersHeight();
@ -30,19 +31,27 @@ void WorldGenerator::generate(voxel* voxels, int chunkX, int chunkZ, int seed) {
for (uint z = 0; z < CHUNK_D; z++) { for (uint z = 0; z < CHUNK_D; z++) {
for (uint x = 0; x < CHUNK_W; x++) { for (uint x = 0; x < CHUNK_W; x++) {
int height = values[z * CHUNK_W + x] * 255 + 10; int height = values[z * CHUNK_W + x] * 255 + 10;
for (uint y = height+1; y < 64; y++) { for (uint y = height+1; y <= seaLevel; y++) {
voxels[vox_index(x, y, z)].id = baseWater; voxels[vox_index(x, y, z)].id = baseWater;
} }
uint y = height; uint y = height;
uint layerExtension = 0;
for (const auto& layer : layers) { for (const auto& layer : layers) {
if (y < seaLevel && !layer.below_sea_level) {
layerExtension = std::max(0, layer.height);
continue;
}
uint layerHeight = layer.height; uint layerHeight = layer.height;
if (layerHeight == -1) { if (layerHeight == -1) {
layerHeight = y - lastLayersHeight + 1; layerHeight = y - lastLayersHeight + 1;
} else {
layerHeight += layerExtension;
} }
for (uint i = 0; i < layerHeight; i++, y--) { for (uint i = 0; i < layerHeight; i++, y--) {
voxels[vox_index(x, y, z)].id = layer.rt.id; voxels[vox_index(x, y, z)].id = layer.rt.id;
} }
layerExtension = 0;
} }
} }
} }