summaryrefslogtreecommitdiff
path: root/src/net/inventoryhandler.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2008-06-12 09:06:01 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2008-06-12 09:06:01 +0000
commit2f8ee95fbacb71e7cbca85fcc11e6f9f7e36c258 (patch)
tree8d256ac1a38932aaf0db7b55ed178e4212616555 /src/net/inventoryhandler.cpp
parenteb019ab915998a3ec247b33dad4b23f763d7a29a (diff)
downloadmana-client-2f8ee95fbacb71e7cbca85fcc11e6f9f7e36c258.tar.gz
mana-client-2f8ee95fbacb71e7cbca85fcc11e6f9f7e36c258.tar.bz2
mana-client-2f8ee95fbacb71e7cbca85fcc11e6f9f7e36c258.tar.xz
mana-client-2f8ee95fbacb71e7cbca85fcc11e6f9f7e36c258.zip
Merged revisions 3738 via svnmerge from
https://themanaworld.svn.sourceforge.net/svnroot/themanaworld/tmw/trunk ........ r3738 | b_lindeijer | 2007-11-16 00:44:01 +0100 (Fri, 16 Nov 2007) | 3 lines Moved item icon from ItemInfo class to the Item class, so that it can be loaded on demand. Results in faster startup time and reduced memory usage. ........
Diffstat (limited to 'src/net/inventoryhandler.cpp')
-rw-r--r--src/net/inventoryhandler.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/net/inventoryhandler.cpp b/src/net/inventoryhandler.cpp
index a2190c1e..48cf18ff 100644
--- a/src/net/inventoryhandler.cpp
+++ b/src/net/inventoryhandler.cpp
@@ -32,9 +32,13 @@
#include "../item.h"
#include "../itemshortcut.h"
#include "../localplayer.h"
+#include "../log.h"
+#include "../inventory.h"
#include "../gui/chat.h"
+#include "../utils/tostring.h"
+
InventoryHandler::InventoryHandler()
{
static const Uint16 _messages[] = {
@@ -52,13 +56,14 @@ void InventoryHandler::handleMessage(MessageIn *msg)
{
Sint32 number;
Sint16 index, amount, itemId, equipType;
+ Inventory *inventory = player_node->getInventory();
switch (msg->getId())
{
case SMSG_PLAYER_INVENTORY:
// Only called on map load / warp. First reset all items
// to not load them twice on map change.
- player_node->clearInventory();
+ inventory->clear();
msg->readInt16(); // length
number = (msg->getLength() - 4) / 18;
@@ -72,12 +77,13 @@ void InventoryHandler::handleMessage(MessageIn *msg)
msg->skip(2); // unknown
msg->skip(8); // card (4 shorts)
- player_node->addInvItem(index, itemId, amount, false);
+ inventory->setItem(index, itemId, amount, false);
// Trick because arrows are not considered equipment
if (itemId == 1199 || itemId == 529)
{
- player_node->getInvItem(index)->setEquipment(true);
+ if (Item *item = inventory->getItem(index))
+ item->setEquipment(true);
}
}
break;
@@ -93,20 +99,32 @@ void InventoryHandler::handleMessage(MessageIn *msg)
equipType = msg->readInt16();
msg->readInt8(); // type
- if (msg->readInt8()> 0) {
+ if (msg->readInt8() > 0) {
chatWindow->chatLog("Unable to pick up item", BY_SERVER);
} else {
const ItemInfo &itemInfo = ItemDB::get(itemId);
- chatWindow->chatLog("You picked up a " +
+ const std::string amountStr =
+ (amount > 1) ? toString(amount) : "a";
+ chatWindow->chatLog("You picked up " + amountStr + " " +
itemInfo.getName(), BY_SERVER);
- player_node->addInvItem(index, itemId, amount, equipType != 0);
+
+ if (Item *item = inventory->getItem(index)) {
+ item->setId(itemId);
+ item->increaseQuantity(amount);
+ } else {
+ inventory->setItem(index, itemId, amount, equipType != 0);
+ }
}
break;
case SMSG_PLAYER_INVENTORY_REMOVE:
index = msg->readInt16();
amount = msg->readInt16();
- player_node->getInvItem(index)->increaseQuantity(-amount);
+ if (Item *item = inventory->getItem(index)) {
+ item->increaseQuantity(-amount);
+ if (item->getQuantity() == 0)
+ inventory->removeItemAt(index);
+ }
break;
case SMSG_PLAYER_INVENTORY_USE:
@@ -116,7 +134,8 @@ void InventoryHandler::handleMessage(MessageIn *msg)
amount = msg->readInt16();
msg->readInt8(); // type
- player_node->getInvItem(index)->setQuantity(amount);
+ if (Item *item = inventory->getItem(index))
+ item->setQuantity(amount);
break;
case SMSG_ITEM_USE_RESPONSE:
@@ -126,7 +145,8 @@ void InventoryHandler::handleMessage(MessageIn *msg)
if (msg->readInt8() == 0) {
chatWindow->chatLog("Failed to use item", BY_SERVER);
} else {
- player_node->getInvItem(index)->setQuantity(amount);
+ if (Item *item = inventory->getItem(index))
+ item->setQuantity(amount);
}
break;
}