- //dstream<<"operator[] p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;
- if(isValidPosition(p) == false)
- emerge(VoxelArea(p));
-
- return m_data[m_area.index(p)];
- }*/
+ return m_flags[m_area.index(p)];
+ }
+
+ bool exists(const v3s16 &p)
+ {
+ return m_area.contains(p) &&
+ !(getFlagsRefUnsafe(p) & VOXELFLAG_NO_DATA);
+ }
+
+ void setNode(const v3s16 &p, const MapNode &n)
+ {
+ VoxelArea voxel_area(p);
+ addArea(voxel_area);
+
+ m_data[m_area.index(p)] = n;
+ m_flags[m_area.index(p)] &= ~VOXELFLAG_NO_DATA;
+ }
+ // TODO: Should be removed and replaced with setNode
+ void setNodeNoRef(const v3s16 &p, const MapNode &n)
+ {
+ setNode(p, n);
+ }
+
+ /*
+ Set stuff if available without an emerge.
+ Return false if failed.
+ This is convenient but slower than playing around directly
+ with the m_data table with indices.
+ */
+ bool setNodeNoEmerge(const v3s16 &p, MapNode n)
+ {
+ if(!m_area.contains(p))
+ return false;
+ m_data[m_area.index(p)] = n;
+ return true;
+ }