mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
1938 lines
37 KiB
Plaintext
1938 lines
37 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: _attack_heli.gsc
|
|
* Game: Call of Duty: Advanced Warfare
|
|
* Platform: PC
|
|
* Function Count: 74
|
|
* Decompile Time: 1118 ms
|
|
* Timestamp: 4/22/2024 2:04:33 AM
|
|
*******************************************************************/
|
|
|
|
//Function Number: 1
|
|
preload()
|
|
{
|
|
precacheitem("turret_attackheli");
|
|
precacheitem("missile_attackheli");
|
|
attack_heli_fx();
|
|
thread init();
|
|
}
|
|
|
|
//Function Number: 2
|
|
attack_heli_fx()
|
|
{
|
|
if(getdvarint("sm_enable") && getdvar("r_zfeather") != "0")
|
|
{
|
|
level._effect["_attack_heli_spotlight"] = loadfx("fx/misc/hunted_spotlight_model");
|
|
return;
|
|
}
|
|
|
|
level._effect["_attack_heli_spotlight"] = loadfx("fx/misc/spotlight_large");
|
|
}
|
|
|
|
//Function Number: 3
|
|
init()
|
|
{
|
|
if(isdefined(level.attackheliaiburstsize))
|
|
{
|
|
return;
|
|
}
|
|
|
|
while(!isdefined(level.gameskill))
|
|
{
|
|
wait(0.05);
|
|
}
|
|
|
|
if(!isdefined(level.cosine))
|
|
{
|
|
level.cosine = [];
|
|
}
|
|
|
|
if(!isdefined(level.cosine["25"]))
|
|
{
|
|
level.cosine["25"] = cos(25);
|
|
}
|
|
|
|
if(!isdefined(level.cosine["35"]))
|
|
{
|
|
level.cosine["35"] = cos(35);
|
|
}
|
|
|
|
if(!isdefined(level.attackhelirange))
|
|
{
|
|
level.attackhelirange = 3500;
|
|
}
|
|
|
|
if(!isdefined(level.attackhelikillsai))
|
|
{
|
|
level.attackhelikillsai = 0;
|
|
}
|
|
|
|
if(!isdefined(level.attackhelifov))
|
|
{
|
|
level.attackhelifov = cos(30);
|
|
}
|
|
|
|
level.attackheliaiburstsize = 1;
|
|
level.attackhelimemory = 3;
|
|
level.attackhelitargetreaquire = 6;
|
|
level.attackhelimovetime = 3;
|
|
switch(level.gameskill)
|
|
{
|
|
case 0:
|
|
level.attackheliplayerbreak = 9;
|
|
level.attackhelitimeout = 1;
|
|
break;
|
|
|
|
case 1:
|
|
level.attackheliplayerbreak = 7;
|
|
level.attackhelitimeout = 2;
|
|
break;
|
|
|
|
case 2:
|
|
level.attackheliplayerbreak = 5;
|
|
level.attackhelitimeout = 3;
|
|
break;
|
|
|
|
case 3:
|
|
level.attackheliplayerbreak = 3;
|
|
level.attackhelitimeout = 5;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 4
|
|
start_attack_heli(param_00)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
param_00 = "kill_heli";
|
|
}
|
|
|
|
var_01 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive(param_00);
|
|
var_01 = begin_attack_heli_behavior(var_01);
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 5
|
|
begin_attack_heli_behavior(param_00,param_01)
|
|
{
|
|
param_00 endon("death");
|
|
param_00 endon("heli_players_dead");
|
|
if(level.gameskill == 0 || level.gameskill == 1)
|
|
{
|
|
var_02 = spawn("script_origin",param_00.origin + (0,0,-20));
|
|
var_02 linkto(param_00);
|
|
param_00 thread common_scripts\utility::delete_on_death(var_02);
|
|
var_03 = undefined;
|
|
if(level.gameskill == 0)
|
|
{
|
|
var_03 = 2800;
|
|
}
|
|
else
|
|
{
|
|
var_03 = 2200;
|
|
}
|
|
|
|
if(!isdefined(param_00.no_attractor))
|
|
{
|
|
param_00.attractor = missile_createattractorent(var_02,var_03,10000,level.player);
|
|
if(maps\_utility::is_coop())
|
|
{
|
|
param_00.attractor2 = missile_createattractorent(var_02,var_03,10000,level.player2);
|
|
}
|
|
}
|
|
}
|
|
|
|
param_00 enableaimassist();
|
|
param_00.startingorigin = spawn("script_origin",param_00.origin);
|
|
param_00 thread common_scripts\utility::delete_on_death(param_00.startingorigin);
|
|
if(!isdefined(param_00.circling))
|
|
{
|
|
param_00.circling = 0;
|
|
}
|
|
|
|
param_00.allowshoot = 1;
|
|
param_00.firingmissiles = 0;
|
|
param_00.moving = 1;
|
|
param_00.istakingdamage = 0;
|
|
param_00.heli_lastattacker = undefined;
|
|
param_00 thread notify_disable();
|
|
param_00 thread notify_enable();
|
|
thread kill_heli_logic(param_00,param_01);
|
|
param_00.turrettype = undefined;
|
|
param_00 heli_default_target_setup();
|
|
param_00 thread detect_player_death();
|
|
switch(param_00.vehicletype)
|
|
{
|
|
case "ny_harbor_hind":
|
|
case "hind_blackice":
|
|
case "hind":
|
|
param_00.turrettype = "default";
|
|
break;
|
|
|
|
case "mi28":
|
|
case "nh90":
|
|
case "mi17":
|
|
param_00.turrettype = "default";
|
|
break;
|
|
|
|
case "apache":
|
|
param_00.turrettype = "default";
|
|
break;
|
|
|
|
case "littlebird_spotlight":
|
|
case "littlebird":
|
|
param_00 setyawspeed(90,30,20);
|
|
param_00 setmaxpitchroll(40,40);
|
|
param_00 sethoverparams(100,20,5);
|
|
param_00 setup_miniguns();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
param_00.etarget = param_00.targetdefault;
|
|
if(isdefined(param_00.script_spotlight) && param_00.script_spotlight == 1 && !isdefined(param_00.spotlight))
|
|
{
|
|
param_00 thread heli_spotlight_on(undefined,1);
|
|
}
|
|
|
|
param_00 thread attack_heli_cleanup();
|
|
return param_00;
|
|
}
|
|
|
|
//Function Number: 6
|
|
detect_player_death()
|
|
{
|
|
foreach(var_01 in level.players)
|
|
{
|
|
var_01 maps\_utility::add_wait(::maps\_utility::waittill_msg,"death");
|
|
}
|
|
|
|
maps\_utility::do_wait_any();
|
|
self notify("heli_players_dead");
|
|
}
|
|
|
|
//Function Number: 7
|
|
heli_default_target_setup()
|
|
{
|
|
var_00 = undefined;
|
|
var_01 = undefined;
|
|
switch(self.vehicletype)
|
|
{
|
|
case "ny_harbor_hind":
|
|
case "hind_blackice":
|
|
case "hind":
|
|
var_01 = 600;
|
|
var_00 = -100;
|
|
break;
|
|
|
|
case "mi28":
|
|
case "nh90":
|
|
case "mi17":
|
|
var_01 = 600;
|
|
var_00 = -100;
|
|
break;
|
|
|
|
case "apache":
|
|
var_01 = 600;
|
|
var_00 = -100;
|
|
break;
|
|
|
|
case "littlebird_spotlight":
|
|
case "littlebird":
|
|
var_01 = 600;
|
|
var_00 = -204;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
self.targetdefault = spawn("script_origin",self.origin);
|
|
self.targetdefault.angles = self.angles;
|
|
self.targetdefault.origin = self.origin;
|
|
var_02 = spawnstruct();
|
|
var_02.entity = self.targetdefault;
|
|
var_02.forward = var_01;
|
|
var_02.up = var_00;
|
|
var_02 maps\_utility::translate_local();
|
|
self.targetdefault linkto(self);
|
|
self.targetdefault thread heli_default_target_cleanup(self);
|
|
}
|
|
|
|
//Function Number: 8
|
|
get_turrets()
|
|
{
|
|
if(isdefined(self.turrets))
|
|
{
|
|
return self.turrets;
|
|
}
|
|
|
|
setup_miniguns();
|
|
return self.turrets;
|
|
}
|
|
|
|
//Function Number: 9
|
|
setup_miniguns()
|
|
{
|
|
self.turrettype = "miniguns";
|
|
self.minigunsspinning = 0;
|
|
self.firingguns = 0;
|
|
if(!isdefined(self.mgturret))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.turrets = self.mgturret;
|
|
common_scripts\utility::array_thread(self.turrets,::littlebird_turrets_think,self);
|
|
}
|
|
|
|
//Function Number: 10
|
|
heli_default_target_cleanup(param_00)
|
|
{
|
|
param_00 common_scripts\utility::waittill_either("death","crash_done");
|
|
if(isdefined(self))
|
|
{
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
//Function Number: 11
|
|
start_circling_heli(param_00,param_01)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
param_00 = "kill_heli";
|
|
}
|
|
|
|
var_02 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive(param_00);
|
|
var_02.startingorigin = spawn("script_origin",var_02.origin);
|
|
var_02 thread common_scripts\utility::delete_on_death(var_02.startingorigin);
|
|
var_02.circling = 1;
|
|
var_02.allowshoot = 1;
|
|
var_02.firingmissiles = 0;
|
|
var_02 thread notify_disable();
|
|
var_02 thread notify_enable();
|
|
thread kill_heli_logic(var_02,param_01);
|
|
return var_02;
|
|
}
|
|
|
|
//Function Number: 12
|
|
kill_heli_logic(param_00,param_01)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
param_00 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive("kill_heli");
|
|
param_00.allowshoot = 1;
|
|
param_00.firingmissiles = 0;
|
|
param_00 thread notify_disable();
|
|
param_00 thread notify_enable();
|
|
}
|
|
|
|
var_02 = undefined;
|
|
if(!isdefined(param_00.script_airspeed))
|
|
{
|
|
var_02 = 40;
|
|
}
|
|
else
|
|
{
|
|
var_02 = param_00.script_airspeed;
|
|
}
|
|
|
|
if(!isdefined(level.enemy_heli_killed))
|
|
{
|
|
level.enemy_heli_killed = 0;
|
|
}
|
|
|
|
if(!isdefined(level.commander_speaking))
|
|
{
|
|
level.commander_speaking = 0;
|
|
}
|
|
|
|
if(!isdefined(level.enemy_heli_attacking))
|
|
{
|
|
level.enemy_heli_attacking = 0;
|
|
}
|
|
|
|
level.attack_heli_safe_volumes = undefined;
|
|
var_03 = getentarray("attack_heli_safe_volume","script_noteworthy");
|
|
if(var_03.size > 0)
|
|
{
|
|
level.attack_heli_safe_volumes = var_03;
|
|
}
|
|
|
|
if(!level.enemy_heli_killed)
|
|
{
|
|
thread dialog_nags_heli(param_00);
|
|
}
|
|
|
|
if(!isdefined(param_00.helicopter_predator_target_shader))
|
|
{
|
|
switch(param_00.vehicletype)
|
|
{
|
|
case "mi28":
|
|
case "nh90":
|
|
case "mi17":
|
|
target_set(param_00,(0,0,-80));
|
|
break;
|
|
|
|
case "ny_harbor_hind":
|
|
case "hind_blackice":
|
|
case "hind":
|
|
target_set(param_00,(0,0,-96));
|
|
break;
|
|
|
|
case "apache":
|
|
target_set(param_00,(0,0,-96));
|
|
break;
|
|
|
|
case "littlebird_spotlight":
|
|
case "littlebird":
|
|
target_set(param_00,(0,0,-80));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
target_setjavelinonly(param_00,1);
|
|
}
|
|
|
|
param_00 thread heli_damage_monitor();
|
|
param_00 thread heli_death_monitor();
|
|
param_00 endon("death");
|
|
param_00 endon("heli_players_dead");
|
|
param_00 endon("returning_home");
|
|
param_00 setvehweapon("turret_attackheli");
|
|
if(!isdefined(param_00.circling))
|
|
{
|
|
param_00.circling = 0;
|
|
}
|
|
|
|
if(!param_00.circling)
|
|
{
|
|
param_00 setneargoalnotifydist(100);
|
|
if(!isdefined(param_00.dontwaitforpathend))
|
|
{
|
|
param_00 waittill("reached_dynamic_path_end");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
param_00 setneargoalnotifydist(500);
|
|
param_00 waittill("near_goal");
|
|
}
|
|
|
|
param_00 thread heli_shoot_think();
|
|
if(param_00.circling)
|
|
{
|
|
param_00 thread heli_circling_think(param_01,var_02);
|
|
return;
|
|
}
|
|
|
|
param_00 thread heli_goal_think(var_02);
|
|
}
|
|
|
|
//Function Number: 13
|
|
heli_circling_think(param_00,param_01)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
param_00 = "attack_heli_circle_node";
|
|
}
|
|
|
|
var_02 = getentarray(param_00,"targetname");
|
|
if(!isdefined(var_02) || var_02.size < 1)
|
|
{
|
|
var_02 = common_scripts\utility::getstructarray(param_00,"targetname");
|
|
}
|
|
|
|
var_03 = self;
|
|
var_03 endon("stop_circling");
|
|
var_03 endon("death");
|
|
var_03 endon("returning_home");
|
|
var_03 endon("heli_players_dead");
|
|
for(;;)
|
|
{
|
|
var_03 vehicle_setspeed(param_01,param_01 / 4,param_01 / 4);
|
|
var_03 setneargoalnotifydist(100);
|
|
var_04 = maps\_utility::get_closest_player_healthy(var_03.origin);
|
|
var_05 = var_04.origin;
|
|
var_03 setlookatent(var_04);
|
|
var_06 = common_scripts\utility::getclosest(var_05,var_02);
|
|
var_07 = getentarray(var_06.target,"targetname");
|
|
if(!isdefined(var_07) || var_07.size < 1)
|
|
{
|
|
var_07 = common_scripts\utility::getstructarray(var_06.target,"targetname");
|
|
}
|
|
|
|
var_08 = var_07[randomint(var_07.size)];
|
|
var_03 setvehgoalpos(var_08.origin,1);
|
|
var_03 waittill("near_goal");
|
|
if(!isdefined(var_04.is_controlling_uav))
|
|
{
|
|
wait(1);
|
|
wait(randomfloatrange(0.8,1.3));
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 14
|
|
heli_goal_think(param_00)
|
|
{
|
|
self endon("death");
|
|
var_01 = getentarray("kill_heli_spot","targetname");
|
|
var_02 = self;
|
|
var_03 = common_scripts\utility::getclosest(var_02.origin,var_01);
|
|
var_04 = var_03;
|
|
var_02 endon("death");
|
|
var_02 endon("returning_home");
|
|
var_02 endon("heli_players_dead");
|
|
var_05 = undefined;
|
|
for(;;)
|
|
{
|
|
wait(0.05);
|
|
var_02 vehicle_setspeed(param_00,param_00 / 2,param_00 / 10);
|
|
var_02 setneargoalnotifydist(100);
|
|
var_06 = maps\_utility::get_closest_player_healthy(var_02.origin);
|
|
var_07 = var_06.origin;
|
|
if(var_03 == var_04 && var_02.istakingdamage)
|
|
{
|
|
var_08 = get_linked_points(var_02,var_03,var_01,var_06,var_07);
|
|
var_03 = common_scripts\utility::getclosest(var_07,var_08);
|
|
}
|
|
|
|
var_02 setvehgoalpos(var_03.origin,1);
|
|
var_02.moving = 1;
|
|
var_06 = maps\_utility::get_closest_player_healthy(var_02.origin);
|
|
if(isdefined(self.etarget) && isdefined(self.etarget.classname) && self.etarget.classname == "script_origin")
|
|
{
|
|
var_05 = var_06;
|
|
}
|
|
else if(isdefined(self.etarget))
|
|
{
|
|
var_05 = self.etarget;
|
|
}
|
|
else
|
|
{
|
|
var_05 = self.targetdefault;
|
|
}
|
|
|
|
var_02 setlookatent(var_05);
|
|
var_02 waittill("near_goal");
|
|
var_02.moving = 0;
|
|
if(!maps\_utility::is_coop())
|
|
{
|
|
if(level.gameskill == 0 || level.gameskill == 1)
|
|
{
|
|
while(player_is_aiming_with_rocket(var_02))
|
|
{
|
|
wait(0.5);
|
|
}
|
|
|
|
wait(3);
|
|
}
|
|
}
|
|
|
|
var_06 = maps\_utility::get_closest_player_healthy(var_02.origin);
|
|
var_07 = var_06.origin;
|
|
var_08 = get_linked_points(var_02,var_03,var_01,var_06,var_07);
|
|
var_08[var_08.size] = var_03;
|
|
var_04 = var_03;
|
|
var_09 = common_scripts\utility::getclosest(var_07,var_01);
|
|
var_0A = common_scripts\utility::getclosest(var_07,var_08);
|
|
foreach(var_0C in var_08)
|
|
{
|
|
if(var_06 sightconetrace(var_0C.origin,var_02) != 1)
|
|
{
|
|
var_08 = common_scripts\utility::array_remove(var_08,var_0C);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
var_0E = common_scripts\utility::getclosest(var_07,var_08);
|
|
if(var_08.size < 2)
|
|
{
|
|
var_03 = var_0A;
|
|
}
|
|
else if(var_0E != var_09)
|
|
{
|
|
var_03 = var_0E;
|
|
}
|
|
else
|
|
{
|
|
var_0F = [];
|
|
var_0F[0] = var_0E;
|
|
var_08 = common_scripts\utility::get_array_of_closest(var_07,var_08,var_0F,2);
|
|
var_10 = randomint(var_08.size);
|
|
if(randomint(100) > 50)
|
|
{
|
|
var_03 = var_08[var_10];
|
|
}
|
|
else
|
|
{
|
|
var_03 = var_09;
|
|
}
|
|
}
|
|
|
|
var_11 = randomfloatrange(level.attackhelimovetime - 0.5,level.attackhelimovetime + 0.5);
|
|
common_scripts\utility::waittill_notify_or_timeout("damage_by_player",var_11);
|
|
}
|
|
}
|
|
|
|
//Function Number: 15
|
|
player_is_aiming_with_rocket(param_00)
|
|
{
|
|
if(!level.player usingantiairweapon())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!level.player adsbuttonpressed())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_01 = level.player geteye();
|
|
if(sighttracepassed(var_01,param_00.origin,0,level.player))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 16
|
|
heli_shoot_think()
|
|
{
|
|
self endon("stop_shooting");
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
thread heli_missiles_think();
|
|
var_00 = level.attackhelirange * level.attackhelirange;
|
|
level.attackheligraceperiod = 0;
|
|
while(isdefined(self))
|
|
{
|
|
wait(randomfloatrange(0.8,1.3));
|
|
if(!heli_has_target() || !heli_has_player_target())
|
|
{
|
|
var_01 = heli_get_target_player_only();
|
|
if(isplayer(var_01))
|
|
{
|
|
self.etarget = var_01;
|
|
}
|
|
}
|
|
|
|
if(heli_has_player_target() && level.players.size > 1)
|
|
{
|
|
var_02 = maps\_utility::get_closest_player_healthy(self.origin);
|
|
if(self.etarget != var_02)
|
|
{
|
|
var_01 = heli_get_target_player_only();
|
|
if(isplayer(var_01))
|
|
{
|
|
self.etarget = var_01;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(heli_has_player_target())
|
|
{
|
|
if(!heli_can_see_target() || level.attackheligraceperiod == 1)
|
|
{
|
|
var_01 = heli_get_target_ai_only();
|
|
self.etarget = var_01;
|
|
}
|
|
}
|
|
|
|
if(isdefined(self.heli_lastattacker) && isplayer(self.heli_lastattacker))
|
|
{
|
|
self.etarget = self.heli_lastattacker;
|
|
}
|
|
else if(!heli_has_target())
|
|
{
|
|
var_01 = heli_get_target_ai_only();
|
|
self.etarget = var_01;
|
|
}
|
|
|
|
if(!heli_has_target())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(self.etarget is_hidden_from_heli(self))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(heli_has_target() && distancesquared(self.etarget.origin,self.origin) > var_00)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(self.turrettype == "default" && heli_has_player_target())
|
|
{
|
|
miss_player(self.etarget);
|
|
wait(randomfloatrange(0.8,1.3));
|
|
miss_player(self.etarget);
|
|
wait(randomfloatrange(0.8,1.3));
|
|
while(can_see_player(self.etarget) && !self.etarget is_hidden_from_heli(self))
|
|
{
|
|
fire_guns();
|
|
wait(randomfloatrange(2,4));
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if(isplayer(self.etarget) || isai(self.etarget))
|
|
{
|
|
fire_guns();
|
|
}
|
|
|
|
if(isplayer(self.etarget))
|
|
{
|
|
thread player_grace_period(self);
|
|
}
|
|
|
|
common_scripts\utility::waittill_notify_or_timeout("damage_by_player",level.attackhelitargetreaquire);
|
|
}
|
|
}
|
|
|
|
//Function Number: 17
|
|
player_grace_period(param_00)
|
|
{
|
|
level notify("player_is_heli_target");
|
|
level endon("player_is_heli_target");
|
|
level.attackheligraceperiod = 1;
|
|
param_00 common_scripts\utility::waittill_notify_or_timeout("damage_by_player",level.attackheliplayerbreak);
|
|
level.attackheligraceperiod = 0;
|
|
}
|
|
|
|
//Function Number: 18
|
|
heli_can_see_target()
|
|
{
|
|
if(!isdefined(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = self.etarget.origin + (0,0,32);
|
|
if(isplayer(self.etarget))
|
|
{
|
|
var_00 = self.etarget geteye();
|
|
}
|
|
|
|
var_01 = self gettagorigin("tag_flash");
|
|
var_02 = sighttracepassed(var_01,var_00,0,self);
|
|
return var_02;
|
|
}
|
|
|
|
//Function Number: 19
|
|
heli_has_player_target()
|
|
{
|
|
if(!isdefined(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(isplayer(self.etarget))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 20
|
|
heli_has_target()
|
|
{
|
|
if(!isdefined(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!isalive(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.etarget == self.targetdefault)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 21
|
|
heli_get_target()
|
|
{
|
|
var_00 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,1,0,1,level.attackheliexcluders);
|
|
if(isdefined(var_00) && isplayer(var_00))
|
|
{
|
|
var_00 = self.targetdefault;
|
|
}
|
|
|
|
if(!isdefined(var_00))
|
|
{
|
|
var_00 = self.targetdefault;
|
|
}
|
|
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 22
|
|
heli_get_target_player_only()
|
|
{
|
|
var_00 = getaiarray("allies");
|
|
var_01 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,0,0,0,var_00);
|
|
if(!isdefined(var_01))
|
|
{
|
|
var_01 = self.targetdefault;
|
|
}
|
|
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 23
|
|
heli_get_target_ai_only()
|
|
{
|
|
var_00 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,1,0,1,level.players);
|
|
if(!isdefined(var_00))
|
|
{
|
|
var_00 = self.targetdefault;
|
|
}
|
|
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 24
|
|
heli_missiles_think()
|
|
{
|
|
if(!isdefined(self.script_missiles))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("stop_shooting");
|
|
var_00 = undefined;
|
|
var_01 = "turret_attackheli";
|
|
var_02 = "missile_attackheli";
|
|
var_03 = undefined;
|
|
var_04 = undefined;
|
|
var_05 = [];
|
|
switch(self.vehicletype)
|
|
{
|
|
case "mi28":
|
|
var_00 = 1;
|
|
var_03 = 1;
|
|
var_04 = 0.5;
|
|
var_05[0] = "tag_store_L_2_a";
|
|
var_05[1] = "tag_store_R_2_a";
|
|
var_05[2] = "tag_store_L_2_b";
|
|
var_05[3] = "tag_store_R_2_b";
|
|
var_05[4] = "tag_store_L_2_c";
|
|
var_05[5] = "tag_store_R_2_c";
|
|
var_05[6] = "tag_store_L_2_d";
|
|
var_05[7] = "tag_store_R_2_d";
|
|
break;
|
|
|
|
case "littlebird":
|
|
case "apache":
|
|
var_00 = 1;
|
|
var_03 = 1;
|
|
var_04 = 0.5;
|
|
var_05[0] = "tag_missile_left";
|
|
var_05[1] = "tag_missile_right";
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
var_06 = -1;
|
|
for(;;)
|
|
{
|
|
wait(0.05);
|
|
self waittill("fire_missiles",var_07);
|
|
if(!isplayer(var_07))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_08 = var_07;
|
|
if(!player_is_good_missile_target(var_08))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
for(var_09 = 0;var_09 < var_00;var_09++)
|
|
{
|
|
var_06++;
|
|
if(var_06 >= var_05.size)
|
|
{
|
|
var_06 = 0;
|
|
}
|
|
|
|
self setvehweapon(var_02);
|
|
self.firingmissiles = 1;
|
|
var_0A = self fireweapon(var_05[var_06],var_08);
|
|
var_0A thread missilelosetarget(var_04);
|
|
var_0A thread missile_earthquake();
|
|
if(var_09 < var_00 - 1)
|
|
{
|
|
wait(var_03);
|
|
}
|
|
}
|
|
|
|
self.firingmissiles = 0;
|
|
self setvehweapon(var_01);
|
|
wait(10);
|
|
}
|
|
}
|
|
|
|
//Function Number: 25
|
|
player_is_good_missile_target(param_00)
|
|
{
|
|
if(self.moving)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 26
|
|
missile_earthquake()
|
|
{
|
|
if(distancesquared(self.origin,level.player.origin) > 9000000)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_00 = self.origin;
|
|
while(isdefined(self))
|
|
{
|
|
var_00 = self.origin;
|
|
wait(0.1);
|
|
}
|
|
|
|
earthquake(0.7,1.5,var_00,1600);
|
|
}
|
|
|
|
//Function Number: 27
|
|
missilelosetarget(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
wait(param_00);
|
|
if(isdefined(self))
|
|
{
|
|
self missile_cleartarget();
|
|
}
|
|
}
|
|
|
|
//Function Number: 28
|
|
get_different_player(param_00)
|
|
{
|
|
for(var_01 = 0;var_01 < level.players.size;var_01++)
|
|
{
|
|
if(param_00 != level.players[var_01])
|
|
{
|
|
return level.players[var_01];
|
|
}
|
|
}
|
|
|
|
return level.players[0];
|
|
}
|
|
|
|
//Function Number: 29
|
|
notify_disable()
|
|
{
|
|
self notify("notify_disable_thread");
|
|
self endon("notify_disable_thread");
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
for(;;)
|
|
{
|
|
self waittill("disable_turret");
|
|
self.allowshoot = 0;
|
|
}
|
|
}
|
|
|
|
//Function Number: 30
|
|
notify_enable()
|
|
{
|
|
self notify("notify_enable_thread");
|
|
self endon("notify_enable_thread");
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
for(;;)
|
|
{
|
|
self waittill("enable_turret");
|
|
self.allowshoot = 1;
|
|
}
|
|
}
|
|
|
|
//Function Number: 31
|
|
fire_guns()
|
|
{
|
|
switch(self.turrettype)
|
|
{
|
|
case "default":
|
|
var_00 = randomintrange(5,10);
|
|
var_01 = weaponfiretime("turret_attackheli");
|
|
turret_default_fire(self.etarget,var_00,var_01);
|
|
break;
|
|
|
|
case "miniguns":
|
|
var_00 = getburstsize(self.etarget);
|
|
if(self.allowshoot && !self.firingmissiles)
|
|
{
|
|
turret_minigun_fire(self.etarget,var_00);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 32
|
|
getburstsize(param_00)
|
|
{
|
|
var_01 = undefined;
|
|
if(!isplayer(param_00))
|
|
{
|
|
var_01 = level.attackheliaiburstsize;
|
|
return var_01;
|
|
}
|
|
|
|
switch(level.gameskill)
|
|
{
|
|
case 3:
|
|
case 2:
|
|
case 1:
|
|
case 0:
|
|
var_01 = randomintrange(2,3);
|
|
break;
|
|
}
|
|
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 33
|
|
fire_missiles(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
wait(param_00);
|
|
if(!isplayer(self.etarget))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self notify("fire_missiles",self.etarget);
|
|
}
|
|
|
|
//Function Number: 34
|
|
turret_default_fire(param_00,param_01,param_02)
|
|
{
|
|
thread fire_missiles(randomfloatrange(0.2,2));
|
|
for(var_03 = 0;var_03 < param_01;var_03++)
|
|
{
|
|
self setturrettargetent(param_00,common_scripts\utility::randomvector(50) + (0,0,32));
|
|
if(self.allowshoot && !self.firingmissiles)
|
|
{
|
|
self fireweapon();
|
|
}
|
|
|
|
wait(param_02);
|
|
}
|
|
}
|
|
|
|
//Function Number: 35
|
|
turret_minigun_fire(param_00,param_01,param_02)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self notify("firing_miniguns");
|
|
self endon("firing_miniguns");
|
|
var_03 = get_turrets();
|
|
common_scripts\utility::array_thread(var_03,::turret_minigun_target_track,param_00,self);
|
|
if(!self.minigunsspinning)
|
|
{
|
|
self.firingguns = 1;
|
|
thread maps\_utility::play_sound_on_tag("littlebird_gatling_spinup","tag_flash");
|
|
wait(2.1);
|
|
thread maps\_utility::play_loop_sound_on_tag("littlebird_minigun_spinloop","tag_flash");
|
|
}
|
|
|
|
self.minigunsspinning = 1;
|
|
if(!isdefined(param_02))
|
|
{
|
|
param_02 = 3;
|
|
}
|
|
|
|
var_04 = 0.5;
|
|
if(var_04 > param_02)
|
|
{
|
|
var_04 = param_02;
|
|
}
|
|
|
|
if(var_04 > 0)
|
|
{
|
|
wait(randomfloatrange(var_04,param_02));
|
|
}
|
|
|
|
minigun_fire(param_00,param_01);
|
|
var_03 = get_turrets();
|
|
common_scripts\utility::array_call(var_03,::stopfiring);
|
|
thread minigun_spindown(param_00);
|
|
self notify("stopping_firing");
|
|
}
|
|
|
|
//Function Number: 36
|
|
minigun_fire(param_00,param_01)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
if(isplayer(param_00))
|
|
{
|
|
self endon("cant_see_player");
|
|
}
|
|
|
|
var_02 = get_turrets();
|
|
common_scripts\utility::array_call(var_02,::startfiring);
|
|
wait(randomfloatrange(1,2));
|
|
if(isplayer(param_00))
|
|
{
|
|
thread target_track(param_00);
|
|
}
|
|
|
|
if(isplayer(param_00))
|
|
{
|
|
var_03 = randomfloatrange(0.5,3);
|
|
thread fire_missiles(var_03);
|
|
}
|
|
|
|
wait(param_01);
|
|
}
|
|
|
|
//Function Number: 37
|
|
target_track(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("stopping_firing");
|
|
self notify("tracking_player");
|
|
self endon("tracking_player");
|
|
for(;;)
|
|
{
|
|
if(!can_see_player(param_00))
|
|
{
|
|
break;
|
|
}
|
|
|
|
wait(0.5);
|
|
}
|
|
|
|
wait(level.attackhelitimeout);
|
|
self notify("cant_see_player");
|
|
}
|
|
|
|
//Function Number: 38
|
|
turret_minigun_target_track(param_00,param_01)
|
|
{
|
|
param_01 endon("death");
|
|
param_01 endon("heli_players_dead");
|
|
self notify("miniguns_have_new_target");
|
|
self endon("miniguns_have_new_target");
|
|
if(!isplayer(param_00) && isai(param_00) && level.attackhelikillsai == 0)
|
|
{
|
|
var_02 = spawn("script_origin",param_00.origin + (0,0,100));
|
|
var_02 linkto(param_00);
|
|
thread minigun_ai_target_cleanup(var_02);
|
|
param_00 = var_02;
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
wait(0.5);
|
|
self settargetentity(param_00);
|
|
}
|
|
}
|
|
|
|
//Function Number: 39
|
|
minigun_ai_target_cleanup(param_00)
|
|
{
|
|
common_scripts\utility::waittill_either("death","miniguns_have_new_target");
|
|
param_00 delete();
|
|
}
|
|
|
|
//Function Number: 40
|
|
minigun_spindown(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("firing_miniguns");
|
|
if(isplayer(param_00))
|
|
{
|
|
wait(randomfloatrange(3,4));
|
|
}
|
|
else
|
|
{
|
|
wait(randomfloatrange(1,2));
|
|
}
|
|
|
|
thread minigun_spindown_sound();
|
|
self.firingguns = 0;
|
|
}
|
|
|
|
//Function Number: 41
|
|
minigun_spindown_sound()
|
|
{
|
|
self notify("stop soundlittlebird_minigun_spinloop");
|
|
self.minigunsspinning = 0;
|
|
maps\_utility::play_sound_on_tag("littlebird_gatling_cooldown","tag_flash");
|
|
}
|
|
|
|
//Function Number: 42
|
|
miss_player(param_00)
|
|
{
|
|
var_01 = anglestoforward(level.player.angles);
|
|
var_02 = var_01 * 400;
|
|
var_03 = var_02 + common_scripts\utility::randomvector(50);
|
|
var_04 = randomintrange(10,20);
|
|
var_05 = weaponfiretime("turret_attackheli");
|
|
for(var_06 = 0;var_06 < var_04;var_06++)
|
|
{
|
|
var_03 = var_02 + common_scripts\utility::randomvector(50);
|
|
self setturrettargetent(param_00,var_03);
|
|
if(self.allowshoot)
|
|
{
|
|
self fireweapon();
|
|
}
|
|
|
|
wait(var_05);
|
|
}
|
|
}
|
|
|
|
//Function Number: 43
|
|
can_see_player(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
var_01 = self gettagorigin("tag_flash");
|
|
var_02 = (0,0,0);
|
|
if(isplayer(param_00))
|
|
{
|
|
var_02 = param_00 geteye();
|
|
}
|
|
else
|
|
{
|
|
var_02 = param_00.origin;
|
|
}
|
|
|
|
if(sighttracepassed(var_01,var_02,0,undefined))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 44
|
|
get_linked_points(param_00,param_01,param_02,param_03,param_04)
|
|
{
|
|
var_05 = [];
|
|
var_06 = strtok(param_01.script_linkto," ");
|
|
for(var_07 = 0;var_07 < param_02.size;var_07++)
|
|
{
|
|
for(var_08 = 0;var_08 < var_06.size;var_08++)
|
|
{
|
|
if(param_02[var_07].script_linkname == var_06[var_08])
|
|
{
|
|
var_05[var_05.size] = param_02[var_07];
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach(var_0A in var_05)
|
|
{
|
|
if(var_0A.origin[2] < param_04[2])
|
|
{
|
|
var_05 = common_scripts\utility::array_remove(var_05,var_0A);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return var_05;
|
|
}
|
|
|
|
//Function Number: 45
|
|
heli_damage_monitor()
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("crashing");
|
|
self endon("leaving");
|
|
self.damagetaken = 0;
|
|
self.seen_attacker = undefined;
|
|
for(;;)
|
|
{
|
|
self waittill("damage",var_00,var_01,var_02,var_03,var_04);
|
|
if(!isdefined(var_01) || !isplayer(var_01))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
self notify("damage_by_player");
|
|
thread heli_damage_update();
|
|
thread can_see_attacker_for_a_bit(var_01);
|
|
if(maps\_utility::is_damagefeedback_hud_enabled())
|
|
{
|
|
var_01 thread updatedamagefeedbackhud();
|
|
}
|
|
|
|
if(maps\_utility::is_damagefeedback_snd_enabled())
|
|
{
|
|
var_01 thread updatedamagefeedbacksnd();
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 46
|
|
heli_damage_update()
|
|
{
|
|
self notify("taking damage");
|
|
self endon("taking damage");
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self.istakingdamage = 1;
|
|
wait(1);
|
|
self.istakingdamage = 0;
|
|
}
|
|
|
|
//Function Number: 47
|
|
can_see_attacker_for_a_bit(param_00)
|
|
{
|
|
self notify("attacker_seen");
|
|
self endon("attacker_seen");
|
|
self.seen_attacker = param_00;
|
|
self.heli_lastattacker = param_00;
|
|
wait(level.attackhelimemory);
|
|
self.heli_lastattacker = undefined;
|
|
self.seen_attacker = undefined;
|
|
}
|
|
|
|
//Function Number: 48
|
|
is_hidden_from_heli(param_00)
|
|
{
|
|
if(isdefined(param_00.seen_attacker))
|
|
{
|
|
if(param_00.seen_attacker == self)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if(isdefined(level.attack_heli_safe_volumes))
|
|
{
|
|
foreach(var_02 in level.attack_heli_safe_volumes)
|
|
{
|
|
if(self istouching(var_02))
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 49
|
|
updatedamagefeedbackhud()
|
|
{
|
|
if(!isplayer(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.hud_damagefeedback setshader("damage_feedback",24,48);
|
|
self.hud_damagefeedback.alpha = 1;
|
|
self.hud_damagefeedback fadeovertime(1);
|
|
self.hud_damagefeedback.alpha = 0;
|
|
}
|
|
|
|
//Function Number: 50
|
|
updatedamagefeedbacksnd()
|
|
{
|
|
if(!isplayer(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self playlocalsound("player_feedback_hit_alert");
|
|
}
|
|
|
|
//Function Number: 51
|
|
damage_feedback_setup()
|
|
{
|
|
for(var_00 = 0;var_00 < level.players.size;var_00++)
|
|
{
|
|
var_01 = level.players[var_00];
|
|
var_01.hud_damagefeedback = newclienthudelem(var_01);
|
|
var_01.hud_damagefeedback.horzalign = "center";
|
|
var_01.hud_damagefeedback.vertalign = "middle";
|
|
var_01.hud_damagefeedback.x = -12;
|
|
var_01.hud_damagefeedback.y = -12;
|
|
var_01.hud_damagefeedback.alpha = 0;
|
|
var_01.hud_damagefeedback.archived = 1;
|
|
var_01.hud_damagefeedback setshader("damage_feedback",24,48);
|
|
}
|
|
}
|
|
|
|
//Function Number: 52
|
|
heli_death_monitor()
|
|
{
|
|
self waittill("death");
|
|
level notify("attack_heli_destroyed");
|
|
level.enemy_heli_killed = 1;
|
|
wait(15);
|
|
level.enemy_heli_attacking = 0;
|
|
}
|
|
|
|
//Function Number: 53
|
|
dialog_nags_heli(param_00)
|
|
{
|
|
param_00 endon("death");
|
|
param_00 endon("heli_players_dead");
|
|
wait(30);
|
|
if(!level.enemy_heli_attacking)
|
|
{
|
|
return;
|
|
}
|
|
|
|
commander_dialog("co_cf_cmd_heli_small_fire");
|
|
if(!level.enemy_heli_attacking)
|
|
{
|
|
return;
|
|
}
|
|
|
|
commander_dialog("co_cf_cmd_rpg_stinger");
|
|
wait(30);
|
|
if(!level.enemy_heli_attacking)
|
|
{
|
|
return;
|
|
}
|
|
|
|
commander_dialog("co_cf_cmd_heli_wonders");
|
|
}
|
|
|
|
//Function Number: 54
|
|
commander_dialog(param_00)
|
|
{
|
|
while(level.commander_speaking)
|
|
{
|
|
wait(1);
|
|
}
|
|
|
|
level.commander_speaking = 1;
|
|
level.player playsound(param_00,"sounddone");
|
|
level.player waittill("sounddone");
|
|
wait(0.5);
|
|
level.commander_speaking = 0;
|
|
}
|
|
|
|
//Function Number: 55
|
|
usingantiairweapon()
|
|
{
|
|
var_00 = self getcurrentweapon();
|
|
if(!isdefined(var_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(issubstr(tolower(var_00),"rpg"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(issubstr(tolower(var_00),"stinger"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(issubstr(tolower(var_00),"at4"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 56
|
|
heli_spotlight_cleanup(param_00)
|
|
{
|
|
common_scripts\utility::waittill_any("death","crash_done","turn_off_spotlight");
|
|
self.spotlight = undefined;
|
|
if(isdefined(self))
|
|
{
|
|
stopfxontag(common_scripts\utility::getfx("_attack_heli_spotlight"),self,param_00);
|
|
}
|
|
}
|
|
|
|
//Function Number: 57
|
|
heli_spotlight_create_default_targets(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
var_01 = self.targetdefault;
|
|
if(isdefined(param_00))
|
|
{
|
|
var_01 = param_00;
|
|
}
|
|
|
|
var_01.targetname = "original_ent";
|
|
self.left_ent = spawn("script_origin",var_01.origin);
|
|
self.left_ent.origin = var_01.origin;
|
|
self.left_ent.angles = var_01.angles;
|
|
self.left_ent.targetname = "left_ent";
|
|
self.right_ent = spawn("script_origin",var_01.origin);
|
|
self.right_ent.origin = var_01.origin;
|
|
self.right_ent.angles = var_01.angles;
|
|
self.right_ent.targetname = "right_ent";
|
|
var_02 = spawnstruct();
|
|
var_02.entity = self.left_ent;
|
|
var_02.right = 250;
|
|
var_02 maps\_utility::translate_local();
|
|
self.left_ent linkto(self);
|
|
var_03 = spawnstruct();
|
|
var_03.entity = self.right_ent;
|
|
var_03.right = -250;
|
|
var_03 maps\_utility::translate_local();
|
|
self.right_ent linkto(self);
|
|
var_04 = [];
|
|
var_04[0] = var_01;
|
|
var_04[1] = self.left_ent;
|
|
var_04[2] = self.right_ent;
|
|
level.spotlight_aim_ents = var_04;
|
|
self.spottarget = var_01;
|
|
}
|
|
|
|
//Function Number: 58
|
|
heli_spotlight_destroy_default_targets()
|
|
{
|
|
if(isdefined(level.spotlight_aim_ents))
|
|
{
|
|
foreach(var_01 in level.spotlight_aim_ents)
|
|
{
|
|
if(isdefined(var_01))
|
|
{
|
|
var_01 delete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 59
|
|
heli_spotlight_aim(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
if(self.vehicletype != "littlebird")
|
|
{
|
|
return;
|
|
}
|
|
|
|
thread heli_spotlight_think(param_00);
|
|
var_01 = undefined;
|
|
for(;;)
|
|
{
|
|
wait(0.05);
|
|
switch(self.vehicletype)
|
|
{
|
|
case "littlebird_spotlight":
|
|
case "littlebird":
|
|
var_01 = self.spottarget;
|
|
break;
|
|
|
|
default:
|
|
var_01 = self.etarget;
|
|
break;
|
|
}
|
|
|
|
if(isdefined(var_01))
|
|
{
|
|
self setturrettargetent(var_01,(0,0,0));
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 60
|
|
heli_spotlight_think(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
heli_spotlight_create_default_targets();
|
|
common_scripts\utility::array_thread(level.spotlight_aim_ents,::heli_spotlight_aim_ents_cleanup,self);
|
|
if(isdefined(param_00))
|
|
{
|
|
self thread [[ param_00 ]]();
|
|
return;
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
wait(randomfloatrange(1,3));
|
|
if(heli_has_player_target() && !within_player_fov())
|
|
{
|
|
self.spottarget = self.etarget;
|
|
continue;
|
|
}
|
|
|
|
var_01 = randomint(level.spotlight_aim_ents.size);
|
|
self.targetdefault = level.spotlight_aim_ents[var_01];
|
|
self.spottarget = self.targetdefault;
|
|
}
|
|
}
|
|
|
|
//Function Number: 61
|
|
within_player_fov()
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
if(!isdefined(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!isplayer(self.etarget))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = self.etarget;
|
|
var_01 = common_scripts\utility::within_fov(var_00 geteye(),var_00 getplayerangles(),self.origin,level.cosine["35"]);
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 62
|
|
heli_spotlight_aim_ents_cleanup(param_00)
|
|
{
|
|
param_00 common_scripts\utility::waittill_either("death","crash_done");
|
|
if(isdefined(self))
|
|
{
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
//Function Number: 63
|
|
littlebird_turrets_think(param_00)
|
|
{
|
|
var_01 = self;
|
|
var_01 maps\_vehicle_code::turret_set_default_on_mode("manual");
|
|
if(isdefined(param_00.targetdefault))
|
|
{
|
|
var_01 settargetentity(param_00.targetdefault);
|
|
}
|
|
|
|
var_01 setmode("manual");
|
|
param_00 waittill("death");
|
|
if(isdefined(param_00.firingguns) && param_00.firingguns == 1)
|
|
{
|
|
thread minigun_spindown_sound();
|
|
}
|
|
}
|
|
|
|
//Function Number: 64
|
|
attack_heli_cleanup()
|
|
{
|
|
common_scripts\utility::waittill_either("death","crash_done");
|
|
if(isdefined(self.attractor))
|
|
{
|
|
missile_deleteattractor(self.attractor);
|
|
}
|
|
|
|
if(isdefined(self.attractor2))
|
|
{
|
|
missile_deleteattractor(self.attractor2);
|
|
}
|
|
}
|
|
|
|
//Function Number: 65
|
|
heli_default_missiles_on(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("stop_default_heli_missiles");
|
|
self.preferredtarget = undefined;
|
|
while(isdefined(self))
|
|
{
|
|
wait(0.05);
|
|
var_01 = undefined;
|
|
var_02 = undefined;
|
|
var_03 = undefined;
|
|
self.preferredtarget = undefined;
|
|
var_04 = undefined;
|
|
if(isdefined(self.currentnode) && isdefined(self.currentnode.target))
|
|
{
|
|
var_04 = maps\_utility::getent_or_struct(self.currentnode.target,"targetname");
|
|
}
|
|
|
|
if(isdefined(var_04) && isdefined(var_04.script_linkto))
|
|
{
|
|
self.preferredtarget = maps\_utility::getent_or_struct(var_04.script_linkto,"script_linkname");
|
|
}
|
|
|
|
if(isdefined(self.preferredtarget))
|
|
{
|
|
var_01 = self.preferredtarget;
|
|
var_02 = var_01.script_shotcount;
|
|
var_03 = var_01.script_delay;
|
|
var_04 waittill("trigger");
|
|
continue;
|
|
}
|
|
|
|
common_scripts\utility::waittill_any("near_goal","goal");
|
|
if(isdefined(var_01))
|
|
{
|
|
thread heli_fire_missiles(var_01,var_02,var_03,param_00);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 66
|
|
heli_default_missiles_off()
|
|
{
|
|
self notify("stop_default_heli_missiles");
|
|
}
|
|
|
|
//Function Number: 67
|
|
heli_spotlight_on(param_00,param_01,param_02)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
param_00 = "tag_barrel";
|
|
}
|
|
|
|
if(!isdefined(param_01))
|
|
{
|
|
param_01 = 0;
|
|
}
|
|
|
|
if(!isdefined(param_02))
|
|
{
|
|
param_02 = 0;
|
|
}
|
|
|
|
playfxontag(common_scripts\utility::getfx("_attack_heli_spotlight"),self,param_00);
|
|
self.spotlight = 1;
|
|
thread heli_spotlight_cleanup(param_00);
|
|
if(param_02)
|
|
{
|
|
self setturrettargetent(level.player);
|
|
return;
|
|
}
|
|
|
|
if(param_01)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
var_03 = self gettagorigin("tag_origin");
|
|
if(!isdefined(self.targetdefault))
|
|
{
|
|
heli_default_target_setup();
|
|
}
|
|
|
|
self setturrettargetent(self.targetdefault);
|
|
thread heli_spotlight_aim();
|
|
}
|
|
}
|
|
|
|
//Function Number: 68
|
|
heli_spotlight_off()
|
|
{
|
|
self notify("turn_off_spotlight");
|
|
}
|
|
|
|
//Function Number: 69
|
|
heli_spotlight_random_targets_on()
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
self endon("stop_spotlight_random_targets");
|
|
if(!isdefined(self.targetdefault))
|
|
{
|
|
thread heli_default_target_setup();
|
|
}
|
|
|
|
if(!isdefined(self.left_ent))
|
|
{
|
|
thread heli_spotlight_think();
|
|
}
|
|
|
|
while(isdefined(self))
|
|
{
|
|
wait(0.05);
|
|
self setturrettargetent(self.targetdefault,(0,0,0));
|
|
}
|
|
}
|
|
|
|
//Function Number: 70
|
|
heli_spotlight_random_targets_off()
|
|
{
|
|
self notify("stop_spotlight_random_targets");
|
|
}
|
|
|
|
//Function Number: 71
|
|
heli_fire_missiles(param_00,param_01,param_02,param_03)
|
|
{
|
|
self endon("death");
|
|
self endon("heli_players_dead");
|
|
if(isdefined(self.defaultweapon))
|
|
{
|
|
var_04 = self.defaultweapon;
|
|
}
|
|
else
|
|
{
|
|
var_04 = "turret_attackheli";
|
|
}
|
|
|
|
var_05 = "missile_attackheli";
|
|
if(isdefined(param_03))
|
|
{
|
|
var_05 = param_03;
|
|
}
|
|
|
|
var_06 = undefined;
|
|
var_07 = [];
|
|
self setvehweapon(var_04);
|
|
if(!isdefined(param_01))
|
|
{
|
|
param_01 = 1;
|
|
}
|
|
|
|
if(!isdefined(param_02))
|
|
{
|
|
param_02 = 1;
|
|
}
|
|
|
|
if(!isdefined(param_00.classname))
|
|
{
|
|
if(!isdefined(self.dummytarget))
|
|
{
|
|
self.dummytarget = spawn("script_origin",param_00.origin);
|
|
thread common_scripts\utility::delete_on_death(self.dummytarget);
|
|
}
|
|
|
|
self.dummytarget.origin = param_00.origin;
|
|
param_00 = self.dummytarget;
|
|
}
|
|
|
|
switch(self.vehicletype)
|
|
{
|
|
case "mi28":
|
|
var_06 = 0.5;
|
|
var_07[0] = "tag_store_L_2_a";
|
|
var_07[1] = "tag_store_R_2_a";
|
|
var_07[2] = "tag_store_L_2_b";
|
|
var_07[3] = "tag_store_R_2_b";
|
|
var_07[4] = "tag_store_L_2_c";
|
|
var_07[5] = "tag_store_R_2_c";
|
|
var_07[6] = "tag_store_L_2_d";
|
|
var_07[7] = "tag_store_R_2_d";
|
|
break;
|
|
|
|
case "littlebird":
|
|
case "apache":
|
|
var_06 = 0.5;
|
|
var_07[0] = "tag_missile_left";
|
|
var_07[1] = "tag_missile_right";
|
|
break;
|
|
|
|
case "hind_battle":
|
|
var_07[0] = "tag_missile_left";
|
|
var_07[1] = "tag_missile_right";
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
var_08 = -1;
|
|
for(var_09 = 0;var_09 < param_01;var_09++)
|
|
{
|
|
var_08++;
|
|
if(var_08 >= var_07.size)
|
|
{
|
|
var_08 = 0;
|
|
}
|
|
|
|
self setvehweapon(var_05);
|
|
self.firingmissiles = 1;
|
|
var_0A = self fireweapon(var_07[var_08],param_00);
|
|
var_0A thread missile_earthquake();
|
|
if(var_09 < param_01 - 1)
|
|
{
|
|
wait(param_02);
|
|
}
|
|
}
|
|
|
|
self.firingmissiles = 0;
|
|
self setvehweapon(var_04);
|
|
}
|
|
|
|
//Function Number: 72
|
|
boneyard_style_heli_missile_attack()
|
|
{
|
|
self waittill("trigger",var_00);
|
|
var_01 = common_scripts\utility::getstructarray(self.target,"targetname");
|
|
var_01 = maps\_utility::array_index_by_script_index(var_01);
|
|
boneyard_fire_at_targets(var_00,var_01);
|
|
}
|
|
|
|
//Function Number: 73
|
|
boneyard_style_heli_missile_attack_linked()
|
|
{
|
|
self waittill("trigger",var_00);
|
|
var_01 = maps\_utility::get_linked_structs();
|
|
var_01 = maps\_utility::array_index_by_script_index(var_01);
|
|
boneyard_fire_at_targets(var_00,var_01);
|
|
}
|
|
|
|
//Function Number: 74
|
|
boneyard_fire_at_targets(param_00,param_01)
|
|
{
|
|
var_02 = [];
|
|
var_02[0] = "tag_missile_right";
|
|
var_02[1] = "tag_missile_left";
|
|
if(param_00.vehicletype == "cobra")
|
|
{
|
|
var_02[0] = "tag_store_L_1_a";
|
|
var_02[1] = "tag_store_R_1_a";
|
|
}
|
|
|
|
var_03 = [];
|
|
for(var_04 = 0;var_04 < param_01.size;var_04++)
|
|
{
|
|
var_03[var_04] = spawn("script_origin",param_01[var_04].origin);
|
|
param_00 setvehweapon("littlebird_FFAR");
|
|
param_00 setturrettargetent(var_03[var_04]);
|
|
var_05 = param_00 fireweapon(var_02[var_04 % var_02.size],var_03[var_04],(0,0,0));
|
|
var_05 common_scripts\utility::delaycall(1,::missile_cleartarget);
|
|
wait(randomfloatrange(0.2,0.3));
|
|
}
|
|
|
|
wait(2);
|
|
foreach(var_07 in var_03)
|
|
{
|
|
var_07 delete();
|
|
}
|
|
} |