2025 lines
56 KiB
Plaintext
2025 lines
56 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
#using_animtree("vehicles");
|
|
|
|
init_zodiacs()
|
|
{
|
|
level.vttype = "zodiac_iw6";
|
|
level.vtmodel = "vehicle_zodiac_boat_fed_iw6";
|
|
level.vtclassname = "script_vehicle_zodiac_iw6";
|
|
maps\_vehicle::build_aianims( maps\carrier_anim::set_zodiac_override_anims, vehicle_scripts\_zodiac::set_vehicle_anims );
|
|
maps\_vehicle::build_drive( %carrier_rappel_defend_zodiac_moving, %carrier_rappel_defend_zodiac_moving, 20 );
|
|
zodiac_aianimthread_setup();
|
|
level.max_zodiacs = 30;
|
|
}
|
|
|
|
zodiac_aianimthread_setup()
|
|
{
|
|
level.vehicle_aianimthread["attack"] = ::rider_attack;
|
|
level.vehicle_aianimcheck["attack"] = ::rider_attack_check;
|
|
}
|
|
|
|
run_corpse_cleanup()
|
|
{
|
|
level endon( "knockdown_moment" );
|
|
|
|
for (;;)
|
|
{
|
|
foreach ( var_1 in getcorpsearray() )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_2 = undefined;
|
|
|
|
foreach ( var_4 in level.corpse_entnums )
|
|
{
|
|
if ( var_4 == var_1 getentitynumber() )
|
|
{
|
|
var_2 = var_4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_1.removetime ) && isdefined( var_2 ) )
|
|
{
|
|
level.corpse_entnums = common_scripts\utility::array_remove( level.corpse_entnums, var_2 );
|
|
var_1 setcorpseremovetimer( 3 );
|
|
var_1.removetime = 3;
|
|
}
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
clear_all_corpses()
|
|
{
|
|
level.corpse_entnums = [];
|
|
clearallcorpses();
|
|
}
|
|
|
|
monitor_zodiac_count()
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
|
|
for (;;)
|
|
{
|
|
level.zodiacs = maps\_utility::array_removedead( level.zodiacs );
|
|
|
|
for ( level.zodiacs = sortbydistance( level.zodiacs, level.player.origin ); level.zodiacs.size > 30; level.zodiacs = common_scripts\utility::array_remove( level.zodiacs, var_0 ) )
|
|
{
|
|
var_0 = get_furthest_zodiac();
|
|
maps\_utility::deleteent( var_0 );
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
get_furthest_zodiac()
|
|
{
|
|
return level.zodiacs[level.zodiacs.size - 1];
|
|
}
|
|
|
|
spawn_zodiacs( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
foreach ( var_6 in level.zodiacs )
|
|
{
|
|
if ( isalive( var_6 ) && isdefined( var_6.saved_targetname ) && var_6.saved_targetname == var_0 )
|
|
return;
|
|
}
|
|
|
|
if ( maps\carrier_code::eval( var_1 ) && !maps\carrier_code::eval( var_4 ) )
|
|
{
|
|
var_8 = maps\_utility::getvehiclespawnerarray( var_0 );
|
|
var_9 = cos( getdvarfloat( "cg_fov" ) );
|
|
|
|
foreach ( var_11 in var_8 )
|
|
{
|
|
if ( maps\_utility::within_fov_of_players( var_11.origin, var_9 ) )
|
|
return;
|
|
}
|
|
}
|
|
|
|
level.zodiacs = maps\_utility::array_removedead( level.zodiacs );
|
|
|
|
if ( level.zodiacs.size > 30 && !maps\carrier_code::eval( var_4 ) )
|
|
return;
|
|
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::zodiac_teleport_logic );
|
|
maps\_utility::array_spawn_function_targetname( var_0, maps\carrier_code::setup_target_on_vehicle );
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::zodiac_setup );
|
|
var_13 = maps\_vehicle::spawn_vehicles_from_targetname_and_drive( var_0 );
|
|
|
|
foreach ( var_6 in var_13 )
|
|
{
|
|
var_6.saved_targetname = var_0;
|
|
level.zodiacs = common_scripts\utility::array_add( level.zodiacs, var_6 );
|
|
}
|
|
|
|
if ( maps\carrier_code::eval( var_2 ) )
|
|
thread loop_zodiacs( var_0, var_13, var_3 );
|
|
|
|
return var_13;
|
|
}
|
|
|
|
loop_zodiacs( var_0, var_1, var_2 )
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
level endon( var_2 );
|
|
level.player endon( var_2 );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 waittill_array_dead();
|
|
wait 5;
|
|
var_1 = maps\_vehicle::spawn_vehicles_from_targetname_and_drive( var_0 );
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
var_4.saved_targetname = var_0;
|
|
level.zodiacs = common_scripts\utility::array_add( level.zodiacs, var_4 );
|
|
}
|
|
}
|
|
}
|
|
|
|
waittill_array_dead()
|
|
{
|
|
for ( var_0 = self; var_0.size > 0; var_0 = maps\_utility::array_removedead( var_0 ) )
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
zodiac_setup( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self.health = 55000;
|
|
self.currenthealth = self.health;
|
|
self.animname = "zodiac";
|
|
maps\_anim::setanimtree();
|
|
thread zodiac_waittill_death();
|
|
thread zodiac_treadfx();
|
|
thread zodiac_wait_for_attack();
|
|
thread cleanup_zodiac_bodies();
|
|
thread maps\carrier_fx::handle_zodiac_propeller();
|
|
thread maps\carrier_code::do_notetracks( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_moving"][0], "impact_front_both" );
|
|
common_scripts\utility::array_thread( self.riders, ::zodiac_rider_logic, var_0 );
|
|
maps\_utility::ent_flag_init( "safe_remove" );
|
|
|
|
if ( isdefined( self.script_parameters ) && issubstr( self.script_parameters, "no_riders" ) )
|
|
thread setup_fake_riders();
|
|
|
|
if ( !maps\carrier_code::eval( var_0 ) )
|
|
thread zodiac_safe_remove();
|
|
|
|
var_1 = getanimlength( %carrier_rappel_defend_zodiac_moving );
|
|
wait( randomfloat( var_1 - var_1 / 4 ) );
|
|
|
|
if ( !maps\carrier_code::eval( self.is_rappelling ) )
|
|
thread maps\_vehicle_code::animate_drive_idle();
|
|
}
|
|
|
|
zodiac_safe_remove()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
common_scripts\utility::waittill_any( "reached_dynamic_path_end", "safe_remove" );
|
|
var_0 = cos( 65 );
|
|
var_1 = gettime() + randomintrange( 2000, 4000 );
|
|
|
|
while ( maps\_utility::either_player_looking_at( self.origin, var_0, 1 ) && gettime() < var_1 )
|
|
wait 0.05;
|
|
|
|
if ( !maps\_utility::either_player_looking_at( self.origin, var_0, 1 ) )
|
|
self delete();
|
|
else
|
|
{
|
|
wait( randomfloatrange( 0, 1 ) );
|
|
thread zodiac_death();
|
|
}
|
|
}
|
|
|
|
setup_fake_riders()
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_0 = spawn( "script_model", self.origin );
|
|
var_0 setmodel( "crr_zodiac_full" );
|
|
var_0.angles = self.angles;
|
|
var_0 linkto( self, "tag_body", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
self waittill( "death" );
|
|
var_0 delete();
|
|
}
|
|
|
|
convert_to_fake_riders()
|
|
{
|
|
if ( isdefined( self.script_parameters ) )
|
|
self.script_parameters = self.script_parameters + " no_riders";
|
|
else
|
|
self.script_parameters = " no_riders";
|
|
|
|
maps\_utility::array_delete( self.riders );
|
|
thread setup_fake_riders();
|
|
}
|
|
|
|
zodiac_wait_for_attack()
|
|
{
|
|
self endon( "death" );
|
|
|
|
while ( distance2dsquared( level.player.origin, self.origin ) > 9000000 )
|
|
wait 0.5;
|
|
|
|
maps\_vehicle::vehicle_ai_event( "attack" );
|
|
}
|
|
|
|
spawn_zodiac_rappel( var_0, var_1 )
|
|
{
|
|
foreach ( var_3 in level.zodiacs )
|
|
{
|
|
if ( isalive( var_3 ) && isdefined( var_3.saved_targetname ) && var_3.saved_targetname == var_0 )
|
|
return;
|
|
}
|
|
|
|
level.zodiacs = maps\_utility::array_removedead( level.zodiacs );
|
|
|
|
if ( level.zodiacs.size > 30 )
|
|
return;
|
|
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::zodiac_teleport_logic );
|
|
maps\_utility::array_spawn_function_targetname( var_0, maps\carrier_code::setup_target_on_vehicle );
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::zodiac_setup, 1 );
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::zodiac_rappel_logic, var_0, var_1 );
|
|
maps\_utility::array_spawn_function_targetname( var_0, ::setup_rope_coil );
|
|
var_3 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( var_0 );
|
|
var_3.saved_targetname = var_0;
|
|
level.zodiacs = common_scripts\utility::array_add( level.zodiacs, var_3 );
|
|
return var_3;
|
|
}
|
|
|
|
setup_rope_coil()
|
|
{
|
|
var_0 = self.origin + vectornormalize( anglestoforward( self.angles ) ) * 16 + ( 0, 0, 13 );
|
|
var_1 = spawn( "script_model", var_0 );
|
|
var_1 setmodel( "cnd_rope_rappel_coil_04" );
|
|
var_1.angles = self.angles + ( 0, 90, -5 );
|
|
var_1 linkto( self, "tag_body" );
|
|
self waittill( "death" );
|
|
var_1 delete();
|
|
}
|
|
|
|
zodiac_teleport_logic()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( self.script_noteworthy ) || !issubstr( self.script_noteworthy, "zodiac_teleport" ) )
|
|
return;
|
|
|
|
level.player common_scripts\utility::waittill_any( "using_depth_charge", "teleport_zodiacs" );
|
|
|
|
for ( var_0 = self.attachedpath; isdefined( var_0 ); var_0 = getvehiclenode( var_0.target, "targetname" ) )
|
|
{
|
|
if ( isdefined( var_0 ) && isdefined( var_0.script_noteworthy ) && var_0.script_noteworthy == "teleport" )
|
|
{
|
|
self vehicle_teleport( var_0.origin, var_0.angles );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
zodiac_rappel_logic( var_0, var_1 )
|
|
{
|
|
self waittill( "reached_dynamic_path_end" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_2 = common_scripts\utility::spawn_tag_origin();
|
|
var_2.angles = self.angles + ( -90, 0, 0 );
|
|
var_2.origin = self.origin - ( 0, 0, 4 );
|
|
var_2 linkto( self, "tag_origin" );
|
|
self.fx_idle = var_2;
|
|
playfxontag( level._effect["vfx_zodiac_splash_idle"], var_2, "tag_origin" );
|
|
thread kill_zodiac_fx_idle();
|
|
self.is_rappelling = 1;
|
|
self notify( "suspend_drive_anims" );
|
|
common_scripts\utility::waitframe();
|
|
self.idle_struct = spawnstruct();
|
|
self.idle_struct.origin = self.origin;
|
|
self.idle_struct.angles = self.angles;
|
|
self.idle_struct thread maps\_anim::anim_loop_solo( self, "carrier_rappel_defend_zodiac_idle_a" );
|
|
|
|
if ( !isdefined( self ) || !isalive( self ) )
|
|
return;
|
|
|
|
var_3 = common_scripts\utility::getstruct( var_0 + "_rappel", "targetname" );
|
|
var_4 = common_scripts\utility::getstruct( var_3.target, "targetname" );
|
|
self.ref_node = var_4;
|
|
|
|
if ( !isdefined( self.script_noteworthy ) || !issubstr( self.script_noteworthy, "zodiac_vista" ) )
|
|
level notify( "zodiacs_rappelling" );
|
|
|
|
var_5 = setup_rope( var_4 );
|
|
thread cleanup_rope_on_zodiac_death( var_5 );
|
|
var_6 = [ 2, 1, 3, 0 ];
|
|
|
|
for ( var_7 = 0; var_7 < var_6.size; var_7++ )
|
|
{
|
|
var_8 = get_rider_by_position( var_6[var_7] );
|
|
|
|
if ( isdefined( var_8 ) && isalive( var_8 ) )
|
|
{
|
|
if ( !isdefined( var_5 ) || isdefined( var_5.iscutdown ) && var_5.iscutdown )
|
|
continue;
|
|
|
|
if ( !isalive( var_8 ) || maps\carrier_code::eval( var_8.dead ) )
|
|
continue;
|
|
|
|
var_8 thread rappel( var_4, var_5, var_7, var_1 );
|
|
self.rappellers = common_scripts\utility::array_add( self.rappellers, var_8 );
|
|
var_5.rappellers = common_scripts\utility::array_add( var_5.rappellers, var_8 );
|
|
|
|
if ( var_7 == var_6.size - 1 )
|
|
break;
|
|
|
|
var_5 common_scripts\utility::waittill_any( "next_rappeller", "cut" );
|
|
|
|
if ( ( !isdefined( self ) || !isalive( self ) ) && isdefined( var_5 ) )
|
|
{
|
|
var_5 notify( "rappel_done" );
|
|
return;
|
|
}
|
|
else if ( isdefined( var_5 ) && maps\carrier_code::eval( var_5.iscutdown ) )
|
|
{
|
|
wait 3;
|
|
thread zodiac_death();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
get_rider_by_position( var_0 )
|
|
{
|
|
foreach ( var_2 in self.riders )
|
|
{
|
|
if ( var_2.vehicle_position == var_0 )
|
|
return var_2;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
drone_init_zodiac()
|
|
{
|
|
if ( level.drones[self.team].array.size >= level.max_drones[self.team] )
|
|
{
|
|
self delete();
|
|
return;
|
|
}
|
|
|
|
thread maps\_drone::drone_array_handling( self );
|
|
self setcandamage( 1 );
|
|
self startusingheroonlylighting();
|
|
thread maps\_drone::drone_death_thread();
|
|
}
|
|
|
|
kill_zodiac_fx_idle()
|
|
{
|
|
var_0 = self.fx_idle;
|
|
self waittill( "death" );
|
|
stopfxontag( level._effect["vfx_zodiac_splash_idle"], var_0, "tag_origin" );
|
|
wait 2.0;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
maps\_utility::deleteent( var_0 );
|
|
}
|
|
|
|
cleanup_rope_on_zodiac_death( var_0 )
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
if ( isdefined( var_0.static ) )
|
|
maps\_utility::deleteent( var_0.static );
|
|
|
|
self.ref_node cut_rope_anim( var_0 );
|
|
}
|
|
}
|
|
|
|
spawn_fake_zodiacs( var_0, var_1 )
|
|
{
|
|
if ( var_1 == 0 )
|
|
{
|
|
|
|
}
|
|
|
|
var_2 = common_scripts\utility::getstructarray( var_0, "targetname" );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
var_5 = spawn_fake_zodiac( var_4 );
|
|
var_5.speed = var_1;
|
|
var_5 thread fake_zodiac_setup();
|
|
}
|
|
}
|
|
|
|
spawn_fake_zodiac( var_0 )
|
|
{
|
|
var_1 = spawn( "script_model", var_0.origin );
|
|
var_1 setmodel( "vehicle_zodiac_boat_fed_iw6" );
|
|
var_1.angles = var_0.angles;
|
|
var_1.dest = common_scripts\utility::getstruct( var_0.target, "targetname" );
|
|
var_1.angles = vectortoangles( var_1.dest.origin - var_1.origin );
|
|
return var_1;
|
|
}
|
|
|
|
fake_zodiac_setup()
|
|
{
|
|
var_0 = 17.6;
|
|
self.fake = 1;
|
|
level.fake_targets = common_scripts\utility::array_removeundefined( level.fake_targets );
|
|
level.fake_targets = common_scripts\utility::array_add( level.fake_targets, self );
|
|
var_1 = distance( self.origin, self.dest.origin );
|
|
var_2 = var_1 / ( self.speed * var_0 );
|
|
self moveto( self.dest.origin, var_2 );
|
|
self.animname = "zodiac";
|
|
maps\_anim::setanimtree();
|
|
thread fake_zodiac_move_anim();
|
|
thread delete_fake_zodiac( var_2 );
|
|
thread setup_fake_riders();
|
|
thread zodiac_treadfx();
|
|
thread maps\carrier_fx::handle_zodiac_propeller();
|
|
thread maps\carrier_code::do_notetracks( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_moving"][0], "impact_front_both" );
|
|
}
|
|
|
|
fake_zodiac_move_anim()
|
|
{
|
|
self setanim( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_moving"][0], 1, 0.05, self.speed / 20 );
|
|
self setanimtime( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_moving"][0], randomfloat( 1 ) );
|
|
}
|
|
|
|
delete_fake_zodiac( var_0 )
|
|
{
|
|
wait( var_0 );
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
|
|
is_fake_zodiac()
|
|
{
|
|
return isdefined( self ) && isdefined( self.fake );
|
|
}
|
|
|
|
zodiac_rider_logic( var_0 )
|
|
{
|
|
self.allowdeath = 1;
|
|
self.dropweapon = 0;
|
|
self.nodrop = 1;
|
|
self.grenadeammo = 0;
|
|
self.health = int( self.health / 2 );
|
|
self.actual_health = self.health;
|
|
self.health = self.health * 2;
|
|
|
|
if ( maps\carrier_code::is_drone() )
|
|
{
|
|
self.script = "drone";
|
|
give_weaponsound();
|
|
thread drone_init_zodiac();
|
|
|
|
if ( randomint( 100 ) > 80 )
|
|
self.use_ak12 = 1;
|
|
}
|
|
|
|
thread zodiac_rider_death();
|
|
|
|
if ( isdefined( self.spawner ) && isdefined( self.script_spawn_once ) )
|
|
self.spawner delete();
|
|
}
|
|
|
|
give_weaponsound()
|
|
{
|
|
self.weaponsound = undefined;
|
|
var_0 = randomintrange( 1, 4 );
|
|
|
|
if ( var_0 == 1 )
|
|
self.weaponsound = "drone_ak12_fire_npc";
|
|
else if ( var_0 == 2 )
|
|
self.weaponsound = "drone_cz805_fire_npc";
|
|
|
|
if ( var_0 == 3 )
|
|
self.weaponsound = "drone_cbjms_fire_npc";
|
|
}
|
|
|
|
rider_attack( var_0, var_1 )
|
|
{
|
|
var_0 endon( "newanim" );
|
|
self endon( "death" );
|
|
var_0 endon( "death" );
|
|
var_0 endon( "start_rappel" );
|
|
var_0 endon( "fully_stop_firing" );
|
|
level endon( "defend_zodiac_finished" );
|
|
|
|
if ( !var_0 maps\carrier_code::is_drone() || isdefined( var_0.rope ) || maps\carrier_code::eval( var_0.dontfire ) )
|
|
return;
|
|
|
|
var_2 = maps\_vehicle_aianim::anim_pos( self, var_1 );
|
|
wait( var_1 * randomfloatrange( 2, 4 ) );
|
|
|
|
for (;;)
|
|
{
|
|
maps\_vehicle_aianim::animontag( var_0, var_2.sittag, var_2.enter );
|
|
|
|
if ( issubstr( var_0.weapon, "panzerfaust" ) )
|
|
var_0 thread zodiac_drone_fire_rpg();
|
|
else
|
|
var_0 thread zodiac_drone_fire();
|
|
|
|
for ( var_3 = 0; var_3 < randomintrange( 1, 3 ); var_3++ )
|
|
maps\_vehicle_aianim::animontag( var_0, var_2.sittag, var_2.loop );
|
|
|
|
var_0 notify( "stop_firing" );
|
|
maps\_vehicle_aianim::animontag( var_0, var_2.sittag, var_2.exit );
|
|
wait( randomfloatrange( 3, 6 ) );
|
|
}
|
|
}
|
|
|
|
rider_attack_check( var_0, var_1 )
|
|
{
|
|
return isdefined( maps\_vehicle_aianim::anim_pos( self, var_1 ).enter ) && isdefined( maps\_vehicle_aianim::anim_pos( self, var_1 ).loop ) && isdefined( maps\_vehicle_aianim::anim_pos( self, var_1 ).exit );
|
|
}
|
|
|
|
zodiac_drone_fire()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "start_rappel" );
|
|
self endon( "stop_firing" );
|
|
self endon( "fully_stop_firing" );
|
|
level endon( "defend_zodiac_finished" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = randomintrange( 20, 30 );
|
|
|
|
for ( var_1 = 0; var_1 < var_0; var_1++ )
|
|
{
|
|
drone_shoot();
|
|
wait 0.1;
|
|
}
|
|
|
|
wait( randomfloatrange( 2, 4 ) );
|
|
}
|
|
}
|
|
|
|
zodiac_drone_fire_rpg()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "start_rappel" );
|
|
self endon( "stop_firing" );
|
|
self endon( "fully_stop_firing" );
|
|
level endon( "defend_zodiac_finished" );
|
|
|
|
for (;;)
|
|
{
|
|
drone_shoot_rpg();
|
|
wait( randomfloatrange( 3, 5 ) );
|
|
}
|
|
}
|
|
|
|
drone_shoot()
|
|
{
|
|
self endon( "start_rappel" );
|
|
level endon( "defend_zodiac_finished" );
|
|
var_0 = 0;
|
|
var_1 = level.difficultysettings["zodiac_rider_playerHitRatio"][maps\_gameskill::get_skill_from_index( level.gameskill )];
|
|
|
|
if ( isdefined( self.player_hit_ratio_override ) )
|
|
var_1 = self.player_hit_ratio_override;
|
|
|
|
var_2 = 10 - var_1;
|
|
var_3 = self gettagorigin( "tag_flash" );
|
|
|
|
if ( randomfloat( 100 ) < var_1 && !common_scripts\utility::flag( "gunship_attack" ) && distance2dsquared( level.player.origin, self.origin ) < 6250000 )
|
|
{
|
|
var_4 = level.player getshootatpos();
|
|
var_0 = 1;
|
|
return;
|
|
}
|
|
else if ( randomfloat( 100 ) < var_2 )
|
|
{
|
|
var_5 = level.player getplayerangles();
|
|
var_6 = vectornormalize( anglestoright( var_5 ) );
|
|
var_7 = common_scripts\utility::randomvectorrange( 50, 100 );
|
|
var_8 = var_6 * var_7;
|
|
var_4 = level.player getshootatpos() + var_8;
|
|
var_0 = 1;
|
|
}
|
|
else
|
|
var_4 = var_3 + anglestoforward( self gettagangles( "tag_flash" ) ) * 5000;
|
|
|
|
if ( var_0 )
|
|
{
|
|
if ( !isdefined( self.weapon ) || isdefined( self.use_ak12 ) )
|
|
magicbullet( "ak12", var_3, var_4 );
|
|
else
|
|
magicbullet( self.weapon, var_3, var_4 );
|
|
|
|
drone_shoot_fx();
|
|
}
|
|
else
|
|
drone_shoot_fx( 1 );
|
|
}
|
|
|
|
drone_shoot_fx( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::getfx( "ak47_muzzleflash" );
|
|
|
|
if ( maps\carrier_code::eval( var_0 ) )
|
|
{
|
|
var_2 = 10;
|
|
|
|
if ( randomint( 100 ) < var_2 )
|
|
var_1 = common_scripts\utility::getfx( "drone_tracer" );
|
|
}
|
|
|
|
playfxontag( var_1, self, "tag_flash" );
|
|
}
|
|
|
|
drone_shoot_rpg()
|
|
{
|
|
var_0 = anglestoforward( self gettagangles( "tag_flash" ) ) * 5000 + ( 0, 0, 1000 );
|
|
magicbullet( "panzerfaust3_cheap", self gettagorigin( "tag_flash" ) + ( 0, 0, 8 ), var_0 );
|
|
}
|
|
|
|
zodiac_rider_death()
|
|
{
|
|
self endon( "start_rappel" );
|
|
self endon( "explode" );
|
|
self endon( "rappel_death" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isai( self ) )
|
|
self.a.nodeath = 1;
|
|
|
|
self.deathanim = undefined;
|
|
self.skipdeathanim = 1;
|
|
self.damageshield = 1;
|
|
|
|
for ( var_0 = 0; isdefined( self ) && self.actual_health > 0; self.actual_health = self.actual_health - var_1 )
|
|
self waittill( "damage", var_1, var_2, var_3, var_4, var_5 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( self.vehicle_position != 0 )
|
|
self.ridingvehicle.corpses = common_scripts\utility::array_add( self.ridingvehicle.corpses, self );
|
|
|
|
self notify( "fully_stop_firing" );
|
|
var_6 = get_rider_death_anim();
|
|
thread maps\_anim::anim_generic( self, var_6 );
|
|
|
|
if ( isdefined( self.ridingvehicle ) && isdefined( self.ridingvehicle.riders ) )
|
|
self.ridingvehicle.riders = common_scripts\utility::array_remove( self.ridingvehicle.riders, self );
|
|
|
|
if ( var_6 == "carrier_rappel_defend_death_zodiac_b" )
|
|
{
|
|
self.animname = "generic";
|
|
maps\_anim::anim_set_rate_single( self, "carrier_rappel_defend_death_zodiac_b", 1.5 );
|
|
}
|
|
|
|
if ( var_6 == "carrier_rappel_defend_death_zodiac_c" )
|
|
{
|
|
self waittillmatch( "single anim", "end" );
|
|
self.dead = 1;
|
|
self.ridingvehicle waittill( "death" );
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
|
|
return;
|
|
}
|
|
|
|
level.corpse_entnums = common_scripts\utility::array_add( level.corpse_entnums, self getentitynumber() );
|
|
thread splash_on_hit_water();
|
|
self.dead = 1;
|
|
self waittillmatch( "single anim", "end" );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
if ( self.vehicle_position == 0 )
|
|
{
|
|
wait 1;
|
|
self delete();
|
|
}
|
|
else
|
|
self kill();
|
|
}
|
|
}
|
|
|
|
get_rider_death_anim()
|
|
{
|
|
var_0 = [ "carrier_rappel_defend_death_zodiac_a", "carrier_rappel_defend_death_zodiac_b" ];
|
|
|
|
if ( self.vehicle_position == 1 || self.vehicle_position == 3 )
|
|
var_0 = common_scripts\utility::array_add( var_0, "carrier_rappel_defend_death_zodiac_c" );
|
|
|
|
if ( isdefined( self.ridingvehicle ) && isdefined( self.ridingvehicle.is_rappelling ) )
|
|
{
|
|
if ( self.vehicle_position == 1 || self.vehicle_position == 3 )
|
|
return "carrier_rappel_defend_death_zodiac_c";
|
|
|
|
return "carrier_rappel_defend_death_zodiac_b";
|
|
}
|
|
else
|
|
return var_0[randomint( var_0.size )];
|
|
}
|
|
|
|
zodiac_waittill_death()
|
|
{
|
|
self endon( "zodiac_exploded" );
|
|
self endon( "zodiac_death" );
|
|
self.corpses = [];
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( self.script_parameters ) && issubstr( self.script_parameters, "no_riders" ) )
|
|
return;
|
|
|
|
if ( self.riders.size == 0 && array_removedead_zodiac( self.rappellers ).size == 0 )
|
|
{
|
|
thread zodiac_death();
|
|
return;
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
array_removedead_zodiac( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
return [];
|
|
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( !isalive( var_3 ) || maps\carrier_code::eval( var_3.dead ) )
|
|
continue;
|
|
|
|
var_1[var_1.size] = var_3;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
zodiac_death()
|
|
{
|
|
self endon( "zodiac_exploded" );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
self notify( "zodiac_death" );
|
|
|
|
if ( randomint( 100 ) > 40 && self vehicle_getspeed() >= 20 )
|
|
{
|
|
thread zodiac_flipdeath();
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( self.rappellers ) )
|
|
{
|
|
thread zodiac_dockeddeath();
|
|
return;
|
|
}
|
|
|
|
self notify( "suspend_drive_anims" );
|
|
self setanimknoball( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_death_parked"], %root );
|
|
var_0 = 0.75;
|
|
self setanimtime( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_death_parked"], var_0 );
|
|
wait 0.2;
|
|
playfxontag( common_scripts\utility::getfx( "vfx_zodiac_splash_sink" ), self, "tag_fx_rf" );
|
|
wait( ( 1 - var_0 ) * getanimlength( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_death_parked"] ) - 0.15 );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self kill();
|
|
common_scripts\utility::waitframe();
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
zodiac_flipdeath()
|
|
{
|
|
self endon( "zodiac_exploded" );
|
|
wait( randomfloatrange( 0.2, 0.4 ) );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self notify( "suspend_drive_anims" );
|
|
self setanim( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_death_flip"] );
|
|
wait( getanimlength( level.scr_anim["zodiac"]["carrier_rappel_defend_zodiac_death_flip"] ) );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self kill();
|
|
common_scripts\utility::waitframe();
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
zodiac_dockeddeath()
|
|
{
|
|
if ( isdefined( self.rope ) )
|
|
self.rope notify( "rappel_done" );
|
|
|
|
wait( randomfloatrange( 0.5, 2 ) );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
foreach ( var_1 in self.corpses )
|
|
{
|
|
if ( isdefined( var_1 ) && !var_1 isragdoll() )
|
|
var_1 linkto( self, "tag_body" );
|
|
}
|
|
|
|
maps\_anim::anim_single_solo( self, "carrier_rappel_defend_zodiac_death_parked" );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self kill();
|
|
common_scripts\utility::waitframe();
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
explode_zodiacs( var_0, var_1, var_2 )
|
|
{
|
|
level.zodiacs = maps\_utility::array_removedead( level.zodiacs );
|
|
level.zodiacs = sortbydistance( level.zodiacs, var_0 );
|
|
var_3 = [];
|
|
|
|
foreach ( var_5 in level.zodiacs )
|
|
{
|
|
if ( isdefined( var_5 ) )
|
|
{
|
|
var_6 = distance( var_5.origin, var_0 );
|
|
|
|
if ( var_6 <= var_1 )
|
|
{
|
|
var_3 = common_scripts\utility::array_add( var_3, var_5 );
|
|
var_5.dist = var_6;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
if ( isdefined( var_5 ) )
|
|
{
|
|
level.osprey_hit_zodiacs++;
|
|
level.osprey_total_hits++;
|
|
var_6 = clamp( var_5.dist, var_2, var_1 );
|
|
var_9 = 1 - ( var_6 - var_2 ) / ( var_1 - var_2 );
|
|
var_5 thread explode_single_zodiac( var_9, var_0 );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
}
|
|
|
|
explode_single_zodiac( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( self ) || maps\carrier_code::eval( self.is_exploding ) )
|
|
return;
|
|
|
|
self.is_exploding = 1;
|
|
|
|
if ( isdefined( level.player.using_depth_charge ) && level.player.using_depth_charge )
|
|
level.player thread maps\carrier_depth_charge::depth_charge_weapon_hit();
|
|
|
|
self notify( "zodiac_exploded" );
|
|
thread launch_ragdolls_zodiac( var_0 );
|
|
cleanup_corpses_on_explode();
|
|
thread common_scripts\utility::play_sound_in_space( "scn_carr_sparrow_exp", var_1 );
|
|
var_2 = spawn( "script_model", self.origin );
|
|
var_2 setmodel( "vehicle_zodiac_boat_fed_iw6" );
|
|
var_2.angles = self.angles;
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
|
|
var_3 = 100;
|
|
var_4 = 400;
|
|
var_5 = var_3 + var_0 * ( var_4 - var_3 );
|
|
var_6 = var_2.origin;
|
|
var_7 = 4 * vectornormalize( var_6 - var_1 );
|
|
var_8 = 1.5 * ( 1 + var_0 );
|
|
var_8 = int( var_8 * 20 ) / 20;
|
|
var_9 = var_6 + var_7 * var_5 - ( 0, 0, 200 );
|
|
var_2 maps\_utility::delaythread( var_8 / 2, ::splash_on_hit_water_zodiac );
|
|
var_2 rotatevelocity( common_scripts\utility::randomvectorrange( 100, 200 ), var_8, 0, var_8 / 2 );
|
|
var_2 move_arc_zodiac( var_6, var_9, var_6[2] + var_5, var_8 );
|
|
var_2 delete();
|
|
}
|
|
|
|
cleanup_corpses_on_explode()
|
|
{
|
|
if ( !isdefined( self.corpses ) )
|
|
return;
|
|
|
|
foreach ( var_1 in self.corpses )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
var_1 delete();
|
|
}
|
|
}
|
|
|
|
move_arc_zodiac( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "deleted" );
|
|
var_4 = 5;
|
|
var_5 = 0.2;
|
|
var_6 = 0.7;
|
|
var_7 = maps\carrier_code::calculate_arc( var_0, var_1, var_2, var_4 );
|
|
|
|
foreach ( var_11, var_9 in var_7 )
|
|
{
|
|
if ( var_11 < 1 )
|
|
continue;
|
|
|
|
var_10 = var_5 + var_11 / var_4 * ( var_6 - var_5 );
|
|
self moveto( var_9, var_10 );
|
|
wait( var_10 );
|
|
}
|
|
}
|
|
|
|
splash_on_hit_water_zodiac()
|
|
{
|
|
while ( isdefined( self ) && self.origin[2] > level.water_level + 8 )
|
|
wait 0.05;
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
var_0 = self.origin;
|
|
var_0 = ( var_0[0], var_0[1], level.water_level );
|
|
playfx( common_scripts\utility::getfx( "vfx_zodiac_water_splash" ), var_0 );
|
|
}
|
|
}
|
|
|
|
launch_ragdolls_zodiac( var_0 )
|
|
{
|
|
var_1 = getspawnerteamarray( "axis" );
|
|
var_2 = [];
|
|
var_3 = 12;
|
|
|
|
foreach ( var_5 in var_1 )
|
|
{
|
|
if ( !maps\carrier_code::eval( var_5.script_drone ) )
|
|
{
|
|
var_2[var_2.size] = var_5;
|
|
|
|
if ( var_2.size >= var_3 )
|
|
break;
|
|
}
|
|
}
|
|
|
|
var_7 = self.origin + ( 0, 0, 32 );
|
|
var_8 = randomintrange( 2, 3 );
|
|
|
|
if ( maps\_vehicle::isvehicle() )
|
|
{
|
|
foreach ( var_10 in self.riders )
|
|
{
|
|
var_10.noragdoll = 1;
|
|
var_10 notify( "explode" );
|
|
var_10 delete();
|
|
}
|
|
}
|
|
|
|
var_12 = randomint( var_2.size );
|
|
|
|
for ( var_13 = 0; var_13 < var_8; var_13++ )
|
|
{
|
|
var_14 = 60 * ( randomfloatrange( 50, 100 ) + 150 * var_0 );
|
|
var_15 = var_2[var_12];
|
|
var_16 = var_15.count;
|
|
|
|
if ( var_16 <= 0 )
|
|
var_15.count = 1;
|
|
|
|
var_17 = var_15 stalingradspawn();
|
|
|
|
if ( !isdefined( var_17 ) )
|
|
continue;
|
|
|
|
var_15.count = var_16;
|
|
|
|
if ( var_12 >= var_2.size - 1 )
|
|
var_12 = 0;
|
|
else
|
|
var_12++;
|
|
|
|
var_17 forceteleport( var_7 );
|
|
var_18 = ( randomfloatrange( -10000, 10000 ), randomfloatrange( -10000, 10000 ), var_14 );
|
|
var_17 kill();
|
|
var_17 startragdollfromimpact( "torso_lower", var_18 );
|
|
level.corpse_entnums = common_scripts\utility::array_add( level.corpse_entnums, var_17 getentitynumber() );
|
|
}
|
|
}
|
|
|
|
zodiac_treadfx()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = 0;
|
|
var_1 = 4;
|
|
|
|
for (;;)
|
|
{
|
|
if ( maps\_vehicle::isvehicle() )
|
|
var_2 = self vehicle_getspeed();
|
|
else
|
|
var_2 = self.speed;
|
|
|
|
if ( var_2 < var_1 && var_0 )
|
|
{
|
|
stopfxontag( common_scripts\utility::getfx( "zodiac_wake_geotrail" ), self, "tag_motor_fx" );
|
|
var_0 = 0;
|
|
}
|
|
else if ( var_2 >= var_1 && !var_0 )
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "zodiac_wake_geotrail" ), self, "tag_motor_fx" );
|
|
var_0 = 1;
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
setup_rope( var_0 )
|
|
{
|
|
var_1 = maps\_utility::spawn_anim_model( "rope" );
|
|
self.rope = var_1;
|
|
self.rappellers = [];
|
|
var_1.rappellers = [];
|
|
var_0 thread maps\_anim::anim_first_frame_solo( var_1, "carrier_rappel_defend_rope_shoot" );
|
|
var_1 hide();
|
|
var_1.shot = 0;
|
|
return var_1;
|
|
}
|
|
|
|
shoot_rope( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "deleted" );
|
|
self.shot = 1;
|
|
|
|
if ( maps\carrier_code::eval( var_1 ) )
|
|
{
|
|
self show();
|
|
var_0 thread maps\_anim::anim_last_frame_solo( self, "carrier_rappel_defend_rope_shoot" );
|
|
}
|
|
else
|
|
{
|
|
self show();
|
|
var_0 thread rope_sound();
|
|
var_0 maps\_anim::anim_single_solo( self, "carrier_rappel_defend_rope_shoot" );
|
|
}
|
|
|
|
self hide();
|
|
self.static = spawn( "script_model", var_0.origin );
|
|
self.static setmodel( "crr_assault_rope_static" );
|
|
self.static.angles = var_0.angles;
|
|
thread run_cut_rope( var_0 );
|
|
self waittill( "rappel_done" );
|
|
|
|
if ( isdefined( self ) && !self.iscutdown )
|
|
var_0 cut_rope_anim( self );
|
|
}
|
|
|
|
rope_sound()
|
|
{
|
|
thread common_scripts\utility::play_sound_in_space( "scn_carr_boarding_hook", self.origin - ( 0, 0, 400 ) );
|
|
}
|
|
|
|
cleanup_rope()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
level.cut_ropes = common_scripts\utility::array_removeundefined( level.cut_ropes );
|
|
|
|
if ( level.cut_ropes.size > 3 )
|
|
{
|
|
level.cut_ropes = sortbydistance( level.cut_ropes, level.player.origin );
|
|
level.cut_ropes[level.cut_ropes.size - 1] delete();
|
|
}
|
|
|
|
maps\carrier_code::waittill_player_not_looking( 1 );
|
|
self delete();
|
|
}
|
|
|
|
rappel( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "rappel_enter_death" );
|
|
self.rope = var_1;
|
|
self.ref_node = var_0;
|
|
self notify( "start_rappel" );
|
|
self.animname = "generic";
|
|
self.health = self.health * 2;
|
|
self.actual_health = self.actual_health * 2;
|
|
thread rappel_enter_death();
|
|
thread rappel_enter( var_0 );
|
|
|
|
if ( !self.rope.shot && self.vehicle_position == 2 )
|
|
{
|
|
self waittillmatch( "single anim", "rope_spawn" );
|
|
|
|
if ( !isdefined( self ) || !isdefined( self.rope ) )
|
|
return;
|
|
|
|
self.rope thread shoot_rope( var_0, var_3 );
|
|
}
|
|
|
|
self waittillmatch( "single anim", "gen_prop_start" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self.rope_prop = rope_prop_anim( var_0 );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
self notify( "rappel_enter_finished" );
|
|
thread rappel_idle( var_0 );
|
|
var_1 thread rope_cut_death( self, var_2 );
|
|
thread rappel_pain();
|
|
thread rappel_death();
|
|
var_4 = getanimlength( level.scr_anim["rope_prop"]["carrier_rappel_defend_ascend_prop"] );
|
|
thread fire_from_rope_or_die( var_0, var_4 );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
}
|
|
|
|
rappel_enter( var_0 )
|
|
{
|
|
var_1 = "carrier_rappel_defend_ascend_enter_" + self.vehicle_position;
|
|
var_2 = "carrier_rappel_defend_ascend_enter_2";
|
|
self unlink();
|
|
|
|
if ( isdefined( self.ridingvehicle.riders ) )
|
|
self.ridingvehicle.riders = common_scripts\utility::array_remove( self.ridingvehicle.riders, self );
|
|
|
|
if ( !self.rope.shot && self.vehicle_position == 2 )
|
|
{
|
|
if ( isdefined( self.ridingvehicle ) && isalive( self.ridingvehicle.riders[1] ) )
|
|
{
|
|
self.ridingvehicle.riders[1].dontfire = 1;
|
|
self.ridingvehicle.riders[1] notify( "fully_stop_firing" );
|
|
}
|
|
|
|
var_0 thread maps\_anim::anim_generic( self, var_2 );
|
|
self.launcher = maps\_utility::spawn_anim_model( "launcher" );
|
|
thread cleanup_launcher();
|
|
var_0 thread maps\_anim::anim_single_solo( self.launcher, "carrier_rappel_defend_ascend_enter_launcher" );
|
|
self waittillmatch( "single anim", "delete_launcher" );
|
|
|
|
if ( isalive( self ) && isdefined( self.launcher ) )
|
|
self.launcher delete();
|
|
}
|
|
else
|
|
{
|
|
var_3 = self.ridingvehicle;
|
|
var_4 = var_3 vehicle_get_idle_pos( self.vehicle_position );
|
|
var_4 thread maps\_anim::anim_generic( self, var_1 );
|
|
}
|
|
}
|
|
|
|
cleanup_launcher()
|
|
{
|
|
common_scripts\utility::waittill_any( "death", "enter_death" );
|
|
|
|
if ( isdefined( self.launcher ) )
|
|
self.launcher delete();
|
|
}
|
|
|
|
vehicle_get_idle_pos( var_0 )
|
|
{
|
|
var_1 = maps\_vehicle_aianim::anim_pos( self, var_0 );
|
|
var_2 = spawnstruct();
|
|
var_3 = undefined;
|
|
var_4 = undefined;
|
|
var_5 = self gettagorigin( var_1.sittag );
|
|
var_6 = self gettagangles( var_1.sittag );
|
|
var_3 = getstartorigin( var_5, var_6, var_1.idle );
|
|
var_4 = getstartangles( var_5, var_6, var_1.idle );
|
|
var_2.origin = var_3;
|
|
var_2.angles = var_4;
|
|
var_2.vehicle_position = var_0;
|
|
return var_2;
|
|
}
|
|
|
|
rope_prop_anim( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = maps\_utility::spawn_anim_model( "rope_prop" );
|
|
var_1.origin = var_0.origin;
|
|
var_1.angles = var_0.angles;
|
|
self.ascender = maps\_utility::spawn_anim_model( "ascender" );
|
|
self.ascender hide();
|
|
self.ascender linkto( var_1, "j_prop_1", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
thread drop_ascender();
|
|
self.ascender common_scripts\utility::delaycall( 0.2, ::show );
|
|
var_0 thread maps\_anim::anim_single_solo( var_1, "carrier_rappel_defend_ascend_prop" );
|
|
var_2 = getanimlength( level.scr_anim["rope_prop"]["carrier_rappel_defend_ascend_prop"] );
|
|
maps\_utility::delaythread( 0.05, maps\_anim::anim_set_time, [ var_1 ], "carrier_rappel_defend_ascend_prop", 0.5 / var_2 );
|
|
common_scripts\utility::waitframe();
|
|
maps\_anim::anim_set_rate_single( var_1, "carrier_rappel_defend_ascend_prop", 0 );
|
|
common_scripts\utility::waitframe();
|
|
var_1.attach_point = common_scripts\utility::spawn_tag_origin();
|
|
var_1.attach_point.origin = self.origin;
|
|
var_1.attach_point.angles = self.angles;
|
|
self linkto( var_1.attach_point, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
var_1.attach_point moveto( var_1 gettagorigin( "j_prop_2" ), 0.4 );
|
|
wait 0.45;
|
|
var_1.attach_point delete();
|
|
maps\_anim::anim_set_rate_single( var_1, "carrier_rappel_defend_ascend_prop", 1 );
|
|
self linkto( var_1, "j_prop_2", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
return var_1;
|
|
}
|
|
|
|
debug_j_prop( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
thread common_scripts\utility::draw_line_for_time( self gettagorigin( "j_prop_2" ), level.player.origin, 0, 0, 1, 0.05 );
|
|
thread common_scripts\utility::draw_line_for_time( var_0 gettagorigin( "tag_origin" ), level.player.origin, 1, 1, 0, 0.05 );
|
|
|
|
if ( isdefined( self.attach_point ) )
|
|
thread common_scripts\utility::draw_line_for_time( self.attach_point gettagorigin( "tag_origin" ), level.player.origin, 1, 0, 0, 0.05 );
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
drop_ascender()
|
|
{
|
|
var_0 = self.ascender;
|
|
var_0 endon( "death" );
|
|
|
|
if ( isdefined( self.rope ) && !maps\carrier_code::eval( self.rope.iscutdown ) )
|
|
{
|
|
var_1 = common_scripts\utility::waittill_any_return( "death", "cut", "rappel_death", "land_on_zodiac_death", "rappel_enter_death" );
|
|
|
|
if ( var_1 == "rappel_enter_death" )
|
|
{
|
|
var_0 delete();
|
|
return;
|
|
}
|
|
else if ( var_1 == "cut" || !isdefined( self.rope ) || maps\carrier_code::eval( self.rope.iscutdown ) )
|
|
{
|
|
|
|
}
|
|
else
|
|
wait( randomfloatrange( 1, 2 ) );
|
|
}
|
|
|
|
var_0 unlink();
|
|
var_0 rotatevelocity( ( randomfloatrange( -200, 200 ), randomfloatrange( -200, 200 ), randomfloatrange( -200, 200 ) ), 2, 2 );
|
|
var_0 moveto( var_0.origin - ( 0, 0, 680 ), 2, 2 );
|
|
wait 2;
|
|
var_0 delete();
|
|
}
|
|
|
|
rappel_idle( var_0 )
|
|
{
|
|
if ( isalive( self ) && isdefined( self.rope ) )
|
|
{
|
|
var_1 = [ "carrier_rappel_defend_ascend_a", "carrier_rappel_defend_ascend_b" ];
|
|
thread maps\_anim::anim_loop_solo( self, var_1[randomint( var_1.size )], "stop_loop" );
|
|
}
|
|
}
|
|
|
|
fire_from_rope_or_die( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "rappel_death" );
|
|
var_2 = 30;
|
|
var_3 = 10;
|
|
var_4 = 30;
|
|
var_5 = 30;
|
|
var_6 = randomint( 100 );
|
|
var_7 = 3;
|
|
var_8 = var_1 - 2;
|
|
var_9 = 2;
|
|
var_10 = randomfloatrange( var_7, var_8 );
|
|
wait( var_10 );
|
|
|
|
if ( var_6 < var_2 )
|
|
{
|
|
rappel_kill();
|
|
return;
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) || !isdefined( self.rope_prop ) )
|
|
return;
|
|
|
|
self notify( "stop_loop" );
|
|
maps\_anim::anim_set_rate_single( self.rope_prop, "carrier_rappel_defend_ascend_prop", 0 );
|
|
var_11 = distance( level.player.origin, self.origin );
|
|
var_11 = clamp( var_11, 200, 600 );
|
|
var_12 = 1 - ( var_11 - 200 ) / 400;
|
|
var_13 = level.difficultysettings["rappeler_playerHitRatio"][maps\_gameskill::get_skill_from_index( level.gameskill )];
|
|
self.player_hit_ratio_override = var_13 + var_13 * var_12;
|
|
|
|
if ( var_6 < var_2 + var_3 )
|
|
{
|
|
maps\_anim::anim_generic( self, "carrier_rappel_defend_ascend_fire_enter" );
|
|
thread maps\_anim::anim_generic_loop( self, "carrier_rappel_defend_ascend_fire_idle" );
|
|
wait( randomfloatrange( 6, 8 ) );
|
|
self notify( "stop_loop" );
|
|
maps\_anim::anim_generic( self, "carrier_rappel_defend_ascend_fire_exit" );
|
|
}
|
|
else if ( var_6 < var_2 + var_3 + var_4 )
|
|
maps\_anim::anim_generic( self, "carrier_rappel_defend_ascend_fire_a" );
|
|
else if ( var_6 < var_2 + var_3 + var_4 + var_5 )
|
|
maps\_anim::anim_generic( self, "carrier_rappel_defend_ascend_fire_b" );
|
|
|
|
if ( !isdefined( self.rope_prop ) )
|
|
{
|
|
rappel_kill();
|
|
return;
|
|
}
|
|
|
|
var_14 = self.rope_prop getanimtime( level.scr_anim["rope_prop"]["carrier_rappel_defend_ascend_prop"] );
|
|
var_15 = var_14 * var_1;
|
|
var_16 = max( var_8 - var_15, 0 );
|
|
var_10 = randomfloat( var_16 );
|
|
maps\_anim::anim_set_rate_single( self.rope_prop, "carrier_rappel_defend_ascend_prop", 1 );
|
|
thread rappel_idle( var_0 );
|
|
wait( var_10 );
|
|
rappel_kill();
|
|
}
|
|
}
|
|
|
|
rappel_pain()
|
|
{
|
|
self endon( "end_rappel" );
|
|
self endon( "death" );
|
|
self endon( "rappel_death" );
|
|
var_0 = [ "carrier_rappel_defend_pain_rope_left", "carrier_rappel_defend_pain_rope_mid", "carrier_rappel_defend_pain_rope_right" ];
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "rappel_pain" );
|
|
self stopanimscripted();
|
|
thread maps\_anim::anim_generic( self, var_0[randomint( var_0.size )] );
|
|
}
|
|
}
|
|
|
|
rappel_exit( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self notify( "end_rappel" );
|
|
var_4 = [ "carrier_rappel_defend_ascend_exit_straight", "carrier_rappel_defend_ascend_exit_left", "carrier_rappel_defend_ascend_exit_right" ];
|
|
self unlink();
|
|
|
|
if ( isdefined( var_1 ) && var_1 > 0 )
|
|
{
|
|
if ( isai( self ) )
|
|
self animmode( "nogravity" );
|
|
|
|
var_0 thread maps\_anim::anim_generic_first_frame( self, var_4[0] );
|
|
wait( var_1 );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
if ( isai( self ) )
|
|
self animmode( "gravity" );
|
|
}
|
|
|
|
var_0 thread maps\_anim::anim_generic( self, var_4[randomint( var_4.size )] );
|
|
self waittillmatch( "single anim", "end" );
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
if ( maps\carrier_code::eval( var_3 ) )
|
|
return;
|
|
|
|
if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "enemy_defend_zodiac_vista" )
|
|
self kill();
|
|
else if ( isdefined( self ) )
|
|
{
|
|
var_5 = self;
|
|
|
|
if ( maps\carrier_code::eval( self.script_drone ) )
|
|
var_5 = safe_makerealai( self );
|
|
|
|
var_5.health = 25;
|
|
var_5.dropweapon = 0;
|
|
var_5.nodrop = 1;
|
|
var_5.grenadeammo = 0;
|
|
var_5.deathanim = undefined;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 90;
|
|
|
|
if ( randomint( 100 ) < var_2 )
|
|
{
|
|
var_5 thread maps\ss_util::fake_death_bullet( 0.1 );
|
|
return;
|
|
}
|
|
|
|
var_5 setgoalvolumeauto( getent( "defend_zodiac_vol", "targetname" ) );
|
|
}
|
|
}
|
|
|
|
safe_makerealai( var_0 )
|
|
{
|
|
while ( maps\carrier_code::eval( level.is_makerealai_active ) )
|
|
common_scripts\utility::waitframe();
|
|
|
|
level.is_makerealai_active = 1;
|
|
var_1 = undefined;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_2 = var_0.spawner;
|
|
var_3 = var_0.spawner.count;
|
|
|
|
if ( var_3 == 0 )
|
|
var_2.count = 1;
|
|
|
|
var_1 = maps\_utility::makerealai( var_0 );
|
|
|
|
if ( var_3 == 0 )
|
|
var_2.count = 0;
|
|
}
|
|
|
|
level.is_makerealai_active = 0;
|
|
return var_1;
|
|
}
|
|
|
|
rope_cut_death( var_0, var_1 )
|
|
{
|
|
var_0 endon( "explode" );
|
|
var_0 endon( "death" );
|
|
var_0 endon( "end_rappel" );
|
|
var_0 endon( "rappel_death" );
|
|
var_0 endon( "land_on_zodiac_death" );
|
|
|
|
if ( maps\carrier_code::eval( self.iscutdown ) )
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
self waittill( "cut" );
|
|
wait( 0.2 * var_1 );
|
|
|
|
if ( maps\carrier_code::eval( var_0.player_cut ) )
|
|
level.player maps\_utility::player_giveachievement_wrapper( "LEVEL_15A" );
|
|
}
|
|
|
|
if ( var_0 should_land_on_zodiac_death() )
|
|
{
|
|
var_0 rappel_kill();
|
|
level.corpse_entnums = common_scripts\utility::array_add( level.corpse_entnums, var_0 getentitynumber() );
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( var_0.rope_prop ) )
|
|
var_0.rope_prop delete();
|
|
|
|
var_0 notify( "stop_loop" );
|
|
var_0 thread maps\_anim::anim_generic( var_0, "carrier_rappel_defend_death_rope_cut" );
|
|
var_0 thread rappel_death_vo();
|
|
level.corpse_entnums = common_scripts\utility::array_add( level.corpse_entnums, var_0 getentitynumber() );
|
|
thread finish_rope_cut_death( var_0 );
|
|
}
|
|
|
|
finish_rope_cut_death( var_0 )
|
|
{
|
|
var_0 splash_on_hit_water_ragdoll();
|
|
wait 1;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 delete();
|
|
}
|
|
|
|
rappel_enter_death( var_0 )
|
|
{
|
|
self endon( "rappel_enter_finished" );
|
|
self endon( "explode" );
|
|
self endon( "rappel_death" );
|
|
var_1 = self.rope;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 endon( "cut" );
|
|
|
|
while ( self.vehicle_position == 2 && ( isdefined( var_1 ) && !var_1.shot ) )
|
|
common_scripts\utility::waitframe();
|
|
|
|
if ( isai( self ) )
|
|
self.a.nodeath = 1;
|
|
|
|
self.deathanim = undefined;
|
|
self.skipdeathanim = 1;
|
|
self.damageshield = 1;
|
|
|
|
for ( var_2 = 0; isdefined( self ) && self.actual_health > 0 && isalive( self.ridingvehicle ); self.actual_health = self.actual_health - var_3 )
|
|
self waittill( "damage", var_3, var_4, var_5, var_6, var_7 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !isalive( self.ridingvehicle ) )
|
|
{
|
|
self kill();
|
|
return;
|
|
}
|
|
|
|
self notify( "rappel_enter_death" );
|
|
self notify( "stop_loop" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 notify( "next_rappeller" );
|
|
|
|
self linkto( self.ridingvehicle, "tag_body" );
|
|
self.ridingvehicle.corpses = common_scripts\utility::array_add( self.ridingvehicle.corpses, self );
|
|
self notify( "fully_stop_firing" );
|
|
self notify( "enter_death" );
|
|
var_8 = "carrier_rappel_defend_death_zodiac_c";
|
|
thread maps\_anim::anim_generic( self, "carrier_rappel_defend_death_zodiac_c" );
|
|
self waittillmatch( "single anim", "end" );
|
|
self.dead = 1;
|
|
}
|
|
|
|
rappel_death()
|
|
{
|
|
self endon( "end_rappel" );
|
|
self endon( "death" );
|
|
self endon( "land_on_zodiac_death" );
|
|
var_0 = self.rope;
|
|
var_1 = self.rope_prop;
|
|
var_2 = self.ref_node;
|
|
|
|
if ( isai( self ) )
|
|
self.a.nodeath = 1;
|
|
|
|
self.deathanim = undefined;
|
|
self.skipdeathanim = 1;
|
|
self.damageshield = 1;
|
|
var_3 = 0;
|
|
|
|
while ( isdefined( self ) && self.actual_health > 0 )
|
|
{
|
|
self waittill( "damage", var_4, var_5, var_6, var_7, var_8 );
|
|
self.actual_health = self.actual_health - var_4;
|
|
|
|
if ( should_pain_over_death() && self.actual_health <= 0 )
|
|
{
|
|
self.health = self.health + var_4;
|
|
self.actual_health = self.actual_health + var_4;
|
|
}
|
|
|
|
if ( self.actual_health > 0 )
|
|
self notify( "rappel_pain" );
|
|
}
|
|
|
|
var_9 = [ "carrier_rappel_defend_death_rope_a", "carrier_rappel_defend_death_rope_b" ];
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 notify( "next_rappeller" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !maps\carrier_code::is_drone() && !isalive( self ) )
|
|
return;
|
|
|
|
var_2 notify( "stop_loop" );
|
|
self stopanimscripted();
|
|
self notify( "stop_loop" );
|
|
self unlink();
|
|
self notify( "rappel_death" );
|
|
level.corpse_entnums = common_scripts\utility::array_add( level.corpse_entnums, self getentitynumber() );
|
|
thread splash_on_hit_water();
|
|
thread rappel_death_vo();
|
|
var_10 = var_9[randomint( var_9.size )];
|
|
thread maps\_anim::anim_single_solo( self, var_10 );
|
|
maps\_anim::anim_set_rate_single( self, var_10, 1.25 );
|
|
thread land_on_zodiac_death();
|
|
self waittillmatch( "single anim", "end" );
|
|
self.dead = 1;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 delete();
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
|
|
should_pain_over_death()
|
|
{
|
|
if ( !isdefined( self.rope_prop ) || !isdefined( self.ridingvehicle ) )
|
|
return 0;
|
|
|
|
var_0 = 0.12;
|
|
var_1 = 0.27;
|
|
var_2 = self.rope_prop getanimtime( level.scr_anim["rope_prop"]["carrier_rappel_defend_ascend_prop"] );
|
|
return var_2 > var_0 && var_2 <= var_1;
|
|
}
|
|
|
|
should_land_on_zodiac_death()
|
|
{
|
|
if ( !isdefined( self.rope_prop ) || !isdefined( self.ridingvehicle ) )
|
|
return 0;
|
|
|
|
var_0 = 0;
|
|
var_1 = 0.12;
|
|
var_2 = self.rope_prop getanimtime( level.scr_anim["rope_prop"]["carrier_rappel_defend_ascend_prop"] );
|
|
return var_2 >= var_0 && var_2 <= var_1;
|
|
}
|
|
|
|
land_on_zodiac_death()
|
|
{
|
|
var_0 = self.rope;
|
|
var_1 = self.rope_prop;
|
|
|
|
if ( !isdefined( var_1 ) || !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
var_0 endon( "death" );
|
|
var_0 endon( "cut" );
|
|
var_1 endon( "death" );
|
|
|
|
if ( !should_land_on_zodiac_death() )
|
|
return 0;
|
|
|
|
self notify( "land_on_zodiac_death" );
|
|
var_2 = common_scripts\utility::spawn_tag_origin();
|
|
var_2.origin = self.ridingvehicle.origin + anglestoforward( self.ridingvehicle.angles ) * 64 + ( 0, 0, 10 );
|
|
var_2.angles = self.ridingvehicle.angles;
|
|
var_2 linkto( self.ridingvehicle, "tag_body" );
|
|
var_3 = var_2.origin[2] + 32;
|
|
|
|
while ( self.origin[2] > var_3 )
|
|
common_scripts\utility::waitframe();
|
|
|
|
self stopanimscripted();
|
|
self.ridingvehicle.corpses = common_scripts\utility::array_add( self.ridingvehicle.corpses, self );
|
|
self setanim( level.scr_anim["generic"]["carrier_rappel_defend_death_zodiac_c"], 1, 1 );
|
|
thread link_to_moving_target( var_2 );
|
|
wait( getanimlength( level.scr_anim["generic"]["carrier_rappel_defend_death_zodiac_c"] ) );
|
|
self.dead = 1;
|
|
return 1;
|
|
}
|
|
|
|
link_to_moving_target( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_0 endon( "death" );
|
|
var_1 = 15;
|
|
var_2 = distance( self.origin, var_0.origin );
|
|
var_3 = int( var_2 / var_1 ) * 0.1;
|
|
self rotateto( var_0.angles, var_3 );
|
|
|
|
while ( var_2 > 4 || self.origin[2] < var_0.origin[2] )
|
|
{
|
|
if ( var_2 > var_1 )
|
|
var_4 = self.origin + vectornormalize( var_0.origin - self.origin ) * var_1;
|
|
else
|
|
var_4 = var_0.origin;
|
|
|
|
self moveto( var_4, 0.1 );
|
|
wait 0.1;
|
|
var_2 = distance( self.origin, var_0.origin );
|
|
}
|
|
|
|
self linkto( var_0, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
}
|
|
|
|
splash_on_hit_water()
|
|
{
|
|
self endon( "land_on_zodiac_death" );
|
|
|
|
while ( isdefined( self ) && self gettagorigin( "j_mainroot" )[2] > level.water_level + 8 )
|
|
wait 0.05;
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
var_0 = self gettagorigin( "j_mainroot" );
|
|
var_0 = ( var_0[0], var_0[1], level.water_level );
|
|
playfx( common_scripts\utility::getfx( "body_splash" ), var_0 );
|
|
}
|
|
}
|
|
|
|
splash_on_hit_water_ragdoll( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
wait( var_0 );
|
|
else
|
|
{
|
|
self waittillmatch( "single anim", "start_ragdoll" );
|
|
self unlink();
|
|
}
|
|
|
|
var_1 = self.origin[2] - level.water_level;
|
|
|
|
if ( var_1 <= 0 )
|
|
return;
|
|
|
|
var_2 = var_1 / ( 1344 - level.water_level );
|
|
var_3 = self.origin + ( 40 * var_2, 0, 0 );
|
|
var_4 = var_2 * 1.23;
|
|
wait( var_4 );
|
|
var_5 = ( var_3[0], var_3[1], level.water_level + 4 );
|
|
playfx( common_scripts\utility::getfx( "body_splash" ), var_5 );
|
|
}
|
|
|
|
rappel_kill()
|
|
{
|
|
var_0 = [];
|
|
var_0[0] = "j_hip_le";
|
|
var_0[1] = "j_hip_ri";
|
|
var_0[2] = "j_head";
|
|
var_0[3] = "j_spine4";
|
|
var_0[4] = "j_elbow_le";
|
|
var_0[5] = "j_elbow_ri";
|
|
var_0[6] = "j_clavicle_le";
|
|
var_0[7] = "j_clavicle_ri";
|
|
|
|
for ( var_1 = 0; var_1 < 1 + randomint( 2 ); var_1++ )
|
|
{
|
|
var_2 = randomintrange( 0, var_0.size );
|
|
thread maps\ss_util::fake_death_bullet_fx( var_0[var_2], undefined );
|
|
wait( randomfloat( 0.05 ) );
|
|
}
|
|
|
|
self notify( "damage", self.actual_health, level.player, ( 0, 0, 0 ), ( 0, 0, 0 ), "MOD_RIFLE_BULLET" );
|
|
}
|
|
|
|
rappel_death_vo()
|
|
{
|
|
var_0 = randomint( 100 );
|
|
|
|
if ( var_0 < 33 )
|
|
thread maps\_utility::play_sound_on_entity( "generic_death_falling" );
|
|
else if ( var_0 < 66 )
|
|
thread maps\_utility::play_sound_on_entity( "generic_death_falling_scream" );
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
cleanup_zodiac_bodies()
|
|
{
|
|
var_0 = self.corpses;
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( self ) )
|
|
var_0 = self.corpses;
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isdefined( var_2 ) )
|
|
var_2 delete();
|
|
}
|
|
}
|
|
|
|
setup_cut_rope_hint()
|
|
{
|
|
level.cut_rope_trigger sethintstring( &"CARRIER_CUT_ROPE_HINT" );
|
|
level.cut_rope_trigger.visible = 0;
|
|
thread cut_rope_hint();
|
|
}
|
|
|
|
cut_rope_hint()
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( maps\carrier_code::eval( level.player.can_cut ) && !level.cut_rope_trigger.visible )
|
|
{
|
|
level.cut_rope_trigger maps\_utility::show_entity();
|
|
level.cut_rope_trigger.visible = 1;
|
|
}
|
|
else if ( !maps\carrier_code::eval( level.player.can_cut ) && level.cut_rope_trigger.visible )
|
|
{
|
|
level.cut_rope_trigger maps\_utility::hide_entity();
|
|
level.cut_rope_trigger.visible = 0;
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
run_cut_rope( var_0 )
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
self endon( "deleted" );
|
|
self endon( "death" );
|
|
self endon( "cut" );
|
|
wait_for_cut_rope( var_0 );
|
|
thread cut_the_rope( var_0 );
|
|
}
|
|
|
|
wait_for_cut_rope( var_0 )
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
self endon( "deleted" );
|
|
self endon( "death" );
|
|
self endon( "cut" );
|
|
self.iscutdown = 0;
|
|
self.can_cut = 0;
|
|
level.player.can_cut = 0;
|
|
thread monitor_can_cut_rope( var_0 );
|
|
level.player notifyonplayercommand( "cut", "+melee" );
|
|
level.player notifyonplayercommand( "cut", "+melee_breath" );
|
|
level.player notifyonplayercommand( "cut", "+melee_zoom" );
|
|
|
|
for (;;)
|
|
{
|
|
level.player waittill( "cut" );
|
|
|
|
if ( self.can_cut )
|
|
return;
|
|
}
|
|
}
|
|
|
|
monitor_can_cut_rope( var_0 )
|
|
{
|
|
level endon( "defend_zodiac_finished" );
|
|
self endon( "death" );
|
|
self endon( "cut" );
|
|
self endon( "rappel_death" );
|
|
|
|
for (;;)
|
|
{
|
|
childthread can_cut_rope( var_0 );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
can_cut_rope( var_0 )
|
|
{
|
|
if ( isdefined( level.player.active_rope ) && self != level.player.active_rope )
|
|
return 0;
|
|
|
|
if ( maps\carrier_code::eval( level.player.using_depth_charge ) )
|
|
{
|
|
self.can_cut = 0;
|
|
level.player.can_cut = 0;
|
|
return 0;
|
|
}
|
|
|
|
var_1 = self gettagorigin( "j_lower_rig_cut_jnt" );
|
|
|
|
if ( !level.player ismeleeing() && !level.player issprintsliding() && !level.player isthrowinggrenade() && !maps\carrier_code::eval( self.can_rope_melee ) && maps\_utility::players_within_distance( 50, var_1 ) && level.player maps\_utility::player_looking_at( var_1, 0.8, 1 ) && !enemy_too_close() )
|
|
{
|
|
level.player.active_rope = self;
|
|
level.player allowmelee( 0 );
|
|
self.can_cut = 1;
|
|
level.player.can_cut = 1;
|
|
return 1;
|
|
}
|
|
|
|
level.player.active_rope = undefined;
|
|
self.can_cut = 0;
|
|
level.player.can_cut = 0;
|
|
level.player allowmelee( 1 );
|
|
return 0;
|
|
}
|
|
|
|
enemy_too_close()
|
|
{
|
|
var_0 = 0;
|
|
self.rappellers = maps\_utility::array_removedead( self.rappellers );
|
|
var_1 = 22500;
|
|
|
|
foreach ( var_3 in self.rappellers )
|
|
{
|
|
if ( distancesquared( var_3.origin, level.player.origin ) <= var_1 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
cut_the_rope( var_0 )
|
|
{
|
|
self.iscutdown = 1;
|
|
level.player thread maps\carrier_depth_charge::depth_charge_remove_control( 1 );
|
|
level.player setstance( "stand" );
|
|
level.player allowcrouch( 0 );
|
|
level.player allowprone( 0 );
|
|
level.player disableweapons();
|
|
level.player enableinvulnerability();
|
|
level.player disableweaponswitch();
|
|
level.player disableoffhandweapons();
|
|
var_1 = maps\_utility::spawn_anim_model( "player_rig", level.player.origin );
|
|
var_1 hide();
|
|
var_2 = spawn( "script_model", ( 0, 0, 0 ) );
|
|
var_2 setmodel( "weapon_parabolic_knife" );
|
|
var_2 hide();
|
|
var_2 dontcastshadows();
|
|
var_2 linkto( var_1, "tag_weapon_right", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
var_0.rope = self;
|
|
thread maps\carrier_audio::aud_carr_player_cuts_rope();
|
|
var_3 = level.player.origin;
|
|
var_0 thread maps\_anim::anim_first_frame_solo( var_1, "carrier_rappel_defend_player_knife" );
|
|
level.player playerlinktoblend( var_1, "tag_player", 0.4, 0.2, 0 );
|
|
var_0 thread maps\_anim::anim_single_solo( var_1, "carrier_rappel_defend_player_knife" );
|
|
var_4 = getanimlength( level.scr_anim["player_rig"]["carrier_rappel_defend_player_knife"] );
|
|
wait 0.4;
|
|
var_1 show();
|
|
var_2 show();
|
|
wait( var_4 - 0.8 );
|
|
var_5 = maps\_utility::set_z( var_0.origin - anglestoforward( var_0.angles ) * 5, 1345 );
|
|
maps\carrier_code::lerp_player_to_position_accurate( var_5, 0.35 );
|
|
level.player.active_rope = undefined;
|
|
level.player unlink();
|
|
level.player allowcrouch( 1 );
|
|
level.player allowprone( 1 );
|
|
level.player enableweapons();
|
|
level.player allowmelee( 1 );
|
|
level.player disableinvulnerability();
|
|
level.player enableweaponswitch();
|
|
level.player enableoffhandweapons();
|
|
var_2 delete();
|
|
var_1 delete();
|
|
|
|
if ( common_scripts\utility::flag( "defend_osprey_online" ) && !maps\carrier_code::eval( level.player.osprey_control ) )
|
|
level.player thread maps\carrier_depth_charge::depth_charge_give_control();
|
|
}
|
|
|
|
cut_the_rope_notetrack( var_0 )
|
|
{
|
|
cut_rope_anim( self.rope, 1 );
|
|
}
|
|
|
|
cut_rope_anim( var_0, var_1 )
|
|
{
|
|
var_0.iscutdown = 1;
|
|
level.player.can_cut = 0;
|
|
var_0 notify( "cut" );
|
|
level.player allowmelee( 1 );
|
|
level.cut_ropes = common_scripts\utility::array_add( level.cut_ropes, var_0 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
foreach ( var_3 in var_0.rappellers )
|
|
{
|
|
if ( isalive( var_3 ) && !maps\carrier_code::eval( var_3.dead ) )
|
|
{
|
|
var_3 notify( "cut" );
|
|
var_3.player_cut = var_1;
|
|
}
|
|
}
|
|
|
|
var_0 show();
|
|
|
|
if ( isdefined( var_0.static ) )
|
|
var_0.static delete();
|
|
|
|
maps\_anim::anim_single_solo( var_0, "carrier_rappel_defend_rope_cut" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 moveto( var_0.origin - ( 0, 0, 500 ), 0.5, 0.5 );
|
|
|
|
var_0 thread cleanup_rope();
|
|
}
|