diff options
author | BlockMen <nmuelll@web.de> | 2014-01-15 21:26:54 +0100 |
---|---|---|
committer | BlockMen <nmuelll@web.de> | 2014-01-15 21:26:54 +0100 |
commit | 1b4908bf56552ca2e01b48591ade8d441d119625 (patch) | |
tree | 57e01b9a68a71e8c5de8c264e6df9748a3e448e2 | |
parent | 4896d4b829d5e980dd3da586d7d713209ed72e89 (diff) | |
download | minetest-1b4908bf56552ca2e01b48591ade8d441d119625.tar.gz minetest-1b4908bf56552ca2e01b48591ade8d441d119625.tar.bz2 minetest-1b4908bf56552ca2e01b48591ade8d441d119625.zip |
Prevent placing node when player would be inside new node
-rw-r--r-- | src/game.cpp | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/src/game.cpp b/src/game.cpp index 30f17be51..16fd42f16 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -905,9 +905,20 @@ bool nodePlacementPrediction(Client &client, // Add node to client map MapNode n(id, 0, param2); try{ - // This triggers the required mesh update too - client.addNode(p, n); - return true; + LocalPlayer* player = client.getEnv().getLocalPlayer(); + + // Dont place node when player would be inside new node + // NOTE: This is to be eventually implemented by a mod as client-side Lua + if (!nodedef->get(n).walkable || + (client.checkPrivilege("noclip") && g_settings->getBool("noclip")) || + (nodedef->get(n).walkable && + neighbourpos != player->getStandingNodePos() + v3s16(0,1,0) && + neighbourpos != player->getStandingNodePos() + v3s16(0,2,0))) { + + // This triggers the required mesh update too + client.addNode(p, n); + return true; + } }catch(InvalidPositionException &e){ errorstream<<"Node placement prediction failed for " <<playeritem_def.name<<" (places " @@ -2798,23 +2809,28 @@ void the_game( // Otherwise report right click to server else { - // Report to server - client.interact(3, pointed); - camera.setDigging(1); // right click animation - + camera.setDigging(1); // right click animation (always shown for feedback) + // If the wielded item has node placement prediction, // make that happen bool placed = nodePlacementPrediction(client, - playeritem_def, - nodepos, neighbourpos); - - // Read the sound - if(placed) + playeritem_def, + nodepos, neighbourpos); + + if(placed) { + // Report to server + client.interact(3, pointed); + // Read the sound soundmaker.m_player_rightpunch_sound = - playeritem_def.sound_place; - else + playeritem_def.sound_place; + } else { soundmaker.m_player_rightpunch_sound = - SimpleSoundSpec(); + SimpleSoundSpec(); + } + + if (playeritem_def.node_placement_prediction == "" || + nodedef->get(map.getNode(nodepos)).rightclickable) + client.interact(3, pointed); // Report to server } } } |