Skip to content

Commit 0354abe

Browse files
notkoenVauff
andcommitted
Expand TopDefender Functionality (#420)
* Update TopDefender * formatter --------- Co-authored-by: Vauff <mctehkitti@gmail.com>
1 parent a24baaf commit 0354abe

9 files changed

Lines changed: 435 additions & 95 deletions

File tree

AMBuilder

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ for sdk_target in MMSPlugin.sdk_targets:
7070
'src/entitylistener.cpp',
7171
'src/leader.cpp',
7272
'src/buttonwatch.cpp',
73+
'src/topdefender.cpp',
7374
'src/idlemanager.cpp',
7475
'sdk/entity2/entitysystem.cpp',
7576
'sdk/entity2/entityidentity.cpp',

CS2Fixes.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
<ClCompile Include="src\panoramavote.cpp" />
208208
<ClCompile Include="src\patches.cpp" />
209209
<ClCompile Include="src\playermanager.cpp" />
210+
<ClCompile Include="src\topdefender.cpp" />
210211
<ClCompile Include="src\user_preferences.cpp" />
211212
<ClCompile Include="src\votemanager.cpp" />
212213
<ClCompile Include="src\zombiereborn.cpp" />
@@ -282,6 +283,7 @@
282283
<ClInclude Include="src\recipientfilters.h" />
283284
<ClInclude Include="src\cs2_sdk\serversideclient.h" />
284285
<ClInclude Include="src\cs2_sdk\clientframe.h" />
286+
<ClInclude Include="src\topdefender.h" />
285287
<ClInclude Include="src\utils\plat_win.h" />
286288
<ClInclude Include="src\votemanager.h" />
287289
<ClInclude Include="src\map_votes.h" />

CS2Fixes.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@
197197
<ClCompile Include="src\cs2_sdk\entity\cbasemodelentity.cpp">
198198
<Filter>Source Files\cs2_sdk\entity</Filter>
199199
</ClCompile>
200+
<ClCompile Include="src\topdefender.cpp">
201+
<Filter>Source Files</Filter>
202+
</ClCompile>
200203
</ItemGroup>
201204
<ItemGroup>
202205
<ClInclude Include="src\mempatch.h">
@@ -421,5 +424,8 @@
421424
<ClInclude Include="src\cs2_sdk\entity\cpointorient.h">
422425
<Filter>Header Files\cs2_sdk\entity</Filter>
423426
</ClInclude>
427+
<ClInclude Include="src\topdefender.h">
428+
<Filter>Header Files</Filter>
429+
</ClInclude>
424430
</ItemGroup>
425431
</Project>

cfg/cs2fixes/cs2fixes.cfg

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ cs2f_weapons_enable 0 // Whether to enable weapon commands
66
cs2f_stopsound_enable 0 // Whether to enable stopsound
77
cs2f_noblock_enable 0 // Whether to use player noblock, which sets debris collision on every player
88
cs2f_noblock_grenades 0 // Whether to use noblock on grenade projectiles
9-
cs2f_topdefender_enable 0 // Whether to use TopDefender
109
cs2f_block_team_messages 0 // Whether to block team join messages
1110
cs2f_movement_unlocker_enable 0 // Whether to enable movement unlocker
1211
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)
@@ -60,6 +59,15 @@ cs2f_hide_distance_default 250 // The default distance for hide
6059
cs2f_hide_distance_max 2000 // The max distance for hide
6160
cs2f_hide_teammates_only 0 // Whether to hide teammates only
6261

62+
// TopDefender settings
63+
cs2f_topdefender_enable 0 // Whether to use TopDefender
64+
cs2f_topdefender_scoreboard 0 // Whether to display defender rank on scoreboard as MVP count
65+
cs2f_topdefender_print 1 // Whether to print defender stats to console at round end
66+
cs2f_topdefender_score 5000 // Score given to the top defender
67+
cs2f_topdefender_threshold 1000 // Damage threshold for Top Defenders to be shown on round end
68+
cs2f_topdefender_rate 1.0 // How often TopDefender stats get updated
69+
cs2f_topdefender_clantag "[Top Defender]" // Clan tag given to the top defender
70+
6371
// Chat flood settings
6472
cs2f_flood_interval 0.75 // Amount of time allowed between chat messages acquiring flood tokens
6573
cs2f_max_flood_tokens 3 // Maximum number of flood tokens allowed before chat messages are blocked

src/cs2_sdk/entity/ccsplayercontroller.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ class CCSPlayerController : public CBasePlayerController
4646
SCHEMA_FIELD(int32_t, m_iRoundsWon)
4747
SCHEMA_FIELD(int32_t, m_iMVPs)
4848
SCHEMA_FIELD(float, m_flSmoothedPing)
49+
SCHEMA_FIELD(bool, m_bMvpNoMusic)
50+
SCHEMA_FIELD(int32_t, m_eMvpReason)
51+
SCHEMA_FIELD(int32_t, m_iMusicKitID)
52+
SCHEMA_FIELD(int32_t, m_iMusicKitMVPs)
4953

5054
static CCSPlayerController* FromPawn(CCSPlayerPawn* pawn)
5155
{

src/events.cpp

Lines changed: 9 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "map_votes.h"
3333
#include "panoramavote.h"
3434
#include "recipientfilters.h"
35+
#include "topdefender.h"
3536
#include "votemanager.h"
3637
#include "zombiereborn.h"
3738

@@ -160,27 +161,10 @@ GAME_EVENT_F(player_spawn)
160161
pItemServices->GiveNamedItem("item_assaultsuit");
161162
}
162163

163-
CConVar<bool> g_cvarEnableTopDefender("cs2f_topdefender_enable", FCVAR_NONE, "Whether to use TopDefender", false);
164-
165164
GAME_EVENT_F(player_hurt)
166165
{
167-
if (!g_cvarEnableTopDefender.Get())
168-
return;
169-
170-
CCSPlayerController* pAttacker = (CCSPlayerController*)pEvent->GetPlayerController("attacker");
171-
CCSPlayerController* pVictim = (CCSPlayerController*)pEvent->GetPlayerController("userid");
172-
173-
// Ignore Ts/zombies and CTs hurting themselves
174-
if (!pAttacker || pAttacker->m_iTeamNum() != CS_TEAM_CT || pAttacker->m_iTeamNum() == pVictim->m_iTeamNum())
175-
return;
176-
177-
ZEPlayer* pPlayer = pAttacker->GetZEPlayer();
178-
179-
if (!pPlayer)
180-
return;
181-
182-
pPlayer->SetTotalDamage(pPlayer->GetTotalDamage() + pEvent->GetInt("dmg_health"));
183-
pPlayer->SetTotalHits(pPlayer->GetTotalHits() + 1);
166+
if (g_cvarEnableTopDefender.Get())
167+
TD_OnPlayerHurt(pEvent);
184168
}
185169

186170
GAME_EVENT_F(player_death)
@@ -191,22 +175,8 @@ GAME_EVENT_F(player_death)
191175
if (g_cvarEnableEntWatch.Get())
192176
EW_PlayerDeath(pEvent);
193177

194-
if (!g_cvarEnableTopDefender.Get())
195-
return;
196-
197-
CCSPlayerController* pAttacker = (CCSPlayerController*)pEvent->GetPlayerController("attacker");
198-
CCSPlayerController* pVictim = (CCSPlayerController*)pEvent->GetPlayerController("userid");
199-
200-
// Ignore Ts/zombie kills and ignore CT teamkilling or suicide
201-
if (!pAttacker || !pVictim || pAttacker->m_iTeamNum != CS_TEAM_CT || pAttacker->m_iTeamNum == pVictim->m_iTeamNum)
202-
return;
203-
204-
ZEPlayer* pPlayer = pAttacker->GetZEPlayer();
205-
206-
if (!pPlayer)
207-
return;
208-
209-
pPlayer->SetTotalKills(pPlayer->GetTotalKills() + 1);
178+
if (g_cvarEnableTopDefender.Get())
179+
TD_OnPlayerDeath(pEvent);
210180
}
211181

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

232-
if (!g_cvarEnableTopDefender.Get() || !GetGlobals())
233-
return;
234-
235-
for (int i = 0; i < GetGlobals()->maxClients; i++)
236-
{
237-
ZEPlayer* pPlayer = g_playerManager->GetPlayer(i);
238-
239-
if (!pPlayer)
240-
continue;
241-
242-
pPlayer->SetTotalDamage(0);
243-
pPlayer->SetTotalHits(0);
244-
pPlayer->SetTotalKills(0);
245-
}
202+
if (g_cvarEnableTopDefender.Get())
203+
TD_OnRoundStart(pEvent);
246204
}
247205

248206
GAME_EVENT_F(round_end)
249207
{
250208
if (g_cvarFixHudFlashing.Get() && g_pGameRules)
251209
g_pGameRules->m_bGameRestart = false;
252210

253-
if (!g_cvarEnableTopDefender.Get() || !GetGlobals())
254-
return;
255-
256-
CUtlVector<ZEPlayer*> sortedPlayers;
257-
258-
for (int i = 0; i < GetGlobals()->maxClients; i++)
259-
{
260-
ZEPlayer* pPlayer = g_playerManager->GetPlayer(i);
261-
262-
if (!pPlayer || pPlayer->GetTotalDamage() == 0)
263-
continue;
264-
265-
CCSPlayerController* pController = CCSPlayerController::FromSlot(pPlayer->GetPlayerSlot());
266-
267-
if (!pController)
268-
continue;
269-
270-
sortedPlayers.AddToTail(pPlayer);
271-
}
272-
273-
if (sortedPlayers.Count() == 0)
274-
return;
275-
276-
sortedPlayers.Sort([](ZEPlayer* const* a, ZEPlayer* const* b) -> int {
277-
return (*a)->GetTotalDamage() < (*b)->GetTotalDamage();
278-
});
279-
280-
ClientPrintAll(HUD_PRINTTALK, " \x09TOP DEFENDERS");
281-
282-
char colorMap[] = {'\x10', '\x08', '\x09', '\x0B'};
283-
284-
for (int i = 0; i < sortedPlayers.Count(); i++)
285-
{
286-
ZEPlayer* pPlayer = sortedPlayers[i];
287-
CCSPlayerController* pController = CCSPlayerController::FromSlot(pPlayer->GetPlayerSlot());
288-
289-
if (i < 5)
290-
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());
291-
else
292-
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());
293-
294-
pPlayer->SetTotalDamage(0);
295-
pPlayer->SetTotalHits(0);
296-
pPlayer->SetTotalKills(0);
297-
}
211+
if (g_cvarEnableTopDefender.Get())
212+
TD_OnRoundEnd(pEvent);
298213
}
299214

300215
GAME_EVENT_F(round_freeze_end)

src/playermanager.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ class ZEPlayer
165165
m_bConnected = false;
166166
m_iTotalDamage = 0;
167167
m_iTotalHits = 0;
168+
m_iTotalHeadshots = 0;
168169
m_iTotalKills = 0;
169170
m_bVotedRTV = false;
170171
m_bVotedExtend = false;
@@ -196,6 +197,7 @@ class ZEPlayer
196197
m_flEntwatchHudX = -7.5f;
197198
m_flEntwatchHudY = -2.0f;
198199
m_flEntwatchHudSize = 60.0f;
200+
m_bTopDefender = false;
199201
}
200202

201203
~ZEPlayer()
@@ -230,6 +232,7 @@ class ZEPlayer
230232
void SetHideDistance(int distance);
231233
void SetTotalDamage(int damage) { m_iTotalDamage = damage; }
232234
void SetTotalHits(int hits) { m_iTotalHits = hits; }
235+
void SetTotalHeadshots(int headshots) { m_iTotalHeadshots = headshots; }
233236
void SetTotalKills(int kills) { m_iTotalKills = kills; }
234237
void SetRTVVote(bool bRTVVote) { m_bVotedRTV = bRTVVote; }
235238
void SetRTVVoteTime(float flCurtime) { m_flRTVVoteTime = flCurtime; }
@@ -265,6 +268,7 @@ class ZEPlayer
265268
void SetEntwatchHudColor(Color colorHud);
266269
void SetEntwatchHudPos(float x, float y);
267270
void SetEntwatchHudSize(float flSize);
271+
void SetTopDefenderStatus(bool bStatus) { m_bTopDefender = bStatus; }
268272

269273
uint64 GetAdminFlags() { return m_iAdminFlags; }
270274
int GetAdminImmunity() { return m_iAdminImmunity; }
@@ -276,6 +280,7 @@ class ZEPlayer
276280
CPlayerSlot GetPlayerSlot() { return m_slot; }
277281
int GetTotalDamage() { return m_iTotalDamage; }
278282
int GetTotalHits() { return m_iTotalHits; }
283+
int GetTotalHeadshots() { return m_iTotalHeadshots; }
279284
int GetTotalKills() { return m_iTotalKills; }
280285
bool GetRTVVote() { return m_bVotedRTV; }
281286
float GetRTVVoteTime() { return m_flRTVVoteTime; }
@@ -313,6 +318,7 @@ class ZEPlayer
313318
float GetEntwatchHudX() { return m_flEntwatchHudX; }
314319
float GetEntwatchHudY() { return m_flEntwatchHudY; }
315320
float GetEntwatchHudSize() { return m_flEntwatchHudSize; }
321+
bool GetTopDefenderStatus() { return m_bTopDefender; }
316322

317323
void OnSpawn();
318324
void OnAuthenticated();
@@ -346,6 +352,7 @@ class ZEPlayer
346352
CBitVec<MAXPLAYERS> m_shouldTransmit;
347353
int m_iTotalDamage;
348354
int m_iTotalHits;
355+
int m_iTotalHeadshots;
349356
int m_iTotalKills;
350357
bool m_bVotedRTV;
351358
float m_flRTVVoteTime;
@@ -385,6 +392,7 @@ class ZEPlayer
385392
float m_flEntwatchHudX;
386393
float m_flEntwatchHudY;
387394
float m_flEntwatchHudSize;
395+
bool m_bTopDefender;
388396
};
389397

390398
class CPlayerManager

0 commit comments

Comments
 (0)