Files
IL-GSC/MW3/PC/SP/maps/_chopperboss.gsc
InfinityLoader d559c1d414 Added MW3 Scripts
2023-10-27 03:47:01 -04:00

584 lines
11 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\_chopperboss.gsc
* Game: Call of Duty: Modern Warfare 3
* Platform: PC
* Function Count: 19
* Decompile Time: 328 ms
* Timestamp: 10/27/2023 2:21:06 AM
*******************************************************************/
//Function Number: 1
chopper_boss_load_fx()
{
level._effect["chopper_boss_light_smoke"] = loadfx("smoke/smoke_trail_white_heli");
level._effect["chopper_boss_heavy_smoke"] = loadfx("smoke/smoke_trail_black_heli");
}
//Function Number: 2
chopper_boss_locs_populate(param_00,param_01)
{
level.chopper_boss_locs = common_scripts\utility::getstructarray(param_01,param_00);
foreach(var_03 in level.chopper_boss_locs)
{
var_03.neighbors = var_03 maps\_utility::get_linked_structs();
foreach(var_05 in level.chopper_boss_locs)
{
if(var_03 == var_05)
{
continue;
}
if(!maps\_utility::array_contains(var_03.neighbors,var_05) && maps\_utility::array_contains(var_05 maps\_utility::get_linked_structs(),var_03))
{
var_03.neighbors[var_03.neighbors.size] = var_05;
}
}
}
}
//Function Number: 3
chopper_path_release(param_00,param_01)
{
if(isdefined(param_01))
{
var_02 = strtok(param_01," ");
foreach(var_04 in var_02)
{
self endon(var_04);
}
}
var_06 = strtok(param_00," ");
switch(var_06.size)
{
case 1:
self waittill(var_06[0]);
break;
case 2:
common_scripts\utility::waittill_either(var_06[0],var_06[1]);
break;
case 3:
common_scripts\utility::waittill_any(var_06[0],var_06[1],var_06[2]);
break;
case 4:
common_scripts\utility::waittill_any(var_06[0],var_06[1],var_06[2],var_06[3]);
break;
default:
break;
}
self.loc_current.in_use = undefined;
}
//Function Number: 4
chopper_boss_behavior_little_bird(param_00)
{
self endon("death");
self endon("deathspin");
level endon("special_op_terminated");
self.loc_current = param_00;
self.loc_current.in_use = 1;
chopper_boss_setup();
thread chopper_boss_damage_states();
thread chopper_event_on_death();
var_01 = 0;
for(;;)
{
self.heli_target = undefined;
var_02 = (isdefined(self.request_move) && self.request_move) || var_01;
while(isdefined(level.chopper_boss_finding_target) && level.chopper_boss_finding_target == 1)
{
wait 0.05;
}
var_03 = chopper_boss_get_best_location_and_target(var_02);
if(isdefined(var_03) && self.loc_current != var_03)
{
if(isdefined(self.heli_target))
{
self setlookatent(self.heli_target);
}
else
{
var_04 = maps\_utility::getclosest(self.origin,level.players);
if(isdefined(var_04))
{
self setlookatent(var_04);
}
}
self.request_move = undefined;
thread chopper_boss_move(var_03);
self waittill("reached_dynamic_path_end");
}
if(isdefined(self.heli_target))
{
var_01 = chopper_boss_attempt_firing(self.heli_target);
}
wait 0.1;
}
}
//Function Number: 5
chopper_boss_setup()
{
maps\_vehicle::mgoff();
chopper_boss_sentient();
maps\_utility::add_damagefeedback();
self.mgturret[1] unlink();
self.mgturret[1] delete();
var_00 = self.mgturret[0];
var_00 unlink();
var_00 linkto(self,"tag_turret",(0,0,0),(0,0,0));
var_00 setleftarc(45);
var_00 setrightarc(45);
var_00 settoparc(45);
var_00 setbottomarc(55);
var_00 setdefaultdroppitch(-10);
self.mgturret = [];
self.mgturret[self.mgturret.size] = var_00;
}
//Function Number: 6
chopper_event_on_death()
{
self waittill("death",var_00);
if(!isdefined(self))
{
return;
}
if(maps\_utility::is_survival())
{
playfx(level._effect["money"],self.origin + (0,0,-32));
}
}
//Function Number: 7
chopper_boss_damage_states()
{
self endon("death");
self endon("deathspin");
var_00 = self.health - self.healthbuffer;
var_01 = 0;
for(;;)
{
var_02 = self.health - self.healthbuffer;
if(var_02 <= var_00 * 0.5)
{
if(var_01 == 1)
{
var_01 = 2;
self.request_move = 1;
}
playfxontag(common_scripts\utility::getfx("chopper_boss_heavy_smoke"),self,"tag_engine");
}
else if(var_02 <= var_00 * 0.75)
{
if(var_01 == 0)
{
var_01 = 1;
self.request_move = 1;
}
playfxontag(common_scripts\utility::getfx("chopper_boss_light_smoke"),self,"tag_engine");
}
wait 0.05;
}
}
//Function Number: 8
chopper_boss_can_hit_from(param_00,param_01)
{
var_02 = self.mgturret[0].origin[2] - self.origin[2];
return bullettracepassed(param_00 + (0,0,var_02),param_01,0,self);
}
//Function Number: 9
chopper_boss_in_range(param_00)
{
var_01 = distance2d(self.origin,param_00);
var_02 = 384;
if(isdefined(level.chopper_boss_min_dist2d))
{
var_02 = level.chopper_boss_min_dist2d;
}
return var_01 >= var_02 && var_01 <= 3072;
}
//Function Number: 10
chopper_boss_set_target(param_00)
{
if(isdefined(param_00))
{
self.heli_target = param_00;
}
}
//Function Number: 11
chopper_boss_attempt_firing(param_00)
{
self endon("deathspin");
self endon("death");
var_01 = 0;
if(isdefined(param_00) && !isdefined(param_00.heli_shooting) && chopper_boss_in_range(param_00.origin))
{
thread chopper_boss_manage_shooting_flag(self.heli_target);
self setlookatent(param_00);
var_02 = chopper_boss_wait_face_target(param_00,5);
if(isdefined(param_00))
{
if(isdefined(var_02) && var_02)
{
chopper_boss_fire_turrets(param_00);
var_01 = 1;
}
}
self notify("chopper_done_shooting");
}
return var_01;
}
//Function Number: 12
chopper_boss_manage_shooting_flag(param_00)
{
param_00.heli_shooting = 1;
common_scripts\utility::waittill_any("death","deathspin","chopper_done_shooting");
if(isdefined(param_00))
{
param_00.heli_shooting = undefined;
}
}
//Function Number: 13
chopper_boss_wait_face_target(param_00,param_01)
{
self endon("death");
self endon("deathspin");
param_00 endon("death");
var_02 = undefined;
if(isdefined(param_01))
{
var_02 = gettime() + param_01 * 1000;
}
while(isdefined(param_00))
{
if(maps\_utility::within_fov_2d(self.origin,self.angles,param_00.origin,0))
{
return 1;
}
if(isdefined(var_02) && gettime() >= var_02)
{
return 0;
}
wait 0.25;
}
}
//Function Number: 14
chopper_boss_fire_turrets(param_00)
{
self endon("deathspin");
self endon("death");
param_00 endon("death");
var_01 = 20;
foreach(var_03 in self.mgturret)
{
if(isai(param_00))
{
var_03 settargetentity(param_00,param_00 geteye() - param_00.origin);
}
else if(isplayer(param_00))
{
if(maps\_utility::is_player_down(param_00))
{
var_01 = 60;
var_03 settargetentity(param_00);
}
else
{
var_03 settargetentity(param_00,param_00 geteye() - param_00.origin);
}
}
else
{
var_03 settargetentity(param_00,(0,0,32));
}
var_03 startbarrelspin();
}
wait 2;
var_05 = weaponfiretime("minigun_littlebird_spinnup");
var_06 = 0;
for(var_07 = 0;var_07 < var_01;var_07++)
{
self.mgturret[var_06] shootturret();
var_06++;
if(var_06 >= self.mgturret.size)
{
var_06 = 0;
}
wait var_05 + 0.05;
}
wait 1;
foreach(var_03 in self.mgturret)
{
var_03 stopbarrelspin();
}
}
//Function Number: 15
chopper_boss_manage_targeting_flag()
{
level.chopper_boss_finding_target = 1;
common_scripts\utility::waittill_any("death","deathspin","chopper_done_targeting");
level.chopper_boss_finding_target = undefined;
}
//Function Number: 16
chopper_boss_get_best_location_and_target(param_00)
{
self endon("death");
var_01 = self.loc_current.neighbors;
if(!isdefined(param_00) || param_00 == 0)
{
}
thread chopper_boss_manage_targeting_flag();
var_02 = [];
foreach(var_04 in level.players)
{
if(!maps\_utility::is_player_down(var_04) && !isdefined(var_04.ignoreme) || var_04.ignoreme == 0)
{
var_02[var_02.size] = var_04;
}
}
var_06 = getaiarray("allies");
foreach(var_08 in var_06)
{
if(!isdefined(var_08.ignoreme) || var_08.ignoreme == 0)
{
var_02[var_02.size] = var_08;
}
}
if(isdefined(level.placed_sentry))
{
foreach(var_0B in level.placed_sentry)
{
if(!isdefined(var_0B.ignoreme) || var_0B.ignoreme == 0)
{
var_02[var_02.size] = var_0B;
}
}
}
if(!var_02.size)
{
foreach(var_04 in level.players)
{
if(!maps\_utility::is_player_down_and_out(var_04) && !isdefined(var_04.ignoreme) || var_04.ignoreme == 0)
{
var_02[var_02.size] = var_04;
}
}
}
var_0F = [];
var_10 = 0;
foreach(var_12 in var_7B)
{
if(var_12 != self.loc_current && isdefined(var_12.in_use))
{
continue;
}
var_12.heli_target = undefined;
var_12.dist2d = undefined;
var_13 = undefined;
foreach(var_15 in var_02)
{
if(!isdefined(var_15))
{
continue;
}
if(var_12 chopper_boss_in_range(var_15.origin) == 0)
{
continue;
}
var_16 = var_15.origin + (0,0,64);
if(isai(var_15) || isplayer(var_15))
{
var_16 = var_15 geteye();
}
if(chopper_boss_can_hit_from(var_12.origin,var_16))
{
if(!isdefined(var_12.heli_target))
{
var_0F[var_0F.size] = var_12;
var_12.heli_target = var_15;
var_13 = distance2d(var_12.origin,var_15.origin);
}
else
{
var_17 = distance2d(var_12.origin,var_15.origin);
if(var_17 < var_13)
{
var_12.heli_target = var_15;
var_13 = var_17;
}
}
}
var_10++ = var_7B[var_01.size];
if(var_10 >= 4)
{
wait 0.05;
var_10 = 0;
}
}
}
if(var_0F.size)
{
var_1A = [];
foreach(var_12 in var_0F)
{
if(isdefined(var_12.heli_target))
{
var_1A[var_1A.size] = var_12;
}
}
var_0F = var_1A;
}
if(!var_0F.size)
{
foreach(var_12 in var_7B)
{
if(var_12 != self.loc_current && isdefined(var_12.in_use))
{
continue;
}
var_1E = undefined;
foreach(var_15 in var_02)
{
if(!isdefined(var_15))
{
continue;
}
if(!isdefined(var_1E))
{
var_1E = var_15;
var_12.dist2d = distance2d(var_12.origin,var_15.origin);
continue;
}
var_20 = distance2d(var_12.origin,var_15.origin);
if(var_20 < var_12.dist2d)
{
var_1E = var_15;
var_12.dist2d = var_20;
}
}
if(isdefined(var_12.dist2d))
{
var_0F[var_0F.size] = var_12;
}
}
}
else
{
foreach(var_12 in var_0F)
{
var_12.dist2d = distance2d(var_12.heli_target.origin,var_12.origin);
}
}
var_25 = maps\_utility_joec::exchange_sort_by_handler(var_0F,::chopper_boss_loc_compare);
var_26 = undefined;
var_27 = 0;
foreach(var_12 in var_25)
{
var_29 = 384;
if(isdefined(level.chopper_boss_min_dist2d))
{
var_29 = level.chopper_boss_min_dist2d;
}
if(var_12.dist2d >= var_29 && var_12.dist2d <= 3072)
{
var_26 = var_12;
var_27 = 1;
break;
}
}
if(!isdefined(var_26) && var_25.size)
{
var_26 = var_25[0];
}
if(isdefined(var_26) && isdefined(var_26.heli_target))
{
chopper_boss_set_target(var_26.heli_target);
}
self notify("chopper_done_targeting",self.loc_current);
if(isdefined(var_26) && var_26 != self.loc_current)
{
return var_26;
}
return undefined;
}
//Function Number: 17
chopper_boss_loc_compare()
{
return self.dist2d;
}
//Function Number: 18
chopper_boss_move(param_00)
{
self.loc_current.in_use = undefined;
self.loc_current = param_00;
self.loc_current.in_use = 1;
thread maps\_vehicle::vehicle_paths(param_00);
}
//Function Number: 19
chopper_boss_sentient()
{
self makeentitysentient("axis",1);
self.attackeraccuracy = 6;
self.maxvisibledist = 3072;
self.threatbias = 10000;
}