Skip to content

Commit 5991176

Browse files
committedApr 11, 2017
Sneak glitch: Detect ledge for 2-node climb-up
Re-creates the old sneak-jump behaviour in new code. Enabled by the 'sneak glitch' physics override. When a ledge is detected the jump speed modifier is set to the larger of 'physics override jump' and 1.3 to allow a 2-node climb-up. An unexpected side-effect is the simple sneak ladder working smoothly.
1 parent eb58799 commit 5991176

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed
 

‎src/localplayer.cpp

+43-4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ LocalPlayer::LocalPlayer(Client *client, const char *name):
7070
m_sneak_node_exists(false),
7171
m_need_to_get_new_sneak_node(true),
7272
m_sneak_ladder_detected(false),
73+
m_ledge_detected(false),
7374
m_old_node_below(32767,32767,32767),
7475
m_old_node_below_type("air"),
7576
m_can_jump(false),
@@ -149,6 +150,29 @@ static bool detectSneakLadder(Map *map, INodeDefManager *nodemgr, v3s16 pos)
149150
return false;
150151
}
151152

153+
static bool detectLedge(Map *map, INodeDefManager *nodemgr, v3s16 pos)
154+
{
155+
bool is_valid_position;
156+
MapNode node;
157+
// X/Z vectors for 4 neighboring nodes
158+
static const v2s16 vecs[] = {v2s16(-1, 0), v2s16(1, 0), v2s16(0, -1), v2s16(0, 1)};
159+
160+
for (u16 i = 0; i < ARRLEN(vecs); i++) {
161+
const v2s16 vec = vecs[i];
162+
163+
node = GETNODE(map, pos, vec, 1, &is_valid_position);
164+
if (is_valid_position && nodemgr->get(node).walkable) {
165+
// Ledge exists
166+
node = GETNODE(map, pos, vec, 2, &is_valid_position);
167+
if (is_valid_position && !nodemgr->get(node).walkable)
168+
// Space above ledge exists
169+
return true;
170+
}
171+
}
172+
173+
return false;
174+
}
175+
152176
#undef GETNODE
153177

154178
void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
@@ -409,6 +433,13 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
409433
}
410434
}
411435

436+
/*
437+
If 'sneak glitch' enabled detect ledge for old sneak-jump
438+
behaviour of climbing onto a ledge 2 nodes up.
439+
*/
440+
if (physics_override_sneak_glitch && control.sneak && control.jump)
441+
m_ledge_detected = detectLedge(map, nodemgr, floatToInt(position, BS));
442+
412443
/*
413444
Set new position
414445
*/
@@ -648,10 +679,18 @@ void LocalPlayer::applyControl(float dtime)
648679
at its starting value
649680
*/
650681
v3f speedJ = getSpeed();
651-
if(speedJ.Y >= -0.5 * BS)
652-
{
653-
speedJ.Y = movement_speed_jump * physics_override_jump;
654-
setSpeed(speedJ);
682+
if(speedJ.Y >= -0.5 * BS) {
683+
if (m_ledge_detected) {
684+
// Limit jump speed to a minimum that allows
685+
// jumping up onto a ledge 2 nodes up.
686+
speedJ.Y = movement_speed_jump *
687+
MYMAX(physics_override_jump, 1.3f);
688+
setSpeed(speedJ);
689+
m_ledge_detected = false;
690+
} else {
691+
speedJ.Y = movement_speed_jump * physics_override_jump;
692+
setSpeed(speedJ);
693+
}
655694

656695
MtEvent *e = new SimpleTriggerEvent("PlayerJump");
657696
m_client->event()->put(e);

‎src/localplayer.h

+3
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ class LocalPlayer : public Player
146146
// Whether a "sneak ladder" structure is detected at the players pos
147147
// see detectSneakLadder() in the .cpp for more info (always false if disabled)
148148
bool m_sneak_ladder_detected;
149+
// Whether a 2-node-up ledge is detected at the players pos,
150+
// see detectLedge() in the .cpp for more info (always false if disabled).
151+
bool m_ledge_detected;
149152

150153
// Node below player, used to determine whether it has been removed,
151154
// and its old type

0 commit comments

Comments
 (0)
Please sign in to comment.