Add names to NodeMetadata
authorPerttu Ahola <celeron55@gmail.com>
Fri, 25 Nov 2011 13:17:54 +0000 (15:17 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 29 Nov 2011 17:13:50 +0000 (19:13 +0200)
src/content_nodemeta.cpp
src/content_nodemeta.h
src/nodemetadata.cpp
src/nodemetadata.h

index ab98496688bfbf6956d513e60a8096dabfb638d9..25ad3f0fd801359773ac22f259a865a90f6bdae8 100644 (file)
@@ -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);
index 86df882ea697e5b7460d0c11d8272c092abe4aa8..2535e985e0cd80e700d10f38f759a08ea5103369 100644 (file)
@@ -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);
index ef6ea1cd2062b75ca248c8dd80b90f815edf9657..2f47aba22b184c9dd141170a129671537530ae3c 100644 (file)
@@ -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);
+       }
 }
 
 /*
index 9eb08678ad381be42d2655b3d6b1160278200607..67b80b64265b51fcb26bdcb3255b02dfb2c16a62 100644 (file)
@@ -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;
 };
 
 /*