Fix alpha for liquid nodes (#5494)
[oweals/minetest.git] / src / mapgen.cpp
index e1e3ccd25b171f680c89c74958986b20c47f6fa8..bd0e94ac7c0e79886f8fd142600de2a201f5c663 100644 (file)
@@ -97,11 +97,12 @@ STATIC_ASSERT(
 
 Mapgen::Mapgen()
 {
-       generating  = false;
-       id          = -1;
-       seed        = 0;
-       water_level = 0;
-       flags       = 0;
+       generating   = false;
+       id           = -1;
+       seed         = 0;
+       water_level  = 0;
+       mapgen_limit = 0;
+       flags        = 0;
 
        vm        = NULL;
        ndef      = NULL;
@@ -114,11 +115,12 @@ Mapgen::Mapgen()
 Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
        gennotify(emerge->gen_notify_on, &emerge->gen_notify_on_deco_ids)
 {
-       generating  = false;
-       id          = mapgenid;
-       water_level = params->water_level;
-       flags       = params->flags;
-       csize       = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
+       generating   = false;
+       id           = mapgenid;
+       water_level  = params->water_level;
+       mapgen_limit = params->mapgen_limit;
+       flags        = params->flags;
+       csize        = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
 
        /*
                We are losing half our entropy by doing this, but it is necessary to
@@ -591,6 +593,7 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer
        c_sandstone          = ndef->getId("mapgen_sandstone");
        c_water_source       = ndef->getId("mapgen_water_source");
        c_river_water_source = ndef->getId("mapgen_river_water_source");
+       c_lava_source        = ndef->getId("mapgen_lava_source");
 
        // Fall back to more basic content if not defined
        // river_water_source cannot fallback to water_source because river water
@@ -601,12 +604,12 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer
                c_sandstone = c_stone;
 
        //// Content used for dungeon generation
-       c_cobble               = ndef->getId("mapgen_cobble");
-       c_mossycobble          = ndef->getId("mapgen_mossycobble");
-       c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-       c_stair_desert_stone   = ndef->getId("mapgen_stair_desert_stone");
-       c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-       c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
+       c_cobble                = ndef->getId("mapgen_cobble");
+       c_mossycobble           = ndef->getId("mapgen_mossycobble");
+       c_stair_cobble          = ndef->getId("mapgen_stair_cobble");
+       c_stair_desert_stone    = ndef->getId("mapgen_stair_desert_stone");
+       c_sandstonebrick        = ndef->getId("mapgen_sandstonebrick");
+       c_stair_sandstone_block = ndef->getId("mapgen_stair_sandstone_block");
 
        // Fall back to more basic content if not defined
        if (c_mossycobble == CONTENT_IGNORE)
@@ -617,8 +620,8 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer
                c_stair_desert_stone = c_desert_stone;
        if (c_sandstonebrick == CONTENT_IGNORE)
                c_sandstonebrick = c_sandstone;
-       if (c_stair_sandstonebrick == CONTENT_IGNORE)
-               c_stair_sandstonebrick = c_sandstonebrick;
+       if (c_stair_sandstone_block == CONTENT_IGNORE)
+               c_stair_sandstone_block = c_sandstonebrick;
 }
 
 
@@ -838,6 +841,18 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
 }
 
 
+bool MapgenBasic::generateCaverns(s16 max_stone_y)
+{
+       if (node_min.Y > max_stone_y || node_min.Y > cavern_limit)
+               return false;
+
+       CavernsNoise caverns_noise(ndef, csize, &np_cavern,
+               seed, cavern_limit, cavern_taper, cavern_threshold);
+
+       return caverns_noise.generateCaverns(vm, node_min, node_max);
+}
+
+
 void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
 {
        if (max_stone_y < node_min.Y)
@@ -891,7 +906,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
        case MGSTONE_SANDSTONE:
                dp.c_wall              = c_sandstonebrick;
                dp.c_alt_wall          = CONTENT_IGNORE;
-               dp.c_stair             = c_stair_sandstonebrick;
+               dp.c_stair             = c_stair_sandstone_block;
 
                dp.diagonal_dirs       = false;
                dp.holesize            = v3s16(2, 2, 2);
@@ -1001,10 +1016,14 @@ void MapgenParams::readParams(const Settings *settings)
        }
 
        std::string mg_name;
-       if (settings->getNoEx("mg_name", mg_name))
-               this->mgtype = Mapgen::getMapgenType(mg_name);
+       if (settings->getNoEx("mg_name", mg_name)) {
+               mgtype = Mapgen::getMapgenType(mg_name);
+               if (mgtype == MAPGEN_INVALID)
+                       mgtype = MAPGEN_DEFAULT;
+       }
 
        settings->getS16NoEx("water_level", water_level);
+       settings->getS16NoEx("mapgen_limit", mapgen_limit);
        settings->getS16NoEx("chunksize", chunksize);
        settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
 
@@ -1022,6 +1041,7 @@ void MapgenParams::writeParams(Settings *settings) const
        settings->set("mg_name", Mapgen::getMapgenName(mgtype));
        settings->setU64("seed", seed);
        settings->setS16("water_level", water_level);
+       settings->setS16("mapgen_limit", mapgen_limit);
        settings->setS16("chunksize", chunksize);
        settings->setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);