diff --git a/cfg/cs2fixes/cs2fixes.cfg b/cfg/cs2fixes/cs2fixes.cfg index 63ecde97..7d246e60 100644 --- a/cfg/cs2fixes/cs2fixes.cfg +++ b/cfg/cs2fixes/cs2fixes.cfg @@ -25,6 +25,7 @@ cs2f_prevent_using_players 0 // Whether to prevent +use from hitting players ( cs2f_map_steamids_enable 0 // Whether to make Steam ID's available to maps cs2f_fix_game_bans 0 // Whether to fix CS2 game bans spreading to all new joining players cs2f_free_armor 0 // Whether kevlar (1+) and/or helmet (2) are given automatically +cs2f_fix_ladder_gravity 0 // Whether to fix ladders resetting player gravity. cs2f_beacon_particle "particles/cs2fixes/admin_beacon.vpcf" // .vpcf file to be precached and used for player beacon diff --git a/sdk b/sdk index 20ae6c37..da981a89 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 20ae6c37f6c23551897821645a66cf8af547f6d7 +Subproject commit da981a8984c74641d2a31732a0bac742bfea6e2d diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index f10483b5..5d09feb0 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -993,6 +993,9 @@ void CS2Fixes::Hook_GameFramePost(bool simulating, bool bFirstTick, bool bLastTi RunTimers(); EntityHandler_OnGameFramePost(simulating, GetGlobals()->tickcount); + + if (g_playerManager) + g_playerManager->CheckForLadderExits(); } void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo** ppInfoList, int infoCount, CBitVec<16384>& unionTransmitEdicts, diff --git a/src/playermanager.cpp b/src/playermanager.cpp index 14d00396..d77dbef5 100644 --- a/src/playermanager.cpp +++ b/src/playermanager.cpp @@ -1828,4 +1828,38 @@ int CPlayerManager::GetOnlinePlayerCount(bool bCountBots) } return iOnlinePlayers; +} + +CConVar g_cvarFixLadderGravity("cs2f_fix_ladder_gravity", FCVAR_NONE, "Whether to fix ladders resetting player gravity.", false); + +void CPlayerManager::CheckForLadderExits() +{ + if (!g_cvarFixLadderGravity.Get()) + return; + + VPROF("CPlayerManager::CheckForLadderExits"); + + for (int i = 0; i < MAXPLAYERS; i++) + { + ZEPlayer* pPlayer = this->GetPlayer(i); + + if (!pPlayer) + continue; + + auto slot = pPlayer->GetPlayerSlot(); + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(slot); + + if (!pTarget || !pTarget->m_bPawnIsAlive) // Also want to do this for bots so checking for FakeClient is a bad idea - m'kay + continue; + + CCSPlayerPawn* pPawn = (CCSPlayerPawn*)pTarget->GetPawn(); + auto movetype = pPawn->m_MoveType(); + + if (pPlayer->GetMoveType() == MOVETYPE_LADDER && movetype != MOVETYPE_LADDER) // They were on a ladder last frame and now are not so reset gravity. + pPawn->SetGravityScale(pPlayer->GetGravity()); + else if (movetype == MOVETYPE_WALK) // Need the else or it would happen in the same frame as the if above. + pPlayer->SetGravity(pPawn->m_flGravityScale()); + + pPlayer->SetMoveType(movetype); + } } \ No newline at end of file diff --git a/src/playermanager.h b/src/playermanager.h index c8e08933..fc211641 100644 --- a/src/playermanager.h +++ b/src/playermanager.h @@ -196,6 +196,8 @@ class ZEPlayer m_flEntwatchHudX = -7.5f; m_flEntwatchHudY = -2.0f; m_flEntwatchHudSize = 60.0f; + m_flGravity = 1.0f; + m_hMoveType = MOVETYPE_NONE; } ~ZEPlayer() @@ -266,6 +268,8 @@ class ZEPlayer void SetEntwatchHudColor(Color colorHud); void SetEntwatchHudPos(float x, float y); void SetEntwatchHudSize(float flSize); + void SetMoveType(MoveType_t hMoveType) { m_hMoveType = hMoveType; } + void SetGravity(float flGravity) { m_flGravity = flGravity; } uint64 GetAdminFlags() { return m_iAdminFlags; } int GetAdminImmunity() { return m_iAdminImmunity; } @@ -315,6 +319,8 @@ class ZEPlayer float GetEntwatchHudX() { return m_flEntwatchHudX; } float GetEntwatchHudY() { return m_flEntwatchHudY; } float GetEntwatchHudSize() { return m_flEntwatchHudSize; } + float GetGravity() { return m_flGravity; } + MoveType_t GetMoveType() { return m_hMoveType; } void OnSpawn(); void OnAuthenticated(); @@ -388,6 +394,8 @@ class ZEPlayer float m_flEntwatchHudX; float m_flEntwatchHudY; float m_flEntwatchHudSize; + float m_flGravity; + MoveType_t m_hMoveType; }; class CPlayerManager @@ -443,6 +451,8 @@ class CPlayerManager void UpdatePlayerStates(); int GetOnlinePlayerCount(bool bCountBots); + void CheckForLadderExits(); + STEAM_GAMESERVER_CALLBACK_MANUAL(CPlayerManager, OnValidateAuthTicket, ValidateAuthTicketResponse_t, m_CallbackValidateAuthTicketResponse); private: