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 *) NULL); + m_aabms.resize(c + 256, NULL); if (!m_aabms[c]) m_aabms[c] = new std::vector; 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.YgetNodeNoEx(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::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),