prevent playlist var names over 64 characters and send maxplayers on map change
This commit is contained in:
parent
3dcd9f6b6d
commit
352952bd8b
|
@ -664,18 +664,18 @@ void MasterServerManager::AddSelfToServerList(int port, int authPort, char* name
|
|||
requestThread.detach();
|
||||
}
|
||||
|
||||
void MasterServerManager::UpdateServerMapAndPlaylist(char* map, char* playlist)
|
||||
void MasterServerManager::UpdateServerMapAndPlaylist(char* map, char* playlist, int maxPlayers)
|
||||
{
|
||||
// dont call this if we don't have a server id
|
||||
if (!*m_ownServerId)
|
||||
return;
|
||||
|
||||
std::thread requestThread([this, map, playlist] {
|
||||
std::thread requestThread([this, map, playlist, maxPlayers] {
|
||||
httplib::Client http(Cvar_ns_masterserver_hostname->m_pszString);
|
||||
http.set_connection_timeout(25);
|
||||
|
||||
// we dont process this at all atm, maybe do later, but atm not necessary
|
||||
if (auto result = http.Post(fmt::format("/server/update_values?id={}&map={}&playlist={}", m_ownServerId, map, playlist).c_str()))
|
||||
if (auto result = http.Post(fmt::format("/server/update_values?id={}&map={}&playlist={}&maxPlayers={}", m_ownServerId, map, playlist, maxPlayers).c_str()))
|
||||
{
|
||||
m_successfullyConnected = true;
|
||||
}
|
||||
|
@ -790,7 +790,7 @@ void CHostState__State_NewGameHook(CHostState* hostState)
|
|||
CHostState__State_NewGame(hostState);
|
||||
|
||||
int maxPlayers = 6;
|
||||
char* maxPlayersVar = GetCurrentPlaylistVar("max_players", true);
|
||||
char* maxPlayersVar = GetCurrentPlaylistVar("max_players", false);
|
||||
if (maxPlayersVar) // GetCurrentPlaylistVar can return null so protect against this
|
||||
maxPlayers = std::stoi(maxPlayersVar);
|
||||
|
||||
|
@ -801,13 +801,23 @@ void CHostState__State_NewGameHook(CHostState* hostState)
|
|||
|
||||
void CHostState__State_ChangeLevelMPHook(CHostState* hostState)
|
||||
{
|
||||
g_MasterServerManager->UpdateServerMapAndPlaylist(hostState->m_levelName, (char*)GetCurrentPlaylistName());
|
||||
int maxPlayers = 6;
|
||||
char* maxPlayersVar = GetCurrentPlaylistVar("max_players", false);
|
||||
if (maxPlayersVar) // GetCurrentPlaylistVar can return null so protect against this
|
||||
maxPlayers = std::stoi(maxPlayersVar);
|
||||
|
||||
g_MasterServerManager->UpdateServerMapAndPlaylist(hostState->m_levelName, (char*)GetCurrentPlaylistName(), maxPlayers);
|
||||
CHostState__State_ChangeLevelMP(hostState);
|
||||
}
|
||||
|
||||
void CHostState__State_ChangeLevelSPHook(CHostState* hostState)
|
||||
{
|
||||
g_MasterServerManager->UpdateServerMapAndPlaylist(hostState->m_levelName, (char*)GetCurrentPlaylistName());
|
||||
int maxPlayers = 6;
|
||||
char* maxPlayersVar = GetCurrentPlaylistVar("max_players", false);
|
||||
if (maxPlayersVar) // GetCurrentPlaylistVar can return null so protect against this
|
||||
maxPlayers = std::stoi(maxPlayersVar);
|
||||
|
||||
g_MasterServerManager->UpdateServerMapAndPlaylist(hostState->m_levelName, (char*)GetCurrentPlaylistName(), maxPlayers);
|
||||
CHostState__State_ChangeLevelSP(hostState);
|
||||
}
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ public:
|
|||
void AuthenticateWithOwnServer(char* uid, char* playerToken);
|
||||
void AuthenticateWithServer(char* uid, char* playerToken, char* serverId, char* password);
|
||||
void AddSelfToServerList(int port, int authPort, char* name, char* description, char* map, char* playlist, int maxPlayers, char* password);
|
||||
void UpdateServerMapAndPlaylist(char* map, char* playlist);
|
||||
void UpdateServerMapAndPlaylist(char* map, char* playlist, int playerCount);
|
||||
void UpdateServerPlayerCount(int playerCount);
|
||||
void WritePlayerPersistentData(char* playerId, char* pdata, size_t pdataSize);
|
||||
void RemoveSelfFromServerList();
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
typedef char(*Onclc_SetPlaylistVarOverrideType)(void* a1, void* a2);
|
||||
Onclc_SetPlaylistVarOverrideType Onclc_SetPlaylistVarOverride;
|
||||
// function type defined in gameutils.h
|
||||
SetPlaylistVarOverrideType SetPlaylistVarOverrideOriginal;
|
||||
|
||||
ConVar* Cvar_ns_use_clc_SetPlaylistVarOverride;
|
||||
|
||||
|
@ -29,6 +31,14 @@ char Onclc_SetPlaylistVarOverrideHook(void* a1, void* a2)
|
|||
return Onclc_SetPlaylistVarOverride(a1, a2);
|
||||
}
|
||||
|
||||
void SetPlaylistVarOverrideHook(const char* varName, const char* value)
|
||||
{
|
||||
if (strlen(value) >= 64)
|
||||
return;
|
||||
|
||||
SetPlaylistVarOverrideOriginal(varName, value);
|
||||
}
|
||||
|
||||
void InitialisePlaylistHooks(HMODULE baseAddress)
|
||||
{
|
||||
RegisterConCommand("setplaylist", SetPlaylistCommand, "Sets the current playlist", FCVAR_NONE);
|
||||
|
@ -39,6 +49,7 @@ void InitialisePlaylistHooks(HMODULE baseAddress)
|
|||
|
||||
HookEnabler hook;
|
||||
ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x222180, &Onclc_SetPlaylistVarOverrideHook, reinterpret_cast<LPVOID*>(&Onclc_SetPlaylistVarOverride));
|
||||
ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18ED17, &SetPlaylistVarOverrideHook, reinterpret_cast<LPVOID*>(&SetPlaylistVarOverrideOriginal));
|
||||
|
||||
// patch to prevent clc_SetPlaylistVarOverride from being able to crash servers if we reach max overrides due to a call to Error (why is this possible respawn, wtf)
|
||||
// todo: add a warning for this
|
||||
|
|
Loading…
Reference in New Issue