2013-08-30 02:16:05 +02:00
# pragma semicolon 1
# include <sourcemod>
# include <sdktools>
# include <dhooks>
// int CBaseCombatCharacter::BloodColor(void)
new Handle : hBloodColor ;
// bool CBaseCombatCharacter::Weapon_CanUse(CBaseCombatWeapon *)
new Handle : hHookCanUse ;
// Vector CBasePlayer::GetPlayerMaxs()
new Handle : hGetMaxs ;
// string_t CBaseEntity::GetModelName(void)
new Handle : hGetModelName ;
// bool CGameRules::CanHaveAmmo(CBaseCombatCharacter *, int)
new Handle : hCanHaveAmmo ;
// void CBaseEntity::SetModel(char const*)
new Handle : hSetModel ;
//float CCSPlayer::GetPlayerMaxSpeed()
new Handle : hGetSpeed ;
//int CCSPlayer::OnTakeDamage(CTakeDamageInfo const&)
new Handle : hTakeDamage ;
// bool CBaseEntity::AcceptInput(char const*, CBaseEntity*, CBaseEntity*, variant_t, int)
new Handle : hAcceptInput ;
//int CBaseCombatCharacter::GiveAmmo(int, int, bool)
new Handle : hGiveAmmo ;
// CVEngineServer::ClientPrintf(edict_t *, char const*)
new Handle : hClientPrintf ;
public OnPluginStart ( )
{
new Handle : temp = LoadGameConfigFile ( " dhooks-test.games " ) ;
if ( temp = = INVALID_HANDLE )
{
SetFailState ( " Why you no has gamedata? " ) ;
}
new offset ;
offset = GameConfGetOffset ( temp , " BloodColor " ) ;
hBloodColor = DHookCreate ( offset , HookType_Entity , ReturnType_Int , ThisPointer_CBaseEntity , BloodColorPost ) ;
offset = GameConfGetOffset ( temp , " GetModelName " ) ;
hGetModelName = DHookCreate ( offset , HookType_Entity , ReturnType_String , ThisPointer_CBaseEntity , GetModelName ) ;
offset = GameConfGetOffset ( temp , " GetMaxs " ) ;
2018-01-27 16:08:44 +01:00
hGetMaxs = DHookCreate ( offset , HookType_Entity , ReturnType_Vector , ThisPointer_Ignore ) ;
2013-08-30 02:16:05 +02:00
offset = GameConfGetOffset ( temp , " CanUse " ) ;
hHookCanUse = DHookCreate ( offset , HookType_Entity , ReturnType_Bool , ThisPointer_CBaseEntity , CanUsePost ) ;
DHookAddParam ( hHookCanUse , HookParamType_CBaseEntity ) ;
offset = GameConfGetOffset ( temp , " CanHaveAmmo " ) ;
hCanHaveAmmo = DHookCreate ( offset , HookType_GameRules , ReturnType_Bool , ThisPointer_Ignore , CanHaveAmmoPost ) ;
DHookAddParam ( hCanHaveAmmo , HookParamType_CBaseEntity ) ;
DHookAddParam ( hCanHaveAmmo , HookParamType_Int ) ;
offset = GameConfGetOffset ( temp , " SetModel " ) ;
hSetModel = DHookCreate ( offset , HookType_Entity , ReturnType_Void , ThisPointer_CBaseEntity , SetModel ) ;
DHookAddParam ( hSetModel , HookParamType_CharPtr ) ;
offset = GameConfGetOffset ( temp , " AcceptInput " ) ;
hAcceptInput = DHookCreate ( offset , HookType_Entity , ReturnType_Bool , ThisPointer_CBaseEntity , AcceptInput ) ;
DHookAddParam ( hAcceptInput , HookParamType_CharPtr ) ;
DHookAddParam ( hAcceptInput , HookParamType_CBaseEntity ) ;
DHookAddParam ( hAcceptInput , HookParamType_CBaseEntity ) ;
2016-08-30 17:00:26 +02:00
DHookAddParam ( hAcceptInput , HookParamType_Object , 20 , DHookPass_ByVal | DHookPass_ODTOR | DHookPass_OCTOR | DHookPass_OASSIGNOP ) ; //varaint_t is a union of 12 (float[3]) plus two int type params 12 + 8 = 20
2013-08-30 02:16:05 +02:00
DHookAddParam ( hAcceptInput , HookParamType_Int ) ;
offset = GameConfGetOffset ( temp , " GetMaxPlayerSpeed " ) ;
2018-01-27 16:08:44 +01:00
hGetSpeed = DHookCreate ( offset , HookType_Entity , ReturnType_Float , ThisPointer_CBaseEntity ) ;
2013-08-30 02:16:05 +02:00
offset = GameConfGetOffset ( temp , " GiveAmmo " ) ;
hGiveAmmo = DHookCreate ( offset , HookType_Entity , ReturnType_Int , ThisPointer_CBaseEntity , GiveAmmo ) ;
DHookAddParam ( hGiveAmmo , HookParamType_Int ) ;
DHookAddParam ( hGiveAmmo , HookParamType_Int ) ;
DHookAddParam ( hGiveAmmo , HookParamType_Bool ) ;
offset = GameConfGetOffset ( temp , " OnTakeDamage " ) ;
hTakeDamage = DHookCreate ( offset , HookType_Entity , ReturnType_Int , ThisPointer_CBaseEntity , OnTakeDamage ) ;
DHookAddParam ( hTakeDamage , HookParamType_ObjectPtr , - 1 , DHookPass_ByRef ) ;
DHookAddEntityListener ( ListenType_Created , EntityCreated ) ;
2015-05-14 18:04:06 +02:00
//Add client printf hook pThis requires effort
2013-08-30 02:16:05 +02:00
StartPrepSDKCall ( SDKCall_Static ) ;
if ( ! PrepSDKCall_SetFromConf ( temp , SDKConf_Signature , " CreateInterface " ) )
{
SetFailState ( " Failed to get CreateInterface " ) ;
CloseHandle ( temp ) ;
}
PrepSDKCall_AddParameter ( SDKType_String , SDKPass_Pointer ) ;
PrepSDKCall_AddParameter ( SDKType_PlainOldData , SDKPass_Pointer , VDECODE_FLAG_ALLOWNULL ) ;
PrepSDKCall_SetReturnInfo ( SDKType_PlainOldData , SDKPass_Plain ) ;
2015-05-14 18:04:06 +02:00
new String : iface [ 64 ] ;
if ( ! GameConfGetKeyValue ( temp , " EngineInterface " , iface , sizeof ( iface ) ) )
2013-08-30 02:16:05 +02:00
{
SetFailState ( " Failed to get engine interface name " ) ;
CloseHandle ( temp ) ;
}
new Handle : call = EndPrepSDKCall ( ) ;
2015-05-14 18:04:06 +02:00
new Address : addr = SDKCall ( call , iface , 0 ) ;
2013-08-30 02:16:05 +02:00
CloseHandle ( call ) ;
if ( ! addr )
{
SetFailState ( " Failed to get engine ptr " ) ;
}
offset = GameConfGetOffset ( temp , " ClientPrintf " ) ;
hClientPrintf = DHookCreate ( offset , HookType_Raw , ReturnType_Void , ThisPointer_Ignore , Hook_ClientPrintf ) ;
DHookAddParam ( hClientPrintf , HookParamType_Edict ) ;
DHookAddParam ( hClientPrintf , HookParamType_CharPtr ) ;
DHookRaw ( hClientPrintf , false , addr ) ;
CloseHandle ( temp ) ;
}
public MRESReturn : Hook_ClientPrintf ( Handle : hParams )
{
new client = DHookGetParam ( hParams , 1 ) ;
decl String : buffer [ 1024 ] ;
DHookGetParamString ( hParams , 2 , buffer , sizeof ( buffer ) ) ;
PrintToChat ( client , " BUFFER %s " , buffer ) ;
return MRES_Ignored ;
}
2015-05-14 18:04:06 +02:00
public MRESReturn : AcceptInput ( pThis , Handle : hReturn , Handle : hParams )
2013-08-30 02:16:05 +02:00
{
new String : command [ 128 ] ;
DHookGetParamString ( hParams , 1 , command , sizeof ( command ) ) ;
new type = DHookGetParamObjectPtrVar ( hParams , 4 , 16 , ObjectValueType_Int ) ;
new String : wtf [ 128 ] ;
DHookGetParamObjectPtrString ( hParams , 4 , 0 , ObjectValueType_String , wtf , sizeof ( wtf ) ) ;
PrintToServer ( " Command %s Type %i String %s " , command , type , wtf ) ;
DHookSetReturn ( hReturn , false ) ;
return MRES_Supercede ;
}
public OnMapStart ( )
{
//Hook Gamerules function in map start
DHookGamerules ( hCanHaveAmmo , true , RemovalCB ) ;
}
public OnClientPutInServer ( client )
{
DHookEntity ( hSetModel , false , client , RemovalCB ) ;
DHookEntity ( hHookCanUse , true , client , RemovalCB ) ;
2018-01-27 16:08:44 +01:00
DHookEntity ( hGetSpeed , true , client , RemovalCB , GetMaxPlayerSpeedPost ) ;
2013-08-30 02:16:05 +02:00
DHookEntity ( hGiveAmmo , false , client ) ;
DHookEntity ( hGetModelName , true , client ) ;
DHookEntity ( hTakeDamage , false , client ) ;
2018-01-27 16:08:44 +01:00
DHookEntity ( hGetMaxs , true , client , _ , GetMaxsPost ) ;
2013-08-30 02:16:05 +02:00
DHookEntity ( hBloodColor , true , client ) ;
}
public EntityCreated ( entity , const String : classname [ ] )
{
if ( strcmp ( classname , " point_servercommand " ) = = 0 )
{
DHookEntity ( hAcceptInput , false , entity ) ;
}
}
//int CCSPlayer::OnTakeDamage(CTakeDamageInfo const&)
2015-05-14 18:04:06 +02:00
public MRESReturn : OnTakeDamage ( pThis , Handle : hReturn , Handle : hParams )
2013-08-30 02:16:05 +02:00
{
2015-05-14 18:04:06 +02:00
PrintToServer ( " DHooksHacks = Victim %i, Attacker %i, Inflictor %i, Damage %f " , pThis , DHookGetParamObjectPtrVar ( hParams , 1 , 40 , ObjectValueType_Ehandle ) , DHookGetParamObjectPtrVar ( hParams , 1 , 36 , ObjectValueType_Ehandle ) , DHookGetParamObjectPtrVar ( hParams , 1 , 48 , ObjectValueType_Float ) ) ;
2013-08-30 02:16:05 +02:00
2015-05-14 18:04:06 +02:00
if ( pThis < = MaxClients & & pThis > 0 & & ! IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
DHookSetParamObjectPtrVar ( hParams , 1 , 48 , ObjectValueType_Float , 0.0 ) ;
2015-05-14 18:04:06 +02:00
PrintToChat ( pThis , " Pimping your hp " ) ;
2013-08-30 02:16:05 +02:00
}
}
// int CBaseCombatCharacter::GiveAmmo(int, int, bool)
2015-05-14 18:04:06 +02:00
public MRESReturn : GiveAmmo ( pThis , Handle : hReturn , Handle : hParams )
2013-08-30 02:16:05 +02:00
{
2015-05-14 18:04:06 +02:00
PrintToChat ( pThis , " Giving %i of %i supress %i " , DHookGetParam ( hParams , 1 ) , DHookGetParam ( hParams , 2 ) , DHookGetParam ( hParams , 3 ) ) ;
2013-08-30 02:16:05 +02:00
return MRES_Ignored ;
}
// void CBaseEntity::SetModel(char const*)
2015-05-14 18:04:06 +02:00
public MRESReturn : SetModel ( pThis , Handle : hParams )
2013-08-30 02:16:05 +02:00
{
//Change all bot skins to phoenix one
2015-05-14 18:04:06 +02:00
if ( IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
DHookSetParamString ( hParams , 1 , " models/player/t_phoenix.mdl " ) ;
return MRES_ChangedHandled ;
}
return MRES_Ignored ;
}
//float CCSPlayer::GetPlayerMaxSpeed()
2015-05-14 18:04:06 +02:00
public MRESReturn : GetMaxPlayerSpeedPost ( pThis , Handle : hReturn )
2013-08-30 02:16:05 +02:00
{
//Make bots slow
2015-05-14 18:04:06 +02:00
if ( IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
DHookSetReturn ( hReturn , 100.0 ) ;
return MRES_Override ;
}
return MRES_Ignored ;
}
// bool CGameRules::CanHaveAmmo(CBaseCombatCharacter *, int)
public MRESReturn : CanHaveAmmoPost ( Handle : hReturn , Handle : hParams )
{
PrintToServer ( " Can has ammo? %s %i " , DHookGetReturn ( hReturn ) ? " true " : " false " , DHookGetParam ( hParams , 2 ) ) ;
return MRES_Ignored ;
}
// string_t CBaseEntity::GetModelName(void)
2015-05-14 18:04:06 +02:00
public MRESReturn : GetModelName ( pThis , Handle : hReturn )
2013-08-30 02:16:05 +02:00
{
new String : returnval [ 128 ] ;
DHookGetReturnString ( hReturn , returnval , sizeof ( returnval ) ) ;
2015-05-14 18:04:06 +02:00
if ( IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
PrintToServer ( " It is a bot, Model should be: models/player/t_phoenix.mdl It is %s " , returnval ) ;
}
return MRES_Ignored ;
}
// Vector CBasePlayer::GetPlayerMaxs()
public MRESReturn : GetMaxsPost ( Handle : hReturn )
{
new Float : vec [ 3 ] ;
DHookGetReturnVector ( hReturn , vec ) ;
PrintToServer ( " Get maxes %.3f, %.3f, %.3f " , vec [ 0 ] , vec [ 1 ] , vec [ 2 ] ) ;
return MRES_Ignored ;
}
// bool CBaseCombatCharacter::Weapon_CanUse(CBaseCombatWeapon *)
2015-05-14 18:04:06 +02:00
public MRESReturn : CanUsePost ( pThis , Handle : hReturn , Handle : hParams )
2013-08-30 02:16:05 +02:00
{
//Bots get nothing.
2015-05-14 18:04:06 +02:00
if ( IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
DHookSetReturn ( hReturn , false ) ;
return MRES_Override ;
}
return MRES_Ignored ;
}
// int CBaseCombatCharacter::BloodColor(void)
2015-05-14 18:04:06 +02:00
public MRESReturn : BloodColorPost ( pThis , Handle : hReturn )
2013-08-30 02:16:05 +02:00
{
//Change the bots blood color to goldish yellow
2015-05-14 18:04:06 +02:00
if ( IsFakeClient ( pThis ) )
2013-08-30 02:16:05 +02:00
{
DHookSetReturn ( hReturn , 2 ) ;
return MRES_Supercede ;
}
return MRES_Ignored ;
}
public RemovalCB ( hookid )
{
PrintToServer ( " Removed hook %i " , hookid ) ;
}