#ifndef NODEMETADATA_HEADER
#define NODEMETADATA_HEADER
-#include "common_irrlicht.h"
+#include "irrlichttypes.h"
#include <string>
#include <iostream>
+#include <map>
/*
- Used for storing:
+ NodeMetadata stores arbitary amounts of data for special blocks.
+ Used for furnaces, chests and signs.
- Oven:
- - Item that is being burned
- - Burning time
- - Item stack that is being heated
- - Result item stack
-
- Sign:
- - Text
+ There are two interaction methods: inventory menu and text input.
+ Only one can be used for a single metadata, thus only inventory OR
+ text input should exist in a metadata.
*/
class Inventory;
+class IGameDef;
class NodeMetadata
{
public:
- typedef NodeMetadata* (*Factory)(std::istream&);
-
- NodeMetadata();
- virtual ~NodeMetadata();
+ NodeMetadata(IGameDef *gamedef);
+ ~NodeMetadata();
- static NodeMetadata* deSerialize(std::istream &is);
- void serialize(std::ostream &os);
+ void serialize(std::ostream &os) const;
+ void deSerialize(std::istream &is);
- // This usually is the CONTENT_ value
- virtual u16 typeId() const = 0;
- virtual NodeMetadata* clone() = 0;
- virtual void serializeBody(std::ostream &os) = 0;
- virtual std::string infoText() {return "";}
- virtual Inventory* getInventory() {return NULL;}
- // This is called always after the inventory is modified, before
- // the changes are copied elsewhere
- virtual void inventoryModified(){}
- // A step in time. Returns true if metadata changed.
- virtual bool step(float dtime) {return false;}
- virtual bool nodeRemovalDisabled(){return false;}
- // Used to make custom inventory menus.
+ void clear();
+
+ // Generic key/value store
+ std::string getString(const std::string &name) const
+ {
+ std::map<std::string, std::string>::const_iterator i;
+ i = m_stringvars.find(name);
+ if(i == m_stringvars.end())
+ return "";
+ return i->second;
+ }
+ void setString(const std::string &name, const std::string &var)
+ {
+ if(var.empty())
+ m_stringvars.erase(name);
+ else
+ m_stringvars[name] = var;
+ }
+
+ // The inventory
+ Inventory* getInventory()
+ {
+ return m_inventory;
+ }
+
+ // If non-empty, player can interact by using an inventory view
// See format in guiInventoryMenu.cpp.
- virtual std::string getInventoryDrawSpecString(){return "";}
- // primarily used for locking chests, but others can play too
- virtual std::string getOwner(){ return std::string(""); }
- virtual void setOwner(std::string t){ }
+ std::string getInventoryDrawSpec() const
+ {
+ return m_inventorydrawspec;
+ }
+ void setInventoryDrawSpec(const std::string &text)
+ {
+ m_inventorydrawspec = text;
+ }
+
+ // If non-empty, player can interact by using an form view
+ // See format in guiFormMenu.cpp.
+ std::string getFormSpec() const
+ {
+ return m_formspec;
+ }
+ void setFormSpec(const std::string &text)
+ {
+ m_formspec = text;
+ }
+
+ // Called on client-side; shown on screen when pointed at
+ std::string getInfoText() const
+ {
+ return m_infotext;
+ }
+ void setInfoText(const std::string &text)
+ {
+ m_infotext = text;
+ }
+
+ // Whether the related node and this metadata can be removed
+ bool getAllowRemoval() const
+ {
+ return m_allow_removal;
+ }
+ void setAllowRemoval(bool b)
+ {
+ m_allow_removal = b;
+ }
-protected:
- static void registerType(u16 id, Factory f);
private:
- static core::map<u16, Factory> m_types;
+ std::map<std::string, std::string> m_stringvars;
+ Inventory *m_inventory;
+ std::string m_inventorydrawspec;
+ std::string m_formspec;
+ std::string m_infotext;
+ bool m_allow_removal;
};
+
/*
List of metadata of all the nodes of a block
*/
public:
~NodeMetadataList();
- void serialize(std::ostream &os);
- void deSerialize(std::istream &is);
+ void serialize(std::ostream &os) const;
+ void deSerialize(std::istream &is, IGameDef *gamedef);
// Get pointer to data
NodeMetadata* get(v3s16 p);
void remove(v3s16 p);
// Deletes old data and sets a new one
void set(v3s16 p, NodeMetadata *d);
+ // Deletes all
+ void clear();
- // A step in time. Returns true if something changed.
- bool step(float dtime);
-
private:
- core::map<v3s16, NodeMetadata*> m_data;
+ std::map<v3s16, NodeMetadata*> m_data;
};
#endif