forked from Mirrorlandia_minetest/minetest
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()
|
bool CraftItem::isCookable()
|
||||||
{
|
{
|
||||||
if(m_subname == "lump_of_iron")
|
if(m_subname == "lump_of_iron")
|
||||||
|
@ -59,6 +59,8 @@ public:
|
|||||||
virtual std::string getText() { return ""; }
|
virtual std::string getText() { return ""; }
|
||||||
// Creates an object from the item, to be placed in the world.
|
// Creates an object from the item, to be placed in the world.
|
||||||
virtual ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos);
|
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
|
Quantity methods
|
||||||
@ -279,6 +281,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos);
|
ServerActiveObject* createSAO(ServerEnvironment *env, u16 id, v3f pos);
|
||||||
|
u16 getDropCount();
|
||||||
|
|
||||||
virtual bool addableTo(InventoryItem *other)
|
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;
|
dout_server<<"Placed object"<<std::endl;
|
||||||
|
|
||||||
// If item has count<=1, delete it
|
if(g_settings.getBool("creative_mode") == false)
|
||||||
if(item->getCount() <= 1)
|
|
||||||
{
|
{
|
||||||
|
// Delete the right amount of items from the slot
|
||||||
|
u16 dropcount = item->getDropCount();
|
||||||
|
|
||||||
|
// Delete item if all gone
|
||||||
|
if(item->getCount() <= dropcount)
|
||||||
|
{
|
||||||
|
if(item->getCount() < dropcount)
|
||||||
|
dstream<<"WARNING: Server: dropped more items"
|
||||||
|
<<" than the slot contains"<<std::endl;
|
||||||
|
|
||||||
InventoryList *ilist = player->inventory.getList("main");
|
InventoryList *ilist = player->inventory.getList("main");
|
||||||
if(g_settings.getBool("creative_mode") == false && ilist)
|
if(ilist)
|
||||||
{
|
|
||||||
// Remove from inventory and send inventory
|
// Remove from inventory and send inventory
|
||||||
ilist->deleteItem(item_i);
|
ilist->deleteItem(item_i);
|
||||||
// Send inventory
|
|
||||||
SendInventory(peer_id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Else decrement it
|
// Else decrement it
|
||||||
else
|
else
|
||||||
{
|
item->remove(dropcount);
|
||||||
item->remove(1);
|
|
||||||
// Send inventory
|
// Send inventory
|
||||||
SendInventory(peer_id);
|
SendInventory(peer_id);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user