2.2.0
build / build with mms1.12 on oldlinux (push) Has been cancelled
build / build with mms1.12 on linux (push) Has been cancelled
build / build with mms1.12 on win (push) Has been cancelled
build / Release (push) Has been cancelled

New method for changing the MaxClients limit. Thanks to @A1mDev
This commit is contained in:
Accelerator
2025-11-18 18:57:20 +03:00
parent aa143fb0e0
commit ef2a8df7e0
3 changed files with 11 additions and 43 deletions
-2
View File
@@ -2,7 +2,6 @@
#define _INCLUDE_GAME_OFFSETS_
#if SH_SYS == SH_SYS_WIN32
const int maxplayers_offs = 0x228; // m_nMaxClientsLimit (in CGameServer::SetMaxClients)
#if SOURCE_ENGINE == SE_LEFT4DEAD
const int sv_offs = 6; // IServer pointer (in IVEngineServer::CreateFakeClient)
const int maxhuman_idx = 131; // CTerrorGameRules::GetMaxHumanPlayers vtable
@@ -11,7 +10,6 @@
const int maxhuman_idx = 136; // CTerrorGameRules::GetMaxHumanPlayers vtable
#endif
#else
const int maxplayers_offs = 0x220; // m_nMaxClientsLimit (in CGameServer::SetMaxClients)
#if SOURCE_ENGINE == SE_LEFT4DEAD
const char* engine_dll = "engine.so";
const int maxhuman_idx = 132; // CTerrorGameRules::GetMaxHumanPlayers vtable
+11 -40
View File
@@ -27,7 +27,7 @@ SH_DECL_HOOK2_void(CBaseServer, ReplyReservationRequest, SH_NOATTRIB, 0, netadr_
ConVar sv_maxplayers("sv_maxplayers", "-1", FCVAR_SPONLY|FCVAR_NOTIFY, "Max Human Players", true, -1, true, 32, l4dtoolz::OnChangeMaxplayers);
ConVar sv_force_unreserved("sv_force_unreserved", "0", FCVAR_SPONLY|FCVAR_NOTIFY, "Disallow lobby reservation cookie", true, 0, true, 1, l4dtoolz::OnChangeUnreserved);
void l4dtoolz::OnChangeMaxplayers ( IConVar *var, const char *pOldValue, float flOldValue )
void l4dtoolz::OnChangeMaxplayers(IConVar *var, const char *pOldValue, float flOldValue)
{
int new_value = ((ConVar*)var)->GetInt();
int old_value = atoi(pOldValue);
@@ -35,8 +35,8 @@ void l4dtoolz::OnChangeMaxplayers ( IConVar *var, const char *pOldValue, float f
Msg("g_pGameIServer pointer is not available\n");
return;
}
if(new_value != old_value) {
if(new_value >= 0) {
if (new_value != old_value) {
if (new_value >= 0) {
g_nGameSlots = new_value;
g_pGameIServer->m_numGameSlots = g_nGameSlots;
} else {
@@ -45,7 +45,7 @@ void l4dtoolz::OnChangeMaxplayers ( IConVar *var, const char *pOldValue, float f
}
}
void l4dtoolz::OnChangeUnreserved ( IConVar *var, const char *pOldValue, float flOldValue )
void l4dtoolz::OnChangeUnreserved(IConVar *var, const char *pOldValue, float flOldValue)
{
int new_value = ((ConVar*)var)->GetInt();
int old_value = atoi(pOldValue);
@@ -53,8 +53,8 @@ void l4dtoolz::OnChangeUnreserved ( IConVar *var, const char *pOldValue, float f
Msg("g_pGameIServer pointer is not available\n");
return;
}
if(new_value != old_value) {
if(new_value == 1) {
if (new_value != old_value) {
if (new_value == 1) {
g_pCVar->FindVar("sv_allow_lobby_connect_only")->SetValue(0);
}
}
@@ -117,23 +117,11 @@ bool l4dtoolz::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool
g_pGameIServer = (CBaseServer *)g_MemUtils.ResolveSymbol(handle, "sv");
dlclose(handle);
#endif
int* m_nMaxClientsLimit = reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(g_pGameIServer)+maxplayers_offs);
if (*m_nMaxClientsLimit != 18) {
Warning("Couldn't patch maxplayers\n");
if (!late) {
g_pGameIServer = NULL;
}
const char *pszCmdLineMax;
if (CommandLine()->CheckParm("-maxplayers", &pszCmdLineMax)) {
g_pGameIServer->m_nMaxclients = clamp(atoi(pszCmdLineMax), 1, 32);
} else {
*m_nMaxClientsLimit = 32;
const char *pszCmdLineMax;
if(CommandLine()->CheckParm("-maxplayers", &pszCmdLineMax) || CommandLine()->CheckParm("+maxplayers", &pszCmdLineMax)) {
char command[32];
UTIL_Format(command, sizeof(command), "maxplayers %d\n", clamp(atoi(pszCmdLineMax), 1, 32));
engine->ServerCommand(command);
} else {
engine->ServerCommand("maxplayers 31\n");
}
engine->ServerExecute();
g_pGameIServer->m_nMaxclients = 31;
}
}
@@ -203,23 +191,6 @@ void l4dtoolz::LevelShutdown()
}
}
size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
size_t len = vsnprintf(buffer, maxlength, fmt, ap);
va_end(ap);
if (len >= maxlength)
{
len = maxlength - 1;
buffer[len] = '\0';
}
return len;
}
ServerClass *UTIL_FindServerClass(const char *classname)
{
ServerClass *sc = gamedll->GetAllServerClasses();
@@ -242,7 +213,7 @@ const char *l4dtoolz::GetLicense()
const char *l4dtoolz::GetVersion()
{
return "2.1.0";
return "2.2.0";
}
const char *l4dtoolz::GetDate()
-1
View File
@@ -26,7 +26,6 @@ public:
static void OnChangeUnreserved ( IConVar *var, const char *pOldValue, float flOldValue );
};
size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...);
ServerClass *UTIL_FindServerClass(const char *classname);
extern l4dtoolz g_l4dtoolz;