Skip to content
Browse files

Footsteps: Fix offset footstep and shallow water sound bugs

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.
  • Loading branch information...
paramat committed Feb 9, 2017
1 parent 1de08e1 commit 984e063374c032ed17764931fd00c19afb92ebb9
Showing with 14 additions and 1 deletion.
  1. +1 −1 src/game.cpp
  2. +12 −0 src/localplayer.cpp
  3. +1 −0 src/localplayer.h
@@ -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;

@@ -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);
@@ -68,6 +68,7 @@ class LocalPlayer : public Player
void applyControl(float dtime);

v3s16 getStandingNodePos();
v3s16 getFootstepNodePos();

// Used to check if anything changed and prevent sending packets if not
v3f last_position;

0 comments on commit 984e063

Please sign in to comment.
You can’t perform that action at this time.