sm-plugins/AntiLagSwitch/scripting/AntiLagSwitch.sp

93 lines
2.5 KiB
SourcePawn
Raw Normal View History

2019-09-25 11:37:40 +02:00
#include <sourcemod>
#include <sdktools>
#include <dhooks>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo =
{
name = "AntiLagSwitch",
author = "BotoX",
description = "",
version = "0.0",
url = ""
};
Handle g_hProcessUsercmds;
Handle g_hRunNullCommand;
2019-09-27 21:50:07 +02:00
int g_LastProcessed[MAXPLAYERS + 1];
2019-09-25 11:37:40 +02:00
public void OnPluginStart()
{
Handle hGameConf = LoadGameConfigFile("AntiLagSwitch.games");
if(!hGameConf)
SetFailState("Failed to load AntiLagSwitch gamedata.");
// void CBasePlayer::RunNullCommand( void )
StartPrepSDKCall(SDKCall_Player);
if(!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "RunNullCommand"))
SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, \"RunNullCommand\" failed!");
g_hRunNullCommand = EndPrepSDKCall();
int Offset = GameConfGetOffset(hGameConf, "ProcessUsercmds");
if(Offset == -1)
SetFailState("Failed to find ProcessUsercmds offset");
/* void CBasePlayer::ProcessUsercmds( CUserCmd *cmds, int numcmds, int totalcmds,
int dropped_packets, bool paused ) */
g_hProcessUsercmds = DHookCreate(Offset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, Hook_ProcessUsercmds);
if(g_hProcessUsercmds == INVALID_HANDLE)
SetFailState("Failed to DHookCreate ProcessUsercmds");
DHookAddParam(g_hProcessUsercmds, HookParamType_ObjectPtr); // 1 - CUserCmd *cmds
DHookAddParam(g_hProcessUsercmds, HookParamType_Int); // 2 - int numcmds
DHookAddParam(g_hProcessUsercmds, HookParamType_Int); // 3 - int totalcmds
DHookAddParam(g_hProcessUsercmds, HookParamType_Int); // 4 - int dropped_packets
DHookAddParam(g_hProcessUsercmds, HookParamType_Bool); // 5 - bool paused
delete hGameConf;
// Late load.
for(int client = 1; client <= MaxClients; client++)
{
if(IsClientInGame(client))
OnClientPutInServer(client);
}
}
public void OnClientPutInServer(int client)
{
DHookEntity(g_hProcessUsercmds, true, client);
2019-09-27 21:50:07 +02:00
g_LastProcessed[client] = GetGameTickCount();
2019-09-25 11:37:40 +02:00
}
2019-09-27 21:50:07 +02:00
public void OnClientDisconnect(int client)
2019-09-25 11:37:40 +02:00
{
2019-09-27 21:50:07 +02:00
g_LastProcessed[client] = 0;
}
2019-09-25 11:37:40 +02:00
2019-10-02 14:19:09 +02:00
public void OnPostPlayerThinkFunctions()
2019-09-27 21:50:07 +02:00
{
int minimum = GetGameTickCount() - 33;
for(int client = 1; client <= MaxClients; client++)
{
if(IsClientInGame(client) && (IsFakeClient(client) || g_LastProcessed[client] < minimum))
{
RunNullCommand(client);
}
}
}
public MRESReturn Hook_ProcessUsercmds(int client, Handle hParams)
{
g_LastProcessed[client] = GetGameTickCount();
2019-09-25 11:37:40 +02:00
}
int RunNullCommand(int client)
{
return SDKCall(g_hRunNullCommand, client);
}