diff options
Diffstat (limited to 'src/game-server/gamehandler.cpp')
-rw-r--r-- | src/game-server/gamehandler.cpp | 31 |
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()); } |