summaryrefslogtreecommitdiff
path: root/src/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.cpp')
-rw-r--r--src/player.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/player.cpp b/src/player.cpp
index 9817d590d..4619e870f 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -30,7 +30,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Player::Player():
touching_ground(false),
in_water(false),
+ in_water_stable(false),
+ swimming_up(false),
peer_id(PEER_ID_INEXISTENT),
+ m_pitch(0),
+ m_yaw(0),
m_speed(0,0,0),
m_position(0,0,0)
{
@@ -275,11 +279,10 @@ void LocalPlayer::move(f32 dtime, Map &map)
position += m_speed * dtime;
bool free_move = g_settings.getBool("free_move");
- bool terrain_viewer = g_settings.getBool("terrain_viewer");
// Skip collision detection if player is non-local or
// a special movement mode is used
- if(isLocal() == false || free_move || terrain_viewer)
+ if(isLocal() == false || free_move)
{
setPosition(position);
return;
@@ -292,7 +295,7 @@ void LocalPlayer::move(f32 dtime, Map &map)
v3s16 pos_i = floatToInt(position);
/*
- Check if player is in water
+ Check if player is in water (the oscillating value)
*/
try{
if(in_water)
@@ -311,6 +314,18 @@ void LocalPlayer::move(f32 dtime, Map &map)
in_water = false;
}
+ /*
+ Check if player is in water (the stable value)
+ */
+ try{
+ v3s16 pp = floatToInt(position + v3f(0,0,0));
+ in_water_stable = content_liquid(map.getNode(pp).d);
+ }
+ catch(InvalidPositionException &e)
+ {
+ in_water_stable = false;
+ }
+
// The frame length is limited to the player going 0.1*BS per call
f32 d = (float)BS * 0.15;
@@ -526,10 +541,12 @@ void LocalPlayer::applyControl(float dtime)
speed.Y = 6.5*BS;
setSpeed(speed);
}
+ // Use the oscillating value for getting out of water
+ // (so that the player doesn't fly on the surface)
else if(in_water)
{
v3f speed = getSpeed();
- speed.Y = 2.0*BS;
+ speed.Y = 1.5*BS;
setSpeed(speed);
swimming_up = true;
}