X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Finventory.h;h=07d81a3f7eecb77c8575616bd87a763d447357f4;hb=7985d746f97ce1b37b6ca48a8a3e7ed70d02e4b0;hp=e7c7adaee3b3d194d2b6572d52a7f7f1606f69e9;hpb=64b59757322e29c331c0a75262baec4382673e6f;p=dragonfireclient.git diff --git a/src/inventory.h b/src/inventory.h index e7c7adaee..07d81a3f7 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -35,6 +35,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #define QUANTITY_ITEM_MAX_COUNT 99 +class ServerActiveObject; +class ServerEnvironment; + class InventoryItem { public: @@ -54,6 +57,14 @@ class InventoryItem #endif // Shall return a text to show in the GUI virtual std::string getText() { return ""; } + // 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(){ return getCount(); } + + /* + Quantity methods + */ // Shall return true if the item can be add()ed to the other virtual bool addableTo(InventoryItem *other) @@ -61,9 +72,6 @@ class InventoryItem return false; } - /* - Quantity methods - */ u16 getCount() { return m_count; @@ -72,6 +80,7 @@ class InventoryItem { m_count = count; } + // This should return something else for stackable items virtual u16 freeSpace() { return 0; @@ -87,6 +96,16 @@ class InventoryItem m_count -= count; } + /* + Other properties + */ + // Whether it can be cooked + virtual bool isCookable(){return false;} + // Time of cooking + virtual float getCookTime(){return 3.0;} + // Result of cooking + virtual InventoryItem *createCookResult(){return NULL;} + protected: u16 m_count; }; @@ -122,12 +141,8 @@ class MaterialItem : public InventoryItem #ifndef SERVER video::ITexture * getImage() { - /*if(m_content >= USEFUL_CONTENT_COUNT) - return NULL; - - return g_irrlicht->getTexture(g_content_inventory_texture_paths[m_content]);*/ - - return g_irrlicht->getTexture(content_features(m_content).inventory_texture); + return content_features(m_content).inventory_texture; + return NULL; } #endif std::string getText() @@ -152,6 +167,11 @@ class MaterialItem : public InventoryItem return 0; return QUANTITY_ITEM_MAX_COUNT - m_count; } + /* + Other properties + */ + bool isCookable(); + InventoryItem *createCookResult(); /* Special methods */ @@ -163,6 +183,7 @@ class MaterialItem : public InventoryItem u8 m_content; }; +//TODO: Remove class MapBlockObjectItem : public InventoryItem { public: @@ -250,22 +271,7 @@ class CraftItem : public InventoryItem return new CraftItem(m_subname, m_count); } #ifndef SERVER - video::ITexture * getImage() - { - std::string name; - - if(m_subname == "Stick") - name = "stick.png"; - else if(m_subname == "lump_of_coal") - name = "lump_of_coal.png"; - else if(m_subname == "lump_of_iron") - name = "lump_of_iron.png"; - else - name = "cloud.png"; - - // Get such a texture - return g_irrlicht->getTexture(name); - } + video::ITexture * getImage(); #endif std::string getText() { @@ -273,6 +279,10 @@ class CraftItem : public InventoryItem os<getName()) != "CraftItem") @@ -288,6 +298,11 @@ class CraftItem : public InventoryItem return 0; return QUANTITY_ITEM_MAX_COUNT - m_count; } + /* + Other properties + */ + bool isCookable(); + InventoryItem *createCookResult(); /* Special methods */ @@ -330,13 +345,36 @@ class ToolItem : public InventoryItem #ifndef SERVER video::ITexture * getImage() { + if(g_texturesource == NULL) + return NULL; + std::string basename; if(m_toolname == "WPick") - basename = "tool_wpick.png"; + basename = "tool_woodpick.png"; else if(m_toolname == "STPick") - basename = "tool_stpick.png"; + basename = "tool_stonepick.png"; + else if(m_toolname == "SteelPick") + basename = "tool_steelpick.png"; else if(m_toolname == "MesePick") basename = "tool_mesepick.png"; + else if(m_toolname == "WShovel") + basename = "tool_woodshovel.png"; + else if(m_toolname == "STShovel") + basename = "tool_stoneshovel.png"; + else if(m_toolname == "SteelShovel") + basename = "tool_steelshovel.png"; + else if(m_toolname == "WAxe") + basename = "tool_woodaxe.png"; + else if(m_toolname == "STAxe") + basename = "tool_stoneaxe.png"; + else if(m_toolname == "SteelAxe") + basename = "tool_steelaxe.png"; + else if(m_toolname == "WSword") + basename = "tool_woodsword.png"; + else if(m_toolname == "STSword") + basename = "tool_stonesword.png"; + else if(m_toolname == "SteelSword") + basename = "tool_steelsword.png"; else basename = "cloud.png"; @@ -349,29 +387,9 @@ class ToolItem : public InventoryItem float value_f = (float)toolprogress / (float)maxprogress; std::ostringstream os; - os<<"[progressbar"<getTextureId(basename)); - spec.addTid(g_irrlicht->getTextureId(os.str())); - return g_irrlicht->getTexture(spec); - - /*// Make texture name for the new texture with a progress bar - float value_f = (float)toolprogress / (float)maxprogress; - std::ostringstream os; - os<getTexture(os.str());*/ - - /*// Make texture name for the new texture with a progress bar - std::ostringstream os; - os<getTexture(TextureSpec(finalname, basename, mod));*/ + return g_texturesource->getTextureRaw(os.str()); } #endif std::string getText() @@ -440,6 +458,10 @@ class InventoryList u32 getSize(); // Count used slots u32 getUsedSlots(); + u32 getFreeSlots(); + + /*bool getDirty(){ return m_dirty; } + void setDirty(bool dirty=true){ m_dirty = dirty; }*/ // Get pointer to item InventoryItem * getItem(u32 i); @@ -447,6 +469,7 @@ class InventoryList InventoryItem * changeItem(u32 i, InventoryItem *newitem); // Delete item void deleteItem(u32 i); + // Adds an item to a suitable place. Returns leftover item. // If all went into the list, returns NULL. InventoryItem * addItem(InventoryItem *newitem); @@ -457,6 +480,9 @@ class InventoryList // If can be added fully, NULL is returned. InventoryItem * addItem(u32 i, InventoryItem *newitem); + // Checks whether the item could be added to the given slot + bool itemFits(u32 i, InventoryItem *newitem); + // Takes some items from a slot. // If there are not enough, takes as many as it can. // Returns NULL if couldn't take any. @@ -471,6 +497,7 @@ class InventoryList core::array m_items; u32 m_size; std::string m_name; + //bool m_dirty; }; class Inventory @@ -507,6 +534,41 @@ class Inventory core::array m_lists; }; +class Player; + +struct InventoryContext +{ + Player *current_player; + + InventoryContext(): + current_player(NULL) + {} +}; + +class InventoryAction; + +class InventoryManager +{ +public: + InventoryManager(){} + virtual ~InventoryManager(){} + + /* + Get a pointer to an inventory specified by id. + id can be: + - "current_player" + - "nodemeta:X,Y,Z" + */ + virtual Inventory* getInventory(InventoryContext *c, std::string id) + {return NULL;} + // Used on the server by InventoryAction::apply and other stuff + virtual void inventoryModified(InventoryContext *c, std::string id) + {} + // Used on the client + virtual void inventoryAction(InventoryAction *a) + {} +}; + #define IACTION_MOVE 0 struct InventoryAction @@ -515,16 +577,18 @@ struct InventoryAction virtual u16 getType() const = 0; virtual void serialize(std::ostream &os) = 0; - virtual void apply(Inventory *inventory) = 0; + virtual void apply(InventoryContext *c, InventoryManager *mgr) = 0; }; struct IMoveAction : public InventoryAction { // count=0 means "everything" u16 count; - std::string from_name; + std::string from_inv; + std::string from_list; s16 from_i; - std::string to_name; + std::string to_inv; + std::string to_list; s16 to_i; IMoveAction() @@ -540,12 +604,16 @@ struct IMoveAction : public InventoryAction std::getline(is, ts, ' '); count = stoi(ts); - std::getline(is, from_name, ' '); + std::getline(is, from_inv, ' '); + + std::getline(is, from_list, ' '); std::getline(is, ts, ' '); from_i = stoi(ts); - std::getline(is, to_name, ' '); + std::getline(is, to_inv, ' '); + + std::getline(is, to_list, ' '); std::getline(is, ts, ' '); to_i = stoi(ts); @@ -560,14 +628,62 @@ struct IMoveAction : public InventoryAction { os<<"Move "; os<