mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Properly handle dropping of items from nodes, and disallow moving items directly between nodes
This commit is contained in:
parent
aba7134301
commit
5f3c70061d
@ -202,6 +202,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
|
|||||||
|
|
||||||
// Handle node metadata move
|
// Handle node metadata move
|
||||||
if(from_inv.type == InventoryLocation::NODEMETA &&
|
if(from_inv.type == InventoryLocation::NODEMETA &&
|
||||||
|
to_inv.type == InventoryLocation::NODEMETA &&
|
||||||
|
from_inv.p != to_inv.p)
|
||||||
|
{
|
||||||
|
errorstream<<"Directly moving items between two nodes is "
|
||||||
|
<<"disallowed."<<std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(from_inv.type == InventoryLocation::NODEMETA &&
|
||||||
to_inv.type == InventoryLocation::NODEMETA &&
|
to_inv.type == InventoryLocation::NODEMETA &&
|
||||||
from_inv.p == to_inv.p)
|
from_inv.p == to_inv.p)
|
||||||
{
|
{
|
||||||
@ -354,12 +362,31 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Take item from source list
|
|
||||||
ItemStack item1;
|
ItemStack item1;
|
||||||
if(count == 0)
|
|
||||||
item1 = list_from->changeItem(from_i, ItemStack());
|
// Handle node metadata take
|
||||||
|
if(from_inv.type == InventoryLocation::NODEMETA)
|
||||||
|
{
|
||||||
|
lua_State *L = player->getEnv()->getLua();
|
||||||
|
int count0 = count;
|
||||||
|
if(count0 == 0)
|
||||||
|
count0 = list_from->getItem(from_i).count;
|
||||||
|
infostream<<player->getDescription()<<" dropping "<<count0
|
||||||
|
<<" items from node at "<<PP(from_inv.p)<<std::endl;
|
||||||
|
ItemStack return_stack = scriptapi_node_on_metadata_inventory_take(
|
||||||
|
L, from_inv.p, from_list, from_i, count0, player);
|
||||||
|
if(return_stack.count == 0)
|
||||||
|
infostream<<"Node metadata gave no items"<<std::endl;
|
||||||
|
item1 = return_stack;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
item1 = list_from->takeItem(from_i, count);
|
{
|
||||||
|
// Take item from source list
|
||||||
|
if(count == 0)
|
||||||
|
item1 = list_from->changeItem(from_i, ItemStack());
|
||||||
|
else
|
||||||
|
item1 = list_from->takeItem(from_i, count);
|
||||||
|
}
|
||||||
|
|
||||||
// Drop the item and apply the returned ItemStack
|
// Drop the item and apply the returned ItemStack
|
||||||
ItemStack item2 = item1;
|
ItemStack item2 = item1;
|
||||||
|
Loading…
Reference in New Issue
Block a user