X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finventorymanager.h;h=8e2abc9614f13f339efac2fa4b5e96c6b0ef3f7d;hb=b97c9c65777b0389f4cc9a6e3257506f29761e03;hp=4abe5e73d029b0537e5d4f115668b1bf12a22110;hpb=103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e;p=oweals%2Fminetest.git diff --git a/src/inventorymanager.h b/src/inventorymanager.h index 4abe5e73d..8e2abc961 100644 --- a/src/inventorymanager.h +++ b/src/inventorymanager.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -21,19 +21,35 @@ with this program; if not, write to the Free Software Foundation, Inc., #define INVENTORYMANAGER_HEADER #include "inventory.h" +#include +#include +class ServerActiveObject; -// Should probably somehow replace InventoryContext over time struct InventoryLocation { enum Type{ UNDEFINED, + CURRENT_PLAYER, PLAYER, - NODEMETA + NODEMETA, + DETACHED, } type; - std::string name; // PLAYER + std::string name; // PLAYER, DETACHED v3s16 p; // NODEMETA + InventoryLocation() + { + setUndefined(); + } + void setUndefined() + { + type = UNDEFINED; + } + void setCurrentPlayer() + { + type = CURRENT_PLAYER; + } void setPlayer(const std::string &name_) { type = PLAYER; @@ -44,17 +60,45 @@ struct InventoryLocation type = NODEMETA; p = p_; } -}; + void setDetached(const std::string &name_) + { + type = DETACHED; + name = name_; + } -class Player; + bool operator==(const InventoryLocation &other) const + { + if(type != other.type) + return false; + switch(type){ + case UNDEFINED: + return false; + case CURRENT_PLAYER: + return true; + case PLAYER: + return (name == other.name); + case NODEMETA: + return (p == other.p); + case DETACHED: + return (name == other.name); + } + return false; + } + bool operator!=(const InventoryLocation &other) const + { + return !(*this == other); + } -struct InventoryContext -{ - Player *current_player; - - InventoryContext(): - current_player(NULL) - {} + void applyCurrentPlayer(const std::string &name_) + { + if(type == CURRENT_PLAYER) + setPlayer(name_); + } + + std::string dump() const; + void serialize(std::ostream &os) const; + void deSerialize(std::istream &is); + void deSerialize(std::string s); }; struct InventoryAction; @@ -65,25 +109,17 @@ public: InventoryManager(){} virtual ~InventoryManager(){} - // Get an inventory or set it modified (so it will be updated over - // network or so) + // Get an inventory (server and client) virtual Inventory* getInventory(const InventoryLocation &loc){return NULL;} + // Set modified (will be saved and sent over network; only on server) virtual void setInventoryModified(const InventoryLocation &loc){} - - // Used on the client to send an action to the server + // Send inventory action to server (only on client) virtual void inventoryAction(InventoryAction *a){} - - // (Deprecated; these wrap to the latter ones) - // Get a pointer to an inventory specified by id. id can be: - // - "current_player" - // - "nodemeta:X,Y,Z" - Inventory* getInventory(InventoryContext *c, std::string id); - // Used on the server by InventoryAction::apply and other stuff - void inventoryModified(InventoryContext *c, std::string id); }; #define IACTION_MOVE 0 #define IACTION_DROP 1 +#define IACTION_CRAFT 2 struct InventoryAction { @@ -91,18 +127,20 @@ struct InventoryAction virtual u16 getType() const = 0; virtual void serialize(std::ostream &os) const = 0; - virtual void apply(InventoryContext *c, InventoryManager *mgr, - ServerEnvironment *env) = 0; + virtual void apply(InventoryManager *mgr, ServerActiveObject *player, + IGameDef *gamedef) = 0; + virtual void clientApply(InventoryManager *mgr, IGameDef *gamedef) = 0; + virtual ~InventoryAction() {}; }; struct IMoveAction : public InventoryAction { // count=0 means "everything" u16 count; - std::string from_inv; + InventoryLocation from_inv; std::string from_list; s16 from_i; - std::string to_inv; + InventoryLocation to_inv; std::string to_list; s16 to_i; @@ -124,23 +162,24 @@ struct IMoveAction : public InventoryAction { os<<"Move "; os<