107 lines
2.4 KiB
SourcePawn
107 lines
2.4 KiB
SourcePawn
#pragma semicolon 1
|
|
#pragma newdecls required
|
|
|
|
#include <sourcemod>
|
|
#include <sdktools>
|
|
#include <FullUpdate>
|
|
|
|
Handle g_hCBaseClient_UpdateAcknowledgedFramecount;
|
|
int g_iLastFullUpdate[MAXPLAYERS + 1] = { 0, ... };
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "FullUpdate",
|
|
author = "BotoX",
|
|
description = "Serverside cl_fullupdate",
|
|
version = "1.0"
|
|
}
|
|
|
|
public void OnPluginStart()
|
|
{
|
|
Handle hGameConf = LoadGameConfigFile("FullUpdate.games");
|
|
if(hGameConf == INVALID_HANDLE)
|
|
{
|
|
SetFailState("Couldn't load FullUpdate.games game config!");
|
|
return;
|
|
}
|
|
|
|
// void CBaseClient::UpdateAcknowledgedFramecount()
|
|
StartPrepSDKCall(SDKCall_Raw);
|
|
|
|
if(!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "CBaseClient::UpdateAcknowledgedFramecount"))
|
|
{
|
|
CloseHandle(hGameConf);
|
|
SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, \"CBaseClient::UpdateAcknowledgedFramecount\" failed!");
|
|
return;
|
|
}
|
|
CloseHandle(hGameConf);
|
|
|
|
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
|
|
|
|
g_hCBaseClient_UpdateAcknowledgedFramecount = EndPrepSDKCall();
|
|
|
|
RegConsoleCmd("sm_fullupdate", Command_FullUpdate);
|
|
RegConsoleCmd("cl_fullupdate", Command_FullUpdate);
|
|
RegConsoleCmd("fullupdate", Command_FullUpdate);
|
|
}
|
|
|
|
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
|
|
{
|
|
CreateNative("ClientFullUpdate", Native_FullUpdate);
|
|
RegPluginLibrary("FullUpdate");
|
|
|
|
return APLRes_Success;
|
|
}
|
|
|
|
public void OnClientConnected(int client)
|
|
{
|
|
g_iLastFullUpdate[client] = 0;
|
|
}
|
|
|
|
bool FullUpdate(int client)
|
|
{
|
|
if(g_iLastFullUpdate[client] + 1 > GetTime())
|
|
return false;
|
|
|
|
// The IClient vtable is +4 from the IGameEventListener2 (CBaseClient) vtable due to multiple inheritance.
|
|
Address pIClient = GetClientIClient(client) - view_as<Address>(4);
|
|
if(!pIClient)
|
|
return false;
|
|
|
|
SDKCall(g_hCBaseClient_UpdateAcknowledgedFramecount, pIClient, -1);
|
|
|
|
g_iLastFullUpdate[client] = GetTime();
|
|
return true;
|
|
}
|
|
|
|
public int Native_FullUpdate(Handle plugin, int numParams)
|
|
{
|
|
int client = GetNativeCell(1);
|
|
|
|
if(client > MaxClients || client <= 0)
|
|
{
|
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is not valid.");
|
|
return 0;
|
|
}
|
|
|
|
if(!IsClientInGame(client))
|
|
{
|
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is not in-game.");
|
|
return 0;
|
|
}
|
|
|
|
if(IsFakeClient(client))
|
|
{
|
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is fake-client.");
|
|
return 0;
|
|
}
|
|
|
|
return FullUpdate(client);
|
|
}
|
|
|
|
public Action Command_FullUpdate(int client, int args)
|
|
{
|
|
FullUpdate(client);
|
|
return Plugin_Handled;
|
|
}
|