X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmg_decoration.cpp;h=db640626d5d01c74dd788bf3b45132547058d24c;hb=40dd03e328ff0ae36338615114cb38879752756e;hp=b0566e83072aeefe6737935e74a60acfa7b2f9d7;hpb=210a339dce754a6cb03d4ef82f5bacc80b63262b;p=minetest.git diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp index b0566e830..db640626d 100644 --- a/src/mg_decoration.cpp +++ b/src/mg_decoration.cpp @@ -48,7 +48,7 @@ DecorationManager::DecorationManager(IGameDef *gamedef) : size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed, - v3s16 nmin, v3s16 nmax) + v3s16 nmin, v3s16 nmax, s16 deco_zero_level) { size_t nplaced = 0; @@ -57,7 +57,7 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed, if (!deco) continue; - nplaced += deco->placeDeco(mg, blockseed, nmin, nmax); + nplaced += deco->placeDeco(mg, blockseed, nmin, nmax, deco_zero_level); blockseed++; } @@ -67,21 +67,6 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed, /////////////////////////////////////////////////////////////////////////////// - -Decoration::Decoration() -{ - mapseed = 0; - fill_ratio = 0; - sidelen = 1; - flags = 0; -} - - -Decoration::~Decoration() -{ -} - - void Decoration::resolveNodeNames() { getIdsFromNrBacklog(&c_place_on); @@ -138,8 +123,18 @@ bool Decoration::canPlaceDecoration(MMVManip *vm, v3s16 p) } -size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) +size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, + v3s16 nmin, v3s16 nmax, s16 deco_zero_level) { + // Decoration y_min / y_max is displaced by deco_zero_level or remains + // unchanged. Any decoration with a limit at +-MAX_MAP_GENERATION_LIMIT is + // considered to have that limit at +-infinity, so we do not alter that limit. + s32 y_min_disp = (y_min <= -MAX_MAP_GENERATION_LIMIT) ? + -MAX_MAP_GENERATION_LIMIT : y_min + deco_zero_level; + + s32 y_max_disp = (y_max >= MAX_MAP_GENERATION_LIMIT) ? + MAX_MAP_GENERATION_LIMIT : y_max + deco_zero_level; + PcgRandom ps(blockseed + 53); int carea_size = nmax.X - nmin.X + 1; @@ -194,8 +189,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) else y = mg->findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y); - if (y < nmin.Y || y > nmax.Y || - y < y_min || y > y_max) + if (y < y_min_disp || y > y_max_disp || y < nmin.Y || y > nmax.Y) continue; if (y + getHeight() > mg->vm->m_area.MaxEdge.Y) { @@ -208,14 +202,11 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) #endif } - if (mg->biomemap) { - UNORDERED_SET::iterator iter; - - if (!biomes.empty()) { - iter = biomes.find(mg->biomemap[mapindex]); - if (iter == biomes.end()) - continue; - } + if (mg->biomemap && !biomes.empty()) { + std::unordered_set::const_iterator iter = + biomes.find(mg->biomemap[mapindex]); + if (iter == biomes.end()) + continue; } v3s16 pos(x, y, z); @@ -295,7 +286,7 @@ void DecoSimple::resolveNodeNames() size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p) { // Don't bother if there aren't any decorations to place - if (c_decos.size() == 0) + if (c_decos.empty()) return 0; if (!canPlaceDecoration(vm, p)) @@ -308,7 +299,7 @@ size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p) bool force_placement = (flags & DECO_FORCE_PLACEMENT); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 vi = vm->m_area.index(p); for (int i = 0; i < height; i++) { vm->m_area.add_y(em, vi, 1); @@ -333,13 +324,6 @@ int DecoSimple::getHeight() /////////////////////////////////////////////////////////////////////////////// - -DecoSchematic::DecoSchematic() -{ - schematic = NULL; -} - - size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p) { // Schematic could have been unloaded but not the decoration