Skip to content
Merged
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 AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/entitylistener.cpp',
'src/leader.cpp',
'src/buttonwatch.cpp',
'src/topdefender.cpp',
'src/idlemanager.cpp',
'sdk/entity2/entitysystem.cpp',
'sdk/entity2/entityidentity.cpp',
Expand Down
2 changes: 2 additions & 0 deletions CS2Fixes.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@
<ClCompile Include="src\panoramavote.cpp" />
<ClCompile Include="src\patches.cpp" />
<ClCompile Include="src\playermanager.cpp" />
<ClCompile Include="src\topdefender.cpp" />
<ClCompile Include="src\user_preferences.cpp" />
<ClCompile Include="src\votemanager.cpp" />
<ClCompile Include="src\zombiereborn.cpp" />
Expand Down Expand Up @@ -282,6 +283,7 @@
<ClInclude Include="src\recipientfilters.h" />
<ClInclude Include="src\cs2_sdk\serversideclient.h" />
<ClInclude Include="src\cs2_sdk\clientframe.h" />
<ClInclude Include="src\topdefender.h" />
<ClInclude Include="src\utils\plat_win.h" />
<ClInclude Include="src\votemanager.h" />
<ClInclude Include="src\map_votes.h" />
Expand Down
6 changes: 6 additions & 0 deletions CS2Fixes.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,9 @@
<ClCompile Include="src\cs2_sdk\entity\cbasemodelentity.cpp">
<Filter>Source Files\cs2_sdk\entity</Filter>
</ClCompile>
<ClCompile Include="src\topdefender.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\mempatch.h">
Expand Down Expand Up @@ -421,5 +424,8 @@
<ClInclude Include="src\cs2_sdk\entity\cpointorient.h">
<Filter>Header Files\cs2_sdk\entity</Filter>
</ClInclude>
<ClInclude Include="src\topdefender.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
10 changes: 9 additions & 1 deletion cfg/cs2fixes/cs2fixes.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ cs2f_weapons_enable 0 // Whether to enable weapon commands
cs2f_stopsound_enable 0 // Whether to enable stopsound
cs2f_noblock_enable 0 // Whether to use player noblock, which sets debris collision on every player
cs2f_noblock_grenades 0 // Whether to use noblock on grenade projectiles
cs2f_topdefender_enable 0 // Whether to use TopDefender
cs2f_block_team_messages 0 // Whether to block team join messages
cs2f_movement_unlocker_enable 0 // Whether to enable movement unlocker
cs2f_use_old_push 0 // Whether to use the old CSGO trigger_push behavior (Necessary for surf and other modes that heavily use ported pushes)
Expand Down Expand Up @@ -60,6 +59,15 @@ cs2f_hide_distance_default 250 // The default distance for hide
cs2f_hide_distance_max 2000 // The max distance for hide
cs2f_hide_teammates_only 0 // Whether to hide teammates only

// TopDefender settings
cs2f_topdefender_enable 0 // Whether to use TopDefender
cs2f_topdefender_scoreboard 0 // Whether to display defender rank on scoreboard as MVP count
cs2f_topdefender_print 1 // Whether to print defender stats to console at round end
cs2f_topdefender_score 5000 // Score given to the top defender
cs2f_topdefender_threshold 1000 // Damage threshold for Top Defenders to be shown on round end
cs2f_topdefender_rate 1.0 // How often TopDefender stats get updated
cs2f_topdefender_clantag "[Top Defender]" // Clan tag given to the top defender

// Chat flood settings
cs2f_flood_interval 0.75 // Amount of time allowed between chat messages acquiring flood tokens
cs2f_max_flood_tokens 3 // Maximum number of flood tokens allowed before chat messages are blocked
Expand Down
4 changes: 4 additions & 0 deletions src/cs2_sdk/entity/ccsplayercontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ class CCSPlayerController : public CBasePlayerController
SCHEMA_FIELD(int32_t, m_iRoundsWon)
SCHEMA_FIELD(int32_t, m_iMVPs)
SCHEMA_FIELD(float, m_flSmoothedPing)
SCHEMA_FIELD(bool, m_bMvpNoMusic)
SCHEMA_FIELD(int32_t, m_eMvpReason)
SCHEMA_FIELD(int32_t, m_iMusicKitID)
SCHEMA_FIELD(int32_t, m_iMusicKitMVPs)

static CCSPlayerController* FromPawn(CCSPlayerPawn* pawn)
{
Expand Down
103 changes: 9 additions & 94 deletions src/events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "map_votes.h"
#include "panoramavote.h"
#include "recipientfilters.h"
#include "topdefender.h"
#include "votemanager.h"
#include "zombiereborn.h"

Expand Down Expand Up @@ -160,27 +161,10 @@ GAME_EVENT_F(player_spawn)
pItemServices->GiveNamedItem("item_assaultsuit");
}

CConVar<bool> g_cvarEnableTopDefender("cs2f_topdefender_enable", FCVAR_NONE, "Whether to use TopDefender", false);

GAME_EVENT_F(player_hurt)
{
if (!g_cvarEnableTopDefender.Get())
return;

CCSPlayerController* pAttacker = (CCSPlayerController*)pEvent->GetPlayerController("attacker");
CCSPlayerController* pVictim = (CCSPlayerController*)pEvent->GetPlayerController("userid");

// Ignore Ts/zombies and CTs hurting themselves
if (!pAttacker || pAttacker->m_iTeamNum() != CS_TEAM_CT || pAttacker->m_iTeamNum() == pVictim->m_iTeamNum())
return;

ZEPlayer* pPlayer = pAttacker->GetZEPlayer();

if (!pPlayer)
return;

pPlayer->SetTotalDamage(pPlayer->GetTotalDamage() + pEvent->GetInt("dmg_health"));
pPlayer->SetTotalHits(pPlayer->GetTotalHits() + 1);
if (g_cvarEnableTopDefender.Get())
TD_OnPlayerHurt(pEvent);
}

GAME_EVENT_F(player_death)
Expand All @@ -191,22 +175,8 @@ GAME_EVENT_F(player_death)
if (g_cvarEnableEntWatch.Get())
EW_PlayerDeath(pEvent);

if (!g_cvarEnableTopDefender.Get())
return;

CCSPlayerController* pAttacker = (CCSPlayerController*)pEvent->GetPlayerController("attacker");
CCSPlayerController* pVictim = (CCSPlayerController*)pEvent->GetPlayerController("userid");

// Ignore Ts/zombie kills and ignore CT teamkilling or suicide
if (!pAttacker || !pVictim || pAttacker->m_iTeamNum != CS_TEAM_CT || pAttacker->m_iTeamNum == pVictim->m_iTeamNum)
return;

ZEPlayer* pPlayer = pAttacker->GetZEPlayer();

if (!pPlayer)
return;

pPlayer->SetTotalKills(pPlayer->GetTotalKills() + 1);
if (g_cvarEnableTopDefender.Get())
TD_OnPlayerDeath(pEvent);
}

CConVar<bool> g_cvarFullAllTalk("cs2f_full_alltalk", FCVAR_NONE, "Whether to enforce sv_full_alltalk 1", false);
Expand All @@ -229,72 +199,17 @@ GAME_EVENT_F(round_start)
if (g_cvarFixHudFlashing.Get() && g_pGameRules && g_pGameRules->m_bWarmupPeriod)
g_pEngineServer2->ServerCommand("mp_warmup_end");

if (!g_cvarEnableTopDefender.Get() || !GetGlobals())
return;

for (int i = 0; i < GetGlobals()->maxClients; i++)
{
ZEPlayer* pPlayer = g_playerManager->GetPlayer(i);

if (!pPlayer)
continue;

pPlayer->SetTotalDamage(0);
pPlayer->SetTotalHits(0);
pPlayer->SetTotalKills(0);
}
if (g_cvarEnableTopDefender.Get())
TD_OnRoundStart(pEvent);
}

GAME_EVENT_F(round_end)
{
if (g_cvarFixHudFlashing.Get() && g_pGameRules)
g_pGameRules->m_bGameRestart = false;

if (!g_cvarEnableTopDefender.Get() || !GetGlobals())
return;

CUtlVector<ZEPlayer*> sortedPlayers;

for (int i = 0; i < GetGlobals()->maxClients; i++)
{
ZEPlayer* pPlayer = g_playerManager->GetPlayer(i);

if (!pPlayer || pPlayer->GetTotalDamage() == 0)
continue;

CCSPlayerController* pController = CCSPlayerController::FromSlot(pPlayer->GetPlayerSlot());

if (!pController)
continue;

sortedPlayers.AddToTail(pPlayer);
}

if (sortedPlayers.Count() == 0)
return;

sortedPlayers.Sort([](ZEPlayer* const* a, ZEPlayer* const* b) -> int {
return (*a)->GetTotalDamage() < (*b)->GetTotalDamage();
});

ClientPrintAll(HUD_PRINTTALK, " \x09TOP DEFENDERS");

char colorMap[] = {'\x10', '\x08', '\x09', '\x0B'};

for (int i = 0; i < sortedPlayers.Count(); i++)
{
ZEPlayer* pPlayer = sortedPlayers[i];
CCSPlayerController* pController = CCSPlayerController::FromSlot(pPlayer->GetPlayerSlot());

if (i < 5)
ClientPrintAll(HUD_PRINTTALK, " %c%i. %s \x01- \x07%i DMG \x05(%i HITS & %i KILLS)", colorMap[MIN(i, 3)], i + 1, pController->GetPlayerName(), pPlayer->GetTotalDamage(), pPlayer->GetTotalHits(), pPlayer->GetTotalKills());
else
ClientPrint(pController, HUD_PRINTTALK, " \x0C%i. %s \x01- \x07%i DMG \x05(%i HITS & %i KILLS)", i + 1, pController->GetPlayerName(), pPlayer->GetTotalDamage(), pPlayer->GetTotalHits(), pPlayer->GetTotalKills());

pPlayer->SetTotalDamage(0);
pPlayer->SetTotalHits(0);
pPlayer->SetTotalKills(0);
}
if (g_cvarEnableTopDefender.Get())
TD_OnRoundEnd(pEvent);
}

GAME_EVENT_F(round_freeze_end)
Expand Down
8 changes: 8 additions & 0 deletions src/playermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ class ZEPlayer
m_bConnected = false;
m_iTotalDamage = 0;
m_iTotalHits = 0;
m_iTotalHeadshots = 0;
m_iTotalKills = 0;
m_bVotedRTV = false;
m_bVotedExtend = false;
Expand Down Expand Up @@ -196,6 +197,7 @@ class ZEPlayer
m_flEntwatchHudX = -7.5f;
m_flEntwatchHudY = -2.0f;
m_flEntwatchHudSize = 60.0f;
m_bTopDefender = false;
}

~ZEPlayer()
Expand Down Expand Up @@ -230,6 +232,7 @@ class ZEPlayer
void SetHideDistance(int distance);
void SetTotalDamage(int damage) { m_iTotalDamage = damage; }
void SetTotalHits(int hits) { m_iTotalHits = hits; }
void SetTotalHeadshots(int headshots) { m_iTotalHeadshots = headshots; }
void SetTotalKills(int kills) { m_iTotalKills = kills; }
void SetRTVVote(bool bRTVVote) { m_bVotedRTV = bRTVVote; }
void SetRTVVoteTime(float flCurtime) { m_flRTVVoteTime = flCurtime; }
Expand Down Expand Up @@ -265,6 +268,7 @@ class ZEPlayer
void SetEntwatchHudColor(Color colorHud);
void SetEntwatchHudPos(float x, float y);
void SetEntwatchHudSize(float flSize);
void SetTopDefenderStatus(bool bStatus) { m_bTopDefender = bStatus; }

uint64 GetAdminFlags() { return m_iAdminFlags; }
int GetAdminImmunity() { return m_iAdminImmunity; }
Expand All @@ -276,6 +280,7 @@ class ZEPlayer
CPlayerSlot GetPlayerSlot() { return m_slot; }
int GetTotalDamage() { return m_iTotalDamage; }
int GetTotalHits() { return m_iTotalHits; }
int GetTotalHeadshots() { return m_iTotalHeadshots; }
int GetTotalKills() { return m_iTotalKills; }
bool GetRTVVote() { return m_bVotedRTV; }
float GetRTVVoteTime() { return m_flRTVVoteTime; }
Expand Down Expand Up @@ -313,6 +318,7 @@ class ZEPlayer
float GetEntwatchHudX() { return m_flEntwatchHudX; }
float GetEntwatchHudY() { return m_flEntwatchHudY; }
float GetEntwatchHudSize() { return m_flEntwatchHudSize; }
bool GetTopDefenderStatus() { return m_bTopDefender; }

void OnSpawn();
void OnAuthenticated();
Expand Down Expand Up @@ -346,6 +352,7 @@ class ZEPlayer
CBitVec<MAXPLAYERS> m_shouldTransmit;
int m_iTotalDamage;
int m_iTotalHits;
int m_iTotalHeadshots;
int m_iTotalKills;
bool m_bVotedRTV;
float m_flRTVVoteTime;
Expand Down Expand Up @@ -385,6 +392,7 @@ class ZEPlayer
float m_flEntwatchHudX;
float m_flEntwatchHudY;
float m_flEntwatchHudSize;
bool m_bTopDefender;
};

class CPlayerManager
Expand Down
Loading