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;
 | 
						|
}
 |