void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { // Protocol >= 36 int version = 4; writeU8(os, version); switch (type) { case NODEBOX_LEVELED: case NODEBOX_FIXED: writeU8(os, type); writeU16(os, fixed.size()); for (const aabb3f &nodebox : fixed) { writeV3F1000(os, nodebox.MinEdge); writeV3F1000(os, nodebox.MaxEdge); } break; case NODEBOX_WALLMOUNTED: writeU8(os, type); writeV3F1000(os, wall_top.MinEdge); writeV3F1000(os, wall_top.MaxEdge); writeV3F1000(os, wall_bottom.MinEdge); writeV3F1000(os, wall_bottom.MaxEdge); writeV3F1000(os, wall_side.MinEdge); writeV3F1000(os, wall_side.MaxEdge); break; case NODEBOX_CONNECTED: writeU8(os, type); #define WRITEBOX(box) \ writeU16(os, (box).size()); \ for (const aabb3f &i: (box)) { \ writeV3F1000(os, i.MinEdge); \ writeV3F1000(os, i.MaxEdge); \ }; WRITEBOX(fixed); WRITEBOX(connect_top); WRITEBOX(connect_bottom); WRITEBOX(connect_front); WRITEBOX(connect_left); WRITEBOX(connect_back); WRITEBOX(connect_right); break; default: writeU8(os, type); break; } }
void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { int version = 1; if (protocol_version >= 27) version = 3; else if (protocol_version >= 21) version = 2; writeU8(os, version); switch (type) { case NODEBOX_LEVELED: case NODEBOX_FIXED: if (version == 1) writeU8(os, NODEBOX_FIXED); else writeU8(os, type); writeU16(os, fixed.size()); for (std::vector<aabb3f>::const_iterator i = fixed.begin(); i != fixed.end(); ++i) { writeV3F1000(os, i->MinEdge); writeV3F1000(os, i->MaxEdge); } break; case NODEBOX_WALLMOUNTED: writeU8(os, type); writeV3F1000(os, wall_top.MinEdge); writeV3F1000(os, wall_top.MaxEdge); writeV3F1000(os, wall_bottom.MinEdge); writeV3F1000(os, wall_bottom.MaxEdge); writeV3F1000(os, wall_side.MinEdge); writeV3F1000(os, wall_side.MaxEdge); break; case NODEBOX_CONNECTED: if (version <= 2) { // send old clients nodes that can't be walked through // to prevent abuse writeU8(os, NODEBOX_FIXED); writeU16(os, 1); writeV3F1000(os, v3f(-BS/2, -BS/2, -BS/2)); writeV3F1000(os, v3f(BS/2, BS/2, BS/2)); } else { writeU8(os, type); #define WRITEBOX(box) do { \ writeU16(os, (box).size()); \ for (std::vector<aabb3f>::const_iterator \ i = (box).begin(); \ i != (box).end(); ++i) { \ writeV3F1000(os, i->MinEdge); \ writeV3F1000(os, i->MaxEdge); \ }; } while (0) WRITEBOX(fixed); WRITEBOX(connect_top); WRITEBOX(connect_bottom); WRITEBOX(connect_front); WRITEBOX(connect_left); WRITEBOX(connect_back); WRITEBOX(connect_right); } break; default: writeU8(os, type); break; } }