mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
Protect dropping from far node inventories
Also changes if/if to switch/case
This commit is contained in:
parent
fc864029b9
commit
176f5866cb
@ -628,23 +628,34 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
|
|||||||
|
|
||||||
auto check_inv_access = [player, player_has_interact, this] (
|
auto check_inv_access = [player, player_has_interact, this] (
|
||||||
const InventoryLocation &loc) -> bool {
|
const InventoryLocation &loc) -> bool {
|
||||||
if (loc.type == InventoryLocation::CURRENT_PLAYER)
|
|
||||||
return false; // Only used internally on the client, never sent
|
|
||||||
if (loc.type == InventoryLocation::PLAYER) {
|
|
||||||
// Allow access to own inventory in all cases
|
|
||||||
return loc.name == player->getName();
|
|
||||||
}
|
|
||||||
if (loc.type == InventoryLocation::DETACHED) {
|
|
||||||
if (!getInventoryMgr()->checkDetachedInventoryAccess(loc, player->getName()))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player_has_interact) {
|
// Players without interact may modify their own inventory
|
||||||
|
if (!player_has_interact && loc.type != InventoryLocation::PLAYER) {
|
||||||
infostream << "Cannot modify foreign inventory: "
|
infostream << "Cannot modify foreign inventory: "
|
||||||
<< "No interact privilege" << std::endl;
|
<< "No interact privilege" << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
switch (loc.type) {
|
||||||
|
case InventoryLocation::CURRENT_PLAYER:
|
||||||
|
// Only used internally on the client, never sent
|
||||||
|
return false;
|
||||||
|
case InventoryLocation::PLAYER:
|
||||||
|
// Allow access to own inventory in all cases
|
||||||
|
return loc.name == player->getName();
|
||||||
|
case InventoryLocation::NODEMETA:
|
||||||
|
{
|
||||||
|
// Check for out-of-range interaction
|
||||||
|
v3f node_pos = intToFloat(loc.p, BS);
|
||||||
|
v3f player_pos = player->getPlayerSAO()->getEyePosition();
|
||||||
|
f32 d = player_pos.getDistanceFrom(node_pos);
|
||||||
|
return checkInteractDistance(player, d, "inventory");
|
||||||
|
}
|
||||||
|
case InventoryLocation::DETACHED:
|
||||||
|
return getInventoryMgr()->checkDetachedInventoryAccess(loc, player->getName());
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -664,18 +675,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
|
|||||||
!check_inv_access(ma->to_inv))
|
!check_inv_access(ma->to_inv))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
InventoryLocation *remote = ma->from_inv.type == InventoryLocation::PLAYER ?
|
|
||||||
&ma->to_inv : &ma->from_inv;
|
|
||||||
|
|
||||||
// Check for out-of-range interaction
|
|
||||||
if (remote->type == InventoryLocation::NODEMETA) {
|
|
||||||
v3f node_pos = intToFloat(remote->p, BS);
|
|
||||||
v3f player_pos = player->getPlayerSAO()->getEyePosition();
|
|
||||||
f32 d = player_pos.getDistanceFrom(node_pos);
|
|
||||||
if (!checkInteractDistance(player, d, "inventory"))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Disable moving items out of craftpreview
|
Disable moving items out of craftpreview
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user