From 2fba5eafbe0ddaf53c23417011fcfd3afe15afd8 Mon Sep 17 00:00:00 2001 From: Dots Date: Mon, 12 Oct 2026 02:19:17 +0300 Subject: [PATCH 1/2] Fix nobug landing origin using a wall contact clipped before the floor --- .../sourcemod/scripting/movementapi/hooks.sp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/scripting/movementapi/hooks.sp b/addons/sourcemod/scripting/movementapi/hooks.sp index 9e4778f..3d2715f 100644 --- a/addons/sourcemod/scripting/movementapi/hooks.sp +++ b/addons/sourcemod/scripting/movementapi/hooks.sp @@ -772,14 +772,19 @@ public MRESReturn DHooks_OnTryPlayerMove_Post(Address pThis, DHookReturn hReturn } } -static bool TraceGroundParity(int client, const float origin[3], float groundPos[3]) +static float GetStandableNormalZ() { static ConVar sv_standable_normal; if (sv_standable_normal == INVALID_HANDLE) { sv_standable_normal = FindConVar("sv_standable_normal"); } - float standableZ = sv_standable_normal.FloatValue; + return sv_standable_normal.FloatValue; +} + +static bool TraceGroundParity(int client, const float origin[3], float groundPos[3]) +{ + float standableZ = GetStandableNormalZ(); float hullMins[3], hullMaxs[3]; GetClientMins(client, hullMins); @@ -871,10 +876,18 @@ static void NobugLandingOrigin(int client, float landingOrigin[3]) } // Jump is bugged, try to use the trace result of TryPlayerMove if possible. - if (gB_TryPlayerMoveThisTick[client] && gI_CollisionCount[client] > 0) + // First standable contact only, a wall clipped before the floor would give the wall contact point. + if (gB_TryPlayerMoveThisTick[client]) { - landingOrigin = gF_TraceEndOrigin[client][0]; - return; + float standableZ = GetStandableNormalZ(); + for (int i = 0; i < gI_CollisionCount[client]; i++) + { + if (gF_TraceNormal[client][i][2] >= standableZ) + { + landingOrigin = gF_TraceEndOrigin[client][i]; + return; + } + } } // Engine doesn't ground players moving up this fast. From b6a28a7de34e8b42b805a2d243da2b0ecbb4c10c Mon Sep 17 00:00:00 2001 From: Dots Date: Mon, 12 Oct 2026 02:19:18 +0300 Subject: [PATCH 2/2] Fix stale takeoff velocity when takeoff is detected before LadderMove --- addons/sourcemod/scripting/movementapi/hooks.sp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/movementapi/hooks.sp b/addons/sourcemod/scripting/movementapi/hooks.sp index 3d2715f..4e98600 100644 --- a/addons/sourcemod/scripting/movementapi/hooks.sp +++ b/addons/sourcemod/scripting/movementapi/hooks.sp @@ -543,20 +543,25 @@ public MRESReturn DHooks_OnCategorizePosition_Post(Address pThis) else // Takeoff { gF_TakeoffOrigin[client] = gF_OldOrigin[client]; + bool hadLadderMoveType = Movement_GetMovetype(client) == MOVETYPE_LADDER || gMT_OldMovetype[client] == MOVETYPE_LADDER; // Note: Jumping isn't detected here. if (gB_WalkMoved[client]) { gF_TakeoffVelocity[client] = gF_PostWalkMoveVelocity[client]; } - else + else if (hadLadderMoveType) { gF_TakeoffVelocity[client] = gF_PostLadderMoveVelocity[client]; } + else + { + // Can run before this tick's LadderMove, where gF_PostLadderMoveVelocity is still last tick's. + gF_TakeoffVelocity[client] = gF_Velocity[client]; + } gI_TakeoffTick[client] = gI_TickCount[client]; gI_TakeoffCmdNum[client] = gI_Cmdnum[client]; gB_Jumped[client] = false; gB_HitPerf[client] = false; - bool hadLadderMoveType = Movement_GetMovetype(client) == MOVETYPE_LADDER || gMT_OldMovetype[client] == MOVETYPE_LADDER; bool ladderJump = hadLadderMoveType && !gB_WalkMoved[client]; if (ladderJump) {