summaryrefslogtreecommitdiff
path: root/src/inventorymanager.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-12-06 15:21:56 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-01-02 01:49:38 +0200
commit103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e (patch)
tree416a253ff37aeb5944781dd1288c5afa7483d799 /src/inventorymanager.h
parent70ed371d0cd532da8efc5acbd41a20e9a373b811 (diff)
downloadminetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.tar.gz
minetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.tar.bz2
minetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.zip
Add InvRef and InvStack (currently untested and unusable)
Diffstat (limited to 'src/inventorymanager.h')
-rw-r--r--src/inventorymanager.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/src/inventorymanager.h b/src/inventorymanager.h
new file mode 100644
index 000000000..4abe5e73d
--- /dev/null
+++ b/src/inventorymanager.h
@@ -0,0 +1,228 @@
+/*
+Minetest-c55
+Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+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
+(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.
+
+You should have received a copy of the GNU 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.
+*/
+
+#ifndef INVENTORYMANAGER_HEADER
+#define INVENTORYMANAGER_HEADER
+
+#include "inventory.h"
+
+// Should probably somehow replace InventoryContext over time
+struct InventoryLocation
+{
+ enum Type{
+ UNDEFINED,
+ PLAYER,
+ NODEMETA
+ } type;
+
+ std::string name; // PLAYER
+ v3s16 p; // NODEMETA
+
+ void setPlayer(const std::string &name_)
+ {
+ type = PLAYER;
+ name = name_;
+ }
+ void setNodeMeta(v3s16 p_)
+ {
+ type = NODEMETA;
+ p = p_;
+ }
+};
+
+class Player;
+
+struct InventoryContext
+{
+ Player *current_player;
+
+ InventoryContext():
+ current_player(NULL)
+ {}
+};
+
+struct InventoryAction;
+
+class InventoryManager
+{
+public:
+ InventoryManager(){}
+ virtual ~InventoryManager(){}
+
+ // Get an inventory or set it modified (so it will be updated over
+ // network or so)
+ virtual Inventory* getInventory(const InventoryLocation &loc){return NULL;}
+ virtual void setInventoryModified(const InventoryLocation &loc){}
+
+ // Used on the client to send an action to the server
+ 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
+
+struct InventoryAction
+{
+ static InventoryAction * deSerialize(std::istream &is);
+
+ virtual u16 getType() const = 0;
+ virtual void serialize(std::ostream &os) const = 0;
+ virtual void apply(InventoryContext *c, InventoryManager *mgr,
+ ServerEnvironment *env) = 0;
+};
+
+struct IMoveAction : public InventoryAction
+{
+ // count=0 means "everything"
+ u16 count;
+ std::string from_inv;
+ std::string from_list;
+ s16 from_i;
+ std::string to_inv;
+ std::string to_list;
+ s16 to_i;
+
+ IMoveAction()
+ {
+ count = 0;
+ from_i = -1;
+ to_i = -1;
+ }
+
+ IMoveAction(std::istream &is);
+
+ u16 getType() const
+ {
+ return IACTION_MOVE;
+ }
+
+ void serialize(std::ostream &os) const
+ {
+ os<<"Move ";
+ os<<count<<" ";
+ os<<from_inv<<" ";
+ os<<from_list<<" ";
+ os<<from_i<<" ";
+ os<<to_inv<<" ";
+ os<<to_list<<" ";
+ os<<to_i;
+ }
+
+ void apply(InventoryContext *c, InventoryManager *mgr,
+ ServerEnvironment *env);
+};
+
+struct IDropAction : public InventoryAction
+{
+ // count=0 means "everything"
+ u16 count;
+ std::string from_inv;
+ std::string from_list;
+ s16 from_i;
+
+ IDropAction()
+ {
+ count = 0;
+ from_i = -1;
+ }
+
+ IDropAction(std::istream &is);
+
+ u16 getType() const
+ {
+ return IACTION_DROP;
+ }
+
+ void serialize(std::ostream &os) const
+ {
+ os<<"Drop ";
+ os<<count<<" ";
+ os<<from_inv<<" ";
+ os<<from_list<<" ";
+ os<<from_i;
+ }
+
+ void apply(InventoryContext *c, InventoryManager *mgr,
+ ServerEnvironment *env);
+};
+
+/*
+ Craft checking system
+*/
+
+enum ItemSpecType
+{
+ ITEM_NONE,
+ ITEM_MATERIAL,
+ ITEM_CRAFT,
+ ITEM_TOOL,
+ ITEM_MBO
+};
+
+struct ItemSpec
+{
+ enum ItemSpecType type;
+ // Only other one of these is used
+ std::string name;
+ u16 num;
+
+ ItemSpec():
+ type(ITEM_NONE)
+ {
+ }
+ ItemSpec(enum ItemSpecType a_type, std::string a_name):
+ type(a_type),
+ name(a_name),
+ num(65535)
+ {
+ }
+ ItemSpec(enum ItemSpecType a_type, u16 a_num):
+ type(a_type),
+ name(""),
+ num(a_num)
+ {
+ }
+
+ bool checkItem(const InventoryItem *item) const;
+};
+
+/*
+ items: a pointer to an array of 9 pointers to items
+ specs: a pointer to an array of 9 ItemSpecs
+*/
+bool checkItemCombination(const InventoryItem * const*items, const ItemSpec *specs);
+
+/*
+ items: a pointer to an array of 9 pointers to items
+ specs: a pointer to an array of 9 pointers to items
+*/
+bool checkItemCombination(const InventoryItem * const * items,
+ const InventoryItem * const * specs);
+
+
+#endif
+