Well, I did it yesterday and forgot to post. Here it is:
Code:
#include <amxmodx>
#include <fakemeta>
#include <okapi>
const m_usEvent = 114
const CustomGrenade = 6789
new okapi_func:CGrenade_SG_Detonate
new okapi_func:CGrenade_ShootSmokeGrenade
public plugin_init()
{
new CGrenade_FunctionAddress
new const SG_DetonateWindowsSymbol[] = "?SG_Detonate@CGrenade@@QAEXXZ"
new const SG_DetonateLinuxSymbol [] = "SG_Detonate__8CGrenade"
if
(
(CGrenade_FunctionAddress = okapi_mod_get_symbol_ptr(SG_DetonateWindowsSymbol)) ||
(CGrenade_FunctionAddress = okapi_mod_get_symbol_ptr(SG_DetonateLinuxSymbol))
)
{
CGrenade_SG_Detonate = okapi_build_method(CGrenade_FunctionAddress, arg_void, arg_cbase)
okapi_add_hook(CGrenade_SG_Detonate, "OnSG_Detonate", true)
}
new const ShootSmokeGrenadeSignature[] =
{
0x56,0x57,0xFF,0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x85,0xDEF,0x75,0xDEF,0x33,0xDEF,0xEB,
0xDEF,0x8D,0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x85,
0xDEF,0x74,0xDEF,0x8B,0xDEF,0xDEF,0x85,0xDEF,0x75,0xDEF,0x68,0xDEF,0xDEF,0xDEF,
0xDEF,0x50,0xFF,0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x8B,0xDEF,0x83,0xDEF,0xDEF,0x85,
0xDEF,0x74,0xDEF,0x8B,0xDEF,0xE8,0xDEF,0xDEF,0xDEF,0xDEF,0xC7,0xDEF,0xDEF,0xDEF,
0xDEF,0xDEF,0xEB,0xDEF,0x33,0xDEF,0x89,0xDEF,0xDEF,0x8B,0xDEF,0x8B,0xDEF,0xFF,0xDEF,
0x8B,0xDEF,0xDEF,0x8D,0xDEF,0xDEF,0xDEF,0x51,0x52,0xE8,0xDEF,0xDEF,0xDEF,0xDEF,0x8B,
0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0xDEF,0x83,0xDEF,0xDEF,0xD9,0xDEF,0xDEF,0xDEF,0x89,
0xDEF,0x8B,0xDEF,0xDEF,0xDEF,0x83,0xDEF,0xDEF,0x89,0xDEF,0xDEF,0x89,0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0xDEF,
0x8B,0xDEF,0xDEF,0x8D,0xDEF,0xDEF,0x83,0xDEF,0xDEF,0x8B,0xDEF,0x89,0xDEF,0x8B,0xDEF,0xDEF,0x89,0xDEF,
0xDEF,0x8B,0xDEF,0xDEF,0x89,0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0x8B,0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x66
}
new const ShootSmokeGrenadeSymbol[] = "_ZN8CGrenade17ShootSmokeGrenadeEP9entvars_s6VectorS2_ft"
if
(
(CGrenade_FunctionAddress = okapi_mod_get_symbol_ptr(ShootSmokeGrenadeSymbol)) ||
(CGrenade_FunctionAddress = okapi_mod_find_sig(ShootSmokeGrenadeSignature, sizeof ShootSmokeGrenadeSignature))
)
{
CGrenade_ShootSmokeGrenade = okapi_build_function(CGrenade_FunctionAddress, arg_cbase, arg_entvars, arg_vec, arg_vec, arg_float, arg_int)
}
}
public OnSG_Detonate(GrenadeEntity)
{
if(pev_valid(GrenadeEntity))
{
if(pev(GrenadeEntity, pev_iuser3) != CustomGrenade)
{
new Float:GrenadeOrigin[3]; pev(GrenadeEntity, pev_origin, GrenadeOrigin)
new m_usCreateSmoke = get_pdata_int(GrenadeEntity, m_usEvent)
new Entity = okapi_call(CGrenade_ShootSmokeGrenade, pev(GrenadeEntity, pev_owner), GrenadeOrigin, Float:{0.0, 0.0, 0.0}, 0, m_usCreateSmoke)
if(pev_valid(Entity))
{
set_pev(Entity, pev_iuser3, CustomGrenade)
set_pev(Entity, pev_effects, pev(Entity, pev_effects) | EF_NODRAW)
}
}
}
}
This create a new smokegrenade where the first one lands, so the effect will be exactly the same. You will need okapi module:
As a note, there may be other ways, like altering the first grenade, without creating another one. I just did it like this because it was the easiest way.