1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Remove most exceptions from getNode() (and variants)

This commit is contained in:
Craig Robbins 2014-11-14 18:05:34 +10:00
parent 92815ad54b
commit 5b8855e83c
12 changed files with 429 additions and 455 deletions

View file

@ -360,12 +360,11 @@ PointedThing getPointedThing(Client *client, v3f player_position,
for (s16 z = zstart; z <= zend; z++)
for (s16 x = xstart; x <= xend; x++) {
MapNode n;
bool is_valid_position;
try {
n = map.getNode(v3s16(x, y, z));
} catch (InvalidPositionException &e) {
n = map.getNodeNoEx(v3s16(x, y, z), &is_valid_position);
if (!is_valid_position)
continue;
}
if (!isPointableNode(n, client, liquids_pointable))
continue;
@ -873,22 +872,31 @@ bool nodePlacementPrediction(Client &client,
std::string prediction = playeritem_def.node_placement_prediction;
INodeDefManager *nodedef = client.ndef();
ClientMap &map = client.getEnv().getClientMap();
MapNode node;
bool is_valid_position;
if (prediction != "" && !nodedef->get(map.getNode(nodepos)).rightclickable) {
node = map.getNodeNoEx(nodepos, &is_valid_position);
if (!is_valid_position)
return false;
if (prediction != "" && !nodedef->get(node).rightclickable) {
verbosestream << "Node placement prediction for "
<< playeritem_def.name << " is "
<< prediction << std::endl;
v3s16 p = neighbourpos;
// Place inside node itself if buildable_to
try {
MapNode n_under = map.getNode(nodepos);
MapNode n_under = map.getNodeNoEx(nodepos, &is_valid_position);
if (is_valid_position)
{
if (nodedef->get(n_under).buildable_to)
p = nodepos;
else if (!nodedef->get(map.getNode(p)).buildable_to)
return false;
} catch (InvalidPositionException &e) {}
else {
node = map.getNodeNoEx(p, &is_valid_position);
if (is_valid_position &&!nodedef->get(node).buildable_to)
return false;
}
}
// Find id of predicted node
content_t id;
@ -946,7 +954,7 @@ bool nodePlacementPrediction(Client &client,
else
pp = p + v3s16(0, -1, 0);
if (!nodedef->get(map.getNode(pp)).walkable)
if (!nodedef->get(map.getNodeNoEx(pp)).walkable)
return false;
}
@ -3431,7 +3439,7 @@ void Game::handlePointingAtNode(GameRunData *runData,
if (meta) {
infotext = narrow_to_wide(meta->getString("infotext"));
} else {
MapNode n = map.getNode(nodepos);
MapNode n = map.getNodeNoEx(nodepos);
if (nodedef_manager->get(n).tiledef[0].name == "unknown_node.png") {
infotext = L"Unknown node: ";
@ -3489,7 +3497,7 @@ void Game::handlePointingAtNode(GameRunData *runData,
}
if (playeritem_def.node_placement_prediction == "" ||
nodedef_manager->get(map.getNode(nodepos)).rightclickable)
nodedef_manager->get(map.getNodeNoEx(nodepos)).rightclickable)
client->interact(3, pointed); // Report to server
}
}
@ -3558,7 +3566,7 @@ void Game::handleDigging(GameRunData *runData,
LocalPlayer *player = client->getEnv().getLocalPlayer();
ClientMap &map = client->getEnv().getClientMap();
MapNode n = client->getEnv().getClientMap().getNode(nodepos);
MapNode n = client->getEnv().getClientMap().getNodeNoEx(nodepos);
// NOTE: Similar piece of code exists on the server side for
// cheat detection.
@ -3623,8 +3631,10 @@ void Game::handleDigging(GameRunData *runData,
infostream << "Digging completed" << std::endl;
client->interact(2, pointed);
client->setCrack(-1, v3s16(0, 0, 0));
MapNode wasnode = map.getNode(nodepos);
client->removeNode(nodepos);
bool is_valid_position;
MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position);
if (is_valid_position)
client->removeNode(nodepos);
if (g_settings->getBool("enable_particles")) {
const ContentFeatures &features =