item drop multiplication fix

This commit is contained in:
Perttu Ahola 2011-04-19 17:09:45 +03:00
parent a7d36a50bb
commit 3c61d57f6d
3 changed files with 31 additions and 13 deletions

@ -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")

@ -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)
{

@ -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);
}