item drop multiplication fix
This commit is contained in:
parent
a7d36a50bb
commit
3c61d57f6d
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue