mirror of
https://github.com/accelerator74/l4dtoolz.git
synced 2026-10-10 04:03:16 +08:00
2.2.0
New method for changing the MaxClients limit. Thanks to @A1mDev
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
#define _INCLUDE_GAME_OFFSETS_
|
#define _INCLUDE_GAME_OFFSETS_
|
||||||
|
|
||||||
#if SH_SYS == SH_SYS_WIN32
|
#if SH_SYS == SH_SYS_WIN32
|
||||||
const int maxplayers_offs = 0x228; // m_nMaxClientsLimit (in CGameServer::SetMaxClients)
|
|
||||||
#if SOURCE_ENGINE == SE_LEFT4DEAD
|
#if SOURCE_ENGINE == SE_LEFT4DEAD
|
||||||
const int sv_offs = 6; // IServer pointer (in IVEngineServer::CreateFakeClient)
|
const int sv_offs = 6; // IServer pointer (in IVEngineServer::CreateFakeClient)
|
||||||
const int maxhuman_idx = 131; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
const int maxhuman_idx = 131; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
||||||
@@ -11,7 +10,6 @@
|
|||||||
const int maxhuman_idx = 136; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
const int maxhuman_idx = 136; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
const int maxplayers_offs = 0x220; // m_nMaxClientsLimit (in CGameServer::SetMaxClients)
|
|
||||||
#if SOURCE_ENGINE == SE_LEFT4DEAD
|
#if SOURCE_ENGINE == SE_LEFT4DEAD
|
||||||
const char* engine_dll = "engine.so";
|
const char* engine_dll = "engine.so";
|
||||||
const int maxhuman_idx = 132; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
const int maxhuman_idx = 132; // CTerrorGameRules::GetMaxHumanPlayers vtable
|
||||||
|
|||||||
+11
-40
@@ -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_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);
|
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 new_value = ((ConVar*)var)->GetInt();
|
||||||
int old_value = atoi(pOldValue);
|
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");
|
Msg("g_pGameIServer pointer is not available\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(new_value != old_value) {
|
if (new_value != old_value) {
|
||||||
if(new_value >= 0) {
|
if (new_value >= 0) {
|
||||||
g_nGameSlots = new_value;
|
g_nGameSlots = new_value;
|
||||||
g_pGameIServer->m_numGameSlots = g_nGameSlots;
|
g_pGameIServer->m_numGameSlots = g_nGameSlots;
|
||||||
} else {
|
} 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 new_value = ((ConVar*)var)->GetInt();
|
||||||
int old_value = atoi(pOldValue);
|
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");
|
Msg("g_pGameIServer pointer is not available\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(new_value != old_value) {
|
if (new_value != old_value) {
|
||||||
if(new_value == 1) {
|
if (new_value == 1) {
|
||||||
g_pCVar->FindVar("sv_allow_lobby_connect_only")->SetValue(0);
|
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");
|
g_pGameIServer = (CBaseServer *)g_MemUtils.ResolveSymbol(handle, "sv");
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
#endif
|
#endif
|
||||||
int* m_nMaxClientsLimit = reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(g_pGameIServer)+maxplayers_offs);
|
const char *pszCmdLineMax;
|
||||||
if (*m_nMaxClientsLimit != 18) {
|
if (CommandLine()->CheckParm("-maxplayers", &pszCmdLineMax)) {
|
||||||
Warning("Couldn't patch maxplayers\n");
|
g_pGameIServer->m_nMaxclients = clamp(atoi(pszCmdLineMax), 1, 32);
|
||||||
if (!late) {
|
|
||||||
g_pGameIServer = NULL;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
*m_nMaxClientsLimit = 32;
|
g_pGameIServer->m_nMaxclients = 31;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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 *UTIL_FindServerClass(const char *classname)
|
||||||
{
|
{
|
||||||
ServerClass *sc = gamedll->GetAllServerClasses();
|
ServerClass *sc = gamedll->GetAllServerClasses();
|
||||||
@@ -242,7 +213,7 @@ const char *l4dtoolz::GetLicense()
|
|||||||
|
|
||||||
const char *l4dtoolz::GetVersion()
|
const char *l4dtoolz::GetVersion()
|
||||||
{
|
{
|
||||||
return "2.1.0";
|
return "2.2.0";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *l4dtoolz::GetDate()
|
const char *l4dtoolz::GetDate()
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ public:
|
|||||||
static void OnChangeUnreserved ( IConVar *var, const char *pOldValue, float flOldValue );
|
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);
|
ServerClass *UTIL_FindServerClass(const char *classname);
|
||||||
|
|
||||||
extern l4dtoolz g_l4dtoolz;
|
extern l4dtoolz g_l4dtoolz;
|
||||||
|
|||||||
Reference in New Issue
Block a user