From 0b77588e87b0eeedd624eb0d6c2559aad10104ad Mon Sep 17 00:00:00 2001
From: PilzAdam <pilzadam@minetest.net>
Date: Fri, 2 Aug 2013 00:29:27 +0200
Subject: [PATCH] Allow multiple 'wherein' nodes in oredef

---
 src/mapgen.cpp                | 27 ++++++++++++++-------------
 src/mapgen.h                  |  5 ++---
 src/script/lua_api/luaapi.cpp | 16 +++++++++++++++-
 3 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index d285129fb..f446d05b7 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -91,18 +91,17 @@ void Ore::resolveNodeNames(INodeDefManager *ndef) {
 		if (ore == CONTENT_IGNORE) {
 			errorstream << "Ore::resolveNodeNames: ore node '"
 				<< ore_name << "' not defined";
-			ore     = CONTENT_AIR;
-			wherein = CONTENT_AIR;
+			ore = CONTENT_AIR;
+			wherein.push_back(CONTENT_AIR);
+			return;
 		}
 	}
 
-	if (wherein == CONTENT_IGNORE) {
-		wherein = ndef->getId(wherein_name);
-		if (wherein == CONTENT_IGNORE) {
-			errorstream << "Ore::resolveNodeNames: wherein node '"
-				<< wherein_name << "' not defined";
-			ore     = CONTENT_AIR;
-			wherein = CONTENT_AIR;
+	for (size_t i=0; i != wherein_names.size(); i++) {
+		std::string name = wherein_names[i];
+		content_t c = ndef->getId(name);
+		if (c != CONTENT_IGNORE) {
+			wherein.push_back(c);
 		}
 	}
 }
@@ -161,8 +160,9 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
 				continue;
 
 			u32 i = vm->m_area.index(x0 + x1, y0 + y1, z0 + z1);
-			if (vm->m_data[i].getContent() == wherein)
-				vm->m_data[i] = n_ore;
+			for (size_t ii = 0; ii < wherein.size(); ii++)
+				if (vm->m_data[i].getContent() == wherein[ii])
+					vm->m_data[i] = n_ore;
 		}
 	}
 }
@@ -199,8 +199,9 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
 			if (!vm->m_area.contains(i))
 				continue;
 
-			if (vm->m_data[i].getContent() == wherein)
-				vm->m_data[i] = n_ore;
+			for (size_t ii = 0; ii < wherein.size(); ii++)
+				if (vm->m_data[i].getContent() == wherein[ii])
+					vm->m_data[i] = n_ore;
 		}
 	}
 }
diff --git a/src/mapgen.h b/src/mapgen.h
index b167978d7..8aff33288 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -149,9 +149,9 @@ enum OreType {
 class Ore {
 public:
 	std::string ore_name;
-	std::string wherein_name;
+	std::vector<std::string> wherein_names;
 	content_t ore;
-	content_t wherein;  // the node to be replaced
+	std::vector<content_t> wherein;  // the node to be replaced
 	u32 clust_scarcity; // ore cluster has a 1-in-clust_scarcity chance of appearing at a node
 	s16 clust_num_ores; // how many ore nodes are in a chunk
 	s16 clust_size;     // how large (in nodes) a chunk of ore is
@@ -165,7 +165,6 @@ class Ore {
 	
 	Ore() {
 		ore     = CONTENT_IGNORE;
-		wherein = CONTENT_IGNORE;
 		np      = NULL;
 		noise   = NULL;
 	}
diff --git a/src/script/lua_api/luaapi.cpp b/src/script/lua_api/luaapi.cpp
index 020d1cf32..0d4c7da7b 100644
--- a/src/script/lua_api/luaapi.cpp
+++ b/src/script/lua_api/luaapi.cpp
@@ -672,7 +672,6 @@ int ModApiBasic::l_register_ore(lua_State *L)
 
 	ore->ore_name       = getstringfield_default(L, index, "ore", "");
 	ore->ore_param2     = (u8)getintfield_default(L, index, "ore_param2", 0);
-	ore->wherein_name   = getstringfield_default(L, index, "wherein", "");
 	ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 1);
 	ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 1);
 	ore->clust_size     = getintfield_default(L, index, "clust_size", 0);
@@ -681,6 +680,21 @@ int ModApiBasic::l_register_ore(lua_State *L)
 	ore->flags          = getflagsfield(L, index, "flags", flagdesc_ore);
 	ore->nthresh        = getfloatfield_default(L, index, "noise_threshhold", 0.);
 
+	lua_getfield(L, index, "wherein");
+	if (lua_istable(L, -1)) {
+		int  i = lua_gettop(L);
+		lua_pushnil(L);
+		while(lua_next(L, i) != 0) {
+			ore->wherein_names.push_back(lua_tostring(L, -1));
+			lua_pop(L, 1);
+		}
+	} else if (lua_isstring(L, -1)) {
+		ore->wherein_names.push_back(lua_tostring(L, -1));
+	} else {
+		ore->wherein_names.push_back("");
+	}
+	lua_pop(L, 1);
+
 	lua_getfield(L, index, "noise_params");
 	ore->np = read_noiseparams(L, -1);
 	lua_pop(L, 1);
-- 
GitLab