+void ContentFeatures::reset()
+{
+ /*
+ Cached stuff
+ */
+#ifndef SERVER
+ inventory_texture = NULL;
+
+ for(u16 j=0; j<CF_SPECIAL_COUNT; j++){
+ special_materials[j] = NULL;
+ special_aps[j] = NULL;
+ }
+ solidness = 2;
+ visual_solidness = 0;
+ backface_culling = true;
+#endif
+ used_texturenames.clear();
+ /*
+ Actual data
+
+ NOTE: Most of this is always overridden by the default values given
+ in builtin.lua
+ */
+ name = "";
+ drawtype = NDT_NORMAL;
+ visual_scale = 1.0;
+ for(u32 i=0; i<6; i++)
+ tname_tiles[i] = "";
+ for(u16 j=0; j<CF_SPECIAL_COUNT; j++)
+ mspec_special[j] = MaterialSpec();
+ tname_inventory = "";
+ alpha = 255;
+ post_effect_color = video::SColor(0, 0, 0, 0);
+ param_type = CPT_NONE;
+ is_ground_content = false;
+ light_propagates = false;
+ sunlight_propagates = false;
+ walkable = true;
+ pointable = true;
+ diggable = true;
+ climbable = false;
+ buildable_to = false;
+ wall_mounted = false;
+ often_contains_mineral = false;
+ dug_item = "";
+ extra_dug_item = "";
+ extra_dug_item_rarity = 2;
+ metadata_name = "";
+ liquid_type = LIQUID_NONE;
+ liquid_alternative_flowing = "";
+ liquid_alternative_source = "";
+ liquid_viscosity = 0;
+ light_source = 0;
+ damage_per_second = 0;
+ selection_box = NodeBox();
+ material = MaterialProperties();
+ cookresult_item = ""; // Cannot be cooked
+ furnace_cooktime = 3.0;
+ furnace_burntime = -1.0; // Cannot be burned
+}
+
+void ContentFeatures::serialize(std::ostream &os)
+{
+ writeU8(os, 0); // version
+ os<<serializeString(name);
+ writeU8(os, drawtype);
+ writeF1000(os, visual_scale);
+ writeU8(os, 6);
+ for(u32 i=0; i<6; i++)
+ os<<serializeString(tname_tiles[i]);
+ os<<serializeString(tname_inventory);
+ writeU8(os, CF_SPECIAL_COUNT);
+ for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
+ mspec_special[i].serialize(os);
+ }
+ writeU8(os, alpha);
+ writeU8(os, post_effect_color.getAlpha());
+ writeU8(os, post_effect_color.getRed());
+ writeU8(os, post_effect_color.getGreen());
+ writeU8(os, post_effect_color.getBlue());
+ writeU8(os, param_type);
+ writeU8(os, is_ground_content);
+ writeU8(os, light_propagates);
+ writeU8(os, sunlight_propagates);
+ writeU8(os, walkable);
+ writeU8(os, pointable);
+ writeU8(os, diggable);
+ writeU8(os, climbable);
+ writeU8(os, buildable_to);
+ writeU8(os, wall_mounted);
+ writeU8(os, often_contains_mineral);
+ os<<serializeString(dug_item);
+ os<<serializeString(extra_dug_item);
+ writeS32(os, extra_dug_item_rarity);
+ os<<serializeString(metadata_name);
+ writeU8(os, liquid_type);
+ os<<serializeString(liquid_alternative_flowing);
+ os<<serializeString(liquid_alternative_source);
+ writeU8(os, liquid_viscosity);
+ writeU8(os, light_source);
+ writeU32(os, damage_per_second);
+ selection_box.serialize(os);
+ material.serialize(os);
+ os<<serializeString(cookresult_item);
+ writeF1000(os, furnace_cooktime);
+ writeF1000(os, furnace_burntime);
+}
+
+void ContentFeatures::deSerialize(std::istream &is, IGameDef *gamedef)
+{
+ int version = readU8(is);
+ if(version != 0)
+ throw SerializationError("unsupported ContentFeatures version");
+ name = deSerializeString(is);
+ drawtype = (enum NodeDrawType)readU8(is);
+ visual_scale = readF1000(is);
+ if(readU8(is) != 6)
+ throw SerializationError("unsupported tile count");
+ for(u32 i=0; i<6; i++)
+ tname_tiles[i] = deSerializeString(is);
+ tname_inventory = deSerializeString(is);
+ if(readU8(is) != CF_SPECIAL_COUNT)
+ throw SerializationError("unsupported CF_SPECIAL_COUNT");
+ for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
+ mspec_special[i].deSerialize(is);
+ }
+ alpha = readU8(is);
+ post_effect_color.setAlpha(readU8(is));
+ post_effect_color.setRed(readU8(is));
+ post_effect_color.setGreen(readU8(is));
+ post_effect_color.setBlue(readU8(is));
+ param_type = (enum ContentParamType)readU8(is);
+ is_ground_content = readU8(is);
+ light_propagates = readU8(is);
+ sunlight_propagates = readU8(is);
+ walkable = readU8(is);
+ pointable = readU8(is);
+ diggable = readU8(is);
+ climbable = readU8(is);
+ buildable_to = readU8(is);
+ wall_mounted = readU8(is);
+ often_contains_mineral = readU8(is);
+ dug_item = deSerializeString(is);
+ extra_dug_item = deSerializeString(is);
+ extra_dug_item_rarity = readS32(is);
+ metadata_name = deSerializeString(is);
+ liquid_type = (enum LiquidType)readU8(is);
+ liquid_alternative_flowing = deSerializeString(is);
+ liquid_alternative_source = deSerializeString(is);
+ liquid_viscosity = readU8(is);
+ light_source = readU8(is);
+ damage_per_second = readU32(is);
+ selection_box.deSerialize(is);
+ material.deSerialize(is);
+ cookresult_item = deSerializeString(is);
+ furnace_cooktime = readF1000(is);
+ furnace_burntime = readF1000(is);
+}
+