summaryrefslogtreecommitdiff
path: root/src/game-server/gamehandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/gamehandler.cpp')
-rw-r--r--src/game-server/gamehandler.cpp31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp
index 3b356a5c..eeccdcc5 100644
--- a/src/game-server/gamehandler.cpp
+++ b/src/game-server/gamehandler.cpp
@@ -488,15 +488,17 @@ void GameHandler::handlePickup(GameClient &client, MessageIn &message)
{
Actor *o = *i;
Point opos = o->getPosition();
+
if (o->getType() == OBJECT_ITEM && opos.x == x && opos.y == y)
{
- Item *item = static_cast< Item * >(o);
+ ItemComponent *item = o->getComponent<ItemComponent>();
ItemClass *ic = item->getItemClass();
int amount = item->getAmount();
+
if (!Inventory(client.character).insert(ic->getDatabaseID(),
- amount))
+ amount))
{
- GameState::remove(item);
+ GameState::remove(o);
// We only do this when items are to be kept in memory
// between two server restart.
@@ -504,8 +506,8 @@ void GameHandler::handlePickup(GameClient &client, MessageIn &message)
{
// Remove the floor item from map
accountHandler->removeFloorItems(map->getID(),
- ic->getDatabaseID(),
- amount, x, y);
+ ic->getDatabaseID(),
+ amount, x, y);
}
// log transaction
@@ -556,33 +558,32 @@ void GameHandler::handleDrop(GameClient &client, MessageIn &message)
if (ItemClass *ic = itemManager->getItem(inv.getItem(slot)))
{
int nb = inv.removeFromSlot(slot, amount);
- Item *item = new Item(ic, amount - nb);
- item->setMap(client.character->getMap());
- item->setPosition(client.character->getPosition());
- if (!GameState::insert(item))
+ MapComposite *map = client.character->getMap();
+ Point pos = client.character->getPosition();
+
+ Entity *item = Item::create(map, pos, ic, amount - nb);
+
+ if (!GameState::insertOrDelete(item))
{
// The map is full. Put back into inventory.
inv.insert(ic->getDatabaseID(), amount - nb);
- delete item;
return;
}
- Point pt = client.character->getPosition();
-
// We store the item in database only when the floor items are meant
// to be persistent between two server restarts.
if (!Configuration::getValue("game_floorItemDecayTime", 0))
{
// Create the floor item on map
accountHandler->createFloorItems(client.character->getMap()->getID(),
- ic->getDatabaseID(),
- amount, pt.x, pt.y);
+ ic->getDatabaseID(),
+ amount, pos.x, pos.y);
}
// log transaction
std::stringstream str;
str << "User dropped item " << ic->getDatabaseID()
- << " at " << pt.x << "x" << pt.y;
+ << " at " << pos.x << "x" << pos.y;
accountHandler->sendTransaction(client.character->getDatabaseID(),
TRANS_ITEM_DROP, str.str());
}