From ca3629637cb20cea318b8811e717e2caab579dc0 Mon Sep 17 00:00:00 2001
From: Lars Hofhansl <larsh@apache.org>
Date: Wed, 4 Jan 2017 11:11:55 -0800
Subject: Fixes for using std:vector in ABMHander and further perf improvements

---
 src/environment.cpp | 10 +++++-----
 src/mapblock.h      | 20 +++++++++++++++++---
 src/mapnode.h       |  5 -----
 3 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/environment.cpp b/src/environment.cpp
index 5eb9d9770..a0cf9dca5 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -827,7 +827,7 @@ public:
 				{
 					content_t c = *k;
 					if (c >= m_aabms.size())
-						m_aabms.resize(c + 256, (std::vector<ActiveABM> *) NULL);
+						m_aabms.resize(c + 256, NULL);
 					if (!m_aabms[c])
 						m_aabms[c] = new std::vector<ActiveABM>;
 					m_aabms[c]->push_back(aabm);
@@ -872,7 +872,7 @@ public:
 	}
 	void apply(MapBlock *block)
 	{
-		if(m_aabms.empty())
+		if(m_aabms.empty() || block->isDummy())
 			return;
 
 		ServerMap *map = &m_env->getServerMap();
@@ -886,13 +886,13 @@ public:
 		for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++)
 		for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++)
 		{
-			MapNode n = block->getNodeNoEx(p0);
+			const MapNode &n = block->getNodeUnsafe(p0);
 			content_t c = n.getContent();
-			v3s16 p = p0 + block->getPosRelative();
 
-			if (!m_aabms[c])
+			if (c >= m_aabms.size() || !m_aabms[c])
 				continue;
 
+			v3s16 p = p0 + block->getPosRelative();
 			for(std::vector<ActiveABM>::iterator
 					i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) {
 				if(myrand() % i->chance != 0)
diff --git a/src/mapblock.h b/src/mapblock.h
index 5adfcf3fb..c737b4c37 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -305,8 +305,7 @@ public:
 	inline MapNode getNodeNoEx(v3s16 p)
 	{
 		bool is_valid;
-		MapNode node = getNode(p.X, p.Y, p.Z, &is_valid);
-		return is_valid ? node : MapNode(CONTENT_IGNORE);
+		return getNode(p.X, p.Y, p.Z, &is_valid);
 	}
 
 	inline void setNode(s16 x, s16 y, s16 z, MapNode & n)
@@ -341,6 +340,22 @@ public:
 		return getNodeNoCheck(p.X, p.Y, p.Z, valid_position);
 	}
 
+	////
+	//// Non-checking, unsafe variants of the above
+	//// MapBlock must be loaded by another function in the same scope/function
+	//// Caller must ensure that this is not a dummy block (by calling isDummy())
+	////
+
+	inline const MapNode &getNodeUnsafe(s16 x, s16 y, s16 z)
+	{
+		return data[z * zstride + y * ystride + x];
+	}
+
+	inline const MapNode &getNodeUnsafe(v3s16 &p)
+	{
+		return getNodeUnsafe(p.X, p.Y, p.Z);
+	}
+
 	inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n)
 	{
 		if (data == NULL)
@@ -512,7 +527,6 @@ public:
 
 	void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version);
 	void deSerializeNetworkSpecific(std::istream &is);
-
 private:
 	/*
 		Private methods
diff --git a/src/mapnode.h b/src/mapnode.h
index a3c20e8ff..ae0245cfe 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -143,11 +143,6 @@ struct MapNode
 	MapNode()
 	{ }
 
-	MapNode(const MapNode & n)
-	{
-		*this = n;
-	}
-
 	MapNode(content_t content, u8 a_param1=0, u8 a_param2=0)
 		: param0(content),
 		  param1(a_param1),
-- 
cgit v1.2.3