summaryrefslogtreecommitdiff
path: root/src/player.cpp
diff options
context:
space:
mode:
authorMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>2013-02-08 22:54:01 +0200
committerdarkrose <lisa@ltmnet.com>2013-02-14 06:21:30 +1000
commitdf3c925b3ccae3bdba125e6dc3ecc740739baeab (patch)
tree869c7e587022e2873ab3d125a6fca0b60ffaafb6 /src/player.cpp
parent86b906d015ccde4e8f576a4e61d7c4ae8842b45d (diff)
downloadminetest-df3c925b3ccae3bdba125e6dc3ecc740739baeab.tar.gz
minetest-df3c925b3ccae3bdba125e6dc3ecc740739baeab.tar.bz2
minetest-df3c925b3ccae3bdba125e6dc3ecc740739baeab.zip
Improved Player Physics
Diffstat (limited to 'src/player.cpp')
-rw-r--r--src/player.cpp58
1 files changed, 50 insertions, 8 deletions
diff --git a/src/player.cpp b/src/player.cpp
index 36f12c77b..0c34c4cdf 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -27,10 +27,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Player::Player(IGameDef *gamedef):
touching_ground(false),
- in_water(false),
- in_water_stable(false),
+ in_liquid(false),
+ in_liquid_stable(false),
+ liquid_viscosity(0),
is_climbing(false),
- swimming_up(false),
+ swimming_vertical(false),
camera_barely_in_ceiling(false),
inventory(gamedef->idef()),
hp(PLAYER_MAX_HP),
@@ -56,19 +57,35 @@ Player::Player(IGameDef *gamedef):
"list[current_player;main;0,3.5;8,4;]"
"list[current_player;craft;3,0;3,3;]"
"list[current_player;craftpreview;7,1;1,1;]";
+
+ // Initialize movement settings at default values, so movement can work if the server fails to send them
+ movement_acceleration_default = 2 * BS;
+ movement_acceleration_air = 0.5 * BS;
+ movement_acceleration_fast = 8 * BS;
+ movement_speed_walk = 4 * BS;
+ movement_speed_crouch = 1.35 * BS;
+ movement_speed_fast = 20 * BS;
+ movement_speed_climb = 2 * BS;
+ movement_speed_jump = 6.5 * BS;
+ movement_liquid_fluidity = 1 * BS;
+ movement_liquid_fluidity_smooth = 0.5 * BS;
+ movement_liquid_sink = 10 * BS;
+ movement_gravity = 9.81 * BS;
}
Player::~Player()
{
}
-// Y direction is ignored
-void Player::accelerate(v3f target_speed, f32 max_increase)
+// Horizontal acceleration (X and Z), Y direction is ignored
+void Player::accelerateHorizontal(v3f target_speed, f32 max_increase)
{
+ if(max_increase == 0)
+ return;
+
v3f d_wanted = target_speed - m_speed;
d_wanted.Y = 0;
- f32 dl_wanted = d_wanted.getLength();
- f32 dl = dl_wanted;
+ f32 dl = d_wanted.getLength();
if(dl > max_increase)
dl = max_increase;
@@ -76,7 +93,6 @@ void Player::accelerate(v3f target_speed, f32 max_increase)
m_speed.X += d.X;
m_speed.Z += d.Z;
- //m_speed += d;
#if 0 // old code
if(m_speed.X < target_speed.X - max_increase)
@@ -99,6 +115,32 @@ void Player::accelerate(v3f target_speed, f32 max_increase)
#endif
}
+// Vertical acceleration (Y), X and Z directions are ignored
+void Player::accelerateVertical(v3f target_speed, f32 max_increase)
+{
+ if(max_increase == 0)
+ return;
+
+ f32 d_wanted = target_speed.Y - m_speed.Y;
+ if(d_wanted > max_increase)
+ d_wanted = max_increase;
+ else if(d_wanted < -max_increase)
+ d_wanted = -max_increase;
+
+ m_speed.Y += d_wanted;
+
+#if 0 // old code
+ if(m_speed.Y < target_speed.Y - max_increase)
+ m_speed.Y += max_increase;
+ else if(m_speed.Y > target_speed.Y + max_increase)
+ m_speed.Y -= max_increase;
+ else if(m_speed.Y < target_speed.Y)
+ m_speed.Y = target_speed.Y;
+ else if(m_speed.Y > target_speed.Y)
+ m_speed.Y = target_speed.Y;
+#endif
+}
+
v3s16 Player::getLightPosition() const
{
return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);