aboutsummaryrefslogtreecommitdiff
path: root/src/inventorymanager.cpp
Commit message (Expand)AuthorAge
* Inventory: Fix rare out-of-bounds accessSmallJoker2021-08-23
* Fix wrong number of items in allow_metadata_inventory_put/take callbacks (#10...savilli2021-02-23
* Fix wrong reported item counts for inventory actions using Shift-Move (#10930)Lars Müller2021-02-21
* Fix inventory swapping not calling all callbacks (#9923)Lars Müller2020-09-04
* Move serveractiveobject & unitsaoLoic Blot2020-04-11
* Clean up craft replacements docsPaul Ouellette2019-12-07
* Inventory: Properly revert client predictions (#8945)SmallJoker2019-09-18
* Inventory: Undo prediction on dropSmallJoker2019-09-17
* Send cumulated inventory changes only each step (#8856)SmallJoker2019-09-09
* Optimize string (mis)handling (#8128)Jozef Behran2019-05-18
* Fix various code issues found by cppcheck (#7741)Paramat2018-09-23
* 'fix' LINT, use InventoryLocation==SmallJoker2018-04-02
* Run callback in IDropAction, refactor function argumentsSmallJoker2018-04-02
* Add player inventory callbacksSmallJoker2018-04-02
* Remove DSTACK support (#6346)Loïc Blot2017-08-30
* Optimize headers (part 2) (#6272)Loïc Blot2017-08-18
* Modernize various files (part 2)Loic Blot2017-08-18
* Player collisionbox: Make settableTeTpaAka2017-07-21
* C++11 cleanup inventorymanager (#6077)Vincent Glize2017-07-01
* Rename Scripting API files for consistencyShadowNinja2017-04-25
* [CSM] Client side moddingLoic Blot2017-03-13
* Move ServerEnvironment to dedicated cpp/header filesLoic Blot2017-01-08
* Move PP() and PP2() macros to basic_macros.hRogier2016-12-24
* Clean up StrfndShadowNinja2016-03-19
* Rename macros with two leading underscoresShadowNinja2015-10-14
* Change i++ to ++iDavid Jones2015-08-25
* Fix inventory replace bugest312015-08-19
* MoveItemSomewhere double bugfixest312015-07-19
* Inventory manager style cleanup and further checksest312015-07-01
* Add MoveSomewhere inventory actionest312015-06-23
* Fix bug when craft input isn't replacedTeTpaAka2015-06-22
* Move globals from main.cpp to more sane locationsCraig Robbins2015-04-01
* Don't send an InventoryAction at each setInventoryModified, we only need one ...Loic Blot2015-03-24
* For usages of assert() that are meant to persist in Release builds (when NDEB...Craig Robbins2015-03-07
* Performance fixes.onkrot2015-01-13
* Clean up rollbackShadowNinja2014-11-19
* Split settings into seperate source and header filesShadowNinja2014-09-21
* Add a callback: minetest.register_on_craft(itemstack, player,Novatux2013-11-01
* Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenuKahrl2013-08-14
* Move scriptapi to separate folder (by sapier)sapier2013-05-25
* Update Copyright YearsSfan52013-02-24
* Change Minetest-c55 to MinetestPilzAdam2013-02-24
* Fix moving stuff into a mismatched stack in a "infinite" inventoryPerttu Ahola2012-09-02
* Make inventory GUI do sane things when server-side inventory acts unusuallyPerttu Ahola2012-09-02
* Add InventoryList width property & allow custom crafting grids.Ilya Zhuravlev2012-09-01
* Fix wrong amount of nodes being dropped from inventoryPerttu Ahola2012-08-12
* Remove unwanted ! from ifs in inventory record-for-rollback codePerttu Ahola2012-08-12
* Fix inventory segfault when rollback recording is disabledPerttu Ahola2012-07-28
* Experimental-ish rollback functionalityPerttu Ahola2012-07-27
* Add special return value -1 to inventry callbacksPerttu Ahola2012-07-25
lass="hl com"> that the crafting input comes from. */ enum CraftMethod { // Crafting grid CRAFT_METHOD_NORMAL, // Cooking something in a furnace CRAFT_METHOD_COOKING, // Using something as fuel for a furnace CRAFT_METHOD_FUEL, }; /* Input: The contents of the crafting slots, arranged in matrix form */ struct CraftInput { CraftMethod method; unsigned int width; std::vector<ItemStack> items; CraftInput(): method(CRAFT_METHOD_NORMAL), width(0), items() {} CraftInput(CraftMethod method_, unsigned int width_, const std::vector<ItemStack> &items_): method(method_), width(width_), items(items_) {} std::string dump() const; }; /* Output: Result of crafting operation */ struct CraftOutput { // Used for normal crafting and cooking, itemstring std::string item; // Used for cooking (cook time) and fuel (burn time), seconds float time; CraftOutput(): item(""), time(0) {} CraftOutput(std::string item_, float time_): item(item_), time(time_) {} std::string dump() const; }; /* A list of replacements. A replacement indicates that a specific input item should not be deleted (when crafting) but replaced with a different item. Each replacements is a pair (itemstring to remove, itemstring to replace with) Example: If ("bucket:bucket_water", "bucket:bucket_empty") is a replacement pair, the crafting input slot that contained a water bucket will contain an empty bucket after crafting. Note: replacements only work correctly when stack_max of the item to be replaced is 1. It is up to the mod writer to ensure this. */ struct CraftReplacements { // List of replacements std::vector<std::pair<std::string, std::string> > pairs; CraftReplacements(): pairs() {} CraftReplacements(std::vector<std::pair<std::string, std::string> > pairs_): pairs(pairs_) {} std::string dump() const; void serialize(std::ostream &os) const; void deSerialize(std::istream &is); }; /* Crafting definition base class */ class CraftDefinition { public: CraftDefinition(){} virtual ~CraftDefinition(){} void serialize(std::ostream &os) const; static CraftDefinition* deSerialize(std::istream &is); // Returns type of crafting definition virtual std::string getName() const=0; // Checks whether the recipe is applicable virtual bool check(const CraftInput &input, IGameDef *gamedef) const=0; // Returns the output structure, meaning depends on crafting method // The implementation can assume that check(input) returns true virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const=0; // the inverse of the above virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const=0; // Decreases count of every input item virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const=0; virtual std::string dump() const=0; protected: virtual void serializeBody(std::ostream &os) const=0; virtual void deSerializeBody(std::istream &is, int version)=0; }; /* A plain-jane (shaped) crafting definition Supported crafting method: CRAFT_METHOD_NORMAL. Requires the input items to be arranged exactly like in the recipe. */ class CraftDefinitionShaped: public CraftDefinition { public: CraftDefinitionShaped(): output(""), width(1), recipe(), replacements() {} CraftDefinitionShaped( const std::string &output_, unsigned int width_, const std::vector<std::string> &recipe_, const CraftReplacements &replacements_): output(output_), width(width_), recipe(recipe_), replacements(replacements_) {} virtual ~CraftDefinitionShaped(){} virtual std::string getName() const; virtual bool check(const CraftInput &input, IGameDef *gamedef) const; virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const; virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const; virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const; virtual std::string dump() const; protected: virtual void serializeBody(std::ostream &os) const; virtual void deSerializeBody(std::istream &is, int version); private: // Output itemstring std::string output; // Width of recipe unsigned int width; // Recipe matrix (itemstrings) std::vector<std::string> recipe; // Replacement items for decrementInput() CraftReplacements replacements; }; /* A shapeless crafting definition Supported crafting method: CRAFT_METHOD_NORMAL. Input items can arranged in any way. */ class CraftDefinitionShapeless: public CraftDefinition { public: CraftDefinitionShapeless(): output(""), recipe(), replacements() {} CraftDefinitionShapeless( const std::string &output_, const std::vector<std::string> &recipe_, const CraftReplacements &replacements_): output(output_), recipe(recipe_), replacements(replacements_) {} virtual ~CraftDefinitionShapeless(){} virtual std::string getName() const; virtual bool check(const CraftInput &input, IGameDef *gamedef) const; virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const; virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const; virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const; virtual std::string dump() const; protected: virtual void serializeBody(std::ostream &os) const; virtual void deSerializeBody(std::istream &is, int version); private: // Output itemstring std::string output; // Recipe list (itemstrings) std::vector<std::string> recipe; // Replacement items for decrementInput() CraftReplacements replacements; }; /* Tool repair crafting definition Supported crafting method: CRAFT_METHOD_NORMAL. Put two damaged tools into the crafting grid, get one tool back. There should only be one crafting definition of this type. */ class CraftDefinitionToolRepair: public CraftDefinition { public: CraftDefinitionToolRepair(): additional_wear(0) {} CraftDefinitionToolRepair(float additional_wear_): additional_wear(additional_wear_) {} virtual ~CraftDefinitionToolRepair(){} virtual std::string getName() const; virtual bool check(const CraftInput &input, IGameDef *gamedef) const; virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const; virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const; virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const; virtual std::string dump() const; protected: virtual void serializeBody(std::ostream &os) const; virtual void deSerializeBody(std::istream &is, int version); private: // This is a constant that is added to the wear of the result. // May be positive or negative, allowed range [-1,1]. // 1 = new tool is completely broken // 0 = simply add remaining uses of both input tools // -1 = new tool is completely pristine float additional_wear; }; /* A cooking (in furnace) definition Supported crafting method: CRAFT_METHOD_COOKING. */ class CraftDefinitionCooking: public CraftDefinition { public: CraftDefinitionCooking(): output(""), recipe(""), cooktime() {} CraftDefinitionCooking( const std::string &output_, const std::string &recipe_, float cooktime_, const CraftReplacements &replacements_): output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_) {} virtual ~CraftDefinitionCooking(){} virtual std::string getName() const; virtual bool check(const CraftInput &input, IGameDef *gamedef) const; virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const; virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const; virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const; virtual std::string dump() const; protected: virtual void serializeBody(std::ostream &os) const; virtual void deSerializeBody(std::istream &is, int version); private: // Output itemstring std::string output; // Recipe itemstring std::string recipe; // Time in seconds float cooktime; // Replacement items for decrementInput() CraftReplacements replacements; }; /* A fuel (for furnace) definition Supported crafting method: CRAFT_METHOD_FUEL. */ class CraftDefinitionFuel: public CraftDefinition { public: CraftDefinitionFuel(): recipe(""), burntime() {} CraftDefinitionFuel(std::string recipe_, float burntime_, const CraftReplacements &replacements_): recipe(recipe_), burntime(burntime_), replacements(replacements_) {} virtual ~CraftDefinitionFuel(){} virtual std::string getName() const; virtual bool check(const CraftInput &input, IGameDef *gamedef) const; virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const; virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const; virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const; virtual std::string dump() const; protected: virtual void serializeBody(std::ostream &os) const; virtual void deSerializeBody(std::istream &is, int version); private: // Recipe itemstring std::string recipe; // Time in seconds float burntime; // Replacement items for decrementInput() CraftReplacements replacements; }; /* Crafting definition manager */ class ICraftDefManager { public: ICraftDefManager(){} virtual ~ICraftDefManager(){} // The main crafting function virtual bool getCraftResult(CraftInput &input, CraftOutput &output, bool decrementInput, IGameDef *gamedef) const=0; virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output, IGameDef *gamedef) const=0; // Print crafting recipes for debugging virtual std::string dump() const=0; virtual void serialize(std::ostream &os) const=0; }; class IWritableCraftDefManager : public ICraftDefManager { public: IWritableCraftDefManager(){} virtual ~IWritableCraftDefManager(){} // The main crafting function virtual bool getCraftResult(CraftInput &input, CraftOutput &output, bool decrementInput, IGameDef *gamedef) const=0; virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output, IGameDef *gamedef) const=0; // Print crafting recipes for debugging virtual std::string dump() const=0; // Add a crafting definition. // After calling this, the pointer belongs to the manager. virtual void registerCraft(CraftDefinition *def)=0; // Delete all crafting definitions virtual void clear()=0; virtual void serialize(std::ostream &os) const=0; virtual void deSerialize(std::istream &is)=0; }; IWritableCraftDefManager* createCraftDefManager(); #endif