{
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);
}
void apply(MapBlock *block)
{
- if(m_aabms.empty())
+ if(m_aabms.empty() || block->isDummy())
return;
ServerMap *map = &m_env->getServerMap();
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)
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)
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)
void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version);
void deSerializeNetworkSpecific(std::istream &is);
-
private:
/*
Private methods