summaryrefslogtreecommitdiffstats
path: root/src/game-server/inventory.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/inventory.h')
-rw-r--r--src/game-server/inventory.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/game-server/inventory.h b/src/game-server/inventory.h
new file mode 100644
index 0000000..bd9da5c
--- /dev/null
+++ b/src/game-server/inventory.h
@@ -0,0 +1,210 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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
+ * any later version.
+ *
+ * The Mana Server 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 The Mana Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef INVENTORY_H
+#define INVENTORY_H
+
+#include "game-server/character.h"
+#include "net/messageout.h"
+
+/*enum
+{
+// Equipment rules:
+// 1 torso equipment
+ EQUIP_TORSO_SLOT = 0,
+// 1 arms equipment
+ EQUIP_ARMS_SLOT = 1,
+// 1 head equipment
+ EQUIP_HEAD_SLOT = 2,
+// 1 legs equipment
+ EQUIP_LEGS_SLOT = 3,
+// 1 feet equipment
+ EQUIP_FEET_SLOT = 4,
+// 2 rings
+ EQUIP_RING1_SLOT = 5,
+ EQUIP_RING2_SLOT = 6,
+// 1 necklace
+ EQUIP_NECKLACE_SLOT = 7,
+// Fight:
+// 2 one-handed weapons
+// or 1 two-handed weapon
+// or 1 one-handed weapon + 1 shield.
+ EQUIP_FIGHT1_SLOT = 8,
+ EQUIP_FIGHT2_SLOT = 9,
+// Projectile:
+// this item does not amount to one, it only indicates the chosen projectile.
+ EQUIP_PROJECTILE_SLOT = 10,
+
+ EQUIP_CLIENT_INVENTORY = 32
+};*/
+
+class ItemClass;
+
+/**
+ * Class used to handle Character possessions and prepare outgoing messages.
+ */
+class Inventory
+{
+ public:
+
+ /**
+ * Creates a view on the possessions of a character.
+ * @param delayed If the changes need to be cancelable.
+ */
+ Inventory(Character *, bool delayed = false);
+
+ /**
+ * Commits delayed changes if applicable.
+ * Sends the update message to the client.
+ */
+ ~Inventory();
+
+ /**
+ * Commits changes.
+ * Exclusive to delayed mode.
+ * @param doRestart Whether to prepare the inventory for more changes
+ after this. If you are unsure, it is safe (though not
+ terribly efficient) to leave this as true.
+ */
+ void commit(bool doRestart = true);
+
+ /**
+ * Cancels changes.
+ * Exclusive to delayed mode.
+ */
+ void cancel();
+
+ /**
+ * Sends complete inventory status to the client.
+ */
+ void sendFull() const;
+
+ /**
+ * Ensures the inventory is sane and apply equipment modifiers.
+ * Should be run only once and the very first time.
+ */
+ void initialise();
+
+ /**
+ * Equips item from given inventory slot.
+ * @param slot The slot in which the target item is in.
+ * @param override Whether this item can unequip other items to equip
+ * itself. If true, items that are unequipped will be
+ * attempted to be reequipped, but with override disabled.
+ * @returns whether the item could be equipped.
+ */
+ bool equip(int slot, bool override = true);
+
+ /**
+ * Unequips item from given equipment slot.
+ * @param it Starting iterator. When the only parameter, also extracts
+ * slot number from it.
+ * Used so that when we already have an iterator to the first
+ * occurence from a previous operation we can start from
+ * there.
+ * @returns Whether it was unequipped.
+ */
+ bool unequip(EquipData::iterator it);
+ bool unequip(unsigned int slot, EquipData::iterator *itp = 0);
+
+ /**
+ * Inserts some items into the inventory.
+ * @return number of items not inserted (to be dropped on floor?).
+ */
+ unsigned int insert(unsigned int itemId, unsigned int amount);
+
+ /**
+ * Removes some items from inventory.
+ * @param force If set to true, also remove any equipment encountered
+ * @return number of items not removed.
+ */
+ unsigned int remove(unsigned int itemId, unsigned int amount, bool force = false);
+
+ /**
+ * Moves some items from the first slot to the second one.
+ * @returns number of items not moved.
+ */
+ unsigned int move(unsigned int slot1, unsigned int slot2, unsigned int amount);
+
+ /**
+ * Removes some items from inventory.
+ * @return number of items not removed.
+ */
+ unsigned int removeFromSlot(unsigned int slot, unsigned int amount);
+
+ /**
+ * Counts number of items with given ID.
+ */
+ unsigned int count(unsigned int itemId) const;
+
+ /**
+ * Gets the ID of the items in a given slot.
+ */
+ unsigned int getItem(unsigned int slot) const;
+
+ private:
+
+ /**
+ * Make sure that changes are being done on a copy, not directly.
+ * No effect when not in delayed mode.
+ */
+ void prepare();
+
+ /**
+ * Starts a new notification message.
+ */
+ void restart();
+
+
+ /**
+ * Check the inventory is within the slot limit and capacity.
+ * Forcibly delete items from the end if it is not.
+ * @todo Drop items instead?
+ */
+ void checkSize();
+
+ /**
+ * Helper function for equip() when computing changes to equipment
+ * When newCount is 0, the item is being unequipped.
+ */
+ // inventory slot -> {equip slots}
+ typedef std::multimap<unsigned int, unsigned short> IdSlotMap;
+ void equip_sub(unsigned int newCount, IdSlotMap::const_iterator &it);
+
+ /**
+ * Changes equipment and adjusts character attributes.
+ */
+ void changeEquipment(unsigned int oldId, unsigned int itemId);
+ void changeEquipment(ItemClass *oldI, ItemClass *newI);
+
+ Possessions *mPoss; /**< Pointer to the modified possessions. */
+ /**
+ * Update message containing inventory changes.
+ * Note that in sendFull(), this is reused to send all full changes
+ * (for both inventory and equipment)
+ */
+ MessageOut mInvMsg;
+ MessageOut mEqmMsg; /**< Update message containing equipment changes */
+ Character *mClient; /**< Character to notify. */
+ bool mDelayed; /**< Delayed changes. */
+};
+
+
+#endif