X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Finventory.h;h=93a29764c9a01a1caa16ac22b59136510489aadd;hb=392485aa454e871566a67afc61e11331f9d27397;hp=b9de48f9af641de8189b54ac13cf0463cc27a23b;hpb=6a417c538f0af9e611d6f94cfb12d36f51982db8;p=minetest.git diff --git a/src/inventory.h b/src/inventory.h index b9de48f9a..93a29764c 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class ServerActiveObject; class ServerEnvironment; +struct PointedThing; class ITextureSource; class IGameDef; @@ -41,6 +42,8 @@ class InventoryItem virtual ~InventoryItem(); static InventoryItem* deSerialize(std::istream &is, IGameDef *gamedef); + static InventoryItem* deSerialize(const std::string &str, + IGameDef *gamedef); virtual const char* getName() const = 0; // Shall write the name and the parameters @@ -51,47 +54,47 @@ class InventoryItem virtual std::string getImageBasename() const { return ""; } #ifndef SERVER // Shall return an image of the item (or NULL) - virtual video::ITexture * getImage(ITextureSource *tsrc) const + virtual video::ITexture * getImage() const { return NULL; } // Shall return an image of the item without embellishments (or NULL) - virtual video::ITexture * getImageRaw(ITextureSource *tsrc) const - { return getImage(tsrc); } + virtual video::ITexture * getImageRaw() const + { return getImage(); } #endif // Shall return a text to show in the GUI virtual std::string getText() { return ""; } // Returns the string used for inventory virtual std::string getItemString(); - // Creates an object from the item, to be placed in the world. - virtual ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos); - // Gets amount of items that dropping one SAO will decrement - virtual u16 getDropCount() const { return getCount(); } /* Quantity methods */ - // Shall return true if the item can be add()ed to the other + // Return true if the item can be add()ed to the other virtual bool addableTo(const InventoryItem *other) const - { - return false; - } + { return false; } + // Return true if the other item contains this item + virtual bool isSubsetOf(const InventoryItem *other) const + { return false; } + // Remove the other item from this one if possible and return true + // Return false if not possible + virtual bool removeOther(const InventoryItem *other) + { return false; } u16 getCount() const - { - return m_count; - } + { return m_count; } void setCount(u16 count) + { m_count = count; } + + u16 freeSpace() const { - m_count = count; - } - // This should return something else for stackable items - virtual u16 freeSpace() const - { - return 0; + u16 max = getStackMax(); + if(m_count > max) + return 0; + return max - m_count; } + void add(u16 count) { - assert(m_count + count <= QUANTITY_ITEM_MAX_COUNT); m_count += count; } void remove(u16 count) @@ -104,6 +107,10 @@ class InventoryItem Other properties */ + // Maximum size of a stack + virtual u16 getStackMax() const {return 1;} + // Whether it can be used + virtual bool isUsable() const {return false;} // Whether it can be cooked virtual bool isCookable() const {return false;} // Result of cooking (can randomize) @@ -112,12 +119,24 @@ class InventoryItem virtual float getCookTime() const {return 3.0;} // Whether it can be burned (<0 = cannot be burned) virtual float getBurnTime() const {return -1;} - + // Gets amount of items that dropping one ItemSAO will decrement + // -1 means as many as possible + virtual s16 getDropCount() const { return -1; } + // Whether this item can point to liquids + virtual bool areLiquidsPointable() const { return false; } + + // Creates an object from the item and places it in the world. + // If return value is true, item should be removed. + virtual bool dropOrPlace(ServerEnvironment *env, + ServerActiveObject *dropper, + v3f pos, bool place, s16 count); + // Eat, press, activate, whatever. - // Called when item is right-clicked when lying on ground. + // Called when item is left-clicked while in hand. // If returns true, item shall be deleted. virtual bool use(ServerEnvironment *env, - ServerActiveObject *user){return false;} + ServerActiveObject *user, + const PointedThing& pointed){return false;} protected: IGameDef *m_gamedef; @@ -127,11 +146,9 @@ class InventoryItem class MaterialItem : public InventoryItem { public: - MaterialItem(IGameDef *gamedef, content_t content, u16 count): - InventoryItem(gamedef, count) - { - m_content = content; - } + MaterialItem(IGameDef *gamedef, std::string nodename, u16 count); + // Legacy constructor + MaterialItem(IGameDef *gamedef, content_t content, u16 count); /* Implementation interface */ @@ -141,19 +158,18 @@ class MaterialItem : public InventoryItem } virtual void serialize(std::ostream &os) const { - //os.imbue(std::locale("C")); - os<<"MaterialItem2"; - os<<" "; - os<<(unsigned int)m_content; - os<<" "; + os<<"node"; + os<<" \""; + os<getName()) != "MaterialItem") return false; MaterialItem *m = (MaterialItem*)other; - if(m->getMaterial() != m_content) + if(m->m_nodename != m_nodename) return false; return true; } - u16 freeSpace() const + virtual bool isSubsetOf(const InventoryItem *other) const { - if(m_count > QUANTITY_ITEM_MAX_COUNT) - return 0; - return QUANTITY_ITEM_MAX_COUNT - m_count; + if(std::string(other->getName()) != "MaterialItem") + return false; + MaterialItem *m = (MaterialItem*)other; + if(m->m_nodename != m_nodename) + return false; + return m_count <= m->m_count; } + virtual bool removeOther(const InventoryItem *other) + { + if(!other->isSubsetOf(this)) + return false; + MaterialItem *m = (MaterialItem*)other; + m_count += m->m_count; + return true; + } + + u16 getStackMax() const + { + return QUANTITY_ITEM_MAX_COUNT; + } + /* Other properties */ @@ -185,14 +218,13 @@ class MaterialItem : public InventoryItem float getCookTime() const; float getBurnTime() const; /* - Special methods + Special properties (not part of virtual interface) */ - content_t getMaterial() - { - return m_content; - } + std::string getNodeName() const + { return m_nodename; } + content_t getMaterial() const; private: - content_t m_content; + std::string m_nodename; }; /* @@ -217,10 +249,10 @@ class CraftItem : public InventoryItem } virtual void serialize(std::ostream &os) const { - os<getName()) != "CraftItem") @@ -249,24 +278,44 @@ class CraftItem : public InventoryItem return false; return true; } - u16 freeSpace() const + virtual bool isSubsetOf(const InventoryItem *other) const { - if(m_count > QUANTITY_ITEM_MAX_COUNT) - return 0; - return QUANTITY_ITEM_MAX_COUNT - m_count; + if(std::string(other->getName()) != "CraftItem") + return false; + CraftItem *m = (CraftItem*)other; + if(m->m_subname != m_subname) + return false; + return m_count <= m->m_count; + } + virtual bool removeOther(const InventoryItem *other) + { + if(!other->isSubsetOf(this)) + return false; + CraftItem *m = (CraftItem*)other; + m_count += m->m_count; + return true; } /* Other properties */ + u16 getStackMax() const; + bool isUsable() const; bool isCookable() const; InventoryItem *createCookResult() const; float getCookTime() const; float getBurnTime() const; + s16 getDropCount() const; + bool areLiquidsPointable() const; + + bool dropOrPlace(ServerEnvironment *env, + ServerActiveObject *dropper, + v3f pos, bool place, s16 count); + bool use(ServerEnvironment *env, + ServerActiveObject *user, + const PointedThing& pointed); - bool use(ServerEnvironment *env, ServerActiveObject *user); - /* Special methods */ @@ -296,10 +345,10 @@ class ToolItem : public InventoryItem } virtual void serialize(std::ostream &os) const { - os<getName()) != "ToolItem") + return false; + ToolItem *m = (ToolItem*)other; + if(m->m_toolname != m_toolname) + return false; + return m_wear <= m->m_wear; + } + virtual bool removeOther(const InventoryItem *other) + { + if(!other->isSubsetOf(this)) + return false; + ToolItem *m = (ToolItem*)other; + m_wear -= m->m_wear; + return true; + } + /* Special methods */ @@ -499,6 +551,7 @@ class InventoryManager }; #define IACTION_MOVE 0 +#define IACTION_DROP 1 struct InventoryAction { @@ -506,7 +559,8 @@ struct InventoryAction virtual u16 getType() const = 0; virtual void serialize(std::ostream &os) const = 0; - virtual void apply(InventoryContext *c, InventoryManager *mgr) = 0; + virtual void apply(InventoryContext *c, InventoryManager *mgr, + ServerEnvironment *env) = 0; }; struct IMoveAction : public InventoryAction @@ -546,7 +600,42 @@ struct IMoveAction : public InventoryAction os<