Thread: [Solved] Multiple TraceHull
View Single Post
ConorCC
Member
Join Date: Feb 2014
Old 01-11-2021 , 15:37   Re: Multiple TraceHull
Reply With Quote #5

Super Cool! Thank you a lot.

Here is my code based on yours:
PHP Code:
new const FloatMulti[] = {

    
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(Floatorigin[3], Floatend_origin[3], Floatv_angle[3], Floatdamageidweapon) {

    static 
tracetrace create_tr2();

    
engfunc(EngFunc_TraceLineoriginend_originDONT_IGNORE_MONSTERSidtrace);

    static 
Floatfractionget_tr2(traceTR_flFractionfraction);
    static 
victim_idvictim_id get_tr2(traceTR_pHit);
    static 
boolis_hit_playeris_hit_player false;
    static 
boolis_hit_wallis_hit_wall false;

    static Array: 
entitiesentities ArrayCreate(2);
    static 
entity_data[2];

    if ( 
pev_valid(victim_id) ) {

        static 
tmp_damagetmp_damage *= Multi[get_tr2(traceTR_iHitgroup)];

        
rg_multidmg_clear();

        
ExecuteHamB(Ham_TraceAttackvictim_ididdamagev_angletraceDMG_NEVERGIB|DMG_BULLET);

        
rg_multidmg_apply(weaponid);

        
entity_data[0] = victim_id;
        
entity_data[1] = get_entvar(victim_idvar_solid);

        
set_entvar(victim_idvar_solidSOLID_NOT);

        if ( 
is_user_connected(victim_id) )
            
is_hit_player true;
        else
            
is_hit_wall true;

        
ArrayPushArray(entitiesentity_data);
    }
    else if ( 
fraction != 1.0 )
        
is_hit_wall true;

    static 
boolcompletedcompleted false;

    while ( !
completed ) {

        
engfunc(EngFunc_TraceHulloriginend_originDONT_IGNORE_MONSTERSHULL_HUMANidtrace);

        
victim_id get_tr2(traceTR_pHit);
        
get_tr2(traceTR_flFractionfraction);

        if ( 
pev_valid(victim_id) ) {

            
rg_multidmg_clear();

            
ExecuteHamB(Ham_TraceAttackvictim_ididdamagev_angletraceDMG_NEVERGIB|DMG_BULLET);

            
rg_multidmg_apply(weaponid);

            
entity_data[0] = victim_id;
            
entity_data[1] = get_entvar(victim_idvar_solid);

            
ArrayPushArray(entitiesentity_data);

            
set_entvar(victim_idvar_solidSOLID_NOT);

            if ( 
is_user_connected(victim_id) )
                
is_hit_player true
        
}
        else
            
completed true;
    }

    for ( new 
iArraySize(entities); ++ ) {

        
ArrayGetArray(entitiesientity_data);
        
set_entvar(entity_data[0], var_solidentity_data[1]);
    }

    
ArrayDestroy(entities);

    static 
resultresult is_hit_player : ((!is_hit_player && is_hit_wall) ? -0);

    
free_tr2(trace);

    return 
result;

ConorCC is offline