Show infotext for unknown items placed on ground
authorPerttu Ahola <celeron55@gmail.com>
Sat, 3 Dec 2011 11:46:19 +0000 (13:46 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 3 Dec 2011 11:46:19 +0000 (13:46 +0200)
src/content_cao.cpp
src/inventory.cpp
src/inventory.h

index da68004ce20159f4735bce442ed49df948ca1e77..0531fe489fa81e1f20ee47cf393c05cd11804118 100644 (file)
@@ -183,12 +183,16 @@ public:
                {return &m_selection_box;}
        v3f getPosition()
                {return m_position;}
+       
+       std::string infoText()
+               {return m_infotext;}
 
 private:
        core::aabbox3d<f32> m_selection_box;
        scene::IMeshSceneNode *m_node;
        v3f m_position;
        std::string m_inventorystring;
+       std::string m_infotext;
 };
 
 /*
@@ -530,7 +534,10 @@ ItemCAO::ItemCAO(IGameDef *gamedef, ClientEnvironment *env):
        m_node(NULL),
        m_position(v3f(0,10*BS,0))
 {
-       ClientActiveObject::registerType(getType(), create);
+       if(!gamedef && !env)
+       {
+               ClientActiveObject::registerType(getType(), create);
+       }
 }
 
 ItemCAO::~ItemCAO()
@@ -694,6 +701,23 @@ void ItemCAO::initialize(const std::string &data)
        }
        
        updateNodePos();
+       
+       /*
+               Set infotext to item name if item cannot be deserialized
+       */
+       try{
+               InventoryItem *item = NULL;
+               item = InventoryItem::deSerialize(m_inventorystring, m_gamedef);
+               if(item){
+                       if(!item->isKnown())
+                               m_infotext = "Unknown item: '" + m_inventorystring + "'";
+               }
+               delete item;
+       }
+       catch(SerializationError &e)
+       {
+               m_infotext = "Unknown item: '" + m_inventorystring + "'";
+       }
 }
 
 /*
index 1e1e27c8240da0c39c907e4b5321a55fdbefd7b2..a913430e6a060d2ebf028e7d7286405dac6d07e2 100644 (file)
@@ -343,6 +343,13 @@ video::ITexture * ToolItem::getImageRaw() const
 }
 #endif
 
+bool ToolItem::isKnown() const
+{
+       IToolDefManager *tdef = m_gamedef->tdef();
+       const ToolDefinition *def = tdef->getToolDefinition(m_toolname);
+       return (def != NULL);
+}
+
 /*
        CraftItem
 */
@@ -357,6 +364,13 @@ video::ITexture * CraftItem::getImage() const
 }
 #endif
 
+bool CraftItem::isKnown() const
+{
+       ICraftItemDefManager *cidef = m_gamedef->cidef();
+       const CraftItemDefinition *def = cidef->getCraftItemDefinition(m_subname);
+       return (def != NULL);
+}
+
 u16 CraftItem::getStackMax() const
 {
        ICraftItemDefManager *cidef = m_gamedef->cidef();
index 93a29764c9a01a1caa16ac22b59136510489aadd..3f3c5435b4cc5e10da98c1c6b93026209dc6e519 100644 (file)
@@ -64,6 +64,9 @@ public:
        virtual std::string getText() { return ""; }
        // Returns the string used for inventory
        virtual std::string getItemString();
+       
+       // Shall return false if item is not known and cannot be used
+       virtual bool isKnown() const { return true; }
 
        /*
                Quantity methods
@@ -269,6 +272,8 @@ public:
                return os.str();
        }
 
+       virtual bool isKnown() const;
+
        virtual bool addableTo(const InventoryItem *other) const
        {
                if(std::string(other->getName()) != "CraftItem")
@@ -366,6 +371,8 @@ public:
        {
                return "";
        }
+       
+       virtual bool isKnown() const;
 
        virtual bool isSubsetOf(const InventoryItem *other) const
        {