IL-GSC/BO2/PC/MP/maps/mp/_decoy.gsc
2023-10-28 00:17:17 -04:00

396 lines
9.2 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\_decoy.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 23
* Decompile Time: 10 ms
* Timestamp: 10/28/2023 12:10:53 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_entityheadicons;
#include maps/mp/_utility;
#include maps/mp/gametypes/_weaponobjects;
//Function Number: 1
init()
{
level.decoyweapons = [];
level.decoyweapons["fullauto"] = [];
level.decoyweapons["semiauto"] = [];
level.decoyweapons["fullauto"][level.decoyweapons["fullauto"].size] = "uzi_mp";
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "m1911_mp";
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "python_mp";
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "cz75_mp";
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "fnfal_mp";
}
//Function Number: 2
createdecoywatcher()
{
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher("nightingale","nightingale_mp",self.team);
watcher.onspawn = ::onspawndecoy;
watcher.detonate = ::decoydetonate;
watcher.deleteondifferentobjectspawn = 0;
watcher.headicon = 0;
}
//Function Number: 3
onspawndecoy(watcher,owner)
{
owner endon("disconnect");
self endon("death");
maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject(watcher,owner);
self.initial_velocity = self getvelocity();
delay = 1;
wait(delay);
decoy_time = 30;
spawn_time = GetTime();
owner addweaponstat("nightingale_mp","used",1);
self thread simulateweaponfire(owner);
while(1)
{
if(GetTime() > spawn_time + decoy_time * 1000)
{
self destroydecoy(watcher,owner);
return;
}
wait(0.05);
}
}
//Function Number: 4
movedecoy(owner,count,fire_time,main_dir,max_offset_angle)
{
self endon("death");
self endon("done");
if(!(self isonground()))
{
return;
}
min_speed = 100;
max_speed = 200;
min_up_speed = 100;
max_up_speed = 200;
current_main_dir = randomintrange(main_dir - max_offset_angle,main_dir + max_offset_angle);
avel = (randomfloatrange(800,1800) * randomintrange(0,2) * 2 - 1,0,randomfloatrange(580,940) * randomintrange(0,2) * 2 - 1);
intial_up = randomfloatrange(min_up_speed,max_up_speed);
start_time = GetTime();
gravity = GetDvarInt(#"55F139D3");
for(i = 0;i < 1;i++)
{
angles = (0,randomintrange(current_main_dir - max_offset_angle,current_main_dir + max_offset_angle),0);
dir = AnglesToForward(angles);
dir = VectorScale(dir);
deltatime = GetTime() - start_time * 0.001;
up = (0,0,intial_up - 800 * deltatime);
self launch(dir + up,avel);
wait(fire_time);
}
}
//Function Number: 5
destroydecoy(watcher,owner)
{
self notify("done");
self maps/mp/_entityheadicons::setentityheadicon("none");
}
//Function Number: 6
decoydetonate(attacker)
{
self notify("done");
self maps/mp/_entityheadicons::setentityheadicon("none");
}
//Function Number: 7
getweaponfordecoy(owner)
{
weapon = pickrandomweapon();
return weapon;
}
//Function Number: 8
simulateweaponfire(owner)
{
owner endon("disconnect");
self endon("death");
self endon("done");
weapon = getweaponfordecoy(owner);
if(weapon == "none")
{
return;
}
self thread watchforexplosion(owner,weapon);
self thread trackmaindirection();
self.max_offset_angle = 30;
weapon_class = getweaponclass(weapon);
switch(weapon_class)
{
case "weapon_assault":
case "weapon_cqb":
case "weapon_hmg":
case "weapon_lmg":
case "weapon_smg":
simulateweaponfiremachinegun(owner,weapon);
break;
case "weapon_sniper":
simulateweaponfiresniper(owner,weapon);
break;
case "weapon_pistol":
simulateweaponfirepistol(owner,weapon);
break;
case "weapon_shotgun":
simulateweaponfireshotgun(owner,weapon);
break;
default:
simulateweaponfiremachinegun(owner,weapon);
break;
}
}
//Function Number: 9
simulateweaponfiremachinegun(owner,weapon)
{
if(weaponissemiauto(weapon))
{
simulateweaponfiremachinegunsemiauto(owner,weapon);
}
else
{
simulateweaponfiremachinegunfullauto(owner,weapon);
}
}
//Function Number: 10
simulateweaponfiremachinegunsemiauto(owner,weapon)
{
firetime = weaponfiretime(weapon);
clipsize = weaponclipsize(weapon);
reloadtime = weaponreloadtime(weapon);
burst_spacing_min = 4;
burst_spacing_max = 10;
while(1)
{
if(clipsize <= 1)
{
burst_count = 1;
}
else
{
burst_count = randomintrange(1,clipsize);
}
self thread movedecoy(owner,burst_count,firetime,self.main_dir,self.max_offset_angle);
self fireburst(owner,weapon,firetime,burst_count,1);
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max);
}
}
//Function Number: 11
simulateweaponfirepistol(owner,weapon)
{
firetime = weaponfiretime(weapon);
clipsize = weaponclipsize(weapon);
reloadtime = weaponreloadtime(weapon);
burst_spacing_min = 0.5;
burst_spacing_max = 4;
while(1)
{
burst_count = randomintrange(1,clipsize);
self thread movedecoy(owner,burst_count,firetime,self.main_dir,self.max_offset_angle);
self fireburst(owner,weapon,firetime,burst_count,0);
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max);
}
}
//Function Number: 12
simulateweaponfireshotgun(owner,weapon)
{
firetime = weaponfiretime(weapon);
clipsize = weaponclipsize(weapon);
reloadtime = weaponreloadtime(weapon);
if(clipsize > 2)
{
clipsize = 2;
}
burst_spacing_min = 0.5;
burst_spacing_max = 4;
while(1)
{
burst_count = randomintrange(1,clipsize);
self thread movedecoy(owner,burst_count,firetime,self.main_dir,self.max_offset_angle);
self fireburst(owner,weapon,firetime,burst_count,0);
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max);
}
}
//Function Number: 13
simulateweaponfiremachinegunfullauto(owner,weapon)
{
firetime = weaponfiretime(weapon);
clipsize = weaponclipsize(weapon);
reloadtime = weaponreloadtime(weapon);
if(clipsize > 30)
{
clipsize = 30;
}
burst_spacing_min = 2;
burst_spacing_max = 6;
while(1)
{
burst_count = randomintrange(int(clipsize * 0.6),clipsize);
interrupt = 0;
self thread movedecoy(owner,burst_count,firetime,self.main_dir,self.max_offset_angle);
self fireburst(owner,weapon,firetime,burst_count,interrupt);
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max);
}
}
//Function Number: 14
simulateweaponfiresniper(owner,weapon)
{
firetime = weaponfiretime(weapon);
clipsize = weaponclipsize(weapon);
reloadtime = weaponreloadtime(weapon);
if(clipsize > 2)
{
clipsize = 2;
}
burst_spacing_min = 3;
burst_spacing_max = 5;
while(1)
{
burst_count = randomintrange(1,clipsize);
self thread movedecoy(owner,burst_count,firetime,self.main_dir,self.max_offset_angle);
self fireburst(owner,weapon,firetime,burst_count,0);
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max);
}
}
//Function Number: 15
fireburst(owner,weapon,firetime,count,interrupt)
{
interrupt_shot = count;
if(interrupt)
{
interrupt_shot = int(count * randomfloatrange(0.6,0.8));
}
self fakefire(owner,self.origin,weapon,interrupt_shot);
wait(firetime * interrupt_shot);
if(interrupt)
{
self fakefire(owner,self.origin,weapon,count - interrupt_shot);
wait(firetime * count - interrupt_shot);
}
}
//Function Number: 16
finishwhileloop(weapon,reloadtime,burst_spacing_min,burst_spacing_max)
{
if(shouldplayreloadsound())
{
playreloadsounds(weapon,reloadtime);
}
else
{
wait(randomfloatrange(burst_spacing_min,burst_spacing_max));
}
}
//Function Number: 17
playreloadsounds(weapon,reloadtime)
{
divy_it_up = reloadtime - 0.1 / 2;
wait(0.1);
self playsound("fly_assault_reload_npc_mag_out");
wait(divy_it_up);
self playsound("fly_assault_reload_npc_mag_in");
wait(divy_it_up);
}
//Function Number: 18
watchforexplosion(owner,weapon)
{
self thread watchfordeathbeforeexplosion();
owner endon("disconnect");
self endon("death_before_explode");
self waittill("explode",pos);
level thread doexplosion(owner,pos,weapon,randomintrange(5,10));
}
//Function Number: 19
watchfordeathbeforeexplosion()
{
self waittill("death");
wait(0.1);
self notify("death_before_explode");
}
//Function Number: 20
doexplosion(owner,pos,weapon,count)
{
min_offset = 100;
max_offset = 500;
for(i = 0;i < count;i++)
{
wait(randomfloatrange(0.1,0.5));
offset = (randomfloatrange(min_offset,max_offset) * randomintrange(0,2) * 2 - 1,randomfloatrange(min_offset,max_offset) * randomintrange(0,2) * 2 - 1,0);
owner fakefire(owner,pos + offset,weapon,1);
}
}
//Function Number: 21
pickrandomweapon()
{
type = "fullauto";
if(randomintrange(0,10) < 3)
{
type = "semiauto";
}
randomval = randomintrange(0,level.decoyweapons[type].size);
/#
println("Decoy type: " + type + " weapon: " + level.decoyweapons[type][randomval]);
#/
return level.decoyweapons[type][randomval];
}
//Function Number: 22
shouldplayreloadsound()
{
if(randomintrange(0,5) == 1)
{
return 1;
}
}
//Function Number: 23
trackmaindirection()
{
self endon("death");
self endon("done");
self.main_dir = int(VectorToAngles((self.initial_velocity[0],self.initial_velocity[1],0))[1]);
up = (0,0,1);
while(1)
{
self waittill("grenade_bounce",pos,normal);
dot = vectordot(normal,up);
if(dot < 0.5 && dot > -0.5)
{
self.main_dir = int(VectorToAngles((normal[0],normal[1],0))[1]);
}
}
}