aboutsummaryrefslogtreecommitdiff
path: root/src/localplayer.cpp
diff options
context:
space:
mode:
authorparamat <mat.gregory@virginmedia.com>2017-02-09 21:12:53 +0000
committerparamat <mat.gregory@virginmedia.com>2017-02-12 01:52:12 +0000
commit984e063374c032ed17764931fd00c19afb92ebb9 (patch)
tree7053082d5c1e96869c9c8f8cb17d8aced0326b16 /src/localplayer.cpp
parent1de08e196182498a931b496f79b1c1eaf3de7ca4 (diff)
downloadminetest-984e063374c032ed17764931fd00c19afb92ebb9.tar.gz
minetest-984e063374c032ed17764931fd00c19afb92ebb9.tar.bz2
minetest-984e063374c032ed17764931fd00c19afb92ebb9.zip
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.
Diffstat (limited to 'src/localplayer.cpp')
-rw-r--r--src/localplayer.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 857d95d8b..33932df0b 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -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);