From 128940ff193e2b0ff22c6cc8eaa660e7b7883a6f Mon Sep 17 00:00:00 2001 From: rtldg Date: Fri, 25 Jul 2025 01:17:07 +0000 Subject: [PATCH] Fix the on-ground 0.5s start-timer even further dot dot dot --- addons/sourcemod/scripting/shavit-core.sp | 46 ++++++++++++++++++----- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 98aad5f1..6d3362bc 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -92,7 +92,8 @@ Handle gH_Forwards_OnProcessMovementPost = null; // player timer variables timer_snapshot_t gA_Timers[MAXPLAYERS+1]; bool gB_Auto[MAXPLAYERS+1]; -int gI_FirstTouchedGround[MAXPLAYERS+1]; +// 0 is in air, 1 or greater is on ground, -1 means client was on ground with zero...ish... velocity +int gI_FirstTouchedGroundForStartTimer[MAXPLAYERS+1]; int gI_LastTickcount[MAXPLAYERS+1]; // these are here until the compiler bug is fixed @@ -2569,10 +2570,15 @@ bool CanStartTimer(int client, int track, bool skipGroundCheck) if (skipGroundTimer) return true; - if (gI_FirstTouchedGround[client] > 0) + if (gI_FirstTouchedGroundForStartTimer[client] < 0) + { + // was on ground with zero...ish... velocity... + return true; + } + else if (gI_FirstTouchedGroundForStartTimer[client] > 0) { int halfSecOfTicks = RoundFloat(0.5 / GetTickInterval()); - int onGroundTicks = gI_LastTickcount[client] - gI_FirstTouchedGround[client]; + int onGroundTicks = gI_LastTickcount[client] - gI_FirstTouchedGroundForStartTimer[client]; return onGroundTicks >= halfSecOfTicks; } @@ -2769,7 +2775,7 @@ public void OnClientPutInServer(int client) gA_Timers[client].fNextFrameTime = 0.0; gA_Timers[client].fplayer_speedmod = 1.0; gS_DeleteMap[client][0] = 0; - gI_FirstTouchedGround[client] = 0; + gI_FirstTouchedGroundForStartTimer[client] = 0; gI_LastTickcount[client] = 0; gI_HijackFrames[client] = 0; gI_LastPrintedSteamID[client] = 0; @@ -3652,10 +3658,35 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 gI_LastTickcount[client] = tickcount; + if (bOnGround) + { + if (gI_FirstTouchedGroundForStartTimer[client] == 0) + { + // just landed (or teleported to the ground or whatever) + gI_FirstTouchedGroundForStartTimer[client] = tickcount; + } + + if (gI_FirstTouchedGroundForStartTimer[client] > 0) + { + float fSpeed[3]; + GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", fSpeed); + + // zero...ish... velocity... (squared-ish (cubed?)) + if (GetVectorLength(fSpeed, true) <= 1000.0) + { + gI_FirstTouchedGroundForStartTimer[client] = -1; + } + } + } + else + { + gI_FirstTouchedGroundForStartTimer[client] = 0; + } + if(bOnGround && !gA_Timers[client].bOnGround) { gA_Timers[client].iLandingTick = tickcount; - gI_FirstTouchedGround[client] = tickcount; + gI_FirstTouchedGroundForStartTimer[client] = tickcount; if (gEV_Type != Engine_TF2 && GetStyleSettingBool(gA_Timers[client].bsStyle, "easybhop")) { @@ -3677,11 +3708,6 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - if (!bOnGround) - { - gI_FirstTouchedGround[client] = 0; - } - // This can be bypassed by spamming +duck on CSS which causes `iGroundEntity` to be `-1` here... // (e.g. an autobhop + velocity_limit style...) // m_hGroundEntity changes from 0 -> -1 same tick which causes problems and I'm not sure what the best way / place to handle that is...