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

620 lines
14 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\mp_express_train.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 15
* Decompile Time: 9 ms
* Timestamp: 10/28/2023 12:11:08 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_events;
#include maps/mp/_tacticalinsertion;
#include maps/mp/_utility;
#include maps/mp/gametypes/_gameobjects;
#include maps/mp/gametypes/_weaponobjects;
#include maps/mp/gametypes/ctf;
#include maps/mp/killstreaks/_rcbomb;
#include maps/mp/killstreaks/_supplydrop;
//Function Number: 1
init()
{
precachevehicle("express_train_engine_mp");
precachemodel("p6_bullet_train_car_phys");
precachemodel("p6_bullet_train_engine_rev");
precacheshader("compass_train_carriage");
precachestring(&"traincar");
precachestring(&"trainengine");
gates = getentarray("train_gate_rail","targetname");
brushes = getentarray("train_gate_rail_brush","targetname");
triggers = getentarray("train_gate_kill_trigger","targetname");
traintriggers = getentarray("train_kill_trigger","targetname");
foreach(brush in brushes)
{
brush disconnectpaths();
}
waittime = 0.05;
foreach(gate in gates)
{
gate.waittime = waittime;
waittime = waittime + 0.05;
gate.og_origin = gate.origin;
brush = getclosest(gate.origin,brushes);
brush linkto(gate);
gate.kill_trigger = getclosest(gate.origin,triggers);
if(IsDefined(gate.kill_trigger))
{
gate.kill_trigger enablelinkto();
gate.kill_trigger linkto(gate);
}
}
start = getvehiclenode("train_start","targetname");
endgates = getentarray("train_gate_rail_end","targetname");
entrygate = getclosest(start.origin,endgates);
for(i = 0;i < endgates.size;i++)
{
if(endgates[i] == entrygate)
{
}
else
{
exitgate = endgates[i];
break;
}
}
cars = [];
cars[0] = spawnvehicle("p6_bullet_train_engine_phys","train","express_train_engine_mp",start.origin,(0,0,0));
cars[0] ghost();
cars[0] setcheapflag(1);
cars[0].ismagicbullet = 1;
killcam = spawn("script_model",25 + VectorScale((0,0,1)));
killcam.angles = 10 + VectorScale((0,-1,0));
killcam linkto(cars[0]);
foreach(traintrigger in traintriggers)
{
cars[0].trainkilltrigger = traintrigger;
traintrigger.origin = start.origin;
traintrigger enablelinkto();
traintrigger linkto(cars[0]);
}
for(i = 1;i < 20;i++)
{
cars[i] = spawn("script_model",start.origin);
cars[i] setmodel("p6_bullet_train_car_phys");
cars[i] ghost();
cars[i] setcheapflag(1);
}
cars[20] = spawn("script_model",start.origin);
cars[20] setmodel("p6_bullet_train_engine_rev");
cars[20] ghost();
cars[20] setcheapflag(1);
waittillframeend;
if(level.timelimit)
{
seconds = level.timelimit * 60;
add_timed_event(int(seconds * 0.25),"train_start");
add_timed_event(int(seconds * 0.75),"train_start");
}
else if(level.scorelimit)
{
add_score_event(int(level.scorelimit * 0.25),"train_start");
add_score_event(int(level.scorelimit * 0.75),"train_start");
}
level thread train_think(gates,entrygate,exitgate,cars,start,killcam);
}
//Function Number: 2
showaftertime(time)
{
wait(time);
self show();
}
//Function Number: 3
train_think(gates,entrygate,exitgate,cars,start,killcam)
{
level endon("game_ended");
for(;;)
{
level waittill("train_start");
entrygate gate_move(-172);
traintiming = getdvarfloatdefault("scr_express_trainTiming",4);
exitgate thread waitthenmove(traintiming,-172);
array_func(gates,::gate_move,-172);
foreach(gate in gates)
{
gate playloopsound("amb_train_incomming_beep");
gate playsound("amb_gate_move");
}
gatedownwait = getdvarintdefault("scr_express_gateDownWait",2);
wait(gatedownwait);
foreach(gate in gates)
{
gate stoploopsound(2);
}
wait(2);
cars[0] attachpath(start);
cars[0].killcament = undefined;
if(IsDefined(cars[0].trainkilltrigger))
{
cars[0] thread train_move_think(cars[0].trainkilltrigger);
}
cars[0] startpath();
cars[0] showaftertime(0.2);
cars[0] thread record_positions();
cars[0] thread watch_end();
cars[0] playloopsound("amb_train_lp");
cars[0] setclientfield("train_moving",1);
cars[0] thread watch_player_touch();
killcam.starttime = GetTime();
cars[0].killcament = killcam;
next = "_b";
for(i = 1;i < cars.size;i++)
{
if(i == 1)
{
wait(0.4);
}
else
{
wait(0.35);
}
if(i >= 3 && i % 3 == 0)
{
cars[i] playloopsound("amb_train_lp" + next);
switch(next)
{
case "_b":
next = "_c";
break;
case "_c":
next = "_d";
break;
case "_d":
next = "";
break;
default:
next = "_b";
break;
}
}
cars[i] thread watch_player_touch();
if(i == cars.size - 1)
{
cars[i] thread car_move();
}
else
{
cars[i] thread car_move();
}
}
traintiming = getdvarfloatdefault("scr_express_trainTiming2",2);
entrygate thread waitthenmove(traintiming);
gateupwait = getdvarfloatdefault("scr_express_gateUpWait",6.5);
wait(gateupwait);
exitgate gate_move();
array_func(gates,::gate_move);
foreach(gate in gates)
{
gate playsound("amb_gate_move");
}
wait(6);
}
}
//Function Number: 4
waitthenmove(time,distance)
{
wait(time);
self gate_move(distance);
}
//Function Number: 5
record_positions()
{
self endon("reached_end_node");
if(IsDefined(level.train_positions))
{
return;
}
level.train_positions = [];
level.train_angles = [];
for(;;)
{
level.train_positions[level.train_positions.size] = self.origin;
level.train_angles[level.train_angles.size] = self.angles;
wait(0.05);
}
}
//Function Number: 6
watch_player_touch()
{
self endon("end_of_track");
self endon("delete");
self endon("death");
self.disablefinalkillcam = 1;
for(;;)
{
self waittill("touch",entity);
if(isplayer(entity))
{
entity dodamage(entity.health * 2,self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
}
}
//Function Number: 7
watch_end()
{
self waittill("reached_end_node");
self ghost();
self setclientfield("train_moving",0);
self stoploopsound(0.2);
self playsound("amb_train_end");
}
//Function Number: 8
car_move()
{
self setclientfield("train_moving",1);
for(i = 0;i < level.train_positions.size;i++)
{
self.origin = level.train_positions[i];
self.angles = level.train_angles[i];
wait(0.05);
if(i == 4)
{
self show();
}
}
self notify("end_of_track");
self ghost();
self setclientfield("train_moving",0);
self stoploopsound(0.2);
self playsound("amb_train_end");
}
//Function Number: 9
gate_rotate(yaw)
{
self rotateyaw(yaw,5);
}
//Function Number: 10
gate_move(z_dist)
{
if(IsDefined(self.kill_trigger))
{
self thread gate_move_think(IsDefined(z_dist));
}
if(!(IsDefined(z_dist)))
{
self moveto(self.og_origin,5);
}
else
{
self.og_origin = self.origin;
self movez(z_dist,5);
}
}
//Function Number: 11
train_move_think(kill_trigger)
{
self endon("movedone");
self endon("reached_end_node");
for(;;)
{
wait(0.05);
pixbeginevent("train_move_think");
entities = getdamageableentarray(self.origin,200);
foreach(entity in entities)
{
if(IsDefined(entity.targetname) && entity.targetname == "train")
{
}
else if(isplayer(entity))
{
}
else if(!(entity istouching(kill_trigger)))
{
}
else if(IsDefined(entity.model) && entity.model == "t6_wpn_tac_insert_world")
{
entity maps/mp/_tacticalinsertion::destroy_tactical_insertion();
}
else if(!(isalive(entity)))
{
}
else if(IsDefined(entity.targetname))
{
if(entity.targetname == "talon")
{
entity notify("death");
}
else if(entity.targetname == "rcbomb")
{
entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode();
}
else if(entity.targetname == "riotshield_mp")
{
entity dodamage(1,self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
else if(IsDefined(entity.helitype) && entity.helitype == "qrdrone")
{
watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher("qrdrone");
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined);
}
else if(entity.classname == "grenade")
{
if(!(IsDefined(entity.name)))
{
}
else if(!(IsDefined(entity.owner)))
{
}
else if(entity.name == "proximity_grenade_mp")
{
watcher = entity.owner getwatcherforweapon(entity.name);
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined,"script_mover_mp");
}
else if(!(isweaponequipment(entity.name)))
{
}
else
{
watcher = entity.owner getwatcherforweapon(entity.name);
if(!(IsDefined(watcher)))
{
}
else
{
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined,"script_mover_mp");
if(entity.classname == "auto_turret")
{
if(IsDefined(entity.carried) && entity.carried == 1)
{
}
else
{
if(!IsDefined(entity.damagedtodeath) || !entity.damagedtodeath)
{
entity domaxdamage(self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
entity dodamage(entity.health * 2,self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
}
}
}
}
}
}
self destroy_supply_crates();
if(level.gametype == "ctf")
{
foreach(flag in level.flags)
{
if(flag.curorigin != flag.trigger.baseorigin && flag.visuals[0] istouching(kill_trigger))
{
flag maps/mp/gametypes/ctf::returnflag();
}
}
}
else if(level.gametype == "sd" && !level.multibomb)
{
if(level.sdbomb.visuals[0] istouching(kill_trigger))
{
level.sdbomb maps/mp/gametypes/_gameobjects::returnhome();
}
}
pixendevent();
}
}
//Function Number: 12
gate_move_think(ignoreplayers)
{
self endon("movedone");
self.disablefinalkillcam = 1;
corpse_delay = 0;
if(IsDefined(self.waittime))
{
wait(self.waittime);
}
for(;;)
{
wait(0.4);
pixbeginevent("gate_move_think");
entities = getdamageableentarray(self.origin,100);
foreach(entity in entities)
{
if(ignoreplayers == 1 && isplayer(entity))
{
}
else if(!(entity istouching(self.kill_trigger)))
{
}
else if(IsDefined(entity.model) && entity.model == "t6_wpn_tac_insert_world")
{
entity maps/mp/_tacticalinsertion::destroy_tactical_insertion();
}
else if(!(isalive(entity)))
{
}
else if(IsDefined(entity.targetname))
{
if(entity.targetname == "talon")
{
entity notify("death");
}
else if(entity.targetname == "rcbomb")
{
entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode();
}
else if(entity.targetname == "riotshield_mp")
{
entity dodamage(1,self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
else if(IsDefined(entity.helitype) && entity.helitype == "qrdrone")
{
watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher("qrdrone");
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined);
}
else if(entity.classname == "grenade")
{
if(!(IsDefined(entity.name)))
{
}
else if(!(IsDefined(entity.owner)))
{
}
else if(entity.name == "proximity_grenade_mp")
{
watcher = entity.owner getwatcherforweapon(entity.name);
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined,"script_mover_mp");
}
else if(!(isweaponequipment(entity.name)))
{
}
else
{
watcher = entity.owner getwatcherforweapon(entity.name);
if(!(IsDefined(watcher)))
{
}
else
{
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate(entity,0,undefined,"script_mover_mp");
if(entity.classname == "auto_turret")
{
if(IsDefined(entity.carried) && entity.carried == 1)
{
}
else
{
if(!IsDefined(entity.damagedtodeath) || !entity.damagedtodeath)
{
entity domaxdamage(self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
entity dodamage(entity.health * 2,self.origin + (0,0,1),self,self,0,"MOD_CRUSH");
}
}
}
}
}
}
}
self destroy_supply_crates();
if(GetTime() > corpse_delay)
{
self destroy_corpses();
}
if(level.gametype == "ctf")
{
foreach(flag in level.flags)
{
if(flag.visuals[0] istouching(self.kill_trigger))
{
flag maps/mp/gametypes/ctf::returnflag();
}
}
}
else if(level.gametype == "sd" && !level.multibomb)
{
if(level.sdbomb.visuals[0] istouching(self.kill_trigger))
{
level.sdbomb maps/mp/gametypes/_gameobjects::returnhome();
}
}
pixendevent();
}
}
//Function Number: 13
getwatcherforweapon(weapname)
{
if(!(IsDefined(self)))
{
return undefined;
}
if(!(isplayer(self)))
{
return undefined;
}
for(i = 0;i < self.weaponobjectwatcherarray.size;i++)
{
if(self.weaponobjectwatcherarray[i].weapon != weapname)
{
}
else
{
return self.weaponobjectwatcherarray[i];
}
}
return undefined;
}
//Function Number: 14
destroy_supply_crates()
{
crates = getentarray("care_package","script_noteworthy");
foreach(crate in crates)
{
if(distancesquared(crate.origin,self.origin) < 10000)
{
if(crate istouching(self))
{
playfx(level._supply_drop_explosion_fx,crate.origin);
playsoundatposition("wpn_grenade_explode",crate.origin);
wait(0.1);
crate maps/mp/killstreaks/_supplydrop::cratedelete();
}
}
}
}
//Function Number: 15
destroy_corpses()
{
corpses = getcorpsearray();
for(i = 0;i < corpses.size;i++)
{
if(distancesquared(corpses[i].origin,self.origin) < 10000)
{
corpses[i] delete();
}
}
}