summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2018-03-03 10:59:14 +0100
committerGitHub <noreply@github.com>2018-03-03 10:59:14 +0100
commita1cf8a127c57719d18fa0ccbe4a3fa3ac5504ef2 (patch)
treea9786a992a9b8b6264a138d1937d1b915743e636
parentf5fd4a0af1fef2e9cd3f7f368884349013a06dcc (diff)
downloadminetest-a1cf8a127c57719d18fa0ccbe4a3fa3ac5504ef2.tar.gz
minetest-a1cf8a127c57719d18fa0ccbe4a3fa3ac5504ef2.tar.bz2
minetest-a1cf8a127c57719d18fa0ccbe4a3fa3ac5504ef2.zip
Slippery: Simplify, make more efficient (#7086)
Use already existing collision results for the nearest colliding node Fix slippery effect in free_move mode
-rw-r--r--src/localplayer.cpp44
-rw-r--r--src/localplayer.h1
2 files changed, 9 insertions, 36 deletions
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 3133c2652..a8bd21839 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -681,7 +681,10 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
else
incH = incV = movement_acceleration_default * BS * dtime;
- float slip_factor = getSlipFactor(env, speedH);
+ float slip_factor = 1.0f;
+ if (!free_move)
+ slip_factor = getSlipFactor(env, speedH);
+
// Accelerate to target speed with maximum increment
accelerateHorizontal(speedH * physics_override_speed,
incH * physics_override_speed * slip_factor);
@@ -1057,49 +1060,20 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d,
float LocalPlayer::getSlipFactor(Environment *env, const v3f &speedH)
{
-
- if (!touching_ground)
- return 1.0f;
-
- float slip_factor = 1.0f;
// Slip on slippery nodes
const NodeDefManager *nodemgr = env->getGameDef()->ndef();
Map *map = &env->getMap();
const ContentFeatures &f = nodemgr->get(map->getNodeNoEx(
- floatToInt(getPosition() - v3f(0, 0.05f * BS, 0), BS)));
+ getStandingNodePos()));
int slippery = 0;
- if (f.walkable) {
+ if (f.walkable)
slippery = itemgroup_get(f.groups, "slippery");
- } else if (is_slipping) {
- // slipping over an edge? Check surroundings for slippery nodes
- slippery = 2 << 16; // guard value, bigger than all realistic ones
- for (int z = 0; z <= 1; z++) {
- for (int x = 0; x <= 1; x++) {
- // this should cover all nodes surrounding player position
- v3f offset((x - 0.5f) * BS, 0.05f * BS, (z - 0.5f) * BS);
- const ContentFeatures &f2 = nodemgr->get(map->getNodeNoEx(
- floatToInt(getPosition() - offset, BS)));
- if (f2.walkable) {
- // find least slippery node we might be standing on
- int s = itemgroup_get(f2.groups, "slippery");
- if (s < slippery)
- slippery = s;
- }
- }
- }
- // without any hits, ignore slippery
- if (slippery >= (2 << 16))
- slippery = 0;
- }
+
if (slippery >= 1) {
if (speedH == v3f(0.0f)) {
slippery = slippery * 2;
}
- slip_factor = core::clamp(1.0f / (slippery + 1), 0.001f, 1.0f);
- is_slipping = true;
- } else {
- // remember this to avoid checking the edge case above too often
- is_slipping = false;
+ return core::clamp(1.0f / (slippery + 1), 0.001f, 1.0f);
}
- return slip_factor;
+ return 1.0f;
}
diff --git a/src/localplayer.h b/src/localplayer.h
index 77d79e472..dc59c4179 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -61,7 +61,6 @@ public:
u8 liquid_viscosity = 0;
bool is_climbing = false;
bool swimming_vertical = false;
- bool is_slipping = false;
float physics_override_speed = 1.0f;
float physics_override_jump = 1.0f;