Footsteps: Fix offset footstep and shallow water sound bugs
authorparamat <mat.gregory@virginmedia.com>
Thu, 9 Feb 2017 21:12:53 +0000 (21:12 +0000)
committerparamat <mat.gregory@virginmedia.com>
Sun, 12 Feb 2017 01:52:12 +0000 (01:52 +0000)
Fix footstep sounds coming from nodes to either side when walking on a
1 node wide row of nodebox slabs such as default:snow.
Fix sand footsteps when swimming in 1 node deep water.

Use a new function 'getFootstepNodePos()' instead of 'getStandingNodePos()'
to avoid using a horizontally-offset 'sneak node' for sounds.

Sound is selected from the node BS * 0.05 below the player's feet, so
that 1/16th slabs will play the slab sound but 1/32nd slabs will not.
If the player is not 'touching ground' the node detection position is
changed to BS * 0.5 below to preserve footstep sounds when landing after
a jump or fall.

src/game.cpp
src/localplayer.cpp
src/localplayer.h

index 840403c424dc9480645cac106c7e0a4959eb4e23..1735737dece8d0ca16e5ff666d1842fb754d5a37 100644 (file)
@@ -3530,7 +3530,7 @@ void Game::updateSound(f32 dtime)
        LocalPlayer *player = client->getEnv().getLocalPlayer();
 
        ClientMap &map = client->getEnv().getClientMap();
-       MapNode n = map.getNodeNoEx(player->getStandingNodePos());
+       MapNode n = map.getNodeNoEx(player->getFootstepNodePos());
        soundmaker->m_player_step_sound = nodedef_manager->get(n).sound_footstep;
 }
 
index 857d95d8b7a521dad7c822c924b92f47964b6069..33932df0b4d7a540fdfd0845abd2a944895bdd36 100644 (file)
@@ -655,6 +655,18 @@ v3s16 LocalPlayer::getStandingNodePos()
        return floatToInt(getPosition() - v3f(0, BS, 0), BS);
 }
 
+v3s16 LocalPlayer::getFootstepNodePos()
+{
+       if (touching_ground)
+               // BS * 0.05 below the player's feet ensures a 1/16th height
+               // nodebox is detected instead of the node below it.
+               return floatToInt(getPosition() - v3f(0, BS * 0.05f, 0), BS);
+       // A larger distance below is necessary for a footstep sound
+       // when landing after a jump or fall. BS * 0.5 ensures water
+       // sounds when swimming in 1 node deep water.
+       return floatToInt(getPosition() - v3f(0, BS * 0.5f, 0), BS);
+}
+
 v3s16 LocalPlayer::getLightPosition() const
 {
        return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);
index 685a78cb39612960c9caf5f71d5f8ca51c71c11c..b48dacdb7674c7085a199e6975d74b0deace0eb4 100644 (file)
@@ -68,6 +68,7 @@ public:
        void applyControl(float dtime);
 
        v3s16 getStandingNodePos();
+       v3s16 getFootstepNodePos();
 
        // Used to check if anything changed and prevent sending packets if not
        v3f last_position;