diff --git a/src/client.cpp b/src/client.cpp index 8e49ee3ba..c882de860 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -464,7 +464,7 @@ void Client::step(float dtime) // Control local player (0ms) LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); - player->applyControl(dtime); + player->applyControl(dtime, &m_env); // Step environment m_env.step(dtime); diff --git a/src/localplayer.cpp b/src/localplayer.cpp index fd781f940..4083f7cbf 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -398,7 +398,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d) move(dtime, env, pos_max_d, NULL); } -void LocalPlayer::applyControl(float dtime) +void LocalPlayer::applyControl(float dtime, Environment *env) { // Clear stuff swimming_vertical = false; @@ -611,7 +611,17 @@ void LocalPlayer::applyControl(float dtime) incH = incV = movement_acceleration_default * BS * dtime; // Accelerate to target speed with maximum increment - accelerateHorizontal(speedH * physics_override_speed, incH * physics_override_speed); + INodeDefManager *nodemgr = m_gamedef->ndef(); + Map *map = &env->getMap(); + v3s16 p = floatToInt(getPosition() - v3f(0,BS/2,0), BS); + ContentFeatures node = nodemgr->get(map->getNodeNoEx(p)); + int slippery = itemgroup_get(node.groups, "slippery"); + if (slippery==0 && (node.name=="air" || itemgroup_get(node.groups, "liquid")) && !free_move && !is_climbing && !control.sneak) + { + slippery = 10; + } + + accelerateHorizontal(speedH * physics_override_speed, incH * physics_override_speed, slippery); accelerateVertical(speedV * physics_override_speed, incV * physics_override_speed); } diff --git a/src/localplayer.h b/src/localplayer.h index 40a7f089e..bba7c0065 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -50,7 +50,7 @@ public: void move(f32 dtime, Environment *env, f32 pos_max_d, std::vector *collision_info); - void applyControl(float dtime); + void applyControl(float dtime, Environment *env); v3s16 getStandingNodePos(); diff --git a/src/player.cpp b/src/player.cpp index dd5e04509..5c1be5ed7 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -112,12 +112,19 @@ Player::~Player() } // Horizontal acceleration (X and Z), Y direction is ignored -void Player::accelerateHorizontal(v3f target_speed, f32 max_increase) +void Player::accelerateHorizontal(v3f target_speed, f32 max_increase, int slippery) { if(max_increase == 0) return; v3f d_wanted = target_speed - m_speed; + if (slippery) + { + if (target_speed == v3f(0)) + d_wanted = -m_speed*.5/slippery; + else + d_wanted = target_speed*.1 - m_speed*.1; + } d_wanted.Y = 0; f32 dl = d_wanted.getLength(); if(dl > max_increase) diff --git a/src/player.h b/src/player.h index 48b0a4999..46fdf5534 100644 --- a/src/player.h +++ b/src/player.h @@ -119,7 +119,7 @@ public: m_speed = speed; } - void accelerateHorizontal(v3f target_speed, f32 max_increase); + void accelerateHorizontal(v3f target_speed, f32 max_increase, int slippery); void accelerateVertical(v3f target_speed, f32 max_increase); v3f getPosition()