Skip to content

Commit 6766065

Browse files
committed
fix(GetPlayer): Caching invalid players
1 parent bc83e54 commit 6766065

File tree

5 files changed

+44
-56
lines changed

5 files changed

+44
-56
lines changed

src/player/player/Player.cpp

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,16 @@ Player::Player(bool m_isFakeClient, int m_slot, const char* m_name, uint64 m_xui
7272
centerMessageEvent->SetUint64("duration", 1);
7373
centerMessageEvent->SetInt("userid", this->slot);
7474

75-
if(!this->isFakeClient) playerListener = g_Signatures->FetchSignature<GetLegacyGameEventListener>("LegacyGameEventListener")(CPlayerSlot(this->slot));
75+
if (!this->isFakeClient) playerListener = g_Signatures->FetchSignature<GetLegacyGameEventListener>("LegacyGameEventListener")(CPlayerSlot(this->slot));
7676
}
7777

7878
Player::~Player()
7979
{
8080
this->isFakeClient = true;
8181
g_gameEventManager->FreeEvent(centerMessageEvent);
82-
if(menu_renderer) delete menu_renderer;
82+
if (menu_renderer) delete menu_renderer;
83+
if (playerObject != nullptr)
84+
delete playerObject;
8385
}
8486

8587
CBasePlayerController* Player::GetController()
@@ -136,7 +138,7 @@ void Player::SendMsg(int dest, const char* msg, ...)
136138
CBasePlayerController* controller = this->GetController();
137139
if (!controller)
138140
return;
139-
if(this->IsFakeClient())
141+
if (this->IsFakeClient())
140142
return;
141143

142144
if (dest == HUD_PRINTTALK || dest == HUD_PRINTNOTIFY)
@@ -172,7 +174,7 @@ void Player::SendMsg(int dest, const char* msg, ...)
172174
}
173175
else if (dest == HUD_PRINTCENTER)
174176
{
175-
if(std::string(msg) == "") this->centerMessageEndTime = 0;
177+
if (std::string(msg) == "") this->centerMessageEndTime = 0;
176178
else {
177179
this->centerMessageEndTime = GetTime() + 5000;
178180
this->centerMessageEvent->SetString("loc_token", msg);
@@ -354,11 +356,11 @@ void OnClientKeyStateChange(int playerid, std::string key, bool pressed);
354356

355357
void Player::SetButtons(uint64_t new_buttons)
356358
{
357-
if(buttons != new_buttons) {
358-
for(uint16_t i = 0; i < 64; i++) {
359-
if((buttons & (1ULL << i)) != 0 && (new_buttons & (1ULL << i)) == 0)
359+
if (buttons != new_buttons) {
360+
for (uint16_t i = 0; i < 64; i++) {
361+
if ((buttons & (1ULL << i)) != 0 && (new_buttons & (1ULL << i)) == 0)
360362
OnClientKeyStateChange(this->slot, key_buttons[i], true);
361-
else if((buttons & (1ULL << i)) == 0 && (new_buttons & (1ULL << i)) != 0)
363+
else if ((buttons & (1ULL << i)) == 0 && (new_buttons & (1ULL << i)) != 0)
362364
OnClientKeyStateChange(this->slot, key_buttons[i], false);
363365
}
364366
buttons = new_buttons;
@@ -385,9 +387,9 @@ void Player::SetClientConvar(std::string cmd, std::string val)
385387
CSingleRecipientFilter filter(this->slot);
386388
g_pGameEventSystem->PostEventAbstract(-1, false, &filter, netmsg, msg, 0);
387389

388-
#ifndef _WIN32
390+
#ifndef _WIN32
389391
delete msg;
390-
#endif
392+
#endif
391393
}
392394

393395
std::any Player::GetInternalVar(std::string name)
@@ -426,26 +428,27 @@ ListenOverride Player::GetListen(CPlayerSlot slot) const
426428
CBaseViewModel* Player::EnsureCustomView(int index)
427429
{
428430
CCSPlayerPawnBase* pPawnBase = GetPlayerBasePawn();
429-
if(!pPawnBase) return nullptr;
430-
if(pPawnBase->m_lifeState() == 2) {
431-
if(GetPlayerController()->m_bControllingBot()) {
431+
if (!pPawnBase) return nullptr;
432+
if (pPawnBase->m_lifeState() == 2) {
433+
if (GetPlayerController()->m_bControllingBot()) {
432434
return nullptr;
433-
} else {
434-
if(!GetPawn()->m_pObserverServices()) return nullptr;
435+
}
436+
else {
437+
if (!GetPawn()->m_pObserverServices()) return nullptr;
435438
auto observerPawn = GetPawn()->m_pObserverServices->m_hObserverTarget();
436-
if(!observerPawn) return nullptr;
437-
439+
if (!observerPawn) return nullptr;
440+
438441
auto observerController = ((CCSPlayerPawn*)(observerPawn.Get()))->m_hOriginalController();
439-
if(!observerController) return nullptr;
440-
442+
if (!observerController) return nullptr;
443+
441444
auto observer = g_playerManager->GetPlayer(observerController->entindex() - 1);
442-
if(!observer) return nullptr;
445+
if (!observer) return nullptr;
443446

444447
pPawnBase = observer->GetPlayerBasePawn();
445448
}
446449
}
447-
if(!pPawnBase) return nullptr;
448-
if(!pPawnBase->m_pViewModelServices()) return nullptr;
450+
if (!pPawnBase) return nullptr;
451+
if (!pPawnBase->m_pViewModelServices()) return nullptr;
449452

450453
CBaseViewModel* pViewModel = pPawnBase->m_pViewModelServices()->GetViewModel(index);
451454
if (!pViewModel) {
@@ -455,4 +458,12 @@ CBaseViewModel* Player::EnsureCustomView(int index)
455458
}
456459

457460
return pViewModel;
461+
}
462+
463+
PluginPlayer* Player::GetPlayerObject()
464+
{
465+
if (playerObject == nullptr) {
466+
playerObject = new PluginPlayer(this->GetSlot().Get());
467+
}
468+
return playerObject;
458469
}

src/player/player/Player.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "../../sdk/entity/CBaseViewModel.h"
1010
#include "../../server/menus/Menu.h"
1111
#include "../../server/menus/MenuRenderer.h"
12+
#include "../../plugins/core/scripting.h"
1213

1314
#include <string>
1415
#include <public/mathlib/vector.h>
@@ -96,6 +97,7 @@ class Player
9697
ListenOverride GetListen(CPlayerSlot slot) const;
9798

9899
CBaseViewModel* EnsureCustomView(int index);
100+
PluginPlayer* GetPlayerObject();
99101

100102
CPlayerBitVec m_selfMutes[64] = {};
101103

@@ -125,6 +127,7 @@ class Player
125127

126128
ListenOverride m_listenMap[66] = {};
127129
VoiceFlag_t m_voiceFlag = 0;
130+
PluginPlayer* playerObject = nullptr;
128131
};
129-
extern std::map<std::string, std::string> colors;
132+
extern std::map<std::string, std::string> colors;
130133
#endif

src/plugins/core/scripting.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,11 @@ class SDKBaseClass
239239
{
240240
private:
241241
void* m_ptr;
242-
242+
243243
public:
244244
std::string m_className;
245245
uint64_t classOffset;
246-
246+
247247
SDKBaseClass() = default;
248248
SDKBaseClass(void* ptr, std::string className);
249249
SDKBaseClass(std::string ptr, std::string className);
@@ -677,7 +677,6 @@ class PluginWeaponManager
677677
class PluginPlayer
678678
{
679679
private:
680-
std::string plugin_name;
681680
int playerId;
682681

683682
SDKBaseClass* pCBaseEntity = nullptr;
@@ -688,7 +687,7 @@ class PluginPlayer
688687
SDKBaseClass* pCCSPlayerPawnBase = nullptr;
689688

690689
public:
691-
PluginPlayer(std::string m_plugin_name, int m_playerId);
690+
PluginPlayer(int m_playerId);
692691
~PluginPlayer();
693692

694693
SDKBaseClass* GetCBaseEntity();
@@ -890,7 +889,7 @@ class PluginHooks
890889
class PluginVGUI
891890
{
892891
private:
893-
std::string m_plugin_name;
892+
std::string m_plugin_name;
894893

895894
public:
896895
PluginVGUI(std::string plugin_name);

src/plugins/core/scripting/player/player.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77

88
typedef IGameEventListener2* (*GetLegacyGameEventListener)(CPlayerSlot slot);
99

10-
PluginPlayer::PluginPlayer(std::string m_plugin_name, int m_playerId)
10+
PluginPlayer::PluginPlayer(int m_playerId)
1111
{
12-
this->plugin_name = m_plugin_name;
1312
this->playerId = m_playerId;
1413

1514
pCBaseEntity = new SDKBaseClass(nullptr, "CBaseEntity");

src/plugins/loader/scripting/player/player.cpp

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,13 @@
11
#include "../../core.h"
22
#include "../../../../player/playermanager/PlayerManager.h"
33

4-
std::map<int, std::pair<uint64_t, PluginPlayer*>> playerObjectCache;
5-
64
PluginPlayer* scripting_GetPlayer(int playerid, EContext* state)
75
{
86
Player* player = g_playerManager->GetPlayer(playerid);
97
if (!player)
108
return nullptr;
119

12-
PluginPlayer* pl = nullptr;
13-
bool found = (playerObjectCache.find(playerid) != playerObjectCache.end());
14-
if (found)
15-
{
16-
auto pair = playerObjectCache[playerid];
17-
if (pair.first != player->GetSteamID())
18-
{
19-
delete pair.second;
20-
found = false;
21-
}
22-
else
23-
pl = pair.second;
24-
}
25-
26-
if (!found)
27-
{
28-
uint64_t steamid = player->GetSteamID();
29-
30-
pl = new PluginPlayer(FetchPluginName(state), playerid);
31-
playerObjectCache.insert({ playerid, {steamid, pl} });
32-
}
33-
34-
return pl;
10+
return player->GetPlayerObject();
3511
}
3612

3713
LoadScriptingComponent(
@@ -80,7 +56,7 @@ LoadScriptingComponent(
8056
.addFunction("QueryConvar", &PluginPlayer::QueryConvar)
8157
.addFunction("PerformMenuAction", &PluginPlayer::PerformMenuAction)
8258
.addFunction("IsValid", &PluginPlayer::IsValid)
83-
.endClass();
59+
.endClass();
8460

8561
GetGlobalNamespace(state)
8662
.addFunction("GetPlayer", scripting_GetPlayer);

0 commit comments

Comments
 (0)