Super Cool! Thank you a lot.
PHP Code:
new const Float: Multi[] = {
1.0, // HIT_GENERIC
4.0, // HIT_HEAD
1.0, // HIT_CHEST
1.25, // HIT_STOMACH
1.0, // HIT_LEFTARM
1.0, // HIT_RIGHTARM
0.75, // HIT_LEFTLEG
0.75, // HIT_RIGHTLEG
0.0 // HIT_SHIELD
}
public CreateMultipleTraceAttack_Hull(Float: origin[3], Float: end_origin[3], Float: v_angle[3], Float: damage, id, weapon) {
static trace; trace = create_tr2();
engfunc(EngFunc_TraceLine, origin, end_origin, DONT_IGNORE_MONSTERS, id, trace);
static Float: fraction; get_tr2(trace, TR_flFraction, fraction);
static victim_id; victim_id = get_tr2(trace, TR_pHit);
static bool: is_hit_player; is_hit_player = false;
static bool: is_hit_wall; is_hit_wall = false;
static Array: entities; entities = ArrayCreate(2);
static entity_data[2];
if ( pev_valid(victim_id) ) {
static tmp_damage; tmp_damage *= Multi[get_tr2(trace, TR_iHitgroup)];
rg_multidmg_clear();
ExecuteHamB(Ham_TraceAttack, victim_id, id, damage, v_angle, trace, DMG_NEVERGIB|DMG_BULLET);
rg_multidmg_apply(weapon, id);
entity_data[0] = victim_id;
entity_data[1] = get_entvar(victim_id, var_solid);
set_entvar(victim_id, var_solid, SOLID_NOT);
if ( is_user_connected(victim_id) )
is_hit_player = true;
else
is_hit_wall = true;
ArrayPushArray(entities, entity_data);
}
else if ( fraction != 1.0 )
is_hit_wall = true;
static bool: completed; completed = false;
while ( !completed ) {
engfunc(EngFunc_TraceHull, origin, end_origin, DONT_IGNORE_MONSTERS, HULL_HUMAN, id, trace);
victim_id = get_tr2(trace, TR_pHit);
get_tr2(trace, TR_flFraction, fraction);
if ( pev_valid(victim_id) ) {
rg_multidmg_clear();
ExecuteHamB(Ham_TraceAttack, victim_id, id, damage, v_angle, trace, DMG_NEVERGIB|DMG_BULLET);
rg_multidmg_apply(weapon, id);
entity_data[0] = victim_id;
entity_data[1] = get_entvar(victim_id, var_solid);
ArrayPushArray(entities, entity_data);
set_entvar(victim_id, var_solid, SOLID_NOT);
if ( is_user_connected(victim_id) )
is_hit_player = true
}
else
completed = true;
}
for ( new i; i < ArraySize(entities); i ++ ) {
ArrayGetArray(entities, i, entity_data);
set_entvar(entity_data[0], var_solid, entity_data[1]);
}
ArrayDestroy(entities);
static result; result = is_hit_player ? 1 : ((!is_hit_player && is_hit_wall) ? -1 : 0);
free_tr2(trace);
return result;
}