74 lines
1.8 KiB
SourcePawn
74 lines
1.8 KiB
SourcePawn
|
#include <sourcemod>
|
||
|
#include <sdkhooks>
|
||
|
#include <sdktools>
|
||
|
#include <dhooks>
|
||
|
|
||
|
#pragma semicolon 1
|
||
|
#pragma newdecls required
|
||
|
|
||
|
public Plugin myinfo =
|
||
|
{
|
||
|
name = "FixLagCompensation",
|
||
|
author = "BotoX",
|
||
|
description = "",
|
||
|
version = "1.0",
|
||
|
url = ""
|
||
|
};
|
||
|
|
||
|
Handle g_hBacktrackPlayer;
|
||
|
Handle g_hIsMoving;
|
||
|
|
||
|
public void OnPluginStart()
|
||
|
{
|
||
|
Handle hGameData = LoadGameConfigFile("FixLagCompensation.games");
|
||
|
if(!hGameData)
|
||
|
SetFailState("Failed to load FixLagCompensation gamedata.");
|
||
|
|
||
|
// void CLagCompensationManager::BacktrackPlayer( CBasePlayer *pPlayer, float flTargetTime )
|
||
|
g_hBacktrackPlayer = DHookCreateFromConf(hGameData, "CLagCompensationManager__BacktrackPlayer");
|
||
|
if(!g_hBacktrackPlayer)
|
||
|
{
|
||
|
delete hGameData;
|
||
|
SetFailState("Failed to setup detour for CLagCompensationManager__BacktrackPlayer");
|
||
|
}
|
||
|
|
||
|
if(!DHookEnableDetour(g_hBacktrackPlayer, false, Detour_OnBacktrackPlayer))
|
||
|
{
|
||
|
delete hGameData;
|
||
|
SetFailState("Failed to detour CLagCompensationManager__BacktrackPlayer.");
|
||
|
}
|
||
|
|
||
|
// CBaseEntity::IsMoving
|
||
|
StartPrepSDKCall(SDKCall_Entity);
|
||
|
if(!PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, "IsMoving"))
|
||
|
{
|
||
|
delete hGameData;
|
||
|
SetFailState("PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, \"IsMoving\") failed!");
|
||
|
}
|
||
|
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
|
||
|
g_hIsMoving = EndPrepSDKCall();
|
||
|
|
||
|
delete hGameData;
|
||
|
}
|
||
|
|
||
|
public MRESReturn Detour_OnBacktrackPlayer(Handle hParams)
|
||
|
{
|
||
|
if(DHookIsNullParam(hParams, 1))
|
||
|
return MRES_Ignored;
|
||
|
|
||
|
int client = DHookGetParam(hParams, 1);
|
||
|
if(client < 1 || client > MaxClients)
|
||
|
return MRES_Ignored;
|
||
|
|
||
|
int GroundEntity = GetEntPropEnt(client, Prop_Data, "m_hGroundEntity");
|
||
|
if(GroundEntity <= 0)
|
||
|
return MRES_Ignored;
|
||
|
|
||
|
bool bIsMoving = SDKCall(g_hIsMoving, GroundEntity);
|
||
|
|
||
|
if(bIsMoving)
|
||
|
return MRES_Supercede;
|
||
|
|
||
|
return MRES_Ignored;
|
||
|
}
|