From 63151ddd965e961d192989c2e4947f8b2cca7163 Mon Sep 17 00:00:00 2001 From: Tsukasa-Nefren Date: Fri, 10 Jul 2026 23:31:17 +0900 Subject: [PATCH] fix: use direct Schema access instead of broken engine vtable calls Replaced IVEngineServer::GetClientSteamID and IServerGameClients::GetPlayerScore vtable calls with direct CCSPlayerController Schema field access (m_steamID, m_iScore). This avoids breakage from CS2 engine updates that shifted CPlayerSlot to CEntityIndex. --- serverlistplayersfix.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/serverlistplayersfix.cpp b/serverlistplayersfix.cpp index 466f748..7f04732 100644 --- a/serverlistplayersfix.cpp +++ b/serverlistplayersfix.cpp @@ -46,9 +46,15 @@ ICvar *icvar = NULL; CSteamGameServerAPIContext g_steamAPI; IServerGameDLL* server = NULL; IVEngineServer* engine = NULL; -IServerGameClients* gameclients = NULL; CGameEntitySystem* g_pEntitySystem = nullptr; +class CCSPlayerController : public CBasePlayerController +{ +public: + DECLARE_SCHEMA_CLASS(CCSPlayerController); + SCHEMA_FIELD(int32_t, m_iScore) +}; + CGameEntitySystem* GameEntitySystem() { #ifdef WIN32 @@ -69,7 +75,6 @@ bool ServerListPlayersFix::Load(PluginId id, ISmmAPI *ismm, char *error, size_t GET_V_IFACE_ANY(GetServerFactory, g_pSource2Server, ISource2Server, SOURCE2SERVER_INTERFACE_VERSION); GET_V_IFACE_ANY(GetServerFactory, server, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); - GET_V_IFACE_ANY(GetServerFactory, gameclients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); GET_V_IFACE_CURRENT(GetEngineFactory, g_pSchemaSystem, ISchemaSystem, SCHEMASYSTEM_INTERFACE_VERSION); GET_V_IFACE_ANY(GetEngineFactory, g_pNetworkServerService, INetworkServerService, NETWORKSERVERSERVICE_INTERFACE_VERSION); GET_V_IFACE_CURRENT(GetEngineFactory, g_pGameResourceServiceServer, IGameResourceService, GAMERESOURCESERVICESERVER_INTERFACE_VERSION); @@ -105,12 +110,11 @@ void ServerListPlayersFix::UpdatePlayers() for (int i = 0; i < gpGlobals->maxClients; i++) { - auto steamId = engine->GetClientSteamID(CPlayerSlot(i)); - if (steamId) + auto controller = (CCSPlayerController*)g_pEntitySystem->GetEntityInstance(CEntityIndex(i+1)); + if (controller && controller->IsConnected() && controller->m_steamID() != 0) { - auto controller = (CBasePlayerController*)g_pEntitySystem->GetEntityInstance(CEntityIndex(i+1)); - if(controller) - g_steamAPI.SteamGameServer()->BUpdateUserData(*steamId, controller->GetPlayerName(), gameclients->GetPlayerScore(CPlayerSlot(i))); + CSteamID steamId(controller->m_steamID()); + g_steamAPI.SteamGameServer()->BUpdateUserData(steamId, controller->GetPlayerName(), controller->m_iScore()); } } }