Allow ObjDefManager instances to be cloned
[oweals/minetest.git] / src / mapgen / mg_ore.cpp
index c36249cb9e1fa0ffe55dfaf6e66dfafefa8b316a..db647f82be0199e16785c7819a263d24e2b5e3f2 100644 (file)
@@ -72,6 +72,14 @@ void OreManager::clear()
 }
 
 
+OreManager *OreManager::clone() const
+{
+       auto mgr = new OreManager();
+       ObjDefManager::cloneTo(mgr);
+       return mgr;
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
@@ -106,9 +114,37 @@ size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 }
 
 
+void Ore::cloneTo(Ore *def) const
+{
+       ObjDef::cloneTo(def);
+       NodeResolver::cloneTo(def);
+       def->c_ore = c_ore;
+       def->c_wherein = c_wherein;
+       def->clust_scarcity = clust_scarcity;
+       def->clust_num_ores = clust_num_ores;
+       def->clust_size = clust_size;
+       def->y_min = y_min;
+       def->y_max = y_max;
+       def->ore_param2 = ore_param2;
+       def->flags = flags;
+       def->nthresh = nthresh;
+       def->np = np;
+       def->noise = nullptr; // cannot be shared! so created on demand
+       def->biomes = biomes;
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
+ObjDef *OreScatter::clone() const
+{
+       auto def = new OreScatter();
+       Ore::cloneTo(def);
+       return def;
+}
+
+
 void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {
@@ -158,6 +194,19 @@ void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
 ///////////////////////////////////////////////////////////////////////////////
 
 
+ObjDef *OreSheet::clone() const
+{
+       auto def = new OreSheet();
+       Ore::cloneTo(def);
+
+       def->column_height_max = column_height_max;
+       def->column_height_min = column_height_min;
+       def->column_midpoint_factor = column_midpoint_factor;
+
+       return def;
+}
+
+
 void OreSheet::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {
@@ -221,6 +270,20 @@ OrePuff::~OrePuff()
 }
 
 
+ObjDef *OrePuff::clone() const
+{
+       auto def = new OrePuff();
+       Ore::cloneTo(def);
+
+       def->np_puff_top = np_puff_top;
+       def->np_puff_bottom = np_puff_bottom;
+       def->noise_puff_top = nullptr; // cannot be shared, on-demand
+       def->noise_puff_bottom = nullptr;
+
+       return def;
+}
+
+
 void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {
@@ -294,6 +357,14 @@ void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
 ///////////////////////////////////////////////////////////////////////////////
 
 
+ObjDef *OreBlob::clone() const
+{
+       auto def = new OreBlob();
+       Ore::cloneTo(def);
+       return def;
+}
+
+
 void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {
@@ -366,6 +437,19 @@ OreVein::~OreVein()
 }
 
 
+ObjDef *OreVein::clone() const
+{
+       auto def = new OreVein();
+       Ore::cloneTo(def);
+
+       def->random_factor = random_factor;
+       def->noise2 = nullptr; // cannot be shared, on-demand
+       def->sizey_prev = sizey_prev;
+
+       return def;
+}
+
+
 void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {
@@ -434,6 +518,19 @@ OreStratum::~OreStratum()
 }
 
 
+ObjDef *OreStratum::clone() const
+{
+       auto def = new OreStratum();
+       Ore::cloneTo(def);
+
+       def->np_stratum_thickness = np_stratum_thickness;
+       def->noise_stratum_thickness = nullptr; // cannot be shared, on-demand
+       def->stratum_thickness = stratum_thickness;
+
+       return def;
+}
+
+
 void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed,
        v3s16 nmin, v3s16 nmax, u8 *biomemap)
 {