diff options
Diffstat (limited to 'src/game-server/inventory.h')
-rw-r--r-- | src/game-server/inventory.h | 210 |
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 00000000..bd9da5c3 --- /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 |