diff options
-rw-r--r-- | src/content_nodemeta.cpp | 8 | ||||
-rw-r--r-- | src/content_nodemeta.h | 8 | ||||
-rw-r--r-- | src/nodemetadata.cpp | 50 | ||||
-rw-r--r-- | src/nodemetadata.h | 8 |
4 files changed, 61 insertions, 13 deletions
diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp index ab9849668..25ad3f0fd 100644 --- a/src/content_nodemeta.cpp +++ b/src/content_nodemeta.cpp @@ -38,7 +38,7 @@ SignNodeMetadata::SignNodeMetadata(IGameDef *gamedef, std::string text): NodeMetadata(gamedef), m_text(text) { - NodeMetadata::registerType(typeId(), create); + NodeMetadata::registerType(typeId(), typeName(), create); } u16 SignNodeMetadata::typeId() const { @@ -72,7 +72,7 @@ ChestNodeMetadata proto_ChestNodeMetadata(NULL); ChestNodeMetadata::ChestNodeMetadata(IGameDef *gamedef): NodeMetadata(gamedef) { - NodeMetadata::registerType(typeId(), create); + NodeMetadata::registerType(typeId(), typeName(), create); m_inventory = new Inventory(); m_inventory->addList("0", 8*4); @@ -135,7 +135,7 @@ LockingChestNodeMetadata proto_LockingChestNodeMetadata(NULL); LockingChestNodeMetadata::LockingChestNodeMetadata(IGameDef *gamedef): NodeMetadata(gamedef) { - NodeMetadata::registerType(typeId(), create); + NodeMetadata::registerType(typeId(), typeName(), create); m_inventory = new Inventory(); m_inventory->addList("0", 8*4); @@ -200,7 +200,7 @@ FurnaceNodeMetadata proto_FurnaceNodeMetadata(NULL); FurnaceNodeMetadata::FurnaceNodeMetadata(IGameDef *gamedef): NodeMetadata(gamedef) { - NodeMetadata::registerType(typeId(), create); + NodeMetadata::registerType(typeId(), typeName(), create); m_inventory = new Inventory(); m_inventory->addList("fuel", 1); diff --git a/src/content_nodemeta.h b/src/content_nodemeta.h index 86df882ea..2535e985e 100644 --- a/src/content_nodemeta.h +++ b/src/content_nodemeta.h @@ -31,6 +31,8 @@ public: //~SignNodeMetadata(); virtual u16 typeId() const; + virtual const char* typeName() const + { return "sign"; } static NodeMetadata* create(std::istream &is, IGameDef *gamedef); virtual NodeMetadata* clone(IGameDef *gamedef); virtual void serializeBody(std::ostream &os); @@ -51,6 +53,8 @@ public: ~ChestNodeMetadata(); virtual u16 typeId() const; + virtual const char* typeName() const + { return "chest"; } static NodeMetadata* create(std::istream &is, IGameDef *gamedef); virtual NodeMetadata* clone(IGameDef *gamedef); virtual void serializeBody(std::ostream &os); @@ -70,6 +74,8 @@ public: ~LockingChestNodeMetadata(); virtual u16 typeId() const; + virtual const char* typeName() const + { return "locked_chest"; } static NodeMetadata* create(std::istream &is, IGameDef *gamedef); virtual NodeMetadata* clone(IGameDef *gamedef); virtual void serializeBody(std::ostream &os); @@ -93,6 +99,8 @@ public: ~FurnaceNodeMetadata(); virtual u16 typeId() const; + virtual const char* typeName() const + { return "furnace"; } virtual NodeMetadata* clone(IGameDef *gamedef); static NodeMetadata* create(std::istream &is, IGameDef *gamedef); virtual void serializeBody(std::ostream &os); 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); + } } /* diff --git a/src/nodemetadata.h b/src/nodemetadata.h index 9eb08678a..67b80b642 100644 --- a/src/nodemetadata.h +++ b/src/nodemetadata.h @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef NODEMETADATA_HEADER #define NODEMETADATA_HEADER -#include "common_irrlicht.h" +#include "irrlichttypes.h" #include <string> #include <iostream> @@ -44,11 +44,12 @@ public: NodeMetadata(IGameDef *gamedef); virtual ~NodeMetadata(); + static NodeMetadata* create(const std::string &name, IGameDef *gamedef); static NodeMetadata* deSerialize(std::istream &is, IGameDef *gamedef); void serialize(std::ostream &os); - // This usually is the CONTENT_ value virtual u16 typeId() const = 0; + virtual const char* typeName() const = 0; virtual NodeMetadata* clone(IGameDef *gamedef) = 0; virtual void serializeBody(std::ostream &os) = 0; virtual std::string infoText() {return "";} @@ -69,10 +70,11 @@ public: virtual std::string getText(){ return ""; } virtual void setText(const std::string &t){} protected: - static void registerType(u16 id, Factory f); + static void registerType(u16 id, const std::string &name, Factory f); IGameDef *m_gamedef; private: static core::map<u16, Factory> m_types; + static core::map<std::string, Factory> m_names; }; /* |