diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-10-25 14:46:19 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-10-25 15:01:43 +0200 |
commit | 20a5f67808ca6ee14117e9b7d13606cba81e0442 (patch) | |
tree | 21b458b357ad66f03d118b708732964333c7ac1f | |
parent | a931fa498a64d575c543aaa016fdd75f6e7bc6ec (diff) | |
download | manaserv-20a5f67808ca6ee14117e9b7d13606cba81e0442.tar.gz manaserv-20a5f67808ca6ee14117e9b7d13606cba81e0442.tar.bz2 manaserv-20a5f67808ca6ee14117e9b7d13606cba81e0442.tar.xz manaserv-20a5f67808ca6ee14117e9b7d13606cba81e0442.zip |
Fixed crash when the server tries to remove unknown items
Whether it's a good idea to automatically remove unknown items from the
inventory in the first place is something to be considered.
Reviewed-by: Freeyorp
-rw-r--r-- | src/game-server/inventory.cpp | 37 | ||||
-rw-r--r-- | src/game-server/item.cpp | 4 | ||||
-rw-r--r-- | src/game-server/item.hpp | 12 |
3 files changed, 29 insertions, 24 deletions
diff --git a/src/game-server/inventory.cpp b/src/game-server/inventory.cpp index f560ce50..94dea47a 100644 --- a/src/game-server/inventory.cpp +++ b/src/game-server/inventory.cpp @@ -209,7 +209,9 @@ void Inventory::equip_sub(unsigned int newCount, IdSlotMap::const_iterator &it) void Inventory::prepare() { - if (!mDelayed) return; + if (!mDelayed) + return; + Possessions *poss = &mClient->getPossessions(); if (mPoss == poss) mPoss = new Possessions(*poss); @@ -546,26 +548,31 @@ unsigned int Inventory::move(unsigned int slot1, unsigned int slot2, unsigned in unsigned int Inventory::removeFromSlot(unsigned int slot, unsigned int amount) { prepare(); + InventoryData::iterator it = mPoss->inventory.find(slot); + + // When the given slot doesn't exist, we can't remove anything if (it == mPoss->inventory.end()) return amount; - unequip(slot); + + // Check if an item of the same class exists elsewhere in the inventory + bool exists = false; + for (InventoryData::const_iterator it2 = mPoss->inventory.begin(), + it2_end = mPoss->inventory.end(); + it2 != it2_end; ++it2) { - bool exists = false; - for (InventoryData::const_iterator it2 = mPoss->inventory.begin(), - it2_end = mPoss->inventory.end(); - it2 != it2_end; - ++it2) - if (it2->second.itemId == it->second.itemId + if (it2->second.itemId == it->second.itemId && it->first != it2->first) - { - exists = true; - break; - } - if (!exists && it->second.itemId) - itemManager->getItem(it->second.itemId) - ->useTrigger(mClient, ITT_LEAVE_INVY); + { + exists = true; + break; + } + } + if (!exists && it->second.itemId) { + if (ItemClass *ic = itemManager->getItem(it->second.itemId)) + ic->useTrigger(mClient, ITT_LEAVE_INVY); } + unsigned int sub = std::min(amount, it->second.amount); amount -= sub; it->second.amount -= sub; diff --git a/src/game-server/item.cpp b/src/game-server/item.cpp index d2d2c1d8..35684470 100644 --- a/src/game-server/item.cpp +++ b/src/game-server/item.cpp @@ -76,7 +76,9 @@ void ItemEffectScript::dispell(Being *itemUser) bool ItemClass::useTrigger(Being *itemUser, ItemTriggerType trigger) { - if (!trigger) return false; + if (!trigger) + return false; + std::pair<std::multimap< ItemTriggerType, ItemEffectInfo * >::iterator, std::multimap< ItemTriggerType, ItemEffectInfo * >::iterator> rn = mEffects.equal_range(trigger); diff --git a/src/game-server/item.hpp b/src/game-server/item.hpp index 3ccfe2bf..2c3f9224 100644 --- a/src/game-server/item.hpp +++ b/src/game-server/item.hpp @@ -143,7 +143,10 @@ class ItemClass { public: ItemClass(int id, unsigned int maxperslot) - : mDatabaseID(id), mSpriteID(0), mMaxPerSlot(maxperslot) + : mDatabaseID(id) + , mSpriteID(0) + , mCost(0) + , mMaxPerSlot(maxperslot) {} ~ItemClass() { resetEffects(); } @@ -155,12 +158,6 @@ class ItemClass bool useTrigger(Being *itemUser, ItemTriggerType trigger); /** - * Gets item weight. - */ - int getWeight() const - { return mWeight; } - - /** * Gets unit cost of these items. */ int getCost() const @@ -232,7 +229,6 @@ class ItemClass unsigned short mDatabaseID; /**< Item reference information */ /** The sprite that should be shown to the character */ unsigned short mSpriteID; - unsigned short mWeight; /**< Weight of the item. */ unsigned short mCost; /**< Unit cost the item. */ /** Max item amount per slot in inventory. */ unsigned int mMaxPerSlot; |