summaryrefslogtreecommitdiff
path: root/src/nodemetadata.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-25 15:17:54 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-29 19:13:50 +0200
commit3b3ca65562375b3cfdf8919acae8c3259df05c91 (patch)
treeccf15b1acd9b6bc1bbbd809f0fa7b0875c51d4f6 /src/nodemetadata.cpp
parent697ff926ce62ad1800159246a66e4bf629b61194 (diff)
downloadminetest-3b3ca65562375b3cfdf8919acae8c3259df05c91.tar.gz
minetest-3b3ca65562375b3cfdf8919acae8c3259df05c91.tar.bz2
minetest-3b3ca65562375b3cfdf8919acae8c3259df05c91.zip
Add names to NodeMetadata
Diffstat (limited to 'src/nodemetadata.cpp')
-rw-r--r--src/nodemetadata.cpp50
1 files changed, 44 insertions, 6 deletions
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index ef6ea1cd2..2f47aba22 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
core::map<u16, NodeMetadata::Factory> NodeMetadata::m_types;
+core::map<std::string, NodeMetadata::Factory> NodeMetadata::m_names;
NodeMetadata::NodeMetadata(IGameDef *gamedef):
m_gamedef(gamedef)
@@ -41,6 +42,36 @@ NodeMetadata::~NodeMetadata()
{
}
+NodeMetadata* NodeMetadata::create(const std::string &name, IGameDef *gamedef)
+{
+ // Find factory function
+ core::map<std::string, Factory>::Node *n;
+ n = m_names.find(name);
+ if(n == NULL)
+ {
+ // If factory is not found, just return.
+ errorstream<<"WARNING: NodeMetadata: No factory for name=\""
+ <<name<<"\""<<std::endl;
+ return NULL;
+ }
+
+ // Try to load the metadata. If it fails, just return.
+ try
+ {
+ std::istringstream iss("", std::ios_base::binary);
+
+ Factory f = n->getValue();
+ NodeMetadata *meta = (*f)(iss, gamedef);
+ return meta;
+ }
+ catch(SerializationError &e)
+ {
+ errorstream<<"NodeMetadata: SerializationError "
+ <<"while creating name=\""<<name<<"\""<<std::endl;
+ return NULL;
+ }
+}
+
NodeMetadata* NodeMetadata::deSerialize(std::istream &is, IGameDef *gamedef)
{
// Read id
@@ -89,13 +120,20 @@ void NodeMetadata::serialize(std::ostream &os)
os<<serializeString(oss.str());
}
-void NodeMetadata::registerType(u16 id, Factory f)
+void NodeMetadata::registerType(u16 id, const std::string &name, Factory f)
{
- core::map<u16, Factory>::Node *n;
- n = m_types.find(id);
- if(n)
- return;
- m_types.insert(id, f);
+ { // typeId
+ core::map<u16, Factory>::Node *n;
+ n = m_types.find(id);
+ if(!n)
+ m_types.insert(id, f);
+ }
+ { // typeName
+ core::map<std::string, Factory>::Node *n;
+ n = m_names.find(name);
+ if(!n)
+ m_names.insert(name, f);
+ }
}
/*