diff options
-rw-r--r-- | src/inventory.cpp | 10 | ||||
-rw-r--r-- | src/inventory.h | 3 | ||||
-rw-r--r-- | src/server.cpp | 31 |
3 files changed, 31 insertions, 13 deletions
diff --git a/src/inventory.cpp b/src/inventory.cpp index b6560063f..289b5bb2b 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -180,6 +180,16 @@ ServerActiveObject* CraftItem::createSAO(ServerEnvironment *env, u16 id, v3f pos } } +u16 CraftItem::getDropCount() +{ + // Special cases + if(m_subname == "rat") + return 1; + // Default + else + return InventoryItem::getDropCount(); +} + bool CraftItem::isCookable() { if(m_subname == "lump_of_iron") diff --git a/src/inventory.h b/src/inventory.h index cb45371e4..d2d23542e 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -59,6 +59,8 @@ public: virtual std::string getText() { return ""; } // Creates an object from the item, to be placed in the world. virtual ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos); + // Gets amount of items that dropping one SAO will decrement + virtual u16 getDropCount(){ return getCount(); } /* Quantity methods @@ -279,6 +281,7 @@ public: } ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos); + u16 getDropCount(); virtual bool addableTo(InventoryItem *other) { diff --git a/src/server.cpp b/src/server.cpp index 6a0c13040..154603a47 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2470,22 +2470,27 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) dout_server<<"Placed object"<<std::endl; - // If item has count<=1, delete it - if(item->getCount() <= 1) + if(g_settings.getBool("creative_mode") == false) { - InventoryList *ilist = player->inventory.getList("main"); - if(g_settings.getBool("creative_mode") == false && ilist) + // Delete the right amount of items from the slot + u16 dropcount = item->getDropCount(); + + // Delete item if all gone + if(item->getCount() <= dropcount) { - // Remove from inventory and send inventory - ilist->deleteItem(item_i); - // Send inventory - SendInventory(peer_id); + if(item->getCount() < dropcount) + dstream<<"WARNING: Server: dropped more items" + <<" than the slot contains"<<std::endl; + + InventoryList *ilist = player->inventory.getList("main"); + if(ilist) + // Remove from inventory and send inventory + ilist->deleteItem(item_i); } - } - // Else decrement it - else - { - item->remove(1); + // Else decrement it + else + item->remove(dropcount); + // Send inventory SendInventory(peer_id); } |