From e494b5d422609b9ed9f79cc39b401f40b6a3ec9a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 3 Dec 2011 13:46:19 +0200 Subject: [PATCH] Show infotext for unknown items placed on ground --- src/content_cao.cpp | 26 +++++++++++++++++++++++++- src/inventory.cpp | 14 ++++++++++++++ src/inventory.h | 7 +++++++ 3 files changed, 46 insertions(+), 1 deletion(-) 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 { -- 2.25.1