NodeBox
*/
+void NodeBox::reset()
+{
+ type = NODEBOX_REGULAR;
+ // default is empty
+ fixed.clear();
+ // default is sign/ladder-like
+ wall_top = aabb3f(-BS/2, BS/2-BS/16., -BS/2, BS/2, BS/2, BS/2);
+ wall_bottom = aabb3f(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2);
+ wall_side = aabb3f(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2);
+}
+
void NodeBox::serialize(std::ostream &os) const
{
- writeU8(os, 0); // version
+ writeU8(os, 1); // version
writeU8(os, type);
- writeV3F1000(os, fixed.MinEdge);
- writeV3F1000(os, fixed.MaxEdge);
- 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);
+
+ if(type == NODEBOX_FIXED)
+ {
+ 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);
+ }
+ }
+ else if(type == NODEBOX_WALLMOUNTED)
+ {
+ 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);
+ }
}
void NodeBox::deSerialize(std::istream &is)
{
int version = readU8(is);
- if(version != 0)
+ if(version != 1)
throw SerializationError("unsupported NodeBox version");
+
+ reset();
+
type = (enum NodeBoxType)readU8(is);
- fixed.MinEdge = readV3F1000(is);
- fixed.MaxEdge = readV3F1000(is);
- wall_top.MinEdge = readV3F1000(is);
- wall_top.MaxEdge = readV3F1000(is);
- wall_bottom.MinEdge = readV3F1000(is);
- wall_bottom.MaxEdge = readV3F1000(is);
- wall_side.MinEdge = readV3F1000(is);
- wall_side.MaxEdge = readV3F1000(is);
+
+ if(type == NODEBOX_FIXED)
+ {
+ u16 fixed_count = readU16(is);
+ while(fixed_count--)
+ {
+ aabb3f box;
+ box.MinEdge = readV3F1000(is);
+ box.MaxEdge = readV3F1000(is);
+ fixed.push_back(box);
+ }
+ }
+ else if(type == NODEBOX_WALLMOUNTED)
+ {
+ wall_top.MinEdge = readV3F1000(is);
+ wall_top.MaxEdge = readV3F1000(is);
+ wall_bottom.MinEdge = readV3F1000(is);
+ wall_bottom.MaxEdge = readV3F1000(is);
+ wall_side.MinEdge = readV3F1000(is);
+ wall_side.MaxEdge = readV3F1000(is);
+ }
}
/*
liquid_viscosity = 0;
light_source = 0;
damage_per_second = 0;
+ node_box = NodeBox();
selection_box = NodeBox();
legacy_facedir_simple = false;
legacy_wallmounted = false;
void ContentFeatures::serialize(std::ostream &os)
{
- writeU8(os, 4); // version
+ writeU8(os, 5); // version
os<<serializeString(name);
writeU16(os, groups.size());
for(ItemGroupList::const_iterator
writeU8(os, liquid_viscosity);
writeU8(os, light_source);
writeU32(os, damage_per_second);
+ node_box.serialize(os);
selection_box.serialize(os);
writeU8(os, legacy_facedir_simple);
writeU8(os, legacy_wallmounted);
void ContentFeatures::deSerialize(std::istream &is)
{
int version = readU8(is);
- if(version != 4 && version != 3)
+ if(version != 5)
throw SerializationError("unsupported ContentFeatures version");
name = deSerializeString(is);
groups.clear();
visual_scale = readF1000(is);
if(readU8(is) != 6)
throw SerializationError("unsupported tile count");
- for(u32 i=0; i<6; i++){
- if(version == 4)
- tiledef[i].deSerialize(is);
- else if(version == 3) // Allow connecting to older servers
- tiledef[i].name = deSerializeString(is);
- }
+ for(u32 i=0; i<6; i++)
+ tiledef[i].deSerialize(is);
if(readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
- for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
- if(version == 4){
- tiledef_special[i].deSerialize(is);
- } else if(version == 3){ // Allow connecting to older servers
- tiledef_special[i].name = deSerializeString(is);
- tiledef_special[i].backface_culling = readU8(is);
- }
- }
+ for(u32 i=0; i<CF_SPECIAL_COUNT; i++)
+ tiledef_special[i].deSerialize(is);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
liquid_viscosity = readU8(is);
light_source = readU8(is);
damage_per_second = readU32(is);
+ node_box.deSerialize(is);
selection_box.deSerialize(is);
legacy_facedir_simple = readU8(is);
legacy_wallmounted = readU8(is);
}
}
// CONTENT_IGNORE = not found
- content_t getFreeId(bool require_full_param2)
+ content_t getFreeId()
{
- // If allowed, first search in the large 4-bit-param2 pool
- if(!require_full_param2){
- for(u16 i=0x800; i<=0xfff; i++){
- const ContentFeatures &f = m_content_features[i];
- if(f.name == "")
- return i;
- }
- }
- // Then search from the small 8-bit-param2 pool
- for(u16 i=0; i<=125; i++){
+ for(u32 i=0; i<=0xffff; i++){
const ContentFeatures &f = m_content_features[i];
if(f.name == "")
return i;
u16 id = CONTENT_IGNORE;
bool found = m_name_id_mapping.getId(name, id); // ignore aliases
if(!found){
- // Determine if full param2 is required
- bool require_full_param2 = (
- def.param_type_2 == CPT2_FULL
- ||
- def.param_type_2 == CPT2_FLOWINGLIQUID
- ||
- def.legacy_wallmounted
- );
// Get some id
- id = getFreeId(require_full_param2);
+ id = getFreeId();
if(id == CONTENT_IGNORE)
return CONTENT_IGNORE;
if(name != "")
f->solidness = 0;
} else {
f->solidness = 1;
- if(f->alpha == 255)
- f->solidness = 2;
f->backface_culling = false;
}
break;
case NDT_PLANTLIKE:
case NDT_FENCELIKE:
case NDT_RAILLIKE:
+ case NDT_NODEBOX:
f->solidness = 0;
break;
}