Rewrite generate notification mechanism
[oweals/minetest.git] / src / mg_ore.cpp
index c8d224dc6c8fe1438c0c01f9c4c761ed3a39bcc5..80e86130a1fa61510e5bd6f5dfabb3861f9314b9 100644 (file)
@@ -19,10 +19,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "mg_ore.h"
 #include "mapgen.h"
+#include "noise.h"
 #include "util/numeric.h"
 #include "map.h"
 #include "log.h"
 
+const char *OreManager::ELEMENT_TITLE = "ore";
 
 FlagDesc flagdesc_ore[] = {
        {"absheight",            OREFLAG_ABSHEIGHT},
@@ -31,24 +33,36 @@ FlagDesc flagdesc_ore[] = {
        {NULL,                   0}
 };
 
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
-Ore *createOre(OreType type)
+size_t OreManager::placeAllOres(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 {
-       switch (type) {
-       case ORE_SCATTER:
-               return new OreScatter;
-       case ORE_SHEET:
-               return new OreSheet;
-       //case ORE_CLAYLIKE: //TODO: implement this!
-       //      return new OreClaylike;
-       default:
-               return NULL;
+       size_t nplaced = 0;
+
+       for (size_t i = 0; i != m_elements.size(); i++) {
+               Ore *ore = (Ore *)m_elements[i];
+               if (!ore)
+                       continue;
+
+               nplaced += ore->placeOre(mg, seed, nmin, nmax);
+               seed++;
        }
+
+       return nplaced;
 }
 
 
+///////////////////////////////////////////////////////////////////////////////
+
+Ore::Ore()
+{
+       c_ore   = CONTENT_IGNORE;
+       np      = NULL;
+       noise   = NULL;
+}
+
 Ore::~Ore()
 {
        delete np;
@@ -56,7 +70,7 @@ Ore::~Ore()
 }
 
 
-void Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
+size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 {
        int in_range = 0;
 
@@ -64,7 +78,7 @@ void Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
        if (flags & OREFLAG_ABSHEIGHT)
                in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1;
        if (!in_range)
-               return;
+               return 0;
 
        int ymin, ymax;
        if (in_range & ORE_RANGE_MIRROR) {
@@ -75,11 +89,13 @@ void Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                ymax = MYMIN(nmax.Y, height_max);
        }
        if (clust_size >= ymax - ymin + 1)
-               return;
+               return 0;
 
        nmin.Y = ymin;
        nmax.Y = ymax;
        generate(mg->vm, mg->seed, blockseed, nmin, nmax);
+
+       return 1;
 }