1500 lines
47 KiB
Plaintext
1500 lines
47 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
init_animset_pain()
|
|
{
|
|
var_0 = [];
|
|
var_0["damage_shield_crouch"] = %exposed_crouch_extendedpaina;
|
|
var_0["damage_shield_pain_array"] = [ %stand_exposed_extendedpain_chest, %stand_exposed_extendedpain_head_2_crouch, %stand_exposed_extendedpain_hip_2_crouch ];
|
|
var_0["back"] = %back_pain;
|
|
var_0["run_long"] = [ %run_pain_leg, %run_pain_shoulder, %run_pain_stomach_stumble, %run_pain_head, %run_pain_fallonknee_02, %run_pain_stomach, %run_pain_stumble, %run_pain_stomach_fast, %run_pain_leg_fast, %run_pain_fall ];
|
|
var_0["run_medium"] = [ %run_pain_fallonknee_02, %run_pain_stomach, %run_pain_stumble, %run_pain_stomach_fast, %run_pain_leg_fast, %run_pain_fall ];
|
|
var_0["run_short"] = [ %run_pain_fallonknee, %run_pain_fallonknee_03 ];
|
|
var_0["pistol_torso_upper"] = [ %pistol_stand_pain_chest, %pistol_stand_pain_rightshoulder, %pistol_stand_pain_leftshoulder ];
|
|
var_0["pistol_torso_lower"] = [ %pistol_stand_pain_chest, %pistol_stand_pain_groin ];
|
|
var_0["pistol_neck"] = [ %pistol_stand_pain_chest, %pistol_stand_pain_head ];
|
|
var_0["pistol_head"] = [ %pistol_stand_pain_head ];
|
|
var_0["pistol_leg"] = [ %pistol_stand_pain_groin ];
|
|
var_0["pistol_left_arm_upper"] = [ %pistol_stand_pain_chest, %pistol_stand_pain_leftshoulder ];
|
|
var_0["pistol_right_arm_upper"] = [ %pistol_stand_pain_chest, %pistol_stand_pain_rightshoulder ];
|
|
var_0["pistol_left_arm_lower"] = [ %pistol_stand_pain_leftshoulder ];
|
|
var_0["pistol_right_arm_lower"] = [ %pistol_stand_pain_rightshoulder ];
|
|
var_0["pistol_default1"] = [ %pistol_stand_pain_chest ];
|
|
var_0["pistol_default2"] = [ %pistol_stand_pain_groin ];
|
|
var_0["torso_pistol"] = %pistol_stand_pain_chest;
|
|
var_0["torso_upper"] = [ %exposed_pain_face, %stand_exposed_extendedpain_neck ];
|
|
var_0["torso_upper_extended"] = [ %stand_exposed_extendedpain_gut, %stand_exposed_extendedpain_stomach, %stand_exposed_extendedpain_head_2_crouch ];
|
|
var_0["torso_lower"] = [ %exposed_pain_groin, %stand_exposed_extendedpain_hip ];
|
|
var_0["torso_lower_extended"] = [ %stand_exposed_extendedpain_gut, %stand_exposed_extendedpain_stomach, %stand_exposed_extendedpain_hip_2_crouch, %stand_exposed_extendedpain_feet_2_crouch, %stand_exposed_extendedpain_stomach ];
|
|
var_0["head"] = [ %exposed_pain_face, %stand_exposed_extendedpain_neck ];
|
|
var_0["head_extended"] = [ %stand_exposed_extendedpain_head_2_crouch ];
|
|
var_0["right_arm"] = [ %exposed_pain_right_arm ];
|
|
var_0["right_arm_extended"] = [];
|
|
var_0["left_arm"] = [ %stand_exposed_extendedpain_shoulderswing ];
|
|
var_0["left_arm_extended"] = [ %stand_exposed_extendedpain_shoulder_2_crouch ];
|
|
var_0["leg"] = [ %exposed_pain_groin, %stand_exposed_extendedpain_hip ];
|
|
var_0["leg_extended"] = [ %stand_exposed_extendedpain_hip_2_crouch, %stand_exposed_extendedpain_feet_2_crouch, %stand_exposed_extendedpain_stomach ];
|
|
var_0["foot"] = [ %stand_exposed_extendedpain_thigh ];
|
|
var_0["foot_extended"] = [ %stand_exposed_extendedpain_feet_2_crouch ];
|
|
var_0["default_long"] = [ %exposed_pain_2_crouch, %stand_extendedpainb ];
|
|
var_0["default_short"] = [ %exposed_pain_right_arm, %exposed_pain_face, %exposed_pain_groin ];
|
|
var_0["default_extended"] = [ %stand_extendedpainc, %stand_exposed_extendedpain_chest ];
|
|
var_0["crouch_longdeath"] = [ %exposed_crouch_extendedpaina ];
|
|
var_0["crouch_default"] = [ %exposed_crouch_pain_chest, %exposed_crouch_pain_headsnap, %exposed_crouch_pain_flinch ];
|
|
var_0["crouch_left_arm"] = [ %exposed_crouch_pain_left_arm ];
|
|
var_0["crouch_right_arm"] = [ %exposed_crouch_pain_right_arm ];
|
|
var_0["prone"] = [ %prone_reaction_a, %prone_reaction_b ];
|
|
var_0["cover_left_stand"] = [ %corner_standl_painb, %corner_standl_painc, %corner_standl_paind, %corner_standl_paine ];
|
|
var_0["cover_left_crouch"] = [ %cornercrl_painb ];
|
|
var_0["cover_right_stand"] = [ %corner_standr_pain, %corner_standr_painb, %corner_standr_painc ];
|
|
var_0["cover_right_crouch"] = [ %cornercrr_alert_paina, %cornercrr_alert_painc ];
|
|
var_0["cover_right_stand_B"] = %corner_standr_pain_b_2_alert;
|
|
var_0["cover_left_stand_A"] = %corner_standl_pain_a_2_alert;
|
|
var_0["cover_left_stand_B"] = %corner_standl_pain_b_2_alert;
|
|
var_0["cover_crouch"] = [ %covercrouch_pain_right, %covercrouch_pain_front, %covercrouch_pain_left_3 ];
|
|
var_0["cover_stand"] = [ %coverstand_pain_groin, %coverstand_pain_leg ];
|
|
var_0["cover_stand_aim"] = [ %coverstand_pain_aim_2_hide_01, %coverstand_pain_aim_2_hide_02 ];
|
|
var_0["cover_crouch_aim"] = [ %covercrouch_pain_aim_2_hide_01 ];
|
|
var_0["saw_stand"] = %saw_gunner_pain;
|
|
var_0["saw_crouch"] = %saw_gunner_lowwall_pain_02;
|
|
var_0["saw_prone"] = %saw_gunner_prone_pain;
|
|
anim.archetypes["soldier"]["pain"] = var_0;
|
|
var_0 = [];
|
|
var_0["prone_transition"] = [ %dying_crawl_2_back ];
|
|
var_0["stand_transition"] = [ %dying_stand_2_back_v1, %dying_stand_2_back_v2 ];
|
|
var_0["crouch_transition"] = [ %dying_crouch_2_back ];
|
|
var_0["default_transition"] = %dying_crawl_2_back;
|
|
var_0["stand_2_crawl"] = [ %dying_stand_2_crawl_v1, %dying_stand_2_crawl_v2, %dying_stand_2_crawl_v3 ];
|
|
var_0["crouch_2_crawl"] = [ %dying_crouch_2_crawl ];
|
|
var_0["crawl"] = %dying_crawl;
|
|
var_0["death"] = [ %dying_crawl_death_v1, %dying_crawl_death_v2 ];
|
|
var_0["back_idle"] = %dying_back_idle;
|
|
var_0["back_idle_twitch"] = [ %dying_back_twitch_a, %dying_back_twitch_b ];
|
|
var_0["back_crawl"] = %dying_crawl_back;
|
|
var_0["back_fire"] = %dying_back_fire;
|
|
var_0["back_death"] = [ %dying_back_death_v1, %dying_back_death_v2, %dying_back_death_v3 ];
|
|
var_0["aim_4"] = %dying_back_aim_4;
|
|
var_0["aim_6"] = %dying_back_aim_6;
|
|
var_0["longdeath"] = [];
|
|
var_0["longdeath"]["gut_b"] = [ [ %stand_2_longdeath_wander_gut, %longdeath_wander_gut, %longdeath_wander_gut_collapse, %longdeath_wander_gut_death ], [ %stand_2_longdeath_gut_wounded_b, %longdeath_gut_wounded_b_walk, %longdeath_gut_wounded_b_collapse ], [ %stand_2_longdeath_gut_b, %longdeath_gut_b_walk, %longdeath_gut_b_impact ] ];
|
|
var_0["longdeath"]["gut_l"] = [ [ %stand_2_longdeath_gut_l, %longdeath_gut_l_walk, %longdeath_gut_l_impact ] ];
|
|
var_0["longdeath"]["gut_r"] = [ [ %stand_2_longdeath_gut_r, %longdeath_gut_r_walk, %longdeath_gut_r_impact ] ];
|
|
var_0["longdeath"]["leg_b"] = [ [ %stand_2_longdeath_wander_leg_1, %longdeath_wander_leg_1, %longdeath_wander_leg_collapse_1, %longdeath_wander_leg_death ], [ %stand_2_longdeath_wander_leg_2, %longdeath_wander_leg_2, %longdeath_wander_leg_collapse_2, %longdeath_wander_leg_death ], [ %stand_2_longdeath_leg_wounded_b_1, %longdeath_leg_wounded_b_walk_1, %longdeath_leg_wounded_b_collapse_1 ], [ %stand_2_longdeath_leg_wounded_b_2, %longdeath_leg_wounded_b_walk_2, %longdeath_leg_wounded_b_collapse_2 ] ];
|
|
anim.archetypes["soldier"]["crawl_death"] = var_0;
|
|
var_0 = [];
|
|
var_0["pain"] = %corner_standr_death_grenade_hit;
|
|
var_0["idle"] = %corner_standr_death_grenade_idle;
|
|
var_0["release"] = %corner_standr_death_grenade_slump;
|
|
var_0["premature_death"] = [ %dying_back_death_v1, %dying_back_death_v2, %dying_back_death_v3, %dying_back_death_v4 ];
|
|
anim.archetypes["soldier"]["corner_grenade_death"] = var_0;
|
|
var_0 = [];
|
|
var_0["default"] = [ %pain_add_standing_belly, %pain_add_standing_left_arm, %pain_add_standing_right_arm ];
|
|
var_0["left_arm"] = %pain_add_standing_left_arm;
|
|
var_0["right_arm"] = %pain_add_standing_right_arm;
|
|
var_0["left_leg"] = %pain_add_standing_left_leg;
|
|
var_0["right_leg"] = %pain_add_standing_right_leg;
|
|
anim.archetypes["soldier"]["additive_pain"] = var_0;
|
|
}
|
|
|
|
main()
|
|
{
|
|
if ( isdefined( self.longdeathstarting ) )
|
|
{
|
|
self waittill( "killanimscript" );
|
|
return;
|
|
}
|
|
|
|
if ( [[ anim.pain_test ]]() )
|
|
return;
|
|
|
|
if ( self.a.disablepain )
|
|
return;
|
|
|
|
self notify( "kill_long_death" );
|
|
self.facialanimidx = undefined;
|
|
|
|
if ( isdefined( self.a.paintime ) )
|
|
self.a.lastpaintime = self.a.paintime;
|
|
else
|
|
self.a.lastpaintime = 0;
|
|
|
|
self.a.paintime = gettime();
|
|
|
|
if ( self.stairsstate != "none" )
|
|
self.a.painonstairs = 1;
|
|
else
|
|
self.a.painonstairs = undefined;
|
|
|
|
if ( self.a.nextstandinghitdying )
|
|
self.health = 1;
|
|
|
|
self notify( "anim entered pain" );
|
|
self endon( "killanimscript" );
|
|
animscripts\utility::initialize( "pain" );
|
|
self animmode( "gravity" );
|
|
|
|
if ( !isdefined( self.no_pain_sound ) )
|
|
animscripts\face::saygenericdialogue( "pain" );
|
|
|
|
if ( self.damagelocation == "helmet" )
|
|
animscripts\death::helmetpop();
|
|
else if ( wasdamagedbyexplosive() && randomint( 2 ) == 0 )
|
|
animscripts\death::helmetpop();
|
|
|
|
if ( isdefined( self.painfunction ) )
|
|
{
|
|
self [[ self.painfunction ]]();
|
|
return;
|
|
}
|
|
|
|
if ( crawlingpain() )
|
|
return;
|
|
|
|
if ( specialpain( self.a.special ) )
|
|
return;
|
|
|
|
var_0 = getpainanim();
|
|
playpainanim( var_0 );
|
|
}
|
|
|
|
initpainfx()
|
|
{
|
|
level._effect["crawling_death_blood_smear"] = loadfx( "fx/impacts/blood_smear_decal" );
|
|
}
|
|
|
|
end_script()
|
|
{
|
|
if ( isdefined( self.damageshieldpain ) )
|
|
{
|
|
self.damageshieldcounter = undefined;
|
|
self.damageshieldpain = undefined;
|
|
self.allowpain = 1;
|
|
|
|
if ( !isdefined( self.predamageshieldignoreme ) )
|
|
self.ignoreme = 0;
|
|
|
|
self.predamageshieldignoreme = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.blockingpain ) )
|
|
{
|
|
self.blockingpain = undefined;
|
|
self.allowpain = 1;
|
|
}
|
|
|
|
self clearanim( %head, 0.2 );
|
|
self.facialanimidx = undefined;
|
|
}
|
|
|
|
wasdamagedbyexplosive()
|
|
{
|
|
if ( isexplosivedamagemod( self.damagemod ) )
|
|
return 1;
|
|
|
|
if ( gettime() - anim.lastcarexplosiontime <= 50 )
|
|
{
|
|
var_0 = anim.lastcarexplosionrange * anim.lastcarexplosionrange * 1.2 * 1.2;
|
|
|
|
if ( distancesquared( self.origin, anim.lastcarexplosiondamagelocation ) < var_0 )
|
|
{
|
|
var_1 = var_0 * 0.5 * 0.5;
|
|
self.maydoupwardsdeath = distancesquared( self.origin, anim.lastcarexplosionlocation ) < var_1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
getdamageshieldpainanim()
|
|
{
|
|
if ( self.a.pose == "prone" )
|
|
return;
|
|
|
|
if ( isdefined( self.lastattacker ) && isdefined( self.lastattacker.team ) && self.lastattacker.team == self.team )
|
|
return;
|
|
|
|
if ( !isdefined( self.damageshieldcounter ) || gettime() - self.a.lastpaintime > 1500 )
|
|
self.damageshieldcounter = randomintrange( 2, 3 );
|
|
|
|
if ( isdefined( self.lastattacker ) && distancesquared( self.origin, self.lastattacker.origin ) < squared( 512 ) )
|
|
self.damageshieldcounter = 0;
|
|
|
|
if ( self.damageshieldcounter > 0 )
|
|
self.damageshieldcounter--;
|
|
else
|
|
{
|
|
self.damageshieldpain = 1;
|
|
self.allowpain = 0;
|
|
|
|
if ( self.ignoreme )
|
|
self.predamageshieldignoreme = 1;
|
|
else
|
|
self.ignoreme = 1;
|
|
|
|
if ( animscripts\utility::usingsidearm() )
|
|
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
|
|
|
|
if ( self.a.pose == "crouch" )
|
|
return animscripts\utility::lookupanim( "pain", "damage_shield_crouch" );
|
|
|
|
var_0 = animscripts\utility::lookupanim( "pain", "damage_shield_pain_array" );
|
|
}
|
|
}
|
|
|
|
getpainanim()
|
|
{
|
|
if ( self.damageshield && !isdefined( self.disabledamageshieldpain ) )
|
|
{
|
|
var_0 = getdamageshieldpainanim();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
return var_0;
|
|
}
|
|
|
|
if ( isdefined( self.a.onback ) )
|
|
{
|
|
if ( self.a.pose == "crouch" )
|
|
return animscripts\utility::lookupanim( "pain", "back" );
|
|
else
|
|
animscripts\notetracks::stoponback();
|
|
}
|
|
|
|
if ( self.a.pose == "stand" )
|
|
{
|
|
var_1 = isdefined( self.node ) && distancesquared( self.origin, self.node.origin ) < 4096;
|
|
|
|
if ( !var_1 && self.a.movement == "run" && abs( self getmotionangle() ) < 60 )
|
|
return getrunningforwardpainanim();
|
|
|
|
self.a.movement = "stop";
|
|
return getstandpainanim();
|
|
}
|
|
else if ( self.a.pose == "crouch" )
|
|
{
|
|
self.a.movement = "stop";
|
|
return getcrouchpainanim();
|
|
}
|
|
else if ( self.a.pose == "prone" )
|
|
{
|
|
self.a.movement = "stop";
|
|
return getpronepainanim();
|
|
}
|
|
}
|
|
|
|
getrunningforwardpainanim()
|
|
{
|
|
var_0 = [];
|
|
var_1 = 0;
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
|
|
if ( self maymovetopoint( self localtoworldcoords( ( 300, 0, 0 ) ) ) )
|
|
{
|
|
var_2 = 1;
|
|
var_1 = 1;
|
|
}
|
|
else if ( self maymovetopoint( self localtoworldcoords( ( 200, 0, 0 ) ) ) )
|
|
var_1 = 1;
|
|
|
|
if ( isdefined( self.a.disablelongpain ) )
|
|
{
|
|
var_2 = 0;
|
|
var_1 = 0;
|
|
}
|
|
|
|
if ( var_2 )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "run_long" );
|
|
else if ( var_1 )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "run_medium" );
|
|
else if ( self maymovetopoint( self localtoworldcoords( ( 120, 0, 0 ) ) ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "run_short" );
|
|
|
|
if ( !var_0.size )
|
|
{
|
|
self.a.movement = "stop";
|
|
return getstandpainanim();
|
|
}
|
|
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
getstandpistolpainanim()
|
|
{
|
|
var_0 = [];
|
|
|
|
if ( animscripts\utility::damagelocationisany( "torso_upper" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_torso_upper" );
|
|
else if ( animscripts\utility::damagelocationisany( "torso_lower" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_torso_lower" );
|
|
else if ( animscripts\utility::damagelocationisany( "neck" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_neck" );
|
|
else if ( animscripts\utility::damagelocationisany( "head" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_head" );
|
|
else if ( animscripts\utility::damagelocationisany( "left_leg_upper", "right_leg_upper" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_leg" );
|
|
else if ( animscripts\utility::damagelocationisany( "left_arm_upper" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_left_arm_upper" );
|
|
else if ( animscripts\utility::damagelocationisany( "left_arm_lower" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_left_arm_lower" );
|
|
else if ( animscripts\utility::damagelocationisany( "right_arm_upper" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_right_arm_upper" );
|
|
else if ( animscripts\utility::damagelocationisany( "right_arm_lower" ) )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "pistol_right_arm_lower" );
|
|
|
|
if ( var_0.size < 2 )
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "pistol_default1" ) );
|
|
|
|
if ( var_0.size < 2 )
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "pistol_default2" ) );
|
|
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
getstandpainanim()
|
|
{
|
|
if ( animscripts\utility::usingsidearm() )
|
|
return getstandpistolpainanim();
|
|
|
|
var_0 = [];
|
|
var_1 = [];
|
|
|
|
if ( animscripts\utility::damagelocationisany( "torso_upper" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "torso_upper" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "torso_upper_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "torso_lower" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "torso_lower" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "torso_lower_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "head", "helmet", "neck" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "head" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "head_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "right_arm_upper", "right_arm_lower" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "right_arm" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "right_arm_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "left_arm_upper", "left_arm_lower" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "left_arm" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "left_arm_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "left_leg_upper", "right_leg_upper" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "leg" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "leg_extended" );
|
|
}
|
|
else if ( animscripts\utility::damagelocationisany( "left_foot", "right_foot", "left_leg_lower", "right_leg_lower" ) )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "foot" );
|
|
var_1 = animscripts\utility::lookupanim( "pain", "foot_extended" );
|
|
}
|
|
|
|
if ( var_0.size < 2 )
|
|
{
|
|
if ( !self.a.disablelongdeath )
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "default_long" ) );
|
|
else
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "default_short" ) );
|
|
}
|
|
|
|
if ( var_1.size < 2 )
|
|
var_1 = common_scripts\utility::array_combine( var_1, animscripts\utility::lookupanim( "pain", "default_extended" ) );
|
|
|
|
if ( !self.damageshield && !self.a.disablelongdeath )
|
|
{
|
|
var_2 = randomint( var_0.size + var_1.size );
|
|
|
|
if ( var_2 < var_0.size )
|
|
return var_0[var_2];
|
|
else
|
|
return var_1[var_2 - var_0.size];
|
|
}
|
|
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
getcrouchpainanim()
|
|
{
|
|
var_0 = [];
|
|
|
|
if ( !self.damageshield && !self.a.disablelongdeath )
|
|
var_0 = animscripts\utility::lookupanim( "pain", "crouch_longdeath" );
|
|
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "crouch_default" ) );
|
|
|
|
if ( animscripts\utility::damagelocationisany( "left_hand", "left_arm_lower", "left_arm_upper" ) )
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "crouch_left_arm" ) );
|
|
|
|
if ( animscripts\utility::damagelocationisany( "right_hand", "right_arm_lower", "right_arm_upper" ) )
|
|
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "pain", "crouch_right_arm" ) );
|
|
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
getpronepainanim()
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "pain", "prone" );
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
playpainanim( var_0 )
|
|
{
|
|
var_1 = 1;
|
|
pain_setflaggedanimknoballrestart( "painanim", var_0, %body, 1, 0.1, var_1 );
|
|
|
|
if ( self.a.pose == "prone" )
|
|
self updateprone( %prone_legs_up, %prone_legs_down, 1, 0.1, 1 );
|
|
|
|
if ( animhasnotetrack( var_0, "start_aim" ) )
|
|
{
|
|
thread notifystartaim( "painanim" );
|
|
self endon( "start_aim" );
|
|
}
|
|
|
|
if ( animhasnotetrack( var_0, "code_move" ) )
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
}
|
|
|
|
notifystartaim( var_0 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
self waittillmatch( var_0, "start_aim" );
|
|
self notify( "start_aim" );
|
|
}
|
|
|
|
specialpainblocker()
|
|
{
|
|
self endon( "killanimscript" );
|
|
self.blockingpain = 1;
|
|
self.allowpain = 0;
|
|
wait 0.5;
|
|
self.blockingpain = undefined;
|
|
self.allowpain = 1;
|
|
}
|
|
|
|
specialpain( var_0 )
|
|
{
|
|
if ( var_0 == "none" )
|
|
return 0;
|
|
|
|
self.a.special = "none";
|
|
thread specialpainblocker();
|
|
|
|
var_2 = 0;
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "cover_left":
|
|
if ( self.a.pose == "stand" )
|
|
{
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_left_stand" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
}
|
|
else if ( self.a.pose == "crouch" )
|
|
{
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_left_crouch" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
}
|
|
else
|
|
var_2 = 0;
|
|
|
|
break;
|
|
case "cover_right":
|
|
if ( self.a.pose == "stand" )
|
|
{
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_right_stand" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
}
|
|
else if ( self.a.pose == "crouch" )
|
|
{
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_right_crouch" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
}
|
|
else
|
|
var_2 = 0;
|
|
|
|
break;
|
|
case "cover_right_stand_A":
|
|
var_2 = 0;
|
|
break;
|
|
case "cover_right_stand_B":
|
|
dopain( animscripts\utility::lookupanim( "pain", "cover_right_stand_B" ) );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_left_stand_A":
|
|
dopain( animscripts\utility::lookupanim( "pain", "cover_left_stand_A" ) );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_left_stand_B":
|
|
dopain( animscripts\utility::lookupanim( "pain", "cover_left_stand_B" ) );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_crouch":
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_crouch" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_stand":
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_stand" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_stand_aim":
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_stand_aim" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
break;
|
|
case "cover_crouch_aim":
|
|
var_1 = animscripts\utility::lookupanim( "pain", "cover_crouch_aim" );
|
|
dopainfromarray( var_1 );
|
|
var_2 = 1;
|
|
break;
|
|
case "saw":
|
|
if ( self.a.pose == "stand" )
|
|
var_3 = animscripts\utility::lookupanim( "pain", "saw_stand" );
|
|
else if ( self.a.pose == "crouch" )
|
|
var_3 = animscripts\utility::lookupanim( "pain", "saw_crouch" );
|
|
else
|
|
var_3 = animscripts\utility::lookupanim( "pain", "saw_prone" );
|
|
|
|
pain_setflaggedanimknob( "painanim", var_3, 1, 0.3, 1 );
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
var_2 = 1;
|
|
break;
|
|
case "mg42":
|
|
mg42pain( self.a.pose );
|
|
var_2 = 1;
|
|
break;
|
|
case "minigun":
|
|
var_2 = 0;
|
|
break;
|
|
case "corner_right_martyrdom":
|
|
var_2 = trycornerrightgrenadedeath();
|
|
break;
|
|
case "rambo":
|
|
case "rambo_right":
|
|
case "rambo_left":
|
|
case "dying_crawl":
|
|
var_2 = 0;
|
|
break;
|
|
default:
|
|
var_2 = 0;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
paindeathnotify()
|
|
{
|
|
self endon( "death" );
|
|
wait 0.05;
|
|
self notify( "pain_death" );
|
|
}
|
|
|
|
dopainfromarray( var_0 )
|
|
{
|
|
var_1 = var_0[randomint( var_0.size )];
|
|
pain_setflaggedanimknob( "painanim", var_1, 1, 0.3, 1 );
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
}
|
|
|
|
dopain( var_0 )
|
|
{
|
|
pain_setflaggedanimknob( "painanim", var_0, 1, 0.3, 1 );
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
}
|
|
|
|
mg42pain( var_0 )
|
|
{
|
|
pain_setflaggedanimknob( "painanim", level.mg_animmg["pain_" + var_0], 1, 0.1, 1 );
|
|
animscripts\shared::donotetracks( "painanim" );
|
|
}
|
|
|
|
waitsetstop( var_0, var_1 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "death" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
self endon( var_1 );
|
|
|
|
wait( var_0 );
|
|
self.a.movement = "stop";
|
|
}
|
|
|
|
crawlingpain()
|
|
{
|
|
if ( self.a.disablelongdeath || self.diequietly || self.damageshield )
|
|
return 0;
|
|
|
|
if ( self.stairsstate != "none" )
|
|
return 0;
|
|
|
|
if ( isdefined( self.a.onback ) )
|
|
return 0;
|
|
|
|
var_0 = animscripts\utility::damagelocationisany( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower", "left_foot", "right_foot" );
|
|
|
|
if ( isdefined( self.forcelongdeath ) )
|
|
{
|
|
setcrawlingpaintransanim( var_0 );
|
|
self.health = 10;
|
|
thread crawlingpistol();
|
|
self waittill( "killanimscript" );
|
|
return 1;
|
|
}
|
|
|
|
if ( self.health > 100 )
|
|
return 0;
|
|
|
|
if ( var_0 && self.health < self.maxhealth * 0.4 )
|
|
{
|
|
if ( gettime() < anim.nextcrawlingpaintimefromlegdamage )
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
if ( anim.numdeathsuntilcrawlingpain > 0 )
|
|
return 0;
|
|
|
|
if ( gettime() < anim.nextcrawlingpaintime )
|
|
return 0;
|
|
}
|
|
|
|
if ( isdefined( self.deathfunction ) )
|
|
return 0;
|
|
|
|
foreach ( var_2 in level.players )
|
|
{
|
|
if ( distancesquared( self.origin, var_2.origin ) < 30625 )
|
|
return 0;
|
|
}
|
|
|
|
if ( animscripts\utility::damagelocationisany( "head", "helmet", "gun", "right_hand", "left_hand" ) )
|
|
return 0;
|
|
|
|
if ( animscripts\utility::usingsidearm() )
|
|
return 0;
|
|
|
|
setcrawlingpaintransanim( var_0 );
|
|
|
|
if ( !isdefined( self.a.stumblingpainanimseq ) && !iscrawldeltaallowed( self.a.crawlingpaintransanim ) )
|
|
return 0;
|
|
|
|
anim.nextcrawlingpaintime = gettime() + 3000;
|
|
anim.nextcrawlingpaintimefromlegdamage = gettime() + 3000;
|
|
thread crawlingpistol();
|
|
self waittill( "killanimscript" );
|
|
return 1;
|
|
}
|
|
|
|
setcrawlingpaintransanim( var_0 )
|
|
{
|
|
var_1 = [];
|
|
var_2 = undefined;
|
|
|
|
if ( self.a.pose == "stand" )
|
|
{
|
|
var_2 = shouldattemptstumblingpain( var_0 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_1 = [ var_2[0] ];
|
|
else
|
|
var_1 = animscripts\utility::lookupanim( "crawl_death", "stand_transition" );
|
|
}
|
|
else if ( self.a.pose == "crouch" )
|
|
var_1 = animscripts\utility::lookupanim( "crawl_death", "crouch_transition" );
|
|
else
|
|
var_1 = animscripts\utility::lookupanim( "crawl_death", "prone_transition" );
|
|
|
|
self.a.crawlingpaintransanim = var_1[randomint( var_1.size )];
|
|
self.a.stumblingpainanimseq = var_2;
|
|
}
|
|
|
|
iscrawldeltaallowed( var_0 )
|
|
{
|
|
if ( isdefined( self.a.force_num_crawls ) )
|
|
return 1;
|
|
|
|
var_1 = getmovedelta( var_0, 0, 1 );
|
|
var_2 = self localtoworldcoords( var_1 );
|
|
return self maymovetopoint( var_2 );
|
|
}
|
|
|
|
crawlingpistol()
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
thread preventpainforashorttime( "crawling" );
|
|
self.a.special = "none";
|
|
self.specialdeathfunc = undefined;
|
|
self setlookatentity();
|
|
thread paindeathnotify();
|
|
level notify( "ai_crawling", self );
|
|
self setanimknoball( %dying, %body, 1, 0.1, 1 );
|
|
|
|
if ( isdefined( self.a.stumblingpainanimseq ) )
|
|
{
|
|
stumblingpain();
|
|
self.a.stumblingpainanimseq = undefined;
|
|
return;
|
|
}
|
|
|
|
if ( !dyingcrawl() )
|
|
return;
|
|
|
|
pain_setflaggedanimknob( "transition", self.a.crawlingpaintransanim, 1, 0.5, 1 );
|
|
animscripts\notetracks::donotetracksintercept( "transition", ::handlebackcrawlnotetracks );
|
|
self.a.special = "dying_crawl";
|
|
thread dyingcrawlbackaim();
|
|
|
|
if ( isdefined( self.enemy ) )
|
|
self setlookatentity( self.enemy );
|
|
|
|
decidenumcrawls();
|
|
|
|
while ( shouldkeepcrawling() )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "crawl_death", "back_crawl" );
|
|
|
|
if ( !iscrawldeltaallowed( var_0 ) )
|
|
break;
|
|
|
|
pain_setflaggedanimknobrestart( "back_crawl", var_0, 1, 0.1, 1.0 );
|
|
animscripts\notetracks::donotetracksintercept( "back_crawl", ::handlebackcrawlnotetracks );
|
|
}
|
|
|
|
self.desiredtimeofdeath = gettime() + randomintrange( 4000, 20000 );
|
|
|
|
while ( shouldstayalive() )
|
|
{
|
|
if ( animscripts\utility::canseeenemy() && aimedsomewhatatenemy() )
|
|
{
|
|
var_1 = animscripts\utility::lookupanim( "crawl_death", "back_fire" );
|
|
pain_setflaggedanimknobrestart( "back_idle_or_fire", var_1, 1, 0.2, 1.0 );
|
|
animscripts\shared::donotetracks( "back_idle_or_fire" );
|
|
continue;
|
|
}
|
|
|
|
var_1 = animscripts\utility::lookupanim( "crawl_death", "back_idle" );
|
|
|
|
if ( randomfloat( 1 ) < 0.4 )
|
|
{
|
|
var_2 = animscripts\utility::lookupanim( "crawl_death", "back_idle_twitch" );
|
|
var_1 = var_2[randomint( var_2.size )];
|
|
}
|
|
|
|
pain_setflaggedanimknobrestart( "back_idle_or_fire", var_1, 1, 0.1, 1.0 );
|
|
var_3 = getanimlength( var_1 );
|
|
|
|
while ( var_3 > 0 )
|
|
{
|
|
if ( animscripts\utility::canseeenemy() && aimedsomewhatatenemy() )
|
|
break;
|
|
|
|
var_4 = 0.5;
|
|
|
|
if ( var_4 > var_3 )
|
|
{
|
|
var_4 = var_3;
|
|
var_3 = 0;
|
|
}
|
|
else
|
|
var_3 = var_3 - var_4;
|
|
|
|
animscripts\notetracks::donotetracksfortime( var_4, "back_idle_or_fire" );
|
|
}
|
|
}
|
|
|
|
self notify( "end_dying_crawl_back_aim" );
|
|
self clearanim( %dying_back_aim_4_wrapper, 0.3 );
|
|
self clearanim( %dying_back_aim_6_wrapper, 0.3 );
|
|
var_5 = animscripts\utility::lookupanim( "crawl_death", "back_death" );
|
|
self.deathanim = var_5[randomint( var_5.size )];
|
|
killwrapper();
|
|
self.a.special = "none";
|
|
self.specialdeathfunc = undefined;
|
|
}
|
|
|
|
shouldattemptstumblingpain( var_0 )
|
|
{
|
|
if ( self.a.pose != "stand" )
|
|
return;
|
|
|
|
var_1 = 2;
|
|
|
|
if ( randomint( 10 ) > var_1 )
|
|
return;
|
|
|
|
var_2 = 0;
|
|
|
|
if ( !var_0 )
|
|
{
|
|
var_2 = animscripts\utility::damagelocationisany( "torso_upper", "torso_lower" );
|
|
|
|
if ( !var_2 )
|
|
return;
|
|
}
|
|
|
|
var_3 = 0;
|
|
var_4 = "leg";
|
|
var_5 = "b";
|
|
|
|
if ( var_0 )
|
|
var_3 = 200;
|
|
else
|
|
{
|
|
var_4 = "gut";
|
|
var_3 = 128;
|
|
|
|
if ( 45 < self.damageyaw && self.damageyaw < 135 )
|
|
var_5 = "l";
|
|
else if ( -135 < self.damageyaw && self.damageyaw < -45 )
|
|
var_5 = "r";
|
|
else if ( -45 < self.damageyaw && self.damageyaw < 45 )
|
|
return;
|
|
}
|
|
|
|
switch ( var_5 )
|
|
{
|
|
case "b":
|
|
var_6 = anglestoforward( self.angles );
|
|
var_7 = self.origin - var_6 * var_3;
|
|
break;
|
|
case "l":
|
|
var_8 = anglestoright( self.angles );
|
|
var_7 = self.origin - var_8 * var_3;
|
|
break;
|
|
case "r":
|
|
var_8 = anglestoright( self.angles );
|
|
var_7 = self.origin + var_8 * var_3;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
if ( !self maymovetopoint( var_7 ) )
|
|
return;
|
|
|
|
var_9 = animscripts\utility::lookupanim( "crawl_death", "longdeath" );
|
|
var_10 = var_4 + "_" + var_5;
|
|
var_11 = randomint( var_9[var_10].size );
|
|
var_12 = var_9[var_10][var_11];
|
|
return var_12;
|
|
}
|
|
|
|
stumblingpain()
|
|
{
|
|
pain_setflaggedanimknobrestart( "stumblingPainInto", self.a.stumblingpainanimseq[0] );
|
|
animscripts\shared::donotetracks( "stumblingPainInto" );
|
|
self.a.special = "stumbling_pain";
|
|
var_0 = getmovedelta( self.a.stumblingpainanimseq[2] );
|
|
var_1 = getanimlength( self.a.stumblingpainanimseq[2] ) * 1000;
|
|
|
|
for ( var_2 = randomint( 2 ) + 1; var_2 > 0; var_2-- )
|
|
{
|
|
var_3 = anglestoforward( self.angles );
|
|
var_4 = self.origin + var_3 * var_0;
|
|
|
|
if ( !self maymovetopoint( var_4 ) )
|
|
break;
|
|
|
|
pain_setflaggedanimknobrestart( "stumblingPain", self.a.stumblingpainanimseq[1] );
|
|
animscripts\shared::donotetracks( "stumblingPain" );
|
|
}
|
|
|
|
self.a.nodeath = 1;
|
|
self.a.special = "none";
|
|
pain_setflaggedanimknobrestart( "stumblingPainCollapse", self.a.stumblingpainanimseq[2], 1, 0.75 );
|
|
animscripts\notetracks::donotetracksintercept( "stumblingPainCollapse", ::stumblingpainnotetrackhandler );
|
|
animscripts\shared::donotetracks( "stumblingPainCollapse" );
|
|
killwrapper();
|
|
}
|
|
|
|
stumblingpainnotetrackhandler( var_0 )
|
|
{
|
|
if ( var_0 == "start_ragdoll" )
|
|
{
|
|
animscripts\notetracks::handlenotetrack( var_0, "stumblingPainCollapse" );
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
shouldstayalive()
|
|
{
|
|
if ( !enemyisingeneraldirection( anglestoforward( self.angles ) ) )
|
|
return 0;
|
|
|
|
return gettime() < self.desiredtimeofdeath;
|
|
}
|
|
|
|
dyingcrawl()
|
|
{
|
|
if ( !isdefined( self.forcelongdeath ) )
|
|
{
|
|
if ( self.a.pose == "prone" )
|
|
return 1;
|
|
|
|
if ( self.a.movement == "stop" )
|
|
{
|
|
if ( randomfloat( 1 ) < 0.4 )
|
|
{
|
|
if ( randomfloat( 1 ) < 0.5 )
|
|
return 1;
|
|
}
|
|
else if ( abs( self.damageyaw ) > 90 )
|
|
return 1;
|
|
}
|
|
else if ( abs( self getmotionangle() ) > 90 )
|
|
return 1;
|
|
}
|
|
|
|
if ( self.a.pose != "prone" )
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "crawl_death", self.a.pose + "_2_crawl" );
|
|
var_1 = var_0[randomint( var_0.size )];
|
|
|
|
if ( !iscrawldeltaallowed( var_1 ) )
|
|
return 1;
|
|
|
|
thread dyingcrawlbloodsmear();
|
|
pain_setflaggedanimknob( "falling", var_1, 1, 0.5, 1 );
|
|
animscripts\shared::donotetracks( "falling" );
|
|
}
|
|
else
|
|
thread dyingcrawlbloodsmear();
|
|
|
|
self.a.crawlingpaintransanim = animscripts\utility::lookupanim( "crawl_death", "default_transition" );
|
|
self.a.special = "dying_crawl";
|
|
decidenumcrawls();
|
|
var_2 = animscripts\utility::lookupanim( "crawl_death", "crawl" );
|
|
|
|
while ( shouldkeepcrawling() )
|
|
{
|
|
if ( !iscrawldeltaallowed( var_2 ) )
|
|
return 1;
|
|
|
|
if ( isdefined( self.custom_crawl_sound ) )
|
|
self playsound( self.custom_crawl_sound );
|
|
|
|
pain_setflaggedanimknobrestart( "crawling", var_2, 1, 0.1, 1.0 );
|
|
animscripts\shared::donotetracks( "crawling" );
|
|
}
|
|
|
|
self notify( "done_crawling" );
|
|
|
|
if ( !isdefined( self.forcelongdeath ) && enemyisingeneraldirection( anglestoforward( self.angles ) * -1 ) )
|
|
return 1;
|
|
|
|
var_3 = animscripts\utility::lookupanim( "crawl_death", "death" );
|
|
var_4 = var_3[randomint( var_3.size )];
|
|
|
|
if ( var_4 != %dying_crawl_death_v2 )
|
|
self.a.nodeath = 1;
|
|
|
|
animscripts\death::playdeathanim( var_4 );
|
|
killwrapper();
|
|
self.a.special = "none";
|
|
self.specialdeathfunc = undefined;
|
|
return 0;
|
|
}
|
|
|
|
dyingcrawlbloodsmear()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( self.a.pose != "prone" )
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( "falling", var_0 );
|
|
|
|
if ( issubstr( var_0, "bodyfall" ) )
|
|
break;
|
|
}
|
|
}
|
|
|
|
var_1 = "J_SpineLower";
|
|
var_2 = "tag_origin";
|
|
var_3 = 0.25;
|
|
var_4 = level._effect["crawling_death_blood_smear"];
|
|
|
|
if ( isdefined( self.a.crawl_fx_rate ) )
|
|
var_3 = self.a.crawl_fx_rate;
|
|
|
|
if ( isdefined( self.a.crawl_fx ) )
|
|
var_4 = level._effect[self.a.crawl_fx];
|
|
|
|
while ( var_3 )
|
|
{
|
|
var_5 = self gettagorigin( var_1 );
|
|
var_6 = self gettagangles( var_2 );
|
|
var_7 = anglestoright( var_6 );
|
|
var_8 = anglestoforward( ( 270, 0, 0 ) );
|
|
playfx( var_4, var_5, var_8, var_7 );
|
|
wait( var_3 );
|
|
}
|
|
}
|
|
|
|
dyingcrawlbackaim()
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
self endon( "end_dying_crawl_back_aim" );
|
|
|
|
if ( isdefined( self.dyingcrawlaiming ) )
|
|
return;
|
|
|
|
self.dyingcrawlaiming = 1;
|
|
self setanimlimited( animscripts\utility::lookupanim( "crawl_death", "aim_4" ), 1, 0 );
|
|
self setanimlimited( animscripts\utility::lookupanim( "crawl_death", "aim_6" ), 1, 0 );
|
|
var_0 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = animscripts\utility::getyawtoenemy();
|
|
var_2 = angleclamp180( var_1 - var_0 );
|
|
|
|
if ( abs( var_2 ) > 3 )
|
|
var_2 = common_scripts\utility::sign( var_2 ) * 3;
|
|
|
|
var_1 = angleclamp180( var_0 + var_2 );
|
|
|
|
if ( var_1 < 0 )
|
|
{
|
|
if ( var_1 < -45.0 )
|
|
var_1 = -45.0;
|
|
|
|
var_3 = var_1 / -45.0;
|
|
self setanim( %dying_back_aim_4_wrapper, var_3, 0.05 );
|
|
self setanim( %dying_back_aim_6_wrapper, 0, 0.05 );
|
|
}
|
|
else
|
|
{
|
|
if ( var_1 > 45.0 )
|
|
var_1 = 45.0;
|
|
|
|
var_3 = var_1 / 45.0;
|
|
self setanim( %dying_back_aim_6_wrapper, var_3, 0.05 );
|
|
self setanim( %dying_back_aim_4_wrapper, 0, 0.05 );
|
|
}
|
|
|
|
var_0 = var_1;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
startdyingcrawlbackaimsoon()
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
wait 0.5;
|
|
thread dyingcrawlbackaim();
|
|
}
|
|
|
|
handlebackcrawlnotetracks( var_0 )
|
|
{
|
|
if ( var_0 == "fire_spray" )
|
|
{
|
|
if ( !animscripts\utility::canseeenemy() )
|
|
return 1;
|
|
|
|
if ( !aimedsomewhatatenemy() )
|
|
return 1;
|
|
|
|
animscripts\utility::shootenemywrapper();
|
|
return 1;
|
|
}
|
|
else if ( var_0 == "pistol_pickup" )
|
|
{
|
|
thread startdyingcrawlbackaimsoon();
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
aimedsomewhatatenemy()
|
|
{
|
|
var_0 = self.enemy getshootatpos();
|
|
var_1 = self getmuzzleangle();
|
|
var_2 = vectortoangles( var_0 - self getmuzzlepos() );
|
|
var_3 = animscripts\utility::absangleclamp180( var_1[1] - var_2[1] );
|
|
|
|
if ( var_3 > anim.painyawdifffartolerance )
|
|
{
|
|
if ( distancesquared( self geteye(), var_0 ) > anim.painyawdiffclosedistsq || var_3 > anim.painyawdiffclosetolerance )
|
|
return 0;
|
|
}
|
|
|
|
return animscripts\utility::absangleclamp180( var_1[0] - var_2[0] ) <= anim.painpitchdifftolerance;
|
|
}
|
|
|
|
enemyisingeneraldirection( var_0 )
|
|
{
|
|
if ( !isdefined( self.enemy ) )
|
|
return 0;
|
|
|
|
var_1 = vectornormalize( self.enemy getshootatpos() - self geteye() );
|
|
return vectordot( var_1, var_0 ) > 0.5;
|
|
}
|
|
|
|
preventpainforashorttime( var_0 )
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
self.flashbangimmunity = 1;
|
|
self.longdeathstarting = 1;
|
|
self.a.doinglongdeath = 1;
|
|
self notify( "long_death" );
|
|
self.health = 10000;
|
|
self.threatbias = self.threatbias - 2000;
|
|
wait 0.75;
|
|
|
|
if ( self.health > 1 )
|
|
self.health = 1;
|
|
|
|
wait 0.05;
|
|
self.longdeathstarting = undefined;
|
|
self.a.mayonlydie = 1;
|
|
|
|
if ( var_0 == "crawling" )
|
|
{
|
|
wait 1.0;
|
|
|
|
if ( isdefined( level.player ) && distancesquared( self.origin, level.player.origin ) < 1048576 )
|
|
{
|
|
anim.numdeathsuntilcrawlingpain = randomintrange( 10, 30 );
|
|
anim.nextcrawlingpaintime = gettime() + randomintrange( 15000, 60000 );
|
|
}
|
|
else
|
|
{
|
|
anim.numdeathsuntilcrawlingpain = randomintrange( 5, 12 );
|
|
anim.nextcrawlingpaintime = gettime() + randomintrange( 5000, 25000 );
|
|
}
|
|
|
|
anim.nextcrawlingpaintimefromlegdamage = gettime() + randomintrange( 7000, 13000 );
|
|
}
|
|
else if ( var_0 == "corner_grenade" )
|
|
{
|
|
wait 1.0;
|
|
|
|
if ( isdefined( level.player ) && distancesquared( self.origin, level.player.origin ) < 490000 )
|
|
{
|
|
anim.numdeathsuntilcornergrenadedeath = randomintrange( 10, 30 );
|
|
anim.nextcornergrenadedeathtime = gettime() + randomintrange( 15000, 60000 );
|
|
}
|
|
else
|
|
{
|
|
anim.numdeathsuntilcornergrenadedeath = randomintrange( 5, 12 );
|
|
anim.nextcornergrenadedeathtime = gettime() + randomintrange( 5000, 25000 );
|
|
}
|
|
}
|
|
}
|
|
|
|
decidenumcrawls()
|
|
{
|
|
if ( isdefined( self.a.force_num_crawls ) )
|
|
self.a.numcrawls = self.a.force_num_crawls;
|
|
else
|
|
self.a.numcrawls = randomintrange( 1, 5 );
|
|
}
|
|
|
|
shouldkeepcrawling()
|
|
{
|
|
if ( !self.a.numcrawls )
|
|
{
|
|
self.a.numcrawls = undefined;
|
|
return 0;
|
|
}
|
|
|
|
self.a.numcrawls--;
|
|
return 1;
|
|
}
|
|
|
|
trycornerrightgrenadedeath()
|
|
{
|
|
if ( anim.numdeathsuntilcornergrenadedeath > 0 )
|
|
return 0;
|
|
|
|
if ( gettime() < anim.nextcornergrenadedeathtime )
|
|
return 0;
|
|
|
|
if ( self.a.disablelongdeath || self.diequietly || self.damageshield )
|
|
return 0;
|
|
|
|
if ( isdefined( self.deathfunction ) )
|
|
return 0;
|
|
|
|
if ( distance( self.origin, level.player.origin ) < 175 )
|
|
return 0;
|
|
|
|
anim.nextcornergrenadedeathtime = gettime() + 3000;
|
|
thread cornerrightgrenadedeath();
|
|
self waittill( "killanimscript" );
|
|
return 1;
|
|
}
|
|
|
|
cornerrightgrenadedeath()
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
thread paindeathnotify();
|
|
thread preventpainforashorttime( "corner_grenade" );
|
|
thread maps\_utility::set_battlechatter( 0 );
|
|
self.threatbias = -1000;
|
|
pain_setflaggedanimknoballrestart( "corner_grenade_pain", animscripts\utility::lookupanim( "corner_grenade_death", "pain" ), %body, 1, 0.1 );
|
|
self waittillmatch( "corner_grenade_pain", "dropgun" );
|
|
animscripts\shared::dropallaiweapons();
|
|
self waittillmatch( "corner_grenade_pain", "anim_pose = \"back\"" );
|
|
animscripts\notetracks::notetrackposeback();
|
|
self waittillmatch( "corner_grenade_pain", "grenade_left" );
|
|
var_0 = getweaponmodel( "fraggrenade" );
|
|
self attach( var_0, "tag_inhand" );
|
|
self.deathfunction = ::prematurecornergrenadedeath;
|
|
self waittillmatch( "corner_grenade_pain", "end" );
|
|
var_1 = gettime() + randomintrange( 25000, 60000 );
|
|
pain_setflaggedanimknoballrestart( "corner_grenade_idle", animscripts\utility::lookupanim( "corner_grenade_death", "pain" ), %body, 1, 0.2 );
|
|
thread watchenemyvelocity();
|
|
|
|
while ( !enemyisapproaching() )
|
|
{
|
|
if ( gettime() >= var_1 )
|
|
break;
|
|
|
|
animscripts\notetracks::donotetracksfortime( 0.1, "corner_grenade_idle" );
|
|
}
|
|
|
|
var_2 = animscripts\utility::lookupanim( "corner_grenade_death", "release" );
|
|
pain_setflaggedanimknoballrestart( "corner_grenade_release", var_2, %body, 1, 0.2 );
|
|
var_3 = getnotetracktimes( var_2, "grenade_drop" );
|
|
var_4 = var_3[0] * getanimlength( var_2 );
|
|
wait( var_4 - 1.0 );
|
|
animscripts\death::playdeathsound();
|
|
wait 0.7;
|
|
self.deathfunction = ::waittillgrenadedrops;
|
|
var_5 = ( 0, 0, 30 ) - anglestoright( self.angles ) * 70;
|
|
cornerdeathreleasegrenade( var_5, randomfloatrange( 2.0, 3.0 ) );
|
|
wait 0.05;
|
|
self detach( var_0, "tag_inhand" );
|
|
thread killself();
|
|
}
|
|
|
|
cornerdeathreleasegrenade( var_0, var_1 )
|
|
{
|
|
var_2 = self gettagorigin( "tag_inhand" );
|
|
var_3 = var_2 + ( 0, 0, 20 );
|
|
var_4 = var_2 - ( 0, 0, 20 );
|
|
var_5 = bullettrace( var_3, var_4, 0, undefined );
|
|
|
|
if ( var_5["fraction"] < 0.5 )
|
|
var_2 = var_5["position"];
|
|
|
|
var_6 = "default";
|
|
|
|
if ( var_5["surfacetype"] != "none" )
|
|
var_6 = var_5["surfacetype"];
|
|
|
|
thread playsoundatpoint( "grenade_bounce_" + var_6, var_2 );
|
|
self.grenadeweapon = "fraggrenade";
|
|
self magicgrenademanual( var_2, var_0, var_1 );
|
|
}
|
|
|
|
playsoundatpoint( var_0, var_1 )
|
|
{
|
|
var_2 = spawn( "script_origin", var_1 );
|
|
var_2 playsound( var_0, "sounddone" );
|
|
var_2 waittill( "sounddone" );
|
|
var_2 delete();
|
|
}
|
|
|
|
killself()
|
|
{
|
|
self.a.nodeath = 1;
|
|
killwrapper();
|
|
self startragdoll();
|
|
wait 0.1;
|
|
self notify( "grenade_drop_done" );
|
|
}
|
|
|
|
killwrapper()
|
|
{
|
|
if ( isdefined( self.last_dmg_player ) )
|
|
self kill( self.origin, self.last_dmg_player );
|
|
else
|
|
self kill();
|
|
}
|
|
|
|
enemyisapproaching()
|
|
{
|
|
if ( !isdefined( self.enemy ) )
|
|
return 0;
|
|
|
|
if ( distancesquared( self.origin, self.enemy.origin ) > 147456 )
|
|
return 0;
|
|
|
|
if ( distancesquared( self.origin, self.enemy.origin ) < 16384 )
|
|
return 1;
|
|
|
|
var_0 = self.enemy.origin + self.enemyvelocity * 3.0;
|
|
var_1 = self.enemy.origin;
|
|
|
|
if ( self.enemy.origin != var_0 )
|
|
var_1 = pointonsegmentnearesttopoint( self.enemy.origin, var_0, self.origin );
|
|
|
|
if ( distancesquared( self.origin, var_1 ) < 16384 )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
prematurecornergrenadedeath()
|
|
{
|
|
var_0 = animscripts\utility::lookupanim( "corner_grenade_death", "premature_death" );
|
|
var_1 = var_0[randomint( var_0.size )];
|
|
animscripts\death::playdeathsound();
|
|
pain_setflaggedanimknoballrestart( "corner_grenade_die", var_1, %body, 1, 0.2 );
|
|
var_2 = animscripts\combat_utility::getgrenadedropvelocity();
|
|
cornerdeathreleasegrenade( var_2, 3.0 );
|
|
var_3 = getweaponmodel( "fraggrenade" );
|
|
self detach( var_3, "tag_inhand" );
|
|
wait 0.05;
|
|
self startragdoll();
|
|
self waittillmatch( "corner_grenade_die", "end" );
|
|
}
|
|
|
|
waittillgrenadedrops()
|
|
{
|
|
self waittill( "grenade_drop_done" );
|
|
}
|
|
|
|
watchenemyvelocity()
|
|
{
|
|
self endon( "kill_long_death" );
|
|
self endon( "death" );
|
|
self.enemyvelocity = ( 0, 0, 0 );
|
|
var_0 = undefined;
|
|
var_1 = self.origin;
|
|
var_2 = 0.15;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( self.enemy ) && isdefined( var_0 ) && self.enemy == var_0 )
|
|
{
|
|
var_3 = self.enemy.origin;
|
|
self.enemyvelocity = ( var_3 - var_1 ) * ( 1 / var_2 );
|
|
var_1 = var_3;
|
|
}
|
|
else
|
|
{
|
|
if ( isdefined( self.enemy ) )
|
|
var_1 = self.enemy.origin;
|
|
else
|
|
var_1 = self.origin;
|
|
|
|
var_0 = self.enemy;
|
|
self.shootentvelocity = ( 0, 0, 0 );
|
|
}
|
|
|
|
wait( var_2 );
|
|
}
|
|
}
|
|
|
|
additive_pain( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( self.doingadditivepain ) )
|
|
return;
|
|
|
|
if ( var_0 < self.minpaindamage )
|
|
return;
|
|
|
|
self.doingadditivepain = 1;
|
|
var_7 = undefined;
|
|
|
|
if ( animscripts\utility::damagelocationisany( "left_arm_lower", "left_arm_upper", "left_hand" ) )
|
|
var_7 = animscripts\utility::lookupanim( "additive_pain", "left_arm" );
|
|
|
|
if ( animscripts\utility::damagelocationisany( "right_arm_lower", "right_arm_upper", "right_hand" ) )
|
|
var_7 = animscripts\utility::lookupanim( "additive_pain", "right_arm" );
|
|
else if ( animscripts\utility::damagelocationisany( "left_leg_upper", "left_leg_lower", "left_foot" ) )
|
|
var_7 = animscripts\utility::lookupanim( "additive_pain", "left_leg" );
|
|
else if ( animscripts\utility::damagelocationisany( "right_leg_upper", "right_leg_lower", "right_foot" ) )
|
|
var_7 = animscripts\utility::lookupanim( "additive_pain", "right_leg" );
|
|
else
|
|
{
|
|
var_8 = animscripts\utility::lookupanim( "additive_pain", "default" );
|
|
var_7 = var_8[randomint( var_8.size )];
|
|
}
|
|
|
|
self setanimlimited( %add_pain, 1, 0.1, 1 );
|
|
self setanimlimited( var_7, 1, 0, 1 );
|
|
wait 0.4;
|
|
self clearanim( var_7, 0.2 );
|
|
self clearanim( %add_pain, 0.2 );
|
|
self.doingadditivepain = undefined;
|
|
}
|
|
|
|
pain_setflaggedanimknob( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 1;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 0.2;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 1;
|
|
|
|
self setflaggedanimknob( var_0, var_1, var_2, var_3, var_4 );
|
|
self.facialanimidx = animscripts\face::playfacialanim( var_1, "pain", self.facialanimidx );
|
|
}
|
|
|
|
pain_setflaggedanimknobrestart( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 1;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 0.2;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 1;
|
|
|
|
self setflaggedanimknobrestart( var_0, var_1, var_2, var_3, var_4 );
|
|
self.facialanimidx = animscripts\face::playfacialanim( var_1, "pain", self.facialanimidx );
|
|
}
|
|
|
|
pain_setflaggedanimknoballrestart( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 1;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 0.2;
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
var_5 = 1;
|
|
|
|
self setflaggedanimknoballrestart( var_0, var_1, var_2, var_3, var_4, var_5 );
|
|
self.facialanimidx = animscripts\face::playfacialanim( var_1, "pain", self.facialanimidx );
|
|
}
|