diff --git a/src/content_cao.cpp b/src/content_cao.cpp index da68004ce..0531fe489 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -183,12 +183,16 @@ public: {return &m_selection_box;} v3f getPosition() {return m_position;} + + std::string infoText() + {return m_infotext;} private: core::aabbox3d 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 + "'"; + } } /* diff --git a/src/inventory.cpp b/src/inventory.cpp index 1e1e27c82..a913430e6 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -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(); diff --git a/src/inventory.h b/src/inventory.h index 93a29764c..3f3c5435b 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -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 {