FixPointTeleport: initial push.

This commit is contained in:
zaCade 2017-10-30 17:08:14 +01:00
parent a6974869bf
commit cd15f02ca1
2 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,19 @@
"Games"
{
"cstrike"
{
"Offsets"
{
"Teleport"
{
"windows" "108"
"linux" "109"
}
"FallInit"
{
"windows" "346"
"linux" "347"
}
}
}
}

View File

@ -0,0 +1,92 @@
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#include <dhooks>
Handle hTeleport;
Handle hFallInit;
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
name = "FixPointTeleport",
author = "zaCade",
description = "Fix crashes caused by point_teleport entity teleporting weapons.",
version = "1.0.0"
};
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
Handle hGameConf;
if ((hGameConf = LoadGameConfigFile("FixPointTeleport.games")) == INVALID_HANDLE)
{
SetFailState("Couldn't load \"FixPointTeleport.games\" game config!");
return;
}
// CBaseCombatWeapon::FallInit()
StartPrepSDKCall(SDKCall_Entity);
if (!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "FallInit"))
{
CloseHandle(hGameConf);
SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, \"FallInit\") failed!");
return;
}
hFallInit = EndPrepSDKCall();
// CBaseEntity::Teleport(Vector const*, QAngle const*, Vector const*)
int iOffset;
if ((iOffset = GameConfGetOffset(hGameConf, "Teleport")) == -1)
{
CloseHandle(hGameConf);
SetFailState("GameConfGetOffset(hGameConf, \"Teleport\") failed!");
return;
}
if ((hTeleport = DHookCreate(iOffset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnEntityTeleport)) == INVALID_HANDLE)
{
CloseHandle(hGameConf);
SetFailState("DHookCreate(iOffset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnEntityTeleport) failed!");
return;
}
DHookAddParam(hTeleport, HookParamType_VectorPtr);
DHookAddParam(hTeleport, HookParamType_ObjectPtr);
DHookAddParam(hTeleport, HookParamType_VectorPtr);
// Late load.
int entity = INVALID_ENT_REFERENCE;
while((entity = FindEntityByClassname(entity, "weapon_*")) != INVALID_ENT_REFERENCE)
{
OnEntityCreated(entity, "weapon_*");
}
CloseHandle(hGameConf);
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnEntityCreated(int entity, const char[] classname)
{
if (strncmp(classname, "weapon_", 7, false) == 0)
{
DHookEntity(hTeleport, true, entity);
}
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public MRESReturn OnEntityTeleport(int entity, Handle hParams)
{
SDKCall(hFallInit, entity);
}