This commit is contained in:
2024-02-13 13:20:49 +01:00
commit 872504afef
1761 changed files with 871764 additions and 0 deletions

117
animscripts/animmode.gsc Normal file
View File

@ -0,0 +1,117 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "death" );
self endon( "stop_animmode" );
self notify( "killanimscript" );
self._tag_entity endon( self._anime );
if ( isdefined( self._custom_anim_thread ) )
{
self thread [[ self._custom_anim_thread ]]();
self._custom_anim_thread = undefined;
}
var_0 = isdefined( self._custom_anim_loop ) && self._custom_anim_loop;
if ( var_0 )
{
self endon( "stop_loop" );
self._custom_anim_loop = undefined;
}
else
thread notify_on_end( self._anime );
var_1 = self._anime;
self._anime = undefined;
var_2 = 0;
if ( var_0 )
{
var_2 = level.scr_anim[self._animname][var_1].size;
var_3 = level.scr_anim[self._animname][var_1][randomint( var_2 )];
}
else
var_3 = level.scr_anim[self._animname][var_1];
var_4 = getstartorigin( self._tag_entity.origin, self._tag_entity.angles, var_3 );
var_5 = getstartangles( self._tag_entity.origin, self._tag_entity.angles, var_3 );
var_6 = self getdroptofloorposition( var_4 );
if ( isdefined( var_6 ) )
var_4 = var_6;
else
{
}
if ( !isdefined( self.noteleport ) )
self teleport( var_4, var_5 );
self.pushable = 0;
var_7 = 0.3;
var_8 = 0.2;
if ( isdefined( self.anim_blend_time_override ) )
{
var_7 = self.anim_blend_time_override;
var_8 = self.anim_blend_time_override;
}
self animmode( self._animmode );
self clearanim( self.root_anim, var_7 );
self orientmode( "face angle", var_5[1] );
var_9 = "custom_animmode";
self setflaggedanimrestart( var_9, var_3, 1, var_8, 1 );
self._tag_entity thread maps\_anim::start_notetrack_wait( self, var_9, var_1, self._animname );
self._tag_entity thread maps\_anim::animscriptdonotetracksthread( self, var_9, var_1 );
var_10 = self._tag_entity;
self._tag_entity = undefined;
self._animmode = undefined;
self endon( "killanimscript" );
var_11 = "end";
if ( !var_0 )
{
if ( animhasnotetrack( var_3, "finish" ) )
var_11 = "finish";
else if ( animhasnotetrack( var_3, "stop anim" ) )
var_11 = "stop anim";
}
for (;;)
{
self waittillmatch( var_9, var_11 );
if ( var_0 )
{
var_3 = level.scr_anim[self._animname][var_1][randomint( var_2 )];
self setflaggedanimknoblimitedrestart( var_9, var_3, 1, 0.2, 1 );
if ( isdefined( var_10 ) )
{
var_10 thread maps\_anim::start_notetrack_wait( self, var_9, var_1, self._animname );
var_10 thread maps\_anim::animscriptdonotetracksthread( self, var_9, var_1 );
}
continue;
}
break;
}
if ( var_11 != "end" )
self orientmode( "face motion" );
self notify( "finished_custom_animmode" + var_1 );
}
notify_on_end( var_0 )
{
self endon( "death" );
self endon( "finished_custom_animmode" + var_0 );
self waittill( "killanimscript" );
self notify( "finished_custom_animmode" + var_0 );
}

714
animscripts/animset.gsc Normal file
View File

@ -0,0 +1,714 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_anim_sets()
{
if ( isdefined( anim.archetypes ) )
return;
anim.archetypes = [];
anim.archetypes["soldier"] = [];
animscripts\cover_left::init_animset_cover_left();
animscripts\cover_right::init_animset_cover_right();
animscripts\cover_prone::init_animset_cover_prone();
animscripts\cover_multi::init_animset_cover_multi();
animscripts\cover_wall::init_animset_cover_wall();
animscripts\reactions::init_animset_reactions();
animscripts\pain::init_animset_pain();
animscripts\death::init_animset_death();
animscripts\combat::init_animset_combat();
animscripts\move::init_animset_move();
animscripts\flashed::init_animset_flashed();
animscripts\stop::init_animset_idle();
animscripts\melee::init_animset_melee();
anim.animsets = spawnstruct();
anim.animsets.move = [];
init_animset_default_stand();
init_animset_cqb_stand();
init_animset_pistol_stand();
init_animset_rpg_stand();
init_animset_shotgun_stand();
init_animset_heat_stand();
init_animset_default_crouch();
init_animset_rpg_crouch();
init_animset_shotgun_crouch();
init_animset_default_prone();
init_animset_run_move();
init_animset_walk_move();
init_animset_cqb_move();
init_animset_heat_run_move();
init_moving_turn_animations();
init_exposed_turn_animations();
init_animset_heat_reload();
init_grenade_animations();
init_animset_run_n_gun();
init_animset_ambush();
}
registerarchetype( var_0, var_1, var_2 )
{
init_anim_sets();
anim.archetypes[var_0] = var_1;
if ( isdefined( var_1["flashed"] ) )
anim.flashanimindex[var_0] = 0;
if ( isdefined( var_2 ) && var_2 )
animscripts\init_move_transitions::getsplittimes( var_0 );
}
archetypeexists( var_0 )
{
return isdefined( anim.archetypes[var_0] );
}
#using_animtree("generic_human");
init_animset_run_move()
{
anim.initanimset = [];
anim.initanimset["sprint"] = %sprint_loop_distant;
anim.initanimset["sprint_short"] = %sprint1_loop;
anim.initanimset["prone"] = %prone_crawl;
anim.initanimset["straight"] = %run_lowready_f;
anim.initanimset["straight_twitch"] = [ %run_twitch_guncheck, %run_twitch_aim_straight, %run_twitch_aim_above, %run_twitch_lookbehind_a, %run_twitch_lookbehind_b ];
anim.initanimset["move_f"] = %walk_forward;
anim.initanimset["move_l"] = %walk_left;
anim.initanimset["move_r"] = %walk_right;
anim.initanimset["move_b"] = %walk_backward;
anim.initanimset["crouch"] = %crouch_fastwalk_f;
anim.initanimset["crouch_l"] = %crouch_fastwalk_l;
anim.initanimset["crouch_r"] = %crouch_fastwalk_r;
anim.initanimset["crouch_b"] = %crouch_fastwalk_b;
anim.initanimset["stairs_up"] = %run_stairs_up;
anim.initanimset["stairs_up_in"] = %run_stairs_up_in;
anim.initanimset["stairs_up_out"] = %run_stairs_up_out;
anim.initanimset["stairs_down"] = %traverse_stair_run_down;
anim.initanimset["reload"] = [ %run_reload_a, %run_reload_b ];
anim.archetypes["soldier"]["run"] = anim.initanimset;
}
init_animset_heat_run_move()
{
anim.initanimset = anim.archetypes["soldier"]["run"];
anim.initanimset["straight"] = %heat_run_loop;
anim.archetypes["soldier"]["heat_run"] = anim.initanimset;
}
init_animset_walk_move()
{
anim.initanimset = [];
anim.initanimset["sprint"] = %sprint_loop_distant;
anim.initanimset["sprint_short"] = %sprint1_loop;
anim.initanimset["prone"] = %prone_crawl;
anim.initanimset["straight"] = %cqb_walk_iw6;
anim.initanimset["move_f"] = %cqb_walk_iw6;
anim.initanimset["move_l"] = %walk_left;
anim.initanimset["move_r"] = %walk_right;
anim.initanimset["move_b"] = %walk_backward;
anim.initanimset["crouch"] = %crouch_fastwalk_f;
anim.initanimset["crouch_l"] = %crouch_fastwalk_l;
anim.initanimset["crouch_r"] = %crouch_fastwalk_r;
anim.initanimset["crouch_b"] = %crouch_fastwalk_b;
anim.initanimset["aim_2"] = %walk_aim_2;
anim.initanimset["aim_4"] = %walk_aim_4;
anim.initanimset["aim_6"] = %walk_aim_6;
anim.initanimset["aim_8"] = %walk_aim_8;
anim.initanimset["stairs_up"] = %traverse_stair_run;
anim.initanimset["stairs_down"] = %traverse_stair_run_down_01;
anim.archetypes["soldier"]["walk"] = anim.initanimset;
}
init_animset_cqb_move()
{
anim.initanimset = [];
anim.initanimset["sprint"] = %sprint_loop_distant;
anim.initanimset["sprint_short"] = %sprint1_loop;
anim.initanimset["straight"] = %run_cqb_f_search_v1;
anim.initanimset["straight_twitch"] = [ %cqb_run_twitch_a_iw6, %cqb_run_twitch_b_iw6, %cqb_run_twitch_c_iw6, %cqb_run_twitch_d_iw6 ];
anim.initanimset["move_f"] = %cqb_walk_iw6;
anim.initanimset["move_l"] = %walk_left;
anim.initanimset["move_r"] = %walk_right;
anim.initanimset["move_b"] = %walk_backward;
anim.initanimset["aim_2"] = %cqb_run_aim_2;
anim.initanimset["aim_4"] = %cqb_run_aim_4;
anim.initanimset["aim_5"] = %cqb_run_aim_5;
anim.initanimset["aim_6"] = %cqb_run_aim_6;
anim.initanimset["aim_8"] = %cqb_run_aim_8;
anim.initanimset["stairs_up"] = %traverse_stair_run;
anim.initanimset["stairs_down_in"] = %cqb_stairs_down_in_m;
anim.initanimset["stairs_down"] = %cqb_stairs_down;
anim.initanimset["stairs_down_out"] = %cqb_stairs_down_out_m;
anim.initanimset["shotgun_pullout"] = %shotgun_cqbrun_pullout;
anim.initanimset["shotgun_putaway"] = %shotgun_cqbrun_putaway;
anim.initanimset["reload"] = [ %cqb_run_reload_a_iw6, %cqb_run_reload_b_iw6 ];
anim.archetypes["soldier"]["cqb"] = anim.initanimset;
}
init_animset_pistol_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %pistol_stand_aim_8_add;
anim.initanimset["add_aim_down"] = %pistol_stand_aim_2_add;
anim.initanimset["add_aim_left"] = %pistol_stand_aim_4_add;
anim.initanimset["add_aim_right"] = %pistol_stand_aim_6_add;
anim.initanimset["straight_level"] = %pistol_stand_aim_5;
anim.initanimset["fire"] = %pistol_stand_fire_a;
anim.initanimset["single"] = animscripts\utility::array( %pistol_stand_fire_a );
anim.initanimset["reload"] = animscripts\utility::array( %pistol_stand_reload_a );
anim.initanimset["reload_crouchhide"] = [];
anim.initanimset["exposed_idle"] = [ %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 ];
set_animarray_standing_turns_pistol();
anim.initanimset["add_turn_aim_up"] = %pistol_stand_aim_8_alt;
anim.initanimset["add_turn_aim_down"] = %pistol_stand_aim_2_alt;
anim.initanimset["add_turn_aim_left"] = %pistol_stand_aim_4_alt;
anim.initanimset["add_turn_aim_right"] = %pistol_stand_aim_6_alt;
anim.archetypes["soldier"]["pistol_stand"] = anim.initanimset;
}
init_animset_rpg_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %rpg_stand_aim_8;
anim.initanimset["add_aim_down"] = %rpg_stand_aim_2;
anim.initanimset["add_aim_left"] = %rpg_stand_aim_4;
anim.initanimset["add_aim_right"] = %rpg_stand_aim_6;
anim.initanimset["straight_level"] = %rpg_stand_aim_5;
anim.initanimset["fire"] = %rpg_stand_fire;
anim.initanimset["single"] = [ %exposed_shoot_semi1 ];
anim.initanimset["reload"] = [ %rpg_stand_reload ];
anim.initanimset["reload_crouchhide"] = [];
anim.initanimset["exposed_idle"] = [ %rpg_stand_idle ];
set_animarray_stance_change();
set_animarray_standing_turns();
set_animarray_add_turn_aims_stand();
anim.archetypes["soldier"]["rpg_stand"] = anim.initanimset;
}
init_animset_shotgun_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %shotgun_aim_8;
anim.initanimset["add_aim_down"] = %shotgun_aim_2;
anim.initanimset["add_aim_left"] = %shotgun_aim_4;
anim.initanimset["add_aim_right"] = %shotgun_aim_6;
anim.initanimset["straight_level"] = %shotgun_aim_5;
anim.initanimset["fire"] = %exposed_shoot_auto_v3;
anim.initanimset["single"] = [ %shotgun_stand_fire_1a, %shotgun_stand_fire_1b ];
set_animarray_burst_and_semi_fire_stand();
anim.initanimset["exposed_idle"] = [ %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 ];
anim.initanimset["reload"] = [ %shotgun_stand_reload_a, %shotgun_stand_reload_b, %shotgun_stand_reload_c, %shotgun_stand_reload_c, %shotgun_stand_reload_c ];
anim.initanimset["reload_crouchhide"] = [ %shotgun_stand_reload_a, %shotgun_stand_reload_b ];
set_animarray_stance_change();
set_animarray_standing_turns();
set_animarray_add_turn_aims_stand();
anim.archetypes["soldier"]["shotgun_stand"] = anim.initanimset;
}
init_animset_cqb_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %cqb_stand_aim8;
anim.initanimset["add_aim_down"] = %cqb_stand_aim2;
anim.initanimset["add_aim_left"] = %cqb_stand_aim4;
anim.initanimset["add_aim_right"] = %cqb_stand_aim6;
anim.initanimset["straight_level"] = %cqb_stand_aim5;
anim.initanimset["fire"] = %exposed_shoot_auto_v3;
anim.initanimset["single"] = [ %exposed_shoot_semi1 ];
set_animarray_burst_and_semi_fire_stand();
anim.initanimset["exposed_idle"] = [ %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 ];
anim.initanimset["reload"] = [ %cqb_stand_reload_steady ];
anim.initanimset["reload_crouchhide"] = [ %cqb_stand_reload_knee ];
set_animarray_stance_change();
set_animarray_standing_turns();
set_animarray_add_turn_aims_stand();
anim.archetypes["soldier"]["cqb_stand"] = anim.initanimset;
}
init_animset_heat_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %heat_stand_aim_8;
anim.initanimset["add_aim_down"] = %heat_stand_aim_2;
anim.initanimset["add_aim_left"] = %heat_stand_aim_4;
anim.initanimset["add_aim_right"] = %heat_stand_aim_6;
anim.initanimset["straight_level"] = %heat_stand_aim_5;
anim.initanimset["fire"] = %heat_stand_fire_auto;
anim.initanimset["single"] = animscripts\utility::array( %heat_stand_fire_single );
set_animarray_custom_burst_and_semi_fire_stand( %heat_stand_fire_burst );
anim.initanimset["exposed_idle"] = animscripts\utility::array( %heat_stand_idle, %heat_stand_scana, %heat_stand_scanb );
anim.initanimset["reload"] = animscripts\utility::array( %heat_exposed_reload );
anim.initanimset["reload_crouchhide"] = animscripts\utility::array();
set_animarray_stance_change();
anim.initanimset["turn_left_45"] = %heat_stand_turn_l;
anim.initanimset["turn_left_90"] = %heat_stand_turn_l;
anim.initanimset["turn_left_135"] = %heat_stand_turn_180;
anim.initanimset["turn_left_180"] = %heat_stand_turn_180;
anim.initanimset["turn_right_45"] = %heat_stand_turn_r;
anim.initanimset["turn_right_90"] = %heat_stand_turn_r;
anim.initanimset["turn_right_135"] = %heat_stand_turn_180;
anim.initanimset["turn_right_180"] = %heat_stand_turn_180;
set_animarray_add_turn_aims_stand();
anim.archetypes["soldier"]["heat_stand"] = anim.initanimset;
}
init_animset_heat_reload()
{
anim.initanimset = [];
anim.initanimset["reload_cover_left"] = %heat_cover_reload_r;
anim.initanimset["reload_cover_right"] = %heat_cover_reload_l;
anim.initanimset["reload_default"] = %heat_cover_reload_l;
anim.archetypes["soldier"]["heat_reload"] = anim.initanimset;
}
init_animset_default_stand()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %exposed_aim_8;
anim.initanimset["add_aim_down"] = %exposed_aim_2;
anim.initanimset["add_aim_left"] = %exposed_aim_4;
anim.initanimset["add_aim_right"] = %exposed_aim_6;
anim.initanimset["straight_level"] = %exposed_aim_5;
anim.initanimset["fire"] = %exposed_shoot_auto_v3;
anim.initanimset["fire_corner"] = %exposed_shoot_auto_v2;
anim.initanimset["single"] = animscripts\utility::array( %exposed_shoot_semi1 );
set_animarray_burst_and_semi_fire_stand();
anim.initanimset["exposed_idle"] = animscripts\utility::array( %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 );
anim.initanimset["exposed_grenade"] = animscripts\utility::array( %exposed_grenadethrowb, %exposed_grenadethrowc );
anim.initanimset["reload"] = animscripts\utility::array( %exposed_reload );
anim.initanimset["reload_crouchhide"] = animscripts\utility::array( %exposed_reloadb );
set_animarray_stance_change();
set_animarray_standing_turns();
set_animarray_add_turn_aims_stand();
anim.archetypes["soldier"]["default_stand"] = anim.initanimset;
}
init_animset_default_crouch()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %exposed_crouch_aim_8;
anim.initanimset["add_aim_down"] = %exposed_crouch_aim_2;
anim.initanimset["add_aim_left"] = %exposed_crouch_aim_4;
anim.initanimset["add_aim_right"] = %exposed_crouch_aim_6;
anim.initanimset["straight_level"] = %exposed_crouch_aim_5;
anim.initanimset["fire"] = %exposed_crouch_shoot_auto_v2;
anim.initanimset["single"] = animscripts\utility::array( %exposed_crouch_shoot_semi1 );
set_animarray_burst_and_semi_fire_crouch();
anim.initanimset["reload"] = animscripts\utility::array( %exposed_crouch_reload );
anim.initanimset["exposed_idle"] = animscripts\utility::array( %exposed_crouch_idle_alert_v1, %exposed_crouch_idle_alert_v2, %exposed_crouch_idle_alert_v3 );
set_animarray_stance_change();
set_animarray_crouching_turns();
set_animarray_add_turn_aims_crouch();
anim.archetypes["soldier"]["default_crouch"] = anim.initanimset;
}
init_animset_rpg_crouch()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %rpg_crouch_aim_8;
anim.initanimset["add_aim_down"] = %rpg_crouch_aim_2;
anim.initanimset["add_aim_left"] = %rpg_crouch_aim_4;
anim.initanimset["add_aim_right"] = %rpg_crouch_aim_6;
anim.initanimset["straight_level"] = %rpg_crouch_aim_5;
anim.initanimset["fire"] = %rpg_crouch_fire;
anim.initanimset["single"] = [ %rpg_crouch_fire ];
anim.initanimset["reload"] = [ %rpg_crouch_reload ];
anim.initanimset["exposed_idle"] = [ %rpg_crouch_idle ];
set_animarray_stance_change();
set_animarray_crouching_turns();
set_animarray_add_turn_aims_crouch();
anim.archetypes["soldier"]["rpg_crouch"] = anim.initanimset;
}
init_animset_shotgun_crouch()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %exposed_crouch_aim_8;
anim.initanimset["add_aim_down"] = %exposed_crouch_aim_2;
anim.initanimset["add_aim_left"] = %exposed_crouch_aim_4;
anim.initanimset["add_aim_right"] = %exposed_crouch_aim_6;
anim.initanimset["straight_level"] = %exposed_crouch_aim_5;
anim.initanimset["fire"] = %exposed_crouch_shoot_auto_v2;
anim.initanimset["single"] = [ %shotgun_crouch_fire ];
set_animarray_burst_and_semi_fire_crouch();
anim.initanimset["reload"] = [ %shotgun_crouch_reload ];
anim.initanimset["exposed_idle"] = [ %exposed_crouch_idle_alert_v1, %exposed_crouch_idle_alert_v2, %exposed_crouch_idle_alert_v3 ];
set_animarray_stance_change();
set_animarray_crouching_turns();
set_animarray_add_turn_aims_crouch();
anim.archetypes["soldier"]["shotgun_crouch"] = anim.initanimset;
}
init_animset_default_prone()
{
anim.initanimset = [];
anim.initanimset["add_aim_up"] = %prone_aim_8_add;
anim.initanimset["add_aim_down"] = %prone_aim_2_add;
anim.initanimset["add_aim_left"] = %prone_aim_4_add;
anim.initanimset["add_aim_right"] = %prone_aim_6_add;
anim.initanimset["straight_level"] = %prone_aim_5;
anim.initanimset["fire"] = %prone_fire_1;
anim.initanimset["single"] = [ %prone_fire_1 ];
anim.initanimset["reload"] = [ %prone_reload ];
anim.initanimset["burst2"] = %prone_fire_burst;
anim.initanimset["burst3"] = %prone_fire_burst;
anim.initanimset["burst4"] = %prone_fire_burst;
anim.initanimset["burst5"] = %prone_fire_burst;
anim.initanimset["burst6"] = %prone_fire_burst;
anim.initanimset["semi2"] = %prone_fire_burst;
anim.initanimset["semi3"] = %prone_fire_burst;
anim.initanimset["semi4"] = %prone_fire_burst;
anim.initanimset["semi5"] = %prone_fire_burst;
anim.initanimset["exposed_idle"] = [ %exposed_crouch_idle_alert_v1, %exposed_crouch_idle_alert_v2, %exposed_crouch_idle_alert_v3 ];
set_animarray_stance_change();
anim.archetypes["soldier"]["default_prone"] = anim.initanimset;
}
init_animset_complete_custom_stand( var_0 )
{
self.combatstandanims = var_0;
}
init_animset_custom_stand( var_0, var_1, var_2, var_3 )
{
anim.initanimset = animscripts\utility::lookupanimarray( "default_stand" );
if ( isdefined( var_1 ) )
anim.initanimset["straight_level"] = var_1;
if ( isdefined( var_0 ) )
{
anim.initanimset["fire"] = var_0;
anim.initanimset["single"] = animscripts\utility::array( var_0 );
set_animarray_custom_burst_and_semi_fire_stand( var_0 );
}
if ( isdefined( var_2 ) )
anim.initanimset["exposed_idle"] = animscripts\utility::array( var_2 );
if ( isdefined( var_3 ) )
{
anim.initanimset["reload"] = animscripts\utility::array( var_3 );
anim.initanimset["reload_crouchhide"] = animscripts\utility::array( var_3 );
}
self.combatstandanims = anim.initanimset;
}
init_animset_complete_custom_crouch( var_0 )
{
self.combatcrouchanims = var_0;
}
init_animset_custom_crouch( var_0, var_1, var_2 )
{
anim.initanimset = animscripts\utility::lookupanimarray( "default_crouch" );
if ( isdefined( var_0 ) )
{
anim.initanimset["fire"] = var_0;
anim.initanimset["single"] = animscripts\utility::array( var_0 );
set_animarray_custom_burst_and_semi_fire_crouch( var_0 );
}
if ( isdefined( var_1 ) )
anim.initanimset["exposed_idle"] = animscripts\utility::array( var_1 );
if ( isdefined( var_2 ) )
anim.initanimset["reload"] = animscripts\utility::array( var_2 );
self.combatcrouchanims = anim.initanimset;
}
clear_custom_animset()
{
self.custommoveanimset = undefined;
self.customidleanimset = undefined;
self.combatstandanims = undefined;
self.combatcrouchanims = undefined;
}
set_animarray_standing_turns_pistol( var_0 )
{
anim.initanimset["turn_left_45"] = %pistol_stand_turn45l;
anim.initanimset["turn_left_90"] = %pistol_stand_turn90l;
anim.initanimset["turn_left_135"] = %pistol_stand_turn90l;
anim.initanimset["turn_left_180"] = %pistol_stand_turn180l;
anim.initanimset["turn_right_45"] = %pistol_stand_turn45r;
anim.initanimset["turn_right_90"] = %pistol_stand_turn90r;
anim.initanimset["turn_right_135"] = %pistol_stand_turn90r;
anim.initanimset["turn_right_180"] = %pistol_stand_turn180l;
}
set_animarray_standing_turns()
{
anim.initanimset["turn_left_45"] = %exposed_tracking_turn45l;
anim.initanimset["turn_left_90"] = %exposed_tracking_turn90l;
anim.initanimset["turn_left_135"] = %exposed_tracking_turn135l;
anim.initanimset["turn_left_180"] = %exposed_tracking_turn180l;
anim.initanimset["turn_right_45"] = %exposed_tracking_turn45r;
anim.initanimset["turn_right_90"] = %exposed_tracking_turn90r;
anim.initanimset["turn_right_135"] = %exposed_tracking_turn135r;
anim.initanimset["turn_right_180"] = %exposed_tracking_turn180r;
}
set_animarray_crouching_turns()
{
anim.initanimset["turn_left_45"] = %exposed_crouch_turn_90_left;
anim.initanimset["turn_left_90"] = %exposed_crouch_turn_90_left;
anim.initanimset["turn_left_135"] = %exposed_crouch_turn_180_left;
anim.initanimset["turn_left_180"] = %exposed_crouch_turn_180_left;
anim.initanimset["turn_right_45"] = %exposed_crouch_turn_90_right;
anim.initanimset["turn_right_90"] = %exposed_crouch_turn_90_right;
anim.initanimset["turn_right_135"] = %exposed_crouch_turn_180_right;
anim.initanimset["turn_right_180"] = %exposed_crouch_turn_180_right;
}
set_animarray_stance_change()
{
anim.initanimset["crouch_2_stand"] = %exposed_crouch_2_stand;
anim.initanimset["crouch_2_prone"] = %crouch_2_prone;
anim.initanimset["stand_2_crouch"] = %exposed_stand_2_crouch;
anim.initanimset["stand_2_prone"] = %stand_2_prone;
anim.initanimset["prone_2_crouch"] = %prone_2_crouch;
anim.initanimset["prone_2_stand"] = %prone_2_stand;
}
set_animarray_burst_and_semi_fire_stand()
{
anim.initanimset["burst2"] = %exposed_shoot_burst3;
anim.initanimset["burst3"] = %exposed_shoot_burst3;
anim.initanimset["burst4"] = %exposed_shoot_burst4;
anim.initanimset["burst5"] = %exposed_shoot_burst5;
anim.initanimset["burst6"] = %exposed_shoot_burst6;
anim.initanimset["semi2"] = %exposed_shoot_semi2;
anim.initanimset["semi3"] = %exposed_shoot_semi3;
anim.initanimset["semi4"] = %exposed_shoot_semi4;
anim.initanimset["semi5"] = %exposed_shoot_semi5;
}
set_animarray_custom_burst_and_semi_fire_stand( var_0 )
{
anim.initanimset["burst2"] = var_0;
anim.initanimset["burst3"] = var_0;
anim.initanimset["burst4"] = var_0;
anim.initanimset["burst5"] = var_0;
anim.initanimset["burst6"] = var_0;
anim.initanimset["semi2"] = var_0;
anim.initanimset["semi3"] = var_0;
anim.initanimset["semi4"] = var_0;
anim.initanimset["semi5"] = var_0;
}
set_animarray_burst_and_semi_fire_crouch()
{
anim.initanimset["burst2"] = %exposed_crouch_shoot_burst3;
anim.initanimset["burst3"] = %exposed_crouch_shoot_burst3;
anim.initanimset["burst4"] = %exposed_crouch_shoot_burst4;
anim.initanimset["burst5"] = %exposed_crouch_shoot_burst5;
anim.initanimset["burst6"] = %exposed_crouch_shoot_burst6;
anim.initanimset["semi2"] = %exposed_crouch_shoot_semi2;
anim.initanimset["semi3"] = %exposed_crouch_shoot_semi3;
anim.initanimset["semi4"] = %exposed_crouch_shoot_semi4;
anim.initanimset["semi5"] = %exposed_crouch_shoot_semi5;
}
set_animarray_custom_burst_and_semi_fire_crouch( var_0 )
{
anim.initanimset["burst2"] = var_0;
anim.initanimset["burst3"] = var_0;
anim.initanimset["burst4"] = var_0;
anim.initanimset["burst5"] = var_0;
anim.initanimset["burst6"] = var_0;
anim.initanimset["semi2"] = var_0;
anim.initanimset["semi3"] = var_0;
anim.initanimset["semi4"] = var_0;
anim.initanimset["semi5"] = var_0;
}
set_animarray_add_turn_aims_stand()
{
anim.initanimset["add_turn_aim_up"] = %exposed_turn_aim_8;
anim.initanimset["add_turn_aim_down"] = %exposed_turn_aim_2;
anim.initanimset["add_turn_aim_left"] = %exposed_turn_aim_4;
anim.initanimset["add_turn_aim_right"] = %exposed_turn_aim_6;
}
set_animarray_add_turn_aims_crouch()
{
anim.initanimset["add_turn_aim_up"] = %exposed_crouch_turn_aim_8;
anim.initanimset["add_turn_aim_down"] = %exposed_crouch_turn_aim_2;
anim.initanimset["add_turn_aim_left"] = %exposed_crouch_turn_aim_4;
anim.initanimset["add_turn_aim_right"] = %exposed_crouch_turn_aim_6;
}
set_animarray_standing()
{
if ( animscripts\utility::usingsidearm() )
self.a.array = animscripts\utility::lookupanimarray( "pistol_stand" );
else if ( isdefined( self.combatstandanims ) )
self.a.array = self.combatstandanims;
else if ( isdefined( self.heat ) )
self.a.array = animscripts\utility::lookupanimarray( "heat_stand" );
else if ( animscripts\utility::usingrocketlauncher() )
self.a.array = animscripts\utility::lookupanimarray( "rpg_stand" );
else if ( isdefined( self.weapon ) && animscripts\utility::weapon_pump_action_shotgun() )
self.a.array = animscripts\utility::lookupanimarray( "shotgun_stand" );
else if ( animscripts\utility::iscqbwalking() )
self.a.array = animscripts\utility::lookupanimarray( "cqb_stand" );
else
self.a.array = animscripts\utility::lookupanimarray( "default_stand" );
}
set_animarray_crouching()
{
if ( animscripts\utility::usingsidearm() )
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
if ( isdefined( self.combatcrouchanims ) )
self.a.array = self.combatcrouchanims;
else if ( animscripts\utility::usingrocketlauncher() )
self.a.array = animscripts\utility::lookupanimarray( "rpg_crouch" );
else if ( isdefined( self.weapon ) && animscripts\utility::weapon_pump_action_shotgun() )
self.a.array = animscripts\utility::lookupanimarray( "shotgun_crouch" );
else
self.a.array = animscripts\utility::lookupanimarray( "default_crouch" );
}
set_animarray_prone()
{
if ( animscripts\utility::usingsidearm() )
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
self.a.array = animscripts\utility::lookupanimarray( "default_prone" );
}
init_moving_turn_animations()
{
anim.initanimset = [];
anim.initanimset[0] = %run_turn_180;
anim.initanimset[1] = %run_turn_l135;
anim.initanimset[2] = %run_turn_l90;
anim.initanimset[3] = %run_turn_l45;
anim.initanimset[5] = %run_turn_r45;
anim.initanimset[6] = %run_turn_r90;
anim.initanimset[7] = %run_turn_r135;
anim.initanimset[8] = %run_turn_180;
anim.archetypes["soldier"]["run_turn"] = anim.initanimset;
anim.initanimset = [];
anim.initanimset[0] = %cqb_walk_turn_2;
anim.initanimset[1] = %cqb_walk_turn_1;
anim.initanimset[2] = %cqb_walk_turn_4;
anim.initanimset[3] = %cqb_walk_turn_7;
anim.initanimset[5] = %cqb_walk_turn_9;
anim.initanimset[6] = %cqb_walk_turn_6;
anim.initanimset[7] = %cqb_walk_turn_3;
anim.initanimset[8] = %cqb_walk_turn_2;
anim.archetypes["soldier"]["cqb_turn"] = anim.initanimset;
anim.initanimset = [];
anim.initanimset[0] = %cqb_run_turn_180_iw6;
anim.initanimset[1] = %cqb_run_turn_l135_iw6;
anim.initanimset[2] = %cqb_run_turn_l90_iw6;
anim.initanimset[3] = %cqb_run_turn_l45_iw6;
anim.initanimset[5] = %cqb_run_turn_r45_iw6;
anim.initanimset[6] = %cqb_run_turn_r90_iw6;
anim.initanimset[7] = %cqb_run_turn_r135_iw6;
anim.initanimset[8] = %cqb_run_turn_180_iw6;
anim.archetypes["soldier"]["cqb_run_turn"] = anim.initanimset;
}
init_exposed_turn_animations()
{
anim.initanimset = [];
anim.initanimset["turn_left_45"] = %exposed_tracking_turn45l;
anim.initanimset["turn_left_90"] = %exposed_tracking_turn90l;
anim.initanimset["turn_left_135"] = %exposed_tracking_turn135l;
anim.initanimset["turn_left_180"] = %exposed_tracking_turn180l;
anim.initanimset["turn_right_45"] = %exposed_tracking_turn45r;
anim.initanimset["turn_right_90"] = %exposed_tracking_turn90r;
anim.initanimset["turn_right_135"] = %exposed_tracking_turn135r;
anim.initanimset["turn_right_180"] = %exposed_tracking_turn180r;
anim.archetypes["soldier"]["exposed_turn"] = anim.initanimset;
anim.initanimset = [];
anim.initanimset["turn_left_45"] = %exposed_crouch_turn_90_left;
anim.initanimset["turn_left_90"] = %exposed_crouch_turn_90_left;
anim.initanimset["turn_left_135"] = %exposed_crouch_turn_180_left;
anim.initanimset["turn_left_180"] = %exposed_crouch_turn_180_left;
anim.initanimset["turn_right_45"] = %exposed_crouch_turn_90_right;
anim.initanimset["turn_right_90"] = %exposed_crouch_turn_90_right;
anim.initanimset["turn_right_135"] = %exposed_crouch_turn_180_right;
anim.initanimset["turn_right_180"] = %exposed_crouch_turn_180_right;
anim.archetypes["soldier"]["exposed_turn_crouch"] = anim.initanimset;
}
init_grenade_animations()
{
anim.initanimset = [];
anim.initanimset["cower_squat"] = %exposed_squat_down_grenade_f;
anim.initanimset["cower_squat_idle"] = %exposed_squat_idle_grenade_f;
anim.initanimset["cower_dive_back"] = %exposed_dive_grenade_b;
anim.initanimset["cower_dive_front"] = %exposed_dive_grenade_f;
anim.initanimset["return_throw_short"] = [ %grenade_return_running_throw_forward, %grenade_return_standing_throw_forward_1 ];
anim.initanimset["return_throw_long"] = [ %grenade_return_running_throw_forward, %grenade_return_standing_throw_overhand_forward ];
anim.initanimset["return_throw_default"] = [ %grenade_return_standing_throw_overhand_forward ];
anim.archetypes["soldier"]["grenade"] = anim.initanimset;
}
init_animset_run_n_gun()
{
anim.initanimset = [];
anim.initanimset["F"] = %run_n_gun_f;
anim.initanimset["L"] = %run_n_gun_l;
anim.initanimset["R"] = %run_n_gun_r;
anim.initanimset["LB"] = %run_n_gun_l_120;
anim.initanimset["RB"] = %run_n_gun_r_120;
anim.initanimset["move_back"] = %combatwalk_b;
anim.archetypes["soldier"]["run_n_gun"] = anim.initanimset;
}
setup_run_n_gun()
{
self.maxrunngunangle = 130;
self.runnguntransitionpoint = 0.461538;
self.runngunincrement = 0.3;
}
init_animset_ambush()
{
anim.initanimset = [];
anim.initanimset["move_l"] = %combatwalk_l;
anim.initanimset["move_r"] = %combatwalk_r;
anim.initanimset["move_b"] = %combatwalk_b;
anim.archetypes["soldier"]["ambush"] = anim.initanimset;
}
set_ambush_sidestep_anims()
{
self.a.moveanimset["move_l"] = animscripts\utility::lookupanim( "ambush", "move_l" );
self.a.moveanimset["move_r"] = animscripts\utility::lookupanim( "ambush", "move_r" );
self.a.moveanimset["move_b"] = animscripts\utility::lookupanim( "ambush", "move_b" );
}
heat_reload_anim()
{
if ( self.weapon != self.primaryweapon )
return animscripts\utility::animarraypickrandom( "reload" );
if ( isdefined( self.node ) )
{
if ( self nearclaimnodeandangle() )
{
var_0 = undefined;
if ( self.node.type == "Cover Left" )
var_0 = animscripts\utility::lookupanim( "heat_reload", "reload_cover_left" );
else if ( self.node.type == "Cover Right" )
var_0 = animscripts\utility::lookupanim( "heat_reload", "reload_cover_right" );
if ( isdefined( var_0 ) )
return var_0;
}
}
return animscripts\utility::lookupanim( "heat_reload", "reload_default" );
}

617
animscripts/atv.gsc Normal file
View File

@ -0,0 +1,617 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self.current_event = "none";
self.shoot_while_driving_thread = undefined;
atv_geton();
main_driver();
}
atv_geton()
{
self.grenadeawareness = 0;
self.a.pose = "crouch";
maps\_utility::disable_surprise();
self.allowpain = 0;
self.flashbangimmunity = 1;
self.getoffvehiclefunc = ::atv_getoff;
self.specialdeathfunc = ::atv_normal_death;
self.disablebulletwhizbyreaction = 1;
}
atv_getoff()
{
self.allowpain = 1;
self.flashbangimmunity = 0;
maps\_utility::gun_recall();
self.onatv = undefined;
self.custom_animscript["combat"] = undefined;
self.custom_animscript["stop"] = undefined;
self.getoffvehiclefunc = undefined;
self.specialdeathfunc = undefined;
self.a.specialshootbehavior = undefined;
self.disablebulletwhizbyreaction = undefined;
}
main_driver()
{
var_0 = self.ridingvehicle.driver_shooting || self.ridingvehicle.riders.size == 1;
atv_setanim_driver( var_0 );
if ( var_0 )
{
animscripts\shared::placeweaponon( self.primaryweapon, "left" );
self.rightaimlimit = 90;
self.leftaimlimit = -90;
animscripts\track::setanimaimweight( 1, 0.2 );
thread atv_trackshootentorpos_driver();
thread atv_loop_driver_shooting();
}
else
{
animscripts\shared::placeweaponon( self.primaryweapon, "none" );
thread atv_loop_driver();
}
atv_handle_events( "driver" );
}
#using_animtree("generic_human");
atv_loop_driver()
{
self endon( "death" );
self endon( "killanimscript" );
var_0 = "left2right";
var_1 = [];
var_1["left2right"] = getanimlength( animscripts\utility::animarray( "left2right" ) );
var_1["right2left"] = getanimlength( animscripts\utility::animarray( "right2left" ) );
self setanimknoball( %atv_turn, %body, 1, 0 );
self setanim( animscripts\utility::animarray( "drive" ), 1, 0 );
self setanimknob( animscripts\utility::animarray( var_0 ), 1, 0 );
self setanimtime( animscripts\utility::animarray( var_0 ), 0.5 );
for (;;)
{
if ( self.ridingvehicle.steering_enable )
{
var_2 = 0.5 * ( 1 + maps\_vehicle_code::update_steering( self.ridingvehicle ) );
var_3 = self getanimtime( animscripts\utility::animarray( var_0 ) );
if ( var_0 == "right2left" )
var_3 = 1 - var_3;
var_4 = 20 * abs( var_3 - var_2 );
if ( var_3 < var_2 )
{
var_0 = "left2right";
var_4 = var_4 * var_1["left2right"];
}
else
{
var_0 = "right2left";
var_4 = var_4 * var_1["right2left"];
var_3 = 1 - var_3;
}
}
else
{
var_0 = "left2right";
var_4 = 0;
var_3 = 0.5;
}
self setanimknoblimited( animscripts\utility::animarray( var_0 ), 1, 0.1, var_4 );
self setanimtime( animscripts\utility::animarray( var_0 ), var_3 );
wait 0.05;
}
}
atv_loop_driver_shooting()
{
self endon( "death" );
self endon( "killanimscript" );
var_0 = 0.05;
var_1 = 0;
self setanimknoball( %atv_aiming, %body, 1, 0 );
self setanimknob( animscripts\utility::animarray( "idle" ), 1, 0 );
for (;;)
{
if ( self.current_event != "none" )
{
self waittill( "atv_event_finished" );
continue;
}
var_2 = maps\_vehicle_code::update_steering( self.ridingvehicle );
var_3 = 1 - abs( var_2 );
var_4 = max( 0, 0 - var_2 );
var_5 = max( 0, var_2 );
self setanimlimited( animscripts\utility::animarray( "straight_level_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_right" ), var_5, var_0 );
if ( self.bulletsinclip <= 0 )
{
animscripts\weaponlist::refillclip();
var_1 = gettime() + 3000;
}
if ( var_1 <= gettime() )
atv_start_shooting();
self setanimknoblimited( animscripts\utility::animarray( "add_aim_left_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_left_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_left_right" ), var_5, var_0 );
self setanimknoblimited( animscripts\utility::animarray( "add_aim_right_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_right_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_right_right" ), var_5, var_0 );
thread atv_stop_shooting();
wait 0.05;
}
}
atv_do_event( var_0 )
{
self endon( "death" );
self.ridingvehicle.steering_enable = 0;
self setflaggedanimknoblimitedrestart( "atv_event", var_0, 1, 0.17 );
animscripts\shared::donotetracks( "atv_event", ::atv_waitfor_start_lean );
self setanimknoblimited( animscripts\utility::animarray( "event_restore" ), 1, 0.1 );
self.ridingvehicle.steering_enable = 1;
self.current_event = "none";
self notify( "atv_event_finished" );
}
atv_handle_events( var_0 )
{
self endon( "death" );
self endon( "killanimscript" );
var_1 = self.ridingvehicle;
for (;;)
{
if ( var_1.event["jump"][var_0] )
{
var_1.event["jump"][var_0] = 0;
self notify( "atv_event_occurred" );
self.current_event = "jump";
var_1.steering_enable = 0;
self setflaggedanimknoblimitedrestart( "jump", animscripts\utility::animarray( "event_jump" ), 1, 0.17 );
}
if ( var_1.event["bump"][var_0] )
{
var_1.event["bump"][var_0] = 0;
self notify( "atv_event_occurred" );
if ( self.current_event != "bump_big" )
thread atv_do_event( animscripts\utility::animarray( "event_bump" ) );
}
if ( var_1.event["bump_big"][var_0] )
{
var_1.event["bump_big"][var_0] = 0;
self notify( "atv_event_occurred" );
self.current_event = "bump_big";
thread atv_do_event( animscripts\utility::animarray( "event_bump_big" ) );
}
if ( var_1.event["sway_left"][var_0] )
{
var_1.event["sway_left"][var_0] = 0;
self notify( "atv_event_occurred" );
if ( self.current_event != "bump_big" )
thread atv_do_event( animscripts\utility::animarray( "event_sway" )["left"] );
}
if ( var_1.event["sway_right"][var_0] )
{
var_1.event["sway_right"][var_0] = 0;
self notify( "atv_event_occurred" );
if ( self.current_event != "bump_big" )
thread atv_do_event( animscripts\utility::animarray( "event_sway" )["right"] );
}
wait 0.05;
}
}
atv_start_shooting()
{
self notify( "want_shoot_while_driving" );
self setanim( %atv_add_fire, 1, 0.2 );
if ( isdefined( self.shoot_while_driving_thread ) )
return;
self.shoot_while_driving_thread = 1;
thread atv_decide_shoot();
thread atv_shoot();
}
atv_stop_shooting()
{
self endon( "killanimscript" );
self endon( "want_shoot_while_driving" );
wait 0.05;
self notify( "end_shoot_while_driving" );
self.shoot_while_driving_thread = undefined;
self clearanim( %atv_add_fire, 0.2 );
}
atv_decide_shoot()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_driving" );
self.a.specialshootbehavior = ::atvshootbehavior;
atv_decide_shoot_internal();
self.shoot_while_driving_thread = undefined;
}
atv_decide_shoot_internal()
{
self endon( "atv_event_occurred" );
animscripts\shoot_behavior::decidewhatandhowtoshoot( "normal" );
}
atvshootbehavior()
{
if ( !isdefined( self.enemy ) )
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
return;
}
self.shootent = self.enemy;
self.shootpos = self.enemy getshootatpos();
var_0 = distancesquared( self.origin, self.enemy.origin );
if ( var_0 < 1000000 )
self.shootstyle = "full";
else if ( var_0 < 4000000 )
self.shootstyle = "burst";
else
self.shootstyle = "single";
if ( isdefined( self.enemy.vehicle ) )
{
var_1 = 0.5;
var_2 = self.shootent.vehicle;
var_3 = self.ridingvehicle;
var_4 = var_3.origin - var_2.origin;
var_5 = anglestoforward( var_2.angles );
var_6 = anglestoright( var_2.angles );
var_7 = vectordot( var_4, var_5 );
if ( var_7 < 0 )
{
var_8 = var_2 vehicle_getspeed() * var_1;
var_8 = var_8 * 17.6;
if ( var_8 > 50 )
{
var_9 = vectordot( var_4, var_6 );
var_9 = var_9 / 3;
if ( var_9 > 128 )
var_9 = 128;
else if ( var_9 < -128 )
var_9 = -128;
if ( var_9 > 0 )
var_9 = 128 - var_9;
else
var_9 = -128 - var_9;
self.shootent = undefined;
self.shootpos = var_2.origin + var_8 * var_5 + var_9 * var_6;
return;
}
}
}
}
atv_shoot()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_driving" );
self notify( "doing_shootWhileDriving" );
self endon( "doing_shootWhileDriving" );
for (;;)
{
if ( !self.bulletsinclip )
{
wait 0.5;
continue;
}
animscripts\combat_utility::shootuntilshootbehaviorchange();
}
}
atv_reload()
{
if ( !self.ridingvehicle.steering_enable )
return 0;
if ( !animscripts\combat_utility::needtoreload( 0 ) )
return 0;
if ( !animscripts\utility::usingriflelikeweapon() )
return 0;
atv_reload_internal();
self notify( "abort_reload" );
return 1;
}
atv_reload_internal()
{
self endon( "atv_event_occurred" );
self.stop_aiming_for_reload = 1;
self waittill( "start_blending_reload" );
self setanim( %atv_aiming, 0, 0.25 );
self setflaggedanimrestart( "gun_down", animscripts\utility::animarray( "gun_down" ), 1, 0.25 );
animscripts\shared::donotetracks( "gun_down" );
self clearanim( animscripts\utility::animarray( "gun_down" ), 0 );
self setflaggedanimknoballrestart( "reload_anim", animscripts\utility::animarray( "reload" ), %body, 1, 0.25 );
animscripts\shared::donotetracks( "reload_anim" );
self clearanim( %atv_reload, 0.2 );
self setflaggedanimrestart( "gun_up", animscripts\utility::animarray( "gun_up" ), 1, 0.25 );
self.gun_up_for_reload = 1;
animscripts\shared::donotetracks( "gun_up", ::atv_waitfor_start_aim );
self.stop_aiming_for_reload = undefined;
self clearanim( %atv_reload, 0.1 );
self setanim( %atv_aiming, 1, 0.1 );
if ( isdefined( self.gun_up_for_reload ) )
{
self.gun_up_for_reload = undefined;
animscripts\shared::donotetracks( "gun_up", ::atv_waitfor_end );
self clearanim( animscripts\utility::animarray( "gun_up" ), 0 );
}
}
atv_waitfor_start_aim( var_0 )
{
if ( var_0 == "start_aim" )
return 1;
}
atv_waitfor_end( var_0 )
{
if ( var_0 == "end" )
return 1;
}
atv_waitfor_start_lean( var_0 )
{
if ( var_0 == "start_lean" )
return 1;
}
atv_trackshootentorpos_driver()
{
self endon( "killanimscript" );
self endon( "stop tracking" );
var_0 = 0.05;
var_1 = 8;
var_2 = 0;
var_3 = 0;
var_4 = 1;
for (;;)
{
animscripts\track::incranimaimweight();
var_5 = ( self.origin[0], self.origin[1], self geteye()[2] );
var_6 = self.shootpos;
if ( isdefined( self.shootent ) )
var_6 = self.shootent getshootatpos();
if ( !isdefined( var_6 ) )
{
var_3 = 0;
var_7 = self getanglestolikelyenemypath();
if ( isdefined( var_7 ) )
var_3 = angleclamp180( self.angles[1] - var_7[1] );
}
else
{
var_8 = var_6 - var_5;
var_9 = vectortoangles( var_8 );
var_3 = self.angles[1] - var_9[1];
var_3 = angleclamp180( var_3 );
}
if ( var_3 > self.rightaimlimit || var_3 < self.leftaimlimit )
var_3 = 0;
if ( var_4 )
var_4 = 0;
else
{
var_10 = var_3 - var_2;
if ( abs( var_10 ) > var_1 )
var_3 = var_2 + var_1 * common_scripts\utility::sign( var_10 );
}
var_2 = var_3;
var_11 = min( max( 0 - var_3, 0 ), 90 ) / 90 * self.a.aimweight;
var_12 = min( max( var_3, 0 ), 90 ) / 90 * self.a.aimweight;
self setanimlimited( %atv_aim_4, var_11, var_0 );
self setanimlimited( %atv_aim_6, var_12, var_0 );
wait 0.05;
}
}
atv_get_death_anim( var_0, var_1, var_2 )
{
var_3 = undefined;
var_4 = undefined;
var_5 = 0;
for ( var_6 = 0; var_6 < var_0.size; var_6++ )
{
var_7 = animscripts\utility::absangleclamp180( var_2 - var_1[var_6] );
if ( !isdefined( var_3 ) || var_7 < var_5 )
{
var_4 = var_3;
var_3 = var_0[var_6];
var_5 = var_7;
continue;
}
if ( !isdefined( var_4 ) )
var_4 = var_0[var_6];
}
var_8 = var_3;
if ( isdefined( anim.prevatvdeath ) && var_8 == anim.prevatvdeath && gettime() - anim.prevatvdeathtime < 500 )
var_8 = var_4;
anim.prevatvdeath = var_8;
anim.prevatvdeathtime = gettime();
return var_8;
}
atv_death_launchslide()
{
var_0 = self.ridingvehicle;
var_1 = var_0.prevframevelocity;
var_1 = ( var_1[0], var_1[1], randomfloatrange( 200, 400 ) ) * 0.75;
if ( lengthsquared( var_1 ) > 1000000 )
var_1 = vectornormalize( var_1 ) * 1000;
var_2 = spawn( "script_origin", self.origin );
var_2 moveslide( ( 0, 0, 40 ), 15, var_1 );
self linkto( var_2 );
var_2 thread deleteshortly();
}
atv_normal_death()
{
var_0 = [];
var_0[0] = level.scr_anim["atv"]["small"]["death"]["back"];
var_0[1] = level.scr_anim["atv"]["small"]["death"]["right"];
var_0[2] = level.scr_anim["atv"]["small"]["death"]["left"];
var_1 = [];
var_1[0] = -180;
var_1[1] = -90;
var_1[2] = 90;
var_2 = atv_get_death_anim( var_0, var_1, self.damageyaw );
animscripts\death::playdeathanim( var_2 );
return 1;
}
atv_collide_death()
{
var_0 = self.ridingvehicle;
if ( !isdefined( var_0 ) )
return atv_normal_death();
var_1 = var_0.prevframevelocity;
atv_death_launchslide();
var_2 = vectortoangles( var_1 );
var_3 = angleclamp180( var_2[1] - self.angles[1] );
var_4 = [];
var_4[0] = level.scr_anim["atv"]["big"]["death"]["back"];
var_4[1] = level.scr_anim["atv"]["big"]["death"]["left"];
var_4[2] = level.scr_anim["atv"]["big"]["death"]["front"];
var_4[3] = level.scr_anim["atv"]["big"]["death"]["right"];
var_5 = [];
var_5[0] = -180;
var_5[1] = -90;
var_5[2] = 0;
var_5[3] = 90;
var_6 = atv_get_death_anim( var_4, var_5, var_3 );
animscripts\death::playdeathanim( var_6 );
return 1;
}
deleteshortly()
{
var_0 = self.origin;
for ( var_1 = 0; var_1 < 60; var_1++ )
{
wait 0.05;
var_0 = self.origin;
}
wait 3;
if ( isdefined( self ) )
self delete();
}
atv_setanim_common( var_0 )
{
self.a.array["idle"] = level.scr_anim["atv"][var_0]["idle"];
self.a.array["drive"] = level.scr_anim["atv"][var_0]["drive"];
self.a.array["fire"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["single"] = animscripts\utility::array( level.scr_anim["atv"][var_0]["single"] );
self.a.array["burst2"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["burst3"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["burst4"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["burst5"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["burst6"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["semi2"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["semi3"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["semi4"] = level.scr_anim["atv"][var_0]["fire"];
self.a.array["semi5"] = level.scr_anim["atv"][var_0]["fire"];
}
atv_setanim_driver( var_0 )
{
self.a.array = [];
atv_setanim_common( "driver" );
self.a.array["left2right"] = level.scr_anim["atv"]["driver"]["left2right"];
self.a.array["right2left"] = level.scr_anim["atv"]["driver"]["right2left"];
self.a.array["straight_level_left"] = level.scr_anim["atv"]["driver"]["straight_level"]["left"];
self.a.array["straight_level_center"] = level.scr_anim["atv"]["driver"]["straight_level"]["center"];
self.a.array["straight_level_right"] = level.scr_anim["atv"]["driver"]["straight_level"]["right"];
self.a.array["add_aim_left_left"] = level.scr_anim["atv"]["driver"]["add_aim_left"]["left"];
self.a.array["add_aim_left_center"] = level.scr_anim["atv"]["driver"]["add_aim_left"]["center"];
self.a.array["add_aim_left_right"] = level.scr_anim["atv"]["driver"]["add_aim_left"]["right"];
self.a.array["add_aim_right_left"] = level.scr_anim["atv"]["driver"]["add_aim_right"]["left"];
self.a.array["add_aim_right_center"] = level.scr_anim["atv"]["driver"]["add_aim_right"]["center"];
self.a.array["add_aim_right_right"] = level.scr_anim["atv"]["driver"]["add_aim_right"]["right"];
if ( var_0 )
{
self.a.array["event_jump"] = level.scr_anim["atv"]["driver"]["shoot_jump"];
self.a.array["event_bump"] = level.scr_anim["atv"]["driver"]["shoot_bump"];
self.a.array["event_bump_big"] = level.scr_anim["atv"]["driver"]["shoot_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["atv"]["driver"]["shoot_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["atv"]["driver"]["shoot_sway_right"];
self.a.array["event_restore"] = %atv_aiming;
}
else
{
self.a.array["event_jump"] = level.scr_anim["atv"]["driver"]["drive_jump"];
self.a.array["event_bump"] = level.scr_anim["atv"]["driver"]["drive_bump"];
self.a.array["event_bump_big"] = level.scr_anim["atv"]["driver"]["drive_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["atv"]["driver"]["drive_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["atv"]["driver"]["drive_sway_right"];
self.a.array["event_restore"] = %atv_turn;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

55
animscripts/civilian.gsc Normal file
View File

@ -0,0 +1,55 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
cover()
{
self endon( "killanimscript" );
self clearanim( %root, 0.2 );
animscripts\utility::updateisincombattimer();
if ( animscripts\utility::isincombat() )
var_0 = "idle_combat";
else
var_0 = "idle_noncombat";
var_1 = undefined;
if ( isdefined( self.animname ) && isdefined( level.scr_anim[self.animname] ) )
var_1 = level.scr_anim[self.animname][var_0];
if ( !isdefined( var_1 ) )
{
if ( !isdefined( level.scr_anim["default_civilian"] ) )
return;
var_1 = level.scr_anim["default_civilian"][var_0];
}
thread move_check();
for (;;)
{
self setflaggedanimknoball( "idle", common_scripts\utility::random( var_1 ), %root, 1, 0.2, 1 );
self waittillmatch( "idle", "end" );
}
}
move_check()
{
self endon( "killanimscript" );
while ( !isdefined( self.champion ) )
wait 1;
}
stop()
{
cover();
}
get_flashed_anim()
{
return anim.civilianflashedarray[randomint( anim.civilianflashedarray.size )];
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\cover_arrival::main();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\death::main();
}

View File

@ -0,0 +1,17 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
get_flashed_anim()
{
return anim.civilianflashedarray[randomint( anim.civilianflashedarray.size )];
}
main()
{
var_0 = maps\_utility::flashbanggettimeleftsec();
if ( var_0 <= 0 )
return;
animscripts\flashed::flashbangedloop( get_flashed_anim(), var_0 );
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,206 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\init::main();
civilian_init();
}
#using_animtree("generic_human");
civilian_init()
{
self.allowdeath = 1;
self.disablearrivals = 1;
self.disableexits = 1;
self.neverenablecqb = 1;
self.alwaysrunforward = 1;
self orientmode( "face default" );
self.combatmode = "no_cover";
self pushplayer( 0 );
self.a.reacttobulletchance = 1;
if ( !isdefined( level.initialized_civilian_animations ) )
{
level.initialized_civilian_animations = 1;
level.scr_anim["default_civilian"]["run_combat"][0] = %civilian_run_upright;
level.scr_anim["default_civilian"]["run_hunched_combat"][0] = %civilian_run_hunched_a;
level.scr_anim["default_civilian"]["run_hunched_combat"][1] = %civilian_run_hunched_c;
level.scr_anim["default_civilian"]["run_hunched_combat"][2] = %civilian_run_hunched_flinch;
level.scr_anim["default_civilian"]["run_noncombat"][0] = %civilian_walk_cool;
var_0 = [];
var_0[0] = 3;
var_0[1] = 3;
var_0[2] = 1;
level.scr_anim["default_civilian"]["run_hunched_weights"] = common_scripts\utility::get_cumulative_weights( var_0 );
var_0 = [];
var_0[0] = 1;
level.scr_anim["default_civilian"]["run_weights"] = common_scripts\utility::get_cumulative_weights( var_0 );
level.scr_anim["default_civilian"]["idle_noncombat"][0] = %unarmed_cowerstand_idle;
level.scr_anim["default_civilian"]["idle_combat"][0] = %casual_crouch_v2_idle;
level.scr_anim["default_civilian"]["idle_combat"][1] = %unarmed_cowercrouch_idle_duck;
anim.civilianflashedarray[0] = %unarmed_cowerstand_react;
anim.civilianflashedarray[1] = %unarmed_cowercrouch_react_a;
anim.civilianflashedarray[2] = %unarmed_cowercrouch_react_b;
}
var_1 = undefined;
if ( isdefined( self.civilian_walk_animation ) )
{
self.animname = self.civilian_walk_animation;
attachprops( self.civilian_walk_animation );
self.alertlevel = "noncombat";
startnoncombat();
}
else
{
self.animname = "default_civilian";
self.alertlevel = "alert";
startcombat();
}
thread checkcombatstate();
self.dropweapon = 0;
animscripts\shared::dropaiweapon();
self.saved = 0;
}
attachprops( var_0 )
{
if ( isdefined( self.hasattachedprops ) )
return;
initcivilianprops();
var_1 = anim.civilianprops[var_0];
if ( isdefined( var_1 ) )
{
self attach( var_1, "tag_inhand", 1 );
self.hasattachedprops = 1;
}
}
detachprops( var_0 )
{
if ( isdefined( self.hasattachedprops ) )
{
self.hasattachedprops = undefined;
self detach( anim.civilianprops[var_0], "tag_inhand" );
}
}
initcivilianprops()
{
if ( isdefined( anim.civilianprops ) )
return;
anim.civilianprops = [];
anim.civilianprops["civilian_briefcase_walk"] = "com_metal_briefcase";
anim.civilianprops["civilian_crazy_walk"] = "electronics_pda";
anim.civilianprops["civilian_cellphone_walk"] = "com_cellphone_on";
anim.civilianprops["sit_lunch_A"] = "com_cellphone_on";
anim.civilianprops["civilian_soda_walk"] = "ma_cup_single_closed";
anim.civilianprops["civilian_paper_walk"] = "paper_memo";
anim.civilianprops["civilian_coffee_walk"] = "cs_coffeemug02";
anim.civilianprops["civilian_pda_walk"] = "electronics_pda";
anim.civilianprops["reading1"] = "open_book";
anim.civilianprops["reading2"] = "open_book";
anim.civilianprops["texting_stand"] = "electronics_pda";
anim.civilianprops["texting_sit"] = "electronics_pda";
anim.civilianprops["smoking1"] = "prop_cigarette";
anim.civilianprops["smoking2"] = "prop_cigarette";
}
startnoncombat()
{
self.turnrate = 0.2;
if ( isdefined( self.civilian_walk_animation ) )
{
var_0 = %civilian_briefcase_walk_dodge_l;
var_1 = %civilian_briefcase_walk_dodge_r;
if ( isdefined( level.scr_anim[self.animname]["dodge_left"] ) )
var_0 = level.scr_anim[self.animname]["dodge_left"];
if ( isdefined( level.scr_anim[self.animname]["dodge_right"] ) )
var_1 = level.scr_anim[self.animname]["dodge_right"];
animscripts\move::setdodgeanims( var_0, var_1 );
}
if ( isdefined( level.scr_anim[self.animname]["turn_left_90"] ) )
{
self.pathturnanimoverridefunc = animscripts\civilian\civilian_move::civilian_noncombatmoveturn;
self.pathturnanimblendtime = 0.1;
maps\_utility::enable_turnanims();
}
else
maps\_utility::disable_turnanims();
self.run_overrideanim = level.scr_anim[self.animname]["run_noncombat"];
self.walk_overrideanim = self.run_overrideanim;
self.run_overridebulletreact = undefined;
if ( self.animname == "default_civilian" )
{
self.run_override_weights = level.scr_anim[self.animname]["run_weights_noncombat"];
self.walk_override_weights = self.run_override_weights;
}
}
startcombat()
{
self notify( "combat" );
animscripts\move::cleardodgeanims();
self.pathturnanimblendtime = undefined;
maps\_utility::enable_turnanims();
self.turnrate = 0.3;
var_0 = randomint( 3 ) < 1;
if ( isdefined( self.force_civilian_stand_run ) )
var_0 = 1;
else if ( isdefined( self.force_civilian_hunched_run ) )
var_0 = 0;
if ( var_0 )
{
self.pathturnanimoverridefunc = animscripts\civilian\civilian_move::civilian_combatmoveturn;
self.run_overrideanim = level.scr_anim["default_civilian"]["run_combat"];
self.run_override_weights = level.scr_anim["default_civilian"]["run_weights"];
}
else
{
self.pathturnanimoverridefunc = animscripts\civilian\civilian_move::civilian_combathunchedmoveturn;
self.run_overrideanim = level.scr_anim["default_civilian"]["run_hunched_combat"];
self.run_override_weights = level.scr_anim["default_civilian"]["run_hunched_weights"];
}
self.run_overridebulletreact = [];
self.run_overridebulletreact[0] = %run_react_stumble;
self.walk_overrideanim = self.run_overrideanim;
self.walk_override_weights = self.run_override_weights;
detachprops( self.civilian_walk_animation );
}
checkcombatstate()
{
self endon( "death" );
self endon( "disable_combat_state_check" );
var_0 = self.alertlevelint > 1;
for (;;)
{
var_1 = self.alertlevelint > 1;
if ( var_0 && !var_1 )
startnoncombat();
else if ( !var_0 && var_1 )
startcombat();
var_0 = var_1;
wait 0.05;
}
}

View File

@ -0,0 +1,101 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\move::main();
}
civilian_noncombatmoveturn( var_0, var_1 )
{
var_2 = undefined;
if ( var_0 < -60 && var_0 > -120 )
var_2 = level.scr_anim[self.animname]["turn_left_90"];
if ( var_0 > 60 && var_0 < 120 )
var_2 = level.scr_anim[self.animname]["turn_right_90"];
if ( isdefined( var_2 ) && animscripts\move::pathchange_candoturnanim( var_2 ) )
return var_2;
else
return undefined;
}
#using_animtree("generic_human");
civilian_combatmoveturn( var_0, var_1 )
{
var_2 = undefined;
if ( var_0 < -22.5 )
{
if ( var_0 > -45 )
var_2 = %civilian_run_upright_turnl45;
else if ( var_0 > -112.5 )
var_2 = %civilian_run_upright_turnl90;
else if ( var_0 > -157.5 )
var_2 = %civilian_run_upright_turnl135;
else
var_2 = %civilian_run_upright_turn180;
}
else if ( var_0 > 22.5 )
{
if ( var_0 < 45 )
var_2 = %civilian_run_upright_turnr45;
else if ( var_0 < 112.5 )
var_2 = %civilian_run_upright_turnr90;
else if ( var_0 < 157.5 )
var_2 = %civilian_run_upright_turnr135;
else
var_2 = %civilian_run_upright_turn180;
}
if ( isdefined( var_2 ) && animscripts\move::pathchange_candoturnanim( var_2 ) )
return var_2;
else
return undefined;
}
civilian_combathunchedmoveturn( var_0, var_1 )
{
var_2 = undefined;
var_3 = undefined;
if ( var_0 < -22.5 )
{
if ( var_0 > -45 )
var_2 = %civilian_run_hunched_turnl45;
else if ( var_0 > -112.5 )
{
var_2 = %civilian_run_hunched_turnl90;
var_3 = animscripts\utility::randomanimoftwo( %civilian_run_hunched_turnl90_slide, %civilian_run_hunched_turnl90_stumble );
}
else if ( var_0 > -157.5 )
var_2 = %civilian_run_upright_turnl135;
else
var_2 = %civilian_run_upright_turn180;
}
else if ( var_0 > 22.5 )
{
if ( var_0 < 45 )
var_2 = %civilian_run_hunched_turnr45;
else if ( var_0 < 112.5 )
{
var_2 = %civilian_run_hunched_turnr90;
var_3 = animscripts\utility::randomanimoftwo( %civilian_run_hunched_turnr90_slide, %civilian_run_hunched_turnr90_stumble );
}
else if ( var_0 < 157.5 )
var_2 = %civilian_run_upright_turnr135;
else
var_2 = %civilian_run_upright_turn180;
}
if ( isdefined( var_3 ) && randomint( 3 ) < 2 && animscripts\move::pathchange_candoturnanim( var_3 ) )
return var_3;
if ( isdefined( var_2 ) && animscripts\move::pathchange_candoturnanim( var_2 ) )
return var_2;
else
return undefined;
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\pain::main();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::cover();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\scripted::main();
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
animscripts\civilian::stop();
}

1404
animscripts/combat.gsc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
generic_combat()
{
animscripts\battlechatter::playbattlechatter();
}
specific_combat( var_0 )
{
animscripts\battlechatter::playbattlechatter();
}

File diff suppressed because it is too large Load Diff

1401
animscripts/corner.gsc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,863 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self endon( "killanimscript" );
self endon( "abort_approach" );
if ( self.swimmer )
{
animscripts\swim::swim_coverarrival_main();
return;
}
if ( isdefined( self.customarrivalfunc ) )
{
[[ self.customarrivalfunc ]]();
return;
}
var_0 = self.approachnumber;
var_1 = animscripts\utility::lookupanim( "cover_trans", self.approachtype )[var_0];
if ( !isdefined( self.heat ) )
thread abortapproachifthreatened();
self clearanim( %body, 0.2 );
self setflaggedanimrestart( "coverArrival", var_1, 1, 0.2, self.movetransitionrate );
animscripts\face::playfacialanim( var_1, "run" );
animscripts\shared::donotetracks( "coverArrival", ::handlestartaim );
var_2 = anim.arrivalendstance[self.approachtype];
if ( isdefined( var_2 ) )
self.a.pose = var_2;
self.a.movement = "stop";
self.a.arrivaltype = self.approachtype;
self clearanim( %root, 0.3 );
self.lastapproachaborttime = undefined;
}
handlestartaim( var_0 )
{
if ( var_0 == "start_aim" )
{
if ( self.a.pose == "stand" )
animscripts\animset::set_animarray_standing();
else if ( self.a.pose == "crouch" )
animscripts\animset::set_animarray_crouching();
else
{
}
animscripts\combat::set_aim_and_turn_limits();
self.previouspitchdelta = 0.0;
animscripts\combat_utility::setupaim( 0 );
thread animscripts\track::trackshootentorpos();
}
}
isthreatenedbyenemy()
{
if ( !isdefined( self.node ) )
return 0;
if ( isdefined( self.enemy ) && self seerecently( self.enemy, 1.5 ) && distancesquared( self.origin, self.enemy.origin ) < 250000 )
return !self iscovervalidagainstenemy();
return 0;
}
abortapproachifthreatened()
{
self endon( "killanimscript" );
for (;;)
{
if ( !isdefined( self.node ) )
return;
if ( isthreatenedbyenemy() )
{
self clearanim( %root, 0.3 );
self notify( "abort_approach" );
self.lastapproachaborttime = gettime();
return;
}
wait 0.1;
}
}
canusesawapproach( var_0 )
{
if ( !animscripts\utility::usingmg() )
return 0;
if ( !isdefined( var_0.turretinfo ) )
return 0;
if ( var_0.type != "Cover Stand" && var_0.type != "Cover Prone" && var_0.type != "Cover Crouch" )
return 0;
if ( isdefined( self.enemy ) && distancesquared( self.enemy.origin, var_0.origin ) < 65536 )
return 0;
if ( animscripts\utility::getnodeyawtoenemy() > 40 || animscripts\utility::getnodeyawtoenemy() < -40 )
return 0;
return 1;
}
determinenodeapproachtype( var_0 )
{
var_1 = var_0.type;
if ( var_1 == "Cover Multi" )
{
if ( !isdefined( self.cover ) )
self.cover = spawnstruct();
var_2 = animscripts\cover_multi::covermulti_getbestvaliddir( [ "over", [ "left", "right" ] ] );
self.cover.arrivalnodetype = var_2;
var_3 = animscripts\cover_multi::covermulti_getstatefromdir( var_0, var_2 );
var_1 = animscripts\utility::getcovermultipretendtype( var_0, var_3 );
}
if ( canusesawapproach( var_0 ) )
{
if ( var_1 == "Cover Stand" )
return "stand_saw";
if ( var_1 == "Cover Crouch" )
return "crouch_saw";
else if ( var_1 == "Cover Prone" )
return "prone_saw";
}
if ( !isdefined( anim.approach_types[var_1] ) )
return;
if ( isdefined( var_0.arrivalstance ) )
var_4 = var_0.arrivalstance;
else
var_4 = var_0 gethighestnodestance();
if ( var_4 == "prone" )
var_4 = "crouch";
var_5 = anim.approach_types[var_1][var_4];
if ( usereadystand() && var_5 == "exposed" )
var_5 = "exposed_ready";
if ( animscripts\utility::shouldcqb() )
{
var_6 = var_5 + "_cqb";
if ( isdefined( anim.archetypes["soldier"]["cover_trans"][var_6] ) )
var_5 = var_6;
}
return var_5;
}
determineexposedapproachtype( var_0 )
{
if ( isdefined( self.heat ) )
return "heat";
if ( isdefined( var_0.arrivalstance ) )
var_1 = var_0.arrivalstance;
else
var_1 = var_0 gethighestnodestance();
if ( var_1 == "prone" )
var_1 = "crouch";
if ( var_1 == "crouch" )
var_2 = "exposed_crouch";
else
var_2 = "exposed";
if ( var_2 == "exposed" && usereadystand() )
var_2 = var_2 + "_ready";
if ( animscripts\utility::shouldcqb() )
return var_2 + "_cqb";
return var_2;
}
calculatenodeoffsetfromanimationdelta( var_0, var_1 )
{
var_2 = anglestoright( var_0 );
var_3 = anglestoforward( var_0 );
return var_3 * var_1[0] + var_2 * ( 0 - var_1[1] );
}
getapproachent()
{
if ( isdefined( self.scriptedarrivalent ) )
return self.scriptedarrivalent;
if ( isdefined( self.node ) )
return self.node;
return undefined;
}
getapproachpoint( var_0, var_1 )
{
if ( var_1 == "stand_saw" )
{
var_2 = ( var_0.turretinfo.origin[0], var_0.turretinfo.origin[1], var_0.origin[2] );
var_3 = anglestoforward( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_4 = anglestoright( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_2 = var_2 + var_3 * -32.545 - var_4 * 6.899;
}
else if ( var_1 == "crouch_saw" )
{
var_2 = ( var_0.turretinfo.origin[0], var_0.turretinfo.origin[1], var_0.origin[2] );
var_3 = anglestoforward( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_4 = anglestoright( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_2 = var_2 + var_3 * -32.545 - var_4 * 6.899;
}
else if ( var_1 == "prone_saw" )
{
var_2 = ( var_0.turretinfo.origin[0], var_0.turretinfo.origin[1], var_0.origin[2] );
var_3 = anglestoforward( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_4 = anglestoright( ( 0, var_0.turretinfo.angles[1], 0 ) );
var_2 = var_2 + var_3 * -37.36 - var_4 * 13.279;
}
else if ( isdefined( self.scriptedarrivalent ) )
var_2 = self.goalpos;
else
var_2 = var_0.origin;
return var_2;
}
checkapproachpreconditions()
{
if ( isdefined( self getnegotiationstartnode() ) )
return 0;
if ( isdefined( self.disablearrivals ) && self.disablearrivals )
return 0;
return 1;
}
checkapproachconditions( var_0, var_1, var_2 )
{
if ( isdefined( anim.exposedtransition[var_0] ) )
return 0;
if ( var_0 == "stand" || var_0 == "crouch" )
{
if ( animscripts\utility::absangleclamp180( vectortoyaw( var_1 ) - var_2.angles[1] + 180 ) < 60 )
return 0;
}
if ( isthreatenedbyenemy() || isdefined( self.lastapproachaborttime ) && self.lastapproachaborttime + 500 > gettime() )
return 0;
return 1;
}
setupapproachnode( var_0 )
{
self endon( "killanimscript" );
if ( isdefined( self.heat ) )
{
thread dolastminuteexposedapproachwrapper();
return;
}
if ( var_0 )
self.requestarrivalnotify = 1;
if ( self.swimmer == 1 )
{
thread animscripts\swim::swim_setupapproach();
return;
}
self.a.arrivaltype = undefined;
thread dolastminuteexposedapproachwrapper();
self waittill( "cover_approach", var_1 );
if ( !checkapproachpreconditions() )
return;
thread setupapproachnode( 0 );
var_2 = "exposed";
var_3 = self.pathgoalpos;
var_4 = vectortoyaw( var_1 );
var_5 = var_4;
var_6 = getapproachent();
if ( isdefined( var_6 ) )
{
var_2 = determinenodeapproachtype( var_6 );
if ( isdefined( var_2 ) && var_2 != "exposed" )
{
var_3 = getapproachpoint( var_6, var_2 );
var_4 = var_6.angles[1];
var_5 = animscripts\utility::getnodeforwardyaw( var_6 );
}
}
else if ( usereadystand() )
{
if ( animscripts\utility::shouldcqb() )
var_2 = "exposed_ready_cqb";
else
var_2 = "exposed_ready";
}
if ( !checkapproachconditions( var_2, var_1, var_6 ) )
return;
startcoverapproach( var_2, var_3, var_4, var_5, var_1 );
}
coverapproachlastminutecheck( var_0, var_1, var_2, var_3, var_4 )
{
if ( isdefined( self.disablearrivals ) && self.disablearrivals )
return 0;
if ( abs( self getmotionangle() ) > 45 && isdefined( self.enemy ) && vectordot( anglestoforward( self.angles ), vectornormalize( self.enemy.origin - self.origin ) ) > 0.8 )
return 0;
if ( self.a.pose != "stand" || self.a.movement != "run" && !animscripts\utility::iscqbwalkingorfacingenemy() )
return 0;
if ( animscripts\utility::absangleclamp180( var_4 - self.angles[1] ) > 30 )
{
if ( isdefined( self.enemy ) && self cansee( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 65536 )
{
if ( vectordot( anglestoforward( self.angles ), self.enemy.origin - self.origin ) > 0 )
return 0;
}
}
if ( !checkcoverenterpos( var_0, var_1, var_2, var_3, 0 ) )
return 0;
return 1;
}
approachwaittillclose( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return;
for (;;)
{
if ( !isdefined( self.pathgoalpos ) )
waitforpathgoalpos();
var_2 = distance( self.origin, self.pathgoalpos );
if ( var_2 <= var_1 + 8 )
break;
var_3 = ( var_2 - var_1 ) / 250 - 0.1;
if ( var_3 < 0.05 )
var_3 = 0.05;
wait( var_3 );
}
}
startcoverapproach( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "killanimscript" );
self endon( "cover_approach" );
var_5 = getapproachent();
var_6 = animscripts\exit_node::getmaxdirectionsandexcludedirfromapproachtype( var_5 );
var_7 = var_6.maxdirections;
var_8 = var_6.excludedir;
var_9 = vectordot( var_4, anglestoforward( var_5.angles ) ) >= 0;
var_6 = checkarrivalenterpositions( var_1, var_3, var_0, var_4, var_7, var_8, var_9 );
if ( var_6.approachnumber < 0 )
return;
var_10 = var_6.approachnumber;
if ( var_10 <= 6 && var_9 )
{
self endon( "goal_changed" );
self.arrivalstartdist = anim.covertranslongestdist[var_0];
approachwaittillclose( var_5, self.arrivalstartdist );
var_11 = vectornormalize( var_1 - self.origin );
var_6 = checkarrivalenterpositions( var_1, var_3, var_0, var_11, var_7, var_8, var_9 );
self.arrivalstartdist = length( animscripts\utility::lookuptransitionanim( "cover_trans_dist", var_0, var_10 ) );
approachwaittillclose( var_5, self.arrivalstartdist );
if ( !self maymovetopoint( var_1 ) )
{
self.arrivalstartdist = undefined;
return;
}
if ( var_6.approachnumber < 0 )
{
self.arrivalstartdist = undefined;
return;
}
var_10 = var_6.approachnumber;
var_12 = var_3 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_0, var_10 );
}
else
{
self setruntopos( self.coverenterpos );
self waittill( "runto_arrived" );
var_12 = var_3 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_0, var_10 );
if ( !coverapproachlastminutecheck( var_1, var_3, var_0, var_10, var_12 ) )
return;
}
self.approachnumber = var_10;
self.approachtype = var_0;
self.arrivalstartdist = undefined;
self startcoverarrival( self.coverenterpos, var_12, 0 );
}
checkarrivalenterpositions( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_7 = spawnstruct();
animscripts\exit_node::calculatenodetransitionangles( var_7, var_2, 1, var_1, var_3, var_4, var_5 );
animscripts\exit_node::sortnodetransitionangles( var_7, var_4 );
var_8 = spawnstruct();
var_9 = ( 0, 0, 0 );
var_8.approachnumber = -1;
var_10 = 2;
for ( var_11 = 1; var_11 <= var_10; var_11++ )
{
var_8.approachnumber = var_7.transindex[var_11];
if ( !checkcoverenterpos( var_0, var_1, var_2, var_8.approachnumber, var_6 ) )
continue;
break;
}
if ( var_11 > var_10 )
{
var_8.approachnumber = -1;
return var_8;
}
var_12 = distancesquared( var_0, self.origin );
var_13 = distancesquared( var_0, self.coverenterpos );
if ( var_12 < var_13 * 2 * 2 )
{
if ( var_12 < var_13 )
{
var_8.approachnumber = -1;
return var_8;
}
if ( !var_6 )
{
var_14 = vectornormalize( self.coverenterpos - self.origin );
var_15 = var_1 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_2, var_8.approachnumber );
var_16 = anglestoforward( ( 0, var_15, 0 ) );
var_17 = vectordot( var_14, var_16 );
if ( var_17 < 0.707 )
{
var_8.approachnumber = -1;
return var_8;
}
}
}
return var_8;
}
dolastminuteexposedapproachwrapper()
{
self endon( "killanimscript" );
self endon( "move_interrupt" );
self notify( "doing_last_minute_exposed_approach" );
self endon( "doing_last_minute_exposed_approach" );
thread watchgoalchanged();
for (;;)
{
dolastminuteexposedapproach();
for (;;)
{
common_scripts\utility::waittill_any( "goal_changed", "goal_changed_previous_frame" );
if ( isdefined( self.coverenterpos ) && isdefined( self.pathgoalpos ) && distance2d( self.coverenterpos, self.pathgoalpos ) < 1 )
continue;
break;
}
}
}
watchgoalchanged()
{
self endon( "killanimscript" );
self endon( "doing_last_minute_exposed_approach" );
for (;;)
{
self waittill( "goal_changed" );
wait 0.05;
self notify( "goal_changed_previous_frame" );
}
}
exposedapproachconditioncheck( var_0, var_1 )
{
if ( !isdefined( self.pathgoalpos ) )
return 0;
if ( isdefined( self.disablearrivals ) && self.disablearrivals )
return 0;
if ( isdefined( self.approachconditioncheckfunc ) )
{
if ( !self [[ self.approachconditioncheckfunc ]]( var_0 ) )
return 0;
}
else
{
if ( !self.facemotion && ( !isdefined( var_0 ) || var_0.type == "Path" || var_0.type == "Path 3D" ) )
return 0;
if ( self.a.pose != "stand" )
return 0;
}
if ( isthreatenedbyenemy() || isdefined( self.lastapproachaborttime ) && self.lastapproachaborttime + 500 > gettime() )
return 0;
if ( !self maymovetopoint( self.pathgoalpos ) )
return 0;
return 1;
}
exposedapproachwaittillclose()
{
for (;;)
{
if ( !isdefined( self.pathgoalpos ) )
waitforpathgoalpos();
var_0 = getapproachent();
if ( isdefined( var_0 ) && !isdefined( self.heat ) )
var_1 = var_0.origin;
else
var_1 = self.pathgoalpos;
var_2 = distance( self.origin, var_1 );
var_3 = anim.longestexposedapproachdist;
if ( var_2 <= var_3 + 8 )
break;
var_4 = ( var_2 - anim.longestexposedapproachdist ) / 250 - 0.1;
if ( var_4 < 0 )
break;
if ( var_4 < 0.05 )
var_4 = 0.05;
wait( var_4 );
}
}
faceenemyatendofapproach( var_0 )
{
if ( !isdefined( self.enemy ) )
return 0;
if ( isdefined( self.heat ) && isdefined( var_0 ) )
return 0;
if ( self.combatmode == "cover" && issentient( self.enemy ) && gettime() - self lastknowntime( self.enemy ) > 15000 )
return 0;
return sighttracepassed( self.enemy getshootatpos(), self.pathgoalpos + ( 0, 0, 60 ), 0, undefined );
}
dolastminuteexposedapproach()
{
self endon( "goal_changed" );
self endon( "move_interrupt" );
if ( isdefined( self getnegotiationstartnode() ) )
return;
exposedapproachwaittillclose();
if ( isdefined( self.grenade ) && isdefined( self.grenade.activator ) && self.grenade.activator == self )
return;
var_0 = "exposed";
var_1 = 1;
if ( isdefined( self.approachtypefunc ) )
var_0 = self [[ self.approachtypefunc ]]();
else if ( usereadystand() )
{
if ( animscripts\utility::shouldcqb() )
var_0 = "exposed_ready_cqb";
else
var_0 = "exposed_ready";
}
else if ( animscripts\utility::shouldcqb() )
var_0 = "exposed_cqb";
else if ( isdefined( self.heat ) )
{
var_0 = "heat";
var_1 = 4096;
}
var_2 = getapproachent();
if ( isdefined( var_2 ) && isdefined( self.pathgoalpos ) && !isdefined( self.disablecoverarrivalsonly ) )
var_3 = distancesquared( self.pathgoalpos, var_2.origin ) < var_1;
else
var_3 = 0;
if ( var_3 )
var_0 = determineexposedapproachtype( var_2 );
var_4 = vectornormalize( self.pathgoalpos - self.origin );
var_5 = vectortoyaw( var_4 );
if ( isdefined( self.faceenemyarrival ) )
var_5 = self.angles[1];
else if ( faceenemyatendofapproach( var_2 ) )
var_5 = vectortoyaw( self.enemy.origin - self.pathgoalpos );
else
{
var_6 = isdefined( var_2 ) && var_3;
var_6 = var_6 && var_2.type != "Path" && var_2.type != "Path 3D" && ( var_2.type != "Ambush" || !animscripts\utility::recentlysawenemy() );
if ( var_6 )
var_5 = animscripts\utility::getnodeforwardyaw( var_2 );
else
{
var_7 = self getanglestolikelyenemypath();
if ( isdefined( var_7 ) )
var_5 = var_7[1];
}
}
var_8 = spawnstruct();
animscripts\exit_node::calculatenodetransitionangles( var_8, var_0, 1, var_5, var_4, 9, -1 );
var_9 = 1;
for ( var_10 = 2; var_10 <= 9; var_10++ )
{
if ( var_8.transitions[var_10] > var_8.transitions[var_9] )
var_9 = var_10;
}
self.approachnumber = var_8.transindex[var_9];
self.approachtype = var_0;
var_11 = animscripts\utility::lookuptransitionanim( "cover_trans", var_0, self.approachnumber );
var_12 = length( animscripts\utility::lookuptransitionanim( "cover_trans_dist", var_0, self.approachnumber ) );
var_13 = var_12 + 8;
var_13 = var_13 * var_13;
while ( isdefined( self.pathgoalpos ) && distancesquared( self.origin, self.pathgoalpos ) > var_13 )
wait 0.05;
if ( isdefined( self.arrivalstartdist ) && self.arrivalstartdist < var_12 + 8 )
return;
if ( !exposedapproachconditioncheck( var_2, var_3 ) )
return;
var_14 = distance( self.origin, self.pathgoalpos );
if ( abs( var_14 - var_12 ) > 8 )
return;
var_15 = vectortoyaw( self.pathgoalpos - self.origin );
if ( isdefined( self.heat ) && var_3 )
{
var_16 = var_5 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_0, self.approachnumber );
var_17 = getarrivalstartpos( self.pathgoalpos, var_5, var_0, self.approachnumber );
}
else if ( var_12 > 0 )
{
var_18 = animscripts\utility::lookuptransitionanim( "cover_trans_dist", var_0, self.approachnumber );
var_19 = atan( var_18[1] / var_18[0] );
if ( !isdefined( self.faceenemyarrival ) || self.facemotion )
{
var_16 = var_15 - var_19;
if ( animscripts\utility::absangleclamp180( var_16 - self.angles[1] ) > 30 )
return;
}
else
var_16 = self.angles[1];
var_20 = var_14 - var_12;
var_17 = self.origin + vectornormalize( self.pathgoalpos - self.origin ) * var_20;
}
else
{
var_16 = self.angles[1];
var_17 = self.origin;
}
self startcoverarrival( var_17, var_16, 0 );
}
waitforpathgoalpos()
{
for (;;)
{
if ( isdefined( self.pathgoalpos ) )
return;
wait 0.1;
}
}
custommovetransitionfunc()
{
if ( !isdefined( self.startmovetransitionanim ) )
return;
self animmode( "zonly_physics", 0 );
self orientmode( "face current" );
self setflaggedanimknoballrestart( "move", self.startmovetransitionanim, %root, 1 );
animscripts\face::playfacialanim( self.startmovetransitionanim, "run" );
if ( animhasnotetrack( self.startmovetransitionanim, "code_move" ) )
{
animscripts\shared::donotetracks( "move" );
self orientmode( "face motion" );
self animmode( "none", 0 );
}
animscripts\shared::donotetracks( "move" );
}
str( var_0 )
{
if ( !isdefined( var_0 ) )
return "{undefined}";
return var_0;
}
drawvec( var_0, var_1, var_2, var_3 )
{
for ( var_4 = 0; var_4 < var_2 * 100; var_4++ )
wait 0.05;
}
drawapproachvec( var_0 )
{
self endon( "killanimscript" );
for (;;)
{
if ( !isdefined( self.node ) )
break;
wait 0.05;
}
}
getarrivalstartpos( var_0, var_1, var_2, var_3 )
{
var_4 = ( 0, var_1 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_2, var_3 ), 0 );
var_5 = anglestoforward( var_4 );
var_6 = anglestoright( var_4 );
var_7 = animscripts\utility::lookuptransitionanim( "cover_trans_dist", var_2, var_3 );
var_8 = var_5 * var_7[0];
var_9 = var_6 * var_7[1];
return var_0 - var_8 + var_9;
}
getarrivalprestartpos( var_0, var_1, var_2, var_3 )
{
var_4 = ( 0, var_1 - animscripts\utility::lookuptransitionanim( "cover_trans_angles", var_2, var_3 ), 0 );
var_5 = anglestoforward( var_4 );
var_6 = anglestoright( var_4 );
var_7 = animscripts\utility::lookuptransitionanim( "cover_trans_predist", var_2, var_3 );
var_8 = var_5 * var_7[0];
var_9 = var_6 * var_7[1];
return var_0 - var_8 + var_9;
}
checkcoverenterpos( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = getarrivalstartpos( var_0, var_1, var_2, var_3 );
self.coverenterpos = var_5;
if ( var_3 <= 6 && var_4 )
return 1;
if ( !self maymovefrompointtopoint( var_5, var_0 ) )
return 0;
if ( var_3 <= 6 || isdefined( anim.exposedtransition[var_2] ) )
return 1;
var_6 = getarrivalprestartpos( var_5, var_1, var_2, var_3 );
self.coverenterpos = var_6;
return self maymovefrompointtopoint( var_6, var_5 );
}
usereadystand()
{
if ( !isdefined( anim.readystand_anims_inited ) )
return 0;
if ( !anim.readystand_anims_inited )
return 0;
if ( !isdefined( self.busereadyidle ) )
return 0;
if ( !self.busereadyidle )
return 0;
return 1;
}
debug_arrivals_on_actor()
{
return 0;
}
debug_arrival( var_0 )
{
if ( !debug_arrivals_on_actor() )
return;
}

View File

@ -0,0 +1,841 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main( var_0 )
{
self.couldntseeenemypos = self.origin;
var_1 = gettime();
var_2 = spawnstruct();
var_2.nextallowedlooktime = var_1 - 1;
var_2.nextallowedsuppresstime = var_1 - 1;
resetlookforbettercovertime();
resetrespondtodeathtime();
self.seekoutenemytime = gettime();
self.a.lastencountertime = var_1;
self.a.idlingatcover = 0;
self.a.movement = "stop";
self.meleecoverchargemintime = var_1 + 3000;
thread watchsuppression();
var_3 = gettime() > 2500;
for (;;)
{
if ( isdefined( self.cover ) && isdefined( self.cover.fnoverlord ) )
{
var_4 = gettime();
thread endidleatframeend();
[[ self.cover.fnoverlord ]]();
if ( gettime() == var_4 )
self notify( "dont_end_idle" );
}
if ( animscripts\combat_utility::shouldhelpadvancingteammate() )
{
if ( animscripts\combat_utility::tryrunningtoenemy( 1 ) )
{
wait 0.05;
continue;
}
}
if ( isdefined( var_0.mainloopstart ) )
{
var_4 = gettime();
thread endidleatframeend();
[[ var_0.mainloopstart ]]();
if ( gettime() == var_4 )
self notify( "dont_end_idle" );
}
if ( isdefined( var_0.movetonearbycover ) )
{
if ( [[ var_0.movetonearbycover ]]() )
continue;
}
if ( animscripts\utility::isspaceai() )
self safeteleport( self.covernode.origin );
else
self safeteleport( self.covernode.origin, getcorrectcoverangles() );
if ( !var_3 )
{
idle( var_0, 0.05 + randomfloat( 1.5 ) );
var_3 = 1;
continue;
}
if ( dononattackcoverbehavior( var_0 ) )
continue;
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( trythrowinggrenade( var_0, level.player ) )
continue;
}
if ( respondtodeadteammate() )
return;
var_5 = 0;
var_6 = 0;
if ( isalive( self.enemy ) )
{
var_5 = isenemyvisiblefromexposed();
var_6 = animscripts\utility::cansuppressenemyfromexposed();
}
if ( var_5 )
{
if ( self.a.getboredofthisnodetime < gettime() )
{
if ( animscripts\combat_utility::lookforbettercover() )
return;
}
attackvisibleenemy( var_0 );
continue;
}
if ( isdefined( self.aggressivemode ) || enemyishiding() )
{
if ( advanceonhidingenemy() )
return;
}
if ( var_6 )
{
attacksuppressableenemy( var_0, var_2 );
continue;
}
if ( attacknothingtodo( var_0, var_2 ) )
return;
}
}
#using_animtree("generic_human");
end_script( var_0 )
{
self.turntomatchnode = undefined;
self.a.prevattack = undefined;
if ( isdefined( self.meleecoverchargemintime ) && self.meleecoverchargemintime <= gettime() )
{
self.meleecoverchargegraceendtime = gettime() + 5000;
self.meleecoverchargemintime = undefined;
}
self clearanim( %head, 0.2 );
self.facialidx = undefined;
}
getcorrectcoverangles()
{
if ( self.swimmer )
return animscripts\swim::getnodeforwardangles( self.covernode );
var_0 = ( self.covernode.angles[0], animscripts\utility::getnodeforwardyaw( self.covernode ), self.covernode.angles[2] );
return var_0;
}
respondtodeadteammate()
{
if ( self atdangerousnode() && self.a.respondtodeathtime < gettime() )
{
if ( animscripts\combat_utility::lookforbettercover() )
return 1;
self.a.respondtodeathtime = gettime() + 30000;
}
return 0;
}
dononattackcoverbehavior( var_0 )
{
if ( suppressedbehavior( var_0 ) )
{
if ( isenemyvisiblefromexposed() )
resetseekoutenemytime();
self.a.lastencountertime = gettime();
return 1;
}
if ( coverreload( var_0, 0 ) )
return 1;
return 0;
}
attackvisibleenemy( var_0 )
{
if ( distancesquared( self.origin, self.enemy.origin ) > 562500 )
{
if ( trythrowinggrenade( var_0, self.enemy ) )
return;
}
if ( leavecoverandshoot( var_0, "normal" ) )
{
resetseekoutenemytime();
self.a.lastencountertime = gettime();
}
else
idle( var_0 );
}
attacksuppressableenemy( var_0, var_1 )
{
if ( self.doingambush )
{
if ( leavecoverandshoot( var_0, "ambush" ) )
return;
}
else if ( self.providecoveringfire || gettime() >= var_1.nextallowedsuppresstime )
{
var_2 = "suppress";
if ( !self.providecoveringfire && gettime() - self.lastsuppressiontime > 5000 && randomint( 3 ) < 2 )
var_2 = "ambush";
else if ( !animscripts\shoot_behavior::shouldsuppress() )
var_2 = "ambush";
if ( leavecoverandshoot( var_0, var_2 ) )
{
var_1.nextallowedsuppresstime = gettime() + randomintrange( 3000, 20000 );
if ( isenemyvisiblefromexposed() )
self.a.lastencountertime = gettime();
return;
}
}
if ( trythrowinggrenade( var_0, self.enemy ) )
return;
idle( var_0 );
}
attacknothingtodo( var_0, var_1 )
{
if ( coverreload( var_0, 0.1 ) )
return 0;
if ( isdefined( self.enemy ) )
{
if ( trythrowinggrenade( var_0, self.enemy ) )
return 0;
}
if ( !self.doingambush && gettime() >= var_1.nextallowedlooktime )
{
if ( lookforenemy( var_0 ) )
{
var_1.nextallowedlooktime = gettime() + randomintrange( 4000, 15000 );
return 0;
}
}
if ( gettime() > self.a.getboredofthisnodetime )
{
if ( cantfindanythingtodo() )
return 1;
}
if ( self.doingambush || gettime() >= var_1.nextallowedsuppresstime && isdefined( self.enemy ) )
{
if ( leavecoverandshoot( var_0, "ambush" ) )
{
if ( isenemyvisiblefromexposed() )
resetseekoutenemytime();
self.a.lastencountertime = gettime();
var_1.nextallowedsuppresstime = gettime() + randomintrange( 6000, 20000 );
return 0;
}
}
idle( var_0 );
return 0;
}
isenemyvisiblefromexposed()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( distancesquared( self.enemy.origin, self.couldntseeenemypos ) < 256 )
return 0;
else
return animscripts\utility::canseeenemyfromexposed();
}
suppressedbehavior( var_0 )
{
if ( !animscripts\utility::issuppressedwrapper() )
return 0;
var_1 = gettime();
var_2 = 1;
while ( animscripts\utility::issuppressedwrapper() )
{
var_2 = 0;
self safeteleport( self.covernode.origin );
var_3 = 1;
if ( isdefined( self.favor_blindfire ) )
var_3 = common_scripts\utility::cointoss();
if ( var_3 )
{
if ( trytogetoutofdangeroussituation( var_0 ) )
{
self notify( "killanimscript" );
return 1;
}
}
if ( self.a.atconcealmentnode && animscripts\utility::canseeenemy() )
return 0;
if ( isenemyvisiblefromexposed() || animscripts\utility::cansuppressenemyfromexposed() )
{
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( trythrowinggrenade( var_0, level.player ) )
continue;
}
if ( coverreload( var_0, 0 ) )
continue;
if ( self.team != "allies" && gettime() >= var_1 )
{
if ( blindfire( var_0 ) )
{
var_1 = gettime();
if ( !isdefined( self.favor_blindfire ) )
var_1 = var_1 + randomintrange( 3000, 12000 );
continue;
}
}
if ( trythrowinggrenade( var_0, self.enemy ) )
{
var_2 = 1;
continue;
}
}
if ( coverreload( var_0, 0.1 ) )
continue;
idle( var_0 );
}
if ( !var_2 && randomint( 2 ) == 0 )
lookfast( var_0 );
return 1;
}
getpermutation( var_0 )
{
var_1 = [];
if ( var_0 == 1 )
var_1[0] = 0;
else if ( var_0 == 2 )
{
var_1[0] = randomint( 2 );
var_1[1] = 1 - var_1[0];
}
else
{
for ( var_2 = 0; var_2 < var_0; var_2++ )
var_1[var_2] = var_2;
for ( var_2 = 0; var_2 < var_0; var_2++ )
{
var_3 = var_2 + randomint( var_0 - var_2 );
var_4 = var_1[var_3];
var_1[var_3] = var_1[var_2];
var_1[var_2] = var_4;
}
}
return var_1;
}
calloptionalbehaviorcallback( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_0 ) )
return 0;
thread endidleatframeend();
var_4 = gettime();
var_5 = undefined;
if ( isdefined( var_3 ) )
var_5 = [[ var_0 ]]( var_1, var_2, var_3 );
else if ( isdefined( var_2 ) )
var_5 = [[ var_0 ]]( var_1, var_2 );
else if ( isdefined( var_1 ) )
var_5 = [[ var_0 ]]( var_1 );
else
var_5 = [[ var_0 ]]();
if ( !var_5 )
self notify( "dont_end_idle" );
return var_5;
}
watchsuppression()
{
self endon( "killanimscript" );
self.lastsuppressiontime = gettime() - 100000;
self.suppressionstart = self.lastsuppressiontime;
for (;;)
{
self waittill( "suppression" );
var_0 = gettime();
if ( self.lastsuppressiontime < var_0 - 700 )
self.suppressionstart = var_0;
self.lastsuppressiontime = var_0;
}
}
coverreload( var_0, var_1 )
{
if ( self.bulletsinclip > weaponclipsize( self.weapon ) * var_1 )
return 0;
self.isreloading = 1;
var_2 = calloptionalbehaviorcallback( var_0.reload );
self.isreloading = 0;
return var_2;
}
leavecoverandshoot( var_0, var_1 )
{
thread animscripts\shoot_behavior::decidewhatandhowtoshoot( var_1 );
if ( !self.fixednode && !self.doingambush )
thread breakoutofshootingifwanttomoveup();
var_2 = calloptionalbehaviorcallback( var_0.leavecoverandshoot );
self notify( "stop_deciding_how_to_shoot" );
return var_2;
}
lookforenemy( var_0 )
{
if ( self.a.atconcealmentnode && animscripts\utility::canseeenemy() )
return 0;
if ( self.a.lastencountertime + 6000 > gettime() )
return lookfast( var_0 );
else
{
var_1 = calloptionalbehaviorcallback( var_0.look, 2 + randomfloat( 2 ) );
if ( var_1 )
return 1;
return calloptionalbehaviorcallback( var_0.fastlook );
}
}
lookfast( var_0 )
{
var_1 = calloptionalbehaviorcallback( var_0.fastlook );
if ( var_1 )
return 1;
return calloptionalbehaviorcallback( var_0.look, 0 );
}
idle( var_0, var_1 )
{
self.flinching = 0;
if ( isdefined( var_0.flinch ) )
{
if ( !self.a.idlingatcover && gettime() - self.suppressionstart < 600 )
{
if ( [[ var_0.flinch ]]() )
return 1;
}
else
thread flinchwhensuppressed( var_0 );
}
if ( !self.a.idlingatcover )
{
thread idlethread( var_0.idle );
self.a.idlingatcover = 1;
}
if ( isdefined( var_1 ) )
idlewait( var_1 );
else
idlewaitabit();
if ( self.flinching )
self waittill( "flinch_done" );
self notify( "stop_waiting_to_flinch" );
}
idlewait( var_0 )
{
self endon( "end_idle" );
wait( var_0 );
}
idlewaitabit()
{
self endon( "end_idle" );
wait( 0.3 + randomfloat( 0.1 ) );
self waittill( "do_slow_things" );
}
idlethread( var_0 )
{
self endon( "killanimscript" );
self [[ var_0 ]]();
}
flinchwhensuppressed( var_0 )
{
self endon( "killanimscript" );
self endon( "stop_waiting_to_flinch" );
var_1 = self.lastsuppressiontime;
for (;;)
{
self waittill( "suppression" );
var_2 = gettime();
if ( var_1 < var_2 - 2000 )
break;
var_1 = var_2;
}
self.flinching = 1;
thread endidleatframeend();
var_3 = [[ var_0.flinch ]]();
if ( !var_3 )
self notify( "dont_end_idle" );
self.flinching = 0;
self notify( "flinch_done" );
}
endidleatframeend()
{
self endon( "killanimscript" );
self endon( "dont_end_idle" );
waittillframeend;
if ( !isdefined( self ) )
return;
self notify( "end_idle" );
self.a.idlingatcover = 0;
}
trythrowinggrenade( var_0, var_1 )
{
var_2 = anglestoforward( self.angles );
var_3 = vectornormalize( var_1.origin - self.origin );
if ( vectordot( var_2, var_3 ) < 0 )
return 0;
if ( self.doingambush && !animscripts\utility::recentlysawenemy() )
return 0;
if ( animscripts\utility::ispartiallysuppressedwrapper() )
return calloptionalbehaviorcallback( var_0.grenadehidden, var_1 );
else
return calloptionalbehaviorcallback( var_0.grenade, var_1 );
}
blindfire( var_0 )
{
if ( !animscripts\utility::canblindfire() )
return 0;
return calloptionalbehaviorcallback( var_0.blindfire );
}
breakoutofshootingifwanttomoveup()
{
self endon( "killanimscript" );
self endon( "stop_deciding_how_to_shoot" );
for (;;)
{
if ( self.fixednode || self.doingambush )
return;
wait( 0.5 + randomfloat( 0.75 ) );
if ( !isdefined( self.enemy ) )
continue;
if ( enemyishiding() )
{
if ( advanceonhidingenemy() )
return;
}
if ( !animscripts\utility::recentlysawenemy() && !animscripts\utility::cansuppressenemy() )
{
if ( gettime() > self.a.getboredofthisnodetime )
{
if ( cantfindanythingtodo() )
return;
}
}
}
}
enemyishiding()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( self.enemy common_scripts\utility::isflashed() )
return 1;
if ( isplayer( self.enemy ) )
{
if ( isdefined( self.enemy.health ) && self.enemy.health < self.enemy.maxhealth )
return 1;
}
else if ( isai( self.enemy ) && self.enemy animscripts\utility::issuppressedwrapper() )
return 1;
if ( isdefined( self.enemy.isreloading ) && self.enemy.isreloading )
return 1;
return 0;
}
resetrespondtodeathtime()
{
self.a.respondtodeathtime = 0;
}
resetlookforbettercovertime()
{
var_0 = gettime();
if ( isdefined( self.didshufflemove ) && var_0 > self.a.getboredofthisnodetime )
self.a.getboredofthisnodetime = var_0 + randomintrange( 2000, 5000 );
else if ( isdefined( self.enemy ) )
{
var_1 = distance2d( self.origin, self.enemy.origin );
if ( var_1 < self.engagemindist )
{
self.a.getboredofthisnodetime = var_0 + randomintrange( 5000, 10000 );
return;
}
if ( var_1 > self.engagemaxdist && var_1 < self.goalradius )
{
self.a.getboredofthisnodetime = var_0 + randomintrange( 2000, 5000 );
return;
}
self.a.getboredofthisnodetime = var_0 + randomintrange( 10000, 15000 );
return;
return;
}
else
self.a.getboredofthisnodetime = var_0 + randomintrange( 5000, 15000 );
}
resetseekoutenemytime()
{
if ( isdefined( self.aggressivemode ) )
self.seekoutenemytime = gettime() + randomintrange( 500, 1000 );
else
self.seekoutenemytime = gettime() + randomintrange( 3000, 5000 );
}
cantfindanythingtodo()
{
return advanceonhidingenemy();
}
advanceonhidingenemy()
{
if ( self.fixednode || self.doingambush )
return 0;
if ( isdefined( self.aggressivemode ) && gettime() >= self.seekoutenemytime )
return animscripts\combat_utility::tryrunningtoenemy( 0 );
var_0 = 0;
if ( !isdefined( self.enemy ) || !self.enemy common_scripts\utility::isflashed() )
var_0 = animscripts\combat_utility::lookforbettercover();
if ( !var_0 && isdefined( self.enemy ) && !animscripts\utility::canseeenemyfromexposed() )
{
if ( gettime() >= self.seekoutenemytime )
return animscripts\combat_utility::tryrunningtoenemy( 0 );
}
return var_0;
}
trytogetoutofdangeroussituation( var_0 )
{
if ( isdefined( var_0.movetonearbycover ) )
{
if ( [[ var_0.movetonearbycover ]]() )
return 1;
}
return animscripts\combat_utility::lookforbettercover();
}
set_standing_turns()
{
var_0 = animscripts\utility::lookupanimarray( "exposed_turn" );
foreach ( var_3, var_2 in var_0 )
self.a.array[var_3] = var_2;
}
set_crouching_turns()
{
var_0 = animscripts\utility::lookupanimarray( "exposed_turn_crouch" );
foreach ( var_3, var_2 in var_0 )
self.a.array[var_3] = var_2;
}
set_swimming_turns()
{
self.a.array["turn_left_45"] = animscripts\swim::getswimanim( "turn_left_45" );
self.a.array["turn_left_90"] = animscripts\swim::getswimanim( "turn_left_90" );
self.a.array["turn_left_135"] = animscripts\swim::getswimanim( "turn_left_135" );
self.a.array["turn_left_180"] = animscripts\swim::getswimanim( "turn_left_180" );
self.a.array["turn_right_45"] = animscripts\swim::getswimanim( "turn_right_45" );
self.a.array["turn_right_90"] = animscripts\swim::getswimanim( "turn_right_90" );
self.a.array["turn_right_135"] = animscripts\swim::getswimanim( "turn_right_135" );
self.a.array["turn_right_180"] = animscripts\swim::getswimanim( "turn_right_180" );
}
turntomatchnodedirection( var_0 )
{
if ( isdefined( self.node ) )
{
var_1 = self.node;
var_2 = abs( angleclamp180( self.angles[1] - ( var_1.angles[1] + var_0 ) ) );
if ( self.a.pose == "stand" && var_1 gethighestnodestance() != "stand" )
{
if ( var_2 > 45 && var_2 < 90 )
self orientmode( "face angle", self.angles[1] );
else
self orientmode( "face current" );
var_3 = 1.5;
var_4 = getnotetracktimes( %exposed_stand_2_crouch, "anim_pose = \"crouch\"" )[0];
var_4 = min( 1, var_4 * 1.1 );
var_5 = var_4 * getanimlength( %exposed_stand_2_crouch ) / var_3;
self setflaggedanimknoballrestart( "crouchanim", %exposed_stand_2_crouch, %body, 1, 0.2, var_3 );
animscripts\notetracks::donotetracksfortime( var_5, "crouchanim" );
self clearanim( %body, 0.2 );
}
if ( animscripts\utility::isspaceai() )
{
self notify( "force_space_rotation_update", 0, 0 );
return;
}
else
self orientmode( "face angle", self.angles[1] );
var_6 = angleclamp180( self.angles[1] - ( var_1.angles[1] + var_0 ) );
if ( abs( var_6 ) > 45 )
{
if ( self.swimmer )
set_swimming_turns();
else if ( self.a.pose == "stand" )
set_standing_turns();
else
set_crouching_turns();
self.turnthreshold = 45;
self.turntomatchnode = 1;
animscripts\combat::turntofacerelativeyaw( var_6 );
self.turntomatchnode = undefined;
}
}
}
movetonearbycover()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( isdefined( self.didshufflemove ) )
{
self.didshufflemove = undefined;
return 0;
}
if ( !isdefined( self.node ) )
return 0;
if ( animscripts\utility::isnodecover3d( self.node ) )
return 0;
if ( randomint( 3 ) == 0 )
return 0;
if ( self.fixednode || self.doingambush || self.keepclaimednode || self.keepclaimednodeifvalid )
return 0;
if ( distancesquared( self.origin, self.node.origin ) > 256 )
return 0;
var_0 = self findshufflecovernode();
if ( isdefined( var_0 ) && var_0 != self.node && self usecovernode( var_0 ) )
{
self.shufflemove = 1;
self.shufflenode = var_0;
self.didshufflemove = 1;
wait 0.5;
return 1;
}
return 0;
}

View File

@ -0,0 +1,15 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_crouch" );
animscripts\cover_wall::cover_wall_think( "crouch" );
}
end_script()
{
self.covercrouchlean_aimmode = undefined;
animscripts\cover_behavior::end_script( "crouch" );
}

111
animscripts/cover_left.gsc Normal file
View File

@ -0,0 +1,111 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_cover_left()
{
var_0 = [];
var_0["alert_idle"] = %corner_standl_alert_idle;
var_0["alert_idle_twitch"] = [ %corner_standl_alert_twitch01, %corner_standl_alert_twitch02, %corner_standl_alert_twitch03, %corner_standl_alert_twitch04, %corner_standl_alert_twitch05, %corner_standl_alert_twitch06, %corner_standl_alert_twitch07 ];
var_0["alert_idle_flinch"] = [ %corner_standl_flinch ];
var_0["alert_to_A"] = [ %corner_standl_trans_alert_2_a ];
var_0["alert_to_B"] = [ %corner_standl_trans_alert_2_b_v2 ];
var_0["A_to_alert"] = [ %corner_standl_trans_a_2_alert_v2 ];
var_0["A_to_alert_reload"] = [];
var_0["A_to_B"] = [ %corner_standl_trans_a_2_b_v2 ];
var_0["B_to_alert"] = [ %corner_standl_trans_b_2_alert_v2 ];
var_0["B_to_alert_reload"] = [ %corner_standl_reload_b_2_alert ];
var_0["B_to_A"] = [ %corner_standl_trans_b_2_a_v2 ];
var_0["lean_to_alert"] = [ %cornerstndl_lean_2_alert ];
var_0["alert_to_lean"] = [ %cornerstndl_alert_2_lean ];
var_0["look"] = %corner_standl_look;
var_0["reload"] = [ %corner_standl_reload_v1 ];
var_0["grenade_exposed"] = %corner_standl_grenade_a;
var_0["grenade_safe"] = %corner_standl_grenade_b;
var_0["blind_fire"] = [ %corner_standl_blindfire_v1, %corner_standl_blindfire_v2 ];
var_0["alert_to_look"] = %corner_standl_alert_2_look;
var_0["look_to_alert"] = %corner_standl_look_2_alert;
var_0["look_to_alert_fast"] = %corner_standl_look_2_alert_fast_v1;
var_0["look_idle"] = %corner_standl_look_idle;
var_0["stance_change"] = %cornercrl_stand_2_alert;
var_0["lean_aim_down"] = %cornerstndl_lean_aim_2;
var_0["lean_aim_left"] = %cornerstndl_lean_aim_4;
var_0["lean_aim_straight"] = %cornerstndl_lean_aim_5;
var_0["lean_aim_right"] = %cornerstndl_lean_aim_6;
var_0["lean_aim_up"] = %cornerstndl_lean_aim_8;
var_0["lean_reload"] = %cornerstndl_lean_reload;
var_0["lean_idle"] = [ %cornerstndl_lean_idle ];
var_0["lean_single"] = %cornerstndl_lean_fire;
var_0["lean_fire"] = %cornerstndl_lean_auto;
anim.archetypes["soldier"]["cover_left_stand"] = var_0;
var_0 = [];
var_0["alert_idle"] = %cornercrl_alert_idle;
var_0["alert_idle_twitch"] = [];
var_0["alert_idle_flinch"] = [];
var_0["alert_to_A"] = [ %cornercrl_trans_alert_2_a ];
var_0["alert_to_B"] = [ %cornercrl_trans_alert_2_b ];
var_0["A_to_alert"] = [ %cornercrl_trans_a_2_alert ];
var_0["A_to_alert_reload"] = [];
var_0["A_to_B"] = [ %cornercrl_trans_a_2_b ];
var_0["B_to_alert"] = [ %cornercrl_trans_b_2_alert ];
var_0["B_to_alert_reload"] = [];
var_0["B_to_A"] = [ %cornercrl_trans_b_2_a ];
var_0["lean_to_alert"] = [ %cornercrl_lean_2_alert ];
var_0["alert_to_lean"] = [ %cornercrl_alert_2_lean ];
var_0["look"] = %cornercrl_look_fast;
var_0["reload"] = [ %cornercrl_reloada, %cornercrl_reloadb ];
var_0["grenade_safe"] = %cornercrl_grenadea;
var_0["grenade_exposed"] = %cornercrl_grenadeb;
var_0["alert_to_over"] = [ %cornercrl_alert_2_over ];
var_0["over_to_alert"] = [ %cornercrl_over_2_alert ];
var_0["over_to_alert_reload"] = [];
var_0["blind_fire"] = [];
var_0["rambo90"] = [];
var_0["rambo45"] = [];
var_0["stance_change"] = %cornercrl_alert_2_stand;
var_0["lean_aim_down"] = %cornercrl_lean_aim_2;
var_0["lean_aim_left"] = %cornercrl_lean_aim_4;
var_0["lean_aim_straight"] = %cornercrl_lean_aim_5;
var_0["lean_aim_right"] = %cornercrl_lean_aim_6;
var_0["lean_aim_up"] = %cornercrl_lean_aim_8;
var_0["lean_idle"] = [ %cornercrl_lean_idle ];
var_0["lean_single"] = %cornercrl_lean_fire;
var_0["lean_fire"] = %cornercrl_lean_auto;
anim.archetypes["soldier"]["cover_left_crouch"] = var_0;
}
main()
{
self.animarrayfuncs = [];
self.animarrayfuncs["hiding"]["stand"] = ::set_animarray_standing_left;
self.animarrayfuncs["hiding"]["crouch"] = ::set_animarray_crouching_left;
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_left" );
animscripts\corner::corner_think( "left", 90 );
}
end_script()
{
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "left" );
}
set_animarray_standing_left()
{
self.hideyawoffset = 90;
self.a.array = animscripts\utility::lookupanimarray( "cover_left_stand" );
if ( isdefined( anim.ramboanims ) )
{
self.a.array["rambo90"] = anim.ramboanims.coverleft90;
self.a.array["rambo45"] = anim.ramboanims.coverleft45;
self.a.array["grenade_rambo"] = anim.ramboanims.coverleftgrenade;
}
}
set_animarray_crouching_left()
{
self.hideyawoffset = 90;
self.a.array = animscripts\utility::lookupanimarray( "cover_left_crouch" );
}

343
animscripts/cover_multi.gsc Normal file
View File

@ -0,0 +1,343 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
if ( !isdefined( self.cover ) )
self.cover = spawnstruct();
self.cover.state = "none";
self.cover.laststatechangetime = 0;
self.cover.istatechange = 0;
self.cover.hidestate = covermulti_choosehidestate();
self.cover.fnoverlord = ::covermulti_think;
self.covernode = self.node;
covermulti_think();
}
end_script()
{
covermulti_exitstate( self.cover.state );
self.cover.fnoverlord = undefined;
self.cover.laststatechangetime = undefined;
self.cover.istatechange = undefined;
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "multi" );
}
covermulti_think()
{
if ( !isdefined( self.covernode ) )
return;
var_0 = self.covernode getvalidcoverpeekouts();
if ( isdefined( self.cover.arrivalnodetype ) )
{
if ( covermulti_isvaliddir( self.cover.arrivalnodetype, var_0 ) )
{
var_1 = covermulti_setdir( self.cover.arrivalnodetype );
self.cover.arrivalnodetype = undefined;
return;
}
}
if ( !isdefined( self.enemy ) )
{
covermulti_setdir( covermulti_getrandomvaliddir( var_0 ) );
return;
}
var_2 = self.covernode.origin;
var_3 = self.enemy.origin;
var_4 = var_3 - var_2;
var_5 = vectortoangles( var_4 );
var_6 = angleclamp180( var_5[1] - self.covernode.angles[1] );
var_7 = undefined;
if ( var_6 > 12 )
var_8 = [ "left", "over", "right" ];
else if ( var_6 < -12 )
var_8 = [ "right", "over", "left" ];
else if ( var_6 > 5 )
{
var_8 = [ [ "left", "over" ], "right" ];
var_7 = 15000;
}
else if ( var_6 < -5 )
{
var_8 = [ [ "right", "over" ], "left" ];
var_7 = 15000;
}
else
{
var_8 = [ "over", [ "right", "left" ] ];
var_7 = 15000;
}
var_9 = covermulti_getbestvaliddir( var_8, var_0 );
var_1 = covermulti_setdir( var_9, var_7 );
}
covermulti_isvaliddir( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = self.node getvalidcoverpeekouts();
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
if ( var_1[var_2] == var_0 )
return 1;
}
return 0;
}
covermulti_getbestvaliddir( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = self.node getvalidcoverpeekouts();
var_2 = [];
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
{
var_4 = var_0[var_3];
if ( !isarray( var_4 ) )
{
var_2[var_2.size] = var_4;
continue;
}
var_4 = common_scripts\utility::array_randomize( var_4 );
for ( var_5 = 0; var_5 < var_4.size; var_5++ )
var_2[var_2.size] = var_4[var_5];
}
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( covermulti_isvaliddir( var_2[var_3], var_1 ) )
return var_2[var_3];
}
}
covermulti_getrandomvaliddir( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = self.node getvalidcoverpeekouts();
var_1 = randomint( var_0.size );
return var_0[var_1];
}
covermulti_getnonrandomvaliddir( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = self getvalidcoverpeekouts();
if ( var_0[0] == "over" )
{
if ( self doesnodeallowstance( "stand" ) )
return "stand";
else
return "crouch";
}
return var_0[0];
}
covermulti_setdir( var_0, var_1 )
{
if ( var_0 == "over" )
{
var_2 = self.node doesnodeallowstance( "stand" );
var_3 = self.node doesnodeallowstance( "crouch" );
if ( var_2 )
{
if ( self.cover.state != "crouch" || !var_3 )
covermulti_setstate( "stand", var_1 );
return 1;
}
else if ( var_3 )
{
if ( self.cover.state != "stand" || !var_2 )
covermulti_setstate( "crouch", var_1 );
return 1;
}
else
{
}
}
else
{
covermulti_setstate( var_0, var_1 );
return 1;
}
return 0;
}
covermulti_setstate( var_0, var_1 )
{
if ( self.cover.state == var_0 )
return 0;
if ( !isdefined( var_1 ) || var_1 < 0 )
var_1 = 5000;
var_2 = gettime();
if ( self.cover.laststatechangetime > 0 && var_2 - self.cover.laststatechangetime < var_1 )
return 0;
self.cover.laststatechangetime = var_2;
thread covermulti_setstateinternal( var_0 );
return 1;
}
covermulti_setstateinternal( var_0 )
{
self notify( "killanimscript" );
var_1 = covermulti_choosehidestate();
covermulti_dotransition( self.cover.state, self.a.pose, self.cover.hidestate, var_0, self.a.pose, var_1 );
covermulti_exitstate( self.cover.state );
self.cover.state = var_0;
self.cover.hidestate = var_1;
covermulti_enterstate( self.cover.state );
}
covermulti_enterstate( var_0 )
{
if ( var_0 == "left" )
animscripts\cover_left::main();
else if ( var_0 == "right" )
animscripts\cover_right::main();
else if ( var_0 == "stand" )
animscripts\cover_stand::main();
else if ( var_0 == "crouch" )
animscripts\cover_crouch::main();
else
{
}
}
covermulti_exitstate( var_0 )
{
switch ( var_0 )
{
case "left":
animscripts\cover_left::end_script();
break;
case "right":
animscripts\cover_right::end_script();
break;
case "stand":
animscripts\cover_stand::end_script();
break;
case "crouch":
animscripts\cover_crouch::end_script();
break;
}
}
#using_animtree("generic_human");
covermulti_dotransition( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self endon( "killanimscript" );
if ( var_0 == "none" || var_3 == "none" )
return;
var_6 = covermulti_getanimtransition( var_0, var_1, var_2, var_3, var_4, var_5 );
if ( !isdefined( var_6 ) )
return;
self setflaggedanimknoball( "cover_multi_trans", var_6, %body, 1, 0.2, 1 );
animscripts\shared::donotetracks( "cover_multi_trans" );
}
covermulti_choosehidestate()
{
if ( !isdefined( self.a.array ) || !isdefined( self.a.array["alert_idle_back"] ) )
return "forward";
if ( common_scripts\utility::cointoss() )
return "forward";
else
return "back";
}
covermulti_getstatefromdir( var_0, var_1 )
{
if ( var_1 == "left" || var_1 == "right" )
return var_1;
if ( var_0 doesnodeallowstance( "stand" ) )
return "stand";
return "crouch";
}
covermulti_getanimtransition( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( var_2 == "back" )
var_6 = var_1 + "_back";
else if ( var_0 == "stand" || var_0 == "crouch" )
var_6 = var_0 + "_forward";
else
var_6 = var_0 + "_" + var_1;
var_6 = var_6 + "_to_";
if ( var_5 == "back" )
var_6 = var_6 + ( var_4 + "_back" );
else if ( var_3 == "stand" || var_3 == "crouch" )
var_6 = var_6 + ( var_3 + "_forward" );
else
var_6 = var_6 + ( var_3 + "_" + var_4 );
var_7 = self.animarchetype;
if ( !isdefined( var_7 ) || !isdefined( anim.archetypes[var_7]["cover_multi"] ) )
var_7 = "soldier";
return anim.archetypes[var_7]["cover_multi"][var_6];
}
init_animset_cover_multi()
{
var_0 = [];
var_0["stand"] = [];
var_0["stand"]["trans"] = [];
var_0["stand"]["trans"]["left_stand"] = [];
var_0["stand"]["trans"]["left_crouch"] = [];
var_0["stand"]["trans"]["right_stand"] = [];
var_0["stand"]["trans"]["right_crouch"] = [];
var_0["stand"]["trans"]["front_stand"] = [];
var_0["stand"]["trans"]["front_crouch"] = [];
var_0["stand"]["trans"]["back_stand"] = [];
var_0["stand"]["trans"]["back_crouch"] = [];
var_0["left_stand_to_right_stand"] = undefined;
var_0["left_stand_to_right_crouch"] = undefined;
var_0["left_stand_to_stand_back"] = undefined;
var_0["left_stand_to_stand_forward"] = undefined;
var_0["left_stand_to_crouch_back"] = undefined;
var_0["left_stand_to_crouch_forward"] = undefined;
var_0["left_crouch_to_right_stand"] = undefined;
var_0["left_crouch_to_right_crouch"] = undefined;
var_0["left_crouch_to_stand_back"] = undefined;
var_0["left_crouch_to_stand_forward"] = undefined;
var_0["left_crouch_to_crouch_back"] = undefined;
var_0["left_crouch_to_crouch_forward"] = undefined;
var_0["crouch"] = [];
anim.archetypes["soldier"]["cover_multi"] = var_0;
}

293
animscripts/cover_prone.gsc Normal file
View File

@ -0,0 +1,293 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_cover_prone()
{
var_0 = [];
var_0["straight_level"] = %prone_aim_5;
var_0["legs_up"] = %prone_aim_feet_45up;
var_0["legs_down"] = %prone_aim_feet_45down;
var_0["fire"] = %prone_fire_1;
var_0["semi2"] = %prone_fire_burst;
var_0["semi3"] = %prone_fire_burst;
var_0["semi4"] = %prone_fire_burst;
var_0["semi5"] = %prone_fire_burst;
var_0["single"] = [ %prone_fire_1 ];
var_0["burst2"] = %prone_fire_burst;
var_0["burst3"] = %prone_fire_burst;
var_0["burst4"] = %prone_fire_burst;
var_0["burst5"] = %prone_fire_burst;
var_0["burst6"] = %prone_fire_burst;
var_0["reload"] = %prone_reload;
var_0["look"] = [ %prone_twitch_look, %prone_twitch_lookfast, %prone_twitch_lookup ];
var_0["grenade_safe"] = [ %prone_grenade_a, %prone_grenade_a ];
var_0["grenade_exposed"] = [ %prone_grenade_a, %prone_grenade_a ];
var_0["exposed_idle"] = [ %prone_idle ];
var_0["twitch"] = [ %prone_twitch_ammocheck, %prone_twitch_look, %prone_twitch_scan, %prone_twitch_lookfast, %prone_twitch_lookup ];
var_0["hide_to_look"] = %coverstand_look_moveup;
var_0["look_idle"] = %coverstand_look_idle;
var_0["look_to_hide"] = %coverstand_look_movedown;
var_0["look_to_hide_fast"] = %coverstand_look_movedown_fast;
var_0["stand_2_prone"] = %stand_2_prone_nodelta;
var_0["crouch_2_prone"] = %crouch_2_prone;
var_0["prone_2_stand"] = %prone_2_stand_nodelta;
var_0["prone_2_crouch"] = %prone_2_crouch;
var_0["stand_2_prone_firing"] = %stand_2_prone_firing;
var_0["crouch_2_prone_firing"] = %crouch_2_prone_firing;
var_0["prone_2_stand_firing"] = %prone_2_stand_firing;
var_0["prone_2_crouch_firing"] = %prone_2_crouch_firing;
anim.archetypes["soldier"]["cover_prone"] = var_0;
}
main()
{
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_prone" );
if ( weaponclass( self.weapon ) == "rocketlauncher" )
{
animscripts\combat::main();
return;
}
if ( isdefined( self.a.arrivaltype ) && self.a.arrivaltype == "prone_saw" )
animscripts\cover_wall::useselfplacedturret( "saw_bipod_prone", "weapon_saw_MG_Setup" );
else if ( isdefined( self.node.turret ) )
animscripts\cover_wall::usestationaryturret();
if ( isdefined( self.enemy ) && lengthsquared( self.origin - self.enemy.origin ) < squared( 512 ) )
{
thread animscripts\combat::main();
return;
}
setup_cover_prone();
self.covernode = self.node;
self orientmode( "face angle", self.covernode.angles[1] );
self.a.goingtoproneaim = 1;
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_modern, %prone_legs_up );
if ( self.a.pose != "prone" )
prone_transitionto( "prone" );
else
animscripts\utility::enterpronewrapper( 0 );
thread animscripts\combat_utility::aimidlethread();
setupproneaim( 0.2 );
self setanim( %prone_aim_5, 1, 0.1 );
self orientmode( "face angle", self.covernode.angles[1] );
self animmode( "zonly_physics" );
pronecombatmainloop();
self notify( "stop_deciding_how_to_shoot" );
}
end_script()
{
self.a.goingtoproneaim = undefined;
}
idlethread()
{
self endon( "killanimscript" );
self endon( "kill_idle_thread" );
for (;;)
{
var_0 = animscripts\utility::animarraypickrandom( "prone_idle" );
self setflaggedanimlimited( "idle", var_0 );
self waittillmatch( "idle", "end" );
self clearanim( var_0, 0.2 );
}
}
updatepronewrapper( var_0 )
{
self updateprone( animscripts\utility::lookupanim( "cover_prone", "legs_up" ), animscripts\utility::lookupanim( "cover_prone", "legs_down" ), 1, var_0, 1 );
self setanim( %exposed_aiming, 1, 0.2 );
}
pronecombatmainloop()
{
self endon( "killanimscript" );
thread animscripts\track::trackshootentorpos();
thread animscripts\shoot_behavior::decidewhatandhowtoshoot( "normal" );
var_0 = gettime() > 2500;
for (;;)
{
animscripts\utility::updateisincombattimer();
updatepronewrapper( 0.05 );
if ( !var_0 )
{
wait( 0.05 + randomfloat( 1.5 ) );
var_0 = 1;
continue;
}
if ( !isdefined( self.shootpos ) )
{
if ( considerthrowgrenade() )
continue;
wait 0.05;
continue;
}
var_1 = lengthsquared( self.origin - self.shootpos );
if ( self.a.pose != "crouch" && self isstanceallowed( "crouch" ) && var_1 < squared( 400 ) )
{
if ( var_1 < squared( 285 ) )
{
prone_transitionto( "crouch" );
thread animscripts\combat::main();
return;
}
}
if ( considerthrowgrenade() )
continue;
if ( pronereload( 0 ) )
continue;
if ( animscripts\combat_utility::aimedatshootentorpos() )
{
animscripts\combat_utility::shootuntilshootbehaviorchange();
self clearanim( %add_fire, 0.2 );
continue;
}
wait 0.05;
}
}
pronereload( var_0 )
{
return animscripts\combat_utility::reload( var_0, animscripts\utility::animarray( "reload" ) );
}
setup_cover_prone()
{
self setdefaultaimlimits( self.node );
self.a.array = animscripts\utility::lookupanimarray( "cover_prone" );
}
trythrowinggrenade( var_0, var_1 )
{
var_2 = undefined;
if ( isdefined( var_1 ) && var_1 )
var_2 = animscripts\utility::animarraypickrandom( "grenade_safe" );
else
var_2 = animscripts\utility::animarraypickrandom( "grenade_exposed" );
self animmode( "zonly_physics" );
self.keepclaimednodeifvalid = 1;
var_3 = ( 32, 20, 64 );
var_4 = animscripts\combat_utility::trygrenade( var_0, var_2 );
self.keepclaimednodeifvalid = 0;
return var_4;
}
considerthrowgrenade()
{
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( trythrowinggrenade( level.player, 200 ) )
return 1;
}
if ( isdefined( self.enemy ) )
return trythrowinggrenade( self.enemy, 850 );
return 0;
}
shouldfirewhilechangingpose()
{
if ( !isdefined( self.weapon ) || !weaponisauto( self.weapon ) )
return 0;
if ( isdefined( self.node ) && distancesquared( self.origin, self.node.origin ) < 256 )
return 0;
if ( isdefined( self.enemy ) && self cansee( self.enemy ) && !isdefined( self.grenade ) && animscripts\shared::getaimyawtoshootentorpos() < 20 )
return animscripts\move::mayshootwhilemoving();
return 0;
}
prone_transitionto( var_0 )
{
if ( var_0 == self.a.pose )
return;
self clearanim( %root, 0.3 );
animscripts\combat_utility::endfireandanimidlethread();
if ( shouldfirewhilechangingpose() )
var_1 = animscripts\utility::animarray( self.a.pose + "_2_" + var_0 + "_firing" );
else
var_1 = animscripts\utility::animarray( self.a.pose + "_2_" + var_0 );
if ( var_0 == "prone" )
{
}
self setflaggedanimknoballrestart( "trans", var_1, %body, 1, 0.2, 1.0 );
animscripts\shared::donotetracks( "trans" );
self setanimknoballrestart( animscripts\utility::animarray( "straight_level" ), %body, 1, 0.25 );
setupproneaim( 0.25 );
}
finishnotetracks( var_0 )
{
self endon( "killanimscript" );
animscripts\shared::donotetracks( var_0 );
}
setupproneaim( var_0 )
{
self setanimknoball( %prone_aim_5, %body, 1, var_0 );
self setanimlimited( %prone_aim_2_add, 1, var_0 );
self setanimlimited( %prone_aim_4_add, 1, var_0 );
self setanimlimited( %prone_aim_6_add, 1, var_0 );
self setanimlimited( %prone_aim_8_add, 1, var_0 );
}
proneto( var_0, var_1 )
{
self clearanim( %root, 0.3 );
var_2 = undefined;
if ( shouldfirewhilechangingpose() )
{
if ( var_0 == "crouch" )
var_2 = %prone_2_crouch_firing;
else if ( var_0 == "stand" )
var_2 = %prone_2_stand_firing;
}
else if ( var_0 == "crouch" )
var_2 = %prone_2_crouch;
else if ( var_0 == "stand" )
var_2 = %prone_2_stand_nodelta;
if ( isdefined( self.prone_anim_override ) )
var_2 = self.prone_anim_override;
if ( isdefined( self.prone_rate_override ) )
var_1 = self.prone_rate_override;
if ( !isdefined( var_1 ) )
var_1 = 1;
animscripts\utility::exitpronewrapper( getanimlength( var_2 ) / 2 );
self setflaggedanimknoballrestart( "trans", var_2, %body, 1, 0.2, var_1 );
animscripts\shared::donotetracks( "trans" );
self clearanim( var_2, 0.1 );
}

114
animscripts/cover_right.gsc Normal file
View File

@ -0,0 +1,114 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_cover_right()
{
var_0 = [];
var_0["alert_idle"] = %corner_standr_alert_idle;
var_0["alert_idle_twitch"] = [ %corner_standr_alert_twitch01, %corner_standr_alert_twitch02, %corner_standr_alert_twitch04, %corner_standr_alert_twitch05, %corner_standr_alert_twitch06, %corner_standr_alert_twitch07 ];
var_0["alert_idle_flinch"] = [ %corner_standr_flinch, %corner_standr_flinchb ];
var_0["alert_to_A"] = [ %corner_standr_trans_alert_2_a, %corner_standr_trans_alert_2_a_v2 ];
var_0["alert_to_B"] = [ %corner_standr_trans_alert_2_b, %corner_standr_trans_alert_2_b_v2, %corner_standr_trans_alert_2_b_v3 ];
var_0["A_to_alert"] = [ %corner_standr_trans_a_2_alert_v2 ];
var_0["A_to_alert_reload"] = [];
var_0["A_to_B"] = [ %corner_standr_trans_a_2_b, %corner_standr_trans_a_2_b_v2 ];
var_0["B_to_alert"] = [ %corner_standr_trans_b_2_alert, %corner_standr_trans_b_2_alert_v2, %corner_standr_trans_b_2_alert_v3 ];
var_0["B_to_alert_reload"] = [ %corner_standr_reload_b_2_alert ];
var_0["B_to_A"] = [ %corner_standr_trans_b_2_a, %corner_standr_trans_b_2_a_v2 ];
var_0["lean_to_alert"] = [ %cornerstndr_lean_2_alert ];
var_0["alert_to_lean"] = [ %cornerstndr_alert_2_lean ];
var_0["look"] = %corner_standr_look;
var_0["reload"] = [ %corner_standr_reload_v1 ];
var_0["grenade_exposed"] = %corner_standr_grenade_a;
var_0["grenade_safe"] = %corner_standr_grenade_b;
var_0["blind_fire"] = [ %corner_standr_blindfire_v1, %corner_standr_blindfire_v2 ];
var_0["alert_to_look"] = %corner_standr_alert_2_look;
var_0["look_to_alert"] = %corner_standr_look_2_alert;
var_0["look_to_alert_fast"] = %corner_standr_look_2_alert_fast;
var_0["look_idle"] = %corner_standr_look_idle;
var_0["stance_change"] = %cornercrr_stand_2_alert;
var_0["lean_aim_down"] = %cornerstndr_lean_aim_2;
var_0["lean_aim_left"] = %cornerstndr_lean_aim_4;
var_0["lean_aim_straight"] = %cornerstndr_lean_aim_5;
var_0["lean_aim_right"] = %cornerstndr_lean_aim_6;
var_0["lean_aim_up"] = %cornerstndr_lean_aim_8;
var_0["lean_reload"] = %cornerstndr_lean_reload;
var_0["lean_idle"] = [ %cornerstndr_lean_idle ];
var_0["lean_single"] = %cornerstndr_lean_fire;
var_0["lean_fire"] = %cornerstndr_lean_auto;
anim.archetypes["soldier"]["cover_right_stand"] = var_0;
var_0 = [];
var_0["alert_idle"] = %cornercrr_alert_idle;
var_0["alert_idle_twitch"] = [ %cornercrr_alert_twitch_v1, %cornercrr_alert_twitch_v2, %cornercrr_alert_twitch_v3 ];
var_0["alert_idle_flinch"] = [];
var_0["alert_to_A"] = [ %cornercrr_trans_alert_2_a ];
var_0["alert_to_B"] = [ %cornercrr_trans_alert_2_b ];
var_0["A_to_alert"] = [ %cornercrr_trans_a_2_alert ];
var_0["A_to_alert_reload"] = [];
var_0["A_to_B"] = [ %cornercrr_trans_a_2_b ];
var_0["B_to_alert"] = [ %cornercrr_trans_b_2_alert ];
var_0["B_to_alert_reload"] = [];
var_0["B_to_A"] = [ %cornercrr_trans_b_2_a ];
var_0["lean_to_alert"] = [ %cornercrr_lean_2_alert ];
var_0["alert_to_lean"] = [ %cornercrr_alert_2_lean ];
var_0["reload"] = [ %cornercrr_reloada, %cornercrr_reloadb ];
var_0["grenade_exposed"] = %cornercrr_grenadea;
var_0["grenade_safe"] = %cornercrr_grenadea;
var_0["alert_to_over"] = [ %cornercrr_alert_2_over ];
var_0["over_to_alert"] = [ %cornercrr_over_2_alert ];
var_0["over_to_alert_reload"] = [];
var_0["blind_fire"] = [];
var_0["rambo90"] = [];
var_0["rambo45"] = [];
var_0["alert_to_look"] = %cornercrr_alert_2_look;
var_0["look_to_alert"] = %cornercrr_look_2_alert;
var_0["look_to_alert_fast"] = %cornercrr_look_2_alert_fast;
var_0["look_idle"] = %cornercrr_look_idle;
var_0["stance_change"] = %cornercrr_alert_2_stand;
var_0["lean_aim_down"] = %cornercrr_lean_aim_2;
var_0["lean_aim_left"] = %cornercrr_lean_aim_4;
var_0["lean_aim_straight"] = %cornercrr_lean_aim_5;
var_0["lean_aim_right"] = %cornercrr_lean_aim_6;
var_0["lean_aim_up"] = %cornercrr_lean_aim_8;
var_0["lean_idle"] = [ %cornercrr_lean_idle ];
var_0["lean_single"] = %cornercrr_lean_fire;
var_0["lean_fire"] = %cornercrr_lean_auto;
anim.archetypes["soldier"]["cover_right_crouch"] = var_0;
}
main()
{
self.animarrayfuncs = [];
self.animarrayfuncs["hiding"]["stand"] = ::set_animarray_standing_right;
self.animarrayfuncs["hiding"]["crouch"] = ::set_animarray_crouching_right;
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_right" );
animscripts\corner::corner_think( "right", -90 );
}
end_script()
{
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "right" );
}
set_animarray_standing_right()
{
self.hideyawoffset = -90;
self.a.array = animscripts\utility::lookupanimarray( "cover_right_stand" );
if ( isdefined( anim.ramboanims ) )
{
self.a.array["rambo90"] = anim.ramboanims.coverright90;
self.a.array["rambo45"] = anim.ramboanims.coverright45;
self.a.array["grenade_rambo"] = anim.ramboanims.coverrightgrenade;
}
}
set_animarray_crouching_right()
{
self.hideyawoffset = -90;
self.a.array = animscripts\utility::lookupanimarray( "cover_right_crouch" );
}

View File

@ -0,0 +1,14 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_stand" );
animscripts\cover_wall::cover_wall_think( "stand" );
}
end_script()
{
animscripts\cover_behavior::end_script( "stand" );
}

View File

@ -0,0 +1,30 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self.animarrayfuncs = [];
self.animarrayfuncs["hiding"]["stand"] = ::setanims_coverleft_stand;
self.animarrayfuncs["hiding"]["crouch"] = ::setanims_coverleft_stand;
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_swim_left" );
if ( !isdefined( self.approachtype ) || self.approachtype != "cover_corner_l" )
self.approachtype = "cover_corner_l";
var_0 = anim.archetypes["soldier"]["swim"]["arrival_cover_corner_l_angleDelta"][4][4];
animscripts\corner::corner_think( "left", var_0[1] );
}
end_script()
{
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "left" );
}
setanims_coverleft_stand()
{
self.a.array = animscripts\swim::getswimanim( "cover_corner_l" );
var_0 = anim.archetypes["soldier"]["swim"]["arrival_cover_corner_l_angleDelta"][4][4];
self.hideyawoffset = var_0[1];
}

View File

@ -0,0 +1,30 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self.animarrayfuncs = [];
self.animarrayfuncs["hiding"]["stand"] = ::setanims_coverright_stand;
self.animarrayfuncs["hiding"]["crouch"] = ::setanims_coverright_stand;
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_swim_right" );
if ( !isdefined( self.approachtype ) || self.approachtype != "cover_corner_r" )
self.approachtype = "cover_corner_r";
var_0 = anim.archetypes["soldier"]["swim"]["arrival_cover_corner_r_angleDelta"][4][4];
animscripts\corner::corner_think( "right", var_0[1] );
}
end_script()
{
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "right" );
}
setanims_coverright_stand()
{
self.a.array = animscripts\swim::getswimanim( "cover_corner_r" );
var_0 = anim.archetypes["soldier"]["swim"]["arrival_cover_corner_r_angleDelta"][4][4];
self.hideyawoffset = var_0[1];
}

View File

@ -0,0 +1,28 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self.animarrayfuncs = [];
self.animarrayfuncs["hiding"]["stand"] = ::setanims_coverup_stand;
self.animarrayfuncs["hiding"]["crouch"] = ::setanims_coverup_stand;
self endon( "killanimscript" );
animscripts\utility::initialize( "cover_swim_up" );
if ( !isdefined( self.approachtype ) || self.approachtype != "cover_u" )
self.approachtype = "cover_u";
animscripts\corner::corner_think( "up", 0 );
}
end_script()
{
animscripts\corner::end_script_corner();
animscripts\cover_behavior::end_script( "up" );
}
setanims_coverup_stand()
{
self.a.array = animscripts\swim::getswimanim( "cover_u" );
self.hideyawoffset = 0;
}

839
animscripts/cover_wall.gsc Normal file
View File

@ -0,0 +1,839 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_cover_wall()
{
var_0 = [];
var_0["add_aim_up"] = %covercrouch_aim8_add;
var_0["add_aim_down"] = %covercrouch_aim2_add;
var_0["add_aim_left"] = %covercrouch_aim4_add;
var_0["add_aim_right"] = %covercrouch_aim6_add;
var_0["straight_level"] = %covercrouch_aim5;
var_0["hide_idle"] = %covercrouch_hide_idle;
var_0["hide_idle_twitch"] = animscripts\utility::array( %covercrouch_twitch_1, %covercrouch_twitch_2, %covercrouch_twitch_3, %covercrouch_twitch_4 );
var_0["hide_idle_flinch"] = animscripts\utility::array();
var_0["hide_2_crouch"] = %covercrouch_hide_2_aim;
var_0["hide_2_stand"] = %covercrouch_hide_2_stand;
var_0["hide_2_lean"] = %covercrouch_hide_2_lean;
var_0["hide_2_right"] = %covercrouch_hide_2_right;
var_0["hide_2_left"] = %covercrouch_hide_2_left;
var_0["crouch_2_hide"] = %covercrouch_aim_2_hide;
var_0["stand_2_hide"] = %covercrouch_stand_2_hide;
var_0["lean_2_hide"] = %covercrouch_lean_2_hide;
var_0["right_2_hide"] = %covercrouch_right_2_hide;
var_0["left_2_hide"] = %covercrouch_left_2_hide;
var_0["crouch_aim"] = %covercrouch_aim5;
var_0["stand_aim"] = %exposed_aim_5;
var_0["lean_aim"] = %covercrouch_lean_aim5;
var_0["fire"] = %exposed_shoot_auto_v2;
var_0["semi2"] = %exposed_shoot_semi2;
var_0["semi3"] = %exposed_shoot_semi3;
var_0["semi4"] = %exposed_shoot_semi4;
var_0["semi5"] = %exposed_shoot_semi5;
var_0["single"] = [ %exposed_shoot_semi1 ];
var_0["burst2"] = %exposed_shoot_burst3;
var_0["burst3"] = %exposed_shoot_burst3;
var_0["burst4"] = %exposed_shoot_burst4;
var_0["burst5"] = %exposed_shoot_burst5;
var_0["burst6"] = %exposed_shoot_burst6;
var_0["blind_fire"] = animscripts\utility::array( %covercrouch_blindfire_1, %covercrouch_blindfire_2, %covercrouch_blindfire_3, %covercrouch_blindfire_4 );
var_0["reload"] = %covercrouch_reload_hide;
var_0["grenade_safe"] = animscripts\utility::array( %covercrouch_grenadea, %covercrouch_grenadeb );
var_0["grenade_exposed"] = animscripts\utility::array( %covercrouch_grenadea, %covercrouch_grenadeb );
var_0["exposed_idle"] = animscripts\utility::array( %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 );
var_0["look"] = animscripts\utility::array( %covercrouch_hide_look );
anim.archetypes["soldier"]["cover_crouch"] = var_0;
var_0 = [];
var_0["add_aim_up"] = %coverstandaim_aim8_add;
var_0["add_aim_down"] = %coverstandaim_aim2_add;
var_0["add_aim_left"] = %coverstandaim_aim4_add;
var_0["add_aim_right"] = %coverstandaim_aim6_add;
var_0["straight_level"] = %coverstandaim_aim5;
var_0["hide_idle"] = %coverstand_hide_idle;
var_0["hide_idle_twitch"] = animscripts\utility::array( %coverstand_hide_idle_twitch01, %coverstand_hide_idle_twitch02, %coverstand_hide_idle_twitch03, %coverstand_hide_idle_twitch04, %coverstand_hide_idle_twitch05 );
var_0["hide_idle_flinch"] = animscripts\utility::array( %coverstand_react01, %coverstand_react02, %coverstand_react03, %coverstand_react04 );
var_0["hide_2_stand"] = %coverstand_hide_2_aim;
var_0["stand_2_hide"] = %coverstand_aim_2_hide;
var_0["hide_2_over"] = %coverstand_2_coverstandaim;
var_0["over_2_hide"] = %coverstandaim_2_coverstand;
var_0["over_aim"] = %coverstandaim_aim5;
var_0["fire"] = %coverstandaim_autofire;
var_0["semi2"] = %coverstandaim_fire;
var_0["semi3"] = %coverstandaim_fire;
var_0["semi4"] = %coverstandaim_fire;
var_0["semi5"] = %coverstandaim_fire;
var_0["single"] = animscripts\utility::array( %coverstandaim_fire );
var_0["burst2"] = %coverstandaim_autofire;
var_0["burst3"] = %coverstandaim_autofire;
var_0["burst4"] = %coverstandaim_autofire;
var_0["burst5"] = %coverstandaim_autofire;
var_0["burst6"] = %coverstandaim_autofire;
var_0["blind_fire"] = animscripts\utility::array( %coverstand_blindfire_1, %coverstand_blindfire_2 );
var_0["reload"] = %coverstand_reloada;
var_0["look"] = animscripts\utility::array( %coverstand_look_quick, %coverstand_look_quick_v2 );
var_0["grenade_safe"] = animscripts\utility::array( %coverstand_grenadea, %coverstand_grenadeb );
var_0["grenade_exposed"] = animscripts\utility::array( %coverstand_grenadea, %coverstand_grenadeb );
var_0["exposed_idle"] = animscripts\utility::array( %exposed_idle_alert_v1, %exposed_idle_alert_v2, %exposed_idle_alert_v3 );
var_0["hide_to_look"] = %coverstand_look_moveup;
var_0["look_idle"] = %coverstand_look_idle;
var_0["look_to_hide"] = %coverstand_look_movedown;
var_0["look_to_hide_fast"] = %coverstand_look_movedown_fast;
anim.archetypes["soldier"]["cover_stand"] = var_0;
}
cover_wall_think( var_0 )
{
self endon( "killanimscript" );
self.covernode = self.node;
self.covertype = var_0;
if ( !isdefined( self.node.turret ) )
animscripts\cover_behavior::turntomatchnodedirection( 0 );
if ( var_0 == "crouch" )
{
setup_cover_crouch( "unknown" );
self.covernode initcovercrouchnode();
}
else
setup_cover_stand( "unknown" );
self.a.aimidlethread = undefined;
self orientmode( "face angle", self.covernode.angles[1] );
if ( isdefined( self.weapon ) && animscripts\utility::usingmg() && isdefined( self.node ) && isdefined( self.node.turretinfo ) && canspawnturret() )
{
if ( var_0 == "crouch" )
{
if ( isrpd( self.weapon ) )
var_1 = "rpd_bipod_crouch";
else
var_1 = "saw_bipod_crouch";
}
else if ( isrpd( self.weapon ) )
var_1 = "rpd_bipod_stand";
else
var_1 = "saw_bipod_stand";
if ( isrpd( self.weapon ) )
var_2 = "weapon_rpd_MG_Setup";
else
var_2 = "weapon_saw_MG_Setup";
useselfplacedturret( var_1, var_2 );
}
else if ( isdefined( self.node ) && isdefined( self.node.turret ) )
usestationaryturret();
self animmode( "normal" );
if ( var_0 == "crouch" && self.a.pose == "stand" )
{
var_3 = animscripts\utility::animarray( "stand_2_hide" );
var_4 = getanimlength( var_3 );
self setanimknoballrestart( var_3, %body, 1, 0.2, animscripts\combat_utility::fasteranimspeed() );
thread animscripts\shared::movetonodeovertime( self.covernode, var_4 );
wait( var_4 );
self.a.covermode = "hide";
}
else
{
loophide( 0.4 );
if ( distancesquared( self.origin, self.covernode.origin ) > 1 )
{
thread animscripts\shared::movetonodeovertime( self.covernode, 0.4 );
wait 0.2;
if ( var_0 == "crouch" )
self.a.pose = "crouch";
wait 0.2;
}
else
wait 0.1;
}
setdefaultwallanimmode();
if ( var_0 == "crouch" )
{
if ( self.a.pose == "prone" )
animscripts\utility::exitpronewrapper( 1 );
self.a.pose = "crouch";
}
if ( self.covertype == "stand" )
self.a.special = "cover_stand";
else
self.a.special = "cover_crouch";
var_5 = spawnstruct();
if ( !self.fixednode )
var_5.movetonearbycover = animscripts\cover_behavior::movetonearbycover;
var_5.reload = ::coverreload;
var_5.leavecoverandshoot = ::popupandshoot;
var_5.look = ::look;
var_5.fastlook = ::fastlook;
var_5.idle = ::idle;
var_5.flinch = ::flinch;
var_5.grenade = ::trythrowinggrenade;
var_5.grenadehidden = ::trythrowinggrenadestayhidden;
var_5.blindfire = ::blindfire;
animscripts\cover_behavior::main( var_5 );
}
isrpd( var_0 )
{
return getsubstr( var_0, 0, 3 ) == "rpd" && ( var_0.size == 3 || var_0[3] == "_" );
}
initcovercrouchnode()
{
if ( isdefined( self.crouchingisok ) )
return;
var_0 = ( 0, 0, 42 );
var_1 = anglestoforward( self.angles );
self.crouchingisok = sighttracepassed( self.origin + var_0, self.origin + var_0 + var_1 * 64, 0, undefined );
}
setup_cover_crouch( var_0 )
{
animscripts\combat::set_default_aim_limits( self.covernode );
setup_crouching_anim_array( var_0 );
}
setup_cover_stand( var_0 )
{
animscripts\combat::set_default_aim_limits( self.covernode );
setup_standing_anim_array( var_0 );
}
coverreload()
{
var_0 = animscripts\combat_utility::reload( 2.0, animscripts\utility::animarray( "reload" ) );
if ( isdefined( var_0 ) && var_0 )
return 1;
return 0;
}
popupandshoot()
{
self.keepclaimednodeifvalid = 1;
if ( isdefined( self.rambochance ) && randomfloat( 1 ) < self.rambochance )
{
if ( rambo() )
return 1;
}
if ( !pop_up() )
return 0;
shootastold();
animscripts\combat_utility::endfireandanimidlethread();
if ( isdefined( self.shootpos ) )
{
var_0 = lengthsquared( self.origin - self.shootpos );
if ( animscripts\utility::usingrocketlauncher() && animscripts\utility::shoulddroprocketlauncher( var_0 ) )
{
if ( self.a.pose == "stand" )
animscripts\shared::throwdownweapon( animscripts\utility::lookupanim( "combat", "drop_rpg_stand" ) );
else
animscripts\shared::throwdownweapon( animscripts\utility::lookupanim( "combat", "drop_rpg_crouch" ) );
}
}
go_to_hide();
self.covercrouchlean_aimmode = undefined;
self.keepclaimednodeifvalid = 0;
return 1;
}
shootastold()
{
self endon( "return_to_cover" );
maps\_gameskill::didsomethingotherthanshooting();
for (;;)
{
if ( isdefined( self.shouldreturntocover ) )
break;
if ( !isdefined( self.shootpos ) )
{
self waittill( "do_slow_things" );
waittillframeend;
if ( isdefined( self.shootpos ) )
continue;
break;
}
if ( !self.bulletsinclip )
break;
if ( self.covertype == "crouch" && needtochangecovermode() )
break;
shootuntilshootbehaviorchange_coverwall();
self clearanim( %add_fire, 0.2 );
}
}
shootuntilshootbehaviorchange_coverwall()
{
if ( self.covertype == "crouch" )
thread anglerangethread();
thread animscripts\combat_utility::aimidlethread();
animscripts\combat_utility::shootuntilshootbehaviorchange();
}
rambo()
{
if ( !animscripts\utility::hasenemysightpos() )
return 0;
var_0 = "rambo";
if ( randomint( 10 ) < 2 )
var_0 = "rambo_fail";
if ( !animscripts\utility::animarrayanyexist( var_0 ) )
return 0;
if ( self.covertype == "crouch" && !self.covernode.crouchingisok )
return 0;
var_1 = getshootpospitch( self.covernode.origin + animscripts\utility::getnodeoffset( self.covernode ) );
if ( var_1 > 15 )
return 0;
var_2 = anglestoforward( self.angles );
var_3 = self.origin + var_2 * -16;
if ( !self maymovetopoint( var_3 ) )
return 0;
self.coverposestablishedtime = gettime();
setdefaultwallanimmode();
self.keepclaimednodeifvalid = 1;
self.isrambo = 1;
self.a.prevattack = "rambo";
self.changingcoverpos = 1;
thread animscripts\shared::ramboaim( 0 );
var_4 = animscripts\utility::animarraypickrandom( var_0 );
self setflaggedanimknoballrestart( "rambo", var_4, %body, 1, 0.2, 1 );
cover_playfacialanim( var_4 );
animscripts\shared::donotetracks( "rambo" );
self notify( "rambo_aim_end" );
self.changingcoverpos = 0;
self.keepclaimednodeifvalid = 0;
self.lastrambotime = gettime();
self.changingcoverpos = 0;
self.isrambo = undefined;
return 1;
}
idle()
{
self endon( "end_idle" );
for (;;)
{
var_0 = randomint( 2 ) == 0 && animscripts\utility::animarrayanyexist( "hide_idle_twitch" );
if ( var_0 )
var_1 = animscripts\utility::animarraypickrandom( "hide_idle_twitch" );
else
var_1 = animscripts\utility::animarray( "hide_idle" );
playidleanimation( var_1, var_0 );
}
}
flinch()
{
if ( !animscripts\utility::animarrayanyexist( "hide_idle_flinch" ) )
return 0;
var_0 = anglestoforward( self.angles );
var_1 = self.origin + var_0 * -16;
if ( !self maymovetopoint( var_1, !self.swimmer ) )
return 0;
setdefaultwallanimmode();
self.keepclaimednodeifvalid = 1;
var_2 = animscripts\utility::animarraypickrandom( "hide_idle_flinch" );
playidleanimation( var_2, 1 );
self.keepclaimednodeifvalid = 0;
return 1;
}
playidleanimation( var_0, var_1 )
{
if ( var_1 )
self setflaggedanimknoballrestart( "idle", var_0, %body, 1, 0.25, 1 );
else
self setflaggedanimknoball( "idle", var_0, %body, 1, 0.25, 1 );
cover_playfacialanim( var_0 );
self.a.covermode = "hide";
animscripts\shared::donotetracks( "idle" );
}
look( var_0 )
{
if ( !isdefined( self.a.array["hide_to_look"] ) )
return 0;
if ( !peekout() )
return 0;
animscripts\shared::playlookanimation( animscripts\utility::animarray( "look_idle" ), var_0 );
var_1 = undefined;
if ( animscripts\utility::issuppressedwrapper() )
var_1 = animscripts\utility::animarray( "look_to_hide_fast" );
else
var_1 = animscripts\utility::animarray( "look_to_hide" );
self setflaggedanimknoballrestart( "looking_end", var_1, %body, 1, 0.1 );
cover_playfacialanim( var_1 );
animscripts\shared::donotetracks( "looking_end" );
return 1;
}
peekout()
{
if ( isdefined( self.covernode.script_dontpeek ) )
return 0;
var_0 = animscripts\utility::animarray( "hide_to_look" );
self setflaggedanimknoball( "looking_start", var_0, %body, 1, 0.2 );
cover_playfacialanim( var_0 );
animscripts\shared::donotetracks( "looking_start" );
return 1;
}
fastlook()
{
var_0 = animscripts\utility::animarraypickrandom( "look" );
self setflaggedanimknoballrestart( "look", var_0, %body, 1, 0.1 );
cover_playfacialanim( var_0 );
animscripts\shared::donotetracks( "look" );
return 1;
}
pop_up_and_hide_speed()
{
if ( self.a.covermode == "left" || self.a.covermode == "right" || self.a.covermode == "over" )
return 1;
return animscripts\combat_utility::randomfasteranimspeed();
}
pop_up()
{
var_0 = getbestcovermode();
var_1 = 0.1;
var_2 = animscripts\utility::animarray( "hide_2_" + var_0 );
var_3 = !self.swimmer;
if ( !self maymovetopoint( animscripts\utility::getanimendpos( var_2 ), var_3 ) )
return 0;
if ( self.script == "cover_crouch" && var_0 == "lean" )
self.covercrouchlean_aimmode = 1;
if ( self.covertype == "crouch" )
setup_cover_crouch( var_0 );
else
setup_cover_stand( var_0 );
self.a.special = "none";
self.specialdeathfunc = undefined;
if ( self.covertype == "stand" )
self.a.special = "cover_stand_aim";
else
self.a.special = "cover_crouch_aim";
self.changingcoverpos = 1;
self notify( "done_changing_cover_pos" );
setdefaultwallanimmode();
var_4 = pop_up_and_hide_speed();
self setflaggedanimknoballrestart( "pop_up", var_2, %body, 1, 0.1, var_4 );
thread donotetracksforpopup( "pop_up" );
if ( animhasnotetrack( var_2, "start_aim" ) )
{
self waittillmatch( "pop_up", "start_aim" );
var_1 = getanimlength( var_2 ) / var_4 * ( 1 - self getanimtime( var_2 ) );
}
else
{
self waittillmatch( "pop_up", "end" );
var_1 = 0.1;
}
self clearanim( var_2, var_1 + 0.05 );
self.a.covermode = var_0;
self.a.prevattack = var_0;
setup_additive_aim( var_1 );
thread animscripts\track::trackshootentorpos();
wait( var_1 );
if ( animscripts\combat_utility::issniper() )
thread animscripts\shoot_behavior::sniper_glint_behavior();
self.changingcoverpos = 0;
self.coverposestablishedtime = gettime();
self notify( "stop_popup_donotetracks" );
return 1;
}
donotetracksforpopup( var_0 )
{
self endon( "killanimscript" );
self endon( "stop_popup_donotetracks" );
animscripts\shared::donotetracks( var_0 );
}
setup_additive_aim( var_0 )
{
if ( self.a.covermode == "left" || self.a.covermode == "right" )
var_1 = "crouch";
else
var_1 = self.a.covermode;
self setanimknoball( animscripts\utility::animarray( var_1 + "_aim" ), %body, 1, var_0 );
if ( var_1 == "crouch" )
{
self setanimlimited( animscripts\utility::lookupanim( "cover_crouch", "add_aim_down" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_crouch", "add_aim_left" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_crouch", "add_aim_up" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_crouch", "add_aim_right" ), 1, 0 );
}
else if ( var_1 == "stand" )
{
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_down" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_left" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_up" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_right" ), 1, 0 );
}
else if ( var_1 == "lean" )
{
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_down" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_left" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_up" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "default_stand", "add_aim_right" ), 1, 0 );
}
else if ( var_1 == "over" )
{
self setanimlimited( animscripts\utility::lookupanim( "cover_stand", "add_aim_down" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_stand", "add_aim_left" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_stand", "add_aim_up" ), 1, 0 );
self setanimlimited( animscripts\utility::lookupanim( "cover_stand", "add_aim_right" ), 1, 0 );
}
}
go_to_hide()
{
self notify( "return_to_cover" );
self.changingcoverpos = 1;
self notify( "done_changing_cover_pos" );
animscripts\combat_utility::endaimidlethread();
var_0 = pop_up_and_hide_speed();
self setflaggedanimknoball( "go_to_hide", animscripts\utility::animarray( self.a.covermode + "_2_hide" ), %body, 1, 0.2, var_0 );
self clearanim( %exposed_modern, 0.2 );
animscripts\shared::donotetracks( "go_to_hide" );
self.a.covermode = "hide";
if ( self.covertype == "stand" )
self.a.special = "cover_stand";
else
self.a.special = "cover_crouch";
self.changingcoverpos = 0;
}
trythrowinggrenadestayhidden( var_0 )
{
return trythrowinggrenade( var_0, 1 );
}
trythrowinggrenade( var_0, var_1 )
{
if ( isdefined( self.dontevershoot ) || isdefined( var_0.dontattackme ) )
return 0;
var_2 = undefined;
if ( isdefined( self.rambochance ) && randomfloat( 1.0 ) < self.rambochance )
var_2 = animscripts\utility::animarraypickrandom( "grenade_rambo" );
else if ( isdefined( var_1 ) && var_1 )
var_2 = animscripts\utility::animarraypickrandom( "grenade_safe" );
else
var_2 = animscripts\utility::animarraypickrandom( "grenade_exposed" );
setdefaultwallanimmode();
self.keepclaimednodeifvalid = 1;
var_3 = animscripts\combat_utility::trygrenade( var_0, var_2 );
self.keepclaimednodeifvalid = 0;
return var_3;
}
blindfire()
{
if ( !animscripts\utility::animarrayanyexist( "blind_fire" ) )
return 0;
setdefaultwallanimmode();
self.keepclaimednodeifvalid = 1;
self setflaggedanimknoballrestart( "blindfire", animscripts\utility::animarraypickrandom( "blind_fire" ), %body, 1, 0.2, 1 );
animscripts\shared::donotetracks( "blindfire" );
self.keepclaimednodeifvalid = 0;
return 1;
}
createturret( var_0, var_1, var_2 )
{
var_3 = spawnturret( "misc_turret", var_0.origin, var_1 );
var_3.angles = var_0.angles;
var_3.aiowner = self;
var_3 setmodel( var_2 );
var_3 makeusable();
var_3 setdefaultdroppitch( 0 );
if ( isdefined( var_0.leftarc ) )
var_3.leftarc = var_0.leftarc;
if ( isdefined( var_0.rightarc ) )
var_3.rightarc = var_0.rightarc;
if ( isdefined( var_0.toparc ) )
var_3.toparc = var_0.toparc;
if ( isdefined( var_0.bottomarc ) )
var_3.bottomarc = var_0.bottomarc;
return var_3;
}
deleteifnotused( var_0 )
{
self endon( "death" );
self endon( "being_used" );
wait 0.1;
if ( isdefined( var_0 ) )
var_0 notify( "turret_use_failed" );
self delete();
}
useselfplacedturret( var_0, var_1 )
{
var_2 = createturret( self.node.turretinfo, var_0, var_1 );
if ( self useturret( var_2 ) )
{
var_2 thread deleteifnotused( self );
if ( isdefined( self.turret_function ) )
thread [[ self.turret_function ]]( var_2 );
self waittill( "turret_use_failed" );
}
else
var_2 delete();
}
usestationaryturret()
{
var_0 = self.node.turret;
if ( !var_0.issetup )
return;
thread maps\_mg_penetration::gunner_think( var_0 );
self waittill( "continue_cover_script" );
}
setup_crouching_anim_array( var_0 )
{
self.a.array = animscripts\utility::lookupanimarray( "cover_crouch" );
if ( animscripts\utility::weapon_pump_action_shotgun() )
{
if ( var_0 == "lean" || var_0 == "stand" )
self.a.array["single"] = animscripts\utility::lookupanim( "shotgun_stand", "single" );
else
self.a.array["single"] = animscripts\utility::lookupanim( "shotgun_crouch", "single" );
}
if ( isdefined( anim.ramboanims ) )
{
self.a.array["rambo"] = anim.ramboanims.covercrouch;
self.a.array["rambo_fail"] = anim.ramboanims.covercrouchfail;
self.a.array["grenade_rambo"] = anim.ramboanims.covercrouchgrenade;
}
}
setup_standing_anim_array( var_0 )
{
self.a.array = animscripts\utility::lookupanimarray( "cover_stand" );
if ( var_0 != "over" )
{
var_1 = animscripts\utility::lookupanimarray( "default_stand" );
self.a.array["stand_aim"] = var_1["straight_level"];
self.a.array["fire"] = var_1["fire_corner"];
self.a.array["semi2"] = var_1["semi2"];
self.a.array["semi3"] = var_1["semi3"];
self.a.array["semi4"] = var_1["semi4"];
self.a.array["semi5"] = var_1["semi5"];
if ( animscripts\utility::weapon_pump_action_shotgun() )
self.a.array["single"] = animscripts\utility::lookupanim( "shotgun_stand", "single" );
else
self.a.array["single"] = var_1["single"];
self.a.array["burst2"] = var_1["burst2"];
self.a.array["burst3"] = var_1["burst3"];
self.a.array["burst4"] = var_1["burst4"];
self.a.array["burst5"] = var_1["burst5"];
self.a.array["burst6"] = var_1["burst6"];
}
if ( isdefined( anim.ramboanims ) )
{
self.a.array["rambo"] = anim.ramboanims.coverstand;
self.a.array["rambo_fail"] = anim.ramboanims.coverstandfail;
self.a.array["grenade_rambo"] = anim.ramboanims.coverstandgrenade;
}
}
loophide( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = 0.1;
self setanimknoballrestart( animscripts\utility::animarray( "hide_idle" ), %body, 1, var_0 );
self.a.covermode = "hide";
}
anglerangethread()
{
self endon( "killanimscript" );
self notify( "newAngleRangeCheck" );
self endon( "newAngleRangeCheck" );
self endon( "return_to_cover" );
for (;;)
{
if ( needtochangecovermode() )
break;
wait 0.1;
}
self notify( "stopShooting" );
}
needtochangecovermode()
{
if ( self.covertype != "crouch" )
return 0;
var_0 = getshootpospitch( self geteye() );
if ( self.a.covermode == "lean" )
return var_0 < 10;
else
return var_0 > 45;
}
getbestcovermode()
{
var_0 = [];
if ( self.covertype == "stand" )
{
var_0 = self.covernode getvalidcoverpeekouts();
var_0[var_0.size] = "stand";
}
else
{
var_1 = getshootpospitch( self.covernode.origin + animscripts\utility::getnodeoffset( self.covernode ) );
if ( var_1 > 30 )
return "lean";
if ( var_1 > 15 || !self.covernode.crouchingisok )
return "stand";
var_0 = self.covernode getvalidcoverpeekouts();
var_0[var_0.size] = "crouch";
}
var_2 = 0;
while ( var_2 < var_0.size )
{
if ( !isdefined( self.a.array["hide_2_" + var_0[var_2]] ) )
{
var_0[var_2] = var_0[var_0.size - 1];
var_0[var_0.size - 1] = undefined;
continue;
}
var_2++;
}
return animscripts\combat_utility::getrandomcovermode( var_0 );
}
getshootpospitch( var_0 )
{
var_1 = animscripts\utility::getenemyeyepos();
return angleclamp180( vectortoangles( var_1 - var_0 )[0] );
}
setdefaultwallanimmode()
{
if ( self.swimmer )
self animmode( "nogravity" );
else
self animmode( "zonly_physics" );
}
cover_playfacialanim( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = "run";
self.facialidx = animscripts\face::playfacialanim( var_0, var_1, self.facialidx );
}
cover_clearfacialanim()
{
self.facialidx = undefined;
self clearanim( %head, 0.2 );
}

216
animscripts/cqb.gsc Normal file
View File

@ -0,0 +1,216 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
movecqb()
{
animscripts\run::standrun_checkchangeweapon();
if ( self.a.pose != "stand" )
{
self clearanim( %root, 0.2 );
if ( self.a.pose == "prone" )
animscripts\utility::exitpronewrapper( 1 );
self.a.pose = "stand";
}
self.a.movement = self.movemode;
cqbtracking();
if ( animscripts\run::move_checkstairstransition() )
return;
self clearanim( %stair_transitions, 0.2 );
if ( animscripts\run::standrun_checkreload() )
return;
if ( isdefined( self.timeofmaincqbupdate ) )
var_0 = self.timeofmaincqbupdate;
else
var_0 = 0;
self.timeofmaincqbupdate = gettime();
var_1 = determinecqbanim();
if ( self.stairsstate == "none" )
var_2 = 0.3;
else
var_2 = 0.1;
var_3 = 0.2;
var_4 = %walk_and_run_loops;
if ( self.timeofmaincqbupdate - var_0 > var_3 * 1000 )
var_4 = %stand_and_crouch;
self setflaggedanimknoball( "runanim", var_1, var_4, 1, var_2, self.moveplaybackrate, 1 );
cqb_playfacialanim( var_1 );
animscripts\run::setmovenonforwardanims( animscripts\utility::lookupanim( "cqb", "move_b" ), animscripts\utility::lookupanim( "cqb", "move_l" ), animscripts\utility::lookupanim( "cqb", "move_r" ) );
thread animscripts\run::setcombatstandmoveanimweights( "cqb" );
animscripts\notetracks::donotetracksfortime( var_3, "runanim" );
}
determinecqbanim()
{
if ( isdefined( self.custommoveanimset ) && isdefined( self.custommoveanimset["cqb"] ) )
return animscripts\run::getrunanim();
if ( self.stairsstate == "up" )
return animscripts\utility::lookupanim( "cqb", "stairs_up" );
if ( self.stairsstate == "down" )
return animscripts\utility::lookupanim( "cqb", "stairs_down" );
if ( self.movemode == "walk" )
return animscripts\utility::lookupanim( "cqb", "move_f" );
if ( isdefined( self.a.bdisablemovetwitch ) && self.a.bdisablemovetwitch )
return animscripts\utility::lookupanim( "cqb", "straight" );
var_0 = animscripts\utility::lookupanim( "cqb", "straight_twitch" );
if ( !isdefined( var_0 ) || var_0.size == 0 )
return animscripts\utility::lookupanim( "cqb", "straight" );
var_1 = animscripts\utility::getrandomintfromseed( self.a.runloopcount, 4 );
if ( var_1 == 0 )
{
var_2 = animscripts\utility::getrandomintfromseed( self.a.runloopcount, var_0.size );
return var_0[var_2];
}
return animscripts\utility::lookupanim( "cqb", "straight" );
}
cqb_reloadinternal()
{
self endon( "movemode" );
self orientmode( "face motion" );
var_0 = "reload_" + animscripts\combat_utility::getuniqueflagnameindex();
var_1 = animscripts\utility::lookupanim( "cqb", "reload" );
if ( isarray( var_1 ) )
var_1 = var_1[randomint( var_1.size )];
self setflaggedanimknoballrestart( var_0, var_1, %body, 1, 0.25 );
cqb_playfacialanim( var_1 );
animscripts\run::setmovenonforwardanims( animscripts\utility::lookupanim( "cqb", "move_b" ), animscripts\utility::lookupanim( "cqb", "move_l" ), animscripts\utility::lookupanim( "cqb", "move_r" ) );
thread animscripts\run::setcombatstandmoveanimweights( "cqb" );
animscripts\shared::donotetracks( var_0 );
}
cqbtracking()
{
var_0 = self.stairsstate != "none";
var_1 = !var_0 && animscripts\move::mayshootwhilemoving();
animscripts\run::setshootwhilemoving( var_1 );
if ( var_0 )
animscripts\run::endfaceenemyaimtracking();
else
thread animscripts\run::faceenemyaimtracking();
}
setupcqbpointsofinterest()
{
level.cqbpointsofinterest = [];
var_0 = getentarray( "cqb_point_of_interest", "targetname" );
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
{
level.cqbpointsofinterest[var_1] = var_0[var_1].origin;
var_0[var_1] delete();
}
}
findcqbpointsofinterest()
{
if ( isdefined( anim.findingcqbpointsofinterest ) )
return;
anim.findingcqbpointsofinterest = 1;
if ( !level.cqbpointsofinterest.size )
return;
for (;;)
{
var_0 = getaiarray();
var_1 = 0;
foreach ( var_3 in var_0 )
{
if ( isalive( var_3 ) && var_3 animscripts\utility::iscqbwalking() && !isdefined( var_3.disable_cqb_points_of_interest ) )
{
var_4 = var_3.a.movement != "stop";
var_5 = ( var_3.origin[0], var_3.origin[1], var_3 getshootatpos()[2] );
var_6 = var_5;
var_7 = anglestoforward( var_3.angles );
if ( var_4 )
{
var_8 = bullettrace( var_6, var_6 + var_7 * 128, 0, undefined );
var_6 = var_8["position"];
}
var_9 = -1;
var_10 = 1048576;
for ( var_11 = 0; var_11 < level.cqbpointsofinterest.size; var_11++ )
{
var_12 = level.cqbpointsofinterest[var_11];
var_13 = distancesquared( var_12, var_6 );
if ( var_13 < var_10 )
{
if ( var_4 )
{
if ( distancesquared( var_12, var_5 ) < 4096 )
continue;
var_14 = vectordot( vectornormalize( var_12 - var_5 ), var_7 );
if ( var_14 < 0.643 || var_14 > 0.966 )
continue;
}
else if ( var_13 < 2500 )
continue;
if ( !sighttracepassed( var_6, var_12, 0, undefined ) )
continue;
var_10 = var_13;
var_9 = var_11;
}
}
if ( var_9 < 0 )
var_3.cqb_point_of_interest = undefined;
else
var_3.cqb_point_of_interest = level.cqbpointsofinterest[var_9];
wait 0.05;
var_1 = 1;
}
}
if ( !var_1 )
wait 0.25;
}
}
cqb_playfacialanim( var_0 )
{
self.facialidx = animscripts\face::playfacialanim( var_0, "run", self.facialidx );
}
cqb_clearfacialanim()
{
self.facialidx = undefined;
self clearanim( %head, 0.2 );
}

962
animscripts/death.gsc Normal file
View File

@ -0,0 +1,962 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_death()
{
var_0 = [];
var_0["strong_legs"] = [ %death_shotgun_legs, %death_stand_sniper_leg ];
var_0["strong_torso_lower"] = [ %death_shotgun_legs, %death_stand_sniper_leg, %death_shotgun_back_v1, %exposed_death_blowback, %death_stand_sniper_chest1, %death_stand_sniper_chest2, %death_stand_sniper_spin1 ];
var_0["strong_default"] = [ %death_shotgun_legs, %death_stand_sniper_leg, %death_shotgun_back_v1, %exposed_death_blowback, %death_stand_sniper_chest1, %death_stand_sniper_chest2, %death_stand_sniper_spin1 ];
var_0["strong_right"] = [ %death_shotgun_spinl, %death_stand_sniper_spin1, %death_stand_sniper_chest1, %death_stand_sniper_chest2 ];
var_0["strong_left"] = [ %death_shotgun_spinr, %death_stand_sniper_spin2, %death_stand_sniper_chest1, %death_stand_sniper_chest2 ];
var_0["running_forward"] = [ %run_death_facedown, %run_death_roll, %run_death_fallonback, %run_death_flop ];
var_0["running_forward_f"] = [ %run_death_fallonback ];
var_0["stand_pistol_forward"] = [ %pistol_death_2 ];
var_0["stand_pistol_front"] = [ %pistol_death_2 ];
var_0["stand_pistol_groin"] = [ %pistol_death_3, %pistol_death_3 ];
var_0["stand_pistol_torso_upper"] = [ %pistol_death_3 ];
var_0["stand_pistol_upper_body"] = [ %pistol_death_4 ];
var_0["stand_pistol_default"] = [ %pistol_death_1 ];
var_0["stand_pistol_torso_upper"] = [ %pistol_death_3, %pistol_death_1 ];
var_0["stand_pistol_lower_body"] = [ %pistol_death_2 ];
var_0["cover_right_stand"] = [ %corner_standr_deatha, %corner_standr_deathb ];
var_0["cover_right_crouch_head"] = [ %cornercrr_alert_death_slideout ];
var_0["cover_right_crouch_default"] = [ %cornercrr_alert_death_slideout, %cornercrr_alert_death_back ];
var_0["cover_left_stand"] = [ %corner_standl_deatha, %corner_standl_deathb ];
var_0["cover_left_crouch"] = [ %cornercrl_death_side, %cornercrl_death_back ];
var_0["cover_stand"] = [ %coverstand_death_left, %coverstand_death_right ];
var_0["cover_crouch_head"] = %covercrouch_death_1;
var_0["cover_crouch_back"] = %covercrouch_death_3;
var_0["cover_crouch_default"] = %covercrouch_death_2;
var_0["saw_stand"] = [ %saw_gunner_death ];
var_0["saw_crouch"] = [ %saw_gunner_lowwall_death ];
var_0["saw_prone"] = [ %saw_gunner_prone_death ];
var_0["dying_crawl_crouch"] = [ %dying_back_death_v2, %dying_back_death_v3, %dying_back_death_v4 ];
var_0["dying_crawl_prone"] = [ %dying_crawl_death_v1, %dying_crawl_death_v2 ];
var_0["stand_lower_body"] = [ %exposed_death_groin, %stand_death_leg ];
var_0["stand_lower_body_extended"] = [ %stand_death_crotch, %stand_death_guts ];
var_0["stand_head"] = [ %exposed_death_headshot, %exposed_death_flop ];
var_0["stand_neck"] = [ %exposed_death_neckgrab ];
var_0["stand_left_shoulder"] = [ %exposed_death_twist, %stand_death_shoulder_spin, %stand_death_shoulderback ];
var_0["stand_torso_upper"] = [ %stand_death_tumbleforward, %stand_death_stumbleforward ];
var_0["stand_torso_upper_extended"] = [ %stand_death_fallside ];
var_0["stand_front_head"] = [ %stand_death_face, %stand_death_headshot_slowfall ];
var_0["stand_front_head_extended"] = [ %stand_death_head_straight_back ];
var_0["stand_front_torso"] = [ %stand_death_tumbleback ];
var_0["stand_front_torso_extended"] = [ %stand_death_chest_stunned ];
var_0["stand_back"] = [ %exposed_death_falltoknees, %exposed_death_falltoknees_02 ];
var_0["stand_default"] = [ %exposed_death_02, %exposed_death_nerve ];
var_0["stand_default_firing"] = [ %exposed_death_firing_02, %exposed_death_firing ];
var_0["stand_backup_default"] = %exposed_death;
var_0["crouch_head"] = [ %exposed_crouch_death_fetal ];
var_0["crouch_torso"] = [ %exposed_crouch_death_flip ];
var_0["crouch_default1"] = [ %exposed_crouch_death_twist ];
var_0["crouch_default2"] = [ %exposed_crouch_death_flip ];
var_0["melee_standing_front"] = [ %melee_death_standing_front ];
var_0["melee_standing_back"] = [ %melee_death_standing_back ];
var_0["melee_standing_left"] = [ %melee_death_standing_left ];
var_0["melee_standing_right"] = [ %melee_death_standing_right ];
var_0["melee_crouching_front"] = [ %melee_death_crouching_front ];
var_0["melee_crouching_back"] = [ %melee_death_crouching_back ];
var_0["melee_crouching_left"] = [ %melee_death_crouching_left ];
var_0["melee_crouching_right"] = [ %melee_death_crouching_right ];
anim.archetypes["soldier"]["death"] = var_0;
}
main()
{
self endon( "killanimscript" );
self stopsoundchannel( "voice" );
var_0 = 0.3;
self clearanim( %scripted_talking, var_0 );
maps\_anim::disabledefaultfacialanims( 0 );
if ( self.a.nodeath == 1 )
return;
if ( isdefined( self.deathfunction ) )
{
var_1 = self [[ self.deathfunction ]]();
if ( !isdefined( var_1 ) )
var_1 = 1;
if ( var_1 )
return;
}
animscripts\utility::initialize( "death" );
removeselffrom_squadlastseenenemypos( self.origin );
anim.numdeathsuntilcrawlingpain--;
anim.numdeathsuntilcornergrenadedeath--;
if ( isdefined( self.ragdoll_immediate ) || self.forceragdollimmediate )
doimmediateragdolldeath();
if ( isdefined( self.deathanim ) )
{
playdeathanim( self.deathanim );
if ( isdefined( self.deathanimscript ) )
self [[ self.deathanimscript ]]();
return;
}
var_2 = animscripts\pain::wasdamagedbyexplosive();
if ( self.damagelocation == "helmet" || self.damagelocation == "head" )
helmetpop();
else if ( var_2 && randomint( 3 ) == 0 )
helmetpop();
self clearanim( %root, 0.3 );
if ( !animscripts\utility::damagelocationisany( "head", "helmet" ) )
{
if ( self.diequietly )
{
}
else
playdeathsound();
}
if ( var_2 && playexplodedeathanim() )
return;
if ( isdefined( self.specialdeathfunc ) )
{
if ( [[ self.specialdeathfunc ]]() )
return;
}
if ( specialdeath() )
return;
var_3 = getdeathanim();
playdeathanim( var_3 );
}
doimmediateragdolldeath()
{
animscripts\shared::dropallaiweapons();
self.skipdeathanim = 1;
var_0 = 10;
var_1 = common_scripts\_destructible::getdamagetype( self.damagemod );
if ( isdefined( self.attacker ) && self.attacker == level.player && var_1 == "melee" )
var_0 = 5;
var_2 = self.damagetaken;
if ( var_1 == "bullet" )
var_2 = max( var_2, 300 );
var_3 = var_0 * var_2;
var_4 = max( 0.3, self.damagedir[2] );
var_5 = ( self.damagedir[0], self.damagedir[1], var_4 );
if ( isdefined( self.ragdoll_directionscale ) )
var_5 = var_5 * self.ragdoll_directionscale;
else
var_5 = var_5 * var_3;
if ( self.forceragdollimmediate )
var_5 = var_5 + self.prevanimdelta * 20 * 10;
if ( isdefined( self.ragdoll_start_vel ) )
var_5 = var_5 + self.ragdoll_start_vel * 10;
self startragdollfromimpact( self.damagelocation, var_5 );
wait 0.05;
}
cross2d( var_0, var_1 )
{
return var_0[0] * var_1[1] - var_1[0] * var_0[1];
}
meleegetattackercardinaldirection( var_0, var_1 )
{
var_2 = vectordot( var_1, var_0 );
var_3 = cos( 60 );
if ( squared( var_2 ) < squared( var_3 ) )
{
if ( cross2d( var_0, var_1 ) > 0 )
return 1;
else
return 3;
}
else if ( var_2 < 0 )
return 0;
else
return 2;
}
orientmeleevictim()
{
if ( self.damagemod == "MOD_MELEE" && isdefined( self.attacker ) )
{
var_0 = self.origin - self.attacker.origin;
var_1 = anglestoforward( self.angles );
var_2 = vectornormalize( ( var_0[0], var_0[1], 0 ) );
var_3 = vectornormalize( ( var_1[0], var_1[1], 0 ) );
var_4 = meleegetattackercardinaldirection( var_3, var_2 );
var_5 = var_4 * 90;
var_6 = ( -1 * var_2[0], -1 * var_2[1], 0 );
var_7 = rotatevector( var_6, ( 0, var_5, 0 ) );
var_8 = vectortoyaw( var_7 );
self orientmode( "face angle", var_8 );
}
}
playdeathanim( var_0 )
{
if ( !animhasnotetrack( var_0, "dropgun" ) && !animhasnotetrack( var_0, "fire_spray" ) )
animscripts\shared::dropallaiweapons();
orientmeleevictim();
self setflaggedanimknoballrestart( "deathanim", var_0, %body, 1, 0.1 );
animscripts\face::playfacialanim( var_0, "death" );
if ( isdefined( self.skipdeathanim ) )
{
if ( !isdefined( self.noragdoll ) )
self startragdoll();
wait 0.05;
self animmode( "gravity" );
}
else if ( isdefined( self.ragdolltime ) )
thread waitforragdoll( self.ragdolltime );
else if ( !animhasnotetrack( var_0, "start_ragdoll" ) )
{
if ( self.damagemod == "MOD_MELEE" )
var_1 = 0.7;
else
var_1 = 0.35;
thread waitforragdoll( getanimlength( var_0 ) * var_1 );
}
if ( !isdefined( self.skipdeathanim ) )
thread playdeathfx();
self endon( "forcedRagdoll" );
if ( self.damagemod != "MOD_MELEE" )
{
thread updatecheckforceragdoll();
thread checkforceragdoll();
}
animscripts\shared::donotetracks( "deathanim" );
animscripts\shared::dropallaiweapons();
self notify( "endPlayDeathAnim" );
}
updatecheckforceragdoll()
{
self endon( "endPlayDeathAnim" );
self endon( "forcedRagdoll" );
wait 0.25;
while ( isdefined( self ) )
{
self queryshouldearlyragdoll();
wait 0.2;
}
}
checkforceragdoll()
{
self endon( "endPlayDeathAnim" );
while ( isdefined( self ) )
{
self waittill( "ragdoll_early_result", var_0 );
if ( !isdefined( self ) )
return;
if ( var_0 )
{
self startragdoll();
animscripts\shared::dropallaiweapons();
break;
}
self waittill( "ragdoll_early_result", var_0 );
}
self notify( "forcedRagdoll" );
}
waitforragdoll( var_0 )
{
wait( var_0 );
if ( isdefined( self ) )
animscripts\shared::dropallaiweapons();
if ( isdefined( self ) && !isdefined( self.noragdoll ) )
self startragdoll();
}
playdeathfx()
{
self endon( "killanimscript" );
if ( self.stairsstate != "none" )
return;
wait 2;
play_blood_pool();
}
play_blood_pool( var_0, var_1 )
{
if ( !isdefined( self ) )
return;
if ( isdefined( self.skipbloodpool ) )
return;
var_2 = self gettagorigin( "j_SpineUpper" );
var_3 = self gettagangles( "j_SpineUpper" );
var_4 = anglestoforward( var_3 );
var_5 = anglestoup( var_3 );
var_6 = anglestoright( var_3 );
var_2 = var_2 + var_4 * -8.5 + var_5 * 5 + var_6 * 0;
var_7 = bullettrace( var_2 + ( 0, 0, 30 ), var_2 - ( 0, 0, 100 ), 0, undefined );
if ( var_7["normal"][2] > 0.9 )
playfx( level._effect["deathfx_bloodpool_generic"], var_2 );
}
specialdeath()
{
if ( self.a.special == "none" )
return 0;
if ( self.damagemod == "MOD_MELEE" )
return 0;
switch ( self.a.special )
{
case "cover_right":
if ( self.a.pose == "stand" )
{
var_0 = animscripts\utility::lookupanim( "death", "cover_right_stand" );
dodeathfromarray( var_0 );
}
else
{
var_0 = [];
if ( animscripts\utility::damagelocationisany( "head", "neck" ) )
var_0 = animscripts\utility::lookupanim( "death", "cover_right_crouch_head" );
else
var_0 = animscripts\utility::lookupanim( "death", "cover_right_crouch_default" );
dodeathfromarray( var_0 );
}
return 1;
case "cover_left":
if ( self.a.pose == "stand" )
{
var_0 = animscripts\utility::lookupanim( "death", "cover_left_stand" );
dodeathfromarray( var_0 );
}
else
{
var_0 = animscripts\utility::lookupanim( "death", "cover_left_crouch" );
dodeathfromarray( var_0 );
}
return 1;
case "cover_stand":
var_0 = animscripts\utility::lookupanim( "death", "cover_stand" );
dodeathfromarray( var_0 );
return 1;
case "cover_crouch":
var_0 = [];
if ( animscripts\utility::damagelocationisany( "head", "neck" ) && ( self.damageyaw > 135 || self.damageyaw <= -45 ) )
var_0[var_0.size] = animscripts\utility::lookupanim( "death", "cover_crouch_head" );
if ( self.damageyaw > -45 && self.damageyaw <= 45 )
var_0[var_0.size] = animscripts\utility::lookupanim( "death", "cover_crouch_back" );
var_0[var_0.size] = animscripts\utility::lookupanim( "death", "cover_crouch_default" );
dodeathfromarray( var_0 );
return 1;
case "saw":
if ( self.a.pose == "stand" )
dodeathfromarray( animscripts\utility::lookupanim( "death", "saw_stand" ) );
else if ( self.a.pose == "crouch" )
dodeathfromarray( animscripts\utility::lookupanim( "death", "saw_crouch" ) );
else
dodeathfromarray( animscripts\utility::lookupanim( "death", "saw_prone" ) );
return 1;
case "dying_crawl":
if ( isdefined( self.a.onback ) && self.a.pose == "crouch" )
{
var_0 = animscripts\utility::lookupanim( "death", "dying_crawl_crouch" );
dodeathfromarray( var_0 );
}
else
{
var_0 = animscripts\utility::lookupanim( "death", "dying_crawl_prone" );
dodeathfromarray( var_0 );
}
return 1;
case "stumbling_pain":
playdeathanim( self.a.stumblingpainanimseq[self.a.stumblingpainanimseq.size - 1] );
return 1;
}
return 0;
}
dodeathfromarray( var_0 )
{
var_1 = var_0[randomint( var_0.size )];
playdeathanim( var_1 );
if ( isdefined( self.deathanimscript ) )
self [[ self.deathanimscript ]]();
}
playdeathsound()
{
animscripts\face::saygenericdialogue( "death" );
}
print3dfortime( var_0, var_1, var_2 )
{
var_3 = var_2 * 20;
for ( var_4 = 0; var_4 < var_3; var_4++ )
wait 0.05;
}
helmetpop()
{
if ( !isdefined( self ) )
return;
if ( !isdefined( self.hatmodel ) )
return;
var_0 = getpartname( self.hatmodel, 0 );
var_1 = spawn( "script_model", self.origin + ( 0, 0, 64 ) );
var_1 setmodel( self.hatmodel );
var_1.origin = self gettagorigin( var_0 );
var_1.angles = self gettagangles( var_0 );
var_1 thread helmetlaunch( self.damagedir );
var_2 = self.hatmodel;
self.hatmodel = undefined;
wait 0.05;
if ( !isdefined( self ) )
return;
self detach( var_2, "" );
}
helmetlaunch( var_0 )
{
var_1 = var_0;
var_1 = var_1 * randomfloatrange( 2000, 4000 );
var_2 = var_1[0];
var_3 = var_1[1];
var_4 = randomfloatrange( 1500, 3000 );
var_5 = self.origin + ( randomfloatrange( -1, 1 ), randomfloatrange( -1, 1 ), randomfloatrange( -1, 1 ) ) * 5;
self physicslaunchclient( var_5, ( var_2, var_3, var_4 ) );
wait 60;
for (;;)
{
if ( !isdefined( self ) )
return;
if ( distancesquared( self.origin, level.player.origin ) > 262144 )
break;
wait 30;
}
self delete();
}
removeselffrom_squadlastseenenemypos( var_0 )
{
for ( var_1 = 0; var_1 < anim.squadindex.size; var_1++ )
anim.squadindex[var_1] clearsightposnear( var_0 );
}
clearsightposnear( var_0 )
{
if ( !isdefined( self.sightpos ) )
return;
if ( distance( var_0, self.sightpos ) < 80 )
{
self.sightpos = undefined;
self.sighttime = gettime();
}
}
shoulddorunningforwarddeath()
{
if ( self.a.movement != "run" )
return 0;
if ( self getmotionangle() > 60 || self getmotionangle() < -60 )
return 0;
if ( self.damagemod == "MOD_MELEE" )
return 0;
return 1;
}
shoulddostrongbulletdamage( var_0, var_1, var_2, var_3 )
{
if ( isdefined( self.a.doinglongdeath ) )
return 0;
if ( self.a.pose == "prone" || isdefined( self.a.onback ) )
return 0;
if ( var_0 == "none" )
return 0;
if ( var_2 > 500 )
return 1;
if ( var_1 == "MOD_MELEE" )
return 0;
if ( self.a.movement == "run" && !isattackerwithindist( var_3, 275 ) )
{
if ( randomint( 100 ) < 65 )
return 0;
}
if ( animscripts\utility::issniperrifle( var_0 ) && self.maxhealth < var_2 )
return 1;
if ( animscripts\utility::isshotgun( var_0 ) && isattackerwithindist( var_3, 512 ) )
return 1;
if ( isdeserteagle( var_0 ) && isattackerwithindist( var_3, 425 ) )
return 1;
return 0;
}
isdeserteagle( var_0 )
{
if ( var_0 == "deserteagle" )
return 1;
return 0;
}
isattackerwithindist( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( distance( self.origin, var_0.origin ) > var_1 )
return 0;
return 1;
}
getdeathanim()
{
if ( shoulddostrongbulletdamage( self.damageweapon, self.damagemod, self.damagetaken, self.attacker ) )
{
var_0 = getstrongbulletdamagedeathanim();
if ( isdefined( var_0 ) )
return var_0;
}
if ( isdefined( self.a.onback ) )
{
if ( self.a.pose == "crouch" )
return getbackdeathanim();
else
animscripts\notetracks::stoponback();
}
if ( self.a.pose == "stand" )
{
if ( shoulddorunningforwarddeath() )
return getrunningforwarddeathanim();
else
return getstanddeathanim();
}
else if ( self.a.pose == "crouch" )
return getcrouchdeathanim();
else if ( self.a.pose == "prone" )
return getpronedeathanim();
}
getstrongbulletdamagedeathanim()
{
var_0 = abs( self.damageyaw );
if ( var_0 < 45 )
return;
if ( var_0 > 150 )
{
if ( animscripts\utility::damagelocationisany( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower", "left_foot", "right_foot" ) )
var_1 = animscripts\utility::lookupanim( "death", "strong_legs" );
else if ( self.damagelocation == "torso_lower" )
var_1 = animscripts\utility::lookupanim( "death", "strong_torso_lower" );
else
var_1 = animscripts\utility::lookupanim( "death", "strong_default" );
}
else if ( self.damageyaw < 0 )
var_1 = animscripts\utility::lookupanim( "death", "strong_right" );
else
var_1 = animscripts\utility::lookupanim( "death", "strong_left" );
return var_1[randomint( var_1.size )];
}
getrunningforwarddeathanim()
{
if ( abs( self.damageyaw ) < 45 )
{
var_0 = animscripts\utility::lookupanim( "death", "running_forward_f" );
var_1 = getrandomunblockedanim( var_0 );
if ( isdefined( var_1 ) )
return var_1;
}
var_0 = animscripts\utility::lookupanim( "death", "running_forward" );
var_1 = getrandomunblockedanim( var_0 );
if ( isdefined( var_1 ) )
return var_1;
return getstanddeathanim();
}
getrandomunblockedanim( var_0 )
{
if ( !isdefined( var_0 ) )
return undefined;
var_1 = undefined;
for ( var_2 = var_0.size; var_2 > 0; var_2-- )
{
var_3 = randomint( var_2 );
var_1 = var_0[var_3];
if ( !isanimblocked( var_1 ) )
return var_1;
var_0[var_3] = var_0[var_2 - 1];
var_0[var_2 - 1] = undefined;
}
return undefined;
}
removeundefined( var_0 )
{
var_1 = [];
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
{
if ( !isdefined( var_0[var_2] ) )
continue;
var_1[var_1.size] = var_0[var_2];
}
return var_1;
}
isanimblocked( var_0 )
{
var_1 = 1;
if ( animhasnotetrack( var_0, "code_move" ) )
var_1 = getnotetracktimes( var_0, "code_move" )[0];
var_2 = getmovedelta( var_0, 0, var_1 );
var_3 = self localtoworldcoords( var_2 );
return !self maymovetopoint( var_3, 1, 1 );
}
getstandpistoldeathanim()
{
var_0 = [];
if ( abs( self.damageyaw ) < 50 )
var_0 = animscripts\utility::lookupanim( "death", "stand_pistol_forward" );
else
{
if ( abs( self.damageyaw ) < 110 )
var_0 = animscripts\utility::lookupanim( "death", "stand_pistol_front" );
if ( self.damagelocation == "torso_upper" )
var_0 = common_scripts\utility::array_combine( animscripts\utility::lookupanim( "death", "stand_pistol_torso_upper" ), var_0 );
else if ( animscripts\utility::damagelocationisany( "torso_lower", "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) )
var_0 = common_scripts\utility::array_combine( animscripts\utility::lookupanim( "death", "stand_pistol_torso_upper" ), var_0 );
if ( !animscripts\utility::damagelocationisany( "head", "neck", "helmet", "left_foot", "right_foot", "left_hand", "right_hand", "gun" ) && randomint( 2 ) == 0 )
var_0 = common_scripts\utility::array_combine( animscripts\utility::lookupanim( "death", "stand_pistol_upper_body" ), var_0 );
if ( var_0.size == 0 || animscripts\utility::damagelocationisany( "torso_lower", "torso_upper", "neck", "head", "helmet", "right_arm_upper", "left_arm_upper" ) )
var_0 = common_scripts\utility::array_combine( animscripts\utility::lookupanim( "death", "stand_pistol_default" ), var_0 );
}
return var_0;
}
getstanddeathanim()
{
var_0 = [];
var_1 = [];
if ( animscripts\utility::usingsidearm() )
var_0 = getstandpistoldeathanim();
else if ( isdefined( self.attacker ) && self shouldplaymeleedeathanim( self.attacker ) )
{
if ( self.damageyaw <= 120 || self.damageyaw > -120 )
var_0 = animscripts\utility::lookupanim( "death", "melee_standing_front" );
else if ( self.damageyaw <= -60 && self.damageyaw > 60 )
var_0 = animscripts\utility::lookupanim( "death", "melee_standing_back" );
else if ( self.damageyaw < 0 )
var_0 = animscripts\utility::lookupanim( "death", "melee_standing_left" );
else
var_0 = animscripts\utility::lookupanim( "death", "melee_standing_right" );
}
else
{
if ( animscripts\utility::damagelocationisany( "torso_lower", "left_leg_upper", "left_leg_lower", "right_leg_lower", "right_leg_lower" ) )
{
var_0 = animscripts\utility::lookupanim( "death", "stand_lower_body" );
var_1 = animscripts\utility::lookupanim( "death", "stand_lower_body_extended" );
}
else if ( animscripts\utility::damagelocationisany( "head", "helmet" ) )
var_0 = animscripts\utility::lookupanim( "death", "stand_head" );
else if ( animscripts\utility::damagelocationisany( "neck" ) )
var_0 = animscripts\utility::lookupanim( "death", "stand_neck" );
else if ( animscripts\utility::damagelocationisany( "torso_upper", "left_arm_upper" ) )
var_0 = animscripts\utility::lookupanim( "death", "stand_left_shoulder" );
if ( animscripts\utility::damagelocationisany( "torso_upper" ) )
{
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_torso_upper" ) );
var_1 = common_scripts\utility::array_combine( var_1, animscripts\utility::lookupanim( "death", "stand_torso_upper_extended" ) );
}
if ( self.damageyaw > 135 || self.damageyaw <= -135 )
{
if ( animscripts\utility::damagelocationisany( "neck", "head", "helmet" ) )
{
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_front_torso" ) );
var_1 = common_scripts\utility::array_combine( var_1, animscripts\utility::lookupanim( "death", "stand_front_torso_extended" ) );
}
if ( animscripts\utility::damagelocationisany( "torso_upper" ) )
{
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_front_torso" ) );
var_1 = common_scripts\utility::array_combine( var_1, animscripts\utility::lookupanim( "death", "stand_front_torso_extended" ) );
}
}
else if ( self.damageyaw > -45 && self.damageyaw <= 45 )
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_back" ) );
var_2 = var_0.size > 0;
if ( !var_2 || randomint( 100 ) < 15 )
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_default" ) );
if ( randomint( 100 ) < 10 && firingdeathallowed() )
{
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "stand_default_firing" ) );
var_0 = removeundefined( var_0 );
}
}
if ( var_0.size == 0 )
var_0[var_0.size] = animscripts\utility::lookupanim( "death", "stand_backup_default" );
if ( !self.a.disablelongdeath && self.stairsstate == "none" && !isdefined( self.a.painonstairs ) )
{
var_3 = randomint( var_0.size + var_1.size );
if ( var_3 < var_0.size )
return var_0[var_3];
else
return var_1[var_3 - var_0.size];
}
return var_0[randomint( var_0.size )];
}
getcrouchdeathanim()
{
var_0 = [];
if ( isdefined( self.attacker ) && self shouldplaymeleedeathanim( self.attacker ) )
{
if ( self.damageyaw <= 120 || self.damageyaw > -120 )
var_0 = animscripts\utility::lookupanim( "death", "melee_crouching_front" );
else if ( self.damageyaw <= -60 && self.damageyaw > 60 )
var_0 = animscripts\utility::lookupanim( "death", "melee_crouching_back" );
else if ( self.damageyaw < 0 )
var_0 = animscripts\utility::lookupanim( "death", "melee_crouching_left" );
else
var_0 = animscripts\utility::lookupanim( "death", "melee_crouching_right" );
}
else
{
if ( animscripts\utility::damagelocationisany( "head", "neck" ) )
var_0 = animscripts\utility::lookupanim( "death", "crouch_head" );
if ( animscripts\utility::damagelocationisany( "torso_upper", "torso_lower", "left_arm_upper", "right_arm_upper", "neck" ) )
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "crouch_torso" ) );
if ( var_0.size < 2 )
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "crouch_default1" ) );
if ( var_0.size < 2 )
var_0 = common_scripts\utility::array_combine( var_0, animscripts\utility::lookupanim( "death", "crouch_default2" ) );
}
return var_0[randomint( var_0.size )];
}
getpronedeathanim()
{
if ( isdefined( self.a.proneaiming ) )
return %prone_death_quickdeath;
else
return %dying_crawl_death_v1;
}
getbackdeathanim()
{
var_0 = animscripts\utility::array( %dying_back_death_v1, %dying_back_death_v2, %dying_back_death_v3, %dying_back_death_v4 );
return var_0[randomint( var_0.size )];
}
firingdeathallowed()
{
if ( !isdefined( self.weapon ) || !animscripts\utility::usingriflelikeweapon() || !weaponisauto( self.weapon ) || self.diequietly )
return 0;
if ( self.a.weaponpos["right"] == "none" )
return 0;
return 1;
}
tryadddeathanim( var_0 )
{
return var_0;
}
tryaddfiringdeathanim( var_0 )
{
return var_0;
}
playexplodedeathanim()
{
if ( isdefined( self.juggernaut ) )
return 0;
if ( self.damagelocation != "none" )
return 0;
var_0 = [];
if ( self.a.movement != "run" )
{
if ( self.damageyaw > 135 || self.damageyaw <= -135 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_b_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_b_v2 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_b_v3 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_b_v4 );
}
else if ( self.damageyaw > 45 && self.damageyaw <= 135 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_l_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_l_v2 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_l_v3 );
}
else if ( self.damageyaw > -45 && self.damageyaw <= 45 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_f_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_f_v2 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_f_v3 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_f_v4 );
}
else
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_r_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_stand_r_v2 );
}
}
else if ( self.damageyaw > 135 || self.damageyaw <= -135 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_b_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_b_v2 );
}
else if ( self.damageyaw > 45 && self.damageyaw <= 135 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_l_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_l_v2 );
}
else if ( self.damageyaw > -45 && self.damageyaw <= 45 )
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_f_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_f_v2 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_f_v3 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_f_v4 );
}
else
{
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_r_v1 );
var_0[var_0.size] = tryadddeathanim( %death_explosion_run_r_v2 );
}
var_1 = var_0[randomint( var_0.size )];
if ( getdvar( "scr_expDeathMayMoveCheck", "on" ) == "on" )
{
var_2 = getmovedelta( var_1, 0, 1 );
var_3 = self localtoworldcoords( var_2 );
if ( !self maymovetopoint( var_3, 0 ) )
return 0;
}
self animmode( "nogravity" );
playdeathanim( var_1 );
return 1;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
self endon( "killanimscript" );
thread animscripts\dog\dog_move::handlefootstepnotetracks();
self clearanim( %dog_move, 0.2 );
self setflaggedanimknoballrestart( "dog_stop", self.dogarrivalanim, %body, 1, 0.2, self.moveplaybackrate );
animscripts\shared::donotetracks( "dog_stop" );
self.dogarrivalanim = undefined;
}

View File

@ -0,0 +1,78 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["death"] ]]();
return;
}
}
self endon( "killanimscript" );
if ( isdefined( self.a.nodeath ) )
{
wait 1.1;
var_0 = self getdroptofloorposition();
if ( isdefined( var_0 ) )
{
var_1 = common_scripts\utility::spawn_tag_origin();
var_1.origin = self.origin;
var_1.angles = self.angles;
self linkto( var_1 );
var_1 moveto( var_0, 0.5 );
wait 0.5;
self unlink();
var_1 delete();
}
else
wait 0.5;
return;
}
self unlink();
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
self.enemy.syncedmeleetarget = undefined;
self clearanim( %body, 0.2 );
var_2 = getdogdeathanim( "front" );
if ( isdefined( self.deathanim ) )
var_2 = self.deathanim;
if ( isdefined( self.custom_deathsound ) )
self playsound( self.custom_deathsound );
else if ( self isdogbeingdriven() )
self playsound( "anml_dog_shot_death_plr" );
else
self playsound( "anml_dog_shot_death" );
self setflaggedanimrestart( "dog_anim", var_2, 1, 0.2, 1 );
animscripts\shared::donotetracks( "dog_anim" );
}
getdogdeathanim( var_0 )
{
var_1 = animscripts\utility::lookupdoganim( "death", var_0 );
if ( isarray( var_1 ) )
return var_1[randomint( var_1.size )];
return var_1;
}
initdogarchetype_death()
{
var_0 = [];
var_0["front"] = [ %iw6_dog_death_4, %iw6_dog_death_6 ];
anim.archetypes["dog"]["death"] = var_0;
}

View File

@ -0,0 +1,43 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["flashed"] ]]();
return;
}
}
self endon( "killanimscript" );
self endon( "stop_flashbang_effect" );
wait( randomfloatrange( 0, 0.4 ) );
self clearanim( %body, 0.1 );
var_0 = maps\_utility::flashbanggettimeleftsec();
if ( var_0 > 2 && randomint( 100 ) > 60 )
self setflaggedanimrestart( "flashed_anim", getdogflashedanim( "flash_long" ), 1, 0.2, self.animplaybackrate * 0.75 );
else
self setflaggedanimrestart( "flashed_anim", getdogflashedanim( "flash_short" ), 1, 0.2, self.animplaybackrate );
var_1 = getanimlength( getdogflashedanim( "flash_short" ) ) * self.animplaybackrate;
if ( var_0 < var_1 )
animscripts\notetracks::donotetracksfortime( var_0, "flashed_anim" );
else
animscripts\shared::donotetracks( "flashed_anim" );
self.flashed = 0;
self notify( "stop_flashbang_effect" );
}
getdogflashedanim( var_0 )
{
var_1 = animscripts\utility::lookupdoganim( "reaction", var_0 );
return var_1;
}

View File

@ -0,0 +1,206 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["init"] ]]();
return;
}
}
self useanimtree( #animtree );
initdoganimations();
initdogarchetype();
animscripts\init::firstinit();
self.ignoresuppression = 1;
self.newenemyreactiondistsq = 0;
self.chatinitialized = 0;
self.nododgemove = 1;
self.root_anim = %body;
self.meleeattackdist = 0;
thread setmeleeattackdist();
self.a = spawnstruct();
self.a.pose = "stand";
self.a.nextstandinghitdying = 0;
self.a.movement = "run";
animscripts\init::set_anim_playback_rate();
self.suppressionthreshold = 1;
self.disablearrivals = 0;
self.stopanimdistsq = anim.dogstoppingdistsq;
self.usechokepoints = 0;
self.turnrate = 0.2;
thread animscripts\combat_utility::monitorflash();
self.pathenemyfightdist = 512;
self settalktospecies( "dog" );
self.health = int( anim.dog_health * self.health );
if ( !level.console )
thread pc_dogsetup();
}
pc_upgradedog()
{
var_0 = issubstr( self.model, "dog" );
if ( var_0 )
var_1 = "dog";
else
var_1 = "wolf";
var_2 = maps\_utility_dogs::get_dog_model_letter_type( self.model );
if ( !isdefined( level.furfx ) || !isdefined( level.furfx[var_1] ) || !isdefined( level.furfx[var_1][var_2] ) )
return;
self endon( "death" );
self setmodel( self.model + "_fur" );
wait 0.25;
self.furfx = level.furfx[var_1][var_2];
playfxontag( self.furfx, self, "tag_origin" );
}
pc_downgradedog()
{
if ( !issubstr( self.model, "_fur" ) )
return;
var_0 = getsubstr( self.model, 0, self.model.size - 4 );
var_1 = issubstr( self.model, "dog" );
if ( var_1 )
var_2 = "dog";
else
var_2 = "wolf";
if ( isdefined( self.furfx ) )
{
killfxontag( self.furfx, self, "tag_origin" );
self.furfx = undefined;
}
self setmodel( var_0 );
}
pc_dogsetup()
{
if ( ishairrunning() )
pc_upgradedog();
if ( !isdefined( self.pc_furmonitor ) )
{
self.pc_furmonitor = 1;
thread pc_furmonitor();
}
}
pc_furmonitor()
{
self endon( "death" );
var_0 = ishairrunning();
for (;;)
{
wait 0.1;
var_1 = ishairrunning();
if ( var_0 != var_1 )
{
if ( var_1 )
pc_upgradedog();
else
pc_downgradedog();
}
var_0 = var_1;
}
}
setmeleeattackdist()
{
self endon( "death" );
for (;;)
{
if ( isdefined( self.enemy ) && isplayer( self.enemy ) )
self.meleeattackdist = anim.dogattackplayerdist;
else
self.meleeattackdist = anim.dogattackaidist;
self waittill( "enemy" );
}
}
initdoganimations()
{
if ( !isdefined( level.dogsinitialized ) )
{
level.dogsinitialized = 1;
precachestring( &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING" );
precachestring( &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE" );
precachestring( &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON" );
precachestring( &"SCRIPT_PLATFORM_DOG_HINT" );
precachestring( &"NEW_DOG_DEATH_DO_NOTHING_ALT" );
precachestring( &"NEW_DOG_DEATH_TOO_LATE_ALT" );
precachestring( &"NEW_DOG_DEATH_TOO_SOON_ALT" );
}
if ( isdefined( anim.notfirsttimedogs ) )
return;
precacheshader( "hud_dog_melee" );
precacheshader( "hud_hyena_melee" );
anim.notfirsttimedogs = 1;
anim.dogstoppingdistsq = lengthsquared( getmovedelta( %iw6_dog_attackidle_runin_8, 0, 1 ) * 3 );
anim.dogstartmovedist = length( getmovedelta( %iw6_dog_attackidle_runout_8, 0, 1 ) );
anim.dogattackplayerdist = 102;
var_0 = getstartorigin( ( 0, 0, 0 ), ( 0, 0, 0 ), %iw6_dog_kill_front_quick_1 );
anim.dogattackaidist = length( var_0 );
anim.dogtraverseanims = [];
anim.dogtraverseanims["wallhop"] = %iw6_dog_traverse_over_24;
anim.dogtraverseanims["window_40"] = %iw6_dog_traverse_over_36;
anim.dogtraverseanims["jump_down_40"] = %iw6_dog_traverse_down_40;
anim.dogtraverseanims["jump_down_24"] = %iw6_dog_traverse_down_24;
anim.dogtraverseanims["jump_up_24"] = %iw6_dog_traverse_up_24;
anim.dogtraverseanims["jump_up_40"] = %iw6_dog_traverse_up_40;
anim.dogtraverseanims["jump_up_80"] = %iw6_dog_traverse_up_70;
anim.dogtraverseanims["jump_down_70"] = %iw6_dog_traverse_down_70;
anim.doglookpose["attackIdle"][2] = %german_shepherd_attack_look_down;
anim.doglookpose["attackIdle"][4] = %german_shepherd_attack_look_left;
anim.doglookpose["attackIdle"][6] = %german_shepherd_attack_look_right;
anim.doglookpose["attackIdle"][8] = %german_shepherd_attack_look_up;
anim.doglookpose["normal"][2] = %german_shepherd_look_down;
anim.doglookpose["normal"][4] = %german_shepherd_look_left;
anim.doglookpose["normal"][6] = %german_shepherd_look_right;
anim.doglookpose["normal"][8] = %german_shepherd_look_up;
level._effect["dog_bite_blood"] = loadfx( "fx/impacts/deathfx_dogbite" );
level._effect["deathfx_bloodpool"] = loadfx( "fx/impacts/deathfx_bloodpool_view" );
var_1 = 5;
var_2 = [];
for ( var_3 = 0; var_3 <= var_1; var_3++ )
var_2[var_2.size] = var_3 / var_1;
level.dog_melee_index = 0;
level.dog_melee_timing_array = common_scripts\utility::array_randomize( var_2 );
setdvar( "friendlySaveFromDog", "0" );
}
initdogarchetype()
{
animscripts\animset::init_anim_sets();
if ( animscripts\animset::archetypeexists( "dog" ) )
return;
anim.archetypes["dog"] = [];
animscripts\dog\dog_stop::initdogarchetype_stop();
animscripts\dog\dog_move::initdogarchetype_move();
animscripts\dog\dog_pain::initdogarchetype_reaction();
animscripts\dog\dog_death::initdogarchetype_death();
}

View File

@ -0,0 +1,142 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
check_kill_traversal( var_0 )
{
if ( self.team != "allies" )
return 0;
self endon( "killanimscript" );
var_1 = self getnegotiationstartnode();
var_2 = self getnegotiationendnode();
var_3 = getaiarray( "axis" );
var_4 = undefined;
var_5 = dog_get_within_range( var_2.origin, var_3, 90 );
if ( var_5.size > 0 )
{
var_6 = var_5[0];
var_7 = lengthsquared( var_1.origin - var_2.origin );
var_8 = lengthsquared( var_1.origin - var_6.origin );
if ( var_8 < var_7 )
{
self.syncedmeleetarget2 = var_6;
var_6.syncedmeleetarget2 = self;
var_6.traversedata = var_0;
var_9 = [];
var_9[0][0] = 400;
var_9[0][1] = "blood_small";
var_9[0][2] = "J_Neck";
var_9[1][0] = 2300;
var_9[1][1] = "blood_medium";
var_9[1][2] = "J_Neck";
var_9[2][0] = 2600;
var_9[2][1] = "blood_medium";
var_9[2][2] = "J_Neck";
var_9[3][0] = 3300;
var_9[3][1] = "blood_heavy";
var_9[3][2] = "J_Neck";
var_6 thread monitorfx( var_9 );
var_6 animcustom( ::human_traverse_kill );
self orientmode( "face angle", var_1.angles[1] );
dog_traverse_kill( var_0 );
return 1;
}
}
return 0;
}
dog_get_within_range( var_0, var_1, var_2 )
{
var_3 = [];
for ( var_4 = 0; var_4 < var_1.size; var_4++ )
{
if ( distance( var_1[var_4].origin, var_0 ) <= var_2 )
var_3[var_3.size] = var_1[var_4];
}
return var_3;
}
#using_animtree("dog");
dog_traverse_kill( var_0 )
{
self.safetochangescript = 0;
self.orig_flashbangimmunity = self.flashbangimmunity;
self.flashbangimmunity = 1;
self.pushable = 0;
self traversemode( "nogravity" );
self traversemode( "noclip" );
self clearpitchorient();
self setcandamage( 0 );
self clearanim( %body, 0.1 );
self setflaggedanimrestart( "dog_traverse", level.scr_anim["generic"][var_0["traverseAnim"]][0], 1, 0.2, 1 );
animscripts\shared::donotetracks( "dog_traverse" );
self unlink();
self setcandamage( 1 );
self traversemode( "gravity" );
self.pushable = 1;
self.safetochangescript = 1;
self.flashbangimmunity = self.orig_flashbangimmunity;
}
#using_animtree("generic_human");
human_traverse_kill()
{
self endon( "killanimscript" );
self endon( "death" );
self orientmode( "face point", self.syncedmeleetarget2.origin, 1 );
self animmode( "nogravity" );
self.a.pose = "stand";
self.a.special = "none";
if ( animscripts\utility::usingsidearm() )
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
self clearanim( %body, 0.1 );
self setflaggedanimrestart( "aianim", level.scr_anim["generic"][self.traversedata["traverseAnim"]][1], 1, 0.1, 1 );
if ( isdefined( self.traversedata["linkMe"] ) )
thread dog_link();
animscripts\shared::donotetracks( "aianim" );
self waittillmatch( "aianim", "end" );
if ( isalive( self ) && !isdefined( self.magic_bullet_shield ) )
{
self.a.nodeath = 1;
animscripts\shared::dropallaiweapons();
self kill();
}
}
monitorfx( var_0 )
{
self endon( "death" );
var_1 = 0;
var_2 = gettime();
while ( var_1 < var_0.size )
{
var_3 = gettime() - var_2;
if ( var_3 >= var_0[var_1][0] )
{
playfxontag( level._effect[var_0[var_1][1]], self, var_0[var_1][2] );
var_1++;
}
wait 0.05;
}
}
dog_link()
{
wait 0.15;
self.syncedmeleetarget2 linkto( self, "tag_sync", ( 0, 0, 0 ), ( 0, 0, 0 ) );
}

1184
animscripts/dog/dog_move.gsc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,61 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["pain"] ]]();
return;
}
}
self endon( "killanimscript" );
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self && ( !isdefined( self.disablepain ) || !self.disablepain ) )
{
self unlink();
self.enemy.syncedmeleetarget = undefined;
}
self animmode( "zonly_physics" );
self clearanim( %body, 0.2 );
if ( self.prevscript == "dog_stop" )
var_0 = "idle_pain";
else
var_0 = "run_pain";
self setflaggedanimrestart( "dog_pain_anim", getdogpainanim( var_0 ), 1, 0.2, 1 );
if ( self isdogbeingdriven() )
self playsound( "bullet_large_flesh" );
else
self playsound( "bullet_large_flesh_npc" );
animscripts\shared::donotetracks( "dog_pain_anim" );
}
getdogpainanim( var_0 )
{
var_1 = animscripts\utility::lookupdoganim( "reaction", var_0 );
if ( isarray( var_1 ) )
return var_1[randomint( var_1.size )];
return var_1;
}
initdogarchetype_reaction()
{
var_0 = [];
var_0["flash_long"] = [ %iw6_dog_run_pain_4, %iw6_dog_run_pain_6 ];
var_0["flash_short"] = %german_shepherd_run_flashbang_b;
var_0["run_pain"] = [ %iw6_dog_run_pain_4, %iw6_dog_run_pain_6 ];
var_0["idle_pain"] = [ %iw6_dog_alertidle_pain_4, %iw6_dog_alertidle_pain_6 ];
anim.archetypes["dog"]["reaction"] = var_0;
}

View File

@ -0,0 +1,14 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["reactions"] ]]();
return;
}
}
}

View File

@ -0,0 +1,57 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["scripted"] ]]();
return;
}
}
self endon( "death" );
self notify( "killanimscript" );
self.codescripted["root"] = %body;
self endon( "end_sequence" );
self startscriptedanim( self.codescripted["notifyName"], self.codescripted["origin"], self.codescripted["angles"], self.codescripted["anim"], self.codescripted["animMode"], self.codescripted["root"], self.codescripted["goalTime"] );
self.codescripted = undefined;
if ( isdefined( self.deathstring_passed ) )
self.deathstring = self.deathstring_passed;
self waittill( "killanimscript" );
}
init( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["scripted_init"] ]]( var_0, var_1, var_2, var_3, var_4, var_5 );
return;
}
}
self.codescripted["notifyName"] = var_0;
self.codescripted["origin"] = var_1;
self.codescripted["angles"] = var_2;
self.codescripted["anim"] = var_3;
if ( isdefined( var_4 ) )
self.codescripted["animMode"] = var_4;
else
self.codescripted["animMode"] = "normal";
if ( isdefined( var_5 ) )
self.codescripted["root"] = var_5;
else
self.codescripted["root"] = %body;
self.codescripted["goalTime"] = var_6;
}

View File

@ -0,0 +1,842 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("dog");
main()
{
if ( isdefined( level.shark_functions ) )
{
if ( issubstr( self.model, "shark" ) )
{
self [[ level.shark_functions["stop"] ]]();
return;
}
}
self endon( "killanimscript" );
self clearanim( %body, 0.2 );
self setanim( %dog_idle_knob );
thread waitforstatechange();
self.dognextidletwitchtime = getdognexttwitchtime();
self.moveanimtype = "walk";
self.idleanimtype = undefined;
for (;;)
{
if ( self isdogbeingdriven() )
{
dodrivenidle();
continue;
}
if ( isdefined( self.specialidleanim ) )
{
dospecialidle();
continue;
}
var_0 = dogstop_getnode();
if ( !self isdogbeingdriven() && ( !isdefined( self.bidlelooking ) || !self.bidlelooking ) )
{
var_1 = 262144;
var_2 = self.doghandler;
if ( isdefined( var_2 ) )
{
if ( isdefined( var_2.node ) && isdefined( var_0 ) )
{
var_3 = var_2.origin - self.origin;
turntoangle( vectortoyaw( var_3 ) );
}
else
{
var_4 = 65536;
var_5 = 6400;
var_6 = distancesquared( self.origin, var_2.origin );
if ( var_6 < var_5 )
turntoangle( var_2.angles[1] );
else if ( var_6 < var_4 )
{
var_3 = var_2.origin - self.origin;
var_7 = vectortoyaw( var_3 );
turntoangle( var_7 );
}
}
}
else if ( ( !isdefined( var_0 ) || !issubstr( var_0.type, "Cover" ) || isdefined( self.favoriteenemy ) ) && isdefined( self.enemy ) && isalive( self.enemy ) && ( self seerecently( self.enemy, 5 ) || distancesquared( self.origin, self.enemy.origin ) < var_1 ) )
{
var_8 = self.enemy.origin - self.origin;
turntoangle( vectortoyaw( var_8 ) );
}
else if ( isdefined( var_0 ) && shouldfacenodedir( var_0 ) )
turntoangle( var_0.angles[1] );
self orientmode( "face angle", self.angles[1] );
}
if ( isdefined( self.customidleanimset ) )
{
stoplookatidle();
docustomidle();
continue;
}
var_9 = getdefaultidlestate();
if ( var_9 == "casualidle" )
{
if ( isdefined( self.idlelookattargets ) )
dolookatidle();
else
{
stoplookatidle();
playidleanim( "casualidle", getdogstopanim( "casualidle" ), 0, 0.5, 2 );
}
}
else if ( var_9 == "attackidle" )
{
if ( isdefined( self.idlelookattargets ) && isdefined( self.aggresivelookat ) )
dolookatidle();
else
{
stopidlesound();
stoplookatidle();
var_10 = !isdefined( self.enemy ) || distance2dsquared( self.origin, self.enemy.origin ) > 589824;
if ( var_10 && gettime() > self.dognextidletwitchtime )
{
var_11 = chooseattackidle();
playidleanim( "attackidle", getdogstopanim( var_11 ), 0, 0.2, -1 );
self.dognextidletwitchtime = getdognexttwitchtime();
}
else
playidleanim( "attackidle", getdogstopanim( "attackidle" ), 0, 0.5, 0.5 );
}
}
else
{
stopidlesound();
stoplookatidle();
playidleanim( var_9, getdogstopanim( var_9 ), 0, 0.5, 2 );
}
}
}
end_script()
{
if ( isdefined( self.prevturnrate ) )
{
self.turnrate = self.prevturnrate;
self.prevturnrate = undefined;
}
self.dogturnadjust = undefined;
self.dogturnrate = undefined;
self.dognextidletwitchtime = undefined;
self.currenttrackingyawspeed = undefined;
self.currenttrackingyaw = undefined;
stopidlesound();
stoplookatidle();
}
playidleanim( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "killIdleAnim" );
if ( isdefined( self.idleanimtype ) && self.idleanimtype != var_0 )
{
var_5 = getdogstoptransitionanim( self.idleanimtype, var_0 );
if ( isdefined( var_5 ) )
{
self setflaggedanimknobrestart( "dog_idle_transition", var_5, 1, 0.2, self.animplaybackrate );
animscripts\shared::donotetracks( "dog_idle_transition" );
var_3 = 0.2;
}
}
self.idleanimtype = var_0;
if ( var_2 )
self setflaggedanimknobrestart( "dog_idle", var_1, 1, var_3, self.animplaybackrate );
else
self setflaggedanimknob( "dog_idle", var_1, 1, var_3, self.animplaybackrate );
if ( var_4 > 0 )
animscripts\notetracks::donotetracksfortime( var_4, "dog_idle" );
else
animscripts\shared::donotetracks( "dog_idle" );
}
waitforstatechange()
{
self endon( "killanimscript" );
var_0 = self isdogbeingdriven();
var_1 = self.defaultidlestateoverride;
for (;;)
{
var_2 = self isdogbeingdriven();
if ( var_2 != var_0 )
{
killidleanim();
var_0 = var_2;
self orientmode( "face angle", self.angles[1] );
}
else if ( animscripts\dog\dog_move::aredifferent( self.defaultidlestateoverride, var_1 ) )
{
killidleanim();
var_1 = self.defaultidlestateoverride;
}
wait 0.1;
}
}
killidleanim()
{
self notify( "killIdleAnim" );
stoplookatidle();
}
shouldfacenodedir( var_0 )
{
return var_0.type == "Guard" || var_0.type == "Exposed" || issubstr( var_0.type, "Cover " );
}
getturnanim( var_0 )
{
var_1 = getdefaultidlestate();
if ( var_1 == "casualidle" || var_1 == "sniffidle" )
{
if ( var_0 < -135 || var_0 > 135 )
return getdogstopanim( "casual_turn_180" );
else if ( var_0 < 0 )
return getdogstopanim( "casual_turn_right" );
else
return getdogstopanim( "casual_turn_left" );
}
else if ( var_0 < -135 || var_0 > 135 )
return getdogstopanim( "attack_turn_180" );
else if ( var_0 < 0 )
return getdogstopanim( "attack_turn_right" );
else
return getdogstopanim( "attack_turn_left" );
}
handledogturnnotetracks( var_0 )
{
if ( var_0 == "turn_begin" )
{
var_1 = angleclamp180( self.angles[1] + self.dogturnadjust );
self.dogturnadjust = undefined;
self.prevturnrate = self.turnrate;
self.turnrate = self.dogturnrate;
self.dogturnrate = undefined;
self orientmode( "face angle", var_1 );
}
else if ( var_0 == "turn_end" )
{
self.turnrate = self.prevturnrate;
self.prevturnrate = undefined;
}
}
turntoangle( var_0, var_1 )
{
self endon( "killIdleAnim" );
var_2 = self.angles[1];
var_3 = angleclamp180( var_0 - var_2 );
if ( -0.5 < var_3 && var_3 < 0.5 )
return;
if ( -15 < var_3 && var_3 < 15 )
{
rotatetoangle( var_0, 2 );
return;
}
stopidlesound();
var_4 = getturnanim( var_3 );
var_5 = getanimlength( var_4 );
var_6 = getangledelta( var_4 );
var_7 = 0.2;
if ( var_5 < 0.7 )
var_7 = 0.05;
if ( isdefined( var_1 ) && var_1 )
self animmode( "zonly_physics" );
else
self animmode( "angle deltas" );
self setanim( %dog_idle_knob, 1, var_7 );
self setflaggedanimknobrestart( "dog_turn", var_4, 1, var_7 );
if ( animhasnotetrack( var_4, "turn_begin" ) && animhasnotetrack( var_4, "turn_end" ) )
{
var_8 = getnotetracktimes( var_4, "turn_begin" );
var_9 = getnotetracktimes( var_4, "turn_end" );
var_10 = ( var_9[0] - var_8[0] ) * var_5;
self.dogturnadjust = angleclamp180( var_3 - var_6 );
self.dogturnrate = max( abs( self.dogturnadjust ) / var_10 / 1000, 0.01 );
self orientmode( "face angle", self.angles[1] );
animscripts\shared::donotetracks( "dog_turn", ::handledogturnnotetracks );
}
else
{
self.prevturnrate = self.turnrate;
self.turnrate = max( abs( angleclamp180( var_3 - var_6 ) ) / var_5 / 1000, 0.01 );
self orientmode( "face angle", angleclamp180( var_0 - var_6 ) );
animscripts\shared::donotetracks( "dog_turn" );
self.turnrate = self.prevturnrate;
self.prevturnrate = undefined;
}
self clearanim( var_4, 0.2 );
self animmode( "none" );
}
rotatetoangle( var_0, var_1 )
{
self orientmode( "face angle", var_0 );
while ( abs( angleclamp180( var_0 - self.angles[1] ) ) > var_1 )
wait 0.1;
}
shouldcoveridle()
{
var_0 = dogstop_getnode();
if ( isdefined( var_0 ) && issubstr( var_0.type, "Cover" ) )
return 1;
return 0;
}
chooseattackidle()
{
var_0 = [ "attackidle_twitch_1", "attackidle_twitch_2" ];
var_1 = [ 1, 1 ];
if ( !isdefined( self.script_nobark ) || !self.script_nobark )
{
var_2 = var_0.size;
var_0[var_2] = "attackidle_bark";
var_1[var_2] = 4;
}
var_3 = 0;
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
var_3 = var_3 + var_1[var_2];
var_4 = randomint( var_3 );
var_5 = 0;
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
var_5 = var_5 + var_1[var_2];
if ( var_4 < var_5 )
return var_0[var_2];
}
}
dodrivenidle()
{
playidlesound( self.customidlesound );
playidleanim( "sneakstandidle", getdogstopanim( "sneakstandidle" ), 0, 0.5, -1 );
}
dospecialidle()
{
if ( isarray( self.specialidleanim ) )
var_0 = self.specialidleanim[randomint( self.specialidleanim.size )];
else
var_0 = self.specialidleanim;
playidlesound( self.customidlesound );
playidleanim( "specialidle", var_0, 0, 0.5, -1 );
}
docustomidle()
{
if ( isarray( self.customidleanimset ) )
{
if ( isdefined( self.customidleanimweights ) )
var_0 = animscripts\utility::anim_array( self.customidleanimset, self.customidleanimweights );
else
var_0 = self.customidleanimset[randomint( self.customidleanimset.size )];
}
else
var_0 = self.customidleanimset;
playidlesound( self.customidlesound );
playidleanim( "customidle", var_0, 0, 0.5, -1 );
}
dolookatidle()
{
if ( !isdefined( self.bidlelooking ) || !self.bidlelooking )
{
self.bidlelooking = 1;
thread lookatidleupdate();
}
wait 0.5;
}
stoplookatidle()
{
if ( !isdefined( self.bidlelooking ) || !self.bidlelooking )
return;
self.bidlelooking = undefined;
self.idletrackloop = undefined;
self notify( "endIdleLookAt" );
self clearanim( %look_2, 1 );
self clearanim( %look_4, 1 );
self clearanim( %look_6, 1 );
self clearanim( %look_8, 1 );
}
lookatidleupdate()
{
self endon( "killanimscript" );
self endon( "endIdleLookAt" );
while ( isdefined( self.idlelookattargets ) && isarray( self.idlelookattargets ) && self.idlelookattargets.size > 0 )
{
var_0 = getlookattarget( self.lookattarget );
self.lookattarget = var_0;
if ( !isdefined( self.idletrackloop ) )
thread idletrackloop();
var_1 = 3 + randomfloat( 3 );
wait( var_1 );
}
stoplookatidle();
}
getlookattarget( var_0 )
{
if ( isdefined( self.alwayslookatfirsttarget ) && self.alwayslookatfirsttarget && self.idlelookattargets.size > 0 )
return self.idlelookattargets[0];
var_1 = isdefined( var_0 );
if ( self.idlelookattargets.size == 1 )
{
if ( var_1 )
return undefined;
else
return self.idlelookattargets[0];
}
if ( var_1 )
{
var_2 = randomint( 100 );
if ( var_2 < 33 )
return undefined;
}
var_3 = self.idlelookattargets;
var_4 = [];
var_5 = 0;
var_6 = !var_1;
for ( var_7 = 0; var_7 < var_3.size; var_7++ )
{
if ( !var_6 && var_3[var_7] == var_0 )
{
var_8 = var_3.size - 1;
if ( var_7 != var_8 )
var_3[var_7] = var_3[var_8];
var_3[var_8] = undefined;
var_6 = 1;
if ( var_7 == var_8 )
break;
}
var_9 = distance2dsquared( self.origin, var_3[var_7].origin );
var_4[var_7] = 1 / var_9;
var_5 = var_5 + var_4[var_7];
}
var_10 = randomfloat( var_5 );
var_11 = 0;
for ( var_7 = 0; var_7 < var_3.size; var_7++ )
{
var_11 = var_11 + var_4[var_7];
if ( var_10 < var_11 )
return var_3[var_7];
}
}
idletrackloop()
{
self endon( "killanimscript" );
self endon( "endIdleLookAt" );
self.idletrackloop = 1;
self clearanim( %dog_idle_knob, 0.2 );
self setanimknob( getdogstopanimbase(), 1, 0.5 );
self setanimknoblimited( getdogstopanimlook( "2" ), 1, 0 );
self setanimknoblimited( getdogstopanimlook( "4" ), 1, 0 );
self setanimknoblimited( getdogstopanimlook( "6" ), 1, 0 );
self setanimknoblimited( getdogstopanimlook( "8" ), 1, 0 );
var_0 = 90;
var_1 = -100;
var_2 = -25;
var_3 = 25;
self.currenttrackingyaw = 0;
self.currenttrackingyawspeed = 0;
for (;;)
{
var_4 = self geteye();
if ( isdefined( self.lookattarget ) )
{
var_5 = self.lookattarget geteye();
var_6 = var_5 - var_4;
var_7 = vectortoangles( var_6 );
}
else
var_7 = self.angles;
var_8 = angleclamp180( var_7[1] - self.angles[1] );
var_9 = angleclamp180( var_7[0] - self.angles[0] );
if ( var_8 > var_0 || var_8 < var_1 )
{
self.currenttrackingyaw = 0;
self.currenttrackingyawspeed = 0;
turntoangle( self.angles[1] + var_8 * 0.75 );
self setanimknob( getdogstopanimbase(), 1, 0.1 );
continue;
}
var_10 = calctrackingyaw( var_8, self.currenttrackingyaw, self.currenttrackingyawspeed );
self.currenttrackingyaw = var_10;
var_11 = 0;
var_12 = 0;
var_13 = 0;
var_14 = 0;
if ( var_10 > 0 )
var_11 = clamp( var_10 / var_0, 0, 1 );
else
var_12 = clamp( var_10 / var_1, 0, 1 );
if ( var_9 < 0 )
var_13 = clamp( var_9 / var_2, 0, 1 );
else
var_14 = clamp( var_9 / var_3, 0, 1 );
self setanimlimited( %look_2, var_14, 1 );
self setanimlimited( %look_4, var_11, 0.1 );
self setanimlimited( %look_6, var_12, 0.1 );
self setanimlimited( %look_8, var_13, 1 );
wait 0.05;
}
}
calctrackingyaw( var_0, var_1, var_2 )
{
var_3 = 90;
var_4 = -100;
var_5 = 1;
var_6 = 0.5;
var_7 = 6;
var_8 = clamp( var_0, var_4, var_3 );
var_9 = angleclamp180( var_8 - var_1 );
if ( var_8 > var_1 )
{
if ( var_2 >= 0 && !needtodecelforarrival( var_9, var_2, var_6 ) )
var_10 = var_2 + var_5;
else if ( var_2 >= 0 )
var_10 = var_2 - var_6;
else
var_10 = var_2 + var_6;
}
else if ( var_2 <= 0 && !needtodecelforarrival( var_9, var_2, var_6 ) )
var_10 = var_2 - var_5;
else if ( var_2 <= 0 )
var_10 = var_2 + var_6;
else
var_10 = var_2 - var_6;
var_10 = clamp( var_10, -1 * var_7, var_7 );
if ( var_8 >= var_1 && var_1 + var_10 > var_8 )
var_10 = var_8 - var_1;
else if ( var_8 <= var_1 && var_1 + var_10 < var_8 )
var_10 = var_8 - var_1;
var_11 = var_1 + var_10;
self.currenttrackingyawspeed = var_10;
return var_11;
}
needtodecelforarrival( var_0, var_1, var_2 )
{
if ( var_1 == 0 )
return 0;
var_3 = abs( var_0 );
var_4 = abs( var_1 );
var_2 = abs( var_2 );
while ( var_3 > 0 )
{
var_3 = var_3 - var_4;
var_4 = var_4 - var_2;
if ( var_4 < 0 )
return 0;
}
return 1;
}
dogstop_getnode()
{
if ( isdefined( self.node ) )
return self.node;
return self.prevnode;
}
getdefaultidlestate( var_0 )
{
if ( isdefined( self.defaultidlestateoverride ) )
return self.defaultidlestateoverride;
var_1 = isdefined( self.enemy ) && isalive( self.enemy );
var_2 = var_1 && distancesquared( self.origin, self.enemy.origin ) < 1000000 && ( isdefined( self.favoriteenemy ) || self seerecently( self.enemy, 5 ) );
var_3 = dogstop_getnode();
if ( isdefined( self.aggresivelookat ) )
return "attackidle";
if ( !isdefined( var_0 ) )
var_0 = 1;
if ( isdefined( var_3 ) && ( !var_0 || distance( self.origin, var_3.origin ) <= 32 ) )
{
if ( var_3.type == "Guard" )
{
if ( var_2 )
return "attackidle";
else
return "alertidle";
}
else if ( issubstr( var_3.type, "Cover" ) )
return "sneakidle";
else if ( var_1 )
{
if ( var_2 )
return "attackidle";
else
return "alertidle";
}
}
if ( var_2 )
return "attackidle";
if ( animscripts\dog\dog_move::shouldsniff() )
return "sniffidle";
return "casualidle";
}
should_growl()
{
if ( isdefined( self.script_growl ) )
return 1;
if ( !isdefined( self.enemy ) )
return 0;
if ( !isalive( self.enemy ) )
return 1;
return !self cansee( self.enemy );
}
lookattarget( var_0 )
{
self endon( "killanimscript" );
self endon( "stop tracking" );
self clearanim( %german_shepherd_look_2, 0 );
self clearanim( %german_shepherd_look_4, 0 );
self clearanim( %german_shepherd_look_6, 0 );
self clearanim( %german_shepherd_look_8, 0 );
self setdefaultaimlimits();
self.rightaimlimit = 90;
self.leftaimlimit = -90;
self setanimlimited( anim.doglookpose[var_0][2], 1, 0 );
self setanimlimited( anim.doglookpose[var_0][4], 1, 0 );
self setanimlimited( anim.doglookpose[var_0][6], 1, 0 );
self setanimlimited( anim.doglookpose[var_0][8], 1, 0 );
animscripts\track::setanimaimweight( 1, 0.2 );
animscripts\track::trackloop( %german_shepherd_look_2, %german_shepherd_look_4, %german_shepherd_look_6, %german_shepherd_look_8 );
}
playidlesound( var_0 )
{
if ( !animscripts\dog\dog_move::aredifferent( self.idlesound, var_0 ) )
return;
stopidlesound();
if ( isdefined( var_0 ) )
thread loopidlesound( var_0 );
}
loopidlesound( var_0 )
{
self endon( "killanimscript" );
var_1 = spawn( "script_origin", self.origin );
var_1.angles = self.angles;
var_1 linkto( self );
self.idlesoundorigin = var_1;
self.idlesound = var_0;
for (;;)
{
var_1 playsound( var_0, "dog_idle_sound" );
var_2 = idlesound_waitfordoneordeath( var_1, "dog_idle_sound" );
if ( !isdefined( var_2 ) )
break;
}
}
idlesound_waitfordoneordeath( var_0, var_1 )
{
self endon( "death" );
var_0 endon( "death" );
var_0 waittill( var_1 );
return 1;
}
stopidlesound()
{
if ( isdefined( self.idlesoundorigin ) )
{
if ( self.idlesoundorigin iswaitingonsound() )
{
self.idlesoundorigin stopsounds();
wait 0.05;
}
self.idlesoundorigin delete();
self.idlesoundorigin = undefined;
self.idlesound = undefined;
}
}
getdognexttwitchtime()
{
if ( isdefined( self.script_nobark ) && self.script_nobark )
return gettime() + 4000 + randomint( 3000 );
return gettime() + 1000 + randomint( 1000 );
}
getdogstopanimbase()
{
if ( isdefined( self.aggresivelookat ) )
return getdogstopanim( "attackidle_base" );
else
return getdogstopanim( "casualidle_base" );
}
getdogstopanimlook( var_0 )
{
if ( isdefined( self.aggresivelookat ) )
return getdogstopanim( "attackidle_look_" + var_0 );
else
return getdogstopanim( "casualidle_look_" + var_0 );
}
getdogstopanim( var_0 )
{
var_1 = animscripts\utility::lookupdoganim( "stop", var_0 );
return var_1;
}
getdogstoptransitionanim( var_0, var_1 )
{
var_2 = animscripts\utility::lookupdoganim( "stop", "transition" );
if ( isdefined( var_2[var_0] ) && isdefined( var_2[var_0][var_1] ) )
return var_2[var_0][var_1];
return undefined;
}
initdogarchetype_stop()
{
var_0 = [];
var_0["attackidle"] = %iw6_dog_attackidle;
var_0["attack_turn_left"] = %iw6_dog_attackidle_turn_4;
var_0["attack_turn_right"] = %iw6_dog_attackidle_turn_6;
var_0["attack_turn_180"] = %iw6_dog_attackidle_turn_2;
var_0["attackidle_base"] = %iw6_dog_attackidle_base;
var_0["attackidle_look_2"] = %iw6_dog_attackidle_2;
var_0["attackidle_look_4"] = %iw6_dog_attackidle_4;
var_0["attackidle_look_6"] = %iw6_dog_attackidle_6;
var_0["attackidle_look_8"] = %iw6_dog_attackidle_8;
var_0["alertidle"] = %iw6_dog_alertidle;
var_0["attackidle_bark"] = %iw6_dog_attackidle_bark;
var_0["attackidle_twitch_1"] = %iw6_dog_attackidle_twitch_1;
var_0["attackidle_twitch_2"] = %iw6_dog_attackidle_twitch_2;
var_0["casualidle"] = %iw6_dog_casualidle;
var_0["casual_turn_left"] = %iw6_dog_casualidle_turn_4;
var_0["casual_turn_right"] = %iw6_dog_casualidle_turn_6;
var_0["casual_turn_180"] = %iw6_dog_casualidle_turn_2;
var_0["casualidle_base"] = %iw6_dog_casualidle_base;
var_0["casualidle_look_2"] = %iw6_dog_casualidle_2;
var_0["casualidle_look_4"] = %iw6_dog_casualidle_4;
var_0["casualidle_look_6"] = %iw6_dog_casualidle_6;
var_0["casualidle_look_8"] = %iw6_dog_casualidle_8;
var_0["sneakstandidle"] = %iw6_dog_sneak_stand_idle;
var_0["sneakidle"] = %iw6_dog_sneakidle;
var_0["sniffidle"] = %iw6_dog_sniff_idle;
var_0["transition"] = [];
var_0["transition"]["casualidle"] = [];
var_0["transition"]["casualidle"]["sneakidle"] = %iw6_dog_idle_2_sneak_idle;
var_0["transition"]["casualidle"]["alertidle"] = %iw6_dog_idle_2_alert_idle;
var_0["transition"]["casualidle"]["attackidle"] = %iw6_dog_idle_2_alert_idle;
var_0["transition"]["alertidle"] = [];
var_0["transition"]["alertidle"]["casualidle"] = %iw6_dog_alert_2_casual_idle;
var_0["transition"]["alertidle"]["sneakidle"] = %iw6_dog_idle_2_sneak_idle;
var_0["transition"]["attackidle"] = [];
var_0["transition"]["attackidle"]["casualidle"] = %iw6_dog_alert_2_casual_idle;
var_0["transition"]["attackidle"]["sneakidle"] = %iw6_dog_idle_2_sneak_idle;
var_0["transition"]["sneakidle"] = [];
var_0["transition"]["sneakidle"]["casualidle"] = %iw6_dog_sneak_2_casual_idle;
var_0["transition"]["sneakidle"]["alertidle"] = %iw6_dog_sneak_2_casual_idle;
var_0["transition"]["sneakidle"]["attackidle"] = %iw6_dog_sneak_2_casual_idle;
anim.archetypes["dog"]["stop"] = var_0;
}

View File

@ -0,0 +1,11 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
initdogvestanimations()
{
if ( isdefined( anim.notfirsttimedogvests ) )
return;
anim.notfirsttimedogvests = 1;
animscripts\dog\dog_init::initdoganimations();
}

262
animscripts/door.gsc Normal file
View File

@ -0,0 +1,262 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
doorenterexitcheck()
{
self endon( "killanimscript" );
if ( isdefined( self.disabledoorbehavior ) )
return;
for (;;)
{
var_0 = self getdoorpathnode();
if ( isdefined( var_0 ) )
break;
wait 0.2;
}
var_1 = var_0.type == "Door Interior" || self comparenodedirtopathdir( var_0 );
if ( var_1 )
doorenter( var_0 );
else
doorexit( var_0 );
for (;;)
{
var_2 = self getdoorpathnode();
if ( !isdefined( var_2 ) || var_2 != var_0 )
break;
wait 0.2;
}
thread doorenterexitcheck();
}
teamflashbangimmune()
{
self endon( "killanimscript" );
self.teamflashbangimmunity = 1;
wait 5;
self.teamflashbangimmunity = undefined;
}
#using_animtree("generic_human");
dodoorgrenadethrow( var_0 )
{
thread teamflashbangimmune();
if ( self.grenadeweapon == "flash_grenade" )
self notify( "flashbang_thrown" );
self orientmode( "face current" );
var_0.nextdoorgrenadetime = gettime() + 5000;
self.minindoortime = gettime() + 100000;
self notify( "move_interrupt" );
self.update_move_anim_type = undefined;
self clearanim( %combatrun, 0.2 );
self.a.movement = "stop";
self waittill( "done_grenade_throw" );
self orientmode( "face default" );
self.minindoortime = gettime() + 5000;
self.grenadeweapon = self.oldgrenadeweapon;
self.oldgrenadeweapon = undefined;
animscripts\run::endfaceenemyaimtracking();
thread animscripts\move::pathchangelistener();
thread animscripts\move::restartmoveloop( 1 );
}
doorenter_trygrenade( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = 0;
var_6 = 3;
var_7 = undefined;
var_7 = %cqb_stand_grenade_throw;
var_8 = anglestoforward( var_0.angles );
if ( var_0.type == "Door Interior" && !self comparenodedirtopathdir( var_0 ) )
var_8 = -1 * var_8;
var_9 = ( var_0.origin[0], var_0.origin[1], var_0.origin[2] + 64 );
var_10 = var_9;
if ( var_2 )
{
var_11 = anglestoright( var_0.angles );
var_12 = var_0.origin - self.origin;
var_13 = vectordot( var_11, var_12 );
if ( var_13 > 20 )
var_13 = 20;
else if ( var_13 < -20 )
var_13 = -20;
var_10 = var_9 + var_13 * var_11;
}
while ( var_6 > 0 )
{
if ( isdefined( self.grenade ) || !isdefined( self.enemy ) )
return;
if ( onsamesideofdoor( var_0, var_8 ) )
return;
if ( !self seerecently( self.enemy, 0.2 ) && self.a.pose == "stand" && distance2dandheightcheck( self.enemy.origin - var_0.origin, 360000, 16384 ) )
{
if ( isdefined( var_0.nextdoorgrenadetime ) && var_0.nextdoorgrenadetime > gettime() )
return;
if ( self canshootenemy() )
return;
var_12 = var_0.origin - self.origin;
if ( lengthsquared( var_12 ) < var_3 )
return;
if ( vectordot( var_12, var_8 ) < 0 )
return;
self.oldgrenadeweapon = self.grenadeweapon;
self.grenadeweapon = var_1;
animscripts\combat_utility::setactivegrenadetimer( self.enemy );
if ( !var_5 )
{
var_14 = var_9 + var_8 * 100;
if ( !self isgrenadepossafe( self.enemy, var_14, 128 ) )
return;
}
var_5 = 1;
if ( animscripts\combat_utility::trygrenadethrow( self.enemy, var_10, var_7, animscripts\combat_utility::getgrenadethrowoffset( var_7 ), 1, 0, 1 ) )
{
dodoorgrenadethrow( var_0 );
return;
}
}
var_6--;
wait( var_4 );
var_15 = self getdoorpathnode();
if ( !isdefined( var_15 ) || var_15 != var_0 )
return;
}
}
indoorcqbtogglecheck()
{
self endon( "killanimscript" );
if ( isdefined( self.disabledoorbehavior ) )
return;
self.isindoor = 0;
for (;;)
{
if ( self isindoor() && !self.doingambush )
doorenter_enable_cqbwalk();
else if ( !isdefined( self.minindoortime ) || self.minindoortime < gettime() )
{
self.minindoortime = undefined;
doorexit_disable_cqbwalk();
}
wait 0.2;
}
}
doorenter_enable_cqbwalk()
{
if ( !isdefined( self.neverenablecqb ) && !self.doingambush )
{
self.isindoor = 1;
if ( !isdefined( self.cqbwalking ) || !self.cqbwalking )
maps\_utility::enable_cqbwalk( 1 );
}
}
doorexit_disable_cqbwalk()
{
if ( !isdefined( self.cqbenabled ) )
{
self.isindoor = 0;
if ( isdefined( self.cqbwalking ) && self.cqbwalking )
maps\_utility::disable_cqbwalk();
}
}
distance2dandheightcheck( var_0, var_1, var_2 )
{
return var_0[0] * var_0[0] + var_0[1] * var_0[1] < var_1 && var_0[2] * var_0[2] < var_2;
}
onsamesideofdoor( var_0, var_1 )
{
var_2 = var_0.origin - self.origin;
var_3 = var_0.origin - self.enemy.origin;
return vectordot( var_2, var_1 ) * vectordot( var_3, var_1 ) > 0;
}
doorenter( var_0 )
{
for (;;)
{
if ( isdefined( self.doorfragchance ) && ( self.doorfragchance == 0 || self.doorfragchance < randomfloat( 1 ) ) )
break;
if ( distance2dandheightcheck( self.origin - var_0.origin, 562500, 25600 ) )
{
doorenter_trygrenade( var_0, "fraggrenade", 0, 302500, 0.3 );
var_0 = self getdoorpathnode();
if ( !isdefined( var_0 ) )
return;
break;
}
wait 0.1;
}
for (;;)
{
if ( distance2dandheightcheck( self.origin - var_0.origin, 36864, 6400 ) )
{
doorenter_enable_cqbwalk();
self.minindoortime = gettime() + 6000;
if ( isdefined( self.doorflashchance ) && ( self.doorflashchance == 0 || self.doorflashchance < randomfloat( 1 ) ) )
return;
doorenter_trygrenade( var_0, "flash_grenade", 1, 4096, 0.2 );
return;
}
wait 0.1;
}
}
doorexit( var_0 )
{
for (;;)
{
if ( !self.isindoor || distancesquared( self.origin, var_0.origin ) < 1024 )
return;
wait 0.1;
}
}

393
animscripts/exit_node.gsc Normal file
View File

@ -0,0 +1,393 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
startmovetransition()
{
if ( isdefined( self.custommovetransition ) )
{
custommovetransition();
return;
}
self endon( "killanimscript" );
if ( !checktransitionpreconditions() )
return;
var_0 = self.origin;
var_1 = self.angles[1];
var_2 = "exposed";
var_3 = 0;
var_4 = getexitnode();
if ( isdefined( var_4 ) )
{
var_5 = determinenodeexittype( var_4 );
if ( isdefined( var_5 ) )
{
var_2 = var_5;
var_3 = 1;
if ( isdefined( self.heat ) )
var_2 = determineheatcoverexittype( var_4, var_2 );
if ( !isdefined( anim.exposedtransition[var_2] ) && var_2 != "stand_saw" && var_2 != "crouch_saw" )
{
var_6 = animscripts\utility::absangleclamp180( self.angles[1] - animscripts\utility::getnodeforwardyaw( var_4 ) );
if ( var_6 < 5 )
{
if ( !isdefined( self.heat ) )
var_0 = var_4.origin;
var_1 = animscripts\utility::getnodeforwardyaw( var_4 );
}
}
}
}
if ( !checktransitionconditions( var_2, var_4 ) )
return;
var_7 = isdefined( anim.exposedtransition[var_2] );
if ( !var_3 )
var_2 = determinenonnodeexittype();
var_8 = ( -1 * self.lookaheaddir[0], -1 * self.lookaheaddir[1], 0 );
var_9 = getmaxdirectionsandexcludedirfromapproachtype( var_4 );
var_10 = var_9.maxdirections;
var_11 = var_9.excludedir;
var_12 = spawnstruct();
calculatenodetransitionangles( var_12, var_2, 0, var_1, var_8, var_10, var_11 );
sortnodetransitionangles( var_12, var_10 );
var_13 = -1;
var_14 = 3;
if ( var_7 )
var_14 = 1;
for ( var_15 = 1; var_15 <= var_14; var_15++ )
{
var_13 = var_12.transindex[var_15];
if ( checknodeexitpos( var_0, var_1, var_2, var_7, var_13 ) )
break;
}
if ( var_15 > var_14 )
return;
var_16 = distancesquared( self.origin, self.coverexitpos ) * 1.25 * 1.25;
if ( distancesquared( self.origin, self.pathgoalpos ) < var_16 )
return;
donodeexitanimation( var_2, var_13 );
}
determinenodeexittype( var_0 )
{
if ( animscripts\cover_arrival::canusesawapproach( var_0 ) )
{
if ( var_0.type == "Cover Stand" )
return "stand_saw";
if ( var_0.type == "Cover Crouch" )
return "crouch_saw";
else if ( var_0.type == "Cover Prone" )
return "prone_saw";
}
if ( !isdefined( anim.approach_types[var_0.type] ) )
return;
if ( isdefined( anim.requiredexitstance[var_0.type] ) && anim.requiredexitstance[var_0.type] != self.a.pose )
return;
var_1 = self.a.pose;
if ( var_1 == "prone" )
var_1 = "crouch";
var_2 = anim.approach_types[var_0.type][var_1];
if ( animscripts\cover_arrival::usereadystand() && var_2 == "exposed" )
var_2 = "exposed_ready";
if ( animscripts\utility::shouldcqb() )
{
var_3 = var_2 + "_cqb";
if ( isdefined( anim.archetypes["soldier"]["cover_exit"][var_3] ) )
var_2 = var_3;
}
return var_2;
}
checktransitionpreconditions()
{
if ( !isdefined( self.pathgoalpos ) )
return 0;
if ( !self shouldfacemotion() )
return 0;
if ( self.a.pose == "prone" )
return 0;
if ( isdefined( self.disableexits ) && self.disableexits )
return 0;
if ( self.stairsstate != "none" )
return 0;
if ( !self isstanceallowed( "stand" ) && !isdefined( self.heat ) )
return 0;
if ( distancesquared( self.origin, self.pathgoalpos ) < 10000 )
return 0;
return 1;
}
checktransitionconditions( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( var_0 == "exposed" || isdefined( self.heat ) )
{
if ( self.a.pose != "stand" && self.a.pose != "crouch" )
return 0;
if ( self.a.movement != "stop" )
return 0;
}
if ( !isdefined( self.heat ) && isdefined( self.enemy ) && vectordot( self.lookaheaddir, self.enemy.origin - self.origin ) < 0 )
{
if ( animscripts\utility::canseeenemyfromexposed() && distancesquared( self.origin, self.enemy.origin ) < 90000 )
return 0;
}
return 1;
}
determinenonnodeexittype( var_0 )
{
if ( self.a.pose == "stand" )
var_0 = "exposed";
else
var_0 = "exposed_crouch";
if ( animscripts\cover_arrival::usereadystand() )
var_0 = "exposed_ready";
if ( animscripts\utility::shouldcqb() )
var_0 = var_0 + "_cqb";
else if ( isdefined( self.heat ) )
var_0 = "heat";
return var_0;
}
getmaxdirectionsandexcludedirfromapproachtype( var_0 )
{
var_1 = spawnstruct();
if ( isdefined( var_0 ) && isdefined( anim.maxdirections[var_0.type] ) )
{
var_1.maxdirections = anim.maxdirections[var_0.type];
var_1.excludedir = anim.excludedir[var_0.type];
}
else
{
var_1.maxdirections = 9;
var_1.excludedir = -1;
}
return var_1;
}
calculatenodetransitionangles( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_0.transitions = [];
var_0.transindex = [];
var_7 = undefined;
var_8 = 1;
var_9 = 0;
if ( var_2 )
{
var_7 = animscripts\utility::lookupanim( "cover_trans_angles", var_1 );
var_8 = -1;
var_9 = 0;
}
else
{
var_7 = animscripts\utility::lookupanim( "cover_exit_angles", var_1 );
var_8 = 1;
var_9 = 180;
}
for ( var_10 = 1; var_10 <= var_5; var_10++ )
{
var_0.transindex[var_10] = var_10;
if ( var_10 == 5 || var_10 == var_6 || !isdefined( var_7[var_10] ) )
{
var_0.transitions[var_10] = -1.0003;
continue;
}
var_11 = ( 0, var_3 + var_8 * var_7[var_10] + var_9, 0 );
var_12 = vectornormalize( anglestoforward( var_11 ) );
var_0.transitions[var_10] = vectordot( var_4, var_12 );
}
}
sortnodetransitionangles( var_0, var_1 )
{
for ( var_2 = 2; var_2 <= var_1; var_2++ )
{
var_3 = var_0.transitions[var_0.transindex[var_2]];
var_4 = var_0.transindex[var_2];
for ( var_5 = var_2 - 1; var_5 >= 1; var_5-- )
{
if ( var_3 < var_0.transitions[var_0.transindex[var_5]] )
break;
var_0.transindex[var_5 + 1] = var_0.transindex[var_5];
}
var_0.transindex[var_5 + 1] = var_4;
}
}
checknodeexitpos( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = ( 0, var_1, 0 );
var_6 = anglestoforward( var_5 );
var_7 = anglestoright( var_5 );
var_8 = animscripts\utility::lookuptransitionanim( "cover_exit_dist", var_2, var_4 );
var_9 = var_6 * var_8[0];
var_10 = var_7 * var_8[1];
var_11 = var_0 + var_9 - var_10;
self.coverexitpos = var_11;
if ( !var_3 && !self checkcoverexitposwithpath( var_11 ) )
return 0;
if ( !self maymovefrompointtopoint( self.origin, var_11 ) )
return 0;
if ( var_4 <= 6 || var_3 )
return 1;
var_12 = animscripts\utility::lookuptransitionanim( "cover_exit_postdist", var_2, var_4 );
var_9 = var_6 * var_12[0];
var_10 = var_7 * var_12[1];
var_13 = var_11 + var_9 - var_10;
self.coverexitpos = var_13;
return self maymovefrompointtopoint( var_11, var_13 );
}
#using_animtree("generic_human");
donodeexitanimation( var_0, var_1 )
{
var_2 = animscripts\utility::lookuptransitionanim( "cover_exit", var_0, var_1 );
var_3 = vectortoangles( self.lookaheaddir );
if ( self.a.pose == "prone" )
return;
var_5 = 0.2;
if ( self.swimmer )
self animmode( "nogravity", 0 );
else
self animmode( "zonly_physics", 0 );
self orientmode( "face angle", self.angles[1] );
self setflaggedanimknoballrestart( "coverexit", var_2, %body, 1, var_5, self.movetransitionrate );
animscripts\shared::donotetracks( "coverexit" );
self.a.pose = "stand";
self.a.movement = "run";
self.ignorepathchange = undefined;
self orientmode( "face motion" );
self animmode( "none", 0 );
finishcoverexitnotetracks( "coverexit" );
self clearanim( %root, 0.2 );
self orientmode( "face default" );
self animmode( "normal", 0 );
}
finishcoverexitnotetracks( var_0 )
{
self endon( "move_loop_restart" );
animscripts\shared::donotetracks( var_0 );
}
determineheatcoverexittype( var_0, var_1 )
{
if ( var_0.type == "Cover Right" )
var_1 = "heat_right";
else if ( var_0.type == "Cover Left" )
var_1 = "heat_left";
return var_1;
}
getexitnode()
{
var_0 = undefined;
if ( !isdefined( self.heat ) )
var_1 = 400;
else
var_1 = 4096;
if ( animscripts\utility::isspaceai() )
var_1 = 1024;
if ( isdefined( self.node ) && distancesquared( self.origin, self.node.origin ) < var_1 )
var_0 = self.node;
else if ( isdefined( self.prevnode ) && distancesquared( self.origin, self.prevnode.origin ) < var_1 )
var_0 = self.prevnode;
if ( isdefined( var_0 ) && isdefined( self.heat ) && animscripts\utility::absangleclamp180( self.angles[1] - var_0.angles[1] ) > 30 )
return undefined;
return var_0;
}
custommovetransition()
{
var_0 = self.custommovetransition;
if ( !isdefined( self.permanentcustommovetransition ) )
self.custommovetransition = undefined;
var_1 = [[ var_0 ]]();
if ( !isdefined( self.permanentcustommovetransition ) )
self.startmovetransitionanim = undefined;
if ( !isdefined( var_1 ) )
var_1 = 0.2;
self clearanim( %root, var_1 );
self orientmode( "face default" );
self animmode( "none", 0 );
}
debug_arrival( var_0 )
{
if ( !animscripts\cover_arrival::debug_arrivals_on_actor() )
return;
}

384
animscripts/face.gsc Normal file
View File

@ -0,0 +1,384 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
initcharacterface()
{
if ( !anim.usefacialanims )
return;
if ( !isdefined( self.a.currentdialogimportance ) )
{
self.a.currentdialogimportance = 0;
self.a.idleface = anim.alertface;
self.facewaiting = [];
self.facelastnotifynum = 0;
}
}
saygenericdialogue( var_0 )
{
var_1 = undefined;
switch ( self.voice )
{
case "pmc":
case "czech":
case "french":
case "delta":
case "taskforce":
case "seal":
case "american":
var_2 = "friendly";
var_3 = anim.numfriendlyvoices;
break;
default:
var_2 = "enemy";
var_3 = anim.numenemyvoices;
}
var_1 = 1 + self getentitynumber() % var_3;
var_2 = var_2 + "_" + var_1;
var_4 = undefined;
switch ( var_0 )
{
case "meleeattack":
case "meleecharge":
var_5 = 0.5;
break;
case "flashbang":
var_5 = 0.7;
break;
case "pain":
var_5 = 0.9;
break;
case "dogdeathlongplr":
case "dogdeathshortplr":
case "dogdeathlong":
case "dogdeathshort":
case "death":
var_5 = 1.0;
break;
default:
var_5 = 0.3;
break;
}
var_6 = undefined;
if ( isdefined( self.generic_voice_override ) )
{
var_6 = self.generic_voice_override + "_" + var_0 + "_" + var_2;
if ( !soundexists( var_6 ) )
var_6 = "generic_" + var_0 + "_" + var_2;
}
else
var_6 = "generic_" + var_0 + "_" + var_2;
thread playfacethread( var_4, var_6, var_5 );
}
setidlefacedelayed( var_0 )
{
animscripts\battlechatter::playbattlechatter();
self.a.idleface = var_0;
}
setidleface( var_0 )
{
if ( !anim.usefacialanims )
return;
animscripts\battlechatter::playbattlechatter();
self.a.idleface = var_0;
playidleface();
}
sayspecificdialogue( var_0, var_1, var_2, var_3, var_4, var_5 )
{
thread playfacethread( var_0, var_1, var_2, var_3, var_4, var_5 );
}
chooseanimfromset( var_0 )
{
return;
}
playidleface()
{
return;
}
playfacethread( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self.a.facialanimdone = 1;
self.a.facialsounddone = 1;
if ( isdefined( var_3 ) )
{
if ( isdefined( var_1 ) )
{
self playsoundatviewheight( var_1, "animscript facesound" + var_3, 1 );
thread waitforfacesound( var_3 );
}
}
else
self playsoundatviewheight( var_1 );
if ( !anim.usefacialanims )
return;
initcharacterface();
if ( !isdefined( var_0 ) && !isdefined( var_1 ) )
{
if ( isdefined( var_3 ) )
{
wait 0;
self.faceresult = "failed";
self notify( var_3 );
}
}
else
{
self endon( "death" );
if ( isstring( var_2 ) )
{
switch ( var_2 )
{
case "any":
var_2 = 0.1;
break;
case "pain":
var_2 = 0.9;
break;
case "death":
var_2 = 1.0;
break;
}
}
if ( var_2 <= self.a.currentdialogimportance && ( isdefined( var_4 ) && var_4 == "wait" ) )
{
var_6 = self.facewaiting.size;
var_7 = self.facelastnotifynum + 1;
self.facewaiting[var_6]["facialanim"] = var_0;
self.facewaiting[var_6]["soundAlias"] = var_1;
self.facewaiting[var_6]["importance"] = var_2;
self.facewaiting[var_6]["notifyString"] = var_3;
self.facewaiting[var_6]["waitOrNot"] = var_4;
self.facewaiting[var_6]["timeToWait"] = var_5;
self.facewaiting[var_6]["notifyNum"] = var_7;
thread playface_waitfornotify( "animscript face stop waiting " + self.facewaiting[var_6]["notifyNum"], "Face done waiting", "Face done waiting" );
if ( isdefined( var_5 ) )
thread playface_waitfortime( var_5, "Face done waiting", "Face done waiting" );
self waittill( "Face done waiting" );
var_6 = undefined;
for ( var_8 = 0; var_8 < self.facewaiting.size; var_8++ )
{
if ( self.facewaiting[var_8]["notifyNum"] == var_7 )
{
var_6 = var_8;
break;
}
}
if ( self.a.facewaitforresult == "notify" )
playfacethread( self.facewaiting[var_6]["facialanim"], self.facewaiting[var_6]["soundAlias"], self.facewaiting[var_6]["importance"], self.facewaiting[var_6]["notifyString"] );
else if ( isdefined( var_3 ) )
{
self.faceresult = "failed";
self notify( var_3 );
}
for ( var_8 = var_6 + 1; var_8 < self.facewaiting.size; var_8++ )
{
self.facewaiting[var_8 - 1]["facialanim"] = self.facewaiting[var_8]["facialanim"];
self.facewaiting[var_8 - 1]["soundAlias"] = self.facewaiting[var_8]["soundAlias"];
self.facewaiting[var_8 - 1]["importance"] = self.facewaiting[var_8]["importance"];
self.facewaiting[var_8 - 1]["notifyString"] = self.facewaiting[var_8]["notifyString"];
self.facewaiting[var_8 - 1]["waitOrNot"] = self.facewaiting[var_8]["waitOrNot"];
self.facewaiting[var_8 - 1]["timeToWait"] = self.facewaiting[var_8]["timeToWait"];
self.facewaiting[var_8 - 1]["notifyNum"] = self.facewaiting[var_8]["notifyNum"];
}
self.facewaiting[self.facewaiting.size - 1] = undefined;
}
else
{
if ( var_2 >= self.a.currentdialogimportance )
{
self notify( "end current face" );
self endon( "end current face" );
if ( isdefined( var_3 ) )
{
if ( isdefined( self.a.currentdialognotifystring ) )
{
self.faceresult = "interrupted";
self notify( self.a.currentdialognotifystring );
}
}
self.a.currentdialogimportance = var_2;
self.a.currentdialogsound = var_1;
self.a.currentdialognotifystring = var_3;
self.a.facialanimdone = 1;
self.a.facialsounddone = 1;
if ( isdefined( var_0 ) )
{
maps\_anim::disabledefaultfacialanims();
self setflaggedanimknobrestart( "animscript faceanim", var_0, 1, 0.1, 1 );
self.a.facialanimdone = 0;
thread waitforfacialanim();
}
else
maps\_anim::disabledefaultfacialanims( 0 );
if ( isdefined( var_1 ) )
{
self playsoundatviewheight( var_1, "animscript facesound", 1 );
self.a.facialsounddone = 0;
thread waitforfacesound();
}
while ( !self.a.facialanimdone || !self.a.facialsounddone )
self waittill( "animscript facedone" );
self.a.currentdialogimportance = 0;
self.a.currentdialogsound = undefined;
self.a.currentdialognotifystring = undefined;
if ( isdefined( var_3 ) )
{
self.faceresult = "finished";
self notify( var_3 );
}
if ( isdefined( self.facewaiting ) && self.facewaiting.size > 0 )
{
var_9 = 0;
var_10 = 1;
for ( var_8 = 0; var_8 < self.facewaiting.size; var_8++ )
{
if ( self.facewaiting[var_8]["importance"] > var_9 )
{
var_9 = self.facewaiting[var_8]["importance"];
var_10 = var_8;
}
}
self notify( "animscript face stop waiting " + self.facewaiting[var_10]["notifyNum"] );
return;
}
if ( isai( self ) )
{
playidleface();
return;
}
return;
return;
}
if ( isdefined( var_3 ) )
{
self.faceresult = "failed";
self notify( var_3 );
}
}
}
}
waitforfacialanim()
{
self endon( "death" );
self endon( "end current face" );
animscripts\shared::donotetracks( "animscript faceanim" );
self.a.facialanimdone = 1;
self notify( "animscript facedone" );
maps\_anim::disabledefaultfacialanims( 0 );
}
waitforfacesound( var_0 )
{
self endon( "death" );
self waittill( "animscript facesound" + var_0 );
self notify( var_0 );
}
playface_waitfornotify( var_0, var_1, var_2 )
{
self endon( "death" );
self endon( var_2 );
self waittill( var_0 );
self.a.facewaitforresult = "notify";
self notify( var_1 );
}
playface_waitfortime( var_0, var_1, var_2 )
{
self endon( "death" );
self endon( var_2 );
wait( var_0 );
self.a.facewaitforresult = "time";
self notify( var_1 );
}
initlevelface()
{
anim.numfriendlyvoices = 8;
anim.numenemyvoices = 8;
initfacialanims();
}
#using_animtree("generic_human");
initfacialanims()
{
anim.facial = [];
anim.facial["pain"] = [ %facial_pain_1, %facial_pain_2, %facial_pain_3, %facial_pain_4 ];
anim.facial["aim"] = [ %facial_aim_1, %facial_aim_2 ];
anim.facial["run"] = [ %facial_run_1, %facial_run_2 ];
anim.facial["corner_stand_L"] = [ %facial_corner_stand_l_1, %facial_corner_stand_l_2 ];
anim.facial["corner_stand_R"] = [ %facial_corner_stand_r_1, %facial_corner_stand_r_2 ];
anim.facial["death"] = [ %facial_death_1, %facial_death_2, %facial_death_3, %facial_death_4 ];
}
animhasfacialoverride( var_0 )
{
return animhasnotetrack( var_0, "facial_override" );
}
playfacialanim( var_0, var_1, var_2 )
{
if ( isdefined( self.bdisabledefaultfacialanims ) && self.bdisabledefaultfacialanims )
self clearanim( %head, 0.2 );
else
{
if ( isdefined( var_0 ) && animhasfacialoverride( var_0 ) )
{
self clearanim( %head, 0.2 );
return;
}
if ( !isdefined( anim.facial[var_1] ) )
return;
if ( isdefined( var_2 ) && var_2 >= 0 && var_2 < anim.facial[var_1].size )
var_3 = var_2;
else
var_3 = randomint( anim.facial[var_1].size );
var_4 = anim.facial[var_1][var_3];
self setanimknob( var_4 );
}
}

View File

@ -0,0 +1,15 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "death" );
self endon( "stop_first_frame" );
self notify( "killanimscript" );
self.pushable = 0;
self clearanim( self.root_anim, 0.3 );
self orientmode( "face angle", self.angles[1] );
self setanim( level.scr_anim[self._animname][self._first_frame_anim], 1, 0, 0 );
self._first_frame_anim = undefined;
self waittill( "killanimscript" );
}

76
animscripts/flashed.gsc Normal file
View File

@ -0,0 +1,76 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_flashed()
{
var_0 = [];
var_0["flashed"] = [ %exposed_flashbang_v2, %exposed_flashbang_v4 ];
var_0["flashed"] = common_scripts\utility::array_randomize( var_0["flashed"] );
anim.archetypes["soldier"]["flashed"] = var_0;
anim.flashanimindex["soldier"] = 0;
}
getnextflashanim()
{
var_0 = "soldier";
if ( isdefined( self.animarchetype ) && isdefined( anim.flashanimindex[self.animarchetype] ) )
var_0 = self.animarchetype;
anim.flashanimindex[var_0]++;
if ( anim.flashanimindex[var_0] >= anim.archetypes[var_0]["flashed"]["flashed"].size )
{
anim.flashanimindex[var_0] = 0;
anim.archetypes[var_0]["flashed"]["flashed"] = common_scripts\utility::array_randomize( anim.archetypes[var_0]["flashed"]["flashed"] );
}
return anim.archetypes[var_0]["flashed"]["flashed"][anim.flashanimindex[var_0]];
}
flashbanganim( var_0 )
{
self endon( "killanimscript" );
self setflaggedanimknoball( "flashed_anim", var_0, %body, 0.2, randomfloatrange( 0.9, 1.1 ) );
animscripts\shared::donotetracks( "flashed_anim" );
}
main()
{
self endon( "death" );
self endon( "killanimscript" );
animscripts\utility::initialize( "flashed" );
var_0 = maps\_utility::flashbanggettimeleftsec();
if ( var_0 <= 0 )
return;
animscripts\face::saygenericdialogue( "flashbang" );
if ( isdefined( self.specialflashedfunc ) )
{
self [[ self.specialflashedfunc ]]();
return;
}
var_1 = getnextflashanim();
flashbangedloop( var_1, var_0 );
}
flashbangedloop( var_0, var_1 )
{
self endon( "death" );
self endon( "killanimscript" );
if ( self.a.pose == "prone" )
animscripts\utility::exitpronewrapper( 1 );
self.a.pose = "stand";
self.allowdeath = 1;
thread flashbanganim( var_0 );
wait( var_1 );
self notify( "stop_flashbang_effect" );
self.flashed = 0;
}

View File

@ -0,0 +1,79 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self endon( "killanimscript" );
animscripts\utility::initialize( "grenadecower" );
if ( isdefined( self.grenadecowerfunction ) )
{
self [[ self.grenadecowerfunction ]]();
return;
}
if ( self.a.pose == "prone" )
{
animscripts\stop::main();
return;
}
self animmode( "zonly_physics" );
self orientmode( "face angle", self.angles[1] );
var_0 = 0;
if ( isdefined( self.grenade ) )
var_0 = angleclamp180( vectortoangles( self.grenade.origin - self.origin )[1] - self.angles[1] );
else
var_0 = self.angles[1];
if ( self.a.pose == "stand" )
{
if ( isdefined( self.grenade ) && trydive( var_0 ) )
return;
self setflaggedanimknoballrestart( "cowerstart", animscripts\utility::lookupanim( "grenade", "cower_squat" ), %body, 1, 0.2 );
animscripts\shared::donotetracks( "cowerstart" );
}
self.a.pose = "crouch";
self.a.movement = "stop";
self setflaggedanimknoballrestart( "cower", animscripts\utility::lookupanim( "grenade", "cower_squat_idle" ), %body, 1, 0.2 );
animscripts\shared::donotetracks( "cower" );
self waittill( "never" );
}
end_script()
{
self.safetochangescript = 1;
}
trydive( var_0 )
{
if ( randomint( 2 ) == 0 )
return 0;
if ( self.stairsstate != "none" )
return 0;
var_1 = undefined;
if ( abs( var_0 ) > 90 )
var_1 = animscripts\utility::lookupanim( "grenade", "cower_dive_back" );
else
var_1 = animscripts\utility::lookupanim( "grenade", "cower_dive_front" );
var_2 = getmovedelta( var_1, 0, 0.5 );
var_3 = self localtoworldcoords( var_2 );
if ( !self maymovetopoint( var_3 ) )
return 0;
self.safetochangescript = 0;
self setflaggedanimknoballrestart( "cowerstart", var_1, %body, 1, 0.2 );
animscripts\shared::donotetracks( "cowerstart" );
self.safetochangescript = 1;
return 1;
}

View File

@ -0,0 +1,86 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self orientmode( "face default" );
self endon( "killanimscript" );
animscripts\utility::initialize( "grenade_return_throw" );
self animmode( "zonly_physics" );
var_0 = undefined;
var_1 = 1000;
if ( isdefined( self.enemy ) )
var_1 = distance( self.origin, self.enemy.origin );
var_2 = [];
if ( var_1 < 600 && islowthrowsafe() )
{
if ( var_1 < 300 )
var_2 = animscripts\utility::lookupanim( "grenade", "return_throw_short" );
else
var_2 = animscripts\utility::lookupanim( "grenade", "return_throw_long" );
}
if ( var_2.size == 0 )
var_2 = animscripts\utility::lookupanim( "grenade", "return_throw_default" );
var_0 = var_2[randomint( var_2.size )];
self setflaggedanimknoballrestart( "throwanim", var_0, %body, 1, 0.3 );
var_4 = animhasnotetrack( var_0, "grenade_left" ) || animhasnotetrack( var_0, "grenade_right" );
if ( var_4 )
{
animscripts\shared::placeweaponon( self.weapon, "left" );
thread putweaponbackinrighthand();
thread notifygrenadepickup( "throwanim", "grenade_left" );
thread notifygrenadepickup( "throwanim", "grenade_right" );
self waittill( "grenade_pickup" );
self pickupgrenade();
animscripts\battlechatter_ai::evaluateattackevent( "grenade" );
self waittillmatch( "throwanim", "grenade_throw" );
}
else
{
self waittillmatch( "throwanim", "grenade_throw" );
self pickupgrenade();
animscripts\battlechatter_ai::evaluateattackevent( "grenade" );
}
if ( isdefined( self.grenade ) )
self throwgrenade();
wait 1;
if ( var_4 )
{
self notify( "put_weapon_back_in_right_hand" );
animscripts\shared::placeweaponon( self.weapon, "right" );
}
}
islowthrowsafe()
{
var_0 = ( self.origin[0], self.origin[1], self.origin[2] + 20 );
var_1 = var_0 + anglestoforward( self.angles ) * 50;
return sighttracepassed( var_0, var_1, 0, undefined );
}
putweaponbackinrighthand()
{
self endon( "death" );
self endon( "put_weapon_back_in_right_hand" );
self waittill( "killanimscript" );
animscripts\shared::placeweaponon( self.weapon, "right" );
}
notifygrenadepickup( var_0, var_1 )
{
self endon( "killanimscript" );
self endon( "grenade_pickup" );
self waittillmatch( var_0, var_1 );
self notify( "grenade_pickup" );
}

View File

@ -0,0 +1,666 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
humvee_turret_init( var_0, var_1 )
{
self endon( "killanimscript" );
animscripts\utility::initialize( var_1 );
self.no_ai = 1;
self.nodrop = 1;
self.a.movement = "stop";
self.a.special = var_1;
self.a.usingturret = var_0;
self.ignoreme = 1;
if ( isdefined( self.minigun_ignoreme ) )
self.ignoreme = self.minigun_ignoreme;
self.iscustomanimating = 0;
self setturretanim( self.primaryturretanim );
self setanimknobrestart( self.primaryturretanim, 1, 0.2, 1 );
if ( isdefined( self.weapon ) )
animscripts\shared::placeweaponon( self.weapon, "none" );
self.onrotatingvehicleturret = 1;
self.getoffvehiclefunc = ::turret_cleanup_on_unload;
self notify( "guy_man_turret_stop" );
var_0 notify( "stop_burst_fire_unmanned" );
var_0.turretstate = "start";
var_0.aiowner = self;
var_0.firetime = 0;
var_0 setmode( "sentry" );
var_0 setsentryowner( self );
var_0 setdefaultdroppitch( 0 );
var_0 setturretcanaidetach( 0 );
gunner_pain_init();
level thread handle_gunner_pain( self, var_0 );
level thread handle_gunner_death( self, var_0 );
var_0 thread turret_track_rotatedirection( self );
var_0.dofiring = 0;
thread firedirector( var_0 );
wait 0.05;
if ( isalive( self ) )
thread gunner_turning_anims( var_0 );
}
gunner_pain_init()
{
self.allowpain = 0;
maps\_utility::setflashbangimmunity( 1 );
self.og_health = self.health;
self.health = 200;
}
gunner_pain_reset()
{
self.allowpain = 1;
maps\_utility::setflashbangimmunity( 0 );
self.health = self.og_health;
}
handle_gunner_pain( var_0, var_1 )
{
var_0 endon( "death" );
var_1 endon( "death" );
var_0 endon( "dismount" );
var_0 endon( "jumping_out" );
for (;;)
{
var_2 = "flashbang";
var_3 = var_0 common_scripts\utility::waittill_any_return( "damage", var_2 );
var_4 = common_scripts\utility::random( var_0.turretpainanims );
if ( var_3 == var_2 )
{
var_4 = var_0.turretflashbangedanim;
var_0 animscripts\face::saygenericdialogue( "flashbang" );
}
var_0 docustomanim( var_1, var_4, 0 );
var_1 notify( "pain_done" );
}
}
turret_recenter()
{
turret_aim_straight();
self waittill( "pain_done" );
turret_aim_restore();
}
handle_gunner_death( var_0, var_1 )
{
var_0 endon( "dismount" );
var_1 endon( "turret_cleanup" );
var_0.deathanim = var_0.turretdeathanim;
var_0.noragdoll = 1;
var_0 waittill( "death" );
level thread turret_cleanup( var_0, var_1 );
}
turret_cleanup_on_unload()
{
var_0 = self.ridingvehicle.mgturret[0];
if ( isalive( self ) )
{
self.no_ai = undefined;
self.nodrop = undefined;
self.ignoreme = 0;
self.a.special = "none";
self.a.usingturret = undefined;
self.deathanim = undefined;
gunner_pain_reset();
self.iscustomanimating = undefined;
self.turretspecialanims = undefined;
self.turretpainanims = undefined;
self.onrotatingvehicleturret = undefined;
self.getoffvehiclefunc = undefined;
self stopuseturret();
if ( isdefined( self.weapon ) )
animscripts\shared::placeweaponon( self.weapon, "right" );
}
level thread turret_cleanup( self, var_0 );
}
turret_cleanup( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
return;
var_1 notify( "kill_fireController" );
var_1 notify( "turret_cleanup" );
var_1 setmode( "manual" );
var_1 cleartargetentity();
var_1 setdefaultdroppitch( var_1.default_drop_pitch );
if ( isdefined( var_0 ) )
{
var_0 clearanim( var_0.additiveusegunroot, 0 );
var_0 clearanim( var_0.additiverotateroot, 0 );
var_0 clearanim( var_0.turretspecialanimsroot, 0 );
}
var_1.fireinterval = undefined;
var_1.closeenoughaimdegrees = undefined;
var_1.firecontrollerfunc = undefined;
var_1.turretstate = "free";
var_1.aiowner = undefined;
var_1.firetime = undefined;
if ( isdefined( var_1.specialcleanupfunc ) )
level [[ var_1.specialcleanupfunc ]]( var_0, var_1 );
}
turret_track_rotatedirection( var_0 )
{
self endon( "turret_cleanup" );
self endon( "death" );
var_0 endon( "death" );
var_0 endon( "detach" );
var_1 = "tag_aim";
var_2 = self gettagangles( var_1 );
turret_update_rotatedirection( "none" );
for (;;)
{
var_3 = self gettagangles( var_1 );
var_4 = anglestoright( var_2 );
var_5 = anglestoforward( var_3 );
var_6 = vectordot( var_4, var_5 );
if ( var_6 == 0 )
turret_update_rotatedirection( "none" );
else if ( var_6 > 0 )
turret_update_rotatedirection( "right" );
else
turret_update_rotatedirection( "left" );
var_2 = self gettagangles( var_1 );
wait 0.05;
}
}
turret_update_rotatedirection( var_0 )
{
if ( !isdefined( self.rotatedirection ) || self.rotatedirection != var_0 )
self.rotatedirection = var_0;
}
gunner_turning_anims( var_0 )
{
self endon( "death" );
var_0 endon( "death" );
self endon( "dismount" );
var_0 endon( "turret_cleanup" );
var_1 = 0.3;
var_2 = 0.3;
for (;;)
{
var_0 waittill( "new_fireTarget" );
wait 0.05;
if ( !isdefined( var_0.firetarget ) || self.iscustomanimating )
continue;
var_3 = undefined;
if ( !var_0 turret_aiming_near_target( var_0.firetarget, var_0.closeenoughaimdegrees ) )
{
if ( var_0.rotatedirection == "right" )
var_3 = self.additiveturretrotateright;
else if ( var_0.rotatedirection == "left" )
var_3 = self.additiveturretrotateleft;
if ( isdefined( var_3 ) )
{
self setanimlimited( self.additiverotateroot, 1, var_1, 1 );
self setanimknoblimited( var_3, 1, 0, 1 );
while ( isdefined( var_0.firetarget ) && !var_0 turret_aiming_near_target( var_0.firetarget, var_0.closeenoughaimdegrees ) )
{
if ( self.iscustomanimating )
break;
wait 0.05;
}
self clearanim( self.additiverotateroot, var_2 );
}
}
}
}
vehicle_passenger_2_turret( var_0, var_1, var_2, var_3 )
{
var_0.usedpositions[self.vehicle_position] = 0;
maps\_vehicle_aianim::guy_cleanup_vehiclevars();
guy_gets_on_turret( var_0, var_1, var_2, var_3 );
}
guy_goes_directly_to_turret( var_0, var_1, var_2, var_3 )
{
guy_gets_on_turret( var_0, var_1, var_2, var_3 );
}
#using_animtree("generic_human");
guy_gets_on_turret( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
var_2 endon( "death" );
self stopanimscripted();
self notify( "newanim" );
self.drivingvehicle = undefined;
self.no_ai = 1;
var_3 = %humvee_passenger_2_turret;
if ( !isdefined( var_3 ) )
var_3 = self.passenger_2_turret_anim;
var_4 = maps\_vehicle_aianim::anim_pos( var_0, var_1 );
var_5 = var_0 gettagorigin( var_4.sittag );
var_6 = var_0 gettagangles( var_4.sittag );
var_2 setdefaultdroppitch( 0 );
var_2 thread turret_animate( var_2.passenger2turret_anime );
self animscripted( "passenger2turret", var_5, var_6, var_3 );
wait( getanimlength( var_3 ) );
self stopanimscripted();
var_2 turret_aim_restore();
self useturret( var_2 );
}
turret_animate( var_0 )
{
if ( isdefined( self.idleanim ) )
{
self clearanim( self.idleanim, 0 );
self.idleanim = undefined;
}
self setflaggedanimknobrestart( "minigun_turret", var_0, 1, 0, 1 );
self waittillmatch( "minigun_turret", "end" );
self clearanim( var_0, 0 );
}
turret_animfirstframe( var_0 )
{
self setanimknobrestart( var_0, 1, 0, 0 );
self.idleanim = var_0;
}
firedirector( var_0 )
{
self endon( "death" );
var_0 endon( "death" );
self endon( "dismount" );
var_0 endon( "kill_fireController" );
var_0 thread turret_target_updater( self );
wait 0.05;
self thread [[ var_0.firecontrollerfunc ]]( var_0 );
var_1 = undefined;
for (;;)
{
var_1 = var_0.firetarget;
while ( var_0 target_confirm( var_1 ) )
{
if ( var_0 turret_aiming_near_target( var_1, var_0.closeenoughaimdegrees ) )
break;
wait 0.05;
}
if ( var_0 target_confirm( var_1 ) && !self.ignoreall )
var_0.dofiring = 1;
while ( var_0 target_confirm( var_1 ) && !self.ignoreall && !self.iscustomanimating )
wait 0.05;
if ( var_0.dofiring || self.ignoreall )
var_0.dofiring = 0;
wait 0.05;
}
}
target_confirm( var_0 )
{
if ( isdefined( self.dontshoot ) )
return 0;
if ( !isdefined( self.firetarget ) )
return 0;
if ( !turret_target_validate( var_0 ) )
return 0;
if ( var_0 != self.firetarget )
return 0;
return 1;
}
turret_target_updater( var_0 )
{
var_0 endon( "death" );
self endon( "death" );
var_0 endon( "dismount" );
self endon( "kill_fireController" );
self.firetarget = undefined;
var_1 = undefined;
var_2 = undefined;
for (;;)
{
var_1 = self getturrettarget( 0 );
var_3 = 0;
if ( turret_target_validate( var_1 ) || !isdefined( var_1 ) )
{
if ( !isdefined( var_1 ) && isdefined( var_2 ) )
var_3 = 1;
else if ( isdefined( var_1 ) && !isdefined( var_2 ) )
var_3 = 1;
else if ( isdefined( var_1 ) && var_1 != var_2 )
var_3 = 1;
if ( var_3 )
{
self.firetarget = var_1;
var_2 = var_1;
self notify( "new_fireTarget" );
}
}
wait 0.05;
}
}
turret_target_validate( var_0 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( isdefined( var_0.ignoreme ) && var_0.ignoreme )
return 0;
if ( issubstr( var_0.code_classname, "actor" ) && !isalive( var_0 ) )
return 0;
return 1;
}
set_manual_target( var_0, var_1, var_2, var_3 )
{
self endon( "turret_cleanup" );
var_4 = self getmode();
if ( var_4 != "manual" )
self setmode( "manual" );
if ( !isdefined( var_1 ) && !isdefined( var_2 ) )
{
var_1 = 1.5;
var_2 = 3;
}
custom_anim_wait();
self settargetentity( var_0 );
self waittill( "turret_on_target" );
if ( isdefined( var_3 ) )
self waittill( var_3 );
else if ( isdefined( var_2 ) )
wait( randomfloatrange( var_1, var_2 ) );
else
wait( var_1 );
custom_anim_wait();
self cleartargetentity( var_0 );
if ( isdefined( var_4 ) )
self setmode( var_4 );
}
doshoot( var_0 )
{
self notify( "doshoot_starting" );
self setanimlimited( self.additiveusegunroot, 1, 0.1 );
self setanimknoblimited( self.additiveturretfire, 1, 0.1 );
var_0.turretstate = "fire";
var_0 thread fire( self );
}
fire( var_0 )
{
var_0 endon( "death" );
self endon( "death" );
var_0 endon( "dismount" );
self endon( "kill_fireController" );
self endon( "stopfiring" );
self endon( "custom_anim" );
for (;;)
{
self shootturret();
wait( self.fireinterval );
}
}
doaim( var_0 )
{
var_0.turretstate = "aim";
var_0 notify( "stopfiring" );
thread doaim_idle_think( var_0 );
}
doaim_idle_think( var_0 )
{
self notify( "doaim_idle_think" );
self endon( "doaim_idle_think" );
self endon( "custom_anim" );
self endon( "doshoot_starting" );
self endon( "death" );
var_0 endon( "death" );
var_1 = var_0.ownervehicle;
var_2 = -1;
for (;;)
{
if ( var_1 vehicle_getspeed() < 1 && var_2 )
{
self setanimlimited( self.additiveusegunroot, 1, 0.1 );
self setanimknoblimited( self.additiveturretidle, 1, 0.1 );
var_2 = 0;
}
else if ( var_1 vehicle_getspeed() >= 1 && !var_2 )
{
self setanimlimited( self.additiveusegunroot, 1, 0.1 );
self setanimknoblimited( self.additiveturretdriveidle, 1, 0.1 );
var_2 = 1;
}
wait 0.05;
}
}
turret_gunner_custom_anim( var_0, var_1, var_2 )
{
self endon( "death" );
var_0 endon( "death" );
self endon( "dismount" );
self endon( "jumping_out" );
var_3 = self.turretspecialanims[var_1];
custom_anim_wait();
var_4 = var_0 reload_disable_safe();
docustomanim( var_0, var_3, var_2 );
if ( var_4 )
var_0 reload_enable();
}
reload_disable_safe()
{
var_0 = 0;
if ( !isdefined( self.disablereload ) || !self.disablereload )
{
var_0 = 1;
self.disablereload = 1;
}
return var_0;
}
reload_enable()
{
self.disablereload = 0;
}
doreload( var_0 )
{
if ( isdefined( var_0.disablereload ) )
return;
self endon( "death" );
var_0 endon( "death" );
self endon( "dismount" );
self endon( "jumping_out" );
if ( anim.chatinitialized )
thread maps\_utility::custom_battlechatter( "inform_reloading" );
docustomanim( var_0, self.turretreloadanim, 1 );
}
docustomanim( var_0, var_1, var_2 )
{
self notify( "do_custom_anim" );
self endon( "do_custom_anim" );
self.iscustomanimating = 1;
self.customanim = var_1;
var_0.turretstate = "customanim";
var_0 turretfiredisable();
if ( var_0 getbarrelspinrate() > 0 )
var_0 stopbarrelspin();
var_0 notify( "kill_fireController" );
self notify( "custom_anim" );
if ( isdefined( var_2 ) && var_2 )
var_0 turret_aim_straight();
self setanimknoblimitedrestart( self.turretspecialanimsroot, 1, 0.2 );
self setflaggedanimknobrestart( "special_anim", var_1, 1, 0, 1 );
for (;;)
{
self waittill( "special_anim", var_3 );
if ( var_3 == "end" )
break;
}
self clearanim( self.turretspecialanimsroot, 0.2 );
self setanimlimited( self.primaryturretanim, 1 );
self setanimlimited( self.additiveusegunroot, 1 );
if ( isdefined( var_2 ) && var_2 )
var_0 turret_aim_restore();
self.customanim = undefined;
self.iscustomanimating = 0;
var_0 turretfireenable();
thread firedirector( var_0 );
}
custom_anim_wait()
{
self endon( "death" );
if ( !isdefined( self.iscustomanimating ) )
return;
while ( self.iscustomanimating )
wait 0.05;
}
turret_aim_straight( var_0 )
{
if ( self getmode() == "sentry" )
return;
if ( !isdefined( var_0 ) )
{
var_1 = self gettagangles( "tag_flash" );
var_0 = ( 0, var_1[1], var_1[2] );
}
self.oldmode = self getmode();
self setmode( "manual" );
var_2 = anglestoforward( var_0 );
var_3 = var_2 * 96;
var_4 = self gettagorigin( "tag_aim" ) + var_3;
self.temptarget = spawn( "script_origin", var_4 );
self.temptarget.ignoreme = 1;
self.temptarget linkto( self.ownervehicle );
self cleartargetentity();
self settargetentity( self.temptarget );
self waittill( "turret_on_target" );
}
turret_aim_restore()
{
self cleartargetentity();
if ( isdefined( self.temptarget ) )
{
self.temptarget unlink();
self.temptarget delete();
}
if ( isdefined( self.oldmode ) )
{
self setmode( self.oldmode );
self.oldmode = undefined;
}
}
turret_aiming_near_target( var_0, var_1 )
{
var_2 = turret_get_angle_to_target( var_0 );
if ( var_2 <= var_1 )
return 1;
return 0;
}
turret_get_angle_to_target( var_0 )
{
var_1 = vectortoyaw( var_0.origin - self.origin );
var_2 = self gettagangles( "tag_flash" )[1];
var_3 = animscripts\utility::absangleclamp180( var_2 - var_1 );
return var_3;
}
lerp_out_drop_pitch( var_0 )
{
var_1 = maps\_utility::create_blend( ::blend_droppitch, 20, 0 );
var_1.time = var_0;
}
blend_droppitch( var_0, var_1, var_2 )
{
var_3 = var_1 * ( 1 - var_0 ) + var_2 * var_0;
self setdefaultdroppitch( var_3 );
}

View File

@ -0,0 +1,55 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
var_0 = self getturret();
var_1 = get_death_anim();
self.desired_anim_pose = "stand";
animscripts\utility::updateanimpose();
self.primaryturretanim = %gazgunner_aim;
self.additiveturretrotateleft = %gaz_turret_aim_6_add;
self.additiveturretrotateright = %gaz_turret_aim_4_add;
self.additiverotateroot = %additive_gazgunner_aim_leftright;
self.additiveturretidle = %gaz_turret_idle;
self.additiveturretdriveidle = %gaz_turret_idle;
self.additiveturretfire = %gaz_turret_fire;
self.additiveusegunroot = %additive_gazgunner_usegun;
self.turretdeathanimroot = %gazgunner_death;
self.turretdeathanim = var_1;
self.turretpainanims[0] = %gaz_turret_paina;
self.turretpainanims[1] = %gaz_turret_painb;
self.turretflashbangedanim = %gaz_turret_flincha;
self.turretreloadanim = %gaz_turret_paina;
self.turretspecialanimsroot = %gazgunner;
var_2 = [];
var_2["humvee_turret_flinchA"] = %gaz_turret_flincha;
var_2["humvee_turret_flinchB"] = %gaz_turret_flinchb;
self.turretspecialanims = var_2;
var_0 setup_turret_anims();
thread animscripts\hummer_turret\minigun_code::main( var_0 );
}
get_death_anim()
{
var_0 = %gaz_turret_death;
if ( isdefined( self.ridingvehicle ) )
{
if ( isdefined( level.dshk_death_anim ) )
var_0 = self [[ level.dshk_death_anim ]]();
}
return var_0;
}
#using_animtree("vehicles");
setup_turret_anims()
{
self useanimtree( #animtree );
self.passenger2turret_anime = %humvee_passenger_2_turret_minigun;
self.turret2passenger_anime = %humvee_turret_2_passenger_minigun;
}

View File

@ -0,0 +1,125 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main( var_0 )
{
var_0.fireinterval = 0.1;
var_0.closeenoughaimdegrees = 45;
var_0.firecontrollerfunc = ::firecontroller_minigun;
var_0.specialcleanupfunc = ::minigun_cleanup_func;
var_0.default_drop_pitch = 20;
animscripts\hummer_turret\common::humvee_turret_init( var_0, "minigun" );
wait 0.05;
var_0 notify( "turret_ready" );
}
minigun_cleanup_func( var_0, var_1 )
{
if ( var_1 getbarrelspinrate() > 0 )
var_1 stopbarrelspin();
}
firecontroller_minigun( var_0 )
{
self endon( "death" );
self endon( "dismount" );
var_0 endon( "kill_fireController" );
var_0 endon( "death" );
var_0.extrafiretime_min = 600;
var_0.extrafiretime_max = 900;
var_1 = -1;
var_2 = undefined;
var_3 = undefined;
var_0.extraspintime_min = 250;
var_0.extraspintime_max = 2250;
var_4 = -1;
var_5 = undefined;
var_6 = 0;
var_7 = 0;
var_0.secsoffiringbeforereload = 15;
if ( isdefined( var_0.secsoffiringbeforereloaddefault ) )
var_0.secsoffiringbeforereload = var_0.secsoffiringbeforereloaddefault;
var_0.firetime = 0;
animscripts\hummer_turret\common::doaim( var_0 );
for (;;)
{
if ( var_0.dofiring && !var_6 && !self.iscustomanimating )
{
var_6 = 1;
if ( !var_7 )
{
var_0 minigun_spinup();
var_7 = 1;
}
var_0 notify( "startfiring" );
var_1 = gettime();
animscripts\hummer_turret\common::doshoot( var_0 );
wait 0.05;
}
else if ( !var_0.dofiring && var_6 )
{
if ( !isdefined( var_2 ) )
var_2 = gettime();
if ( !isdefined( var_3 ) )
var_3 = randomfloatrange( var_0.extrafiretime_min, var_0.extrafiretime_max );
if ( gettime() - var_2 >= var_3 )
{
var_6 = 0;
animscripts\hummer_turret\common::doaim( var_0 );
var_4 = gettime();
var_2 = undefined;
var_3 = undefined;
}
}
else if ( !var_0.dofiring && !var_6 && var_7 )
{
if ( !isdefined( var_5 ) )
var_5 = randomfloatrange( var_0.extraspintime_min, var_0.extraspintime_max );
if ( self.iscustomanimating || gettime() - var_4 >= var_5 )
{
var_0 stopbarrelspin();
var_7 = 0;
var_5 = undefined;
}
}
if ( var_0.turretstate == "fire" )
var_0.firetime = var_0.firetime + 0.05;
if ( var_0.firetime > var_0.secsoffiringbeforereload )
{
var_0.dofiring = 0;
var_6 = 0;
animscripts\hummer_turret\common::doaim( var_0 );
var_4 = -1;
var_2 = undefined;
var_3 = undefined;
thread animscripts\hummer_turret\common::doreload( var_0 );
var_0.firetime = 0;
}
wait 0.05;
if ( !isdefined( var_0 ) )
break;
}
}
minigun_spinup()
{
if ( self getbarrelspinrate() == 1 )
return;
self startbarrelspin();
while ( self getbarrelspinrate() < 1 )
wait 0.05;
}

View File

@ -0,0 +1,48 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
var_0 = self getturret();
self.desired_anim_pose = "stand";
animscripts\utility::updateanimpose();
self.primaryturretanim = %humveegunner_aim;
self.additiveturretrotateleft = %humvee_turret_aim_6_add;
self.additiveturretrotateright = %humvee_turret_aim_4_add;
self.additiverotateroot = %additive_humveegunner_aim_leftright;
self.additiveturretidle = %humvee_turret_idle;
self.additiveturretdriveidle = %humvee_turret_driveidle;
self.additiveturretfire = %humvee_turret_fire;
self.additiveusegunroot = %additive_humveegunner_usegun;
self.turretdeathanimroot = %humveegunner_death;
self.turretdeathanim = %humvee_turret_death;
self.turretpainanims[0] = %humvee_turret_paina;
self.turretpainanims[1] = %humvee_turret_painb;
self.turretflashbangedanim = %humvee_turret_flincha;
self.turretreloadanim = %humvee_turret_rechamber;
self.turretspecialanimsroot = %humveegunner;
var_1 = [];
var_1["humvee_turret_bounce"] = %humvee_turret_bounce;
var_1["humvee_turret_idle_lookback"] = %humvee_turret_idle_lookback;
var_1["humvee_turret_idle_lookbackB"] = %humvee_turret_idle_lookbackb;
var_1["humvee_turret_idle_signal_forward"] = %humvee_turret_idle_signal_forward;
var_1["humvee_turret_idle_signal_side"] = %humvee_turret_idle_signal_side;
var_1["humvee_turret_radio"] = %humvee_turret_radio;
var_1["humvee_turret_flinchA"] = %humvee_turret_flincha;
var_1["humvee_turret_flinchB"] = %humvee_turret_flinchb;
var_1["humvee_turret_rechamber"] = %humvee_turret_rechamber;
self.turretspecialanims = var_1;
var_0 setup_turret_anims();
thread animscripts\hummer_turret\minigun_code::main( var_0 );
}
#using_animtree("vehicles");
setup_turret_anims()
{
self useanimtree( #animtree );
self.passenger2turret_anime = %humvee_passenger_2_turret_minigun;
self.turret2passenger_anime = %humvee_turret_2_passenger_minigun;
}

569
animscripts/init.gsc Normal file
View File

@ -0,0 +1,569 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
initweapon( var_0 )
{
self.weaponinfo[var_0] = spawnstruct();
self.weaponinfo[var_0].position = "none";
self.weaponinfo[var_0].hasclip = 1;
if ( getweaponclipmodel( var_0 ) != "" )
self.weaponinfo[var_0].useclip = 1;
else
self.weaponinfo[var_0].useclip = 0;
}
isweaponinitialized( var_0 )
{
return isdefined( self.weaponinfo[var_0] );
}
setglobalaimsettings()
{
anim.covercrouchleanpitch = 55;
anim.aimyawdifffartolerance = 10;
anim.aimyawdiffclosedistsq = 4096;
anim.aimyawdiffclosetolerance = 45;
anim.aimpitchdifftolerance = 20;
anim.painyawdifffartolerance = 25;
anim.painyawdiffclosedistsq = anim.aimyawdiffclosedistsq;
anim.painyawdiffclosetolerance = anim.aimyawdiffclosetolerance;
anim.painpitchdifftolerance = 30;
anim.maxanglecheckyawdelta = 65;
anim.maxanglecheckpitchdelta = 65;
}
everusessecondaryweapon()
{
if ( animscripts\utility::isshotgun( self.secondaryweapon ) )
return 1;
if ( weaponclass( self.primaryweapon ) == "rocketlauncher" )
return 1;
return 0;
}
#using_animtree("generic_human");
main()
{
self.a = spawnstruct();
self.a.laseron = 0;
self.primaryweapon = self.weapon;
firstinit();
if ( self.primaryweapon == "" )
self.primaryweapon = "none";
if ( self.secondaryweapon == "" )
self.secondaryweapon = "none";
if ( self.sidearm == "" )
self.sidearm = "none";
initweapon( self.primaryweapon );
initweapon( self.secondaryweapon );
initweapon( self.sidearm );
self setdefaultaimlimits();
self.a.weaponpos["left"] = "none";
self.a.weaponpos["right"] = "none";
self.a.weaponpos["chest"] = "none";
self.a.weaponpos["back"] = "none";
self.a.weaponposdropping["left"] = "none";
self.a.weaponposdropping["right"] = "none";
self.a.weaponposdropping["chest"] = "none";
self.a.weaponposdropping["back"] = "none";
self.lastweapon = self.weapon;
self.root_anim = %root;
thread begingrenadetracking();
var_0 = animscripts\utility::usingrocketlauncher();
self.a.neverlean = var_0;
if ( var_0 )
thread animscripts\shared::rpgplayerrepulsor();
self.a.rockets = 3;
self.a.rocketvisible = 1;
self.a.pose = "stand";
self.a.grenadethrowpose = "stand";
self.a.movement = "stop";
self.a.state = "stop";
self.a.special = "none";
self.a.gunhand = "none";
self.a.prevputguninhandtime = -1;
self.dropweapon = 1;
self.minexposedgrenadedist = 750;
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
if ( animscripts\utility::isshotgun( self.secondaryweapon ) )
animscripts\shared::placeweaponon( self.secondaryweapon, "back" );
self.a.needstorechamber = 0;
self.a.combatendtime = gettime();
self.a.lastenemytime = gettime();
self.a.suppressingenemy = 0;
self.a.disablelongdeath = !self isbadguy();
self.a.lookangle = 0;
self.a.paintime = 0;
self.a.lastshoottime = 0;
self.a.nextgrenadetrytime = 0;
self.a.reacttobulletchance = 0.8;
if ( self.team != "allies" )
self.has_no_ir = 1;
self.a.postscriptfunc = undefined;
self.a.stance = "stand";
self.chooseposefunc = animscripts\utility::choosepose;
self._animactive = 0;
self._lastanimtime = 0;
thread enemynotify();
self.baseaccuracy = 1;
self.a.misstime = 0;
self.a.nodeath = 0;
self.a.misstime = 0;
self.a.misstimedebounce = 0;
self.a.disablepain = 0;
self.accuracystationarymod = 1;
self.chatinitialized = 0;
self.sightpostime = 0;
self.sightposleft = 1;
self.needrecalculategoodshootpos = 1;
self.defaultturnthreshold = 55;
self.a.nextstandinghitdying = 0;
if ( !isdefined( self.script_forcegrenade ) )
self.script_forcegrenade = 0;
setupuniqueanims();
animscripts\weaponlist::refillclip();
self.lastenemysighttime = 0;
self.combattime = 0;
self.suppressed = 0;
self.suppressedtime = 0;
if ( self.team == "allies" )
self.suppressionthreshold = 0.5;
else
self.suppressionthreshold = 0.0;
if ( self.team == "allies" )
self.randomgrenaderange = 0;
else
self.randomgrenaderange = 256;
self.ammocheatinterval = 8000;
self.ammocheattime = 0;
animscripts\animset::setup_run_n_gun();
self.exception = [];
self.exception["corner"] = 1;
self.exception["cover_crouch"] = 1;
self.exception["stop"] = 1;
self.exception["stop_immediate"] = 1;
self.exception["move"] = 1;
self.exception["exposed"] = 1;
self.exception["corner_normal"] = 1;
var_1 = getarraykeys( self.exception );
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
common_scripts\utility::clear_exception( var_1[var_2] );
self.reacquire_state = 0;
thread setnameandrank_andaddtosquad();
self.shouldconserveammotime = 0;
if ( !isdefined( level.disablemonitorflash ) )
thread animscripts\combat_utility::monitorflash();
thread ondeath();
}
weapons_with_ir( var_0 )
{
var_1[0] = "m4_grenadier";
var_1[1] = "m4_grunt";
var_1[2] = "m4_silencer";
var_1[3] = "m4m203";
if ( !isdefined( var_0 ) )
return 0;
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
if ( issubstr( var_0, var_1[var_2] ) )
return 1;
}
return 0;
}
setnameandrank_andaddtosquad()
{
self endon( "death" );
if ( !isdefined( level.loadoutcomplete ) )
level waittill( "loadout complete" );
maps\_names::get_name();
thread animscripts\squadmanager::addtosquad();
}
pollallowedstancesthread()
{
for (;;)
{
if ( self isstanceallowed( "stand" ) )
{
var_0[0] = "stand allowed";
var_1[0] = ( 0, 1, 0 );
}
else
{
var_0[0] = "stand not allowed";
var_1[0] = ( 1, 0, 0 );
}
if ( self isstanceallowed( "crouch" ) )
{
var_0[1] = "crouch allowed";
var_1[1] = ( 0, 1, 0 );
}
else
{
var_0[1] = "crouch not allowed";
var_1[1] = ( 1, 0, 0 );
}
if ( self isstanceallowed( "prone" ) )
{
var_0[2] = "prone allowed";
var_1[2] = ( 0, 1, 0 );
}
else
{
var_0[2] = "prone not allowed";
var_1[2] = ( 1, 0, 0 );
}
var_2 = self getshootatpos() + ( 0, 0, 30 );
var_3 = ( 0, 0, -10 );
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
var_5 = ( var_2[0] + var_3[0] * var_4, var_2[1] + var_3[1] * var_4, var_2[2] + var_3[2] * var_4 );
wait 0.05;
}
}
setupuniqueanims()
{
if ( !isdefined( self.animplaybackrate ) || !isdefined( self.moveplaybackrate ) )
set_anim_playback_rate();
}
set_anim_playback_rate()
{
self.animplaybackrate = 0.9 + randomfloat( 0.2 );
self.movetransitionrate = 0.9 + randomfloat( 0.2 );
self.moveplaybackrate = 1;
self.sidesteprate = 1.35;
}
infiniteloop( var_0, var_1, var_2, var_3 )
{
anim waittill( "new exceptions" );
}
empty( var_0, var_1, var_2, var_3 )
{
}
enemynotify()
{
self endon( "death" );
if ( 1 )
return;
for (;;)
{
self waittill( "enemy" );
if ( !isalive( self.enemy ) )
continue;
while ( isplayer( self.enemy ) )
{
if ( animscripts\utility::hasenemysightpos() )
level.lastplayersighted = gettime();
wait 2;
}
}
}
initwindowtraverse()
{
level.window_down_height[0] = -36.8552;
level.window_down_height[1] = -27.0095;
level.window_down_height[2] = -15.5981;
level.window_down_height[3] = -4.37769;
level.window_down_height[4] = 17.7776;
level.window_down_height[5] = 59.8499;
level.window_down_height[6] = 104.808;
level.window_down_height[7] = 152.325;
level.window_down_height[8] = 201.052;
level.window_down_height[9] = 250.244;
level.window_down_height[10] = 298.971;
level.window_down_height[11] = 330.681;
}
firstinit()
{
if ( isdefined( anim.notfirsttime ) )
return;
anim.notfirsttime = 1;
animscripts\animset::init_anim_sets();
anim.usefacialanims = 0;
maps\_load::init_level_players();
level.player.invul = 0;
level.nextgrenadedrop = randomint( 3 );
level.lastplayersighted = 100;
anim.defaultexception = ::empty;
initdeveloperdvars();
setdvar( "scr_expDeathMayMoveCheck", "on" );
maps\_names::setup_names();
anim.animflagnameindex = 0;
animscripts\init_move_transitions::initmovestartstoptransitions();
anim.combatmemorytimeconst = 10000;
anim.combatmemorytimerand = 6000;
initgrenades();
initadvancetoenemy();
if ( !isdefined( anim.optionalstepeffectfunction ) )
{
anim.optionalstepeffectsmallfunction = animscripts\notetracks::playfootstepeffectsmall;
anim.optionalstepeffectfunction = animscripts\notetracks::playfootstepeffect;
}
if ( !isdefined( anim.optionalstepeffects ) )
anim.optionalstepeffects = [];
if ( !isdefined( anim.optionalstepeffectssmall ) )
anim.optionalstepeffectssmall = [];
if ( !isdefined( anim.shootenemywrapper_func ) )
anim.shootenemywrapper_func = animscripts\utility::shootenemywrapper_shootnotify;
if ( !isdefined( anim.shootposwrapper_func ) )
anim.shootposwrapper_func = animscripts\utility::shootposwrapper;
anim.fire_notetrack_functions["scripted"] = animscripts\notetracks::fire_straight;
anim.fire_notetrack_functions["cover_right"] = animscripts\notetracks::shootnotetrack;
anim.fire_notetrack_functions["cover_left"] = animscripts\notetracks::shootnotetrack;
anim.fire_notetrack_functions["cover_crouch"] = animscripts\notetracks::shootnotetrack;
anim.fire_notetrack_functions["cover_stand"] = animscripts\notetracks::shootnotetrack;
anim.fire_notetrack_functions["move"] = animscripts\notetracks::shootnotetrack;
animscripts\notetracks::registernotetracks();
if ( !isdefined( level.flag ) )
common_scripts\utility::init_flags();
maps\_gameskill::setskill();
level.painai = undefined;
animscripts\setposemovement::initposemovementfunctions();
animscripts\face::initlevelface();
anim.burstfirenumshots = animscripts\utility::array( 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5 );
anim.fastburstfirenumshots = animscripts\utility::array( 2, 3, 3, 3, 4, 4, 4, 5, 5 );
anim.semifirenumshots = animscripts\utility::array( 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5 );
anim.badplaces = [];
anim.badplaceint = 0;
anim.player = getentarray( "player", "classname" )[0];
initbattlechatter();
initwindowtraverse();
animscripts\cqb::setupcqbpointsofinterest();
initdeaths();
setglobalaimsettings();
anim.lastcarexplosiontime = -100000;
setuprandomtable();
level.player thread animscripts\combat_utility::watchreloading();
thread aiturnnotifies();
}
initdeveloperdvars()
{
}
initbattlechatter()
{
animscripts\squadmanager::init_squadmanager();
anim.player thread animscripts\squadmanager::addplayertosquad();
animscripts\battlechatter::init_battlechatter();
anim.player thread animscripts\battlechatter_ai::addtosystem();
anim thread animscripts\battlechatter::bcsdebugwaiter();
}
initdeaths()
{
anim.numdeathsuntilcrawlingpain = randomintrange( 0, 15 );
anim.numdeathsuntilcornergrenadedeath = randomintrange( 0, 10 );
anim.nextcrawlingpaintime = gettime() + randomintrange( 0, 20000 );
anim.nextcrawlingpaintimefromlegdamage = gettime() + randomintrange( 0, 10000 );
anim.nextcornergrenadedeathtime = gettime() + randomintrange( 0, 15000 );
}
initgrenades()
{
for ( var_0 = 0; var_0 < level.players.size; var_0++ )
{
var_1 = level.players[var_0];
var_1.grenadetimers["fraggrenade"] = randomintrange( 1000, 20000 );
var_1.grenadetimers["flash_grenade"] = randomintrange( 1000, 20000 );
var_1.grenadetimers["double_grenade"] = randomintrange( 1000, 60000 );
var_1.numgrenadesinprogresstowardsplayer = 0;
var_1.lastgrenadelandednearplayertime = -1000000;
var_1.lastfraggrenadetoplayerstart = -1000000;
var_1 thread setnextplayergrenadetime();
}
anim.grenadetimers["AI_fraggrenade"] = randomintrange( 0, 20000 );
anim.grenadetimers["AI_flash_grenade"] = randomintrange( 0, 20000 );
anim.grenadetimers["AI_smoke_grenade_american"] = randomintrange( 0, 20000 );
animscripts\combat_utility::initgrenadethrowanims();
}
initadvancetoenemy()
{
level.lastadvancetoenemytime = [];
level.lastadvancetoenemytime["axis"] = 0;
level.lastadvancetoenemytime["allies"] = 0;
level.lastadvancetoenemytime["team3"] = 0;
level.lastadvancetoenemytime["neutral"] = 0;
level.lastadvancetoenemydest = [];
level.lastadvancetoenemydest["axis"] = ( 0, 0, 0 );
level.lastadvancetoenemydest["allies"] = ( 0, 0, 0 );
level.lastadvancetoenemydest["team3"] = ( 0, 0, 0 );
level.lastadvancetoenemydest["neutral"] = ( 0, 0, 0 );
level.lastadvancetoenemysrc = [];
level.lastadvancetoenemysrc["axis"] = ( 0, 0, 0 );
level.lastadvancetoenemysrc["allies"] = ( 0, 0, 0 );
level.lastadvancetoenemysrc["team3"] = ( 0, 0, 0 );
level.lastadvancetoenemysrc["neutral"] = ( 0, 0, 0 );
level.lastadvancetoenemyattacker = [];
level.advancetoenemygroup = [];
level.advancetoenemygroup["axis"] = 0;
level.advancetoenemygroup["allies"] = 0;
level.advancetoenemygroup["team3"] = 0;
level.advancetoenemygroup["neutral"] = 0;
level.advancetoenemyinterval = 30000;
level.advancetoenemygroupmax = 3;
}
aiturnnotifies()
{
var_0 = 0;
var_1 = 3;
for (;;)
{
var_2 = getaiarray();
if ( var_2.size == 0 )
{
wait 0.05;
var_0 = 0;
continue;
}
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( !isdefined( var_2[var_3] ) )
continue;
var_2[var_3] notify( "do_slow_things" );
var_0++;
if ( var_0 == var_1 )
{
wait 0.05;
var_0 = 0;
}
}
}
}
setnextplayergrenadetime()
{
waittillframeend;
if ( isdefined( self.gs.playergrenaderangetime ) )
{
var_0 = int( self.gs.playergrenaderangetime * 0.7 );
if ( var_0 < 1 )
var_0 = 1;
self.grenadetimers["fraggrenade"] = randomintrange( 0, var_0 );
self.grenadetimers["flash_grenade"] = randomintrange( 0, var_0 );
}
if ( isdefined( self.gs.playerdoublegrenadetime ) )
{
var_0 = int( self.gs.playerdoublegrenadetime );
var_1 = int( var_0 / 2 );
if ( var_0 <= var_1 )
var_0 = var_1 + 1;
self.grenadetimers["double_grenade"] = randomintrange( var_1, var_0 );
}
}
begingrenadetracking()
{
if ( isdefined( level.disablegrenadetracking ) )
return;
self endon( "death" );
for (;;)
{
self waittill( "grenade_fire", var_0, var_1 );
var_0 thread maps\_utility::grenade_earthquake();
}
}
setuprandomtable()
{
anim.randominttablesize = 60;
anim.randominttable = [];
for ( var_0 = 0; var_0 < anim.randominttablesize; var_0++ )
anim.randominttable[var_0] = var_0;
for ( var_0 = 0; var_0 < anim.randominttablesize; var_0++ )
{
var_1 = randomint( anim.randominttablesize );
var_2 = anim.randominttable[var_0];
anim.randominttable[var_0] = anim.randominttable[var_1];
anim.randominttable[var_1] = var_2;
}
}
ondeath()
{
if ( isdefined( level.disablestrangeondeath ) )
return;
self waittill( "death" );
if ( !isdefined( self ) )
{
if ( isdefined( self.a.usingturret ) )
self.a.usingturret delete();
}
}

View File

@ -0,0 +1,616 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_move_transition_arrays()
{
if ( isdefined( anim.move_transition_arrays ) )
return;
anim.move_transition_arrays = 1;
if ( !isdefined( anim.covertrans ) )
anim.covertrans = [];
if ( !isdefined( anim.coverexit ) )
anim.coverexit = [];
anim.maxdirections = [];
anim.excludedir = [];
anim.traverseinfo = [];
if ( !isdefined( anim.covertranslongestdist ) )
anim.covertranslongestdist = [];
if ( !isdefined( anim.covertransdist ) )
anim.covertransdist = [];
if ( !isdefined( anim.coverexitdist ) )
anim.coverexitdist = [];
anim.coverexitpostdist = [];
anim.covertranspredist = [];
if ( !isdefined( anim.covertransangles ) )
anim.covertransangles = [];
if ( !isdefined( anim.coverexitangles ) )
anim.coverexitangles = [];
anim.arrivalendstance = [];
}
#using_animtree("generic_human");
initmovestartstoptransitions()
{
init_move_transition_arrays();
var_0 = [];
var_0[0] = "left";
var_0[1] = "right";
var_0[2] = "left_crouch";
var_0[3] = "right_crouch";
var_0[4] = "crouch";
var_0[5] = "stand";
var_0[6] = "exposed";
var_0[7] = "exposed_crouch";
var_0[8] = "stand_saw";
var_0[9] = "prone_saw";
var_0[10] = "crouch_saw";
var_0[11] = "wall_over_40";
var_0[12] = "right_cqb";
var_0[13] = "right_crouch_cqb";
var_0[14] = "left_cqb";
var_0[15] = "left_crouch_cqb";
var_0[16] = "exposed_cqb";
var_0[17] = "exposed_crouch_cqb";
var_0[18] = "heat";
var_0[19] = "heat_left";
var_0[20] = "heat_right";
var_0[21] = "exposed_ready";
var_0[22] = "exposed_ready_cqb";
var_1 = 6;
anim.approach_types = [];
anim.approach_types["Cover Left"] = [];
anim.approach_types["Cover Left"]["stand"] = "left";
anim.approach_types["Cover Left"]["crouch"] = "left_crouch";
anim.maxdirections["Cover Left"] = 9;
anim.excludedir["Cover Left"] = 9;
anim.approach_types["Cover Right"] = [];
anim.approach_types["Cover Right"]["stand"] = "right";
anim.approach_types["Cover Right"]["crouch"] = "right_crouch";
anim.maxdirections["Cover Right"] = 9;
anim.excludedir["Cover Right"] = 7;
anim.approach_types["Cover Crouch"] = [];
anim.approach_types["Cover Crouch"]["stand"] = "crouch";
anim.approach_types["Cover Crouch"]["crouch"] = "crouch";
anim.approach_types["Conceal Crouch"] = anim.approach_types["Cover Crouch"];
anim.approach_types["Cover Crouch Window"] = anim.approach_types["Cover Crouch"];
anim.maxdirections["Cover Crouch"] = 6;
anim.excludedir["Cover Crouch"] = -1;
anim.maxdirections["Conceal Crouch"] = 6;
anim.excludedir["Conceal Crouch"] = -1;
anim.approach_types["Cover Stand"] = [];
anim.approach_types["Cover Stand"]["stand"] = "stand";
anim.approach_types["Cover Stand"]["crouch"] = "stand";
anim.approach_types["Conceal Stand"] = anim.approach_types["Cover Stand"];
anim.maxdirections["Cover Stand"] = 6;
anim.excludedir["Cover Stand"] = -1;
anim.maxdirections["Conceal Stand"] = 6;
anim.excludedir["Conceal Stand"] = -1;
anim.approach_types["Cover Prone"] = [];
anim.approach_types["Cover Prone"]["stand"] = "exposed";
anim.approach_types["Cover Prone"]["crouch"] = "exposed";
anim.approach_types["Conceal Prone"] = anim.approach_types["Cover Prone"];
anim.excludedir["Conceal Prone"] = -1;
anim.approach_types["Path"] = [];
anim.approach_types["Path"]["stand"] = "exposed";
anim.approach_types["Path"]["crouch"] = "exposed_crouch";
anim.approach_types["Guard"] = anim.approach_types["Path"];
anim.approach_types["Ambush"] = anim.approach_types["Path"];
anim.approach_types["Scripted"] = anim.approach_types["Path"];
anim.approach_types["Exposed"] = anim.approach_types["Path"];
anim.iscombatpathnode["Guard"] = 1;
anim.iscombatpathnode["Ambush"] = 1;
anim.iscombatpathnode["Exposed"] = 1;
anim.iscombatscriptnode["Guard"] = 1;
anim.iscombatscriptnode["Exposed"] = 1;
var_2 = [];
var_2["right"][1] = %corner_standr_trans_in_1;
var_2["right"][2] = %corner_standr_trans_in_2;
var_2["right"][3] = %corner_standr_trans_in_3;
var_2["right"][4] = %corner_standr_trans_in_4;
var_2["right"][6] = %corner_standr_trans_in_6;
var_2["right"][8] = %corner_standr_trans_in_8;
var_2["right"][9] = %corner_standr_trans_in_9;
var_2["right_crouch"][1] = %cornercrr_trans_in_ml;
var_2["right_crouch"][2] = %cornercrr_trans_in_m;
var_2["right_crouch"][3] = %cornercrr_trans_in_mr;
var_2["right_crouch"][4] = %cornercrr_trans_in_l;
var_2["right_crouch"][6] = %cornercrr_trans_in_r;
var_2["right_crouch"][8] = %cornercrr_trans_in_f;
var_2["right_crouch"][9] = %cornercrr_trans_in_mf;
var_2["right_cqb"][1] = %corner_standr_trans_cqb_in_1;
var_2["right_cqb"][2] = %corner_standr_trans_cqb_in_2;
var_2["right_cqb"][3] = %corner_standr_trans_cqb_in_3;
var_2["right_cqb"][4] = %corner_standr_trans_cqb_in_4;
var_2["right_cqb"][6] = %corner_standr_trans_cqb_in_6;
var_2["right_cqb"][8] = %corner_standr_trans_cqb_in_8;
var_2["right_cqb"][9] = %corner_standr_trans_cqb_in_9;
var_2["right_crouch_cqb"][1] = %cornercrr_cqb_trans_in_1;
var_2["right_crouch_cqb"][2] = %cornercrr_cqb_trans_in_2;
var_2["right_crouch_cqb"][3] = %cornercrr_cqb_trans_in_3;
var_2["right_crouch_cqb"][4] = %cornercrr_cqb_trans_in_4;
var_2["right_crouch_cqb"][6] = %cornercrr_cqb_trans_in_6;
var_2["right_crouch_cqb"][8] = %cornercrr_cqb_trans_in_8;
var_2["right_crouch_cqb"][9] = %cornercrr_cqb_trans_in_9;
var_2["left"][1] = %corner_standl_trans_in_1;
var_2["left"][2] = %corner_standl_trans_in_2;
var_2["left"][3] = %corner_standl_trans_in_3;
var_2["left"][4] = %corner_standl_trans_in_4;
var_2["left"][6] = %corner_standl_trans_in_6;
var_2["left"][7] = %corner_standl_trans_in_7;
var_2["left"][8] = %corner_standl_trans_in_8;
var_2["left_crouch"][1] = %cornercrl_trans_in_ml;
var_2["left_crouch"][2] = %cornercrl_trans_in_m;
var_2["left_crouch"][3] = %cornercrl_trans_in_mr;
var_2["left_crouch"][4] = %cornercrl_trans_in_l;
var_2["left_crouch"][6] = %cornercrl_trans_in_r;
var_2["left_crouch"][7] = %cornercrl_trans_in_mf;
var_2["left_crouch"][8] = %cornercrl_trans_in_f;
var_2["left_cqb"][1] = %corner_standl_trans_cqb_in_1;
var_2["left_cqb"][2] = %corner_standl_trans_cqb_in_2;
var_2["left_cqb"][3] = %corner_standl_trans_cqb_in_3;
var_2["left_cqb"][4] = %corner_standl_trans_cqb_in_4;
var_2["left_cqb"][6] = %corner_standl_trans_cqb_in_6;
var_2["left_cqb"][7] = %corner_standl_trans_cqb_in_7;
var_2["left_cqb"][8] = %corner_standl_trans_cqb_in_8;
var_2["left_crouch_cqb"][1] = %cornercrl_cqb_trans_in_1;
var_2["left_crouch_cqb"][2] = %cornercrl_cqb_trans_in_2;
var_2["left_crouch_cqb"][3] = %cornercrl_cqb_trans_in_3;
var_2["left_crouch_cqb"][4] = %cornercrl_cqb_trans_in_4;
var_2["left_crouch_cqb"][6] = %cornercrl_cqb_trans_in_6;
var_2["left_crouch_cqb"][7] = %cornercrl_cqb_trans_in_7;
var_2["left_crouch_cqb"][8] = %cornercrl_cqb_trans_in_8;
var_2["crouch"][1] = %covercrouch_run_in_ml;
var_2["crouch"][2] = %covercrouch_run_in_m;
var_2["crouch"][3] = %covercrouch_run_in_mr;
var_2["crouch"][4] = %covercrouch_run_in_l;
var_2["crouch"][6] = %covercrouch_run_in_r;
var_2["stand"][1] = %coverstand_trans_in_ml;
var_2["stand"][2] = %coverstand_trans_in_m;
var_2["stand"][3] = %coverstand_trans_in_mr;
var_2["stand"][4] = %coverstand_trans_in_l;
var_2["stand"][6] = %coverstand_trans_in_r;
var_2["stand_saw"][1] = %saw_gunner_runin_ml;
var_2["stand_saw"][2] = %saw_gunner_runin_m;
var_2["stand_saw"][3] = %saw_gunner_runin_mr;
var_2["stand_saw"][4] = %saw_gunner_runin_l;
var_2["stand_saw"][6] = %saw_gunner_runin_r;
var_2["crouch_saw"][1] = %saw_gunner_lowwall_runin_ml;
var_2["crouch_saw"][2] = %saw_gunner_lowwall_runin_m;
var_2["crouch_saw"][3] = %saw_gunner_lowwall_runin_mr;
var_2["crouch_saw"][4] = %saw_gunner_lowwall_runin_l;
var_2["crouch_saw"][6] = %saw_gunner_lowwall_runin_r;
var_2["prone_saw"][1] = %saw_gunner_prone_runin_ml;
var_2["prone_saw"][2] = %saw_gunner_prone_runin_m;
var_2["prone_saw"][3] = %saw_gunner_prone_runin_mr;
var_2["exposed"] = [];
var_2["exposed"][1] = %run_2_idle_1;
var_2["exposed"][2] = %run_2_stand_f_6;
var_2["exposed"][3] = %run_2_idle_3;
var_2["exposed"][4] = %run_2_stand_90l;
var_2["exposed"][6] = %run_2_stand_90r;
var_2["exposed"][7] = %run_2_idle_7;
var_2["exposed"][8] = %run_2_stand_180l;
var_2["exposed"][9] = %run_2_idle_9;
var_2["exposed_crouch"] = [];
var_2["exposed_crouch"][1] = %run_2_crouch_idle_1;
var_2["exposed_crouch"][2] = %run_2_crouch_f;
var_2["exposed_crouch"][3] = %run_2_crouch_idle_3;
var_2["exposed_crouch"][4] = %run_2_crouch_90l;
var_2["exposed_crouch"][6] = %run_2_crouch_90r;
var_2["exposed_crouch"][7] = %run_2_crouch_idle_7;
var_2["exposed_crouch"][8] = %run_2_crouch_180l;
var_2["exposed_crouch"][9] = %run_2_crouch_idle_9;
var_2["exposed_cqb"] = [];
var_2["exposed_cqb"][1] = %cqb_stop_1;
var_2["exposed_cqb"][2] = %cqb_stop_2;
var_2["exposed_cqb"][3] = %cqb_stop_3;
var_2["exposed_cqb"][4] = %cqb_stop_4;
var_2["exposed_cqb"][6] = %cqb_stop_6;
var_2["exposed_cqb"][7] = %cqb_stop_7;
var_2["exposed_cqb"][8] = %cqb_stop_8;
var_2["exposed_cqb"][9] = %cqb_stop_9;
var_2["exposed_crouch_cqb"] = [];
var_2["exposed_crouch_cqb"][1] = %cqb_crouch_stop_1;
var_2["exposed_crouch_cqb"][2] = %cqb_crouch_stop_2;
var_2["exposed_crouch_cqb"][3] = %cqb_crouch_stop_3;
var_2["exposed_crouch_cqb"][4] = %cqb_crouch_stop_4;
var_2["exposed_crouch_cqb"][6] = %cqb_crouch_stop_6;
var_2["exposed_crouch_cqb"][7] = %cqb_crouch_stop_7;
var_2["exposed_crouch_cqb"][8] = %cqb_crouch_stop_8;
var_2["exposed_crouch_cqb"][9] = %cqb_crouch_stop_9;
var_2["heat"] = [];
var_2["heat"][1] = %heat_approach_1;
var_2["heat"][2] = %heat_approach_2;
var_2["heat"][3] = %heat_approach_3;
var_2["heat"][4] = %heat_approach_4;
var_2["heat"][6] = %heat_approach_6;
var_2["heat"][8] = %heat_approach_8;
var_2["heat_left"] = [];
var_2["heat_right"] = [];
var_2["wall_over_96"][1] = %traverse90_in_ml;
var_2["wall_over_96"][2] = %traverse90_in_m;
var_2["wall_over_96"][3] = %traverse90_in_mr;
anim.traverseinfo["wall_over_96"]["height"] = 96;
var_2["wall_over_40"][1] = %traverse_window_m_2_run;
var_2["wall_over_40"][2] = %traverse_window_m_2_run;
var_2["wall_over_40"][3] = %traverse_window_m_2_run;
anim.archetypes["soldier"]["cover_trans"] = var_2;
var_2 = [];
var_2["right"][1] = %corner_standr_trans_out_1;
var_2["right"][2] = %corner_standr_trans_out_2;
var_2["right"][3] = %corner_standr_trans_out_3;
var_2["right"][4] = %corner_standr_trans_out_4;
var_2["right"][6] = %corner_standr_trans_out_6;
var_2["right"][8] = %corner_standr_trans_out_8;
var_2["right"][9] = %corner_standr_trans_out_9;
var_2["right_crouch"][1] = %cornercrr_trans_out_ml;
var_2["right_crouch"][2] = %cornercrr_trans_out_m;
var_2["right_crouch"][3] = %cornercrr_trans_out_mr;
var_2["right_crouch"][4] = %cornercrr_trans_out_l;
var_2["right_crouch"][6] = %cornercrr_trans_out_r;
var_2["right_crouch"][8] = %cornercrr_trans_out_f;
var_2["right_crouch"][9] = %cornercrr_trans_out_mf;
var_2["right_cqb"][1] = %corner_standr_trans_cqb_out_1;
var_2["right_cqb"][2] = %corner_standr_trans_cqb_out_2;
var_2["right_cqb"][3] = %corner_standr_trans_cqb_out_3;
var_2["right_cqb"][4] = %corner_standr_trans_cqb_out_4;
var_2["right_cqb"][6] = %corner_standr_trans_cqb_out_6;
var_2["right_cqb"][8] = %corner_standr_trans_cqb_out_8;
var_2["right_cqb"][9] = %corner_standr_trans_cqb_out_9;
var_2["right_crouch_cqb"][1] = %cornercrr_cqb_trans_out_1;
var_2["right_crouch_cqb"][2] = %cornercrr_cqb_trans_out_2;
var_2["right_crouch_cqb"][3] = %cornercrr_cqb_trans_out_3;
var_2["right_crouch_cqb"][4] = %cornercrr_cqb_trans_out_4;
var_2["right_crouch_cqb"][6] = %cornercrr_cqb_trans_out_6;
var_2["right_crouch_cqb"][8] = %cornercrr_cqb_trans_out_8;
var_2["right_crouch_cqb"][9] = %cornercrr_cqb_trans_out_9;
var_2["left"][1] = %corner_standl_trans_out_1;
var_2["left"][2] = %corner_standl_trans_out_2;
var_2["left"][3] = %corner_standl_trans_out_3;
var_2["left"][4] = %corner_standl_trans_out_4;
var_2["left"][6] = %corner_standl_trans_out_6;
var_2["left"][7] = %corner_standl_trans_out_7;
var_2["left"][8] = %corner_standl_trans_out_8;
var_2["left_crouch"][1] = %cornercrl_trans_out_ml;
var_2["left_crouch"][2] = %cornercrl_trans_out_m;
var_2["left_crouch"][3] = %cornercrl_trans_out_mr;
var_2["left_crouch"][4] = %cornercrl_trans_out_l;
var_2["left_crouch"][6] = %cornercrl_trans_out_r;
var_2["left_crouch"][7] = %cornercrl_trans_out_mf;
var_2["left_crouch"][8] = %cornercrl_trans_out_f;
var_2["left_cqb"][1] = %corner_standl_trans_cqb_out_1;
var_2["left_cqb"][2] = %corner_standl_trans_cqb_out_2;
var_2["left_cqb"][3] = %corner_standl_trans_cqb_out_3;
var_2["left_cqb"][4] = %corner_standl_trans_cqb_out_4;
var_2["left_cqb"][6] = %corner_standl_trans_cqb_out_6;
var_2["left_cqb"][7] = %corner_standl_trans_cqb_out_7;
var_2["left_cqb"][8] = %corner_standl_trans_cqb_out_8;
var_2["left_crouch_cqb"][1] = %cornercrl_cqb_trans_out_1;
var_2["left_crouch_cqb"][2] = %cornercrl_cqb_trans_out_2;
var_2["left_crouch_cqb"][3] = %cornercrl_cqb_trans_out_3;
var_2["left_crouch_cqb"][4] = %cornercrl_cqb_trans_out_4;
var_2["left_crouch_cqb"][6] = %cornercrl_cqb_trans_out_6;
var_2["left_crouch_cqb"][7] = %cornercrl_cqb_trans_out_7;
var_2["left_crouch_cqb"][8] = %cornercrl_cqb_trans_out_8;
var_2["crouch"][1] = %covercrouch_run_out_ml;
var_2["crouch"][2] = %covercrouch_run_out_m;
var_2["crouch"][3] = %covercrouch_run_out_mr;
var_2["crouch"][4] = %covercrouch_run_out_l;
var_2["crouch"][6] = %covercrouch_run_out_r;
var_2["stand"][1] = %coverstand_trans_out_ml;
var_2["stand"][2] = %coverstand_trans_out_m;
var_2["stand"][3] = %coverstand_trans_out_mr;
var_2["stand"][4] = %coverstand_trans_out_l;
var_2["stand"][6] = %coverstand_trans_out_r;
var_2["stand_saw"][1] = %saw_gunner_runout_ml;
var_2["stand_saw"][2] = %saw_gunner_runout_m;
var_2["stand_saw"][3] = %saw_gunner_runout_mr;
var_2["stand_saw"][4] = %saw_gunner_runout_l;
var_2["stand_saw"][6] = %saw_gunner_runout_r;
var_2["prone_saw"][2] = %saw_gunner_prone_runout_m;
var_2["prone_saw"][4] = %saw_gunner_prone_runout_l;
var_2["prone_saw"][6] = %saw_gunner_prone_runout_r;
var_2["prone_saw"][8] = %saw_gunner_prone_runout_f;
var_2["crouch_saw"][1] = %saw_gunner_lowwall_runout_ml;
var_2["crouch_saw"][2] = %saw_gunner_lowwall_runout_m;
var_2["crouch_saw"][3] = %saw_gunner_lowwall_runout_mr;
var_2["crouch_saw"][4] = %saw_gunner_lowwall_runout_l;
var_2["crouch_saw"][6] = %saw_gunner_lowwall_runout_r;
var_2["exposed"] = [];
var_2["exposed"][1] = %cqb_start_1;
var_2["exposed"][2] = %stand_2_run_180l;
var_2["exposed"][3] = %cqb_start_3;
var_2["exposed"][4] = %stand_2_run_l;
var_2["exposed"][6] = %stand_2_run_r;
var_2["exposed"][7] = %cqb_start_7;
var_2["exposed"][8] = %surprise_start_v1;
var_2["exposed"][9] = %cqb_start_9;
var_2["exposed_crouch"] = [];
var_2["exposed_crouch"][1] = %cqb_crouch_start_1;
var_2["exposed_crouch"][2] = %crouch_2run_180;
var_2["exposed_crouch"][3] = %cqb_crouch_start_3;
var_2["exposed_crouch"][4] = %crouch_2run_l;
var_2["exposed_crouch"][6] = %crouch_2run_r;
var_2["exposed_crouch"][7] = %cqb_crouch_start_7;
var_2["exposed_crouch"][8] = %crouch_2run_f;
var_2["exposed_crouch"][9] = %cqb_crouch_start_9;
var_2["exposed_cqb"] = [];
var_2["exposed_cqb"][1] = %cqb_start_1;
var_2["exposed_cqb"][2] = %cqb_start_2;
var_2["exposed_cqb"][3] = %cqb_start_3;
var_2["exposed_cqb"][4] = %cqb_start_4;
var_2["exposed_cqb"][6] = %cqb_start_6;
var_2["exposed_cqb"][7] = %cqb_start_7;
var_2["exposed_cqb"][8] = %cqb_start_8;
var_2["exposed_cqb"][9] = %cqb_start_9;
var_2["exposed_crouch_cqb"] = [];
var_2["exposed_crouch_cqb"][1] = %cqb_crouch_start_1;
var_2["exposed_crouch_cqb"][2] = %cqb_crouch_start_2;
var_2["exposed_crouch_cqb"][3] = %cqb_crouch_start_3;
var_2["exposed_crouch_cqb"][4] = %cqb_crouch_start_4;
var_2["exposed_crouch_cqb"][6] = %cqb_crouch_start_6;
var_2["exposed_crouch_cqb"][7] = %cqb_crouch_start_7;
var_2["exposed_crouch_cqb"][8] = %cqb_crouch_start_8;
var_2["exposed_crouch_cqb"][9] = %cqb_crouch_start_9;
var_2["heat"] = [];
var_2["heat"][1] = %heat_exit_1;
var_2["heat"][2] = %heat_exit_2;
var_2["heat"][3] = %heat_exit_3;
var_2["heat"][4] = %heat_exit_4;
var_2["heat"][6] = %heat_exit_6;
var_2["heat"][7] = %heat_exit_7;
var_2["heat"][8] = %heat_exit_8;
var_2["heat"][9] = %heat_exit_9;
var_2["heat_left"] = [];
var_2["heat_left"][1] = %heat_exit_1;
var_2["heat_left"][2] = %heat_exit_2;
var_2["heat_left"][3] = %heat_exit_3;
var_2["heat_left"][4] = %heat_exit_4;
var_2["heat_left"][6] = %heat_exit_6;
var_2["heat_left"][7] = %heat_exit_8l;
var_2["heat_left"][8] = %heat_exit_8l;
var_2["heat_left"][9] = %heat_exit_8r;
var_2["heat_right"] = [];
var_2["heat_right"][1] = %heat_exit_1;
var_2["heat_right"][2] = %heat_exit_2;
var_2["heat_right"][3] = %heat_exit_3;
var_2["heat_right"][4] = %heat_exit_4;
var_2["heat_right"][6] = %heat_exit_6;
var_2["heat_right"][7] = %heat_exit_8l;
var_2["heat_right"][8] = %heat_exit_8r;
var_2["heat_right"][9] = %heat_exit_8r;
anim.archetypes["soldier"]["cover_exit"] = var_2;
for ( var_3 = 1; var_3 <= 6; var_3++ )
{
if ( var_3 == 5 )
continue;
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
{
var_5 = var_0[var_4];
if ( isdefined( anim.archetypes["soldier"]["cover_trans"][var_5] ) && isdefined( anim.archetypes["soldier"]["cover_trans"][var_5][var_3] ) )
{
anim.archetypes["soldier"]["cover_trans_dist"][var_5][var_3] = getmovedelta( anim.archetypes["soldier"]["cover_trans"][var_5][var_3], 0, 1 );
anim.archetypes["soldier"]["cover_trans_angles"][var_5][var_3] = getangledelta( anim.archetypes["soldier"]["cover_trans"][var_5][var_3], 0, 1 );
}
if ( isdefined( anim.archetypes["soldier"]["cover_exit"][var_5] ) && isdefined( anim.archetypes["soldier"]["cover_exit"][var_5][var_3] ) )
{
if ( animhasnotetrack( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], "code_move" ) )
var_6 = getnotetracktimes( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], "code_move" )[0];
else
var_6 = 1;
anim.archetypes["soldier"]["cover_exit_dist"][var_5][var_3] = getmovedelta( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], 0, var_6 );
anim.archetypes["soldier"]["cover_exit_angles"][var_5][var_3] = getangledelta( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], 0, 1 );
}
}
}
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
{
var_5 = var_0[var_4];
anim.covertranslongestdist[var_5] = 0;
for ( var_3 = 1; var_3 <= 6; var_3++ )
{
if ( var_3 == 5 || !isdefined( anim.archetypes["soldier"]["cover_trans"][var_5] ) || !isdefined( anim.archetypes["soldier"]["cover_trans"][var_5][var_3] ) )
continue;
var_7 = lengthsquared( anim.archetypes["soldier"]["cover_trans_dist"][var_5][var_3] );
if ( anim.covertranslongestdist[var_5] < var_7 )
anim.covertranslongestdist[var_5] = var_7;
}
anim.covertranslongestdist[var_5] = sqrt( anim.covertranslongestdist[var_5] );
}
anim.exposedtransition["exposed"] = 1;
anim.exposedtransition["exposed_crouch"] = 1;
anim.exposedtransition["exposed_cqb"] = 1;
anim.exposedtransition["exposed_crouch_cqb"] = 1;
anim.exposedtransition["exposed_ready_cqb"] = 1;
anim.exposedtransition["exposed_ready"] = 1;
anim.exposedtransition["heat"] = 1;
if ( !isdefined( anim.longestexposedapproachdist ) )
anim.longestexposedapproachdist = 0;
foreach ( var_5, var_9 in anim.exposedtransition )
{
for ( var_3 = 7; var_3 <= 9; var_3++ )
{
if ( isdefined( anim.archetypes["soldier"]["cover_trans"][var_5] ) && isdefined( anim.archetypes["soldier"]["cover_trans"][var_5][var_3] ) )
{
anim.archetypes["soldier"]["cover_trans_dist"][var_5][var_3] = getmovedelta( anim.archetypes["soldier"]["cover_trans"][var_5][var_3], 0, 1 );
anim.archetypes["soldier"]["cover_trans_angles"][var_5][var_3] = getangledelta( anim.archetypes["soldier"]["cover_trans"][var_5][var_3], 0, 1 );
}
if ( isdefined( anim.archetypes["soldier"]["cover_exit"][var_5] ) && isdefined( anim.archetypes["soldier"]["cover_exit"][var_5][var_3] ) )
{
var_6 = getnotetracktimes( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], "code_move" )[0];
anim.archetypes["soldier"]["cover_exit_dist"][var_5][var_3] = getmovedelta( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], 0, var_6 );
anim.archetypes["soldier"]["cover_exit_angles"][var_5][var_3] = getangledelta( anim.archetypes["soldier"]["cover_exit"][var_5][var_3], 0, 1 );
}
}
for ( var_3 = 1; var_3 <= 9; var_3++ )
{
if ( !isdefined( anim.archetypes["soldier"]["cover_trans"][var_5] ) || !isdefined( anim.archetypes["soldier"]["cover_trans"][var_5][var_3] ) )
continue;
var_10 = length( anim.archetypes["soldier"]["cover_trans_dist"][var_5][var_3] );
if ( var_10 > anim.longestexposedapproachdist )
anim.longestexposedapproachdist = var_10;
}
}
anim.archetypes["soldier"]["cover_trans_split"]["left"][7] = 0.369369;
anim.archetypes["soldier"]["cover_trans_split"]["left_crouch"][7] = 0.321321;
anim.archetypes["soldier"]["cover_trans_split"]["left_crouch_cqb"][7] = 0.2002;
anim.archetypes["soldier"]["cover_trans_split"]["left_cqb"][7] = 0.275275;
anim.archetypes["soldier"]["cover_exit_split"]["left"][7] = 0.550551;
anim.archetypes["soldier"]["cover_exit_split"]["left_crouch"][7] = 0.558559;
anim.archetypes["soldier"]["cover_exit_split"]["left_cqb"][7] = 0.358358;
anim.archetypes["soldier"]["cover_exit_split"]["left_crouch_cqb"][7] = 0.359359;
anim.archetypes["soldier"]["cover_exit_split"]["heat_left"][7] = 0.42;
anim.archetypes["soldier"]["cover_trans_split"]["left"][8] = 0.525526;
anim.archetypes["soldier"]["cover_trans_split"]["left_crouch"][8] = 0.448448;
anim.archetypes["soldier"]["cover_trans_split"]["left_crouch_cqb"][8] = 0.251251;
anim.archetypes["soldier"]["cover_trans_split"]["left_cqb"][8] = 0.335335;
anim.archetypes["soldier"]["cover_exit_split"]["left"][8] = 0.616617;
anim.archetypes["soldier"]["cover_exit_split"]["left_crouch"][8] = 0.453453;
anim.archetypes["soldier"]["cover_exit_split"]["left_crouch_cqb"][8] = 0.572573;
anim.archetypes["soldier"]["cover_exit_split"]["left_cqb"][8] = 0.336336;
anim.archetypes["soldier"]["cover_exit_split"]["heat_left"][8] = 0.42;
anim.archetypes["soldier"]["cover_trans_split"]["right"][8] = 0.472472;
anim.archetypes["soldier"]["cover_trans_split"]["right_crouch"][8] = 0.248248;
anim.archetypes["soldier"]["cover_trans_split"]["right_cqb"][8] = 0.345345;
anim.archetypes["soldier"]["cover_trans_split"]["right_crouch_cqb"][8] = 0.428428;
anim.archetypes["soldier"]["cover_exit_split"]["right"][8] = 0.431431;
anim.archetypes["soldier"]["cover_exit_split"]["right_crouch"][8] = 0.545546;
anim.archetypes["soldier"]["cover_exit_split"]["right_cqb"][8] = 0.335335;
anim.archetypes["soldier"]["cover_exit_split"]["right_crouch_cqb"][8] = 0.4004;
anim.archetypes["soldier"]["cover_exit_split"]["heat_right"][8] = 0.4;
anim.archetypes["soldier"]["cover_trans_split"]["right"][9] = 0.551552;
anim.archetypes["soldier"]["cover_trans_split"]["right_crouch"][9] = 0.2002;
anim.archetypes["soldier"]["cover_trans_split"]["right_cqb"][9] = 0.3003;
anim.archetypes["soldier"]["cover_trans_split"]["right_crouch_cqb"][9] = 0.224224;
anim.archetypes["soldier"]["cover_exit_split"]["right"][9] = 0.485485;
anim.archetypes["soldier"]["cover_exit_split"]["right_crouch"][9] = 0.493493;
anim.archetypes["soldier"]["cover_exit_split"]["right_cqb"][9] = 0.438438;
anim.archetypes["soldier"]["cover_exit_split"]["right_crouch_cqb"][9] = 0.792793;
anim.archetypes["soldier"]["cover_exit_split"]["heat_right"][9] = 0.4;
anim.splitarrivalsleft = [];
anim.splitarrivalsleft["left"] = 1;
anim.splitarrivalsleft["left_crouch"] = 1;
anim.splitarrivalsleft["left_crouch_cqb"] = 1;
anim.splitarrivalsleft["left_cqb"] = 1;
anim.splitexitsleft = [];
anim.splitexitsleft["left"] = 1;
anim.splitexitsleft["left_crouch"] = 1;
anim.splitexitsleft["left_crouch_cqb"] = 1;
anim.splitexitsleft["left_cqb"] = 1;
anim.splitexitsleft["heat_left"] = 1;
anim.splitarrivalsright = [];
anim.splitarrivalsright["right"] = 1;
anim.splitarrivalsright["right_crouch"] = 1;
anim.splitarrivalsright["right_cqb"] = 1;
anim.splitarrivalsright["right_crouch_cqb"] = 1;
anim.splitexitsright = [];
anim.splitexitsright["right"] = 1;
anim.splitexitsright["right_crouch"] = 1;
anim.splitexitsright["right_cqb"] = 1;
anim.splitexitsright["right_crouch_cqb"] = 1;
anim.splitexitsright["heat_right"] = 1;
getsplittimes( "soldier" );
anim.arrivalendstance["left"] = "stand";
anim.arrivalendstance["left_cqb"] = "stand";
anim.arrivalendstance["right"] = "stand";
anim.arrivalendstance["right_cqb"] = "stand";
anim.arrivalendstance["stand"] = "stand";
anim.arrivalendstance["stand_saw"] = "stand";
anim.arrivalendstance["exposed"] = "stand";
anim.arrivalendstance["exposed_cqb"] = "stand";
anim.arrivalendstance["heat"] = "stand";
anim.arrivalendstance["left_crouch"] = "crouch";
anim.arrivalendstance["left_crouch_cqb"] = "crouch";
anim.arrivalendstance["right_crouch"] = "crouch";
anim.arrivalendstance["right_crouch_cqb"] = "crouch";
anim.arrivalendstance["crouch_saw"] = "crouch";
anim.arrivalendstance["crouch"] = "crouch";
anim.arrivalendstance["exposed_crouch"] = "crouch";
anim.arrivalendstance["exposed_crouch_cqb"] = "crouch";
anim.arrivalendstance["prone_saw"] = "prone";
anim.arrivalendstance["exposed_ready"] = "stand";
anim.arrivalendstance["exposed_ready_cqb"] = "stand";
anim.requiredexitstance["Cover Stand"] = "stand";
anim.requiredexitstance["Conceal Stand"] = "stand";
anim.requiredexitstance["Cover Crouch"] = "crouch";
anim.requiredexitstance["Conceal Crouch"] = "crouch";
}
getsplittimes( var_0 )
{
getsplittimesside( var_0, 7, 8, 0, anim.splitarrivalsleft, anim.splitexitsleft );
getsplittimesside( var_0, 8, 9, 1, anim.splitarrivalsright, anim.splitexitsright );
}
getsplittimesside( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = 0;
for ( var_7 = var_1; var_7 <= var_2; var_7++ )
{
if ( !var_6 )
{
foreach ( var_10, var_9 in var_4 )
{
if ( isdefined( anim.archetypes[var_0]["cover_trans"] ) && isdefined( anim.archetypes[var_0]["cover_trans"][var_10] ) && isdefined( anim.archetypes[var_0]["cover_trans"][var_10][var_7] ) )
{
anim.archetypes[var_0]["cover_trans_predist"][var_10][var_7] = getmovedelta( anim.archetypes[var_0]["cover_trans"][var_10][var_7], 0, gettranssplittime( var_0, var_10, var_7 ) );
anim.archetypes[var_0]["cover_trans_dist"][var_10][var_7] = getmovedelta( anim.archetypes[var_0]["cover_trans"][var_10][var_7], 0, 1 ) - anim.archetypes[var_0]["cover_trans_predist"][var_10][var_7];
anim.archetypes[var_0]["cover_trans_angles"][var_10][var_7] = getangledelta( anim.archetypes[var_0]["cover_trans"][var_10][var_7], 0, 1 );
}
}
foreach ( var_10, var_9 in var_5 )
{
if ( isdefined( anim.archetypes[var_0]["cover_exit"] ) && isdefined( anim.archetypes[var_0]["cover_exit"][var_10] ) && isdefined( anim.archetypes[var_0]["cover_exit"][var_10][var_7] ) )
{
anim.archetypes[var_0]["cover_exit_dist"][var_10][var_7] = getmovedelta( anim.archetypes[var_0]["cover_exit"][var_10][var_7], 0, getexitsplittime( var_0, var_10, var_7 ) );
anim.archetypes[var_0]["cover_exit_postdist"][var_10][var_7] = getmovedelta( anim.archetypes[var_0]["cover_exit"][var_10][var_7], 0, 1 ) - anim.archetypes[var_0]["cover_exit_dist"][var_10][var_7];
anim.archetypes[var_0]["cover_exit_angles"][var_10][var_7] = getangledelta( anim.archetypes[var_0]["cover_exit"][var_10][var_7], 0, 1 );
}
}
continue;
}
}
}
getexitsplittime( var_0, var_1, var_2 )
{
return anim.archetypes[var_0]["cover_exit_split"][var_1][var_2];
}
gettranssplittime( var_0, var_1, var_2 )
{
return anim.archetypes[var_0]["cover_trans_split"][var_1][var_2];
}

1305
animscripts/melee.gsc Normal file

File diff suppressed because it is too large Load Diff

1058
animscripts/move.gsc Normal file

File diff suppressed because it is too large Load Diff

1124
animscripts/notetracks.gsc Normal file

File diff suppressed because it is too large Load Diff

1497
animscripts/pain.gsc Normal file

File diff suppressed because it is too large Load Diff

264
animscripts/reactions.gsc Normal file
View File

@ -0,0 +1,264 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
animscripts\utility::initialize( "reactions" );
newenemysurprisedreaction();
}
#using_animtree("generic_human");
init_animset_reactions()
{
var_0 = [];
var_0["cover_stand"] = [ %stand_cover_reaction_a, %stand_cover_reaction_b ];
var_0["cover_crouch"] = [ %stand_cover_reaction_a, %stand_cover_reaction_b ];
var_0["cover_left"] = [ %stand_cover_reaction_a, %stand_cover_reaction_b ];
var_0["cover_right"] = [ %stand_cover_reaction_a, %stand_cover_reaction_b ];
anim.archetypes["soldier"]["cover_reactions"] = var_0;
var_0 = [];
var_0[0] = %run_wizby_a;
var_0[1] = %run_wizby_b;
anim.archetypes["soldier"]["running_react_to_bullets"] = var_0;
anim.lastrunningreactanim = 0;
}
reactionscheckloop()
{
thread bulletwhizbycheckloop();
}
canreactagain()
{
return !isdefined( self.lastreacttime ) || gettime() - self.lastreacttime > 2000;
}
bulletwhizbyreaction()
{
self endon( "killanimscript" );
self.lastreacttime = gettime();
self.a.movement = "stop";
var_0 = isdefined( self.whizbyenemy ) && distancesquared( self.origin, self.whizbyenemy.origin ) < 160000;
self animmode( "gravity" );
self orientmode( "face current" );
if ( var_0 || common_scripts\utility::cointoss() )
{
self clearanim( %root, 0.1 );
var_1 = [];
var_1[0] = %exposed_idle_reacta;
var_1[1] = %exposed_idle_reactb;
var_1[2] = %exposed_idle_twitch;
var_1[3] = %exposed_idle_twitch_v4;
var_2 = var_1[randomint( var_1.size )];
if ( var_0 )
var_3 = 1 + randomfloat( 0.5 );
else
var_3 = 0.2 + randomfloat( 0.5 );
self setflaggedanimknobrestart( "reactanim", var_2, 1, 0.1, 1 );
animscripts\notetracks::donotetracksfortime( var_3, "reactanim" );
self clearanim( %root, 0.1 );
if ( !var_0 && self.stairsstate == "none" && !isdefined( self.disable_dive_whizby_react ) )
{
var_4 = 1 + randomfloat( 0.2 );
var_5 = animscripts\utility::randomanimoftwo( %exposed_dive_grenade_b, %exposed_dive_grenade_f );
self setflaggedanimknobrestart( "dive", var_5, 1, 0.1, var_4 );
animscripts\shared::donotetracks( "dive" );
}
}
else
{
wait( randomfloat( 0.2 ) );
var_4 = 1.2 + randomfloat( 0.3 );
if ( self.a.pose == "stand" )
{
self clearanim( %root, 0.1 );
self setflaggedanimknobrestart( "crouch", %exposed_stand_2_crouch, 1, 0.1, var_4 );
animscripts\shared::donotetracks( "crouch" );
}
var_6 = anglestoforward( self.angles );
if ( isdefined( self.whizbyenemy ) )
var_7 = vectornormalize( self.whizbyenemy.origin - self.origin );
else
var_7 = var_6;
if ( vectordot( var_7, var_6 ) > 0 )
{
var_8 = animscripts\utility::randomanimoftwo( %exposed_crouch_idle_twitch_v2, %exposed_crouch_idle_twitch_v3 );
self clearanim( %root, 0.1 );
self setflaggedanimknobrestart( "twitch", var_8, 1, 0.1, 1 );
animscripts\shared::donotetracks( "twitch" );
}
else
{
var_9 = animscripts\utility::randomanimoftwo( %exposed_crouch_turn_180_left, %exposed_crouch_turn_180_right );
self clearanim( %root, 0.1 );
self setflaggedanimknobrestart( "turn", var_9, 1, 0.1, 1 );
animscripts\shared::donotetracks( "turn" );
}
}
self clearanim( %root, 0.1 );
self.whizbyenemy = undefined;
self animmode( "normal" );
self orientmode( "face default" );
}
bulletwhizbycheckloop()
{
self endon( "killanimscript" );
if ( isdefined( self.disablebulletwhizbyreaction ) )
return;
for (;;)
{
self waittill( "bulletwhizby", var_0 );
if ( !isdefined( var_0.team ) || self.team == var_0.team )
continue;
if ( isdefined( self.covernode ) || isdefined( self.ambushnode ) )
continue;
if ( self.a.pose != "stand" )
continue;
if ( !canreactagain() )
continue;
self.whizbyenemy = var_0;
self animcustom( ::bulletwhizbyreaction );
}
}
clearlookatthread()
{
self endon( "killanimscript" );
wait 0.3;
self setlookatentity();
}
getnewenemyreactionanim()
{
var_0 = undefined;
if ( self nearclaimnodeandangle() )
{
var_1 = animscripts\utility::lookupanimarray( "cover_reactions" );
if ( isdefined( var_1[self.prevscript] ) )
{
var_2 = anglestoforward( self.node.angles );
var_3 = vectornormalize( self.reactiontargetpos - self.origin );
if ( vectordot( var_2, var_3 ) < -0.5 )
{
self orientmode( "face current" );
var_4 = randomint( var_1[self.prevscript].size );
var_0 = var_1[self.prevscript][var_4];
}
}
}
if ( !isdefined( var_0 ) )
{
var_5 = [];
var_5[0] = %exposed_backpedal;
var_5[1] = %exposed_idle_reactb;
if ( isdefined( self.enemy ) && distancesquared( self.enemy.origin, self.reactiontargetpos ) < 65536 )
self orientmode( "face enemy" );
else
self orientmode( "face point", self.reactiontargetpos );
if ( self.a.pose == "crouch" )
{
var_3 = vectornormalize( self.reactiontargetpos - self.origin );
var_6 = anglestoforward( self.angles );
if ( vectordot( var_6, var_3 ) < -0.5 )
{
self orientmode( "face current" );
var_5[0] = %crouch_cover_reaction_a;
var_5[1] = %crouch_cover_reaction_b;
}
}
var_0 = var_5[randomint( var_5.size )];
}
return var_0;
}
stealthnewenemyreactanim()
{
self clearanim( %root, 0.2 );
if ( randomint( 4 ) < 3 )
{
self orientmode( "face enemy" );
self setflaggedanimknobrestart( "reactanim", %exposed_idle_reactb, 1, 0.2, 1 );
var_0 = getanimlength( %exposed_idle_reactb );
animscripts\notetracks::donotetracksfortime( var_0 * 0.8, "reactanim" );
self orientmode( "face current" );
}
else
{
self orientmode( "face enemy" );
self setflaggedanimknobrestart( "reactanim", %exposed_backpedal, 1, 0.2, 1 );
var_0 = getanimlength( %exposed_backpedal );
animscripts\notetracks::donotetracksfortime( var_0 * 0.8, "reactanim" );
self orientmode( "face current" );
self clearanim( %root, 0.2 );
self setflaggedanimknobrestart( "reactanim", %exposed_backpedal_v2, 1, 0.2, 1 );
animscripts\shared::donotetracks( "reactanim" );
}
}
newenemyreactionanim()
{
self endon( "death" );
self endon( "endNewEnemyReactionAnim" );
self.lastreacttime = gettime();
self.a.movement = "stop";
if ( isdefined( self._stealth ) && self.alertlevel != "combat" )
stealthnewenemyreactanim();
else
{
var_0 = getnewenemyreactionanim();
self clearanim( %root, 0.2 );
self setflaggedanimknobrestart( "reactanim", var_0, 1, 0.2, 1 );
animscripts\shared::donotetracks( "reactanim" );
}
self notify( "newEnemyReactionDone" );
}
newenemysurprisedreaction()
{
self endon( "death" );
if ( isdefined( self.disablereactionanims ) )
return;
if ( !canreactagain() )
return;
if ( self.a.pose == "prone" || isdefined( self.a.onback ) )
return;
self animmode( "gravity" );
if ( isdefined( self.enemy ) )
newenemyreactionanim();
}

View File

@ -0,0 +1,712 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_riotshield_ai_anims()
{
anim.notetracks["detach shield"] = ::notetrackdetachshield;
animscripts\init_move_transitions::init_move_transition_arrays();
var_0 = [];
var_0["cover_trans"]["riotshield"][1] = %riotshield_run_approach_1;
var_0["cover_trans"]["riotshield"][2] = %riotshield_run_approach_2;
var_0["cover_trans"]["riotshield"][3] = %riotshield_run_approach_3;
var_0["cover_trans"]["riotshield"][4] = %riotshield_run_approach_4;
var_0["cover_trans"]["riotshield"][6] = %riotshield_run_approach_6;
var_0["cover_trans"]["riotshield"][7] = undefined;
var_0["cover_trans"]["riotshield"][8] = %riotshield_walk2crouch_8;
var_0["cover_trans"]["riotshield"][9] = undefined;
var_0["cover_trans"]["riotshield_crouch"][1] = %riotshield_walk_approach_1;
var_0["cover_trans"]["riotshield_crouch"][2] = %riotshield_walk_approach_2;
var_0["cover_trans"]["riotshield_crouch"][3] = %riotshield_walk_approach_3;
var_0["cover_trans"]["riotshield_crouch"][4] = %riotshield_walk_approach_4;
var_0["cover_trans"]["riotshield_crouch"][6] = %riotshield_walk_approach_6;
var_0["cover_trans"]["riotshield_crouch"][7] = undefined;
var_0["cover_trans"]["riotshield_crouch"][8] = %riotshield_walk2crouch_8;
var_0["cover_trans"]["riotshield_crouch"][9] = undefined;
var_1 = [];
var_1[0] = "riotshield";
var_1[1] = "riotshield_crouch";
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
var_3 = var_1[var_2];
for ( var_4 = 1; var_4 <= 9; var_4++ )
{
if ( var_4 == 5 )
continue;
if ( isdefined( var_0["cover_trans"][var_3][var_4] ) )
var_0["cover_trans_dist"][var_3][var_4] = getmovedelta( var_0["cover_trans"][var_3][var_4], 0, 1 );
}
}
var_0["cover_trans_angles"]["riotshield_crouch"][1] = 45;
var_0["cover_trans_angles"]["riotshield_crouch"][2] = 0;
var_0["cover_trans_angles"]["riotshield_crouch"][3] = -45;
var_0["cover_trans_angles"]["riotshield_crouch"][4] = 90;
var_0["cover_trans_angles"]["riotshield_crouch"][6] = -90;
var_0["cover_trans_angles"]["riotshield_crouch"][8] = 180;
var_0["cover_trans_angles"]["riotshield"][1] = 45;
var_0["cover_trans_angles"]["riotshield"][2] = 0;
var_0["cover_trans_angles"]["riotshield"][3] = -45;
var_0["cover_trans_angles"]["riotshield"][4] = 90;
var_0["cover_trans_angles"]["riotshield"][6] = -90;
var_0["cover_trans_angles"]["riotshield"][8] = 180;
animscripts\animset::registerarchetype( "riotshield", var_0, 0 );
anim.arrivalendstance["riotshield"] = "crouch";
anim.arrivalendstance["riotshield_crouch"] = "crouch";
animscripts\combat_utility::addgrenadethrowanimoffset( %riotshield_crouch_grenade_toss, ( -3.20014, 1.7098, 55.6886 ) );
}
notetrackdetachshield( var_0, var_1 )
{
animscripts\shared::dropaiweapon( self.secondaryweapon );
self.secondaryweapon = "none";
if ( isalive( self ) )
riotshield_turn_into_regular_ai();
}
riotshield_approach_type()
{
if ( self.a.pose == "crouch" )
return "riotshield_crouch";
return "riotshield";
}
riotshield_approach_conditions( var_0 )
{
return 1;
}
init_riotshield_ai()
{
animscripts\shared::placeweaponon( self.secondaryweapon, "left", 0 );
self.animarchetype = "riotshield";
self initriotshieldhealth( self.secondaryweapon );
self.shieldmodelvariant = 0;
thread riotshield_damaged();
self.subclass = "riotshield";
self.approachtypefunc = ::riotshield_approach_type;
self.approachconditioncheckfunc = ::riotshield_approach_conditions;
self.faceenemyarrival = 1;
self.disablecoverarrivalsonly = 1;
self.pathrandompercent = 0;
self.interval = 0;
self.disabledoorbehavior = 1;
self.no_pistol_switch = 1;
self.dontshootwhilemoving = 1;
self.disablebulletwhizbyreaction = 1;
self.disablefriendlyfirereaction = 1;
self.neversprintforvariation = 1;
self.combatmode = "no_cover";
self.fixednode = 0;
self.maxfaceenemydist = 1500;
self.nomeleechargedelay = 1;
self.meleechargedistsq = squared( 256 );
self.meleeplayerwhilemoving = 1;
self.usemuzzlesideoffset = 1;
if ( level.gameskill < 1 )
self.shieldbulletblocklimit = randomintrange( 4, 8 );
else
self.shieldbulletblocklimit = randomintrange( 8, 12 );
self.shieldbulletblockcount = 0;
self.shieldbulletblocktime = 0;
self.walkdist = 500;
self.walkdistfacingmotion = 500;
self.grenadeawareness = 1;
self.frontshieldanglecos = 0.5;
self.nogrenadereturnthrow = 1;
self.a.grenadethrowpose = "crouch";
self.minexposedgrenadedist = 400;
self.ignoresuppression = 1;
self.specialmelee_standard = ::riotshield_melee_standard;
self.specialmeleechooseaction = ::riotshield_melee_aivsai;
maps\_utility::disable_turnanims();
maps\_utility::disable_surprise();
maps\_utility::disable_cqbwalk();
init_riotshield_animsets();
if ( level.gameskill < 1 )
self.bullet_resistance = 30;
else
self.bullet_resistance = 40;
maps\_utility::add_damage_function( maps\_spawner::bullet_resistance );
maps\_utility::add_damage_function( animscripts\pain::additive_pain );
}
riotshield_charge()
{
if ( !animscripts\melee::melee_standard_updateandvalidatetarget() )
return 0;
var_0 = getmovedelta( %riotshield_basha_attack, 0, 1 );
var_1 = lengthsquared( var_0 );
if ( distancesquared( self.origin, self.melee.target.origin ) < var_1 )
return 1;
animscripts\melee::melee_playchargesound();
var_2 = 0.1;
var_3 = 1;
for (;;)
{
if ( !animscripts\melee::melee_standard_updateandvalidatetarget() )
return 0;
if ( var_3 )
{
self.a.pose = "stand";
self setflaggedanimknoball( "chargeanim", %riotshield_sprint, %body, 1, 0.2, 1 );
var_3 = 0;
}
self orientmode( "face point", self.melee.target.origin );
animscripts\notetracks::donotetracksfortime( var_2, "chargeanim" );
var_4 = distancesquared( self.origin, self.melee.target.origin );
if ( var_4 < var_1 )
break;
if ( gettime() >= self.melee.giveuptime )
return 0;
}
return 1;
}
riotshield_melee_standard()
{
self animmode( "zonly_physics" );
animscripts\melee::melee_standard_resetgiveuptime();
for (;;)
{
if ( !riotshield_charge() )
{
self.nextmeleechargetime = gettime() + 1500;
self.nextmeleechargetarget = self.melee.target;
break;
}
animscripts\battlechatter_ai::evaluatemeleeevent();
self orientmode( "face point", self.melee.target.origin );
self setflaggedanimknoballrestart( "meleeanim", %riotshield_bash_vs_player, %body, 1, 0.2, 1 );
self.melee.inprogress = 1;
if ( !animscripts\melee::melee_standard_playattackloop() )
{
animscripts\melee::melee_standard_delaystandardcharge( self.melee.target );
break;
}
self animmode( "none" );
}
self animmode( "none" );
}
riotshield_melee_aivsai()
{
var_0 = self.melee.target;
if ( self.subclass == "riotshield" && var_0.subclass == "riotshield" )
return 0;
animscripts\melee::melee_decide_winner();
var_1 = vectortoangles( var_0.origin - self.origin );
var_2 = angleclamp180( var_0.angles[1] - var_1[1] );
if ( abs( var_2 ) > 100 )
{
if ( self.melee.winner )
{
if ( self.subclass == "riotshield" )
{
self.melee.animname = %riotshield_basha_attack;
var_0.melee.animname = %riotshield_basha_defend;
var_0.melee.surviveanimname = %riotshield_basha_defend_survive;
}
else
{
self.melee.animname = %riotshield_bashb_defend;
var_0.melee.animname = %riotshield_bashb_attack;
}
}
else if ( self.subclass == "riotshield" )
{
self.melee.animname = %riotshield_bashb_attack;
var_0.melee.animname = %riotshield_bashb_defend;
}
else
{
self.melee.animname = %riotshield_basha_defend;
var_0.melee.animname = %riotshield_basha_attack;
}
}
else
return 0;
self.melee.startpos = getstartorigin( var_0.origin, var_0.angles, self.melee.animname );
self.melee.startangles = ( var_0.angles[0], angleclamp180( var_0.angles[1] + 180 ), var_0.angles[2] );
self.lockorientation = 0;
var_0.lockorientation = 0;
return animscripts\melee::melee_updateandvalidatestartpos();
}
riotshield_startmovetransition()
{
if ( isdefined( self.disableexits ) )
return;
self orientmode( "face angle", self.angles[1] );
self animmode( "zonly_physics", 0 );
if ( self.a.pose == "crouch" )
{
if ( isdefined( self.sprint ) || isdefined( self.fastwalk ) )
var_0 = %riotshield_crouch2stand;
else
var_0 = %riotshield_crouch2walk;
var_1 = randomfloatrange( 0.9, 1.1 );
if ( isdefined( self.copgroup ) )
var_1 = 2.5;
self setflaggedanimknoballrestart( "startmove", var_0, %body, 1, 0.1, var_1 );
animscripts\shared::donotetracks( "startmove" );
self clearanim( %riotshield_crouch2walk, 0.5 );
}
if ( isdefined( self.sprint ) || isdefined( self.fastwalk ) )
{
self allowedstances( "stand", "crouch" );
self.a.pose = "stand";
}
self orientmode( "face default" );
self animmode( "normal", 0 );
thread riotshield_bullet_hit_shield();
}
riotshield_endmovetransition()
{
if ( self.prevscript == "move" && self.a.pose == "crouch" )
{
self clearanim( %root, 0.2 );
var_0 = randomfloatrange( 0.9, 1.1 );
if ( isdefined( self.copgroup ) )
var_0 = 2.5;
self animmode( "zonly_physics" );
self setflaggedanimknoballrestart( "endmove", %riotshield_walk2crouch_8, %body, 1, 0.2, var_0 );
animscripts\shared::donotetracks( "endmove" );
self animmode( "normal" );
}
self allowedstances( "crouch" );
}
riotshield_startcombat()
{
riotshield_endmovetransition();
self.pushable = 0;
thread riotshield_bullet_hit_shield();
}
riotshield_bullet_hit_shield()
{
self endon( "killanimscript" );
for (;;)
{
self waittill( "bullet_hitshield" );
var_0 = gettime();
if ( var_0 - self.shieldbulletblocktime > 500 )
self.shieldbulletblockcount = 0;
else
self.shieldbulletblockcount++;
self.shieldbulletblocktime = var_0;
if ( self.shieldbulletblockcount > self.shieldbulletblocklimit )
self dodamage( 1, ( 0, 0, 0 ) );
if ( common_scripts\utility::cointoss() )
var_1 = %riotshield_reacta;
else
var_1 = %riotshield_reactb;
self notify( "new_hit_react" );
self setflaggedanimrestart( "hitreact", var_1, 1, 0.1, 1 );
thread riotshield_bullet_hit_shield_clear();
}
}
riotshield_bullet_hit_shield_clear()
{
self endon( "killanimscript" );
self endon( "new_hit_react" );
self waittillmatch( "hitreact", "end" );
self clearanim( %riotshield_react, 0.1 );
}
riotshield_grenadecower()
{
if ( self.a.pose == "stand" )
{
self clearanim( %root, 0.2 );
self setflaggedanimknoballrestart( "trans", %riotshield_walk2crouch_8, %body, 1, 0.2, 1.2 );
animscripts\shared::donotetracks( "trans" );
}
if ( isdefined( self.grenade ) )
{
var_0 = 1;
var_1 = self.grenade.origin - self.origin;
if ( isdefined( self.enemy ) )
{
var_2 = self.enemy.origin - self.origin;
if ( vectordot( var_1, var_2 ) < 0 )
var_0 = 0;
}
if ( var_0 )
{
var_3 = angleclamp180( self.angles[1] - vectortoyaw( var_1 ) );
if ( !isdefined( self.turnthreshold ) )
self.turnthreshold = 55;
while ( abs( var_3 ) > self.turnthreshold )
{
if ( !isdefined( self.a.array ) )
animscripts\combat::setup_anim_array();
if ( !animscripts\combat::turntofacerelativeyaw( var_3 ) )
break;
var_3 = angleclamp180( self.angles[1] - vectortoyaw( var_1 ) );
}
}
}
self setanimknoball( %riotshield_crouch_aim_5, %body, 1, 0.2, 1 );
self setflaggedanimknoballrestart( "grenadecower", %riotshield_crouch_idle_add, %add_idle, 1, 0.2, self.animplaybackrate );
animscripts\shared::donotetracks( "grenadecower" );
}
riotshield_flashbang()
{
self notify( "flashed" );
if ( !isdefined( self.a.onback ) )
{
var_0 = randomfloatrange( 0.9, 1.1 );
self.frontshieldanglecos = 1;
var_1 = [];
var_1[0] = %riotshield_crouch_grenade_flash1;
var_1[1] = %riotshield_crouch_grenade_flash2;
var_1[2] = %riotshield_crouch_grenade_flash3;
var_1[3] = %riotshield_crouch_grenade_flash4;
var_2 = var_1[randomint( var_1.size )];
self setflaggedanimknoballrestart( "flashanim", var_2, %body, 1, 0.1, var_0 );
self.minpaindamage = 1000;
animscripts\shared::donotetracks( "flashanim" );
}
else
wait 0.1;
self.minpaindamage = 0;
if ( isdefined( self.subclass ) && self.subclass == "riotshield" )
self.frontshieldanglecos = 0.5;
}
riotshield_pain()
{
self.a.pose = "crouch";
if ( animscripts\utility::usingsidearm() )
maps\_utility::forceuseweapon( self.primaryweapon, "primary" );
if ( !isdefined( self.a.onback ) )
{
var_0 = randomfloatrange( 0.8, 1.15 );
self.frontshieldanglecos = 1;
if ( ( self.damageyaw < -120 || self.damageyaw > 120 ) && isexplosivedamagemod( self.damagemod ) )
{
var_1 = [];
var_1[0] = %riotshield_crouch_grenade_blowback;
var_1[1] = %riotshield_crouch_grenade_blowbackl;
var_1[2] = %riotshield_crouch_grenade_blowbackr;
var_2 = var_1[randomint( var_1.size )];
self setflaggedanimknoballrestart( "painanim", var_2, %body, 1, 0.2, var_0 );
self.minpaindamage = 1000;
}
else
self setflaggedanimknoballrestart( "painanim", %riotshield_crouch_pain, %body, 1, 0.2, var_0 );
animscripts\shared::donotetracks( "painanim" );
}
else
wait 0.1;
self.minpaindamage = 0;
if ( isdefined( self.subclass ) && self.subclass == "riotshield" )
self.frontshieldanglecos = 0.5;
}
riotshield_death()
{
if ( isdefined( self.a.onback ) && self.a.pose == "crouch" )
{
var_0 = [];
var_0[0] = %dying_back_death_v2;
var_0[1] = %dying_back_death_v3;
var_0[2] = %dying_back_death_v4;
var_1 = var_0[randomint( var_0.size )];
animscripts\death::playdeathanim( var_1 );
return 1;
}
if ( self.prevscript == "pain" || self.prevscript == "flashed" )
var_2 = randomint( 2 ) == 0;
else
var_2 = 1;
if ( var_2 )
{
if ( common_scripts\utility::cointoss() )
var_1 = %riotshield_crouch_death;
else
var_1 = %riotshield_crouch_death_fallback;
animscripts\death::playdeathanim( var_1 );
return 1;
}
self.a.pose = "crouch";
return 0;
}
init_riotshield_animsets()
{
var_0 = [];
var_0["sprint"] = %riotshield_sprint;
var_0["prone"] = %prone_crawl;
var_0["straight"] = %riotshield_run_f;
var_0["move_f"] = %riotshield_run_f;
var_0["move_l"] = %riotshield_run_l;
var_0["move_r"] = %riotshield_run_r;
var_0["move_b"] = %riotshield_run_b;
var_0["crouch"] = %riotshield_crouchwalk_f;
var_0["crouch_l"] = %riotshield_crouchwalk_l;
var_0["crouch_r"] = %riotshield_crouchwalk_r;
var_0["crouch_b"] = %riotshield_crouchwalk_b;
var_0["stairs_up"] = %traverse_stair_run_01;
var_0["stairs_down"] = %traverse_stair_run_down;
self.custommoveanimset["run"] = var_0;
self.custommoveanimset["walk"] = var_0;
self.custommoveanimset["cqb"] = var_0;
self.customidleanimset = [];
self.customidleanimset["crouch"] = %riotshield_crouch_aim_5;
self.customidleanimset["crouch_add"] = %riotshield_crouch_idle_add;
self.customidleanimset["stand"] = %riotshield_crouch_aim_5;
self.customidleanimset["stand_add"] = %riotshield_crouch_idle_add;
self.a.pose = "crouch";
self allowedstances( "crouch" );
var_0 = anim.animsets.defaultstand;
var_0["add_aim_up"] = %riotshield_crouch_aim_8;
var_0["add_aim_down"] = %riotshield_crouch_aim_2;
var_0["add_aim_left"] = %riotshield_crouch_aim_4;
var_0["add_aim_right"] = %riotshield_crouch_aim_6;
var_0["straight_level"] = %riotshield_crouch_aim_5;
var_0["fire"] = %riotshield_crouch_fire_auto;
var_0["single"] = animscripts\utility::array( %riotshield_crouch_fire_single );
var_0["burst2"] = %riotshield_crouch_fire_burst;
var_0["burst3"] = %riotshield_crouch_fire_burst;
var_0["burst4"] = %riotshield_crouch_fire_burst;
var_0["burst5"] = %riotshield_crouch_fire_burst;
var_0["burst6"] = %riotshield_crouch_fire_burst;
var_0["semi2"] = %riotshield_crouch_fire_burst;
var_0["semi3"] = %riotshield_crouch_fire_burst;
var_0["semi4"] = %riotshield_crouch_fire_burst;
var_0["semi5"] = %riotshield_crouch_fire_burst;
var_0["exposed_idle"] = animscripts\utility::array( %riotshield_crouch_idle_add, %riotshield_crouch_twitch );
var_0["exposed_grenade"] = animscripts\utility::array( %riotshield_crouch_grenade_toss );
var_0["reload"] = animscripts\utility::array( %riotshield_crouch_reload );
var_0["reload_crouchhide"] = animscripts\utility::array( %riotshield_crouch_reload );
var_0["turn_left_45"] = %riotshield_crouch_lturn;
var_0["turn_left_90"] = %riotshield_crouch_lturn;
var_0["turn_left_135"] = %riotshield_crouch_lturn;
var_0["turn_left_180"] = %riotshield_crouch_lturn;
var_0["turn_right_45"] = %riotshield_crouch_rturn;
var_0["turn_right_90"] = %riotshield_crouch_rturn;
var_0["turn_right_135"] = %riotshield_crouch_rturn;
var_0["turn_right_180"] = %riotshield_crouch_rturn;
var_0["stand_2_crouch"] = %riotshield_walk2crouch_8;
animscripts\animset::init_animset_complete_custom_stand( var_0 );
animscripts\animset::init_animset_complete_custom_crouch( var_0 );
self.chooseposefunc = ::riotshield_choose_pose;
self.painfunction = ::riotshield_pain;
self.specialdeathfunc = ::riotshield_death;
self.specialflashedfunc = ::riotshield_flashbang;
self.grenadecowerfunction = ::riotshield_grenadecower;
self.custommovetransition = ::riotshield_startmovetransition;
self.permanentcustommovetransition = 1;
common_scripts\utility::set_exception( "exposed", ::riotshield_startcombat );
}
riotshield_choose_pose( var_0 )
{
if ( isdefined( self.grenade ) )
return "stand";
return animscripts\utility::choosepose( var_0 );
}
riotshield_sprint_on()
{
self.maxfaceenemydist = 128;
self.sprint = 1;
self orientmode( "face default" );
self.lockorientation = 0;
self.walkdist = 32;
self.walkdistfacingmotion = 32;
}
riotshield_fastwalk_on()
{
self.maxfaceenemydist = 128;
self.fastwalk = 1;
self.walkdist = 32;
self.walkdistfacingmotion = 32;
}
riotshield_sprint_off()
{
self.maxfaceenemydist = 1500;
self.walkdist = 500;
self.walkdistfacingmotion = 500;
self.sprint = undefined;
self allowedstances( "crouch" );
}
riotshield_fastwalk_off()
{
self.maxfaceenemydist = 1500;
self.walkdist = 500;
self.walkdistfacingmotion = 500;
self.fastwalk = undefined;
self allowedstances( "crouch" );
}
null_func()
{
}
riotshield_init_flee()
{
if ( self.script == "move" )
self animcustom( ::null_func );
self.custommovetransition = ::riotshield_flee_and_drop_shield;
}
riotshield_flee_and_drop_shield()
{
self.custommovetransition = ::riotshield_startmovetransition;
self animmode( "zonly_physics", 0 );
self orientmode( "face current" );
if ( !isdefined( self.dropshieldinplace ) && isdefined( self.enemy ) && vectordot( self.lookaheaddir, anglestoforward( self.angles ) ) < 0 )
var_0 = %riotshield_crouch2walk_2flee;
else
var_0 = %riotshield_crouch2stand_shield_drop;
var_1 = randomfloatrange( 0.85, 1.1 );
self setflaggedanimknoball( "fleeanim", var_0, %root, 1, 0.1, var_1 );
animscripts\shared::donotetracks( "fleeanim" );
self.maxfaceenemydist = 32;
self.lockorientation = 0;
self orientmode( "face default" );
self animmode( "normal", 0 );
animscripts\shared::donotetracks( "fleeanim" );
self clearanim( var_0, 0.2 );
self.maxfaceenemydist = 128;
}
riotshield_turn_into_regular_ai()
{
self.subclass = "regular";
self.combatmode = "cover";
self.approachtypefunc = undefined;
self.approachconditioncheckfunc = undefined;
self.faceenemyarrival = undefined;
self.disablecoverarrivalsonly = undefined;
self.pathrandompercent = 0;
self.interval = 80;
self.disabledoorbehavior = undefined;
self.no_pistol_switch = undefined;
self.dontshootwhilemoving = undefined;
self.disablebulletwhizbyreaction = undefined;
self.disablefriendlyfirereaction = undefined;
self.neversprintforvariation = undefined;
self.maxfaceenemydist = 128;
self.nomeleechargedelay = undefined;
self.meleechargedistsq = undefined;
self.meleeplayerwhilemoving = undefined;
self.usemuzzlesideoffset = undefined;
self.pathenemyfightdist = 128;
self.pathenemylookahead = 128;
self.walkdist = 256;
self.walkdistfacingmotion = 64;
self.lockorientation = 0;
self.frontshieldanglecos = 1;
self.nogrenadereturnthrow = 0;
self.ignoresuppression = 0;
self.sprint = undefined;
self allowedstances( "stand", "crouch", "prone" );
self.specialmelee_standard = undefined;
self.specialmeleechooseaction = undefined;
maps\_utility::enable_turnanims();
self.bullet_resistance = undefined;
maps\_utility::remove_damage_function( maps\_spawner::bullet_resistance );
maps\_utility::remove_damage_function( animscripts\pain::additive_pain );
animscripts\animset::clear_custom_animset();
self.chooseposefunc = animscripts\utility::choosepose;
self.painfunction = undefined;
self.specialdeathfunc = undefined;
self.specialflashedfunc = undefined;
self.grenadecowerfunction = undefined;
self.custommovetransition = undefined;
self.permanentcustommovetransition = undefined;
common_scripts\utility::clear_exception( "exposed" );
common_scripts\utility::clear_exception( "stop_immediate" );
}
riotshield_damaged()
{
self endon( "death" );
self waittill( "riotshield_damaged" );
self.shieldbroken = 1;
animscripts\shared::detachallweaponmodels();
self.shieldmodelvariant = 1;
animscripts\shared::updateattachedweaponmodels();
}

990
animscripts/run.gsc Normal file
View File

@ -0,0 +1,990 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
moverun()
{
var_0 = [[ self.chooseposefunc ]]( "stand" );
switch ( var_0 )
{
case "stand":
if ( animscripts\setposemovement::standrun_begin() )
return;
if ( isdefined( self.run_overrideanim ) )
{
animscripts\move::movestand_moveoverride( self.run_overrideanim, self.run_override_weights );
return;
}
if ( standrun_checkchangeweapon() )
return;
if ( standrun_checkreload() )
return;
animscripts\utility::updateisincombattimer();
if ( animscripts\utility::isincombat() )
standrun_combatnormal();
else
standrun_noncombatnormal();
break;
case "crouch":
if ( animscripts\setposemovement::crouchrun_begin() )
return;
if ( isdefined( self.crouchrun_combatanim ) )
crouchrun_runoverride();
else
crouchrun_runnormal();
break;
default:
if ( animscripts\setposemovement::pronerun_begin() )
return;
pronecrawl();
break;
}
}
getrunanim()
{
if ( !isdefined( self.a.moveanimset ) )
return animscripts\utility::lookupanim( "run", "straight" );
if ( !self.facemotion )
{
if ( self.stairsstate == "none" || abs( self getmotionangle() ) > 45 )
return animscripts\utility::getmoveanim( "move_f" );
}
if ( self.stairsstate == "up" )
return animscripts\utility::getmoveanim( "stairs_up" );
else if ( self.stairsstate == "down" )
return animscripts\utility::getmoveanim( "stairs_down" );
if ( animscripts\utility::isincombat() || isdefined( self.a.bdisablemovetwitch ) && self.a.bdisablemovetwitch )
return animscripts\utility::getmoveanim( "straight" );
var_0 = animscripts\utility::getmoveanim( "straight_twitch" );
if ( !isdefined( var_0 ) || var_0.size == 0 )
return animscripts\utility::getmoveanim( "straight" );
var_1 = animscripts\utility::getrandomintfromseed( self.a.runloopcount, 4 );
if ( var_1 == 0 )
{
var_1 = animscripts\utility::getrandomintfromseed( self.a.runloopcount, var_0.size );
return var_0[var_1];
}
return animscripts\utility::getmoveanim( "straight" );
}
getcrouchrunanim()
{
if ( !isdefined( self.a.moveanimset ) )
return animscripts\utility::lookupanim( "run", "crouch" );
return animscripts\utility::getmoveanim( "crouch" );
}
pronecrawl()
{
self.a.movement = "run";
self setflaggedanimknob( "runanim", animscripts\utility::getmoveanim( "prone" ), 1, 0.3, self.moveplaybackrate );
run_clearfacialanim();
animscripts\notetracks::donotetracksfortime( 0.25, "runanim" );
}
#using_animtree("generic_human");
initrunngun()
{
if ( !isdefined( self.runngun ) )
{
self notify( "stop_move_anim_update" );
self.update_move_anim_type = undefined;
self clearanim( %combatrun_backward, 0.2 );
self clearanim( %combatrun_right, 0.2 );
self clearanim( %combatrun_left, 0.2 );
self clearanim( %w_aim_2, 0.2 );
self clearanim( %w_aim_4, 0.2 );
self clearanim( %w_aim_6, 0.2 );
self clearanim( %w_aim_8, 0.2 );
self.runngun = 1;
}
}
stoprunngun()
{
if ( isdefined( self.runngun ) )
{
self clearanim( %run_n_gun, 0.2 );
self.runngun = undefined;
}
return 0;
}
runngun( var_0 )
{
if ( var_0 )
{
var_1 = getpredictedyawtoenemy( 0.2 );
var_2 = var_1 < 0;
}
else
{
var_1 = 0;
var_2 = self.runngunweight < 0;
}
var_3 = 1 - var_2;
var_4 = self.maxrunngunangle;
var_5 = self.runnguntransitionpoint;
var_6 = self.runngunincrement;
if ( !var_0 || squared( var_1 ) > var_4 * var_4 )
{
self clearanim( %add_fire, 0 );
if ( squared( self.runngunweight ) < var_6 * var_6 )
{
self.runngunweight = 0;
self.runngun = undefined;
return 0;
}
else if ( self.runngunweight > 0 )
self.runngunweight = self.runngunweight - var_6;
else
self.runngunweight = self.runngunweight + var_6;
}
else
{
var_7 = var_1 / var_4;
var_8 = var_7 - self.runngunweight;
if ( abs( var_8 ) < var_5 * 0.7 )
self.runngunweight = var_7;
else if ( var_8 > 0 )
self.runngunweight = self.runngunweight + var_6;
else
self.runngunweight = self.runngunweight - var_6;
}
initrunngun();
var_9 = abs( self.runngunweight );
var_10 = animscripts\utility::lookupanimarray( "run_n_gun" );
if ( var_9 > var_5 )
{
var_11 = ( var_9 - var_5 ) / var_5;
var_11 = clamp( var_11, 0, 1 );
self clearanim( var_10["F"], 0.2 );
self setanimlimited( var_10["L"], ( 1.0 - var_11 ) * var_2, 0.2 );
self setanimlimited( var_10["R"], ( 1.0 - var_11 ) * var_3, 0.2 );
self setanimlimited( var_10["LB"], var_11 * var_2, 0.2 );
self setanimlimited( var_10["RB"], var_11 * var_3, 0.2 );
}
else
{
var_11 = clamp( var_9 / var_5, 0, 1 );
self setanimlimited( var_10["F"], 1.0 - var_11, 0.2 );
self setanimlimited( var_10["L"], var_11 * var_2, 0.2 );
self setanimlimited( var_10["R"], var_11 * var_3, 0.2 );
if ( var_5 < 1 )
{
self clearanim( var_10["LB"], 0.2 );
self clearanim( var_10["RB"], 0.2 );
}
}
self setflaggedanimknob( "runanim", %run_n_gun, 1, 0.3, 0.8 );
run_playfacialanim( undefined );
self.a.allowedpartialreloadontheruntime = gettime() + 500;
if ( var_0 && isplayer( self.enemy ) )
self updateplayersightaccuracy();
return 1;
}
runngun_backward()
{
initrunngun();
var_0 = animscripts\utility::lookupanim( "run_n_gun", "move_back" );
self setflaggedanimknob( "runanim", var_0, 1, 0.3, 0.8 );
run_playfacialanim( var_0 );
if ( isplayer( self.enemy ) )
self updateplayersightaccuracy();
animscripts\notetracks::donotetracksfortime( 0.2, "runanim" );
self clearanim( var_0, 0.2 );
}
reacttobulletsinterruptcheck()
{
self endon( "killanimscript" );
for (;;)
{
wait 0.2;
if ( !isdefined( self.reactingtobullet ) )
break;
if ( !isdefined( self.pathgoalpos ) || distancesquared( self.pathgoalpos, self.origin ) < squared( 80 ) )
{
endrunningreacttobullets();
self notify( "interrupt_react_to_bullet" );
break;
}
}
}
endrunningreacttobullets()
{
self orientmode( "face default" );
self.reactingtobullet = undefined;
self.requestreacttobullet = undefined;
}
runningreacttobullets()
{
endfaceenemyaimtracking();
self endon( "interrupt_react_to_bullet" );
self.reactingtobullet = 1;
self orientmode( "face motion" );
var_0 = animscripts\utility::lookupanimarray( "running_react_to_bullets" );
var_1 = randomint( var_0.size );
if ( var_1 == anim.lastrunningreactanim )
var_1 = ( var_1 + 1 ) % var_0.size;
anim.lastrunningreactanim = var_1;
var_2 = var_0[var_1];
self setflaggedanimknobrestart( "reactanim", var_2, 1, 0.5, self.moveplaybackrate );
run_playfacialanim( var_2 );
thread reacttobulletsinterruptcheck();
animscripts\shared::donotetracks( "reactanim" );
endrunningreacttobullets();
}
customrunningreacttobullets()
{
endfaceenemyaimtracking();
self.reactingtobullet = 1;
self orientmode( "face motion" );
var_0 = randomint( self.run_overridebulletreact.size );
var_1 = self.run_overridebulletreact[var_0];
self setflaggedanimknobrestart( "reactanim", var_1, 1, 0.5, self.moveplaybackrate );
run_playfacialanim( var_1 );
thread reacttobulletsinterruptcheck();
animscripts\shared::donotetracks( "reactanim" );
endrunningreacttobullets();
}
getsprintanim()
{
var_0 = undefined;
if ( isdefined( self.grenade ) )
var_0 = animscripts\utility::getmoveanim( "sprint_short" );
if ( !isdefined( var_0 ) )
var_0 = animscripts\utility::getmoveanim( "sprint" );
return var_0;
}
shouldsprint()
{
if ( isdefined( self.sprint ) )
return 1;
if ( isdefined( self.grenade ) && isdefined( self.enemy ) && self.frontshieldanglecos == 1 )
return distancesquared( self.origin, self.enemy.origin ) > 90000;
return 0;
}
shouldsprintforvariation()
{
if ( isdefined( self.neversprintforvariation ) )
return 0;
if ( !self.facemotion || self.stairsstate != "none" )
return 0;
var_0 = gettime();
if ( isdefined( self.dangersprinttime ) )
{
if ( var_0 < self.dangersprinttime )
return 1;
if ( var_0 - self.dangersprinttime < 6000 )
return 0;
}
if ( !isdefined( self.enemy ) || !issentient( self.enemy ) )
return 0;
if ( randomint( 100 ) < 25 && self lastknowntime( self.enemy ) + 2000 > var_0 )
{
self.dangersprinttime = var_0 + 2000 + randomint( 1000 );
return 1;
}
return 0;
}
getmoveplaybackrate()
{
var_0 = self.moveplaybackrate;
if ( self.lookaheadhitsstairs && self.stairsstate == "none" && self.lookaheaddist < 300 )
var_0 = var_0 * 0.75;
return var_0;
}
standrun_combatnormal()
{
var_0 = getmoveplaybackrate();
self setanimknob( %combatrun, 1.0, 0.5, var_0 );
var_1 = 0;
var_2 = isdefined( self.requestreacttobullet ) && gettime() - self.requestreacttobullet < 100;
if ( var_2 && randomfloat( 1 ) < self.a.reacttobulletchance )
{
stoprunngun();
setshootwhilemoving( 0 );
runningreacttobullets();
return;
}
if ( shouldsprint() )
{
var_3 = getsprintanim();
self setflaggedanimknob( "runanim", var_3, 1, 0.5, self.moveplaybackrate );
run_playfacialanim( var_3 );
setshootwhilemoving( 0 );
var_1 = 1;
}
else if ( isdefined( self.enemy ) && animscripts\move::mayshootwhilemoving() )
{
setshootwhilemoving( 1 );
if ( !self.facemotion )
thread faceenemyaimtracking();
else if ( self.shootstyle != "none" && !isdefined( self.norunngun ) )
{
endfaceenemyaimtracking();
if ( canshootwhilerunningforward() )
var_1 = runngun( 1 );
else if ( canshootwhilerunningbackward() )
{
runngun_backward();
return;
}
}
else if ( isdefined( self.runngunweight ) && self.runngunweight != 0 )
var_1 = runngun( 0 );
}
else if ( isdefined( self.runngunweight ) && self.runngunweight != 0 )
{
setshootwhilemoving( 0 );
var_1 = runngun( 0 );
}
else
setshootwhilemoving( 0 );
if ( !var_1 )
{
stoprunngun();
if ( var_2 && self.a.reacttobulletchance != 0 )
{
runningreacttobullets();
return;
}
if ( move_checkstairstransition() )
return;
self clearanim( %stair_transitions, 0.1 );
if ( shouldsprintforvariation() )
var_4 = animscripts\utility::getmoveanim( "sprint_short" );
else
var_4 = getrunanim();
self setflaggedanimknoblimited( "runanim", var_4, 1, 0.1, self.moveplaybackrate, 1 );
run_playfacialanim( var_4 );
setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ), self.sidesteprate );
thread setcombatstandmoveanimweights( "run" );
}
animscripts\notetracks::donotetracksfortime( 0.2, "runanim" );
}
getstairstransitionanim( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
var_0 = "none";
if ( var_0 == var_1 )
return undefined;
if ( var_0 == "up" )
return animscripts\utility::getmoveanim( "stairs_up_out" );
else if ( var_0 == "down" )
return animscripts\utility::getmoveanim( "stairs_down_out" );
else if ( var_1 == "up" )
return animscripts\utility::getmoveanim( "stairs_up_in" );
else if ( var_1 == "down" )
return animscripts\utility::getmoveanim( "stairs_down_in" );
}
faceenemyaimtracking()
{
if ( isdefined( self.aim_while_moving_thread ) )
return;
self.aim_while_moving_thread = 1;
self endon( "killanimscript" );
self endon( "end_face_enemy_tracking" );
self setdefaultaimlimits();
var_0 = undefined;
if ( isdefined( self.combatstandanims ) && isdefined( self.combatstandanims["walk_aims"] ) )
{
self setanimlimited( self.combatstandanims["walk_aims"]["walk_aim_2"] );
self setanimlimited( self.combatstandanims["walk_aims"]["walk_aim_4"] );
self setanimlimited( self.combatstandanims["walk_aims"]["walk_aim_6"] );
self setanimlimited( self.combatstandanims["walk_aims"]["walk_aim_8"] );
}
else
{
var_1 = "walk";
if ( animscripts\utility::shouldcqb() && isdefined( animscripts\utility::lookupanim( "cqb", "aim_2" ) ) )
var_1 = "cqb";
var_2 = animscripts\utility::lookupanimarray( var_1 );
self setanimlimited( var_2["aim_2"] );
self setanimlimited( var_2["aim_4"] );
self setanimlimited( var_2["aim_6"] );
self setanimlimited( var_2["aim_8"] );
if ( isdefined( var_2["aim_5"] ) )
{
self setanimlimited( var_2["aim_5"] );
var_0 = %w_aim_5;
}
}
animscripts\track::trackloop( %w_aim_2, %w_aim_4, %w_aim_6, %w_aim_8, var_0 );
}
endfaceenemyaimtracking()
{
self.aim_while_moving_thread = undefined;
self notify( "end_face_enemy_tracking" );
}
setshootwhilemoving( var_0 )
{
var_1 = isdefined( self.bshootwhilemoving );
if ( var_0 )
{
self.bshootwhilemoving = var_0;
if ( !var_1 )
{
thread rundecidewhatandhowtoshoot();
thread runshootwhilemoving();
}
}
else
{
self.bshootwhilemoving = undefined;
if ( var_1 )
{
self notify( "end_shoot_while_moving" );
self notify( "end_face_enemy_tracking" );
self.shoot_while_moving_thread = undefined;
self.aim_while_moving_thread = undefined;
self.runngun = undefined;
}
}
}
rundecidewhatandhowtoshoot()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_moving" );
animscripts\shoot_behavior::decidewhatandhowtoshoot( "normal" );
}
runshootwhilemoving()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_moving" );
animscripts\move::shootwhilemoving();
}
aimedsomewhatatenemy()
{
var_0 = self getmuzzleangle();
var_1 = vectortoangles( self.enemy getshootatpos() - self getmuzzlepos() );
if ( animscripts\utility::absangleclamp180( var_0[1] - var_1[1] ) > 15 )
return 0;
return animscripts\utility::absangleclamp180( var_0[0] - var_1[0] ) <= 20;
}
canshootwhilerunningforward()
{
if ( ( !isdefined( self.runngunweight ) || self.runngunweight == 0 ) && abs( self getmotionangle() ) > self.maxrunngunangle )
return 0;
return 1;
}
canshootwhilerunningbackward()
{
if ( 180 - abs( self getmotionangle() ) >= 45 )
return 0;
var_0 = getpredictedyawtoenemy( 0.2 );
if ( abs( var_0 ) > 30 )
return 0;
return 1;
}
canshootwhilerunning()
{
return animscripts\move::mayshootwhilemoving() && isdefined( self.enemy ) && ( canshootwhilerunningforward() || canshootwhilerunningbackward() );
}
getpredictedyawtoenemy( var_0 )
{
var_1 = self.origin;
var_2 = self.angles[1] + self getmotionangle();
var_1 = var_1 + ( cos( var_2 ), sin( var_2 ), 0 ) * length( self.velocity ) * var_0;
var_3 = self.angles[1] - vectortoyaw( self.enemy.origin - var_1 );
var_3 = angleclamp180( var_3 );
return var_3;
}
move_checkstairstransition()
{
var_0 = 0;
var_1 = undefined;
if ( self.stairsstate == "none" && self.lookaheadhitsstairs )
{
if ( animscripts\utility::shouldcqb() )
var_2 = 32;
else
var_2 = 48;
var_3 = self.origin + ( 0, 0, 6 );
var_4 = vectornormalize( ( self.lookaheaddir[0], self.lookaheaddir[1], 0 ) );
var_5 = var_3 + var_2 * var_4;
var_6 = self aiphysicstrace( var_3, var_5, 15, 48, 1, 1 );
if ( var_6["fraction"] < 1 )
{
if ( !isdefined( var_6["stairs"] ) )
return 0;
var_1 = getstairstransitionanim( "none", "up" );
}
else
{
var_7 = 18;
var_8 = var_5 + ( 0, 0, var_7 );
var_9 = var_5 - ( 0, 0, var_7 );
var_6 = self aiphysicstrace( var_8, var_9, 15, 48, 1, 1 );
if ( var_6["fraction"] >= 1 )
return 0;
if ( !isdefined( var_6["stairs"] ) )
return 0;
var_1 = getstairstransitionanim( "none", "down" );
}
}
else if ( self.stairsstate == "up" )
{
var_2 = 24;
var_7 = 18;
var_5 = self.origin + var_2 * self.lookaheaddir;
var_8 = var_5 + ( 0, 0, var_7 );
var_9 = var_5 - ( 0, 0, var_7 );
var_6 = self aiphysicstrace( var_8, var_9, 15, 48, 1, 1 );
if ( var_6["fraction"] <= 0 || var_6["fraction"] >= 1 )
return 0;
if ( isdefined( var_6["stairs"] ) )
return 0;
var_1 = getstairstransitionanim( "up", "none" );
}
else if ( self.stairsstate == "down" && !self.lookaheadhitsstairs )
{
var_2 = 24;
var_7 = 18;
var_5 = self.origin + var_2 * self.lookaheaddir;
var_8 = var_5 + ( 0, 0, var_7 );
var_9 = var_5 - ( 0, 0, var_7 );
var_6 = self aiphysicstrace( var_8, var_9, 15, 48, 1, 1 );
if ( var_6["fraction"] <= 0 || var_6["fraction"] >= 1 )
return 0;
if ( isdefined( var_6["stairs"] ) )
return 0;
var_1 = getstairstransitionanim( "down", "none" );
}
if ( !isdefined( var_1 ) )
return 0;
self notify( "stop_move_anim_update" );
self.update_move_anim_type = undefined;
self setflaggedanimknoballrestart( "runanim", var_1, %body, 1, 0.1, self.moveplaybackrate );
run_playfacialanim( var_1 );
animscripts\shared::donotetracks( "runanim" );
return 1;
}
standrun_noncombatnormal()
{
self endon( "movemode" );
self clearanim( %combatrun, 0.6 );
var_0 = getmoveplaybackrate();
if ( move_checkstairstransition() )
return;
self clearanim( %stair_transitions, 0.1 );
self setanimknoball( %combatrun, %body, 1, 0.2, var_0 );
if ( shouldsprint() )
var_1 = getsprintanim();
else
var_1 = getrunanim();
if ( self.stairsstate == "none" )
var_2 = 0.3;
else
var_2 = 0.1;
self setflaggedanimknob( "runanim", var_1, 1, var_2, self.moveplaybackrate, 1 );
run_playfacialanim( var_1 );
setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ) );
thread setcombatstandmoveanimweights( "run" );
var_3 = 0;
if ( self.leanamount > 0 && self.leanamount < 0.998 )
var_3 = 1;
else if ( self.leanamount < 0 && self.leanamount > -0.998 )
var_3 = -1;
var_4 = max( 0.2, var_2 );
animscripts\notetracks::donotetracksfortime( var_4, "runanim" );
}
crouchrun_runoverride()
{
self endon( "movemode" );
self setflaggedanimknoball( "runanim", self.crouchrun_combatanim, %body, 1, 0.4, self.moveplaybackrate );
run_playfacialanim( self.crouchrun_combatanim );
animscripts\shared::donotetracks( "runanim" );
}
crouchrun_runnormal()
{
self endon( "movemode" );
var_0 = getcrouchrunanim();
self setanimknob( var_0, 1, 0.4 );
thread updatemoveanimweights( "crouchrun", var_0, animscripts\utility::lookupanim( "run", "crouch_b" ), animscripts\utility::lookupanim( "run", "crouch_l" ), animscripts\utility::lookupanim( "run", "crouch_r" ) );
self setflaggedanimknoball( "runanim", %crouchrun, %body, 1, 0.2, self.moveplaybackrate );
run_playfacialanim( undefined );
animscripts\notetracks::donotetracksfortime( 0.2, "runanim" );
}
standrun_checkreload()
{
var_0 = isdefined( self.a.allowedpartialreloadontheruntime ) && self.a.allowedpartialreloadontheruntime > gettime();
var_0 = var_0 || isdefined( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 65536;
if ( var_0 )
{
if ( !animscripts\combat_utility::needtoreload( 0 ) )
return 0;
}
else if ( !animscripts\combat_utility::needtoreload( 0.5 ) )
return 0;
if ( isdefined( self.grenade ) )
return 0;
if ( !self.facemotion || self.stairsstate != "none" )
return 0;
if ( isdefined( self.dontshootwhilemoving ) || isdefined( self.norunreload ) )
return 0;
if ( canshootwhilerunning() && !animscripts\combat_utility::needtoreload( 0 ) )
return 0;
if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 65536 )
return 0;
var_1 = angleclamp180( self getmotionangle() );
if ( abs( var_1 ) > 25 )
return 0;
if ( !animscripts\utility::usingriflelikeweapon() )
return 0;
if ( !runloopisnearbeginning() )
return 0;
if ( animscripts\utility::shouldcqb() )
animscripts\cqb::cqb_reloadinternal();
else
standrun_reloadinternal();
self notify( "abort_reload" );
self orientmode( "face default" );
return 1;
}
standrun_reloadinternal()
{
self endon( "movemode" );
self orientmode( "face motion" );
var_0 = "reload_" + animscripts\combat_utility::getuniqueflagnameindex();
var_1 = animscripts\utility::lookupanim( "run", "reload" );
if ( isarray( var_1 ) )
var_1 = var_1[randomint( var_1.size )];
self setflaggedanimknoballrestart( var_0, var_1, %body, 1, 0.25 );
run_playfacialanim( var_1 );
self.update_move_front_bias = 1;
setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ) );
thread setcombatstandmoveanimweights( "run" );
animscripts\shared::donotetracks( var_0 );
self.update_move_front_bias = undefined;
}
runloopisnearbeginning()
{
var_0 = self getanimtime( %walk_and_run_loops );
var_1 = getanimlength( animscripts\utility::lookupanim( "run", "straight" ) ) / 3.0;
var_0 = var_0 * 3.0;
if ( var_0 > 3 )
var_0 = var_0 - 2.0;
else if ( var_0 > 2 )
var_0 = var_0 - 1.0;
if ( var_0 < 0.15 / var_1 )
return 1;
if ( var_0 > 1 - 0.3 / var_1 )
return 1;
return 0;
}
setmovenonforwardanims( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_3 ) )
var_3 = 1;
self setanimknoblimited( var_0, 1, 0.1, var_3, 1 );
self setanimknoblimited( var_1, 1, 0.1, var_3, 1 );
self setanimknoblimited( var_2, 1, 0.1, var_3, 1 );
}
setcombatstandmoveanimweights( var_0 )
{
updatemoveanimweights( var_0, %combatrun_forward, %combatrun_backward, %combatrun_left, %combatrun_right );
}
updatemoveanimweights( var_0, var_1, var_2, var_3, var_4 )
{
if ( isdefined( self.update_move_anim_type ) && self.update_move_anim_type == var_0 )
return;
self notify( "stop_move_anim_update" );
self.update_move_anim_type = var_0;
self.wasfacingmotion = undefined;
self endon( "killanimscript" );
self endon( "move_interrupt" );
self endon( "stop_move_anim_update" );
for (;;)
{
updaterunweightsonce( var_1, var_2, var_3, var_4 );
wait 0.05;
waittillframeend;
}
}
updaterunweightsonce( var_0, var_1, var_2, var_3 )
{
if ( self.facemotion && !animscripts\utility::shouldcqb() && !isdefined( self.update_move_front_bias ) )
{
if ( !isdefined( self.wasfacingmotion ) )
{
self.wasfacingmotion = 1;
self setanim( var_0, 1, 0.2, 1, 1 );
self setanim( var_1, 0, 0.2, 1, 1 );
self setanim( var_2, 0, 0.2, 1, 1 );
self setanim( var_3, 0, 0.2, 1, 1 );
}
}
else
{
self.wasfacingmotion = undefined;
var_4 = animscripts\utility::quadrantanimweights( self getmotionangle() );
if ( isdefined( self.update_move_front_bias ) )
{
var_4["back"] = 0.0;
if ( var_4["front"] < 0.2 )
var_4["front"] = 0.2;
}
self setanim( var_0, var_4["front"], 0.2, 1, 1 );
self setanim( var_1, var_4["back"], 0.2, 1, 1 );
self setanim( var_2, var_4["left"], 0.2, 1, 1 );
self setanim( var_3, var_4["right"], 0.2, 1, 1 );
}
}
standrun_checkchangeweapon()
{
var_0 = isdefined( self.wantshotgun ) && self.wantshotgun;
var_1 = animscripts\utility::isshotgun( self.weapon );
if ( var_0 == var_1 )
return 0;
if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 65536 )
return 0;
if ( animscripts\utility::usingsidearm() )
return 0;
if ( self.weapon == self.primaryweapon )
{
if ( !var_0 )
return 0;
if ( animscripts\utility::isshotgun( self.secondaryweapon ) )
return 0;
}
else
{
if ( var_0 )
return 0;
if ( animscripts\utility::isshotgun( self.primaryweapon ) )
return 0;
}
var_2 = angleclamp180( self getmotionangle() );
if ( abs( var_2 ) > 25 )
return 0;
if ( !runloopisnearbeginning() )
return 0;
if ( var_0 )
shotgunswitchstandruninternal( "shotgunPullout", animscripts\utility::lookupanim( "cqb", "shotgun_pullout" ), "gun_2_chest", "none", self.secondaryweapon, "shotgun_pickup" );
else
shotgunswitchstandruninternal( "shotgunPutaway", animscripts\utility::lookupanim( "cqb", "shotgun_putaway" ), "gun_2_back", "back", self.primaryweapon, "shotgun_pickup" );
self notify( "switchEnded" );
return 1;
}
shotgunswitchstandruninternal( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self endon( "movemode" );
self setflaggedanimknoballrestart( var_0, var_1, %body, 1, 0.25 );
run_playfacialanim( var_1 );
self.update_move_front_bias = 1;
setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ) );
thread setcombatstandmoveanimweights( "run" );
thread watchshotgunswitchnotetracks( var_0, var_2, var_3, var_4, var_5 );
animscripts\notetracks::donotetracksfortimeintercept( getanimlength( var_1 ) - 0.25, var_0, ::interceptnotetracksforweaponswitch );
self.update_move_front_bias = undefined;
}
interceptnotetracksforweaponswitch( var_0 )
{
if ( var_0 == "gun_2_chest" || var_0 == "gun_2_back" )
return 1;
}
watchshotgunswitchnotetracks( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "killanimscript" );
self endon( "movemode" );
self endon( "switchEnded" );
self waittillmatch( var_0, var_1 );
animscripts\shared::placeweaponon( self.weapon, var_2 );
thread shotgunswitchfinish( var_3 );
self waittillmatch( var_0, var_4 );
self notify( "complete_weapon_switch" );
}
shotgunswitchfinish( var_0 )
{
self endon( "death" );
common_scripts\utility::waittill_any( "killanimscript", "movemode", "switchEnded", "complete_weapon_switch" );
self.lastweapon = self.weapon;
animscripts\shared::placeweaponon( var_0, "right" );
self.bulletsinclip = weaponclipsize( self.weapon );
}
run_playfacialanim( var_0 )
{
self.facialidx = animscripts\face::playfacialanim( var_0, "run", self.facialidx );
}
run_clearfacialanim()
{
self.facialidx = undefined;
self clearanim( %head, 0.2 );
}

237
animscripts/saw/common.gsc Normal file
View File

@ -0,0 +1,237 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main( var_0 )
{
self endon( "killanimscript" );
animscripts\utility::initialize( "saw" );
if ( !isdefined( var_0 ) )
return;
self.a.special = "saw";
if ( isdefined( var_0.script_delay_min ) )
var_1 = var_0.script_delay_min;
else
var_1 = maps\_mgturret::burst_fire_settings( "delay" );
if ( isdefined( var_0.script_delay_max ) )
var_2 = var_0.script_delay_max - var_1;
else
var_2 = maps\_mgturret::burst_fire_settings( "delay_range" );
if ( isdefined( var_0.script_burst_min ) )
var_3 = var_0.script_burst_min;
else
var_3 = maps\_mgturret::burst_fire_settings( "burst" );
if ( isdefined( var_0.script_burst_max ) )
var_4 = var_0.script_burst_max - var_3;
else
var_4 = maps\_mgturret::burst_fire_settings( "burst_range" );
var_5 = gettime();
var_6 = "start";
animscripts\shared::placeweaponon( self.weapon, "none" );
var_0 show();
if ( isdefined( var_0.aiowner ) )
{
self.a.postscriptfunc = ::postscriptfunc;
self.a.usingturret = var_0;
var_0 notify( "being_used" );
thread stopusingturretwhennodelost();
}
else
self.a.postscriptfunc = ::preplacedpostscriptfunc;
var_0.dofiring = 0;
thread firecontroller( var_0 );
self setturretanim( self.primaryturretanim );
self setanimknobrestart( self.primaryturretanim, 1, 0.2, 1 );
self setanimknoblimitedrestart( self.additiveturretidle );
self setanimknoblimitedrestart( self.additiveturretfire );
var_0 setanimknoblimitedrestart( var_0.additiveturretidle );
var_0 setanimknoblimitedrestart( var_0.additiveturretfire );
var_0 endon( "death" );
for (;;)
{
if ( var_0.dofiring )
{
thread doshoot( var_0 );
waittimeoruntilturretstatechange( randomfloatrange( var_3, var_3 + var_4 ), var_0 );
var_0 notify( "turretstatechange" );
if ( var_0.dofiring )
{
thread doaim( var_0 );
wait( randomfloatrange( var_1, var_1 + var_2 ) );
}
continue;
}
thread doaim( var_0 );
var_0 waittill( "turretstatechange" );
}
}
waittimeoruntilturretstatechange( var_0, var_1 )
{
var_1 endon( "turretstatechange" );
wait( var_0 );
}
firecontroller( var_0 )
{
self endon( "killanimscript" );
var_1 = cos( 15 );
for (;;)
{
while ( isdefined( self.enemy ) )
{
var_2 = self.enemy.origin;
var_3 = var_0 gettagangles( "tag_aim" );
if ( common_scripts\utility::within_fov( var_0.origin, var_3, var_2, var_1 ) || distancesquared( var_0.origin, var_2 ) < 40000 )
{
if ( !var_0.dofiring )
{
var_0.dofiring = 1;
var_0 notify( "turretstatechange" );
}
}
else if ( var_0.dofiring )
{
var_0.dofiring = 0;
var_0 notify( "turretstatechange" );
}
wait 0.05;
}
if ( var_0.dofiring )
{
var_0.dofiring = 0;
var_0 notify( "turretstatechange" );
}
wait 0.05;
}
}
turrettimer( var_0, var_1 )
{
if ( var_0 <= 0 )
return;
self endon( "killanimscript" );
var_1 endon( "turretstatechange" );
wait( var_0 );
var_1 notify( "turretstatechange" );
}
stopusingturretwhennodelost()
{
self endon( "killanimscript" );
for (;;)
{
if ( !isdefined( self.node ) || distancesquared( self.origin, self.node.origin ) > 4096 )
self stopuseturret();
wait 0.25;
}
}
postscriptfunc( var_0 )
{
if ( var_0 == "pain" )
{
if ( isdefined( self.node ) && distancesquared( self.origin, self.node.origin ) < 4096 )
{
self.a.usingturret hide();
animscripts\shared::placeweaponon( self.weapon, "right" );
self.a.postscriptfunc = ::postpainfunc;
return;
}
else
self stopuseturret();
}
if ( var_0 == "saw" )
{
var_1 = self getturret();
return;
}
self.a.usingturret delete();
self.a.usingturret = undefined;
animscripts\shared::placeweaponon( self.weapon, "right" );
}
postpainfunc( var_0 )
{
if ( !isdefined( self.node ) || distancesquared( self.origin, self.node.origin ) > 4096 )
{
self stopuseturret();
self.a.usingturret delete();
self.a.usingturret = undefined;
if ( isdefined( self.weapon ) && self.weapon != "none" )
animscripts\shared::placeweaponon( self.weapon, "right" );
}
else if ( var_0 != "saw" )
self.a.usingturret delete();
}
preplacedpostscriptfunc( var_0 )
{
animscripts\shared::placeweaponon( self.weapon, "right" );
}
#using_animtree("generic_human");
doshoot( var_0 )
{
self setanim( %additive_saw_idle, 0, 0.1 );
self setanim( %additive_saw_fire, 1, 0.1 );
var_0 turretdoshootanims();
turretdoshoot( var_0 );
}
doaim( var_0 )
{
self setanim( %additive_saw_idle, 1, 0.1 );
self setanim( %additive_saw_fire, 0, 0.1 );
var_0 turretdoaimanims();
}
turretdoshoot( var_0 )
{
self endon( "killanimscript" );
var_0 endon( "turretstatechange" );
for (;;)
{
var_0 shootturret();
wait 0.1;
}
}
#using_animtree("mg42");
turretdoshootanims()
{
self setanim( %additive_saw_idle, 0, 0.1 );
self setanim( %additive_saw_fire, 1, 0.1 );
}
turretdoaimanims()
{
self setanim( %additive_saw_idle, 1, 0.1 );
self setanim( %additive_saw_fire, 0, 0.1 );
}

View File

@ -0,0 +1,29 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self.desired_anim_pose = "crouch";
animscripts\utility::updateanimpose();
self.a.movement = "stop";
var_0 = self getturret();
var_0 thread turretinit( self );
self.primaryturretanim = %crouchsawgunner_aim;
self.additiveturretidle = %saw_gunner_lowwall_idle;
self.additiveturretfire = %saw_gunner_lowwall_firing;
thread animscripts\saw\common::main( var_0 );
}
#using_animtree("mg42");
turretinit( var_0 )
{
self useanimtree( #animtree );
self.additiveturretidle = %saw_gunner_lowwall_idle_mg;
self.additiveturretfire = %saw_gunner_lowwall_firing_mg;
self endon( "death" );
var_0 waittill( "killanimscript" );
self stopuseanimtree();
}

29
animscripts/saw/prone.gsc Normal file
View File

@ -0,0 +1,29 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self.desired_anim_pose = "prone";
animscripts\utility::updateanimpose();
self.a.movement = "stop";
var_0 = self getturret();
var_0 thread turretinit( self );
self.primaryturretanim = %pronesawgunner_aim;
self.additiveturretidle = %saw_gunner_prone_idle;
self.additiveturretfire = %saw_gunner_prone_firing;
thread animscripts\saw\common::main( var_0 );
}
#using_animtree("mg42");
turretinit( var_0 )
{
self useanimtree( #animtree );
self.additiveturretidle = %saw_gunner_prone_idle_mg;
self.additiveturretfire = %saw_gunner_prone_firing_mg;
self endon( "death" );
var_0 waittill( "killanimscript" );
self stopuseanimtree();
}

29
animscripts/saw/stand.gsc Normal file
View File

@ -0,0 +1,29 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self.desired_anim_pose = "stand";
animscripts\utility::updateanimpose();
self.a.movement = "stop";
var_0 = self getturret();
var_0 thread turretinit( self );
self.primaryturretanim = %standsawgunner_aim;
self.additiveturretidle = %saw_gunner_idle;
self.additiveturretfire = %saw_gunner_firing_add;
thread animscripts\saw\common::main( var_0 );
}
#using_animtree("mg42");
turretinit( var_0 )
{
self useanimtree( #animtree );
self.additiveturretidle = %saw_gunner_idle_mg;
self.additiveturretfire = %saw_gunner_firing_mg_add;
self endon( "death" );
var_0 waittill( "killanimscript" );
self stopuseanimtree();
}

48
animscripts/scripted.gsc Normal file
View File

@ -0,0 +1,48 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
self endon( "death" );
self notify( "killanimscript" );
self notify( "clearSuppressionAttack" );
self.a.suppressingenemy = 0;
self.codescripted["root"] = %body;
self endon( "end_sequence" );
self startscriptedanim( self.codescripted["notifyName"], self.codescripted["origin"], self.codescripted["angles"], self.codescripted["anim"], self.codescripted["animMode"], self.codescripted["root"], self.codescripted["goalTime"] );
self.codescripted = undefined;
if ( isdefined( self.scripted_dialogue ) || isdefined( self.facial_animation ) )
{
animscripts\face::sayspecificdialogue( self.facial_animation, self.scripted_dialogue, 0.9, "scripted_anim_facedone" );
self.facial_animation = undefined;
self.scripted_dialogue = undefined;
}
if ( isdefined( self.deathstring_passed ) )
self.deathstring = self.deathstring_passed;
self waittill( "killanimscript" );
}
init( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
self.codescripted["notifyName"] = var_0;
self.codescripted["origin"] = var_1;
self.codescripted["angles"] = var_2;
self.codescripted["anim"] = var_3;
if ( isdefined( var_4 ) )
self.codescripted["animMode"] = var_4;
else
self.codescripted["animMode"] = "normal";
if ( isdefined( var_5 ) )
self.codescripted["root"] = var_5;
else
self.codescripted["root"] = %body;
self.codescripted["goalTime"] = var_6;
}

View File

@ -0,0 +1,839 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
setposemovement( var_0, var_1 )
{
if ( var_0 == "" )
{
if ( self.a.pose == "prone" && ( var_1 == "walk" || var_1 == "run" ) )
var_0 = "crouch";
else
var_0 = self.a.pose;
}
if ( !isdefined( var_1 ) || var_1 == "" )
var_1 = self.a.movement;
[[ anim.setposemovementfnarray[var_0][var_1] ]]();
}
initposemovementfunctions()
{
anim.setposemovementfnarray["stand"]["stop"] = ::standstop_begin;
anim.setposemovementfnarray["stand"]["walk"] = ::standwalk_begin;
anim.setposemovementfnarray["stand"]["run"] = ::standrun_begin;
anim.setposemovementfnarray["crouch"]["stop"] = ::crouchstop_begin;
anim.setposemovementfnarray["crouch"]["walk"] = ::crouchwalk_begin;
anim.setposemovementfnarray["crouch"]["run"] = ::crouchrun_begin;
anim.setposemovementfnarray["prone"]["stop"] = ::pronestop_begin;
anim.setposemovementfnarray["prone"]["walk"] = ::pronewalk_begin;
anim.setposemovementfnarray["prone"]["run"] = ::pronerun_begin;
}
standstop_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
return 0;
case "walk":
standwalktostand();
break;
default:
standruntostand();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtostand();
break;
case "walk":
crouchwalktostand();
break;
default:
crouchruntostand();
break;
}
break;
default:
switch ( self.a.movement )
{
case "stop":
pronetostand();
break;
default:
pronetostand();
break;
}
break;
}
return 1;
}
standwalk_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
blendintostandwalk();
break;
case "walk":
return 0;
default:
blendintostandwalk();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtostandwalk();
break;
case "walk":
blendintostandwalk();
break;
default:
blendintostandwalk();
break;
}
break;
default:
pronetostandwalk();
break;
}
return 1;
}
standrun_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "walk":
case "stop":
return blendintostandrun();
default:
return 0;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
return crouchtostandrun();
default:
return blendintostandrun();
}
break;
default:
pronetostandrun();
break;
}
return 1;
}
crouchstop_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
standtocrouch();
break;
case "walk":
standwalktocrouch();
break;
case "run":
standruntocrouch();
break;
default:
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
break;
case "walk":
crouchwalktocrouch();
break;
case "run":
crouchruntocrouch();
break;
default:
}
break;
case "prone":
pronetocrouch();
break;
default:
}
}
crouchwalk_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
blendintocrouchwalk();
break;
case "walk":
blendintocrouchwalk();
break;
default:
blendintocrouchwalk();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtocrouchwalk();
break;
case "walk":
return 0;
default:
blendintocrouchwalk();
break;
}
break;
default:
pronetocrouchwalk();
break;
}
return 1;
}
crouchrun_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
blendintocrouchrun();
break;
default:
blendintocrouchrun();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtocrouchrun();
break;
case "walk":
blendintocrouchrun();
break;
default:
return 0;
}
break;
default:
pronetocrouchrun();
break;
}
return 1;
}
pronestop_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
standtoprone();
break;
case "walk":
standtoprone();
break;
case "run":
crouchruntoprone();
break;
default:
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtoprone();
break;
case "walk":
crouchtoprone();
break;
case "run":
crouchruntoprone();
break;
default:
}
break;
case "prone":
switch ( self.a.movement )
{
case "stop":
break;
case "walk":
case "run":
pronecrawltoprone();
break;
default:
}
break;
default:
}
}
pronewalk_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
standtopronewalk();
break;
default:
crouchruntopronewalk();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtopronewalk();
break;
default:
crouchruntopronewalk();
break;
}
break;
default:
switch ( self.a.movement )
{
case "stop":
pronetopronerun();
break;
default:
self.a.movement = "walk";
return 0;
}
break;
}
return 1;
}
pronerun_begin()
{
switch ( self.a.pose )
{
case "stand":
switch ( self.a.movement )
{
case "stop":
standtopronerun();
break;
default:
crouchruntopronerun();
break;
}
break;
case "crouch":
switch ( self.a.movement )
{
case "stop":
crouchtopronerun();
break;
default:
crouchruntopronerun();
break;
}
break;
default:
switch ( self.a.movement )
{
case "stop":
pronetopronerun();
break;
default:
self.a.movement = "run";
return 0;
}
break;
}
return 1;
}
#using_animtree("generic_human");
playblendtransition( var_0, var_1, var_2, var_3 )
{
var_4 = gettime() + var_1 * 1000;
if ( isarray( var_0 ) )
var_0 = var_0[randomint( var_0.size )];
self setflaggedanimknoball( "blendTransition", var_0, %body, 1, var_1, 1 );
animscripts\notetracks::donotetracksfortime( var_1 / 2, "blendTransition" );
self.a.pose = var_2;
self.a.movement = var_3;
var_5 = ( var_4 - gettime() ) / 1000;
if ( var_5 < 0.05 )
var_5 = 0.05;
animscripts\notetracks::donotetracksfortime( var_5, "blendTransition" );
}
playtransitionstandwalk( var_0, var_1 )
{
playtransitionanimation( var_0, "stand", "walk", var_1 );
}
standwalktostand()
{
self.a.movement = "stop";
}
standwalktocrouch()
{
standwalktostand();
standtocrouch();
}
standruntostand()
{
self.a.movement = "stop";
}
standruntocrouch()
{
self.a.movement = "stop";
self.a.pose = "crouch";
}
playblendtransitionstandrun( var_0 )
{
var_1 = 0.3;
if ( self.a.movement != "stop" )
{
self endon( "movemode" );
var_1 = 1.0;
}
playblendtransition( var_0, var_1, "stand", "run" );
}
blendintostandrun()
{
if ( !self.facemotion )
{
self.a.movement = "run";
self.a.pose = "stand";
return 0;
}
if ( isdefined( self.run_overrideanim ) )
{
playblendtransitionstandrun( self.run_overrideanim );
return 1;
}
var_0 = 0.1;
if ( self.a.movement != "stop" && self.stairsstate == "none" )
var_0 = 0.5;
if ( isdefined( self.sprint ) )
self setanimknoblimited( animscripts\utility::getmoveanim( "sprint" ), 1, var_0, 1 );
else
self setanimknoblimited( animscripts\run::getrunanim(), 1, var_0, 1 );
animscripts\run::setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ), self.sidesteprate );
thread animscripts\run::setcombatstandmoveanimweights( "run" );
wait 0.05;
playblendtransitionstandrun( %combatrun );
return 1;
}
blendintostandwalk()
{
if ( self.a.movement != "stop" )
self endon( "movemode" );
if ( !isdefined( self.alwaysrunforward ) && self.a.pose != "prone" )
animscripts\run::setmovenonforwardanims( animscripts\utility::getmoveanim( "move_b" ), animscripts\utility::getmoveanim( "move_l" ), animscripts\utility::getmoveanim( "move_r" ) );
self.a.pose = "stand";
self.a.movement = "walk";
}
crouchtostand()
{
var_0 = 1;
if ( isdefined( self.faststand ) )
{
var_0 = 1.8;
self.faststand = undefined;
}
if ( animscripts\utility::usingsidearm() )
playtransitionanimation( %pistol_crouchaimstraight2stand, "stand", "stop", undefined, var_0 );
else
{
animscripts\utility::randomizeidleset();
playtransitionanimation( %crouch2stand, "stand", "stop", undefined, var_0 );
}
}
crouchtocrouchwalk()
{
blendintocrouchwalk();
}
crouchtostandwalk()
{
crouchtocrouchwalk();
blendintostandwalk();
}
crouchwalktocrouch()
{
self.a.movement = "stop";
}
crouchwalktostand()
{
crouchwalktocrouch();
crouchtostand();
}
crouchruntocrouch()
{
self.a.movement = "stop";
}
crouchruntostand()
{
crouchruntocrouch();
crouchtostand();
}
crouchtocrouchrun()
{
blendintocrouchrun();
}
crouchtostandrun()
{
return blendintostandrun();
}
blendintocrouchrun()
{
if ( isdefined( self.crouchrun_combatanim ) )
playblendtransition( self.crouchrun_combatanim, 0.6, "crouch", "run" );
else
{
self setanimknob( %crouchrun, 1, 0.4, self.moveplaybackrate );
thread animscripts\run::updatemoveanimweights( "crouchrun", animscripts\utility::getmoveanim( "crouch" ), animscripts\utility::getmoveanim( "crouch_b" ), animscripts\utility::getmoveanim( "crouch_l" ), animscripts\utility::getmoveanim( "crouch_r" ) );
wait 0.05;
playblendtransition( %crouchrun, 0.4, "crouch", "run" );
}
}
pronetocrouchrun()
{
self orientmode( "face current" );
animscripts\utility::exitpronewrapper( 1.0 );
pronelegsstraighttree( 0.2 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
playtransitionanimation( %prone_2_crouch, "crouch", "run", animscripts\run::getcrouchrunanim() );
}
pronetostandrun()
{
pronetocrouchrun();
blendintostandrun();
}
pronetocrouchwalk()
{
pronetocrouchrun();
blendintocrouchwalk();
}
blendintocrouchwalk()
{
if ( isdefined( self.crouchrun_combatanim ) )
{
self setanimknoball( self.crouchrun_combatanim, %body, 1, 0.4 );
playblendtransition( self.crouchrun_combatanim, 0.6, "crouch", "walk" );
self notify( "BlendIntoCrouchWalk" );
}
else
{
self setanimknob( %crouchrun, 1, 0.4, self.moveplaybackrate );
thread animscripts\run::updatemoveanimweights( "crouchrun", animscripts\utility::getmoveanim( "crouch" ), animscripts\utility::getmoveanim( "crouch_b" ), animscripts\utility::getmoveanim( "crouch_l" ), animscripts\utility::getmoveanim( "crouch_r" ) );
wait 0.05;
playblendtransition( %crouchrun, 0.4, "crouch", "run" );
}
}
standtocrouch()
{
animscripts\utility::randomizeidleset();
var_0 = 1;
if ( isdefined( self.fastcrouch ) )
{
var_0 = 1.8;
self.fastcrouch = undefined;
}
playtransitionanimation( %exposed_stand_2_crouch, "crouch", "stop", undefined, var_0 );
}
pronetocrouch()
{
animscripts\utility::randomizeidleset();
self orientmode( "face current" );
animscripts\utility::exitpronewrapper( 1.0 );
pronelegsstraighttree( 0.1 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
playtransitionanimation( %prone_2_crouch, "crouch", "stop" );
}
pronetostand()
{
self orientmode( "face current" );
animscripts\utility::exitpronewrapper( 1.0 );
pronelegsstraighttree( 0.1 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
playtransitionanimation( %prone_2_stand, "stand", "stop" );
}
pronetostandwalk()
{
pronetocrouch();
crouchtocrouchwalk();
blendintostandwalk();
}
pronetopronemove( var_0 )
{
pronelegsstraighttree( 0.1 );
playtransitionanimation( %prone_2_prone_crawl, "prone", var_0, %prone_crawl );
animscripts\cover_prone::updatepronewrapper( 0.1 );
}
pronetopronerun()
{
pronetopronemove( "run" );
}
pronecrawltoprone()
{
pronelegsstraighttree( 0.1 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
playtransitionanimation( %prone_crawl_2_prone, "prone", "stop" );
}
crouchtoprone()
{
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
animscripts\utility::enterpronewrapper( 1.0 );
pronelegsstraighttree( 0.3 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
playtransitionanimation( %crouch_2_prone, "prone", "stop" );
}
crouchtopronewalk()
{
crouchtoprone();
pronetopronerun();
}
crouchtopronerun()
{
crouchtoprone();
pronetopronerun();
}
standtoprone()
{
self endon( "entered_poseprone" );
var_0 = 0.5;
thread playtransitionanimationthread_withoutwaitsetstates( %stand_2_prone, "prone", "stop", undefined, var_0 );
self waittillmatch( "transAnimDone2", "anim_pose = \"crouch\"" );
waittillframeend;
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
animscripts\utility::enterpronewrapper( var_0 );
self.a.movement = "stop";
animscripts\cover_prone::updatepronewrapper( 0.1 );
self waittillmatch( "transAnimDone2", "end" );
pronelegsstraighttree( 0.2 );
self setanim( %prone_aim_idle, 1, 0.1 );
}
standtopronewalk()
{
standtoprone();
pronetopronerun();
}
standtopronerun()
{
standtoprone();
pronetopronerun();
}
crouchruntoprone()
{
var_0 = 0.5;
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
animscripts\utility::enterpronewrapper( var_0 );
pronelegsstraighttree( 0.2 );
animscripts\cover_prone::updatepronewrapper( 0.1 );
var_1 = animscripts\utility::getquadrant( self getmotionangle() );
var_2 = %crouch_2_prone;
var_3 = getmovedelta( var_2, 0, 1 );
var_4 = self localtoworldcoords( var_3 );
if ( self maymovetopoint( var_4 ) )
playtransitionanimation( var_2, "prone", "stop", undefined, var_0 );
else
playtransitionanimation( %crouch_2_prone_firing, "prone", "stop", undefined, var_0 );
}
crouchruntopronewalk()
{
crouchruntoprone();
pronetopronerun();
}
crouchruntopronerun()
{
crouchruntoprone();
pronetopronerun();
}
playtransitionanimationthread_withoutwaitsetstates( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "killanimscript" );
self endon( "entered_pose" + var_1 );
playtransitionanimationfunc( var_0, var_1, var_2, var_3, var_4, 0 );
}
playtransitionanimation( var_0, var_1, var_2, var_3, var_4 )
{
playtransitionanimationfunc( var_0, var_1, var_2, var_3, var_4, 1 );
}
playtransitionanimationfunc( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( !isdefined( var_4 ) )
var_4 = 1;
if ( var_5 )
thread waitsetstates( getanimlength( var_0 ) / 2.0, "killtimerscript", var_1 );
self setflaggedanimknoballrestart( "transAnimDone2", var_0, %body, 1, 0.2, var_4 );
if ( !isdefined( self.a.pose ) )
self.pose = "undefined";
if ( !isdefined( self.a.movement ) )
self.movement = "undefined";
var_6 = "";
animscripts\shared::donotetracks( "transAnimDone2", undefined, var_6 );
self notify( "killtimerscript" );
self.a.pose = var_1;
self notify( "entered_pose" + var_1 );
self.a.movement = var_2;
if ( isdefined( var_3 ) )
self setanimknoball( var_3, %body, 1, 0.3, var_4 );
}
waitsetstates( var_0, var_1, var_2 )
{
self endon( "killanimscript" );
self endon( "death" );
self endon( var_1 );
var_3 = self.a.pose;
wait( var_0 );
if ( var_3 != "prone" && var_2 == "prone" )
{
animscripts\cover_prone::updatepronewrapper( 0.1 );
animscripts\utility::enterpronewrapper( 1.0 );
}
else if ( var_3 == "prone" && var_2 != "prone" )
{
animscripts\utility::exitpronewrapper( 1.0 );
self orientmode( "face default" );
}
}
pronelegsstraighttree( var_0 )
{
self setanimknoball( %prone_legsstraight, %body, 1, var_0, 1 );
}

685
animscripts/shared.gsc Normal file
View File

@ -0,0 +1,685 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
placeweaponon( var_0, var_1, var_2 )
{
self notify( "weapon_position_change" );
var_3 = self.weaponinfo[var_0].position;
if ( var_1 != "none" && self.a.weaponpos[var_1] == var_0 )
return;
detachallweaponmodels();
if ( var_3 != "none" )
detachweapon( var_0 );
if ( var_1 == "none" )
{
updateattachedweaponmodels();
return;
}
if ( self.a.weaponpos[var_1] != "none" )
detachweapon( self.a.weaponpos[var_1] );
if ( !isdefined( var_2 ) )
var_2 = 1;
if ( var_2 && ( var_1 == "left" || var_1 == "right" ) )
{
attachweapon( var_0, var_1 );
self.weapon = var_0;
}
else
attachweapon( var_0, var_1 );
updateattachedweaponmodels();
}
detachweapon( var_0 )
{
self.a.weaponpos[self.weaponinfo[var_0].position] = "none";
self.weaponinfo[var_0].position = "none";
}
attachweapon( var_0, var_1 )
{
self.weaponinfo[var_0].position = var_1;
self.a.weaponpos[var_1] = var_0;
if ( self.a.weaponposdropping[var_1] != "none" )
{
self notify( "end_weapon_drop_" + var_1 );
self.a.weaponposdropping[var_1] = "none";
}
}
getweaponforpos( var_0 )
{
var_1 = self.a.weaponpos[var_0];
if ( var_1 == "none" )
return self.a.weaponposdropping[var_0];
return var_1;
}
detachallweaponmodels()
{
var_0 = [];
var_0[var_0.size] = "right";
var_0[var_0.size] = "left";
var_0[var_0.size] = "chest";
var_0[var_0.size] = "back";
self laseroff();
foreach ( var_2 in var_0 )
{
var_3 = getweaponforpos( var_2 );
if ( var_3 == "none" )
continue;
if ( weapontype( var_3 ) == "riotshield" && isdefined( self.shieldmodelvariant ) )
{
if ( isdefined( self.shieldbroken ) && self.shieldbroken )
{
playfxontag( common_scripts\utility::getfx( "riot_shield_dmg" ), self, "TAG_BRASS" );
self.shieldbroken = undefined;
}
}
}
self updateentitywithweapons();
}
updateattachedweaponmodels()
{
var_0 = [];
var_1 = [];
var_2 = [];
var_0[var_0.size] = "right";
var_0[var_0.size] = "left";
var_0[var_0.size] = "chest";
var_0[var_0.size] = "back";
foreach ( var_4 in var_0 )
{
var_1[var_1.size] = getweaponforpos( var_4 );
var_2[var_2.size] = gettagforpos( var_4 );
}
self updateentitywithweapons( var_1[0], var_2[0], var_1[1], var_2[1], var_1[2], var_2[2], var_1[3], var_2[3] );
foreach ( var_4 in var_0 )
{
var_7 = getweaponforpos( var_4 );
if ( var_7 == "none" )
continue;
if ( self.weaponinfo[var_7].useclip && !self.weaponinfo[var_7].hasclip )
self hidepart( "tag_clip" );
}
updatelaserstatus();
}
updatelaserstatus()
{
if ( isdefined( self.custom_laser_function ) )
[[ self.custom_laser_function ]]();
else
{
if ( self.a.weaponpos["right"] == "none" )
return;
if ( canuselaser() )
{
self laseron();
return;
}
self laseroff();
}
}
canuselaser()
{
if ( !self.a.laseron )
return 0;
if ( animscripts\utility::isshotgun( self.weapon ) )
return 0;
return isalive( self );
}
gettagforpos( var_0 )
{
switch ( var_0 )
{
case "chest":
return "tag_weapon_chest";
case "back":
return "tag_stowed_back";
case "left":
return "tag_weapon_left";
case "right":
return "tag_weapon_right";
case "hand":
return "tag_inhand";
default:
break;
}
}
dropaiweapon( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = self.weapon;
if ( var_0 == "none" )
return;
if ( isdefined( self.nodrop ) )
return;
detachallweaponmodels();
var_1 = self.weaponinfo[var_0].position;
if ( self.dropweapon && var_1 != "none" )
thread dropweaponwrapper( var_0, var_1 );
detachweapon( var_0 );
if ( var_0 == self.weapon )
self.weapon = "none";
updateattachedweaponmodels();
}
dropallaiweapons()
{
if ( isdefined( self.nodrop ) )
return "none";
var_0 = [];
var_0[var_0.size] = "left";
var_0[var_0.size] = "right";
var_0[var_0.size] = "chest";
var_0[var_0.size] = "back";
detachallweaponmodels();
foreach ( var_2 in var_0 )
{
var_3 = self.a.weaponpos[var_2];
if ( var_3 == "none" )
continue;
self.weaponinfo[var_3].position = "none";
self.a.weaponpos[var_2] = "none";
if ( self.dropweapon )
thread dropweaponwrapper( var_3, var_2 );
}
self.weapon = "none";
updateattachedweaponmodels();
}
dropweaponwrapper( var_0, var_1 )
{
if ( self isragdoll() )
return "none";
self.a.weaponposdropping[var_1] = var_0;
var_2 = var_0;
if ( issubstr( tolower( var_2 ), "rpg" ) )
var_2 = "rpg_player";
else if ( issubstr( tolower( var_2 ), "panzerfaust3" ) )
var_2 = "panzerfaust3_player";
self dropweapon( var_2, var_1, 0 );
self endon( "end_weapon_drop_" + var_1 );
wait 0.1;
if ( !isdefined( self ) )
return;
detachallweaponmodels();
self.a.weaponposdropping[var_1] = "none";
updateattachedweaponmodels();
}
donotetracks( var_0, var_1, var_2 )
{
for (;;)
{
self waittill( var_0, var_3 );
if ( !isdefined( var_3 ) )
var_3 = "undefined";
var_4 = animscripts\notetracks::handlenotetrack( var_3, var_0, var_1 );
if ( isdefined( var_4 ) )
return var_4;
}
}
getpredictedaimyawtoshootentorpos( var_0 )
{
if ( !isdefined( self.shootent ) )
{
if ( !isdefined( self.shootpos ) )
return 0;
return getaimyawtopoint( self.shootpos );
}
var_1 = self.shootent.origin + self.shootentvelocity * var_0;
return getaimyawtopoint( var_1 );
}
getaimyawtoshootentorpos()
{
if ( !isdefined( self.shootent ) )
{
if ( !isdefined( self.shootpos ) )
return 0;
return getaimyawtopoint( self.shootpos );
}
return getaimyawtopoint( self.shootent getshootatpos() );
}
getaimpitchtoshootentorpos()
{
var_0 = getpitchtoshootentorpos();
if ( self.script == "cover_crouch" && isdefined( self.a.covermode ) && self.a.covermode == "lean" )
var_0 = var_0 - anim.covercrouchleanpitch;
return var_0;
}
getpitchtoshootentorpos()
{
if ( !isdefined( self.shootent ) )
{
if ( !isdefined( self.shootpos ) )
return 0;
return animscripts\combat_utility::getpitchtospot( self.shootpos );
}
return animscripts\combat_utility::getpitchtospot( self.shootent getshootatpos() );
}
getshootfrompos()
{
if ( isdefined( self.usemuzzlesideoffset ) )
{
var_0 = self getmuzzlesideoffsetpos();
return ( var_0[0], var_0[1], self geteye()[2] );
}
return ( self.origin[0], self.origin[1], self geteye()[2] );
}
getaimyawtopoint( var_0 )
{
var_1 = animscripts\utility::getyawtospot( var_0 );
var_2 = distance( self.origin, var_0 );
if ( var_2 > 3 )
{
var_3 = asin( -3 / var_2 );
var_1 = var_1 + var_3;
}
var_1 = angleclamp180( var_1 );
return var_1;
}
#using_animtree("generic_human");
ramboaim( var_0 )
{
self endon( "killanimscript" );
ramboaiminternal( var_0 );
self clearanim( %generic_aim_left, 0.5 );
self clearanim( %generic_aim_right, 0.5 );
}
ramboaiminternal( var_0 )
{
self endon( "rambo_aim_end" );
waittillframeend;
self clearanim( %generic_aim_left, 0.2 );
self clearanim( %generic_aim_right, 0.2 );
self setanimlimited( %generic_aim_45l, 1, 0.2 );
self setanimlimited( %generic_aim_45r, 1, 0.2 );
var_1 = 0.2;
var_2 = 0;
for (;;)
{
if ( isdefined( self.shootpos ) )
{
var_3 = animscripts\utility::getyaw( self.shootpos ) - self.covernode.angles[1];
var_3 = angleclamp180( var_3 - var_0 );
if ( abs( var_3 - var_2 ) > 10 )
{
if ( var_3 > var_2 )
var_3 = var_2 + 10;
else
var_3 = var_2 - 10;
}
var_2 = var_3;
}
if ( var_2 < 0 )
{
var_4 = var_2 / -45;
if ( var_4 > 1 )
var_4 = 1;
self setanimlimited( %generic_aim_right, var_4, var_1 );
self setanimlimited( %generic_aim_left, 0, var_1 );
}
else
{
var_4 = var_2 / 45;
if ( var_4 > 1 )
var_4 = 1;
self setanimlimited( %generic_aim_left, var_4, var_1 );
self setanimlimited( %generic_aim_right, 0, var_1 );
}
wait( var_1 );
}
}
decidenumshotsforburst()
{
var_0 = 0;
var_1 = weaponburstcount( self.weapon );
if ( var_1 )
var_0 = var_1;
else if ( animscripts\weaponlist::usingsemiautoweapon() )
var_0 = anim.semifirenumshots[randomint( anim.semifirenumshots.size )];
else if ( self.fastburst )
var_0 = anim.fastburstfirenumshots[randomint( anim.fastburstfirenumshots.size )];
else
var_0 = anim.burstfirenumshots[randomint( anim.burstfirenumshots.size )];
if ( var_0 <= self.bulletsinclip )
return var_0;
if ( self.bulletsinclip <= 0 )
return 1;
return self.bulletsinclip;
}
decidenumshotsforfull()
{
var_0 = self.bulletsinclip;
if ( weaponclass( self.weapon ) == "mg" )
{
var_1 = randomfloat( 10 );
if ( var_1 < 3 )
var_0 = randomintrange( 2, 6 );
else if ( var_1 < 8 )
var_0 = randomintrange( 6, 12 );
else
var_0 = randomintrange( 12, 20 );
}
return var_0;
}
handledropclip( var_0 )
{
self endon( "killanimscript" );
self endon( "abort_reload" );
var_1 = undefined;
if ( self.weaponinfo[self.weapon].useclip )
var_1 = getweaponclipmodel( self.weapon );
if ( self.weaponinfo[self.weapon].hasclip )
{
if ( animscripts\utility::usingsidearm() )
self playsound( "weap_reload_pistol_clipout_npc" );
else
self playsound( "weap_reload_smg_clipout_npc" );
if ( isdefined( var_1 ) )
{
self hidepart( "tag_clip" );
thread dropclipmodel( var_1, "tag_clip" );
self.weaponinfo[self.weapon].hasclip = 0;
thread resetcliponabort( var_1 );
}
}
for (;;)
{
self waittill( var_0, var_2 );
switch ( var_2 )
{
case "attach clip right":
case "attach clip left":
if ( isdefined( var_1 ) )
{
self attach( var_1, "tag_inhand" );
thread resetcliponabort( var_1, "tag_inhand" );
if ( !self.weaponinfo[self.weapon].hasclip )
self hidepart( "tag_clip" );
}
animscripts\weaponlist::refillclip();
break;
case "detach clip nohand":
if ( isdefined( var_1 ) )
self detach( var_1, "tag_inhand" );
break;
case "detach clip right":
case "detach clip left":
if ( isdefined( var_1 ) )
{
self detach( var_1, "tag_inhand" );
self showpart( "tag_clip" );
self notify( "clip_detached" );
self.weaponinfo[self.weapon].hasclip = 1;
}
if ( animscripts\utility::usingsidearm() )
self playsound( "weap_reload_pistol_clipin_npc" );
else
self playsound( "weap_reload_smg_clipin_npc" );
self.a.needstorechamber = 0;
return;
}
}
}
resetcliponabort( var_0, var_1 )
{
self notify( "clip_detached" );
self endon( "clip_detached" );
common_scripts\utility::waittill_any( "killanimscript", "abort_reload" );
if ( !isdefined( self ) )
return;
if ( isdefined( var_1 ) )
self detach( var_0, var_1 );
if ( isalive( self ) )
{
if ( self.weapon != "none" && self.weaponinfo[self.weapon].position != "none" )
self showpart( "tag_clip" );
self.weaponinfo[self.weapon].hasclip = 1;
}
else if ( isdefined( var_1 ) )
dropclipmodel( var_0, var_1 );
}
dropclipmodel( var_0, var_1 )
{
var_2 = spawn( "script_model", self gettagorigin( var_1 ) );
var_2 setmodel( var_0 );
var_2.angles = self gettagangles( var_1 );
var_2 physicslaunchclient( var_2.origin, ( 0, 0, 0 ) );
wait 10;
if ( isdefined( var_2 ) )
var_2 delete();
}
movetonodeovertime( var_0, var_1 )
{
self endon( "killanimscript" );
var_2 = var_0.origin;
var_3 = distancesquared( self.origin, var_2 );
if ( var_3 < 1 )
{
self safeteleport( var_2 );
return;
}
if ( var_3 > 256 && !self maymovetopoint( var_2, !self.swimmer ) )
return;
self.keepclaimednodeifvalid = 1;
var_4 = distance( self.origin, var_2 );
var_5 = int( var_1 * 20 );
for ( var_6 = 0; var_6 < var_5; var_6++ )
{
var_2 = var_0.origin;
var_7 = self.origin - var_2;
var_7 = vectornormalize( var_7 );
var_8 = var_2 + var_7 * var_4;
var_9 = var_8 + ( var_2 - var_8 ) * ( ( var_6 + 1 ) / var_5 );
self safeteleport( var_9 );
wait 0.05;
}
self.keepclaimednodeifvalid = 0;
}
returntrue()
{
return 1;
}
playlookanimation( var_0, var_1, var_2 )
{
if ( !isdefined( var_2 ) )
var_2 = ::returntrue;
for ( var_3 = 0; var_3 < var_1 * 10; var_3++ )
{
if ( isalive( self.enemy ) )
{
if ( animscripts\utility::canseeenemy() && [[ var_2 ]]() )
return;
}
if ( animscripts\utility::issuppressedwrapper() && [[ var_2 ]]() )
return;
self setanimknoball( var_0, %body, 1, 0.1 );
wait 0.1;
}
}
throwdownweapon( var_0 )
{
self endon( "killanimscript" );
placeweaponon( self.secondaryweapon, "right" );
maps\_gameskill::didsomethingotherthanshooting();
}
rpgplayerrepulsor()
{
var_0 = rpgplayerrepulsor_getnummisses();
if ( var_0 == 0 )
return;
self endon( "death" );
for (;;)
{
level waittill( "an_enemy_shot", var_1 );
if ( var_1 != self )
continue;
if ( !isdefined( var_1.enemy ) )
continue;
if ( var_1.enemy != level.player )
continue;
if ( isdefined( level.createrpgrepulsors ) && level.createrpgrepulsors == 0 )
continue;
thread rpgplayerrepulsor_create();
var_0--;
if ( var_0 <= 0 )
return;
}
}
rpgplayerrepulsor_getnummisses()
{
var_0 = maps\_utility::getdifficulty();
switch ( var_0 )
{
case "gimp":
case "easy":
return 2;
case "difficult":
case "hard":
case "medium":
return 1;
case "fu":
return 0;
}
return 2;
}
rpgplayerrepulsor_create()
{
var_0 = missile_createrepulsorent( level.player, 5000, 800 );
wait 4.0;
missile_deleteattractor( var_0 );
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,117 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("animals");
main()
{
self clearanim( %root, 0.2 );
var_0 = spawn( "script_model", self.origin );
var_0.angles = self.angles;
var_0 setmodel( self.model );
var_0 useanimtree( #animtree );
var_0 hide();
self linkto( var_0 );
var_0 find_available_collision_model();
if ( randomintrange( 0, 100 ) < 50 )
{
var_1 = %shark_death_1;
var_2 = %shark_death_loop_1;
var_3 = %shark_death_settle_1;
}
else
{
var_1 = %shark_death_2;
var_2 = %shark_death_loop_2;
var_3 = %shark_death_settle_2;
}
self setanimknobrestart( var_1, 1, 0, 1 );
var_4 = getanimlength( var_1 );
playfxontag( level._effect["swim_ai_death_blood"], var_0, "j_spineupper" );
var_5 = [ "j_tail1", "j_spineupper", "j_tail2", "j_fin_le", "j_fin_ri", "j_head", "j_jaw" ];
foreach ( var_7 in var_5 )
playfxontag( level._effect["water_bubbles_wide_sm_lp"], var_0, var_7 );
var_9 = 1;
var_0 moveto( var_0.origin - ( 0, 0, 1000 ), 100, 0, 100 );
while ( var_9 )
{
var_10 = bullettracepassed( var_0.origin, var_0.origin - ( 0, 0, 10 ), 1, self );
var_11 = bullettracepassed( var_0.origin, var_0.origin - ( 0, 0, 10 ), 1, level.player );
if ( !var_10 && !var_11 )
var_9 = 0;
wait 0.05;
}
self setanimknobrestart( var_3, 1, 0, 1 );
var_0 moveto( var_0.origin - ( 0, 0, 10 ), 5, 0, 5 );
foreach ( var_7 in var_5 )
{
stopfxontag( level._effect["water_bubbles_wide_sm_lp"], var_0, var_7 );
wait 0.05;
}
wait 50;
var_0 return_collision_model();
var_0 delete();
self delete();
}
find_available_collision_model()
{
if ( !isdefined( level.shark_collsions ) )
return;
for ( var_0 = 0; var_0 < level.shark_collsions.size; var_0++ )
{
if ( level.shark_collsions[var_0].is_available )
{
level.shark_collsions[var_0].is_available = 0;
level.shark_collsions[var_0] solid();
level.shark_collsions[var_0].origin = self.origin;
level.shark_collsions[var_0].angles = self.angles;
level.shark_collsions[var_0] linkto( self );
self.shark_collision_model = level.shark_collsions[var_0];
foreach ( var_2 in level.players )
var_2 thread track_collision_with_player( level.shark_collsions[var_0] );
break;
}
}
}
track_collision_with_player( var_0 )
{
var_0 endon( "released" );
for (;;)
{
if ( self istouching( var_0 ) )
{
var_0 notsolid();
return;
}
wait 0.1;
}
}
return_collision_model()
{
if ( !isdefined( level.shark_collsions ) || !isdefined( self.shark_collision_model ) )
return;
self.shark_collision_model notify( "released" );
self.shark_collision_model unlink();
self.shark_collision_model notsolid();
self.shark_collision_model.origin = self.shark_collision_model.original_origin;
self.shark_collision_model.is_available = 1;
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,39 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("animals");
main()
{
self useanimtree( #animtree );
initsharkanimations();
animscripts\init::firstinit();
self.ignoresuppression = 1;
self.newenemyreactiondistsq = 0;
self.ignoreall = 1;
self.ignoreme = 1;
self.chatinitialized = 0;
self.nododgemove = 1;
self.root_anim = %root;
self.meleeattackdist = 0;
self.a = spawnstruct();
self.a.pose = "stand";
self.a.nextstandinghitdying = 0;
self.a.movement = "run";
animscripts\init::set_anim_playback_rate();
self.suppressionthreshold = 1;
self.disablearrivals = 0;
self.stopanimdistsq = anim.dogstoppingdistsq;
self.usechokepoints = 0;
self.turnrate = 0.6;
self.pathenemyfightdist = 512;
self settalktospecies( "dog" );
self.health = 200;
self.swimmer = 1;
self.pathrandompercent = 0;
}
initsharkanimations()
{
}

View File

@ -0,0 +1,55 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("animals");
main()
{
self endon( "killanimscript" );
self clearanim( %root, 0.2 );
self clearanim( %shark_swim_f, 0.2 );
for (;;)
moveloop();
}
moveloop()
{
self endon( "killanimscript" );
self endon( "stop_soon" );
self.moveloopcleanupfunc = undefined;
for (;;)
{
if ( self.disablearrivals )
self.stopanimdistsq = 0;
else
self.stopanimdistsq = anim.dogstoppingdistsq;
moveloopstep();
}
}
moveloopstep()
{
self endon( "move_loop_restart" );
shark_updateleananim();
self setflaggedanim( "shark_swim", %shark_swim_f_2, 1, 0.2, self.moveplaybackrate );
animscripts\notetracks::donotetracksfortime( 0.2, "shark_swim" );
}
shark_updateleananim()
{
var_0 = clamp( self.leanamount / 8.0, -1, 1 );
if ( var_0 > 0 )
{
self setanim( %shark_add_turn_l, var_0, 0.2, 1, 1 );
self setanim( %shark_add_turn_r, 0.0, 0.2, 1, 1 );
}
else
{
self setanim( %shark_add_turn_l, 0.0, 0.2, 1, 1 );
self setanim( %shark_add_turn_r, 0 - var_0, 0.2, 1, 1 );
}
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,39 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("animals");
main()
{
self endon( "death" );
self notify( "killanimscript" );
self.codescripted["root"] = %root;
self endon( "end_sequence" );
self startscriptedanim( self.codescripted["notifyName"], self.codescripted["origin"], self.codescripted["angles"], self.codescripted["anim"], self.codescripted["animMode"], self.codescripted["root"], self.codescripted["goalTime"] );
self.codescripted = undefined;
if ( isdefined( self.deathstring_passed ) )
self.deathstring = self.deathstring_passed;
self waittill( "killanimscript" );
}
init( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
self.codescripted["notifyName"] = var_0;
self.codescripted["origin"] = var_1;
self.codescripted["angles"] = var_2;
self.codescripted["anim"] = var_3;
if ( isdefined( var_4 ) )
self.codescripted["animMode"] = var_4;
else
self.codescripted["animMode"] = "normal";
if ( isdefined( var_5 ) )
self.codescripted["root"] = var_5;
else
self.codescripted["root"] = %root;
self.codescripted["goalTime"] = var_6;
}

View File

@ -0,0 +1,17 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("animals");
main()
{
self endon( "killanimscript" );
self clearanim( %root, 0.1 );
self clearanim( %shark_swim_f_2, 0.2 );
for (;;)
{
self setflaggedanimrestart( "shark_idle", %shark_swim_f, 1, 0.2, self.animplaybackrate );
animscripts\shared::donotetracks( "shark_idle" );
}
}

View File

@ -0,0 +1,601 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
decidewhatandhowtoshoot( var_0 )
{
self endon( "killanimscript" );
self notify( "stop_deciding_how_to_shoot" );
self endon( "stop_deciding_how_to_shoot" );
self endon( "death" );
maps\_gameskill::resetmisstime();
self.shootobjective = var_0;
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
self.fastburst = 0;
self.shouldreturntocover = undefined;
if ( !isdefined( self.changingcoverpos ) )
self.changingcoverpos = 0;
var_1 = isdefined( self.covernode ) && self.covernode.type != "Cover Prone" && self.covernode.type != "Conceal Prone";
if ( var_1 )
wait 0.05;
var_2 = self.shootent;
var_3 = self.shootpos;
var_4 = self.shootstyle;
if ( !isdefined( self.has_no_ir ) )
{
self.a.laseron = 1;
animscripts\shared::updatelaserstatus();
}
if ( animscripts\combat_utility::issniper() )
resetsniperaim();
if ( var_1 && ( !self.a.atconcealmentnode || !animscripts\utility::canseeenemy() ) )
thread watchforincomingfire();
thread runonshootbehaviorend();
self.ambushendtime = undefined;
for (;;)
{
if ( isdefined( self.shootposoverride ) )
{
if ( !isdefined( self.enemy ) )
{
self.shootpos = self.shootposoverride;
self.shootposoverride = undefined;
waitabit();
}
else
self.shootposoverride = undefined;
}
var_5 = undefined;
if ( self.weapon == "none" )
nogunshoot();
else if ( animscripts\utility::usingrocketlauncher() )
var_5 = rpgshoot();
else if ( animscripts\utility::usingsidearm() )
var_5 = pistolshoot();
else
var_5 = rifleshoot();
if ( isdefined( self.a.specialshootbehavior ) )
[[ self.a.specialshootbehavior ]]();
if ( checkchanged( var_2, self.shootent ) || !isdefined( self.shootent ) && checkchanged( var_3, self.shootpos ) || checkchanged( var_4, self.shootstyle ) )
self notify( "shoot_behavior_change" );
var_2 = self.shootent;
var_3 = self.shootpos;
var_4 = self.shootstyle;
if ( !isdefined( var_5 ) )
waitabit();
}
}
waitabit()
{
self endon( "enemy" );
self endon( "done_changing_cover_pos" );
self endon( "weapon_position_change" );
self endon( "enemy_visible" );
if ( isdefined( self.shootent ) )
{
self.shootent endon( "death" );
self endon( "do_slow_things" );
wait 0.05;
while ( isdefined( self.shootent ) )
{
self.shootpos = self.shootent getshootatpos();
wait 0.05;
}
}
else
self waittill( "do_slow_things" );
}
nogunshoot()
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
self.shootobjective = "normal";
}
shouldsuppress()
{
return !animscripts\combat_utility::issniper() && !animscripts\utility::isshotgun( self.weapon );
}
shouldshootenemyent()
{
if ( !animscripts\utility::canseeenemy() )
return 0;
if ( !isdefined( self.covernode ) && !self canshootenemy() )
return 0;
return 1;
}
rifleshootobjectivenormal()
{
if ( !shouldshootenemyent() )
{
if ( animscripts\combat_utility::issniper() )
resetsniperaim();
if ( self.doingambush )
{
self.shootobjective = "ambush";
return "retry";
}
if ( !isdefined( self.enemy ) )
havenothingtoshoot();
else
{
markenemyposinvisible();
if ( ( self.providecoveringfire || randomint( 5 ) > 0 ) && shouldsuppress() )
self.shootobjective = "suppress";
else
self.shootobjective = "ambush";
return "retry";
}
}
else
{
setshootenttoenemy();
setshootstyleforvisibleenemy();
}
}
rifleshootobjectivesuppress( var_0 )
{
if ( !var_0 )
havenothingtoshoot();
else
{
self.shootent = undefined;
self.shootpos = animscripts\utility::getenemysightpos();
setshootstyleforsuppression();
}
}
rifleshootobjectiveambush( var_0 )
{
self.shootstyle = "none";
self.shootent = undefined;
if ( !var_0 )
{
getambushshootpos();
if ( shouldstopambushing() )
{
self.ambushendtime = undefined;
self notify( "return_to_cover" );
self.shouldreturntocover = 1;
}
}
else
{
self.shootpos = animscripts\utility::getenemysightpos();
if ( shouldstopambushing() )
{
self.ambushendtime = undefined;
if ( shouldsuppress() )
self.shootobjective = "suppress";
if ( randomint( 3 ) == 0 )
{
self notify( "return_to_cover" );
self.shouldreturntocover = 1;
}
return "retry";
}
}
}
getambushshootpos()
{
if ( isdefined( self.enemy ) && self cansee( self.enemy ) )
{
setshootenttoenemy();
return;
}
var_0 = self getanglestolikelyenemypath();
if ( !isdefined( var_0 ) )
{
if ( isdefined( self.covernode ) )
var_0 = self.covernode.angles;
else if ( isdefined( self.ambushnode ) )
var_0 = self.ambushnode.angles;
else if ( isdefined( self.enemy ) )
var_0 = vectortoangles( self lastknownpos( self.enemy ) - self.origin );
else
var_0 = self.angles;
}
var_1 = 1024;
if ( isdefined( self.enemy ) )
var_1 = distance( self.origin, self.enemy.origin );
var_2 = self geteye() + anglestoforward( var_0 ) * var_1;
if ( !isdefined( self.shootpos ) || distancesquared( var_2, self.shootpos ) > 25 )
self.shootpos = var_2;
}
rifleshoot()
{
if ( self.shootobjective == "normal" )
rifleshootobjectivenormal();
else
{
if ( shouldshootenemyent() )
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
markenemyposinvisible();
if ( animscripts\combat_utility::issniper() )
resetsniperaim();
var_0 = animscripts\utility::cansuppressenemy();
if ( self.shootobjective == "suppress" || self.team == "allies" && !isdefined( self.enemy ) && !var_0 )
rifleshootobjectivesuppress( var_0 );
else
rifleshootobjectiveambush( var_0 );
}
}
shouldstopambushing()
{
if ( !isdefined( self.ambushendtime ) )
{
if ( self isbadguy() )
self.ambushendtime = gettime() + randomintrange( 10000, 60000 );
else
self.ambushendtime = gettime() + randomintrange( 4000, 10000 );
}
return self.ambushendtime < gettime();
}
rpgshoot()
{
if ( !shouldshootenemyent() )
{
markenemyposinvisible();
havenothingtoshoot();
return;
}
setshootenttoenemy();
setshootstyle( "single", 0 );
var_0 = lengthsquared( self.origin - self.shootpos );
if ( var_0 < squared( 512 ) )
{
self notify( "return_to_cover" );
self.shouldreturntocover = 1;
return;
}
}
pistolshoot()
{
if ( self.shootobjective == "normal" )
{
if ( !shouldshootenemyent() )
{
if ( !isdefined( self.enemy ) )
{
havenothingtoshoot();
return;
}
else
{
markenemyposinvisible();
self.shootobjective = "ambush";
return "retry";
}
}
else
{
setshootenttoenemy();
setshootstyle( "single", 0 );
}
}
else
{
if ( shouldshootenemyent() )
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
markenemyposinvisible();
self.shootent = undefined;
self.shootstyle = "none";
self.shootpos = animscripts\utility::getenemysightpos();
if ( !isdefined( self.ambushendtime ) )
self.ambushendtime = gettime() + randomintrange( 4000, 8000 );
if ( self.ambushendtime < gettime() )
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
}
}
markenemyposinvisible()
{
if ( isdefined( self.enemy ) && !self.changingcoverpos && self.script != "combat" )
{
if ( isai( self.enemy ) && isdefined( self.enemy.script ) && ( self.enemy.script == "cover_stand" || self.enemy.script == "cover_crouch" ) )
{
if ( isdefined( self.enemy.a.covermode ) && self.enemy.a.covermode == "hide" )
return;
}
self.couldntseeenemypos = self.enemy.origin;
}
}
watchforincomingfire()
{
self endon( "killanimscript" );
self endon( "stop_deciding_how_to_shoot" );
for (;;)
{
self waittill( "suppression" );
if ( self.suppressionmeter > self.suppressionthreshold )
{
if ( readytoreturntocover() )
{
self notify( "return_to_cover" );
self.shouldreturntocover = 1;
}
}
}
}
readytoreturntocover()
{
if ( self.changingcoverpos )
return 0;
if ( !isdefined( self.enemy ) || !self cansee( self.enemy ) )
return 1;
if ( gettime() < self.coverposestablishedtime + 800 )
return 0;
if ( isplayer( self.enemy ) && self.enemy.health < self.enemy.maxhealth * 0.5 )
{
if ( gettime() < self.coverposestablishedtime + 3000 )
return 0;
}
return 1;
}
runonshootbehaviorend()
{
self endon( "death" );
common_scripts\utility::waittill_any( "killanimscript", "stop_deciding_how_to_shoot" );
self.a.laseron = 0;
animscripts\shared::updatelaserstatus();
}
checkchanged( var_0, var_1 )
{
if ( isdefined( var_0 ) != isdefined( var_1 ) )
return 1;
if ( !isdefined( var_1 ) )
return 0;
return var_0 != var_1;
}
setshootenttoenemy()
{
self.shootent = self.enemy;
self.shootpos = self.shootent getshootatpos();
}
havenothingtoshoot()
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
if ( self.doingambush )
self.shootobjective = "ambush";
if ( !self.changingcoverpos )
{
self notify( "return_to_cover" );
self.shouldreturntocover = 1;
}
}
shouldbeajerk()
{
return level.gameskill == 3 && isplayer( self.enemy );
}
setshootstyleforvisibleenemy()
{
if ( isdefined( self.shootent.enemy ) && isdefined( self.shootent.enemy.syncedmeleetarget ) )
return setshootstyle( "single", 0 );
if ( animscripts\combat_utility::issniper() )
return setshootstyle( "single", 0 );
if ( animscripts\utility::isshotgun( self.weapon ) )
{
if ( animscripts\utility::weapon_pump_action_shotgun() )
return setshootstyle( "single", 0 );
else
return setshootstyle( "semi", 0 );
}
if ( weaponclass( self.weapon ) == "grenade" )
return setshootstyle( "single", 0 );
if ( weaponburstcount( self.weapon ) > 0 )
return setshootstyle( "burst", 0 );
if ( isdefined( self.juggernaut ) && self.juggernaut )
return setshootstyle( "full", 1 );
var_0 = distancesquared( self getshootatpos(), self.shootpos );
var_1 = weaponclass( self.weapon ) == "mg";
if ( self.providecoveringfire && var_1 )
return setshootstyle( "full", 0 );
if ( var_0 < 62500 )
{
if ( isdefined( self.shootent ) && isdefined( self.shootent.magic_bullet_shield ) )
return setshootstyle( "single", 0 );
else
return setshootstyle( "full", 0 );
}
else if ( var_0 < 810000 || shouldbeajerk() )
{
if ( weaponissemiauto( self.weapon ) || shoulddosemiforvariety() )
return setshootstyle( "semi", 1 );
else
return setshootstyle( "burst", 1 );
}
else if ( self.providecoveringfire || var_1 || var_0 < 2560000 )
{
if ( shoulddosemiforvariety() )
return setshootstyle( "semi", 0 );
else
return setshootstyle( "burst", 0 );
}
return setshootstyle( "single", 0 );
}
setshootstyleforsuppression()
{
var_0 = distancesquared( self getshootatpos(), self.shootpos );
if ( weaponissemiauto( self.weapon ) )
{
if ( var_0 < 2560000 )
return setshootstyle( "semi", 0 );
return setshootstyle( "single", 0 );
}
if ( weaponclass( self.weapon ) == "mg" )
return setshootstyle( "full", 0 );
if ( self.providecoveringfire || var_0 < 2560000 )
{
if ( shoulddosemiforvariety() )
return setshootstyle( "semi", 0 );
else
return setshootstyle( "burst", 0 );
}
return setshootstyle( "single", 0 );
}
setshootstyle( var_0, var_1 )
{
self.shootstyle = var_0;
self.fastburst = var_1;
}
shoulddosemiforvariety()
{
if ( weaponclass( self.weapon ) != "rifle" )
return 0;
if ( self.team != "allies" )
return 0;
var_0 = animscripts\utility::safemod( int( self.origin[1] ), 10000 ) + 2000;
var_1 = int( self.origin[0] ) + gettime();
return var_1 % ( 2 * var_0 ) > var_0;
}
resetsniperaim()
{
self.snipershotcount = 0;
self.sniperhitcount = 0;
thread sniper_glint_behavior();
}
sniper_glint_behavior()
{
self endon( "killanimscript" );
self endon( "enemy" );
self endon( "return_to_cover" );
self notify( "new_glint_thread" );
self endon( "new_glint_thread" );
if ( isdefined( self.disable_sniper_glint ) && self.disable_sniper_glint )
return;
if ( !isdefined( level._effect["sniper_glint"] ) )
return;
if ( !isalive( self.enemy ) )
return;
var_0 = common_scripts\utility::getfx( "sniper_glint" );
wait 0.2;
for (;;)
{
if ( self.weapon == self.primaryweapon && animscripts\combat_utility::player_sees_my_scope() )
{
if ( distancesquared( self.origin, self.enemy.origin ) > 65536 )
playfxontag( var_0, self, "tag_flash" );
var_1 = randomfloatrange( 3, 5 );
wait( var_1 );
}
wait 0.2;
}
}

837
animscripts/snowmobile.gsc Normal file
View File

@ -0,0 +1,837 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self.current_event = "none";
self.shoot_while_driving_thread = undefined;
snowmobile_geton();
if ( isdefined( self.drivingvehicle ) )
main_driver();
else
main_passenger();
}
snowmobile_geton()
{
self.grenadeawareness = 0;
self.a.pose = "crouch";
maps\_utility::disable_surprise();
self.allowpain = 0;
self.flashbangimmunity = 1;
self.getoffvehiclefunc = ::snowmobile_getoff;
self.specialdeathfunc = ::snowmobile_normal_death;
self.disablebulletwhizbyreaction = 1;
}
snowmobile_getoff()
{
self.allowpain = 1;
self.flashbangimmunity = 0;
maps\_utility::gun_recall();
self.onsnowmobile = undefined;
self.getoffvehiclefunc = undefined;
self.specialdeathfunc = undefined;
self.a.specialshootbehavior = undefined;
self.disablebulletwhizbyreaction = undefined;
}
main_driver()
{
var_0 = self.ridingvehicle.driver_shooting || self.ridingvehicle.riders.size == 1;
snowmobile_setanim_driver( var_0 );
if ( var_0 )
{
animscripts\shared::placeweaponon( self.primaryweapon, "left" );
self.rightaimlimit = 90;
self.leftaimlimit = -90;
animscripts\track::setanimaimweight( 1, 0.2 );
thread snowmobile_trackshootentorpos_driver();
thread snowmobile_loop_driver_shooting();
}
else
{
animscripts\shared::placeweaponon( self.primaryweapon, "none" );
thread snowmobile_loop_driver();
}
snowmobile_handle_events( "driver" );
}
main_passenger()
{
snowmobile_setanim_passenger( self.ridingvehicle.passenger_shooting );
if ( self.ridingvehicle.passenger_shooting )
{
self.rightaimlimit = 180;
self.leftaimlimit = -180;
self.diraimlimit = 1;
animscripts\track::setanimaimweight( 1, 0.2 );
thread snowmobile_trackshootentorpos_passenger();
thread snowmobile_loop_passenger_shooting();
}
else
thread snowmobile_loop_passenger();
snowmobile_handle_events( "passenger" );
}
#using_animtree("generic_human");
snowmobile_loop_driver()
{
self endon( "death" );
self endon( "killanimscript" );
var_0 = "left2right";
var_1 = [];
var_1["left2right"] = getanimlength( animscripts\utility::animarray( "left2right" ) );
var_1["right2left"] = getanimlength( animscripts\utility::animarray( "right2left" ) );
self setanimknoball( %sm_turn, %body, 1, 0 );
self setanim( animscripts\utility::animarray( "drive" ), 1, 0 );
self setanimknob( animscripts\utility::animarray( var_0 ), 1, 0 );
self setanimtime( animscripts\utility::animarray( var_0 ), 0.5 );
for (;;)
{
if ( self.ridingvehicle.steering_enable )
{
var_2 = 0.5 * ( 1 + maps\_vehicle_code::update_steering( self.ridingvehicle ) );
var_3 = self getanimtime( animscripts\utility::animarray( var_0 ) );
if ( var_0 == "right2left" )
var_3 = 1 - var_3;
var_4 = 20 * abs( var_3 - var_2 );
if ( var_3 < var_2 )
{
var_0 = "left2right";
var_4 = var_4 * var_1["left2right"];
}
else
{
var_0 = "right2left";
var_4 = var_4 * var_1["right2left"];
var_3 = 1 - var_3;
}
}
else
{
var_0 = "left2right";
var_4 = 0;
var_3 = 0.5;
}
self setanimknoblimited( animscripts\utility::animarray( var_0 ), 1, 0.1, var_4 );
self setanimtime( animscripts\utility::animarray( var_0 ), var_3 );
wait 0.05;
}
}
snowmobile_loop_passenger()
{
self endon( "death" );
self endon( "killanimscript" );
self setanimknoball( animscripts\utility::animarray( "hide" ), %body, 1, 0 );
self setanimknob( animscripts\utility::animarray( "drive" ), 1, 0 );
for (;;)
{
var_0 = maps\_vehicle_code::update_steering( self.ridingvehicle );
self setanimlimited( %sm_lean, abs( var_0 ), 0.05 );
if ( var_0 >= 0 )
self setanimknoblimited( animscripts\utility::animarray( "lean_right" ), 1, 0.05 );
else
self setanimknoblimited( animscripts\utility::animarray( "lean_left" ), 1, 0.05 );
wait 0.05;
}
}
snowmobile_loop_driver_shooting()
{
self endon( "death" );
self endon( "killanimscript" );
var_0 = 0.05;
var_1 = 0;
self setanimknoball( %sm_aiming, %body, 1, 0 );
self setanimknob( animscripts\utility::animarray( "idle" ), 1, 0 );
for (;;)
{
if ( self.current_event != "none" )
{
self waittill( "snowmobile_event_finished" );
continue;
}
var_2 = maps\_vehicle_code::update_steering( self.ridingvehicle );
var_3 = 1 - abs( var_2 );
var_4 = max( 0, 0 - var_2 );
var_5 = max( 0, var_2 );
self setanimlimited( animscripts\utility::animarray( "straight_level_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_right" ), var_5, var_0 );
if ( self.bulletsinclip <= 0 )
{
animscripts\weaponlist::refillclip();
var_1 = gettime() + 3000;
}
if ( var_1 <= gettime() )
snowmobile_start_shooting();
self setanimknoblimited( animscripts\utility::animarray( "add_aim_left_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_left_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_left_right" ), var_5, var_0 );
self setanimknoblimited( animscripts\utility::animarray( "add_aim_right_center" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_right_left" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_right_right" ), var_5, var_0 );
thread snowmobile_stop_shooting();
wait 0.05;
}
}
snowmobile_loop_passenger_shooting()
{
self endon( "death" );
self endon( "killanimscript" );
var_0 = 0.05;
self setanimknoball( %sm_aiming, %body, 1, 0 );
self setanimknob( animscripts\utility::animarray( "idle" ), 1, 0 );
for (;;)
{
if ( self.current_event != "none" )
{
self waittill( "snowmobile_event_finished" );
continue;
}
if ( snowmobile_reload() )
continue;
var_1 = maps\_vehicle_code::update_steering( self.ridingvehicle );
var_2 = 1 - abs( var_1 );
var_3 = max( 0, 0 - var_1 );
var_4 = max( 0, var_1 );
self setanimlimited( animscripts\utility::animarray( "straight_level_center" ), var_2, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_left" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "straight_level_right" ), var_4, var_0 );
snowmobile_start_shooting();
self setanimlimited( animscripts\utility::animarray( "aim_left_center" ), var_2, var_0 );
self setanimlimited( animscripts\utility::animarray( "aim_left_left" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "aim_left_right" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "aim_right_center" ), var_2, var_0 );
self setanimlimited( animscripts\utility::animarray( "aim_right_left" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "aim_right_right" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backleft_center" ), var_2, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backleft_left" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backleft_right" ), var_4, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backright_center" ), var_2, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backright_left" ), var_3, var_0 );
self setanimlimited( animscripts\utility::animarray( "add_aim_backright_right" ), var_4, var_0 );
if ( isplayer( self.enemy ) )
self updateplayersightaccuracy();
wait 0.05;
thread snowmobile_stop_shooting();
}
}
snowmobile_do_event( var_0 )
{
self endon( "death" );
self.ridingvehicle.steering_enable = 0;
self setflaggedanimknoblimitedrestart( "snowmobile_event", var_0, 1, 0.17 );
animscripts\shared::donotetracks( "snowmobile_event", ::snowmobile_waitfor_start_lean );
self setanimknoblimited( animscripts\utility::animarray( "event_restore" ), 1, 0.1 );
self.ridingvehicle.steering_enable = 1;
self.current_event = "none";
self notify( "snowmobile_event_finished" );
}
snowmobile_handle_events( var_0 )
{
self endon( "death" );
self endon( "killanimscript" );
var_1 = self.ridingvehicle;
for (;;)
{
if ( var_1.event["jump"][var_0] )
{
var_1.event["jump"][var_0] = 0;
self notify( "snowmobile_event_occurred" );
self.current_event = "jump";
var_1.steering_enable = 0;
self setflaggedanimknoblimitedrestart( "jump", animscripts\utility::animarray( "event_jump" ), 1, 0.17 );
}
if ( var_1.event["bump"][var_0] )
{
var_1.event["bump"][var_0] = 0;
self notify( "snowmobile_event_occurred" );
if ( self.current_event != "bump_big" )
thread snowmobile_do_event( animscripts\utility::animarray( "event_bump" ) );
}
if ( var_1.event["bump_big"][var_0] )
{
var_1.event["bump_big"][var_0] = 0;
self notify( "snowmobile_event_occurred" );
self.current_event = "bump_big";
thread snowmobile_do_event( animscripts\utility::animarray( "event_bump_big" ) );
}
if ( var_1.event["sway_left"][var_0] )
{
var_1.event["sway_left"][var_0] = 0;
self notify( "snowmobile_event_occurred" );
if ( self.current_event != "bump_big" )
thread snowmobile_do_event( animscripts\utility::animarray( "event_sway" )["left"] );
}
if ( var_1.event["sway_right"][var_0] )
{
var_1.event["sway_right"][var_0] = 0;
self notify( "snowmobile_event_occurred" );
if ( self.current_event != "bump_big" )
thread snowmobile_do_event( animscripts\utility::animarray( "event_sway" )["right"] );
}
wait 0.05;
}
}
snowmobile_start_shooting()
{
self notify( "want_shoot_while_driving" );
self setanim( %sm_add_fire, 1, 0.2 );
if ( isdefined( self.shoot_while_driving_thread ) )
return;
self.shoot_while_driving_thread = 1;
thread snowmobile_decide_shoot();
thread snowmobile_shoot();
}
snowmobile_stop_shooting()
{
self endon( "killanimscript" );
self endon( "want_shoot_while_driving" );
wait 0.05;
self notify( "end_shoot_while_driving" );
self.shoot_while_driving_thread = undefined;
self clearanim( %sm_add_fire, 0.2 );
}
snowmobile_decide_shoot()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_driving" );
self.a.specialshootbehavior = ::snowmobileshootbehavior;
snowmobile_decide_shoot_internal();
self.shoot_while_driving_thread = undefined;
}
snowmobile_decide_shoot_internal()
{
self endon( "snowmobile_event_occurred" );
animscripts\shoot_behavior::decidewhatandhowtoshoot( "normal" );
}
snowmobileshootbehavior()
{
if ( !isdefined( self.enemy ) )
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
return;
}
self.shootent = self.enemy;
self.shootpos = self.enemy getshootatpos();
var_0 = distancesquared( self.origin, self.enemy.origin );
if ( var_0 < 1000000 )
self.shootstyle = "full";
else if ( var_0 < 4000000 )
self.shootstyle = "burst";
else
self.shootstyle = "single";
if ( isdefined( self.enemy.vehicle ) )
{
var_1 = 0.5;
var_2 = self.shootent.vehicle;
var_3 = self.ridingvehicle;
var_4 = var_3.origin - var_2.origin;
var_5 = anglestoforward( var_2.angles );
var_6 = anglestoright( var_2.angles );
var_7 = vectordot( var_4, var_5 );
if ( var_7 < 0 )
{
var_8 = var_2 vehicle_getspeed() * var_1;
var_8 = var_8 * 17.6;
if ( var_8 > 50 )
{
var_9 = vectordot( var_4, var_6 );
var_9 = var_9 / 3;
if ( var_9 > 128 )
var_9 = 128;
else if ( var_9 < -128 )
var_9 = -128;
if ( var_9 > 0 )
var_9 = 128 - var_9;
else
var_9 = -128 - var_9;
self.shootent = undefined;
self.shootpos = var_2.origin + var_8 * var_5 + var_9 * var_6;
return;
}
}
}
}
snowmobile_shoot()
{
self endon( "killanimscript" );
self endon( "end_shoot_while_driving" );
self notify( "doing_shootWhileDriving" );
self endon( "doing_shootWhileDriving" );
for (;;)
{
if ( !self.bulletsinclip )
{
wait 0.5;
continue;
}
animscripts\combat_utility::shootuntilshootbehaviorchange();
}
}
snowmobile_reload()
{
if ( !self.ridingvehicle.steering_enable )
return 0;
if ( !animscripts\combat_utility::needtoreload( 0 ) )
return 0;
if ( !animscripts\utility::usingriflelikeweapon() )
return 0;
snowmobile_reload_internal();
self notify( "abort_reload" );
return 1;
}
snowmobile_reload_internal()
{
self endon( "snowmobile_event_occurred" );
self.stop_aiming_for_reload = 1;
self waittill( "start_blending_reload" );
self setanim( %sm_aiming, 0, 0.25 );
self setflaggedanimrestart( "gun_down", animscripts\utility::animarray( "gun_down" ), 1, 0.25 );
animscripts\shared::donotetracks( "gun_down" );
self clearanim( animscripts\utility::animarray( "gun_down" ), 0 );
self setflaggedanimknoballrestart( "reload_anim", animscripts\utility::animarray( "reload" ), %body, 1, 0.25 );
animscripts\shared::donotetracks( "reload_anim" );
self clearanim( %sm_reload, 0.2 );
self setflaggedanimrestart( "gun_up", animscripts\utility::animarray( "gun_up" ), 1, 0.25 );
self.gun_up_for_reload = 1;
animscripts\shared::donotetracks( "gun_up", ::snowmobile_waitfor_start_aim );
self.stop_aiming_for_reload = undefined;
self clearanim( %sm_reload, 0.1 );
self setanim( %sm_aiming, 1, 0.1 );
if ( isdefined( self.gun_up_for_reload ) )
{
self.gun_up_for_reload = undefined;
animscripts\shared::donotetracks( "gun_up", ::snowmobile_waitfor_end );
self clearanim( animscripts\utility::animarray( "gun_up" ), 0 );
}
}
snowmobile_waitfor_start_aim( var_0 )
{
if ( var_0 == "start_aim" )
return 1;
}
snowmobile_waitfor_end( var_0 )
{
if ( var_0 == "end" )
return 1;
}
snowmobile_waitfor_start_lean( var_0 )
{
if ( var_0 == "start_lean" )
return 1;
}
snowmobile_trackshootentorpos_driver()
{
self endon( "killanimscript" );
self endon( "stop tracking" );
var_0 = 0.05;
var_1 = 8;
var_2 = 0;
var_3 = 0;
var_4 = 1;
for (;;)
{
animscripts\track::incranimaimweight();
var_5 = ( self.origin[0], self.origin[1], self geteye()[2] );
var_6 = self.shootpos;
if ( isdefined( self.shootent ) )
var_6 = self.shootent getshootatpos();
if ( !isdefined( var_6 ) )
{
var_3 = 0;
var_7 = self getanglestolikelyenemypath();
if ( isdefined( var_7 ) )
var_3 = angleclamp180( self.angles[1] - var_7[1] );
}
else
{
var_8 = var_6 - var_5;
var_9 = vectortoangles( var_8 );
var_3 = self.angles[1] - var_9[1];
var_3 = angleclamp180( var_3 );
}
if ( var_3 > self.rightaimlimit || var_3 < self.leftaimlimit )
var_3 = 0;
if ( var_4 )
var_4 = 0;
else
{
var_10 = var_3 - var_2;
if ( abs( var_10 ) > var_1 )
var_3 = var_2 + var_1 * common_scripts\utility::sign( var_10 );
}
var_2 = var_3;
var_11 = min( max( 0 - var_3, 0 ), 90 ) / 90 * self.a.aimweight;
var_12 = min( max( var_3, 0 ), 90 ) / 90 * self.a.aimweight;
self setanimlimited( %sm_aim_4, var_11, var_0 );
self setanimlimited( %sm_aim_6, var_12, var_0 );
wait 0.05;
}
}
snowmobile_trackshootentorpos_passenger()
{
self endon( "killanimscript" );
self endon( "stop tracking" );
var_0 = 0.05;
var_1 = 5;
var_2 = 20;
var_3 = 15;
var_4 = 40;
var_5 = 30;
var_6 = 0;
var_7 = 0;
var_8 = 1;
for (;;)
{
animscripts\track::incranimaimweight();
var_9 = ( self.origin[0], self.origin[1], self geteye()[2] );
var_10 = self.shootpos;
if ( isdefined( self.shootent ) )
var_10 = self.shootent getshootatpos();
if ( !isdefined( var_10 ) )
{
var_7 = 0;
var_11 = self getanglestolikelyenemypath();
if ( isdefined( var_11 ) )
var_7 = angleclamp180( self.angles[1] - var_11[1] );
}
else
{
var_12 = var_10 - var_9;
var_13 = vectortoangles( var_12 );
var_7 = self.angles[1] - var_13[1];
var_7 = angleclamp180( var_7 );
}
if ( isdefined( self.stop_aiming_for_reload ) || var_7 > 0 && ( var_7 - self.rightaimlimit ) * self.diraimlimit > 0 || var_7 < 0 && ( var_7 - self.leftaimlimit ) * self.diraimlimit < 0 )
var_7 = 0;
if ( var_8 )
var_8 = 0;
else
{
if ( var_6 < -180 + var_4 && var_7 > 180 - var_5 )
var_7 = -179;
if ( var_6 > 180 - var_4 && var_7 < -180 + var_5 )
var_7 = 179;
var_14 = var_7 - var_6;
var_15 = ( var_2 - var_1 ) * abs( var_14 ) / 180 + var_1;
if ( isdefined( self.stop_aiming_for_reload ) )
{
var_15 = var_3;
if ( abs( var_6 ) < 45 )
self notify( "start_blending_reload" );
}
if ( abs( var_14 ) > var_15 )
var_7 = var_6 + var_15 * common_scripts\utility::sign( var_14 );
}
var_6 = var_7;
var_16 = max( -90 - var_7, 0 ) / 90 * self.a.aimweight;
var_17 = min( max( 0 - var_7, 0 ), 90 ) / 90 * self.a.aimweight;
var_18 = max( 90 - abs( var_7 ), 0 ) / 90 * self.a.aimweight;
var_19 = min( max( var_7, 0 ), 90 ) / 90 * self.a.aimweight;
var_20 = max( -90 + var_7, 0 ) / 90 * self.a.aimweight;
self setanimlimited( %sm_aim_1, var_16, var_0 );
self setanimlimited( %sm_aim_4_delta, var_17, var_0 );
self setanimlimited( %sm_aim_5_delta, var_18, var_0 );
self setanimlimited( %sm_aim_6_delta, var_19, var_0 );
self setanimlimited( %sm_aim_3, var_20, var_0 );
wait 0.05;
}
}
snowmobile_get_death_anim( var_0, var_1, var_2 )
{
var_3 = undefined;
var_4 = undefined;
var_5 = 0;
for ( var_6 = 0; var_6 < var_0.size; var_6++ )
{
var_7 = animscripts\utility::absangleclamp180( var_2 - var_1[var_6] );
if ( !isdefined( var_3 ) || var_7 < var_5 )
{
var_4 = var_3;
var_3 = var_0[var_6];
var_5 = var_7;
continue;
}
if ( !isdefined( var_4 ) )
var_4 = var_0[var_6];
}
var_8 = var_3;
if ( isdefined( anim.prevsnowmobiledeath ) && var_8 == anim.prevsnowmobiledeath && gettime() - anim.prevsnowmobiledeathtime < 500 )
var_8 = var_4;
anim.prevsnowmobiledeath = var_8;
anim.prevsnowmobiledeathtime = gettime();
return var_8;
}
snowmobile_death_launchslide()
{
var_0 = self.ridingvehicle;
var_1 = var_0.prevframevelocity;
var_1 = ( var_1[0], var_1[1], randomfloatrange( 200, 400 ) ) * 0.75;
if ( lengthsquared( var_1 ) > 1000000 )
var_1 = vectornormalize( var_1 ) * 1000;
var_2 = spawn( "script_origin", self.origin );
var_2 moveslide( ( 0, 0, 40 ), 15, var_1 );
self linkto( var_2 );
var_2 thread deleteshortly();
}
snowmobile_normal_death()
{
var_0 = [];
var_0[0] = level.scr_anim["snowmobile"]["small"]["death"]["back"];
var_0[1] = level.scr_anim["snowmobile"]["small"]["death"]["right"];
var_0[2] = level.scr_anim["snowmobile"]["small"]["death"]["left"];
var_1 = [];
var_1[0] = -180;
var_1[1] = -90;
var_1[2] = 90;
var_2 = snowmobile_get_death_anim( var_0, var_1, self.damageyaw );
animscripts\death::playdeathanim( var_2 );
return 1;
}
snowmobile_collide_death()
{
var_0 = self.ridingvehicle;
if ( !isdefined( var_0 ) )
return snowmobile_normal_death();
var_1 = var_0.prevframevelocity;
snowmobile_death_launchslide();
var_2 = vectortoangles( var_1 );
var_3 = angleclamp180( var_2[1] - self.angles[1] );
var_4 = [];
var_4[0] = level.scr_anim["snowmobile"]["big"]["death"]["back"];
var_4[1] = level.scr_anim["snowmobile"]["big"]["death"]["left"];
var_4[2] = level.scr_anim["snowmobile"]["big"]["death"]["front"];
var_4[3] = level.scr_anim["snowmobile"]["big"]["death"]["right"];
var_5 = [];
var_5[0] = -180;
var_5[1] = -90;
var_5[2] = 0;
var_5[3] = 90;
var_6 = snowmobile_get_death_anim( var_4, var_5, var_3 );
animscripts\death::playdeathanim( var_6 );
return 1;
}
deleteshortly()
{
var_0 = self.origin;
for ( var_1 = 0; var_1 < 60; var_1++ )
{
wait 0.05;
var_0 = self.origin;
}
wait 3;
if ( isdefined( self ) )
self delete();
}
snowmobile_setanim_common( var_0 )
{
self.a.array["idle"] = level.scr_anim["snowmobile"][var_0]["idle"];
self.a.array["drive"] = level.scr_anim["snowmobile"][var_0]["drive"];
self.a.array["fire"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["single"] = animscripts\utility::array( level.scr_anim["snowmobile"][var_0]["single"] );
self.a.array["burst2"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["burst3"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["burst4"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["burst5"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["burst6"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["semi2"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["semi3"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["semi4"] = level.scr_anim["snowmobile"][var_0]["fire"];
self.a.array["semi5"] = level.scr_anim["snowmobile"][var_0]["fire"];
}
snowmobile_setanim_driver( var_0 )
{
self.a.array = [];
snowmobile_setanim_common( "driver" );
self.a.array["left2right"] = level.scr_anim["snowmobile"]["driver"]["left2right"];
self.a.array["right2left"] = level.scr_anim["snowmobile"]["driver"]["right2left"];
self.a.array["straight_level_left"] = level.scr_anim["snowmobile"]["driver"]["straight_level"]["left"];
self.a.array["straight_level_center"] = level.scr_anim["snowmobile"]["driver"]["straight_level"]["center"];
self.a.array["straight_level_right"] = level.scr_anim["snowmobile"]["driver"]["straight_level"]["right"];
self.a.array["add_aim_left_left"] = level.scr_anim["snowmobile"]["driver"]["add_aim_left"]["left"];
self.a.array["add_aim_left_center"] = level.scr_anim["snowmobile"]["driver"]["add_aim_left"]["center"];
self.a.array["add_aim_left_right"] = level.scr_anim["snowmobile"]["driver"]["add_aim_left"]["right"];
self.a.array["add_aim_right_left"] = level.scr_anim["snowmobile"]["driver"]["add_aim_right"]["left"];
self.a.array["add_aim_right_center"] = level.scr_anim["snowmobile"]["driver"]["add_aim_right"]["center"];
self.a.array["add_aim_right_right"] = level.scr_anim["snowmobile"]["driver"]["add_aim_right"]["right"];
if ( var_0 )
{
self.a.array["event_jump"] = level.scr_anim["snowmobile"]["driver"]["shoot_jump"];
self.a.array["event_bump"] = level.scr_anim["snowmobile"]["driver"]["shoot_bump"];
self.a.array["event_bump_big"] = level.scr_anim["snowmobile"]["driver"]["shoot_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["snowmobile"]["driver"]["shoot_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["snowmobile"]["driver"]["shoot_sway_right"];
self.a.array["event_restore"] = %sm_aiming;
}
else
{
self.a.array["event_jump"] = level.scr_anim["snowmobile"]["driver"]["drive_jump"];
self.a.array["event_bump"] = level.scr_anim["snowmobile"]["driver"]["drive_bump"];
self.a.array["event_bump_big"] = level.scr_anim["snowmobile"]["driver"]["drive_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["snowmobile"]["driver"]["drive_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["snowmobile"]["driver"]["drive_sway_right"];
self.a.array["event_restore"] = %sm_turn;
}
}
snowmobile_setanim_passenger( var_0 )
{
self.a.array = [];
snowmobile_setanim_common( "passenger" );
self.a.array["hide"] = level.scr_anim["snowmobile"]["passenger"]["hide"];
self.a.array["lean_left"] = level.scr_anim["snowmobile"]["passenger"]["add_lean"]["left"];
self.a.array["lean_right"] = level.scr_anim["snowmobile"]["passenger"]["add_lean"]["right"];
self.a.array["reload"] = level.scr_anim["snowmobile"]["passenger"]["reload"];
self.a.array["gun_up"] = level.scr_anim["snowmobile"]["passenger"]["gun_up"];
self.a.array["gun_down"] = level.scr_anim["snowmobile"]["passenger"]["gun_down"];
self.a.array["aim_left_left"] = level.scr_anim["snowmobile"]["passenger"]["aim_left"]["left"];
self.a.array["aim_left_center"] = level.scr_anim["snowmobile"]["passenger"]["aim_left"]["center"];
self.a.array["aim_left_right"] = level.scr_anim["snowmobile"]["passenger"]["aim_left"]["right"];
self.a.array["aim_right_left"] = level.scr_anim["snowmobile"]["passenger"]["aim_right"]["left"];
self.a.array["aim_right_center"] = level.scr_anim["snowmobile"]["passenger"]["aim_right"]["center"];
self.a.array["aim_right_right"] = level.scr_anim["snowmobile"]["passenger"]["aim_right"]["right"];
self.a.array["add_aim_backleft_left"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backleft"]["left"];
self.a.array["add_aim_backleft_center"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backleft"]["center"];
self.a.array["add_aim_backleft_right"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backleft"]["right"];
self.a.array["add_aim_backright_left"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backright"]["left"];
self.a.array["add_aim_backright_center"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backright"]["center"];
self.a.array["add_aim_backright_right"] = level.scr_anim["snowmobile"]["passenger"]["add_aim_backright"]["right"];
self.a.array["straight_level_left"] = level.scr_anim["snowmobile"]["passenger"]["straight_level"]["left"];
self.a.array["straight_level_center"] = level.scr_anim["snowmobile"]["passenger"]["straight_level"]["center"];
self.a.array["straight_level_right"] = level.scr_anim["snowmobile"]["passenger"]["straight_level"]["right"];
if ( var_0 )
{
self.a.array["event_jump"] = level.scr_anim["snowmobile"]["passenger"]["drive_jump"];
self.a.array["event_bump"] = level.scr_anim["snowmobile"]["passenger"]["drive_bump"];
self.a.array["event_bump_big"] = level.scr_anim["snowmobile"]["passenger"]["drive_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["snowmobile"]["passenger"]["drive_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["snowmobile"]["passenger"]["drive_sway_right"];
self.a.array["event_restore"] = %sm_aiming;
}
else
{
self.a.array["event_jump"] = level.scr_anim["snowmobile"]["passenger"]["hide_jump"];
self.a.array["event_bump"] = level.scr_anim["snowmobile"]["passenger"]["hide_bump"];
self.a.array["event_bump_big"] = level.scr_anim["snowmobile"]["passenger"]["hide_bump_big"];
self.a.array["event_sway"] = [];
self.a.array["event_sway"]["left"] = level.scr_anim["snowmobile"]["passenger"]["hide_sway_left"];
self.a.array["event_sway"]["right"] = level.scr_anim["snowmobile"]["passenger"]["hide_sway_right"];
self.a.array["event_restore"] = %sm_turn;
}
}

View File

@ -0,0 +1,691 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_squadmanager()
{
if ( isdefined( anim.squadinitialized ) && anim.squadinitialized )
return;
anim.squadcreatefuncs = [];
anim.squadcreatestrings = [];
anim.squads = [];
anim.squadindex = [];
anim.squadrand = 0;
anim.squadinitialized = 1;
}
createsquad( var_0, var_1 )
{
anim.squads[var_0] = spawnstruct();
var_2 = anim.squads[var_0];
var_2.squadname = var_0;
var_2.team = getsquadteam( var_1 );
var_2.sighttime = 0;
var_2.origin = undefined;
var_2.forward = undefined;
var_2.enemy = undefined;
var_2.isincombat = 0;
var_2.membercount = 0;
var_2.members = [];
var_2.officers = [];
var_2.officercount = 0;
var_2.squadlist = [];
var_2.memberaddfuncs = [];
var_2.memberaddstrings = [];
var_2.memberremovefuncs = [];
var_2.memberremovestrings = [];
var_2.squadupdatefuncs = [];
var_2.squadupdatestrings = [];
var_2.squadid = anim.squadindex.size;
var_2 initstate( "combat", 0.75 );
var_2 initstate( "cover", 0.75 );
var_2 initstate( "move", 0.75 );
var_2 initstate( "stop", 0.75 );
var_2 initstate( "death", 0.75 );
var_2 initstate( "suppressed", 0.75 );
var_2 initstate( "attacking", 0.5 );
anim.squadindex[anim.squadindex.size] = var_2;
var_2 updatesquadlist();
level notify( "squad created " + var_0 );
anim notify( "squad created " + var_0 );
for ( var_3 = 0; var_3 < anim.squadcreatefuncs.size; var_3++ )
{
var_4 = anim.squadcreatefuncs[var_3];
var_2 thread [[ var_4 ]]();
}
for ( var_3 = 0; var_3 < anim.squadindex.size; var_3++ )
anim.squadindex[var_3] updatesquadlist();
var_2 thread updatewaiter();
var_2 thread squadtracker();
var_2 thread officerwaiter();
var_2 thread updatememberstates();
return var_2;
}
deletesquad( var_0 )
{
if ( var_0 == "axis" || var_0 == "team3" || var_0 == "allies" )
return;
var_1 = anim.squads[var_0].squadid;
var_2 = anim.squads[var_0];
var_2 notify( "squad_deleting" );
while ( var_2.members.size )
var_2.members[0] addtosquad( var_2.members[0].team );
anim.squadindex[var_1] = anim.squadindex[anim.squadindex.size - 1];
anim.squadindex[var_1].squadid = var_1;
anim.squadindex[anim.squadindex.size - 1] = undefined;
anim.squads[var_0] = undefined;
level notify( "squad deleted " + var_0 );
anim notify( "squad deleted " + var_0 );
for ( var_3 = 0; var_3 < anim.squadindex.size; var_3++ )
anim.squadindex[var_3] updatesquadlist();
}
generatesquadname()
{
var_0 = "auto" + anim.squadrand;
anim.squadrand++;
return var_0;
}
addplayertosquad( var_0 )
{
if ( !isdefined( var_0 ) )
{
if ( isdefined( self.script_squadname ) )
var_0 = self.script_squadname;
else
var_0 = self.team;
}
if ( !isdefined( anim.squads[var_0] ) )
anim createsquad( var_0, self );
var_1 = anim.squads[var_0];
self.squad = var_1;
}
squadchange()
{
self endon( "death" );
wait 10.0;
if ( !isdefined( self.script_squadname ) )
var_0 = self.team + self.script_flanker;
else
var_0 = self.script_squadname + self.script_flanker;
addtosquad( var_0 );
}
getsquadteam( var_0 )
{
var_1 = "allies";
if ( var_0.team == "axis" || var_0.team == "neutral" || var_0.team == "team3" )
var_1 = var_0.team;
return var_1;
}
addtosquad( var_0 )
{
if ( !isdefined( var_0 ) )
{
if ( isdefined( self.script_flanker ) )
thread squadchange();
if ( isdefined( self.script_squadname ) )
var_0 = self.script_squadname;
else
var_0 = self.team;
}
if ( !isdefined( anim.squads[var_0] ) )
anim createsquad( var_0, self );
var_1 = anim.squads[var_0];
if ( isdefined( self.squad ) )
{
if ( self.squad == var_1 )
return;
else
removefromsquad();
}
self.lastenemysighttime = 0;
self.combattime = 0;
self.squad = var_1;
self.memberid = var_1.members.size;
var_1.members[self.memberid] = self;
var_1.membercount = var_1.members.size;
if ( isdefined( level.loadoutcomplete ) )
{
if ( self.team == "allies" && animscripts\battlechatter::isofficer() )
addofficertosquad();
}
for ( var_2 = 0; var_2 < self.squad.memberaddfuncs.size; var_2++ )
{
var_3 = self.squad.memberaddfuncs[var_2];
self thread [[ var_3 ]]( self.squad.squadname );
}
thread membercombatwaiter();
thread memberdeathwaiter();
}
removefromsquad()
{
var_0 = self.squad;
var_1 = -1;
if ( isdefined( self ) )
var_1 = self.memberid;
else
{
for ( var_2 = 0; var_2 < var_0.members.size; var_2++ )
{
if ( var_0.members[var_2] == self )
var_1 = var_2;
}
}
if ( var_1 != var_0.members.size - 1 )
{
var_3 = var_0.members[var_0.members.size - 1];
var_0.members[var_1] = var_3;
if ( isdefined( var_3 ) )
var_3.memberid = var_1;
}
var_0.members[var_0.members.size - 1] = undefined;
var_0.membercount = var_0.members.size;
if ( isdefined( self.officerid ) )
removeofficerfromsquad();
for ( var_2 = 0; var_2 < self.squad.memberremovefuncs.size; var_2++ )
{
var_4 = self.squad.memberremovefuncs[var_2];
self thread [[ var_4 ]]( var_0.squadname );
}
if ( var_0.membercount == 0 )
deletesquad( var_0.squadname );
if ( isdefined( self ) )
{
self.squad = undefined;
self.memberid = undefined;
}
self notify( "removed from squad" );
}
addofficertosquad()
{
var_0 = self.squad;
if ( isdefined( self.officerid ) )
return;
self.officerid = var_0.officers.size;
var_0.officers[self.officerid] = self;
var_0.officercount = var_0.officers.size;
}
removeofficerfromsquad()
{
var_0 = self.squad;
var_1 = -1;
if ( isdefined( self ) )
var_1 = self.officerid;
else
{
for ( var_2 = 0; var_2 < var_0.officers.size; var_2++ )
{
if ( var_0.officers[var_2] == self )
var_1 = var_2;
}
}
if ( var_1 != var_0.officers.size - 1 )
{
var_3 = var_0.officers[var_0.officers.size - 1];
var_0.officers[var_1] = var_3;
if ( isdefined( var_3 ) )
var_3.officerid = var_1;
}
var_0.officers[var_0.officers.size - 1] = undefined;
var_0.officercount = var_0.officers.size;
if ( isdefined( self ) )
self.officerid = undefined;
}
officerwaiter()
{
if ( !isdefined( level.loadoutcomplete ) )
anim waittill( "loadout complete" );
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( self.members[var_0] animscripts\battlechatter::isofficer() )
self.members[var_0] addofficertosquad();
}
}
updatewaiter()
{
for (;;)
{
anim waittill( "squadupdate", var_0 );
switch ( var_0 )
{
case "squadlist":
updatesquadlist();
break;
case "combat":
updatecombat();
break;
case "origin":
updateorigin();
break;
case "forward":
updateheading();
break;
}
}
}
squadtracker()
{
anim endon( "squad deleted " + self.squadname );
for (;;)
{
updateall();
wait 0.1;
}
}
memberdeathwaiter()
{
self endon( "removed from squad" );
self waittill( "death", var_0 );
if ( isdefined( self ) )
self.attacker = var_0;
removefromsquad();
}
membercombatwaiter()
{
self endon( "removed from squad" );
for (;;)
{
self waittill( "enemy" );
if ( !isdefined( self.enemy ) )
self.squad notify( "squadupdate", "combat" );
else
self.squad.isincombat = 1;
wait 0.05;
}
}
updateheading()
{
if ( isdefined( self.enemy ) )
self.forward = vectornormalize( self.enemy.origin - self.origin );
else
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
for ( var_2 = 0; var_2 < self.members.size; var_2++ )
{
if ( !isalive( self.members[var_2] ) )
continue;
var_0 = var_0 + anglestoforward( self.members[var_2].angles );
var_1++;
}
if ( var_1 )
{
self.forward = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
return;
}
self.forward = var_0;
}
}
updateorigin()
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
for ( var_2 = 0; var_2 < self.members.size; var_2++ )
{
if ( !isalive( self.members[var_2] ) )
continue;
var_0 = var_0 + self.members[var_2].origin;
var_1++;
}
if ( var_1 )
self.origin = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
else
self.origin = var_0;
}
updatecombat()
{
self.isincombat = 0;
for ( var_0 = 0; var_0 < anim.squadindex.size; var_0++ )
self.squadlist[anim.squadindex[var_0].squadname].isincontact = 0;
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( isdefined( self.members[var_0].enemy ) && isdefined( self.members[var_0].enemy.squad ) && self.members[var_0].combattime > 0 )
self.squadlist[self.members[var_0].enemy.squad.squadname].isincontact = 1;
}
}
updateenemy()
{
var_0 = undefined;
for ( var_1 = 0; var_1 < self.members.size; var_1++ )
{
if ( isdefined( self.members[var_1].enemy ) && isdefined( self.members[var_1].enemy.squad ) )
{
if ( !isdefined( var_0 ) )
{
var_0 = self.members[var_1].enemy.squad;
continue;
}
if ( self.members[var_1].enemy.squad.membercount > var_0.membercount )
var_0 = self.members[var_1].enemy.squad;
}
}
self.enemy = var_0;
}
updateall()
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
var_2 = undefined;
var_3 = 0;
updatecombat();
for ( var_4 = 0; var_4 < self.members.size; var_4++ )
{
if ( !isalive( self.members[var_4] ) )
continue;
var_0 = var_0 + self.members[var_4].origin;
var_1++;
if ( isdefined( self.members[var_4].enemy ) && isdefined( self.members[var_4].enemy.squad ) )
{
if ( !isdefined( var_2 ) )
{
var_2 = self.members[var_4].enemy.squad;
continue;
}
if ( self.members[var_4].enemy.squad.membercount > var_2.membercount )
var_2 = self.members[var_4].enemy.squad;
}
}
if ( var_1 )
self.origin = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
else
self.origin = var_0;
self.isincombat = var_3;
self.enemy = var_2;
updateheading();
}
updatesquadlist()
{
for ( var_0 = 0; var_0 < anim.squadindex.size; var_0++ )
{
if ( !isdefined( self.squadlist[anim.squadindex[var_0].squadname] ) )
{
self.squadlist[anim.squadindex[var_0].squadname] = spawnstruct();
self.squadlist[anim.squadindex[var_0].squadname].isincontact = 0;
}
for ( var_1 = 0; var_1 < self.squadupdatefuncs.size; var_1++ )
{
var_2 = self.squadupdatefuncs[var_1];
self thread [[ var_2 ]]( anim.squadindex[var_0].squadname );
}
}
}
printabovehead( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
if ( !isdefined( var_2 ) )
var_2 = ( 0, 0, 0 );
if ( !isdefined( var_3 ) )
var_3 = ( 1, 0, 0 );
for ( var_4 = 0; var_4 < var_1 * 2; var_4++ )
{
if ( !isalive( self ) )
return;
var_5 = self getshootatpos() + ( 0, 0, 10 ) + var_2;
wait 0.05;
}
}
aiupdateanimstate( var_0 )
{
switch ( var_0 )
{
case "move":
case "combat":
case "death":
case "stop":
self.a.state = var_0;
break;
case "grenadecower":
case "pain":
break;
case "stalingrad_cover_crouch":
case "concealment_stand":
case "concealment_prone":
case "concealment_crouch":
case "cover_wide_right":
case "cover_wide_left":
case "cover_swim_up":
case "cover_swim_right":
case "cover_swim_left":
case "cover_prone":
case "cover_left":
case "cover_stand":
case "cover_crouch":
case "cover_multi":
case "cover_right":
self.a.state = "cover";
break;
case "l33t truckride combat":
case "aim":
self.a.state = "combat";
break;
}
}
updatestates()
{
resetstate( "combat" );
resetstate( "cover" );
resetstate( "move" );
resetstate( "stop" );
resetstate( "death" );
resetstate( "suppressed" );
resetstate( "attacking" );
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( !isalive( self.members[var_0] ) )
continue;
querymemberanimstate( self.members[var_0] );
querymemberstate( self.members[var_0], "suppressed" );
querymemberstate( self.members[var_0], "combat" );
querymemberstate( self.members[var_0], "attacking" );
querymemberstate( self.members[var_0], "cover" );
}
}
updatememberstates()
{
anim endon( "squad deleted " + self.squadname );
var_0 = 0.05;
for (;;)
{
for ( var_1 = 0; var_1 < self.members.size; var_1++ )
{
if ( !isalive( self.members[var_1] ) )
continue;
self.members[var_1] aiupdatecombat( var_0 );
self.members[var_1] aiupdatesuppressed( var_0 );
}
wait( var_0 );
}
}
aiupdatecombat( var_0 )
{
if ( isdefined( self.lastenemysightpos ) )
{
if ( self.combattime < 0 )
self.combattime = var_0;
else
self.combattime = self.combattime + var_0;
self.lastenemysighttime = gettime();
return;
}
else if ( self issuppressed() )
{
self.combattime = self.combattime + var_0;
return;
}
if ( self.combattime > 0 )
self.combattime = 0 - var_0;
else
self.combattime = self.combattime - var_0;
}
aiupdatesuppressed( var_0 )
{
if ( self.suppressed )
{
if ( self.suppressedtime < 0 )
self.suppressedtime = var_0;
else
self.suppressedtime = self.suppressedtime + var_0;
}
else
{
if ( self.suppressedtime > 0 )
{
self.suppressedtime = 0 - var_0;
return;
}
self.suppressedtime = self.suppressedtime - var_0;
}
}
initstate( var_0, var_1 )
{
self.squadstates[var_0] = spawnstruct();
self.squadstates[var_0].activateratio = var_1;
self.squadstates[var_0].isactive = 0;
self.squadstates[var_0].numactive = 0;
}
resetstate( var_0 )
{
self.squadstates[var_0].isactive = 0;
self.squadstates[var_0].numactive = 0;
}
querymemberanimstate( var_0 )
{
self.squadstates[var_0.a.state].numactive++;
if ( self.squadstates[var_0.a.state].numactive > self.squadstates[var_0.a.state].activateratio * self.members.size )
self.squadstates[var_0.a.state].isactive = 1;
}
querymemberstate( var_0, var_1 )
{
switch ( var_1 )
{
case "suppressed":
if ( var_0.suppressedtime > 1.0 )
self.squadstates[var_1].numactive++;
break;
case "combat":
if ( var_0.combattime > 0.0 )
self.squadstates[var_1].numactive++;
break;
case "attacking":
if ( gettime() < var_0.a.lastshoottime + 2000 )
self.squadstates[var_1].numactive++;
break;
case "cover":
if ( !var_0 animscripts\battlechatter::isexposed() )
self.squadstates[var_1].numactive++;
break;
}
if ( self.squadstates[var_1].numactive > self.squadstates[var_1].activateratio * self.members.size )
self.squadstates[var_1].isactive = 1;
}

306
animscripts/stop.gsc Normal file
View File

@ -0,0 +1,306 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_idle()
{
var_0 = [];
var_0["stand"][0] = [ %casual_stand_idle, %casual_stand_idle_twitch, %casual_stand_idle_twitchb ];
var_0["stand"][1] = [ %casual_stand_v2_idle, %casual_stand_v2_twitch_radio, %casual_stand_v2_twitch_shift, %casual_stand_v2_twitch_talk ];
var_0["stand_cqb"][0] = [ %cqb_stand_idle, %cqb_stand_twitch ];
var_0["crouch"][0] = [ %casual_crouch_idle ];
anim.archetypes["soldier"]["idle"] = var_0;
var_0 = [];
var_0["stand"][0] = [ 2, 1, 1 ];
var_0["stand"][1] = [ 10, 4, 7, 4 ];
var_0["stand_cqb"][0] = [ 2, 1 ];
var_0["crouch"][0] = [ 6 ];
anim.archetypes["soldier"]["idle_weights"] = var_0;
var_0 = [];
var_0["stand"] = %casual_stand_idle_trans_in;
var_0["crouch"] = %casual_crouch_idle_in;
anim.archetypes["soldier"]["idle_transitions"] = var_0;
}
main()
{
if ( isdefined( self.no_ai ) )
return;
if ( isdefined( self.custom_animscript ) )
{
if ( isdefined( self.custom_animscript["stop"] ) )
{
[[ self.custom_animscript["stop"] ]]();
return;
}
}
self notify( "stopScript" );
self endon( "killanimscript" );
[[ self.exception["stop_immediate"] ]]();
thread delayedexception();
animscripts\utility::initialize( "stop" );
if ( isdefined( self.specialidleanim ) )
specialidleloop();
animscripts\utility::randomizeidleset();
thread setlaststoppedtime();
thread animscripts\reactions::reactionscheckloop();
var_0 = isdefined( self.customidleanimset );
if ( !var_0 )
{
if ( self.a.weaponpos["right"] == "none" && self.a.weaponpos["left"] == "none" )
var_0 = 1;
else if ( angleclamp180( self getmuzzleangle()[0] ) > 20 )
var_0 = 1;
}
if ( self.swimmer && !isdefined( self.enemy ) )
{
var_1 = animscripts\exit_node::getexitnode();
if ( isdefined( var_1 ) )
{
self setflaggedanimknoballrestart( "idle", self.customidleanimset["stand"], %body, 1, 0.5, self.animplaybackrate );
turntoangle( var_1.angles[1] );
}
else
self orientmode( "face angle", self.angles[1] );
}
for (;;)
{
var_2 = getdesiredidlepose();
if ( var_2 == "prone" )
{
var_0 = 1;
pronestill();
continue;
}
if ( self.a.pose != var_2 )
{
self clearanim( %root, 0.3 );
var_0 = 0;
}
animscripts\setposemovement::setposemovement( var_2, "stop" );
if ( !var_0 )
{
transitiontoidle( var_2, self.a.idleset );
var_0 = 1;
continue;
}
playidle( var_2, self.a.idleset );
}
}
turntoangle( var_0 )
{
var_1 = self.angles[1];
var_2 = angleclamp180( var_0 - var_1 );
if ( -20 < var_2 && var_2 < 20 )
{
rotatetoangle( var_0, 2 );
return;
}
var_3 = animscripts\swim::getswimanim( "idle_turn" );
if ( var_2 < -80 )
var_4 = var_3[2];
else if ( var_2 < -20 )
var_4 = var_3[3];
else if ( var_2 < 80 )
var_4 = var_3[5];
else
var_4 = var_3[6];
var_5 = getanimlength( var_4 );
var_6 = abs( var_2 ) / self.turnrate;
var_6 = var_6 / 1000;
var_7 = var_5 / var_6;
self orientmode( "face angle", var_0 );
self setflaggedanimrestart( "swim_turn", var_4, 1, 0.2, var_7 * self.moveplaybackrate );
animscripts\shared::donotetracks( "swim_turn" );
self clearanim( var_4, 0.2 );
}
rotatetoangle( var_0, var_1 )
{
self orientmode( "face angle", var_0 );
while ( angleclamp( var_0 - self.angles[1] ) > var_1 )
wait 0.1;
}
setlaststoppedtime()
{
self endon( "death" );
self waittill( "killanimscript" );
self.laststoppedtime = gettime();
}
specialidleloop()
{
self endon( "stop_specialidle" );
var_0 = self.specialidleanim;
self animmode( "gravity" );
self orientmode( "face current" );
self clearanim( %root, 0.2 );
for (;;)
{
self setflaggedanimrestart( "special_idle", var_0[randomint( var_0.size )], 1, 0.2, self.animplaybackrate );
self waittillmatch( "special_idle", "end" );
}
}
getdesiredidlepose()
{
var_0 = animscripts\utility::getclaimednode();
if ( isdefined( var_0 ) )
{
var_1 = var_0.angles[1];
var_2 = var_0.type;
}
else
{
var_1 = self.desiredangle;
var_2 = "node was undefined";
}
animscripts\face::setidleface( anim.alertface );
var_3 = animscripts\utility::choosepose();
if ( var_2 == "Cover Stand" || var_2 == "Conceal Stand" )
var_3 = animscripts\utility::choosepose( "stand" );
else if ( var_2 == "Cover Crouch" || var_2 == "Conceal Crouch" )
var_3 = animscripts\utility::choosepose( "crouch" );
else if ( var_2 == "Cover Prone" || var_2 == "Conceal Prone" )
var_3 = animscripts\utility::choosepose( "prone" );
return var_3;
}
transitiontoidle( var_0, var_1 )
{
if ( animscripts\utility::iscqbwalking() && self.a.pose == "stand" )
var_0 = "stand_cqb";
var_2 = animscripts\utility::lookupanimarray( "idle_transitions" );
if ( isdefined( var_2[var_0] ) )
{
var_3 = var_2[var_0];
self setflaggedanimknoballrestart( "idle_transition", var_3, %body, 1, 0.2, self.animplaybackrate );
animscripts\shared::donotetracks( "idle_transition" );
}
}
playidle( var_0, var_1 )
{
if ( animscripts\utility::iscqbwalking() && self.a.pose == "stand" )
var_0 = "stand_cqb";
var_2 = undefined;
if ( isdefined( self.customidleanimset ) && isdefined( self.customidleanimset[var_0] ) )
{
if ( isarray( self.customidleanimset[var_0] ) )
var_3 = animscripts\utility::anim_array( self.customidleanimset[var_0], self.customidleanimweights[var_0] );
else
{
var_3 = self.customidleanimset[var_0];
var_4 = var_0 + "_add";
if ( isdefined( self.customidleanimset[var_4] ) )
var_2 = self.customidleanimset[var_4];
}
}
else if ( isdefined( anim.readyanimarray ) && ( var_0 == "stand" || var_0 == "stand_cqb" ) && isdefined( self.busereadyidle ) && self.busereadyidle == 1 )
var_3 = animscripts\utility::anim_array( anim.readyanimarray["stand"][0], anim.readyanimweights["stand"][0] );
else
{
var_5 = animscripts\utility::lookupanimarray( "idle" );
var_6 = animscripts\utility::lookupanimarray( "idle_weights" );
var_1 = var_1 % var_5[var_0].size;
var_3 = animscripts\utility::anim_array( var_5[var_0][var_1], var_6[var_0][var_1] );
}
var_7 = 0.2;
if ( gettime() == self.a.scriptstarttime )
var_7 = 0.5;
if ( isdefined( var_2 ) )
{
self setanimknoball( var_3, %body, 1, var_7, 1 );
self setanim( %add_idle );
self setflaggedanimknoballrestart( "idle", var_2, %add_idle, 1, var_7, self.animplaybackrate );
}
else
self setflaggedanimknoballrestart( "idle", var_3, %body, 1, var_7, self.animplaybackrate );
animscripts\shared::donotetracks( "idle" );
}
pronestill()
{
if ( self.a.pose != "prone" )
{
var_0["stand_2_prone"] = %stand_2_prone;
var_0["crouch_2_prone"] = %crouch_2_prone;
var_1 = var_0[self.a.pose + "_2_prone"];
self setflaggedanimknoballrestart( "trans", var_1, %body, 1, 0.2, 1.0 );
animscripts\shared::donotetracks( "trans" );
self.a.movement = "stop";
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_modern, %prone_legs_up );
return;
}
thread updatepronethread();
if ( randomint( 10 ) < 3 )
{
var_2 = animscripts\utility::lookupanim( "cover_prone", "twitch" );
var_3 = var_2[randomint( var_2.size )];
self setflaggedanimknoball( "prone_idle", var_3, %exposed_modern, 1, 0.2 );
}
else
{
self setanimknoball( animscripts\utility::lookupanim( "cover_prone", "straight_level" ), %exposed_modern, 1, 0.2 );
self setflaggedanimknob( "prone_idle", animscripts\utility::lookupanim( "cover_prone", "exposed_idle" )[0], 1, 0.2 );
}
self waittillmatch( "prone_idle", "end" );
self notify( "kill UpdateProneThread" );
}
updatepronethread()
{
self endon( "killanimscript" );
self endon( "kill UpdateProneThread" );
for (;;)
{
animscripts\cover_prone::updatepronewrapper( 0.1 );
wait 0.1;
}
}
delayedexception()
{
self endon( "killanimscript" );
wait 0.05;
[[ self.exception["stop"] ]]();
}

1431
animscripts/swim.gsc Normal file

File diff suppressed because it is too large Load Diff

328
animscripts/track.gsc Normal file
View File

@ -0,0 +1,328 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
trackshootentorpos()
{
self endon( "killanimscript" );
self endon( "stop tracking" );
self endon( "melee" );
trackloop( %aim_2, %aim_4, %aim_6, %aim_8 );
}
trackloop( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = 0;
var_6 = 0;
var_7 = ( 0, 0, 0 );
var_8 = 1;
var_9 = 0;
var_10 = 0;
var_11 = 10;
var_12 = ( 0, 0, 0 );
if ( self.type == "dog" )
{
var_13 = 0;
self.shootent = self.enemy;
}
else
{
var_13 = 1;
var_14 = 0;
var_15 = 0;
if ( isdefined( self.covercrouchlean_aimmode ) )
var_14 = anim.covercrouchleanpitch;
var_16 = self.script;
if ( var_16 == "cover_multi" )
{
if ( self.cover.state == "right" )
var_16 = "cover_right";
else if ( self.cover.state == "left" )
var_16 = "cover_left";
}
if ( ( var_16 == "cover_left" || var_16 == "cover_right" ) && isdefined( self.a.cornermode ) && self.a.cornermode == "lean" )
var_15 = self.covernode.angles[1] - self.angles[1];
var_12 = ( var_14, var_15, 0 );
}
for (;;)
{
incranimaimweight();
var_17 = animscripts\shared::getshootfrompos();
var_18 = self.shootpos;
if ( isdefined( self.shootent ) )
var_18 = self.shootent getshootatpos();
if ( !isdefined( var_18 ) && animscripts\utility::shouldcqb() )
var_18 = trackloop_cqbshootpos( var_17 );
var_19 = isdefined( self.onsnowmobile ) || isdefined( self.onatv );
var_20 = isdefined( var_18 );
var_21 = ( 0, 0, 0 );
if ( var_20 )
var_21 = var_18;
var_22 = 0;
var_23 = isdefined( self.stepoutyaw );
if ( var_23 )
var_22 = self.stepoutyaw;
var_7 = self getaimangle( var_17, var_21, var_20, var_12, var_22, var_23, var_19 );
var_24 = var_7[0];
var_25 = var_7[1];
var_7 = undefined;
if ( animscripts\utility::isspaceai() )
{
var_26 = self.angles[2] * -1;
var_27 = var_24 * cos( var_26 ) - var_25 * sin( var_26 );
var_28 = var_24 * sin( var_26 ) + var_25 * cos( var_26 );
var_24 = var_27;
var_25 = var_28;
var_24 = clamp( var_24, self.downaimlimit, self.upaimlimit );
var_25 = clamp( var_25, self.leftaimlimit, self.rightaimlimit );
}
if ( var_10 > 0 )
{
var_10 = var_10 - 1;
var_11 = max( 10, var_11 - 5 );
}
else if ( self.relativedir && self.relativedir != var_9 )
{
var_10 = 2;
var_11 = 30;
}
else
var_11 = 10;
var_29 = squared( var_11 );
var_9 = self.relativedir;
var_30 = self.movemode != "stop" || !var_8;
if ( var_30 )
{
var_31 = var_25 - var_5;
if ( squared( var_31 ) > var_29 )
{
var_25 = var_5 + clamp( var_31, -1 * var_11, var_11 );
var_25 = clamp( var_25, self.leftaimlimit, self.rightaimlimit );
}
var_32 = var_24 - var_6;
if ( squared( var_32 ) > var_29 )
{
var_24 = var_6 + clamp( var_32, -1 * var_11, var_11 );
var_24 = clamp( var_24, self.downaimlimit, self.upaimlimit );
}
}
var_8 = 0;
var_5 = var_25;
var_6 = var_24;
trackloop_setanimweights( var_0, var_1, var_2, var_3, var_4, var_24, var_25 );
wait 0.05;
}
}
trackloop_cqbshootpos( var_0 )
{
var_1 = undefined;
var_2 = anglestoforward( self.angles );
if ( isdefined( self.cqb_target ) )
{
var_1 = self.cqb_target getshootatpos();
if ( isdefined( self.cqb_wide_target_track ) )
{
if ( vectordot( vectornormalize( var_1 - var_0 ), var_2 ) < 0.177 )
var_1 = undefined;
}
else if ( vectordot( vectornormalize( var_1 - var_0 ), var_2 ) < 0.643 )
var_1 = undefined;
}
if ( !isdefined( var_1 ) && isdefined( self.cqb_point_of_interest ) )
{
var_1 = self.cqb_point_of_interest;
if ( isdefined( self.cqb_wide_poi_track ) )
{
if ( vectordot( vectornormalize( var_1 - var_0 ), var_2 ) < 0.177 )
var_1 = undefined;
}
else if ( vectordot( vectornormalize( var_1 - var_0 ), var_2 ) < 0.643 )
var_1 = undefined;
}
return var_1;
}
trackloop_anglesfornoshootpos( var_0, var_1 )
{
if ( animscripts\utility::recentlysawenemy() )
{
var_2 = self.enemy getshootatpos() - self.enemy.origin;
var_3 = self lastknownpos( self.enemy ) + var_2;
return trackloop_getdesiredangles( var_3 - var_0, var_1 );
}
var_4 = 0;
var_5 = 0;
if ( isdefined( self.node ) && isdefined( anim.iscombatscriptnode[self.node.type] ) && distancesquared( self.origin, self.node.origin ) < 16 )
var_5 = angleclamp180( self.angles[1] - self.node.angles[1] );
else
{
var_6 = self getanglestolikelyenemypath();
if ( isdefined( var_6 ) )
{
var_5 = angleclamp180( self.angles[1] - var_6[1] );
var_4 = angleclamp180( 360 - var_6[0] );
}
}
return ( var_4, var_5, 0 );
}
trackloop_getdesiredangles( var_0, var_1 )
{
var_2 = vectortoangles( var_0 );
var_3 = 0;
var_4 = 0;
if ( self.stairsstate == "up" )
var_3 = -40;
else if ( self.stairsstate == "down" )
{
var_3 = 40;
var_4 = 12;
}
var_5 = 360 - var_2[0];
var_5 = angleclamp180( var_5 + var_1[0] + var_3 );
if ( isdefined( self.stepoutyaw ) )
var_6 = self.stepoutyaw - var_2[1];
else
{
var_7 = angleclamp180( self.desiredangle - self.angles[1] ) * 0.5;
var_6 = var_7 + self.angles[1] - var_2[1];
}
var_6 = angleclamp180( var_6 + var_1[1] + var_4 );
return ( var_5, var_6, 0 );
}
trackloop_clampangles( var_0, var_1, var_2 )
{
if ( isdefined( self.onsnowmobile ) || isdefined( self.onatv ) )
{
if ( var_1 > self.rightaimlimit || var_1 < self.leftaimlimit )
var_1 = 0;
if ( var_0 > self.upaimlimit || var_0 < self.downaimlimit )
var_0 = 0;
}
else if ( var_2 && ( abs( var_1 ) > anim.maxanglecheckyawdelta || abs( var_0 ) > anim.maxanglecheckpitchdelta ) )
{
var_1 = 0;
var_0 = 0;
}
else
{
if ( self.gunblockedbywall )
var_1 = clamp( var_1, -10, 10 );
else
var_1 = clamp( var_1, self.leftaimlimit, self.rightaimlimit );
var_0 = clamp( var_0, self.downaimlimit, self.upaimlimit );
}
return ( var_0, var_1, 0 );
}
trackloop_setanimweights( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_7 = 0;
var_8 = 0;
var_9 = 0;
var_10 = 0;
var_11 = 0;
if ( var_6 > 0 )
{
var_10 = var_6 / self.rightaimlimit * self.a.aimweight;
var_9 = 1;
}
else if ( var_6 < 0 )
{
var_8 = var_6 / self.leftaimlimit * self.a.aimweight;
var_9 = 1;
}
if ( var_5 > 0 )
{
var_11 = var_5 / self.upaimlimit * self.a.aimweight;
var_9 = 1;
}
else if ( var_5 < 0 )
{
var_7 = var_5 / self.downaimlimit * self.a.aimweight;
var_9 = 1;
}
self setanimlimited( var_0, var_7, 0.1, 1, 1 );
self setanimlimited( var_1, var_8, 0.1, 1, 1 );
self setanimlimited( var_2, var_10, 0.1, 1, 1 );
self setanimlimited( var_3, var_11, 0.1, 1, 1 );
if ( isdefined( var_4 ) )
self setanimlimited( var_4, var_9, 0.1, 1, 1 );
}
setanimaimweight( var_0, var_1 )
{
if ( !isdefined( var_1 ) || var_1 <= 0 )
{
self.a.aimweight = var_0;
self.a.aimweight_start = var_0;
self.a.aimweight_end = var_0;
self.a.aimweight_transframes = 0;
}
else
{
if ( !isdefined( self.a.aimweight ) )
self.a.aimweight = 0;
self.a.aimweight_start = self.a.aimweight;
self.a.aimweight_end = var_0;
self.a.aimweight_transframes = int( var_1 * 20 );
}
self.a.aimweight_t = 0;
}
incranimaimweight()
{
if ( self.a.aimweight_t < self.a.aimweight_transframes )
{
self.a.aimweight_t++;
var_0 = 1.0 * self.a.aimweight_t / self.a.aimweight_transframes;
self.a.aimweight = self.a.aimweight_start * ( 1 - var_0 ) + self.a.aimweight_end * var_0;
}
}

View File

@ -0,0 +1,16 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
low_wall_human();
}
#using_animtree("generic_human");
low_wall_human()
{
var_0 = [];
var_0["traverseAnim"] = %berlin_traverse_jumpdown_28;
animscripts\traverse\shared::dotraverse( var_0 );
}

View File

@ -0,0 +1,42 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
if ( isdefined( self.type ) && self.type == "dog" )
return;
self.desired_anim_pose = "crouch";
animscripts\utility::updateanimpose();
self endon( "killanimscript" );
self traversemode( "noclip" );
var_0 = %carrier_deck_tilt_ladder_climbup;
var_1 = %carrier_deck_tilt_ladder_exit_hesh;
var_2 = self getnegotiationstartnode();
self orientmode( "face angle", var_2.angles[1] );
var_3 = 1;
if ( isdefined( self.moveplaybackrate ) )
var_3 = self.moveplaybackrate;
self setflaggedanimknoballrestart( "climbanim", var_0, %body, 1, 0.1, var_3 );
var_4 = getmovedelta( var_1, 0, 1 );
var_5 = self getnegotiationendnode();
var_6 = var_5.origin - var_4 + ( 0, 0, 1 );
var_7 = getmovedelta( var_0, 0, 1 );
var_8 = var_7[2] * var_3 / getanimlength( var_0 );
var_9 = ( var_6[2] - self.origin[2] ) / var_8;
if ( var_9 > 0 )
{
self.allowpain = 1;
animscripts\notetracks::donotetracksfortime( var_9, "climbanim" );
self setflaggedanimknoballrestart( "climbanim", var_1, %body, 1, 0.1, var_3 );
animscripts\shared::donotetracks( "climbanim" );
}
self traversemode( "gravity" );
self.a.movement = "run";
}

View File

@ -0,0 +1,18 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
main()
{
animscripts\setposemovement::pronerun_begin();
animscripts\utility::updateanimpose();
self endon( "killanimscript" );
self traversemode( "noclip" );
var_0 = self getnegotiationstartnode();
self orientmode( "face angle", var_0.angles[1] );
self setflaggedanimknoballrestart( "crawlanim", %prone_crawl, %body, 1, 0.1, 1 );
animscripts\shared::donotetracks( "crawlanim" );
self.a.movement = "run";
self.a.pose = "crouch";
}

View File

@ -0,0 +1,16 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
creepwalk_traverse_over_large();
}
#using_animtree("generic_human");
creepwalk_traverse_over_large()
{
var_0 = [];
var_0["traverseAnim"] = %creepwalk_traverse_over_large;
animscripts\traverse\shared::dotraverse( var_0 );
}

View File

@ -0,0 +1,16 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
creepwalk_traverse_over_small();
}
#using_animtree("generic_human");
creepwalk_traverse_over_small()
{
var_0 = [];
var_0["traverseAnim"] = %creepwalk_traverse_over_small;
animscripts\traverse\shared::dotraverse( var_0 );
}

View File

@ -0,0 +1,16 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
creepwalk_traverse_over_smaller();
}
#using_animtree("generic_human");
creepwalk_traverse_over_smaller()
{
var_0 = [];
var_0["traverseAnim"] = %creepwalk_traverse_over_smaller;
animscripts\traverse\shared::dotraverse( var_0 );
}

Some files were not shown because too many files have changed in this diff Show More