summaryrefslogtreecommitdiff
path: root/src/net/ea/inventoryhandler.cpp
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-02-24 15:21:11 -0700
committerJared Adams <jaxad0127@gmail.com>2010-02-24 15:51:39 -0700
commitd039422e70e47a762ef61de619e9e98780b12664 (patch)
treed0cb68147e6fe37a8c85e4907766976bf79547b4 /src/net/ea/inventoryhandler.cpp
parent84cf9bcc38028696d02c03cd523b7997906b9f01 (diff)
downloadmana-d039422e70e47a762ef61de619e9e98780b12664.tar.gz
mana-d039422e70e47a762ef61de619e9e98780b12664.tar.bz2
mana-d039422e70e47a762ef61de619e9e98780b12664.tar.xz
mana-d039422e70e47a762ef61de619e9e98780b12664.zip
Move StorageWindow to instancing intead of global
Also make storage under eAthena more flexible. Reviewed-by: Dennis Friis
Diffstat (limited to 'src/net/ea/inventoryhandler.cpp')
-rw-r--r--src/net/ea/inventoryhandler.cpp78
1 files changed, 55 insertions, 23 deletions
diff --git a/src/net/ea/inventoryhandler.cpp b/src/net/ea/inventoryhandler.cpp
index decd4c2a..4e8aa725 100644
--- a/src/net/ea/inventoryhandler.cpp
+++ b/src/net/ea/inventoryhandler.cpp
@@ -107,6 +107,20 @@ InventoryHandler::InventoryHandler()
};
handledMessages = _messages;
inventoryHandler = this;
+
+ mStorage = 0;
+ mStorageWindow = 0;
+}
+
+InventoryHandler::~InventoryHandler()
+{
+ if (mStorageWindow)
+ {
+ mStorageWindow->close();
+ mStorageWindow = 0;
+ }
+
+ delete mStorage;
}
void InventoryHandler::handleMessage(Net::MessageIn &msg)
@@ -115,7 +129,6 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
int index, amount, itemId, equipType, arrow;
int identified, cards[4], itemType;
Inventory *inventory = player_node->getInventory();
- Inventory *storage = player_node->getStorage();
switch (msg.getId())
{
@@ -129,6 +142,10 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
inventory->clear();
}
+ else
+ {
+ mInventoryItems.clear();
+ }
msg.readInt16(); // length
number = (msg.getLength() - 4) / 18;
@@ -170,7 +187,8 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
}
else
{
- storage->setItem(index, itemId, amount, false);
+ mInventoryItems.push_back(InventoryItem(index, itemId,
+ amount, false));
}
}
break;
@@ -201,7 +219,8 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
cards[0], cards[1], cards[2], cards[3]);
}
- storage->setItem(index, itemId, amount, false);
+ mInventoryItems.push_back(InventoryItem(index, itemId, amount,
+ false));
}
break;
@@ -280,15 +299,27 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
* server. It always comes after the two SMSG_PLAYER_STORAGE_...
* packets that update storage contents.
*/
- player_node->setInStorage(true);
- msg.readInt16(); // Used count
- msg.readInt16(); // Storage capacity
+ {
+ msg.readInt16(); // Used count
+ int size = msg.readInt16(); // Max size
+
+ if (!mStorage)
+ mStorage = new Inventory(size);
+
+ InventoryItems::iterator it = mInventoryItems.begin();
+ InventoryItems::iterator it_end = mInventoryItems.end();
+ for (; it != it_end; it++)
+ mStorage->setItem((*it).slot, (*it).id, (*it).quantity,
+ (*it).equip);
+ mInventoryItems.clear();
+
+ if (!mStorageWindow)
+ mStorageWindow = new StorageWindow(mStorage);
+ }
break;
case SMSG_PLAYER_STORAGE_ADD:
- /*
- * Move an item into storage
- */
+ // Move an item into storage
index = msg.readInt16() - STORAGE_OFFSET;
amount = msg.readInt32();
itemId = msg.readInt16();
@@ -298,37 +329,38 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
for (int i = 0; i < 4; i++)
cards[i] = msg.readInt16();
- if (Item *item = storage->getItem(index))
+ if (Item *item = mStorage->getItem(index))
{
item->setId(itemId);
item->increaseQuantity(amount);
}
else
{
- storage->setItem(index, itemId, amount, false);
+ mStorage->setItem(index, itemId, amount, false);
}
break;
case SMSG_PLAYER_STORAGE_REMOVE:
- /*
- * Move an item out of storage
- */
+ // Move an item out of storage
index = msg.readInt16() - STORAGE_OFFSET;
amount = msg.readInt16();
- if (Item *item = storage->getItem(index))
+ if (Item *item = mStorage->getItem(index))
{
item->increaseQuantity(-amount);
if (item->getQuantity() == 0)
- storage->removeItemAt(index);
+ mStorage->removeItemAt(index);
}
break;
case SMSG_PLAYER_STORAGE_CLOSE:
- /*
- * Storage access has been closed
- */
- storage->clear();
- player_node->setInStorage(false);
+ // Storage access has been closed
+
+ // Storage window deletes itself
+ mStorageWindow = 0;
+
+ mStorage->clear();
+ delete mStorage;
+ mStorage = 0;
break;
case SMSG_PLAYER_EQUIPMENT:
@@ -482,9 +514,9 @@ size_t InventoryHandler::getSize(StorageType type) const
case INVENTORY:
return 100;
case STORAGE:
- return 300;
+ return 0;
case GUILD_STORAGE:
- return 1000;
+ return 0;
default:
return 0;
}