iw6-scripts/maps/homecoming_drones.gsc
2024-02-13 13:20:49 +01:00

925 lines
24 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
drone_spawn()
{
var_0 = drones_request( 1 );
if ( var_0 )
{
var_1 = maps\_utility::spawn_ai();
var_1 thread drones_death_watcher();
return var_1;
}
return undefined;
}
drones_request( var_0 )
{
var_1 = spawnstruct();
var_1.requestamount = var_0;
level.dronequeue[level.dronequeue.size] = var_1;
var_1 waittill( "drones_granted", var_2 );
if ( getdvarint( "daniel" ) )
iprintln( "drones granted : " + var_2 );
return var_2;
}
drones_request_queue()
{
for (;;)
{
while ( level.dronequeue.size == 0 )
wait 0.05;
var_0 = level.dronequeue[0];
drones_request_think( var_0 );
level.dronequeue = common_scripts\utility::array_remove( level.dronequeue, var_0 );
}
}
drones_request_think( var_0 )
{
var_1 = var_0.requestamount;
if ( getdvarint( "daniel" ) )
iprintln( "drones requested : " + var_1 );
var_2 = level.availabledrones - var_1;
if ( var_2 < 0 )
{
var_3 = level.availabledrones;
level.availabledrones = 0;
}
else
{
level.availabledrones = level.availabledrones - var_1;
var_3 = var_1;
}
var_0 notify( "drones_granted", var_3 );
}
drones_death_watcher()
{
common_scripts\utility::waittill_any( "death", "deleted" );
level.availabledrones++;
}
drones_request_init()
{
level.dronequeue = [];
level.availabledrones = 35;
thread drones_request_queue();
}
drone_move_custom( var_0 )
{
self endon( "death" );
self endon( "drone_stop" );
wait 0.05;
var_1 = maps\_drone::getpatharray( var_0, self.origin );
var_2 = level.drone_anims[self.team]["stand"]["run"];
if ( isdefined( self.runanim ) )
var_2 = self.runanim;
var_3 = maps\_drone::get_anim_data( var_2 );
var_4 = var_3.run_speed;
var_5 = var_3.anim_relative;
if ( isdefined( self.drone_move_callback ) )
{
var_3 = [[ self.drone_move_callback ]]();
if ( isdefined( var_3 ) )
{
var_2 = var_3.runanim;
var_4 = var_3.run_speed;
var_5 = var_3.anim_relative;
}
var_3 = undefined;
}
if ( !var_5 )
thread maps\_drone::drone_move_z( var_4 );
maps\_drone::drone_play_looping_anim( var_2, self.moveplaybackrate );
var_6 = 0.5;
var_7 = 0;
self.started_moving = 1;
self.cur_node = var_1[var_7];
var_8 = 0;
var_9 = undefined;
for (;;)
{
if ( !isdefined( var_1[var_7] ) )
break;
var_10 = var_1[var_7]["vec"];
var_11 = self.origin - var_1[var_7]["origin"];
var_12 = vectordot( vectornormalize( var_10 ), var_11 );
if ( !isdefined( var_1[var_7]["dist"] ) )
break;
var_13 = level.drone_lookahead_value;
if ( isdefined( self.drone_lookahead_value ) )
var_13 = self.drone_lookahead_value;
var_14 = var_12 + var_13;
while ( var_14 > var_1[var_7]["dist"] )
{
var_14 = var_14 - var_1[var_7]["dist"];
var_7++;
self.cur_node = var_1[var_7];
if ( !isdefined( var_1[var_7]["dist"] ) )
{
self rotateto( vectortoangles( var_1[var_1.size - 1]["vec"] ), var_6 );
var_15 = distance( self.origin, var_1[var_1.size - 1]["origin"] );
var_16 = var_15 / ( var_4 * self.moveplaybackrate );
var_17 = var_1[var_1.size - 1]["origin"] + ( 0, 0, 100 );
var_18 = var_1[var_1.size - 1]["origin"] - ( 0, 0, 100 );
var_19 = physicstrace( var_17, var_18 );
if ( getdvar( "debug_drones" ) == "1" )
{
thread common_scripts\utility::draw_line_for_time( var_17, var_18, 1, 1, 1, var_6 );
thread common_scripts\utility::draw_line_for_time( self.origin, var_19, 0, 0, 1, var_6 );
}
self moveto( var_19, var_16 );
wait( var_16 );
self notify( "goal" );
if ( isdefined( self.cur_node["script_noteworthy"] ) )
drone_traverse_check();
if ( !isdefined( self.skipdelete ) )
{
cur_node_check_delete();
thread maps\_drone::check_delete();
}
thread maps\_drone::drone_idle( var_1[var_1.size - 1], var_19 );
return;
}
if ( !isdefined( var_1[var_7] ) )
{
self notify( "goal" );
if ( isdefined( self.cur_node["script_noteworthy"] ) )
drone_traverse_check();
thread maps\_drone::drone_idle();
return;
}
}
if ( isdefined( self.drone_move_callback ) )
{
var_3 = [[ self.drone_move_callback ]]();
if ( isdefined( var_3 ) )
{
var_2 = var_3.runanim;
if ( var_3.runanim != var_2 )
{
var_4 = var_3.run_speed;
var_5 = var_3.anim_relative;
if ( !var_5 )
thread maps\_drone::drone_move_z( var_4 );
else
self notify( "drone_move_z" );
maps\_drone::drone_play_looping_anim( var_2, self.moveplaybackrate );
}
}
}
self.cur_node = var_1[var_7];
var_20 = var_1[var_7]["vec"] * var_14;
var_20 = var_20 + var_1[var_7]["origin"];
var_21 = var_20;
var_17 = var_21 + ( 0, 0, 100 );
var_18 = var_21 - ( 0, 0, 100 );
var_21 = physicstrace( var_17, var_18 );
if ( !var_5 )
self.drone_look_ahead_point = var_21;
if ( getdvar( "debug_drones" ) == "1" )
{
thread common_scripts\utility::draw_line_for_time( var_17, var_18, 1, 1, 1, var_6 );
thread maps\_drone::draw_point( var_21, 1, 0, 0, 16, var_6 );
}
var_22 = vectortoangles( var_21 - self.origin );
self rotateto( ( 0, var_22[1], 0 ), var_6 );
var_23 = var_4 * var_6 * self.moveplaybackrate;
var_24 = vectornormalize( var_21 - self.origin );
var_20 = var_24 * var_23;
var_20 = var_20 + self.origin;
if ( getdvar( "debug_drones" ) == "1" )
thread common_scripts\utility::draw_line_for_time( self.origin, var_20, 0, 0, 1, var_6 );
self moveto( var_20, var_6 );
wait( var_6 );
}
if ( isdefined( self.cur_node["script_noteworthy"] ) )
drone_traverse_check();
thread maps\_drone::drone_idle();
}
drone_traverse_check()
{
var_0 = self.cur_node["script_noteworthy"];
var_1 = strtok( var_0, "_" );
if ( var_1[0] != "traverse" )
return;
var_2 = [];
var_2["origin"] = self.cur_node["origin"];
var_2["angles"] = ( 0, 180, 0 );
var_3 = level.drone_anims[self.team]["traverse"][var_0];
drone_play_anim( var_3, var_2 );
}
cur_node_check_delete()
{
if ( !isdefined( self.cur_node["script_noteworthy"] ) )
return;
var_0 = self.cur_node["script_noteworthy"];
if ( var_0 == "die" )
self kill();
else if ( var_0 == "delete" )
self delete();
}
drone_set_runanim()
{
if ( !isdefined( self.drone_runanim ) )
return;
var_0 = spawnstruct();
var_0 = maps\_drone::get_anim_data( self.drone_runanim );
var_0.runanim = self.drone_runanim;
return var_0;
}
drone_animate_on_path( var_0 )
{
var_1 = self;
var_1 endon( "death" );
var_1 endon( "drone_stop" );
var_1.dontdonotetracks = 1;
if ( !isdefined( var_0 ) )
{
var_2 = var_1 maps\_utility::get_linked_structs();
var_0 = common_scripts\utility::random( var_2 );
}
var_3 = undefined;
var_4 = var_0;
while ( isdefined( var_4 ) )
{
var_3 = var_4;
var_5 = undefined;
if ( var_4 maps\homecoming_util::parameters_check( "fight" ) )
{
var_6 = [];
var_6["script_noteworthy"] = var_4.script_noteworthy;
var_6["origin"] = var_4.origin;
var_6["angles"] = var_4.angles;
var_1.cur_node = var_6;
var_1 thread drone_fight_smart();
break;
}
else if ( !var_4 maps\homecoming_util::parameters_check( "nomove" ) )
{
var_1 drone_move_custom( var_4.targetname );
var_7 = var_1.cur_node["script_linkname"];
if ( !isdefined( var_7 ) )
return;
var_5 = common_scripts\utility::getstruct( var_7, "script_linkname" );
}
else
var_5 = var_4;
var_3 = var_5;
var_4 = undefined;
var_8 = undefined;
if ( isdefined( var_5.script_animation ) )
{
var_8 = var_5.script_animation;
if ( isdefined( var_5.script_linkto ) )
var_4 = common_scripts\utility::getstruct( var_5.script_linkto, "script_linkname" );
}
else
{
var_9 = var_5 maps\_utility::get_linked_structs();
foreach ( var_11 in var_9 )
{
if ( var_11 maps\homecoming_util::parameters_check( "animate" ) )
{
var_8 = var_11.script_animation;
var_5 = var_11;
if ( isdefined( var_11.target ) )
var_4 = common_scripts\utility::getstruct( var_11.target, "targetname" );
break;
}
}
}
if ( !isdefined( var_8 ) )
continue;
common_scripts\utility::waitframe();
var_13 = getanimlength( maps\_utility::getanim_generic( var_8 ) );
var_5 thread maps\_anim::anim_generic( var_1, var_8 );
if ( isdefined( var_5.script_timeout ) )
{
wait( var_5.script_timeout );
var_1 stopanimscripted();
continue;
}
wait( var_13 );
}
var_1.dontdonotetracks = undefined;
var_1 struct_check_delete( var_3 );
}
hovercraft_drone_fightspots()
{
var_0 = squared( 128 );
for (;;)
{
wait 0.1;
if ( !isdefined( level.hovercraftdrones ) )
continue;
var_1 = maps\_utility::array_removedead( level.hovercraftdrones );
if ( var_1.size == 0 )
{
wait 0.1;
continue;
}
var_2 = sortbydistance( var_1, self.origin );
foreach ( var_4 in var_2 )
{
if ( isdefined( var_4.hasspot ) )
var_2 = common_scripts\utility::array_remove( var_2, var_4 );
}
if ( var_2.size == 0 )
break;
var_4 = var_2[0];
if ( distance2dsquared( var_4.origin, self.origin ) <= var_0 )
{
var_4.hasspot = 1;
var_4.skipdelete = 1;
var_4 notify( "drone_stop" );
var_4 notify( "drone_random_death" );
var_4.drone_lookahead_value = 50;
var_4 thread drone_move_custom( self.targetname );
var_4.drone_idle_custom = 1;
var_4.drone_idle_override = ::drone_fight_smart;
var_4 waittill( "death" );
}
}
}
drone_fight_smart( var_0 )
{
self endon( "death" );
self endon( "stop_drone_fighting" );
if ( isdefined( var_0 ) )
self waittill( "goal" );
var_1 = [];
if ( self.team == "axis" )
var_1 = [ "ak12", "cz805", "cbjms" ];
else
var_1 = [ "r5rgp", "fad", "m27" ];
self.weaponsound = "drone_" + var_1[randomint( var_1.size )] + "_fire_npc";
var_2 = self.cur_node;
var_3 = var_2["script_noteworthy"];
self.animset = var_3;
var_4 = self.team;
var_5 = randomint( 2 );
for (;;)
{
if ( common_scripts\utility::cointoss() )
{
var_6 = randomint( level.drone_anims[var_4][var_3]["idle"].size );
drone_play_anim( level.drone_anims[var_4][var_3]["idle"][var_6], var_2 );
}
drone_play_anim( level.drone_anims[var_4][var_3]["hide_2_aim"], var_2 );
if ( var_3 == "coverprone" )
drone_play_anim( level.drone_anims[var_4][var_3]["fire_exposed"] );
else
drone_play_anim( level.drone_anims[var_4][var_3]["fire"] );
maps\_drone::drone_fire_randomly();
drone_play_anim( level.drone_anims[var_4][var_3]["aim_2_hide"] );
}
}
#using_animtree("generic_human");
drone_play_anim( var_0, var_1, var_2 )
{
self clearanim( %body, 0.2 );
self stopanimscripted();
var_3 = "normal";
if ( isdefined( var_2 ) )
var_3 = "deathplant";
if ( isdefined( var_1 ) )
{
var_4 = var_1["origin"];
var_5 = var_1["angles"];
var_1 = spawnstruct();
var_1.origin = var_4;
var_1.angles = var_5;
}
else
var_1 = self;
var_6 = "drone_anim";
self animscripted( var_6, var_1.origin, var_1.angles, var_0, var_3 );
self waittillmatch( "drone_anim", "end" );
}
drone_infinite_runners( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = undefined;
if ( !isarray( self ) )
var_6 = maps\_utility::make_array( self );
else
var_6 = self;
var_7 = [];
foreach ( var_9 in var_6 )
{
var_10 = var_9 common_scripts\utility::get_linked_ents();
foreach ( var_12 in var_10 )
{
if ( var_12 maps\homecoming_util::parameters_check( "starter" ) )
var_7 = common_scripts\utility::array_add( var_7, var_12 );
}
}
maps\_utility::array_spawn( var_7 );
var_15 = [];
while ( !common_scripts\utility::flag( var_0 ) )
{
var_16 = undefined;
if ( isdefined( var_5 ) )
{
var_15 = common_scripts\utility::array_removeundefined( var_15 );
if ( var_15.size >= var_5 )
{
wait( randomfloatrange( var_1[0], var_1[1] ) );
var_16 = 1;
}
}
if ( isdefined( var_16 ) )
continue;
var_17 = drones_request( 1 );
if ( var_17 == 0 )
{
wait 0.1;
continue;
}
var_9 = var_6[randomint( var_6.size )];
var_18 = var_9 maps\_utility::spawn_ai();
var_15 = common_scripts\utility::array_removeundefined( var_15 );
var_15 = common_scripts\utility::array_add( var_15, var_18 );
var_18 thread drone_animate_on_path();
var_18 thread drones_death_watcher();
var_19 = var_2[randomint( var_2.size )];
var_18.runanim = level.drone_anims["allies"]["stand"][var_19];
if ( isdefined( var_3 ) )
var_18.weaponsound = var_3[randomint( var_3.size )];
else
var_18.nodroneweaponsound = 1;
if ( var_19 == "run_n_gun" )
var_18 thread drone_fire_randomly_loop();
else if ( var_19 == "sprint" )
var_18 maps\_utility::set_moveplaybackrate( 1.4 );
if ( isdefined( var_4 ) )
var_18 maps\_utility::delaythread( randomfloatrange( var_4[0], var_4[1] ), maps\_utility::die );
var_18 notify( "move" );
if ( common_scripts\utility::flag( var_0 ) )
break;
wait( randomfloatrange( var_1[0], var_1[1] ) );
}
}
beach_path_drones( var_0 )
{
self endon( "stop_drone_runners" );
if ( isdefined( var_0 ) )
level.drone_runner_group[var_0] = [];
var_1 = self;
var_2 = common_scripts\utility::getstruct( self.script_linkto, "script_linkname" );
var_3 = 2;
if ( isdefined( var_1.script_count ) )
var_3 = var_1.script_count;
if ( !isdefined( self.script_wait_min ) )
{
self.script_wait_min = 8;
self.script_wait_max = 16;
}
var_4 = 5;
var_5 = 9;
if ( isdefined( self.randomdeath ) )
{
var_4 = self.randomdeath[0];
var_5 = self.randomdeath[1];
}
for (;;)
{
var_6 = randomint( var_3 );
var_6 = var_6 + 1;
var_6 = drones_request( var_6 );
for ( var_7 = 0; var_7 < var_6; var_7++ )
{
var_8 = var_1 maps\_utility::spawn_ai();
if ( isdefined( var_0 ) )
{
level.drone_runner_group[var_0] = common_scripts\utility::array_removeundefined( level.drone_runner_group[var_0] );
level.drone_runner_group[var_0] = common_scripts\utility::array_add( level.drone_runner_group[var_0], var_8 );
}
if ( var_1 maps\homecoming_util::parameters_check( "random_death" ) )
var_8 maps\_utility::delaythread( randomfloatrange( var_4, var_5 ), ::drone_die );
var_8 thread drones_death_watcher();
if ( isdefined( var_1.drone_lookahead_value ) )
var_8.drone_lookahead_value = var_1.drone_lookahead_value;
else
var_8.drone_lookahead_value = 56;
var_9 = [ %stand_death_tumbleback, %stand_death_headshot_slowfall, %stand_death_shoulderback ];
var_8.deathanim = var_9[randomint( var_9.size )];
var_8 thread drone_animate_on_path( var_2 );
wait( randomfloatrange( 0.6, 0.9 ) );
}
var_1 maps\_utility::script_wait();
}
}
drone_fire_randomly_loop()
{
self endon( "death" );
for (;;)
{
wait( randomfloatrange( 0.8, 1.2 ) );
thread maps\_drone::drone_fire_randomly();
}
}
drone_fire_fake_javelin_loop( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "death" );
self endon( "stop_firing" );
if ( !isdefined( level.fakejavelinfireents ) )
level.fakejavelinfireents = [];
var_5 = 4;
var_6 = 9;
if ( isdefined( var_2 ) )
{
var_5 = var_2[0];
var_6 = var_2[1];
}
if ( !isdefined( self.javtargets ) )
self.javtargets = [];
if ( isdefined( var_0 ) )
self.javtargets = common_scripts\utility::array_combine( self.javtargets, var_0 );
if ( !isdefined( self.javelin_smarttargeting ) )
{
if ( isdefined( var_1 ) && var_1 == 1 )
self.javelin_smarttargeting = 1;
else
self.javelin_smarttargeting = 0;
}
if ( isalive( self ) )
{
var_7 = spawn( "script_model", self.origin );
var_7 setmodel( "weapon_javelin" );
var_7 linkto( self, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) );
self.javelin = var_7;
}
for (;;)
{
if ( isalive( self ) )
{
drone_play_anim( maps\_utility::getgenericanim( "javelin_idle" ) );
thread drone_play_anim( maps\_utility::getgenericanim( "javelin_fire" ) );
}
else
wait( randomfloatrange( var_5, var_6 ) );
if ( self.javelin_smarttargeting == 1 )
{
level.javelintargets = maps\_utility::array_removedead( level.javelintargets );
level.javelintargets = common_scripts\utility::array_removeundefined( level.javelintargets );
var_0 = common_scripts\utility::array_combine( self.javtargets, level.javelintargets );
}
if ( level.javelintargets.size > 0 )
var_8 = level.javelintargets[randomint( level.javelintargets.size )];
else
{
if ( self.javtargets.size == 0 )
return;
self.javtargets = common_scripts\utility::array_removeundefined( self.javtargets );
var_8 = self.javtargets[randomint( self.javtargets.size )];
}
maps\homecoming_util::fire_fake_javelin( var_8, var_3, var_4 );
}
}
drone_javelin_smart_targeting()
{
}
drone_respawner( var_0, var_1 )
{
var_2 = self;
var_2.dontdonotetracks = 1;
for (;;)
{
if ( isdefined( var_1 ) )
{
var_3 = randomfloatrange( 5, 10 );
var_2 maps\_utility::delaythread( var_3, ::drone_death_custom );
}
var_2 waittill( "death" );
var_2 = var_0 drone_spawn();
var_2 drone_animate_on_path();
}
}
drone_death_custom()
{
self notify( "stop_drone_fighting" );
if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield == 1 )
maps\_utility::stop_magic_bullet_shield();
var_0 = [ "drone_death_slowfall", "drone_death_shoulderback" ];
var_1 = common_scripts\utility::random( var_0 );
drone_gun_remove();
self clearanim( %body, 0.2 );
maps\_utility::anim_stopanimscripted();
maps\_anim::anim_generic( self, var_1 );
wait 0.5;
if ( isdefined( self ) )
self delete();
}
default_mg_drone()
{
thread maps\_utility::magic_bullet_shield();
maps\_utility::gun_remove();
var_0 = getent( self.script_linkto, "script_linkname" );
self.mg = var_0;
var_0.owner = self;
var_0 thread maps\_anim::anim_generic_first_frame( self, "stand_gunner_idle", "tag_butt" );
self linkto( var_0, "tag_butt", ( 0, 5, -45 ), ( 0, 0, 0 ) );
}
struct_check_delete( var_0 )
{
if ( var_0 maps\homecoming_util::parameters_check( "delete" ) )
maps\homecoming_util::delete_safe();
else if ( var_0 maps\homecoming_util::parameters_check( "die" ) )
maps\homecoming_util::kill_safe();
}
drone_death_handler( var_0 )
{
if ( isdefined( self.customdeathanim ) )
return;
if ( isdefined( self.deathanim ) )
var_0 = self.deathanim;
maps\_drone::drone_play_scripted_anim( var_0, "deathplant" );
if ( !isdefined( self.noragdoll ) )
self startragdoll();
self notsolid();
thread maps\_drone::drone_thermal_draw_disable( 2 );
if ( isdefined( self ) && isdefined( self.nocorpsedelete ) )
return;
if ( !isdefined( level.drone_bodies ) )
level.drone_bodies = 0;
level.drone_bodies++;
while ( isdefined( self ) )
{
wait 2;
if ( !isdefined( self ) )
break;
if ( drone_should_delete() )
self delete();
}
level.drone_bodies--;
}
drone_should_delete()
{
if ( distancesquared( level.player.origin, self.origin ) > 1000000 )
return 1;
if ( !common_scripts\utility::within_fov( level.player.origin, level.player.angles, self.origin, 0.5 ) )
return 1;
if ( level.drone_bodies > 5 )
return 1;
return 0;
}
drone_gun_remove()
{
var_0 = getweaponmodel( self.weapon );
self detach( var_0, "tag_weapon_right" );
self.weapon = "none";
}
drone_die( var_0 )
{
if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield == 1 )
maps\_utility::stop_magic_bullet_shield();
if ( !isdefined( self.dronebloodfx ) )
{
maps\_utility::die();
return;
}
var_1 = [ "j_shoulder_ri", "j_shoulder_le", "j_head" ];
var_2 = var_1[randomint( var_1.size )];
playfx( common_scripts\utility::getfx( "body_impact1" ), self gettagorigin( var_2 ) );
maps\_utility::die();
}
drone_bloodfx( var_0 )
{
self.dronebloodfx = 1;
if ( !isdefined( var_0 ) )
var_0 = 0;
var_1 = [ "body_impact1", "body_impact2" ];
while ( isdefined( self ) && isalive( self ) )
{
self waittill( "damage", var_2, var_3, var_4, var_5, var_6 );
if ( var_0 )
{
if ( var_3 != level.player )
continue;
}
var_7 = var_1[randomint( var_1.size )];
playfx( common_scripts\utility::getfx( var_7 ), var_5 );
}
}
drone_removename()
{
self.name = "";
self setlookattext( "", &"" );
}
isdrone()
{
if ( isdefined( self.script_drone ) && self.script_drone == 1 )
return 1;
return 0;
}
set_noragdoll()
{
self.noragdoll = 1;
}
drone_enableaimassist()
{
self enableaimassist();
}
give_drone_deathanim()
{
var_0 = [ %stand_death_tumbleback, %stand_death_headshot_slowfall, %stand_death_shoulderback ];
self.deathanim = var_0[randomint( var_0.size )];
}
drone_setname( var_0 )
{
self.name = var_0;
self setlookattext( var_0, &"" );
}