IL-GSC/AW/PC/MP/maps/mp/_threatdetection.gsc
2023-10-27 03:49:01 -04:00

936 lines
18 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps/mp/_threatdetection.gsc
* Game: Call of Duty: Advanced Warfare
* Platform: PC
* Function Count: 38
* Decompile Time: 599 ms
* Timestamp: 10/27/2023 1:49:28 AM
*******************************************************************/
//Function Number: 1
init()
{
level._threatdetection = spawnstruct();
level._threatdetection.default_style = "stencil_outline";
level._threatdetection.activestyle = getdvar("threat_detection_highlight_style",level._threatdetection.default_style);
level thread onplayerconnect();
level thread watchagentspawn();
}
//Function Number: 2
changethreatstyle(param_00)
{
if(param_00 == level._threatdetection.activestyle)
{
return;
}
foreach(var_02 in level.players)
{
if(isdefined(var_02._threatdetection.mark_enemy_model))
{
var_02._threatdetection.mark_enemy_model delete();
}
if(isdefined(var_02._threatdetection.mark_friendly_model))
{
var_02._threatdetection.mark_friendly_model delete();
}
if(isdefined(var_02.mark_fx) && isdefined(var_02.mark_fx.fx_ent))
{
foreach(var_04 in var_02.mark_fx.fx_ent)
{
if(isdefined(var_04.enemymarker))
{
var_04.enemymarker delete();
}
if(isdefined(var_04.friendlymarker))
{
var_04.friendlymarker delete();
}
if(isdefined(var_04.enemylosmarker))
{
var_04.enemylosmarker delete();
}
if(isdefined(var_04.friendlylosmarker))
{
var_04.friendlylosmarker delete();
}
}
}
}
foreach(var_02 in level.players)
{
var_02 threat_init(param_00);
}
level._threatdetection.activestyle = param_00;
}
//Function Number: 3
getthreatstyle()
{
var_00 = getdvar("threat_detection_highlight_style",level._threatdetection.default_style);
if(var_00 != level._threatdetection.activestyle)
{
changethreatstyle(var_00);
}
return var_00;
}
//Function Number: 4
onplayerconnect()
{
for(;;)
{
level waittill("connected",var_00);
var_00 thread onplayerspawned();
}
}
//Function Number: 5
watchagentspawn()
{
for(;;)
{
level waittill("spawned_agent",var_00);
var_00._threatdetection = spawnstruct();
var_00._threatdetection.showlist = [];
var_00 thread onagentspawned();
}
}
//Function Number: 6
onagentspawned()
{
self endon("death");
childthread monitorthreathighlight();
childthread cleanupondeath();
}
//Function Number: 7
onplayerspawned()
{
self endon("disconnect");
self._threatdetection = spawnstruct();
self._threatdetection.showlist = [];
self waittill("spawned_player");
childthread monitorthreathighlight();
childthread cleanupondeath();
childthread monitorthreathighlightnotification();
for(;;)
{
self waittill("spawned_player");
var_00 = getthreatstyle();
if(var_00 == "attached_glow")
{
visitfxent(::visitorrelink,::gethostilemarker,undefined);
}
}
}
//Function Number: 8
monitorthreathighlightnotification()
{
var_00 = newclienthudelem(self);
var_00.x = 0;
var_00.y = 0;
var_00.alignx = "left";
var_00.aligny = "top";
var_00.horzalign = "fullscreen";
var_00.vertalign = "fullscreen";
var_00 setshader("paint_overlay",640,480);
var_00.alpha = 0;
var_00.color = (0,0,0);
var_00.sort = -3;
var_00.hidden = 1;
var_01 = 0.5;
var_02 = 0.3;
for(;;)
{
if(self._threatdetection.showlist.size != 0)
{
if(var_00.hidden)
{
var_00.hidden = 0;
var_00 childthread threatnotificationoverlayflash(var_01,var_02);
}
}
else if(!var_00.hidden)
{
var_00.hidden = 1;
var_00 notify("stop_overlay_flash");
if(var_00.alpha > 0)
{
var_00 fadeovertime(var_02);
var_00.color = (0,0,0);
var_00.alpha = 0;
wait(var_02);
}
}
wait(0.05);
}
}
//Function Number: 9
threatnotificationoverlayflash(param_00,param_01)
{
self endon("stop_overlay_flash");
self fadeovertime(param_00);
self.color = (1,1,1);
self.alpha = 1;
}
//Function Number: 10
debughelper()
{
for(;;)
{
var_00 = distance(self.origin,level.players[0].origin);
thread common_scripts\utility::draw_line_for_time(level.players[0].origin,self.origin,1,1,1,0.3);
if(isdefined(self._threatdetection.mark_enemy_model))
{
thread common_scripts\utility::draw_line_for_time(level.players[0].origin,self._threatdetection.mark_enemy_model.origin,1,1,1,0.3);
}
wait(0.3);
}
}
//Function Number: 11
cleanupondeath()
{
self endon("disconnect");
for(;;)
{
self waittill("death");
removethreatevents();
}
}
//Function Number: 12
removethreatevents()
{
foreach(var_01 in level.players)
{
foreach(var_03 in var_01._threatdetection.showlist)
{
if(var_03.player == self)
{
var_03.endtime = 0;
}
}
}
var_06 = getthreatstyle();
if(var_06 == "attached_glow")
{
visitfxent(::visitorhideall,::gethostilemarker,undefined);
}
}
//Function Number: 13
detection_highlight_hud_effect_on(param_00,param_01,param_02)
{
var_03 = newclienthudelem(param_00);
if(isdefined(param_02) && param_02)
{
var_03.color = (0.1,0.0015,0.0015);
}
else
{
var_03.color = (1,0.015,0.015);
}
var_03.alpha = 1;
var_03 setradarhighlight(param_01);
return var_03;
}
//Function Number: 14
detection_highlight_hud_effect_off(param_00)
{
if(isdefined(param_00))
{
param_00 destroy();
}
}
//Function Number: 15
detection_highlight_hud_effect(param_00,param_01,param_02,param_03)
{
var_04 = detection_highlight_hud_effect_on(param_00,param_01,param_02);
if(isdefined(param_03))
{
param_00 common_scripts\utility::waittill_notify_or_timeout(param_03,param_01);
}
else
{
wait(param_01);
}
detection_highlight_hud_effect_off(var_04);
}
//Function Number: 16
detection_grenade_hud_effect(param_00,param_01,param_02,param_03)
{
var_04 = newhudelem();
var_04.x = param_01[0];
var_04.y = param_01[1];
var_04.z = param_01[2];
var_04.color = (getdvarfloat("scr_paintexplosionred"),getdvarfloat("scr_paintexplosiongreen"),getdvarfloat("scr_paintexplosionblue"));
var_04.alpha = getdvarfloat("scr_paintexplosionalpha");
var_05 = getdvarint("paintexplosionwidth");
var_04 setradarping(int(param_03 + var_05 / 2),int(var_05),param_02 + 0.05);
wait(param_02);
if(isdefined(var_04))
{
var_04 destroy();
}
}
//Function Number: 17
exo_ping_hud_effect(param_00,param_01,param_02,param_03,param_04)
{
var_05 = undefined;
if(isdefined(param_03))
{
var_05 = newclienthudelem(param_03);
}
else
{
var_05 = newhudelem();
}
var_05.x = param_00[0];
var_05.y = param_00[1];
var_05.z = param_00[2];
if(isdefined(param_04) && param_04)
{
var_05.color = (0.05,0.05,0.05);
}
else
{
var_05.color = (0.8,0.8,0.8);
}
var_05.alpha = 0.05;
var_06 = getdvarint("scr_exopingwidth",100);
var_05 setradarping(int(param_02),int(var_06),param_01 + 0.05);
wait(param_01);
if(isdefined(var_05))
{
var_05 destroy();
}
}
//Function Number: 18
addthreatevent(param_00,param_01,param_02,param_03,param_04,param_05)
{
if(!isalive(self))
{
return;
}
var_06 = gettime();
var_07 = var_06 + param_01 * 1000;
var_08 = var_07 - 9 * param_01 * 1000 / 10;
var_09 = getthreatstyle();
if(var_07 - var_08 < 250)
{
var_08 = 250 + var_06;
}
if(var_09 == "model")
{
var_08 = var_06;
}
else if(var_09 == "vfx_model")
{
var_08 = var_06;
}
else if(var_09 == "attached_glow")
{
var_08 = var_07;
}
else if(var_09 == "stencil_outline")
{
var_08 = var_07;
}
foreach(var_0B in param_00)
{
var_0C = 0;
foreach(var_0E in self._threatdetection.showlist)
{
if(var_0E.player == var_0B)
{
if(var_07 > var_0E.endtime)
{
var_0E.endtime = var_07;
var_0E.losendtime = var_08;
var_0E.eventtype = param_02;
}
var_0C = 1;
break;
}
}
if(!var_0C)
{
var_10 = self._threatdetection.showlist.size;
self._threatdetection.showlist[var_10] = spawnstruct();
self._threatdetection.showlist[var_10].player = var_0B;
self._threatdetection.showlist[var_10].endtime = var_07;
self._threatdetection.showlist[var_10].losendtime = var_08;
self._threatdetection.showlist[var_10].eventtype = param_02;
if(isplayer(self))
{
if(!isdefined(param_05) || param_05)
{
self playlocalsound("flag_spawned");
}
}
}
}
if(isplayer(self))
{
if(param_04)
{
visitfxent(::visitorupdatemarkerpos,::getfriendlymarker,undefined);
}
if(param_03)
{
visitfxent(::visitorupdatemarkerpos,::gethostilemarker,undefined);
}
}
}
//Function Number: 19
stopthreateventtype(param_00)
{
foreach(var_02 in self._threatdetection.showlist)
{
if(var_02.eventtype == param_00)
{
var_02.endtime = 0;
}
}
var_04 = getthreatstyle();
if(var_04 == "attached_glow")
{
visitfxent(::visitorhideall,::gethostilemarker,undefined);
}
}
//Function Number: 20
visitfxent(param_00,param_01,param_02)
{
var_03 = getthreatstyle();
if(var_03 == "glow")
{
foreach(var_06, var_05 in self.mark_fx.fx_ent)
{
[[ param_00 ]]([[ param_01 ]](var_05),param_02,level._threatdetection.fx_data[var_06][0]);
}
return;
}
if(var_03 == "model")
{
[[ param_00 ]]([[ param_01 ]](self._threatdetection),param_02,"tag_origin");
return;
}
if(var_03 == "vfx_model")
{
[[ param_00 ]]([[ param_01 ]](self._threatdetection),param_02,"tag_origin");
return;
}
if(var_03 == "attached_glow")
{
foreach(var_06, var_05 in self.mark_fx.fx_ent)
{
[[ param_00 ]]([[ param_01 ]](var_05),param_02,level._threatdetection.fx_data[var_06][0]);
}
return;
}
if(var_03 == "stencil_outline")
{
[[ param_00 ]](self,param_02,"tag_origin");
return;
}
}
//Function Number: 21
visitorrelink(param_00,param_01,param_02)
{
param_00 unlink();
param_00.origin = self gettagorigin(param_02);
param_00.angles = self gettagangles(param_02);
param_00 linkto(self,param_02);
wait(0.05);
playfxontag(param_00.fx,param_00,"tag_origin");
}
//Function Number: 22
visitorhideall(param_00,param_01,param_02)
{
var_03 = getthreatstyle();
if(var_03 == "attached_glow")
{
stopfxontag(param_00.fx,param_00,"tag_origin");
}
}
//Function Number: 23
visitorupdatemarkerpos(param_00,param_01,param_02)
{
var_03 = getthreatstyle();
param_00.origin = self gettagorigin(param_02);
param_00.angles = self gettagangles(param_02);
if(var_03 == "glow")
{
triggerfx(param_00);
return;
}
if(var_03 == "model")
{
var_04 = "mp_hud_" + self getstance() + "_char";
var_05 = param_00 != self._threatdetection.mark_friendly_model;
if(var_05)
{
var_04 = var_04 + "_hostile";
}
var_06 = param_00.model;
if(var_04 != var_06)
{
param_00 setmodel(var_04);
return;
}
return;
}
if(var_03 == "vfx_model")
{
switch(self getstance())
{
case "prone":
break;
case "crouch":
break;
case "stand":
default:
break;
}
}
}
//Function Number: 24
gethostilemarker(param_00)
{
var_01 = getthreatstyle();
if(var_01 == "glow")
{
return param_00.enemymarker;
}
if(var_01 == "model")
{
return param_00.mark_enemy_model;
}
if(var_01 == "vfx_model")
{
return param_00.mark_enemy_model;
}
if(var_01 == "attached_glow")
{
return param_00;
}
if(var_01 == "stencil_outline")
{
return param_00;
}
}
//Function Number: 25
getfriendlymarker(param_00)
{
var_01 = getthreatstyle();
if(var_01 == "glow")
{
return param_00.friendlymarker;
}
if(var_01 == "model")
{
return param_00.mark_friendly_model;
}
if(var_01 == "vfx_model")
{
return param_00.mark_friendly_model;
}
}
//Function Number: 26
getfriendlylosmarker(param_00)
{
var_01 = getthreatstyle();
if(var_01 == "glow")
{
return param_00.friendlylosmarker;
}
if(var_01 == "model")
{
return param_00.mark_friendly_model;
}
if(var_01 == "vfx_model")
{
return param_00.mark_friendly_model;
}
}
//Function Number: 27
gethostilelosmarker(param_00)
{
var_01 = getthreatstyle();
if(var_01 == "glow")
{
return param_00.enemylosmarker;
}
if(var_01 == "model")
{
return param_00.mark_enemy_model;
}
if(var_01 == "vfx_model")
{
return param_00.mark_enemy_model;
}
if(var_01 == "attached_glow")
{
return param_00;
}
if(var_01 == "stencil_outline")
{
return param_00;
}
}
//Function Number: 28
visithideallmarkers(param_00,param_01,param_02)
{
foreach(var_04 in param_00)
{
var_04 hide();
}
}
//Function Number: 29
accessallmarkers(param_00)
{
return [param_00.friendlymarker,param_00.enemymarker,param_00.friendlylosmarker,param_00.enemylosmarker];
}
//Function Number: 30
getnormaldirectionvec(param_00)
{
return vectornormalize(common_scripts\utility::flat_origin(param_00));
}
//Function Number: 31
monitorthreathighlight()
{
threat_init(getthreatstyle());
var_00 = (0,0,32);
var_01 = 0;
for(;;)
{
wait(0.05);
var_02 = gettime();
var_03 = 0;
foreach(var_05 in self._threatdetection.showlist)
{
if(var_05.endtime >= var_02)
{
if(!isdefined(var_05.player))
{
self._threatdetection.showlist = common_scripts\utility::array_remove(self._threatdetection.showlist,var_05);
continue;
}
var_05.los = 0;
var_06 = getnormaldirectionvec(anglestoforward(var_05.player.angles));
var_07 = getnormaldirectionvec(self.origin - var_05.player.origin);
var_08 = vectordot(var_07,var_06);
if(var_08 < 0)
{
continue;
}
if(check_los(var_05))
{
var_05.los = 1;
if(var_05.losendtime <= var_02)
{
self._threatdetection.showlist = common_scripts\utility::array_remove(self._threatdetection.showlist,var_05);
continue;
}
}
var_03 = 1;
continue;
}
self._threatdetection.showlist = common_scripts\utility::array_remove(self._threatdetection.showlist,var_05);
}
var_0A = getthreatstyle();
if(!var_01)
{
var_01 = 1;
if(var_0A == "glow")
{
foreach(var_0C in self.mark_fx.fx_ent)
{
var_0C.enemymarker hide();
var_0C.friendlymarker hide();
var_0C.enemylosmarker hide();
var_0C.friendlylosmarker hide();
}
}
else if(var_0A == "model")
{
self._threatdetection.mark_friendly_model hide();
self._threatdetection.mark_enemy_model hide();
}
else if(var_0A == "vfx_model")
{
self._threatdetection.mark_friendly_model hide();
self._threatdetection.mark_enemy_model hide();
}
else if(var_0A == "attached_glow")
{
foreach(var_05 in self.mark_fx.fx_ent)
{
stopfxontag(var_05.fx,var_05,"tag_origin");
var_05 hide();
}
}
else if(var_0A == "stencil_outline")
{
self clearthreatdetected();
}
else
{
}
}
if(!var_03)
{
continue;
}
foreach(var_10 in self._threatdetection.showlist)
{
if(var_10.los)
{
showthreat(var_10.player,::getfriendlylosmarker,::gethostilelosmarker,::visitorupdatelosmarker);
prepare_show_threat(var_01,var_0A,var_10.player);
var_01 = 0;
continue;
}
var_11 = bullettrace(var_10.player.origin + var_00,self.origin + var_00,1,var_10.player);
if(var_11["fraction"] < 1 && !isplayer(var_11["entity"]))
{
showthreat(var_10.player,::getfriendlymarker,::gethostilemarker,::visitorshowtoplayer);
prepare_show_threat(var_01,var_0A,var_10.player);
var_01 = 0;
}
}
}
}
//Function Number: 32
prepare_show_threat(param_00,param_01,param_02)
{
if(param_00)
{
if(param_01 == "attached_glow")
{
showthreat(param_02,::getfriendlylosmarker,::gethostilelosmarker,::visitorretriggerfx);
}
}
}
//Function Number: 33
visitorretriggerfx(param_00,param_01,param_02)
{
playfxontag(param_00.fx,param_00,"tag_origin");
}
//Function Number: 34
check_los(param_00)
{
if(bullettracepassed(param_00.player geteye(),self geteye(),0,param_00.player))
{
return 1;
}
return 0;
}
//Function Number: 35
threat_init(param_00)
{
var_01 = spawnstruct();
var_01.fx_ent = [];
if(param_00 == "glow")
{
foreach(var_05, var_03 in level._threatdetection.fx_data)
{
var_04 = spawnstruct();
var_04.origin = self gettagorigin(var_03[0]);
var_04.angles = self gettagangles(var_03[0]);
var_04.enemymarker = spawnfx(var_03[1],var_04.origin);
triggerfx(var_04.enemymarker);
var_04.enemymarker hide();
var_04.enemylosmarker = spawnfx(var_03[3],var_04.origin);
triggerfx(var_04.enemylosmarker);
var_04.enemylosmarker hide();
var_04.friendlymarker = spawnfx(var_03[2],var_04.origin);
triggerfx(var_04.friendlymarker);
var_04.friendlymarker hide();
var_04.friendlylosmarker = spawnfx(var_03[4],var_04.origin);
triggerfx(var_04.friendlylosmarker);
var_04.friendlylosmarker hide();
var_01.fx_ent[var_05] = var_04;
}
self.mark_fx = var_01;
return;
}
if(param_00 == "model")
{
var_06 = spawn("script_model",self.origin);
var_06.origin = self.origin;
var_06.angles = self.angles;
var_06 setmodel(level._threatdetection.friendlymodel);
var_06 setcontents(0);
self._threatdetection.mark_friendly_model = var_06;
var_06 = spawn("script_model",self.origin);
var_06.origin = self.origin;
var_06.angles = self.angles;
var_06 setmodel(level._threatdetection.hostilemodel);
var_06 setcontents(0);
self._threatdetection.mark_enemy_model = var_06;
return;
}
if(param_00 == "vfx_model")
{
self._threatdetection.mark_friendly_model = spawnstruct();
self._threatdetection.mark_friendly_model = spawnfx(common_scripts\utility::getfx("threat_detect_model_stand"),self.origin,anglestoforward(self.angles),anglestoup(self.angles));
self._threatdetection.friendly_pose = "threat_detect_model_stand";
self._threatdetection.mark_enemy_model = spawnstruct();
self._threatdetection.mark_enemy_model = spawnfx(common_scripts\utility::getfx("threat_detect_model_stand_hostile"),self.origin,anglestoforward(self.angles),anglestoup(self.angles));
self._threatdetection.hostile_pose = "threat_detect_model_stand_hostile";
return;
}
if(param_00 == "attached_glow")
{
foreach(var_05, var_03 in level._threatdetection.fx_data)
{
var_08 = common_scripts\utility::spawn_tag_origin();
var_08 show();
var_08.origin = self gettagorigin(var_03[0]);
var_08.angles = self gettagangles(var_03[0]);
var_08 linkto(self,var_03[0]);
var_08.fx = var_03[1];
var_01.fx_ent[var_05] = var_08;
}
self.mark_fx = var_01;
return;
}
if(param_00 == "stencil_outline")
{
return;
}
}
//Function Number: 36
visitorupdatelosmarker(param_00,param_01,param_02)
{
visitorupdatemarkerpos(param_00,param_01,param_02);
visitorshowtoplayer(param_00,param_01,param_02);
}
//Function Number: 37
visitorshowtoplayer(param_00,param_01,param_02)
{
var_03 = getthreatstyle();
if(var_03 == "stencil_outline")
{
param_00 threatdetectedtoplayer(param_01);
return;
}
param_00 showtoplayer(param_01);
}
//Function Number: 38
showthreat(param_00,param_01,param_02,param_03)
{
if(param_00 == self)
{
return;
}
var_04 = param_02;
if((level.teambased || level.multiteambased) && param_00.team == self.team)
{
var_04 = param_01;
}
else if(param_00 == self)
{
var_04 = param_01;
}
visitfxent(param_03,var_04,param_00);
}