Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cfg/cs2fixes/cs2fixes.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 3 additions & 0 deletions src/cs2fixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
34 changes: 34 additions & 0 deletions src/playermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1828,4 +1828,38 @@ int CPlayerManager::GetOnlinePlayerCount(bool bCountBots)
}

return iOnlinePlayers;
}

CConVar<bool> 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);
}
}
10 changes: 10 additions & 0 deletions src/playermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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; }
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -388,6 +394,8 @@ class ZEPlayer
float m_flEntwatchHudX;
float m_flEntwatchHudY;
float m_flEntwatchHudSize;
float m_flGravity;
MoveType_t m_hMoveType;
};

class CPlayerManager
Expand Down Expand Up @@ -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:
Expand Down