mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-27 01:47:54 -05:00
584 lines
11 KiB
Plaintext
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;
|
|
} |