PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#define PLUGIN "Entity Hit Effects"
#define VERSION "1.0"
#define AUTHOR "Natsheh"
new attacker_trace[33];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_infotarget")
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_infotarget")
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_player")
}
public fw_TraceAttack_player(victim, attacker, Float:damage, Float:direction[3], traceresult, damagebits)
{
if(!is_user_connected(attacker) || !(damagebits & DMG_BULLET)) return FMRES_IGNORED;
if((attacker_trace[attacker] & (1<<(victim-1))))
{
attacker_trace[attacker] &= ~(1<<(victim-1));
SetHamParamFloat(3, 0.0)
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public fw_TraceAttack_infotarget(victim, attacker, Float:damage, Float:direction[3], traceresult, damagebits)
{
if(!is_user_connected(attacker) || !(damagebits & DMG_BULLET)) return FMRES_IGNORED;
new Float:start_origin[3], Float:scanhit_end[3], Float:end_origin[3], tr3, iHit = 1, Float:vDir[3], oldsolid = pev(victim, pev_solid);
get_tr2(traceresult, TR_vecEndPos, scanhit_end)
xs_vec_add(start_origin, scanhit_end, start_origin)
end_origin = scanhit_end;
set_pev(victim, pev_solid, SOLID_NOT) // ignoring the entity...
tr3 = create_tr2();
vDir = direction;
xs_vec_mul_scalar(vDir, 999.0, vDir)
xs_vec_add(scanhit_end, vDir, scanhit_end)
new oldents[33], oldsolids[33], iHits, sizehits = sizeof oldents;
while( iHit > 0 )
{
engfunc(EngFunc_TraceLine, start_origin, scanhit_end, (DONT_IGNORE_MONSTERS), attacker, tr3)
iHit = get_tr2(tr3, TR_pHit);
if( iHit > 0)
{
if( !(sizehits > iHits) ) break;
oldents[iHits] = iHit;
oldsolids[iHits] = pev(iHit, pev_solid);
iHits ++;
set_pev(iHit, pev_solid, SOLID_NOT)
if(is_user_alive(iHit)) attacker_trace[attacker] |= (1<<(iHit-1));
}
get_tr2(tr3, TR_vecEndPos, start_origin)
}
free_tr2(tr3)
// set back old solids....
set_pev(victim, pev_solid, oldsolid)
for(new i; i < iHits; i++)
{
set_pev(oldents[i], pev_solid, oldsolids[i])
}
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOT)
engfunc(EngFunc_WriteCoord, end_origin[0])
engfunc(EngFunc_WriteCoord, end_origin[1])
engfunc(EngFunc_WriteCoord, end_origin[2])
message_end()
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_SPARKS)
engfunc(EngFunc_WriteCoord, end_origin[0])
engfunc(EngFunc_WriteCoord, end_origin[1])
engfunc(EngFunc_WriteCoord, end_origin[2])
message_end()
return HAM_IGNORED;
}
also you can change the start position to the hit position of the traceline and then use the ignore ent thingy.