/*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
#include "settings.h"
#include "nameidmapping.h"
#include "util/serialize.h"
+//#include "profiler.h" // For TimeTaker
/*
NodeBox
TileDef
*/
-void TileDef::serialize(std::ostream &os) const
+void TileDef::serialize(std::ostream &os, u16 protocol_version) const
{
- writeU8(os, 0); // version
+ if(protocol_version >= 17)
+ writeU8(os, 1);
+ else
+ writeU8(os, 0);
os<<serializeString(name);
writeU8(os, animation.type);
writeU16(os, animation.aspect_w);
writeU16(os, animation.aspect_h);
writeF1000(os, animation.length);
+ if(protocol_version >= 17)
+ writeU8(os, backface_culling);
}
void TileDef::deSerialize(std::istream &is)
{
int version = readU8(is);
- if(version != 0)
- throw SerializationError("unsupported TileDef version");
name = deSerializeString(is);
animation.type = (TileAnimationType)readU8(is);
animation.aspect_w = readU16(is);
animation.aspect_h = readU16(is);
animation.length = readF1000(is);
+ if(version >= 1)
+ backface_culling = readU8(is);
}
/*
diggable = true;
climbable = false;
buildable_to = false;
+ rightclickable = true;
liquid_type = LIQUID_NONE;
liquid_alternative_flowing = "";
liquid_alternative_source = "";
writeF1000(os, visual_scale);
writeU8(os, 6);
for(u32 i=0; i<6; i++)
- tiledef[i].serialize(os);
+ tiledef[i].serialize(os, protocol_version);
writeU8(os, CF_SPECIAL_COUNT);
for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
- tiledef_special[i].serialize(os);
+ tiledef_special[i].serialize(os, protocol_version);
}
writeU8(os, alpha);
writeU8(os, post_effect_color.getAlpha());
serializeSimpleSoundSpec(sound_footstep, os);
serializeSimpleSoundSpec(sound_dig, os);
serializeSimpleSoundSpec(sound_dug, os);
+ writeU8(os, rightclickable);
// Stuff below should be moved to correct place in a version that otherwise changes
// the protocol version
}
deSerializeSimpleSoundSpec(sound_footstep, is);
deSerializeSimpleSoundSpec(sound_dig, is);
deSerializeSimpleSoundSpec(sound_dug, is);
+ rightclickable = readU8(is);
// If you add anything here, insert it primarily inside the try-catch
// block to not need to increase the version.
try{
virtual void getIds(const std::string &name, std::set<content_t> &result)
const
{
+ //TimeTaker t("getIds", NULL, PRECISION_MICRO);
if(name.substr(0,6) != "group:"){
content_t id = CONTENT_IGNORE;
if(getId(name, id))
return;
}
std::string group = name.substr(6);
+
+#if 1 // Optimized version, takes less than 1 microsecond at -O1
+ std::map<std::string, GroupItems>::const_iterator
+ i = m_group_to_items.find(group);
+ if (i == m_group_to_items.end())
+ return;
+
+ const GroupItems &items = i->second;
+ for (GroupItems::const_iterator j = items.begin();
+ j != items.end(); ++j) {
+ if ((*j).second != 0)
+ result.insert((*j).first);
+ }
+#else // Old version, takes about ~150-200us at -O1
for(u16 id=0; id<=MAX_CONTENT; id++)
{
const ContentFeatures &f = m_content_features[id];
if(itemgroup_get(f.groups, group) != 0)
result.insert(id);
}
+#endif
+ //printf("getIds: %dus\n", t.stop());
}
virtual const ContentFeatures& get(const std::string &name) const
{
m_content_features[c] = def;
if(def.name != "")
addNameIdMapping(c, def.name);
+
+ // Add this content to the list of all groups it belongs to
+ for (ItemGroupList::const_iterator i = def.groups.begin();
+ i != def.groups.end(); ++i) {
+ std::string group_name = i->first;
+
+ std::map<std::string, GroupItems>::iterator
+ j = m_group_to_items.find(group_name);
+ if (j == m_group_to_items.end()) {
+ m_group_to_items[group_name].push_back(std::make_pair(c, i->second));
+ } else {
+ GroupItems &items = j->second;
+ items.push_back(std::make_pair(c, i->second));
+ }
+ }
}
virtual content_t set(const std::string &name,
const ContentFeatures &def)
{
tiledef[j] = f->tiledef[j];
if(tiledef[j].name == "")
- tiledef[j].name = "unknown_block.png";
+ tiledef[j].name = "unknown_node.png";
}
bool is_liquid = false;
f->solidness = 0;
f->visual_solidness = 1;
break;
+ case NDT_GLASSLIKE_FRAMED:
+ f->solidness = 0;
+ f->visual_solidness = 1;
+ break;
case NDT_ALLFACES:
f->solidness = 0;
f->visual_solidness = 1;
break;
}
- u8 material_type = 0;
- if(is_liquid){
- if(f->alpha == 255)
- material_type = TILE_MATERIAL_LIQUID_OPAQUE;
- else
- material_type = TILE_MATERIAL_LIQUID_TRANSPARENT;
- } else{
- material_type = TILE_MATERIAL_BASIC;
- }
+ u8 material_type;
+ if (is_liquid)
+ material_type = (f->alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
+ else
+ material_type = (f->alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
// Tiles (fill in f->tiles[])
for(u16 j=0; j<6; j++){
// item aliases too. Updated by updateAliases()
// Note: Not serialized.
std::map<std::string, content_t> m_name_id_mapping_with_aliases;
+ // A mapping from groups to a list of content_ts (and their levels)
+ // that belong to it. Necessary for a direct lookup in getIds().
+ // Note: Not serialized.
+ std::map<std::string, GroupItems> m_group_to_items;
};
IWritableNodeDefManager* createNodeDefManager()
writeF1000(os, visual_scale);
writeU8(os, 6);
for(u32 i=0; i<6; i++)
- tiledef[i].serialize(os);
+ tiledef[i].serialize(os, protocol_version);
writeU8(os, CF_SPECIAL_COUNT);
for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
- tiledef_special[i].serialize(os);
+ tiledef_special[i].serialize(os, protocol_version);
}
writeU8(os, alpha);
writeU8(os, post_effect_color.getAlpha());