mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-07-09 15:07:57 -05:00
864 lines
18 KiB
Plaintext
864 lines
18 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: scripts\asm\superslasher\superslasher_actions.gsc
|
|
* Game: Call of Duty: Infinite Warfare
|
|
* Platform: PC
|
|
* Function Count: 44
|
|
* Decompile Time: 2465 ms
|
|
* Timestamp: 10/27/2023 12:02:16 AM
|
|
*******************************************************************/
|
|
|
|
//Function Number: 1
|
|
superslasher_domeleedamage()
|
|
{
|
|
var_00 = 60;
|
|
if(isdefined(self.var_233))
|
|
{
|
|
var_01 = -28672;
|
|
}
|
|
else
|
|
{
|
|
var_01 = 25600;
|
|
}
|
|
|
|
var_02 = 72;
|
|
var_03 = 0.707;
|
|
var_04 = 5184;
|
|
var_05 = 0.174;
|
|
var_06 = anglestoforward(self.angles);
|
|
foreach(var_08 in level.players)
|
|
{
|
|
if(!isalive(var_08))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_09 = var_08.origin - self.origin;
|
|
var_0A = lengthsquared(var_09);
|
|
if(var_0A > var_01)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(abs(var_09[2]) > var_02)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_0B = (var_09[0],var_09[1],0);
|
|
var_09 = vectornormalize(var_0B);
|
|
var_0C = vectordot(var_09,var_06);
|
|
if(var_0A < var_04)
|
|
{
|
|
if(var_0C < var_05)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else if(var_0C < var_03)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
lib_0C73::func_5904(var_08,0.8 * var_08.maxhealth,"MOD_IMPACT");
|
|
var_0D = 20;
|
|
if(!self isonground())
|
|
{
|
|
var_0D = var_0D * 0.05;
|
|
}
|
|
|
|
var_0E = vectornormalize(var_08.origin + (0,0,45) - self.origin);
|
|
var_0F = var_0E * var_0D * 10;
|
|
var_08 setvelocity(var_0F);
|
|
}
|
|
}
|
|
|
|
//Function Number: 2
|
|
superslasher_dogroundpoundimpact()
|
|
{
|
|
self radiusdamage(self.origin,256,90,90,self,"MOD_IMPACT");
|
|
self setscriptablepartstate("groundpound","on");
|
|
}
|
|
|
|
//Function Number: 3
|
|
superslasher_summonminions(param_00)
|
|
{
|
|
self setscriptablepartstate("summon_minions","on");
|
|
if(param_00 == "ground")
|
|
{
|
|
dogenericsummons(self.nextsummonid,param_00,1.5,undefined);
|
|
}
|
|
else
|
|
{
|
|
dowallsummon(self.nextsummonid,param_00);
|
|
}
|
|
|
|
self.nextsummonid++;
|
|
}
|
|
|
|
//Function Number: 4
|
|
dogenericsummons(param_00,param_01,param_02,param_03)
|
|
{
|
|
var_04 = [(-4479,3951,-161),(-4200,4030,-164),(-4340,4527,-146),(-4174,4895,-144),(-4186,5220,-154),(-4261,5478,-160),(-4437,5668,-150),(-4805,5547,-134),(-4829,5045,-140),(-5111,4425,-67),(-4469,4789,-151),(-4642,4542,-156)];
|
|
var_05 = [130,146,160,193,163,205,238,266,291,12,237,85];
|
|
if(!isdefined(self.spawnwave))
|
|
{
|
|
self.spawnwave = 0;
|
|
}
|
|
|
|
var_06 = min(self.spawnwave,10);
|
|
self.spawnwave++;
|
|
var_07 = [];
|
|
for(var_08 = 0;var_08 < var_04.size;var_08++)
|
|
{
|
|
var_07[var_07.size] = var_08;
|
|
}
|
|
|
|
var_09 = scripts\common\utility::array_randomize(var_07);
|
|
var_0A = var_09.size;
|
|
if(param_01 == "ground")
|
|
{
|
|
var_0A = 8;
|
|
}
|
|
|
|
summontracker_init(param_00,var_0A,param_03);
|
|
if(param_02 <= 0)
|
|
{
|
|
param_02 = 0.05;
|
|
}
|
|
}
|
|
|
|
//Function Number: 5
|
|
dowallsummon(param_00,param_01)
|
|
{
|
|
thread dowalls(param_00);
|
|
wait(0.1);
|
|
dogenericsummons(param_00,param_01,0.05,::wallsummon_allguysdead);
|
|
}
|
|
|
|
//Function Number: 6
|
|
summontracker_init(param_00,param_01,param_02)
|
|
{
|
|
if(!isdefined(self.summontracker))
|
|
{
|
|
self.summontracker = [];
|
|
}
|
|
|
|
var_03 = spawnstruct();
|
|
var_03.guysremaining = param_01;
|
|
var_03.fnallguysdead = param_02;
|
|
self.summontracker[param_00] = var_03;
|
|
}
|
|
|
|
//Function Number: 7
|
|
summontracker_decrement(param_00)
|
|
{
|
|
if(!isdefined(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_01 = self.summontracker[param_00];
|
|
var_01.guysremaining--;
|
|
if(var_01.guysremaining == 0)
|
|
{
|
|
if(isdefined(var_01.fnallguysdead))
|
|
{
|
|
self [[ var_01.fnallguysdead ]](param_00);
|
|
}
|
|
|
|
self.summontracker[param_00] = undefined;
|
|
}
|
|
}
|
|
|
|
//Function Number: 8
|
|
summoned_waitfordeath(param_00,param_01)
|
|
{
|
|
param_01 waittill("death");
|
|
summontracker_decrement(param_00);
|
|
}
|
|
|
|
//Function Number: 9
|
|
wallsummon_allguysdead(param_00)
|
|
{
|
|
self notify("wallSummonComplete_" + param_00);
|
|
}
|
|
|
|
//Function Number: 10
|
|
dowalls(param_00)
|
|
{
|
|
}
|
|
|
|
//Function Number: 11
|
|
dowall(param_00,param_01,param_02,param_03,param_04,param_05)
|
|
{
|
|
level endon("game_ended");
|
|
}
|
|
|
|
//Function Number: 12
|
|
dowall_waitfortimeordone(param_00,param_01)
|
|
{
|
|
self endon("wallSummonComplete_" + param_00);
|
|
wait(param_01);
|
|
}
|
|
|
|
//Function Number: 13
|
|
checkwallsummondamage(param_00,param_01,param_02,param_03,param_04,param_05,param_06)
|
|
{
|
|
self endon("killWallSummon_" + param_00);
|
|
level endon("game_ended");
|
|
var_07 = 100;
|
|
var_08 = var_07 / 1000;
|
|
var_09 = param_05;
|
|
for(;;)
|
|
{
|
|
var_09 = var_09 - var_07;
|
|
if(var_09 <= 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
var_0A = param_05 - var_09 / param_05;
|
|
var_0B = param_01 + param_04 * var_0A * param_03;
|
|
foreach(var_0D in level.players)
|
|
{
|
|
if(isalive(var_0D) && var_0D getstance() != "prone")
|
|
{
|
|
var_0E = var_0D.origin - var_0B;
|
|
var_0F = vectordot(var_0E,param_03);
|
|
if(abs(var_0F) < param_06)
|
|
{
|
|
var_10 = var_0D.origin - var_0F * param_03;
|
|
var_0D dodamage(0.75 * var_0D.maxhealth,var_10,self,self,"MOD_IMPACT");
|
|
}
|
|
}
|
|
}
|
|
|
|
wait(var_08);
|
|
}
|
|
}
|
|
|
|
//Function Number: 14
|
|
superslasher_domaskchange(param_00,param_01)
|
|
{
|
|
level endon("game_ended");
|
|
self endon("death");
|
|
var_02 = 3;
|
|
param_00 = param_00 % var_02;
|
|
thread domaskfx(param_00);
|
|
wait(3);
|
|
thread domaskattack(param_00,param_01);
|
|
}
|
|
|
|
//Function Number: 15
|
|
domaskattack(param_00,param_01)
|
|
{
|
|
switch(param_00)
|
|
{
|
|
case 0:
|
|
domaskshockwave(param_01);
|
|
break;
|
|
|
|
case 1:
|
|
domaskwires();
|
|
break;
|
|
|
|
case 2:
|
|
dosawsharks(param_01);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 16
|
|
domaskfx(param_00)
|
|
{
|
|
self setscriptablepartstate("maskchange_" + param_00,"on");
|
|
}
|
|
|
|
//Function Number: 17
|
|
domaskshockwave(param_00)
|
|
{
|
|
level endon("game_ended");
|
|
var_01 = param_00 == "roof";
|
|
var_02 = self.origin;
|
|
if(var_01)
|
|
{
|
|
var_02 = (-5092,4644,-129);
|
|
}
|
|
|
|
var_03 = 30;
|
|
var_04 = 5;
|
|
var_05 = 1;
|
|
var_06 = 3;
|
|
playsoundatpos((-6061,4944,596),"superslasher_shockwave_wind_build");
|
|
playsoundatpos((-4818,4858,13),"superslasher_shockwave_plr_build");
|
|
scripts\common\utility::exploder(101);
|
|
scripts\common\utility::exploder(102);
|
|
scripts\cp\maps\cp_rave\cp_rave_super_slasher_fight::set_zombie_spawning_parameters("continuous",999999,2,0.05,"shockwave","skeleton");
|
|
wait(var_06);
|
|
var_07 = thread scripts\common\utility::play_loopsound_in_space("superslasher_shockwave_plr_lp",(-4818,4858,13));
|
|
var_08 = shock_wave_wind_sfx();
|
|
scripts\cp\maps\cp_rave\cp_rave_super_slasher_fight::kill_off_existing_zombies();
|
|
var_09 = int(var_03 / var_04);
|
|
var_0A = int(var_04 / var_05);
|
|
for(var_0B = 0;var_0B < var_09;var_0B++)
|
|
{
|
|
scripts\common\utility::exploder(100);
|
|
for(var_0C = 0;var_0C < var_0A;var_0C++)
|
|
{
|
|
foreach(var_0E in level.players)
|
|
{
|
|
if(playerinanysafearea(var_0E))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(scripts\cp\_laststand::player_in_laststand(var_0E))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_0E dodamage(0.3 * var_0E.maxhealth,var_02);
|
|
}
|
|
|
|
wait(var_05);
|
|
}
|
|
}
|
|
|
|
level thread stop_wind_fire_sfxs(var_08);
|
|
var_07 stoploopsound();
|
|
playsoundatpos((-4818,4858,13),"superslasher_shockwave_plr_end");
|
|
self.var_1198.bstoptauntingcontinuously = 1;
|
|
scripts\cp\maps\cp_rave\cp_rave_super_slasher_fight::set_zombie_spawning_parameters("continuous",999999,0.2,0.05,"near_player","generic_zombie");
|
|
if(self.fight_round < 3)
|
|
{
|
|
level thread scripts\cp\maps\cp_rave\cp_rave_super_slasher_fight::soul_collection_sequence();
|
|
}
|
|
}
|
|
|
|
//Function Number: 18
|
|
shock_wave_wind_sfx()
|
|
{
|
|
var_00 = [];
|
|
var_01 = [];
|
|
var_01[0] = (-4949,4725,-99);
|
|
var_01[1] = (-4274,4711,-99);
|
|
var_01[2] = (-5051,3906,-99);
|
|
var_01[3] = (-4005,3854,-99);
|
|
var_01[4] = (-4747,5478,-99);
|
|
var_01[5] = (-4005,5717,-99);
|
|
var_01[6] = (-4947,6070,-99);
|
|
var_01[7] = (-4681,6521,-99);
|
|
var_01[8] = (-3436,4168,-99);
|
|
var_01[9] = (-3543,5167,-99);
|
|
var_01[10] = (-4076,6086,-99);
|
|
foreach(var_03 in var_01)
|
|
{
|
|
var_04 = scripts\common\utility::play_loopsound_in_space("superslasher_shockwave_wind_lp",var_03);
|
|
var_00[var_00.size] = var_04;
|
|
var_04 playsound("superslasher_shockwave_wind_start");
|
|
}
|
|
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 19
|
|
stop_wind_fire_sfxs(param_00)
|
|
{
|
|
foreach(var_02 in param_00)
|
|
{
|
|
var_02 thread stop_wind_fire_sfx(var_02);
|
|
}
|
|
}
|
|
|
|
//Function Number: 20
|
|
stop_wind_fire_sfx(param_00)
|
|
{
|
|
param_00 playsound("superslasher_shockwave_wind_end");
|
|
wait(0.5);
|
|
param_00 stoploopsound();
|
|
wait(4);
|
|
param_00 delete();
|
|
}
|
|
|
|
//Function Number: 21
|
|
playerinanysafearea(param_00)
|
|
{
|
|
var_01 = [(-4542,3598,-175),(-4490,4148,-158),(-3587,4597,-145),(-4303,5204,-148),(-4422,6003,-146)];
|
|
var_02 = [-25536,-25536,-25536,-21436,-25536];
|
|
for(var_03 = 0;var_03 < var_01.size;var_03++)
|
|
{
|
|
if(distance2dsquared(var_01[var_03],param_00.origin) <= var_02[var_03])
|
|
{
|
|
var_04 = getentarray("superslasher_shockwave_safe_area","targetname");
|
|
foreach(var_06 in var_04)
|
|
{
|
|
if(function_010F(var_01[var_03],var_06))
|
|
{
|
|
param_00.super_slasher_shockwave_safe_area = var_06;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 22
|
|
domaskwires()
|
|
{
|
|
level endon("game_ended");
|
|
level endon("stop_wire_attack");
|
|
self.var_1198.bwired = 1;
|
|
if(!isdefined(level.superslasher.fight_round))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(level.superslasher.fight_round == 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_00 = 1;
|
|
if(level.superslasher.fight_round == 2)
|
|
{
|
|
var_00 = level.players.size;
|
|
}
|
|
else
|
|
{
|
|
var_00 = 4;
|
|
}
|
|
|
|
for(var_01 = 1;var_01 <= var_00;var_01++)
|
|
{
|
|
scripts\cp\maps\cp_rave\cp_rave_super_slasher_fight::activate_super_slasher_barrier(var_01);
|
|
}
|
|
}
|
|
|
|
//Function Number: 23
|
|
stopwireattack()
|
|
{
|
|
level notify("stop_wire_attack");
|
|
self.var_1198.bwired = undefined;
|
|
}
|
|
|
|
//Function Number: 24
|
|
dogroundjumpattackfx(param_00)
|
|
{
|
|
level endon("game_ended");
|
|
var_01 = allocattackent();
|
|
var_01 setattackentorigin(param_00);
|
|
var_01 setscriptablepartstate("attack","jumptarget");
|
|
self.jumpattackent = var_01;
|
|
}
|
|
|
|
//Function Number: 25
|
|
groundjumpattackfxcleanup()
|
|
{
|
|
if(isdefined(self.jumpattackent))
|
|
{
|
|
self.jumpattackent setscriptablepartstate("attack","off");
|
|
freeattackent(self.jumpattackent);
|
|
self.jumpattackent = undefined;
|
|
}
|
|
}
|
|
|
|
//Function Number: 26
|
|
superslasher_dosummonedsawblades()
|
|
{
|
|
var_00 = spawnstruct();
|
|
var_00.var_2C5 = (-5225,5716,20);
|
|
var_00.var_6378 = (-4087,3870,-160);
|
|
var_00.totaltime = 5000;
|
|
var_00.var_257 = 48;
|
|
var_00.bvertical = 1;
|
|
thread superslasher_dosawblade(var_00);
|
|
var_00 = spawnstruct();
|
|
var_00.var_2C5 = (-5687,3968,57);
|
|
var_00.var_6378 = (-3717,5209,-203);
|
|
var_00.totaltime = 5000;
|
|
var_00.var_257 = 48;
|
|
var_00.bvertical = 1;
|
|
thread superslasher_dosawblade(var_00);
|
|
}
|
|
|
|
//Function Number: 27
|
|
superslasher_dosawfan()
|
|
{
|
|
var_00 = 12;
|
|
var_01 = 360 / var_00;
|
|
var_02 = 1500;
|
|
for(var_03 = 0;var_03 < var_00;var_03++)
|
|
{
|
|
var_04 = rotatevector((1,0,0),(0,var_01 * var_03,0));
|
|
var_05 = spawnstruct();
|
|
var_05.var_2C5 = self.origin + var_04 * 40 + (0,0,48);
|
|
var_05.var_6378 = var_05.var_2C5 + var_04 * var_02;
|
|
var_05.totaltime = 3000;
|
|
var_05.var_257 = 48;
|
|
var_05.bvertical = 0;
|
|
thread superslasher_dosawblade(var_05);
|
|
if(var_03 % 4 == 0)
|
|
{
|
|
wait(0.05);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 28
|
|
superslasher_dosawblade(param_00)
|
|
{
|
|
magicbullet("zmb_superslasher_sawblade",param_00.var_2C5,param_00.var_6378,self);
|
|
}
|
|
|
|
//Function Number: 29
|
|
superslasher_dothrownsaw()
|
|
{
|
|
var_00 = self gettagorigin("j_wrist_ri");
|
|
if(isdefined(self.var_1198.throwsawtarget))
|
|
{
|
|
var_01 = self.var_1198.throwsawtarget.origin + (0,0,48);
|
|
}
|
|
else
|
|
{
|
|
var_01 = self.var_1198.throwsawbackuptargetpos + (0,0,48);
|
|
}
|
|
|
|
var_02 = vectornormalize(var_01 - var_00);
|
|
var_03 = vectortoyaw(var_02);
|
|
var_04 = angleclamp180(var_03 - self.angles[1]);
|
|
if(var_04 >= 45 || var_04 <= -45)
|
|
{
|
|
var_01 = self.origin + anglestoforward(self.angles) * 768;
|
|
var_02 = vectornormalize(var_01 - var_00);
|
|
}
|
|
}
|
|
|
|
//Function Number: 30
|
|
superslasher_dostompattack(param_00)
|
|
{
|
|
level endon("game_ended");
|
|
var_01 = 48;
|
|
var_02 = 0.2;
|
|
var_03 = 1024;
|
|
if(isdefined(param_00))
|
|
{
|
|
var_03 = param_00;
|
|
}
|
|
|
|
var_04 = int(var_03 / var_01 * 2);
|
|
var_05 = var_03 - var_01 * 2 / var_04 - 1;
|
|
var_06 = anglestoforward(self.angles);
|
|
var_07 = 50 + var_01;
|
|
var_08 = self.origin + var_06 * var_07;
|
|
for(var_09 = 0;var_09 < var_04;var_09++)
|
|
{
|
|
var_0A = var_08 + var_09 * var_05 * var_06;
|
|
thread dosticks(var_0A,var_01,1000);
|
|
wait(var_02);
|
|
}
|
|
}
|
|
|
|
//Function Number: 31
|
|
dosticks(param_00,param_01,param_02)
|
|
{
|
|
level endon("game_ended");
|
|
var_0F = allocattackent();
|
|
var_0F setattackentorigin(param_00);
|
|
var_0F setscriptablepartstate("attack","punjisticks");
|
|
wait(param_02 / 1000);
|
|
if(isdefined(var_0F))
|
|
{
|
|
var_0F setscriptablepartstate("attack","off");
|
|
freeattackent(var_0F);
|
|
}
|
|
}
|
|
|
|
//Function Number: 32
|
|
dostickdamage(param_00,param_01,param_02,param_03)
|
|
{
|
|
level endon("game_ended");
|
|
var_04 = param_02 * param_02;
|
|
var_05 = 90;
|
|
while(param_03 > 0)
|
|
{
|
|
foreach(var_07 in level.players)
|
|
{
|
|
if(isalive(var_07))
|
|
{
|
|
if(distance2dsquared(var_07.origin,param_01) < var_04)
|
|
{
|
|
var_07 dodamage(0.9 * var_07.maxhealth,param_01,param_00,param_00,"MOD_IMPACT");
|
|
}
|
|
}
|
|
}
|
|
|
|
param_03 = param_03 - 50;
|
|
wait(0.05);
|
|
}
|
|
}
|
|
|
|
//Function Number: 33
|
|
dosawsharks(param_00)
|
|
{
|
|
var_01 = level.players.size + 1;
|
|
var_02 = self.origin;
|
|
if(param_00 == "roof")
|
|
{
|
|
var_02 = (-4862,4788,-138);
|
|
}
|
|
|
|
self.sawsharks = [];
|
|
var_03 = spawnstruct();
|
|
var_03.perplayer = [];
|
|
foreach(var_05 in level.players)
|
|
{
|
|
var_03.perplayer[var_05 getentitynumber()] = 0;
|
|
}
|
|
|
|
var_07 = (90,0,0);
|
|
var_08 = -25536;
|
|
for(var_09 = 0;var_09 < var_01;var_09++)
|
|
{
|
|
var_0A = var_09 * 360 / var_01;
|
|
var_0B = self.origin + rotatevector(var_07,(0,var_0A,0));
|
|
var_0C = spawnsawshark(var_0B);
|
|
self.sawsharks[self.sawsharks.size] = var_0C;
|
|
if(param_00 == "roof")
|
|
{
|
|
thread dosawshark_followtarget(var_0C,var_03,undefined,var_02 + rotatevector(var_07,(0,var_0A,0)),var_08);
|
|
}
|
|
else
|
|
{
|
|
thread dosawshark_followowner(var_0C,var_03,var_0A,var_08);
|
|
}
|
|
|
|
scripts\common\utility::func_136F7();
|
|
}
|
|
}
|
|
|
|
//Function Number: 34
|
|
spawnsawshark(param_00)
|
|
{
|
|
var_01 = spawn("script_model",param_00);
|
|
var_01 setmodel("tag_origin");
|
|
var_01 thread delayplayingsawsharkvfx(var_01);
|
|
var_01 playsound("superslasher_ground_saw_deploy_lr");
|
|
var_01 playloopsound("superslasher_ground_saw_deploy_lp");
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 35
|
|
delayplayingsawsharkvfx(param_00)
|
|
{
|
|
param_00 endon("death");
|
|
param_00 rotateroll(90,0.05);
|
|
wait(0.2);
|
|
playfxontag(level._effect["super_slasher_saw_shark_spark"],param_00,"tag_origin");
|
|
}
|
|
|
|
//Function Number: 36
|
|
killallsharks(param_00)
|
|
{
|
|
if(isdefined(param_00.sawsharks))
|
|
{
|
|
foreach(var_02 in param_00.sawsharks)
|
|
{
|
|
if(isdefined(var_02))
|
|
{
|
|
deletesawshark(var_02);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 37
|
|
deletesawshark(param_00)
|
|
{
|
|
playfx(level._effect["super_slasher_saw_shark_hit"],param_00.origin);
|
|
playsoundatpos(param_00.origin,"superslasher_ground_saw_explode");
|
|
param_00 delete();
|
|
}
|
|
|
|
//Function Number: 38
|
|
updatesawsharkposandangles(param_00,param_01,param_02)
|
|
{
|
|
var_03 = 90;
|
|
param_00.origin = param_01;
|
|
param_00.angles = (param_02[0],param_02[1],var_03);
|
|
}
|
|
|
|
//Function Number: 39
|
|
getclosesttargetableplayerwithinwithlos(param_00,param_01,param_02)
|
|
{
|
|
var_03 = getclosestpointonnavmesh(param_01);
|
|
var_04 = undefined;
|
|
var_05 = param_02 * param_02;
|
|
foreach(var_07 in level.players)
|
|
{
|
|
if(!isalive(var_07))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(param_00.perplayer[var_07 getentitynumber()] >= 2)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_08 = distance2dsquared(var_07.origin,param_01);
|
|
if(var_08 < var_05)
|
|
{
|
|
var_09 = getclosestpointonnavmesh(var_07.origin);
|
|
if(navisstraightlinereachable(var_03,var_09))
|
|
{
|
|
var_05 = var_08;
|
|
var_04 = var_07;
|
|
}
|
|
}
|
|
}
|
|
|
|
return var_04;
|
|
}
|
|
|
|
//Function Number: 40
|
|
dosawshark_followowner(param_00,param_01,param_02,param_03)
|
|
{
|
|
level endon("game_ended");
|
|
self endon("death");
|
|
self endon("kill_sharks");
|
|
var_04 = (80,0,-3);
|
|
var_05 = undefined;
|
|
var_06 = undefined;
|
|
while(param_03 > 0)
|
|
{
|
|
var_06 = self.origin + rotatevector(var_04,(0,param_02,0));
|
|
var_05 = getclosesttargetableplayerwithinwithlos(param_01,var_06,512);
|
|
if(isdefined(var_05))
|
|
{
|
|
break;
|
|
}
|
|
|
|
updatesawsharkposandangles(param_00,var_06,self.angles);
|
|
param_03 = param_03 - 50;
|
|
wait(0.05);
|
|
}
|
|
|
|
if(isdefined(var_05) && param_03 > 0)
|
|
{
|
|
thread dosawshark_followtarget(param_00,param_01,var_05,var_06,param_03);
|
|
return;
|
|
}
|
|
|
|
deletesawshark(param_00);
|
|
}
|
|
|
|
//Function Number: 41
|
|
dosawshark_followtarget(param_00,param_01,param_02,param_03,param_04)
|
|
{
|
|
level endon("game_ended");
|
|
param_00 endon("death");
|
|
var_05 = param_03;
|
|
var_06 = undefined;
|
|
var_07 = 8;
|
|
var_08 = 4;
|
|
var_09 = 32;
|
|
if(isdefined(param_02))
|
|
{
|
|
var_06 = vectortoyaw(param_02.origin - var_05);
|
|
var_0A = param_02 getentitynumber();
|
|
if(isdefined(param_01.perplayer[var_0A]))
|
|
{
|
|
param_01.perplayer[var_0A]++;
|
|
}
|
|
}
|
|
|
|
var_0B = scripts\common\trace::func_48CC(1);
|
|
while(param_04 > 0)
|
|
{
|
|
if(!isdefined(param_02) || !isalive(param_02))
|
|
{
|
|
param_02 = getclosesttargetableplayerwithinwithlos(param_01,var_05,512);
|
|
if(isdefined(param_02))
|
|
{
|
|
var_06 = vectortoyaw(param_02.origin - var_05);
|
|
param_01.perplayer[param_02 getentitynumber()]++;
|
|
}
|
|
}
|
|
|
|
if(isdefined(param_02))
|
|
{
|
|
var_0C = param_02.origin - var_05;
|
|
var_0D = vectortoyaw(var_0C);
|
|
var_0E = angleclamp180(var_0D - var_06);
|
|
var_0E = clamp(var_0E,-1 * var_08,var_08);
|
|
var_06 = angleclamp180(var_06 + var_0E);
|
|
var_0F = var_05 + rotatevector((var_07,0,0),(0,var_06,0));
|
|
if(navisstraightlinereachable(var_05,var_0F))
|
|
{
|
|
var_10 = scripts\common\trace::func_DCED(var_0F + (0,0,24),var_0F - (0,0,24),undefined,var_0B);
|
|
var_05 = var_10["position"];
|
|
if(distance2dsquared(var_05,param_02.origin) < var_09 * var_09)
|
|
{
|
|
param_02 dodamage(0.8 * param_02.maxhealth,var_05,self,self,"MOD_IMPACT");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
|
|
updatesawsharkposandangles(param_01,vectortoangles(param_00.origin - param_01));
|
|
}
|
|
|
|
param_04 = param_04 - 50;
|
|
wait(0.05);
|
|
}
|
|
|
|
deletesawshark(param_00);
|
|
}
|
|
|
|
//Function Number: 42
|
|
allocattackent()
|
|
{
|
|
if(!isdefined(self.attackents))
|
|
{
|
|
self.attackents = [];
|
|
}
|
|
|
|
var_00 = undefined;
|
|
foreach(var_02 in self.attackents)
|
|
{
|
|
if(!var_02.binuse)
|
|
{
|
|
var_00 = var_02;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!isdefined(var_00))
|
|
{
|
|
var_00 = spawn("script_model",self.origin);
|
|
var_00 setmodel("superslasher_attack_origin");
|
|
self.attackents[self.attackents.size] = var_00;
|
|
}
|
|
|
|
var_00.binuse = 1;
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 43
|
|
setattackentorigin(param_00)
|
|
{
|
|
self.origin = param_00;
|
|
self dontinterpolate();
|
|
}
|
|
|
|
//Function Number: 44
|
|
freeattackent(param_00)
|
|
{
|
|
param_00.binuse = 0;
|
|
} |