Something like this could work, not sure it is better than only hook SetModel though.
SetModel is not called so often.
PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include "cstrike_pdatas"
#define PLUGIN ""
#define VERSION "0.0.1"
new g_iMaxPlayers
#define IsPlayer(%0) ( 1 <= %0 <= g_iMaxPlayers )
#define MaskEnt(%0) ( 1<<(%0 & 31) )
new g_bitPreThinkPlayers
#define EnablePlayerDeathDrop(%0) g_bitPreThinkPlayers |= MaskEnt(%0)
#define DisablePlayerDeathDrop(%0) g_bitPreThinkPlayers &= ~MaskEnt(%0)
#define IsPlayerDeathDropEnabled(%0) g_bitPreThinkPlayers & MaskEnt(%0)
new HamHook:g_iCBasePlayerPreThinkPre, HamHook:g_iCBasePlayerPreThinkPost, HamHook:g_iCItemThighPackMyTouchPost
public plugin_init()
{
register_plugin( PLUGIN, VERSION, "ConnorMcLeod" )
g_iMaxPlayers = get_maxplayers()
RegisterHam(Ham_Killed, "player", "OnCBasePlayer_Killed", false)
RegisterHam(Ham_Killed, "player", "OnCBasePlayer_Killed_Post", true)
DisableHamForward( g_iCBasePlayerPreThinkPre = RegisterHam(Ham_Player_PreThink, "player", "OnCBasePlayer_PreThink", false) )
DisableHamForward( g_iCBasePlayerPreThinkPost = RegisterHam(Ham_Player_PreThink, "player", "OnCBasePlayer_PreThink_Post", true) )
DisableHamForward( g_iCItemThighPackMyTouchPost = RegisterHam(Ham_Touch, "item_thighpack", "CItemThighPack_MyTouch_Post", true) )
}
Set_SetModel( bool:bOnOff )
{
static _SetModel = 0
if( bOnOff )
{
if( !_SetModel )
{
_SetModel = register_forward(FM_SetModel, "OnSetModel_Post", true)
}
}
else if( _SetModel )
{
unregister_forward(FM_SetModel, _SetModel, true)
}
}
Set_PreThink( id , bool:bOnOff )
{
if( bOnOff )
{
if( !g_bitPreThinkPlayers )
{
EnableHamForward( g_iCBasePlayerPreThinkPre )
EnableHamForward( g_iCBasePlayerPreThinkPost )
}
EnablePlayerDeathDrop(id)
}
else
{
DisablePlayerDeathDrop(id)
if( !g_bitPreThinkPlayers )
{
DisableHamForward( g_iCBasePlayerPreThinkPre )
DisableHamForward( g_iCBasePlayerPreThinkPost )
}
}
}
public OnCBasePlayer_Killed( id , iAttacker, iGib)
{
if( get_pdata_bool(id, m_bHasC4) )
{
Set_SetModel( true )
}
else if( get_pdata_bool(id, m_bHasDefuser) )
{
EnableHamForward( g_iCItemThighPackMyTouchPost )
}
}
public OnCBasePlayer_Killed_Post( id, iAttacker, iGib )
{
Set_SetModel( false )
DisableHamForward( g_iCItemThighPackMyTouchPost )
Set_PreThink( id , true )
}
public OnCBasePlayer_PreThink( id )
{
if( IsPlayerDeathDropEnabled(id) )
{
Set_SetModel( true )
}
}
public OnCBasePlayer_PreThink_Post( id )
{
if( IsPlayerDeathDropEnabled(id) )
{
Set_PreThink( id , false )
Set_SetModel( false )
}
}
public OnSetModel_Post(ent, model[])
{
if( !equal(model, "models/w_weaponbox.mdl") )
{
new id = pev(ent, pev_owner)
if( IsPlayer(id) )
{
PlayerDeathDropped(id, ent)
}
}
}
public CItemThighPack_MyTouch_Post(ent, id)
{
PlayerDeathDropped(id, ent)
}
PlayerDeathDropped(id, ent)
{
if( ExecuteHam(Ham_Weapon_GetWeaponPtr, ent) == ent )
{
new iId = get_pdata_int(ent, m_iId, XO_CBasePlayerItem)
// iId is CSW_*** const
}
else
{
// defuser
}
}
__________________