mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-10 18:27:57 -05:00
620 lines
14 KiB
Plaintext
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();
|
|
}
|
|
}
|
|
} |