2025-05-21 16:23:17 +02:00

1386 lines
36 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\_audio;
#include maps\mp\_dynamic_events;
#using_animtree( "animated_props" );
main()
{
PreCacheModel( "mp_dam_large_caliber_turret");
maps\mp\mp_dam_precache::main();
maps\createart\mp_dam_art::main();
maps\mp\mp_dam_fx::main();
maps\mp\_load::main();
maps\mp\mp_dam_lighting::main();
maps\mp\_compass::setupMiniMap( "compass_map_mp_dam" );
//setupCraneAnimations();
game["attackers"] = "allies";
game["defenders"] = "axis";
level.aerial_pathnode_offset = 600;
level.mapCustomKillstreakFunc = ::damCustomKillstreakFunc;
// OSP overrides
level.orbitalSupportOverrideFunc = ::damCustomOSPFunc;
//Lighting items
//setdvar("r_aodiminish", "0");
setdvar( "r_mpRimColor", "1 1 1" );
setdvar( "r_mpRimStrength", "1" );
setdvar( "r_mpRimDiffuseTint", "1 1 1" );
thread rotateGenerators();
//ANIMATED CRANE MOVEMENT
thread Crane1Movement();
thread Crane2Movement();
//Spawn Killstreak Turrets
thread SetupKillstreakTurrets();
//glass pathing
thread handle_glass_pathing();
//custom killstreak settings
thread DamCustomAirstrike();
////// Shutting off dynamic event
// thread onPlayerConnect();
// thread SetupDynamicEvent();
}
/*
onPlayerConnect()
{
for ( ;; )
{
level waittill ( "connected", player );
player.numAreas = 0;
player.numFireTriggers = 0;
player thread WatchForSpawn();
}
}
WatchForSpawn()
{
self endon("disconnect");
level endon("game_ended");
self waittill ( "spawned_player" );
self.numAreas = 0;
self.numFireTriggers = 0;
self.firedamge = 0;
}
SetupDynamicEvent()
{
level.DynEventDam = SpawnStruct();
level.DynEventDam.Turrets = SetupDynamicEventTurrets();
level.DynEventDam.HeliGotos = GetHeliGotoArray();
level.DynEventDam.StartPos = getstruct("dynamic_heli_path_start", "targetname");
level.DynEventDam.Helicopter = GetEnt("dynamic_helicopter","targetname");
level.DynEventDam.Helicopter.spin = false;
level.DynEventDam.BeforeGate = GetEntArray("gate_before","targetname");
level.DynEventDam.AfterGate = GetEntArray("gate_after","targetname");
level.DynEventDam.Clip = GetEnt("dynamic_clip","targetname");
level.DynEventDam.TriggerHurtFireArray = GetEntarray("dynamic_fire","targetname");
level.DynEventDam.TunableSpeed = 1000;
level.DynEventDam.EventStatus = false;
level.DynEventDam.FireParticleArray = getstructarray("fire_large","targetname");
level.DynEventDam.FireSpreadArray = getstructarray("fire_spread","script_noteworthy");
level.DynEventDam.KillFireSpreadTriggers = false;
level.DynEventDam.TriggerSecondWaveArray = GetEntArray("dynamic_fire_secondwave","targetname");
level.DynEventDam.TowerCrash01Group = getentarray("power_tower_01","targetname");
level.DynEventDam.TowerCrash01GroupParent = getent("power_tower_01_parent","targetname");
foreach(part in level.DynEventDam.TowerCrash01Group)
{
part LinkToSynchronizedParent(level.DynEventDam.TowerCrash01GroupParent);
}
level.DynEventDam.TowerCrash02Group = getentarray("power_tower_02","targetname");
level.DynEventDam.TowerCrash02GroupParent = getent("power_tower_02_parent","targetname");
foreach(part in level.DynEventDam.TowerCrash02Group)
{
part LinkToSynchronizedParent(level.DynEventDam.TowerCrash02GroupParent);
}
level.DynEventDam.GroundPreExplosion01 = getent("terrain_pre_crash_01","targetname");
level.DynEventDam.GroundPreExplosion01_Origin = getstruct("terrain_pre_crash_origin_01","targetname");
level.DynEventDam.GroundPreExplosion02 = getent("terrain_pre_crash_02","targetname");
level.DynEventDam.GroundPreExplosion02_Origin = getstruct("terrain_pre_crash_origin_02","targetname");
level.DynEventDam.HeliCrashBody = getent("heli_body_01_collision","targetname");
level.DynEventDam.HeliCrashBody_Origin = getstruct("heli_crash_origin","targetname");
level.DynEventDam.HeliCrashTail = getent("heli_tail_01_collision","targetname");
level.DynEventDam.HeliCrashTail_Origin = getstruct("heli_crash_tail_origin","targetname");
level.DynEventDam.HeliCrashDebris = getent("heli_debris_01_collision","targetname");
level.DynEventDam.HeliCrashDebris_Origin = getstruct("heli_crash_debris_01_origin","targetname");
level.DynEventDam.HeliCrashBodyTriggerKill = getent("heli_crash_body_trigger_kill","targetname");
level.DynEventDam.HeliCrashTailTriggerKill = getent("heli_crash_tail_trigger_kill","targetname");
level.DynEventDam.HeliCrashDebrisTriggerKill = getent("heli_crash_debris_trigger_kill","targetname");
level.DynEventDam.FireWallParticle_01 = LoadFX( "vfx/map/sanfran_b/sfb_fire_spot_directional_blacksmk_lg"); // replace with real particle
level.DynEventDam.HeliExplosion_01 = LoadFX( "vfx/explosion/vehicle_fireball_explosion_01"); // replace with real particle
level.DynEventDam.HeliTailFire = LoadFX( "vfx/map/sanfran_b/sfb_fire_spot_directional_blacksmk_lg"); // replace with real particle
//// Hiding things that need to be hidden at start
///
MoveAndHideEventParts();
level.dynamicSpawns = ::GetListOfGoodSpawnPoints;
level thread DynamicEvent( ::dynamicEventStartFunc );
thread CheckForCrouch();
}
MoveAndHideEventParts()
{
MoveDist = (0,0,-10000);
level.DynEventDam.Helicopter hide();
level.DynEventDam.Clip thread MoveAndVisibility(MoveDist);
foreach(part in level.DynEventDam.AfterGate)
{
part thread MoveAndVisibility(MoveDist,true);
}
level.DynEventDam.HeliCrashBodyTriggerKill thread MoveAndVisibility(MoveDist);
level.DynEventDam.HeliCrashTailTriggerKill thread MoveAndVisibility(MoveDist);
level.DynEventDam.HeliCrashDebrisTriggerKill thread MoveAndVisibility(MoveDist);
level.DynEventDam.HeliCrashBody thread MoveAndVisibility(MoveDist,true);
level.DynEventDam.HeliCrashTail thread MoveAndVisibility(MoveDist,true);
level.DynEventDam.HeliCrashDebris thread MoveAndVisibility(MoveDist,true);
level.DynEventDam.GroundPreExplosion01 DontInterpolate();
level.DynEventDam.GroundPreExplosion02 DontInterpolate();
level.DynEventDam.GroundPreExplosion01.origin = level.DynEventDam.GroundPreExplosion01_Origin.origin;
level.DynEventDam.GroundPreExplosion02.origin = level.DynEventDam.GroundPreExplosion02_Origin.origin;
}
MoveAndVisibility(MoveVec, bHide)
{
self DontInterpolate();
self.origin += MoveVec;
if(isdefined(bHide))
{
if(bHide == true)
{
self hide();
}
else if(bHide == false)
{
self show();
}
}
}
CheckForCrouch()
{
CrouchTriggers = getentarray("force_crouch", "targetname");
if (CrouchTriggers.size > 0)
{
foreach ( trigger in CrouchTriggers )
trigger thread common_scripts\_dynamic_world::triggerTouchThink( ::playerEnterPipe, ::playerLeavePipe );
}
}
playerEnterPipe( trigger )
{
self.numAreas++;
if ( self.numAreas == 1 )
{
// if(self GetStance() == "stand")
// {
// self SetStance("crouch");
// }
}
}
playerLeavePipe( trigger )
{
self.numAreas--;
assert( self.numAreas >= 0 );
if ( self.numAreas != 0 )
return;
self notify( "leftTrigger");
//stand?
}
/*
ForceCrouch(trigger)
{
self endon("leftTrigger");
while(true)
{
if(self istouching(trigger))
{
if(self GetStance() == "stand")
{
self SetStance("crouch");
wait(0.5);
}
}
else
{
wait(0.1);
{
if(self istouching(trigger))
{
if(self GetStance() == "stand")
{
self SetStance("crouch");
}
}
else
{
break;
}
}
}
wait(0.05);
}
}
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////--------------------------------- DYNAMIC EVENT SART
/*
GetListOfGoodSpawnPoints(fullListOfSpawnPoints)
{
goodpoints = [];
// Getting all neutral spawns
foreach(spawn in fullListOfSpawnPoints)
{
if( !IsDefined( spawn.targetname ) || ( spawn.targetname == "" ) )
{
goodpoints = add_to_array(goodpoints, spawn);
}
else if(spawn GetDynamicEventSpawns() == true)
{
goodpoints = add_to_array(goodpoints, spawn);
}
}
return goodpoints;
}
GetDynamicEventSpawns()
{
if(level.DynEventDam.EventStatus == false)
{
if(self.targetname == "dynamic_event_spawn")
{
return true;
}
}
else if(level.DynEventDam.EventStatus == true)
{
if(self.targetname == "dynamic_event_spawn")
{
return false;
}
}
return false;
}
dynamicEventStartFunc()
{
level.DynEventDam.Helicopter DynamicHeliStart();
level.DynEventDam.Helicopter HandleExplosion();
/*
thread StartAreaFire();
CheckFireSpreadState(level.DynEventDam.FireSpreadArray);
level notify("fire_trigger_large");
wait(0.15); // waiing for spawned trigger_radii to be deleted. FireTriggerWaitForRemove()
FullAreaDeathTriggers();
*/
// }
/*
GetHeliGotoArray()
{
StartPos = getstruct("dynamic_heli_path_start", "targetname");
GotoArray = [];
GotoArray[0] = StartPos;
CurrentPos = StartPos;
while(true)
{
if(isdefined(CurrentPos) && isdefined(CurrentPos.target))
{
NextPos = getstruct(CurrentPos.target, "targetname");
GotoArray[GotoArray.size] = NextPos;
CurrentPos = NextPos;
}
else
{
break;
}
}
return GotoArray;
}
DynamicHeliStart()
{
self show();
///// X units a second
MoveSpeed = level.DynEventDam.TunableSpeed;
wait(0.05);
foreach(location in level.DynEventDam.HeliGotos)
{
dis = Distance(self.origin, location.origin);
Movetime = dis / MoveSpeed;
if(isdefined(location.script_noteworthy))
{
self thread DoScriptNoteWorthy(location.script_noteworthy);
}
self moveto(location.origin, Movetime);
if(self.spin == false)
{
self thread RotateHeli(location.angles, Movetime);
}
self waittill("movedone");
}
return;
}
DoScriptNoteWorthy(note)
{
if(note == "start_battle")
{
foreach(turret in level.DynEventDam.Turrets)
{
turret thread ShootDynHeli();
}
}
else if(note == "start_spin")
{
level.DynEventDam.EventStatus = true;
self.spin = true;
self thread TailFire();
self thread SpinHeli();
}
else if(note == "crash_power_tower_01")
{
self thread KnockDownTower01();
}
else if(note == "crash_power_tower_02")
{
self thread KnockDownTower02();
}
else if(note == "crash")
{
self waittill("movedone");
}
}
KnockDownTower01()
{
thread SpawnParticleVFX(level.DynEventDam.HeliExplosion_01, self.origin, self.angles);
level.DynEventDam.TowerCrash01GroupParent rotateto((60,230,-180), 4, 2, 1);
// level.DynEventDam.TowerCrash01Group
}
KnockDownTower02()
{
thread SpawnParticleVFX(level.DynEventDam.HeliExplosion_01, self.origin, self.angles);
level.DynEventDam.TowerCrash02GroupParent rotateto((60,230,-180), 4, 2, 1);
// level.DynEventDam.TowerCrash01Group
}
TailFire()
{
self.TailFire = PlayFXOnTag(level.DynEventDam.HeliTailFire, self, "thruster_BL");
}
HandleExplosion()
{
self thread HeliExplosion();
thread KillPlayersNearDebris();
wait(0.25);
thread SwapGroundAndHeli();
/*
foreach(part in level.DynEventDam.AfterGate)
{
part DontInterpolate();
part.origin += (0,0,10000);
}
// level.DynEventDam.Clip.origin += (0,0,10000);
foreach(trigger in level.DynEventDam.TriggerHurtFireArray)
{
trigger.origin += (0,0,752);
// trigger thread ShockPlayer();
trigger thread FireTriggerKillSentientNonPlayer();
trigger thread common_scripts\_dynamic_world::triggerTouchThink( ::playerEnterFireArea, ::playerLeaveFireArea );
trigger thread FireTriggerWaitForRemove();
}
foreach(part in level.DynEventDam.BeforeGate)
{
part delete();
}
foreach(part in level.DynEventDam.AfterGate)
{
part show();
}
*/
// return;
// }
/*
KillPlayersNearDebris()
{
level.DynEventDam.HeliCrashBodyTriggerKill DontInterpolate();
level.DynEventDam.HeliCrashTailTriggerKill DontInterpolate();
level.DynEventDam.HeliCrashDebrisTriggerKill DontInterpolate();
level.DynEventDam.HeliCrashBodyTriggerKill.origin += (0,0,10000);
level.DynEventDam.HeliCrashTailTriggerKill.origin += (0,0,10000);
level.DynEventDam.HeliCrashDebrisTriggerKill.origin += (0,0,10000);
wait(1);
level.DynEventDam.HeliCrashBodyTriggerKill.origin += (0,0,-10000);
level.DynEventDam.HeliCrashTailTriggerKill.origin += (0,0,-10000);
level.DynEventDam.HeliCrashDebrisTriggerKill.origin += (0,0,-10000);
}
SwapGroundAndHeli()
{
level.DynEventDam.GroundPreExplosion01 delete();
level.DynEventDam.GroundPreExplosion02 delete();
level.DynEventDam.HeliCrashBody DontInterpolate();
level.DynEventDam.HeliCrashTail DontInterpolate();
level.DynEventDam.HeliCrashDebris DontInterpolate();
level.DynEventDam.HeliCrashBody.origin = level.DynEventDam.HeliCrashBody_Origin.origin;
level.DynEventDam.HeliCrashTail.origin = level.DynEventDam.HeliCrashTail_Origin.origin;
level.DynEventDam.HeliCrashDebris.origin = level.DynEventDam.HeliCrashDebris_Origin.origin;
level.DynEventDam.HeliCrashBody show();
level.DynEventDam.HeliCrashTail show();
level.DynEventDam.HeliCrashDebris show();
}
StartAreaFire()
{
SpreadWait = 2.5;
foreach(pos in level.DynEventDam.FireSpreadArray)
{
pos.is_burning = false;
}
foreach(pos in level.DynEventDam.FireParticleArray)
{
thread SpawnParticleVFX(level.DynEventDam.FireWallParticle_01, pos.origin, (-90,90,0));
if(isdefined(pos.target))
{
NewFireArray = getstructarray(pos.target, "targetname");
foreach(new_pos in NewFireArray)
{
new_pos thread FireSpreadThink(SpreadWait);
}
}
}
}
CheckFireSpreadState(FireSpreadArray)
{
WaitNum = FireSpreadArray.size;
while(WaitNum > 0)
{
level waittill("fire_spread_event");
WaitNum--;
}
return;
}
FullAreaDeathTriggers()
{
foreach(player in level.players)
{
player.numFireTriggers = 0;
player notify( "leftFireTrigger" );
}
wait(0.1); // wait for new triggers
foreach(trigger in level.DynEventDam.TriggerSecondWaveArray)
{
trigger.origin += (0,0,752);
// trigger thread ShockPlayer();
trigger thread common_scripts\_dynamic_world::triggerTouchThink( ::playerEnterFireArea, ::playerLeaveFireArea );
trigger thread FireTriggerKillSentientNonPlayer();
}
level.DynEventDam.Clip.origin += (0,0,10000);
level.DynEventDam.KillFireSpreadTriggers = true;
}
/*
ShockPlayer()
{
self waittill("trigger", HitEnt);
{
if(IsSentient(HitEnt))
{
if(IsPlayer(HitEnt))
{
HitEnt shellshock( "default", 2);
}
}
}
}
*/
/*
FireSpread(SpreadWait)
{
foreach(pos in level.DynEventDam.FireSpreadArray)
{
if(!isdefined(pos.targetname))
{
pos thread FireSpreadThink(SpreadWait);
}
}
}
*/
/*
FireSpreadThink(SpreadWait)
{
// level.DynEventDam.FireSpreadArray
wait(SpreadWait);
self.is_burning = true;
thread SpawnParticleVFX(level.DynEventDam.FireWallParticle_01, self.origin, (-90,90,0));
self thread SpawnFireRadiusDmg();
level notify("fire_spread_event");
if(isdefined(self.target))
{
NewFireArray = getstructarray(self.target, "targetname");
foreach(pos in NewFireArray)
{
pos thread FireSpreadThink(SpreadWait);
}
}
}
SpawnFireRadiusDmg()
{
flags = 16;
trigger_radius = 128;
trigger_height = 256;
// trigger = Spawn( "trigger_radius", dot.origin, dot.spawnflags, dot.radius, dot.height );
FireDamageTrigger = spawn("trigger_radius",self.origin + (0,0,-32), flags, trigger_radius, trigger_height);
if(isdefined(FireDamageTrigger))
{
FireDamageTrigger thread FireTriggerKillSentientNonPlayer();
FireDamageTrigger thread FireTriggerWaitForRemove();
FireDamageTrigger thread common_scripts\_dynamic_world::triggerTouchThink( ::playerEnterFireArea, ::playerLeaveFireArea );
}
}
FireTriggerWaitForRemove()
{
while(true)
{
level waittill("fire_trigger_large");
{
self notify("deleted");
wait(0.05);
self delete();
return;
}
}
}
FireTriggerKillSentientNonPlayer()
{
level endon("fire_trigger_large");
self endon("deleted");
self endon("death");
self waittill("trigger", HitEnt);
{
if(IsSentient(HitEnt))
{
if(!IsPlayer(HitEnt))
{
// for sentry gun etc
HitEnt DoDamage(100, HitEnt.origin);
}
}
}
}
FireDamage()
{
self endon( "disconnect" );
self endon( "game_ended" );
self endon( "death" );
self endon( "leftFireTrigger" );
if(!isdefined(self.firedamge))
{
self.firedamge = 0;
}
else if(self.firedamge >= 8)
{
self.firedamge = 7;
}
// self thread soundWatcher( self );
while (1)
{
self.firedamge ++;
switch( self.firedamge )
{
case 1:
// playsound
self ViewKick( 1, self.origin );
self shellshock( "default", 2);
self DoFireDamage(1);
break;
case 3:
// playsound
self shellshock( "default", 2);
self ViewKick( 3, self.origin );
self DoFireDamage(25);
break;
case 4:
// playsound
self shellshock( "default", 4);
self ViewKick( 15, self.origin );
self DoFireDamage(45);
break;
case 6:
// playsound
self shellshock( "default", 4);
self ViewKick( 75, self.origin );
self DoFireDamage(80);
break;
case 8:
// playsound
self shellshock( "default", 4);
self ViewKick( 127, self.origin );
self DoFireDamage(175);
self.firedamge = 7; // looping just in case.
break;
}
wait(0.5);
}
}
DoFireDamage( iDamage )
{
//if( !isdefined( level.mp_prison_killstreak.owner ) )
// return;
//TODO:Handle friendly fire
self thread [[ level.callbackPlayerDamage ]](
self,// eInflictor The entity that causes the damage.( e.g. a turret )
self,// eAttacker The entity that is attacking.
iDamage,// iDamage Integer specifying the amount of damage done
0,// iDFlags Integer specifying flags that are to be applied to the damage
"MOD_SUICIDE",// sMeansOfDeath Integer specifying the method of death
"mp_dam_fire",// sWeapon The weapon number of the weapon used to inflict the damage
self.origin,// vPoint The point the damage is from?
( 0,0,0 ) - self.origin,// vDir The direction of the damage
"none",// sHitLoc The location of the hit
0// psOffsetTime The time offset for the damage
);
}
playerEnterFireArea( trigger )
{
self.numFireTriggers++;
self.poison = 1; // hack for level.callbackPlayerDamage, it requires player to have poison defined otherwise it will return early as vitcim and inflictor are the same
if ( self.numFireTriggers == 1 )
self FireDamage();
}
playerLeaveFireArea( trigger )
{
self.numFireTriggers--;
if ( self.numFireTriggers > 0 )
{
return;
}
else if ( self.numFireTriggers < 0 )
{
self.numFireTriggers = 0;
}
self.poison = 0;
self.firedamge = 0;
self notify( "leftFireTrigger");
/*
if ( isDefined( self.gasOverlay ) )
self.gasOverlay fadeoutBlackOut( .10, 0 );
*/
//}
/*
HeliExplosion()
{
ExplosionLocation = self.origin;
ExplosionAngles = self.angles;
if(isdefined(self.TailFire))
{
self.TailFire delete();
}
wait(0.05);
self delete();
thread SpawnParticleVFX(level.DynEventDam.HeliExplosion_01, ExplosionLocation, ExplosionAngles);
}
SpawnParticleVFX(particle, position, particle_angles)
{
SpawnedFX = SpawnFx( particle, position, AnglesToForward(particle_angles), AnglesToUp(particle_angles));
TriggerFX( SpawnedFX);
}
ShootDynHeli()
{
self thread TrackDynTarget();
self thread ShootDynTarget();
}
TrackDynTarget()
{
level.DynEventDam.Helicopter endon("death");
level.DynEventDam.Helicopter endon("delete");
// while(true)
// {
self ClearTargetEntity();
wait(0.05);
// ClearTurretTarget
self SetTargetEntity( level.DynEventDam.Helicopter );
// wait(0.25);
// }
}
ShootDynTarget()
{
level.DynEventDam.Helicopter endon("death");
level.DynEventDam.Helicopter endon("delete");
while(true)
{
self ShootTurret();
wait(2);
}
}
SpinHeli()
{
self endon("death");
self endon("delete");
while(true)
{
self RotateYaw(360, 4);
self waittill("rotatedone");
}
}
RotateHeli(angles, time)
{
time = time * 0.75;
self RotateTo(angles, time );
}
SetupDynamicEventTurrets()
{
DynamicTurrets = [];
railgun_script_origin = GetEnt( "dynamic_railgun_attachpoint0", "targetname" );
turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
DynamicTurrets = array_add(DynamicTurrets,turret);
railgun_script_origin = GetEnt( "dynamic_railgun_attachpoint1", "targetname" );
turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
DynamicTurrets = array_add(DynamicTurrets,turret);
// railgun_script_origin = GetEnt( "railgun_attachpoint2", "targetname" );
// turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
// Turrets = array_add(Turrets,turret);
return DynamicTurrets;
}
*/
//////----------------------------------- DYNAMIC EVENT END
////////////////////////////////////////////////////////////////////////////////////////////////////
DamCustomAirstrike()
{
if(!isdefined(level.airstrikeoverrides))
{
level.airstrikeoverrides = SpawnStruct();
}
level.airstrikeoverrides.spawnHeight = 1750;
}
damCustomKillstreakFunc()
{
level.killstreakWeildWeapons["mp_dam_railgun"] = true;
level.killstreakWeildWeapons["dam_turret_mp"] = true;
level thread maps\mp\killstreaks\streak_mp_dam::init();
}
damCustomOSPFunc()
{
level.orbitalsupportoverrides.spawnOrigin = ( 1544, 1016, 200 );
level.orbitalsupportoverrides.spawnAngle = 120; // Default Random(360)
level.orbitalsupportoverrides.spawnRadius = undefined;
level.orbitalsupportoverrides.spawnHeight = undefined;
}
SetupKillstreakTurrets()
{
Turrets = [];
railgun_script_origin = GetEnt( "railgun_attachpoint0", "targetname" );
turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
Turrets = array_add(Turrets,turret);
railgun_script_origin = GetEnt( "railgun_attachpoint1", "targetname" );
turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
Turrets = array_add(Turrets,turret);
// railgun_script_origin = GetEnt( "railgun_attachpoint2", "targetname" );
// turret = railgun_script_origin SpawnDamTurret( "dam_turret_mp", "mp_dam_large_caliber_turret", "tag_player_mp" );
// Turrets = array_add(Turrets,turret);
level.DamTurrets = Turrets;
}
SpawnDamTurret( turretweaponinfo, modelname, linktotag )
{
spawned_turret = SpawnTurret( "misc_turret", self.origin, turretweaponinfo, false );
spawned_turret.attachpoint = self;
spawned_turret.angles = flat_angle(self.angles);
spawned_turret SetModel( modelname );
spawned_turret SetDefaultDropPitch( 45.0 );
spawned_turret.health = 99999;
spawned_turret.maxHealth = 1000;
spawned_turret.damageTaken = 0;
spawned_turret.stunned = false;
spawned_turret.stunnedTime = 0.0;
spawned_turret SetCanDamage( false );
spawned_turret SetCanRadiusDamage( false );
spawned_turret SetMode( "manual" );
level.DamDefaultAimEnt = GetEnt( "DamTurretDefaultTarget", "targetname" );
spawned_turret SetTargetEntity( level.DamDefaultAimEnt );
return spawned_turret;
}
#using_animtree("animated_props");
setupCraneAnimations()
{
PrecacheMpAnim("dam_crane01_idle_l");
PrecacheMpAnim("dam_crane01_idle_r");
PrecacheMpAnim("dam_crane01_l_2_r");
PrecacheMpAnim("dam_crane01_r_2_l");
PrecacheMpAnim("dam_crane02_idle_l");
PrecacheMpAnim("dam_crane02_idle_r");
PrecacheMpAnim("dam_crane02_l_2_r");
PrecacheMpAnim("dam_crane02_r_2_l");
PrecacheMpAnim("dam_crane01_tag_idle_l");
PrecacheMpAnim("dam_crane01_tag_idle_r");
PrecacheMpAnim("dam_crane01_tag_l_2_r");
PrecacheMpAnim("dam_crane01_tag_r_2_l");
PrecacheMpAnim("dam_crane02_tag_idle_l");
PrecacheMpAnim("dam_crane02_tag_idle_r");
PrecacheMpAnim("dam_crane02_tag_l_2_r");
PrecacheMpAnim("dam_crane02_tag_r_2_l");
PrecacheMpAnim("dam_crane01_collisiontest");
}
CraneCollisionTest()
{
Crane2 = getent("Crane_02", "targetname");
Crane2PipeCollision = getent( "crane2PipeCollision", "targetname" );
Crane2PipeCollision linkto(Crane2,"j_tube_01_c");
while(1)
{
Crane2 ScriptModelPlayAnimDeltaMotion( "dam_crane01_collisiontest" );
wait 20;
}
}
TempCraneIdleSetup()
{
Crane1 = getent("Crane_01", "targetname");
Crane1PipeCollision = getent( "crane1PipeCollision", "targetname" );
Crane1PipeCollision linkto(Crane1,"j_tube_01_c");
Crane2 = getent("Crane_02", "targetname");
Crane2PipeCollision = getent( "crane2PipeCollision", "targetname" );
Crane2PipeCollision linkto(Crane2,"j_tube_01_c");
Crane1 ScriptModelPlayAnimDeltaMotion( "dam_crane02_idle_l" );
Crane2 ScriptModelPlayAnimDeltaMotion( "dam_crane01_idle_l" );
}
Crane1Movement()
{
Crane1Tag = GetEnt( "Crane_01_TagProxy", "targetname");
Crane1 = getent("Crane_01", "targetname");
Crane1PipeCollision = getent( "crane1PipeCollision", "targetname" );
Crane1PipeBcsTrigger = getent( "crane_01_bcs_trigger", "targetname" );
Crane1TagBase = GetEnt( "Crane_01_TagBaseProxy", "targetname");
Crane1Collision = getent( "crane1Collision", "targetname" );
Crane1PipeCollision LinkToSynchronizedParent(Crane1Tag,"tag_origin");
Crane1PipeBcsTrigger handle_trigger_updateto( Crane1PipeCollision );
Crane1Collision.angles = Crane1Collision.angles + ( 0, -249.215, 0 );
Crane1Collision LinkToSynchronizedParent(Crane1TagBase,"tag_origin");
waittime = 20;
crane1_aud_org = ( 2181, -1069, 1407 );
thread aud_play_crane_sfx( crane1_aud_org, waittime, "crane_01" );
while(1)
{
Crane1Tag ScriptModelClearAnim();
Crane1Tag.origin = Crane1.origin;
Crane1Tag.angles = Crane1.angles;
Crane1TagBase ScriptModelClearAnim();
Crane1 ScriptModelPlayAnimDeltaMotion( "dam_crane01_l_2_r" );
Crane1Tag ScriptModelPlayAnimDeltaMotion( "dam_crane01_tag_l_2_r");
Crane1TagBase ScriptModelPlayAnimDeltaMotion( "dam_crane01_tag_base_l_2_r");
wait waittime;
Crane1Tag ScriptModelClearAnim();
Crane1Tag.origin = Crane1.origin;
Crane1Tag.angles = Crane1.angles;
Crane1TagBase ScriptModelClearAnim();
Crane1 ScriptModelPlayAnimDeltaMotion( "dam_crane01_r_2_l" );
Crane1Tag ScriptModelPlayAnimDeltaMotion( "dam_crane01_tag_r_2_l");
Crane1TagBase ScriptModelPlayAnimDeltaMotion( "dam_crane01_tag_base_r_2_l");
wait waittime;
}
}
Crane2Movement()
{
Crane2Tag = GetEnt( "Crane_02_TagProxy", "targetname");
Crane2 = getent("Crane_02", "targetname");
Crane2PipeCollision = getent( "crane2PipeCollision", "targetname" );
Crane2PipeBcsTrigger = getent( "crane_02_bcs_trigger", "targetname" );
Crane2TagBase = GetEnt( "Crane_02_TagBaseProxy", "targetname");
Crane2Collision = getent( "crane2Collision", "targetname" ); //TODO: link this to anims once colin checks them in
waittime = 20;
crane2_aud_org = ( 849, 2315, 1455 );
thread aud_play_crane_sfx( crane2_aud_org, waittime, "crane_02" );
Crane2PipeCollision LinkToSynchronizedParent(Crane2Tag,"tag_origin");
Crane2PipeBcsTrigger handle_trigger_updateto( Crane2PipeCollision );
Crane2Collision.angles = Crane2Collision.angles + ( 0, -117.312, 0 );
Crane2Collision LinkToSynchronizedParent(Crane2TagBase,"tag_origin");
while(1)
{
Crane2Tag ScriptModelClearAnim();
Crane2Tag.origin = Crane2.origin;
Crane2Tag.angles = Crane2.angles;
Crane2TagBase ScriptModelClearAnim();
Crane2 ScriptModelPlayAnimDeltaMotion( "dam_crane02_l_2_r" );
Crane2Tag ScriptModelPlayAnimDeltaMotion( "dam_crane02_tag_l_2_r");
Crane2TagBase ScriptModelPlayAnimDeltaMotion( "dam_crane02_tag_base_l_2_r");
wait waittime;
Crane2Tag ScriptModelClearAnim();
Crane2Tag.origin = Crane2.origin;
Crane2Tag.angles = Crane2.angles;
Crane2TagBase ScriptModelClearAnim();
Crane2 ScriptModelPlayAnimDeltaMotion( "dam_crane02_r_2_l" );
Crane2Tag ScriptModelPlayAnimDeltaMotion( "dam_crane02_tag_r_2_l");
Crane2TagBase ScriptModelPlayAnimDeltaMotion( "dam_crane02_tag_base_r_2_l");
wait waittime;
}
}
handle_trigger_updateto( parent )
{
assertex( isDefined( parent ), "must have a parent entity to know where the water trigger should be" );
level endon( "game_ended" );
parent_offset = self.origin - parent.origin;
parent_offset_angles = self.angles - parent.angles;
self childthread MoveTrig( parent, parent_offset, parent_offset_angles );
}
MoveTrig( parent, offset, offset_angles )
{
while( true )
{
self.origin = (parent.origin + offset);
self.angles = (parent.angles - offset_angles );
wait( .05 );
}
}
aud_play_crane_sfx( org, waittime, crane_inst )
{
crane_motor_pos = org;
crane_ent = spawn( "script_origin", crane_motor_pos );
}
rotateGenerators()
{
fans = getentarray( "generator_fan", "targetname" );
foreach( fan in fans )
{
fan thread rotateFan();
}
}
rotateFan()
{
if ( !IsDefined( level.genrotatespeed ) )
{
level.genrotatespeed = -180;
}
previousgenrotatespeed = 0;
while( 1 )
{
//self rotateto( ( self.angles[0], self.angles[1] + 180, self.angles[2] ), level.genrotatetime );
if( previousgenrotatespeed != level.genrotatespeed )
{
self RotateVelocity( ( 0, level.genrotatespeed, 0 ), 3600 ); // rotate for 1h until told otherwise
previousgenrotatespeed = level.genrotatespeed;
}
wait 0.5; // check every 0.5 second if the genrotatespeed has been changed
}
}
/*
=============
///ScriptDocBegin
"Name: rotateCrane()"
"Summary: rotates a crane in mp_dam"
"Module: Entity"
"CallOn: level"
"Example: level.crane1 thread rotateCrane();
"SPMP: MP"
///ScriptDocEnd
=============
*/
rotateCrane()
{
level endon( "game_ended" );
while ( 1 )
{
//Swings back...
self.cab RotateTo( ( 0, GetDvarInt( self.end_angle_dvar, 180 ) , 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.platform RotateTo( ( 0, GetDvarInt( self.end_angle_dvar, 180 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.pipe RotateTo( ( 0, GetDvarInt( self.end_angle_dvar, 180 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.pulley RotateTo( ( 0, GetDvarInt( self.end_angle_dvar, 180 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.hook RotateTo( ( 0, GetDvarInt( self.end_angle_dvar, 180 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.heightOscillator MoveTo( (0, 0, GetDvarInt( self.pipe_end_height_dvar, 0 ) ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.radiusOscillator MoveTo( (0, 0, GetDvarInt( self.pipe_end_radius_dvar, 0 ) ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
wait( GetDvarInt( self.time_dvar, 10 ) + 5 );
//Swings forth...
self.cab RotateTo( ( 0, GetDvarInt( self.start_angle_dvar, 130 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.platform RotateTo( ( 0, GetDvarInt( self.start_angle_dvar, 130 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.pipe RotateTo( ( 0, GetDvarInt( self.start_angle_dvar, 130 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.pulley RotateTo( ( 0, GetDvarInt( self.start_angle_dvar, 130 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.hook RotateTo( ( 0, GetDvarInt( self.start_angle_dvar, 130 ), 0 ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.heightOscillator MoveTo( (0, 0, GetDvarInt( self.pipe_start_height_dvar, 0 ) ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
self.radiusOscillator MoveTo( (0, 0, GetDvarInt( self.pipe_start_radius_dvar, 0 ) ), GetDvarInt( self.time_dvar, 10 ), 1, 1 );
wait( GetDvarInt( self.time_dvar, 10 ) + 5 );
}
}
/*
=============
///ScriptDocBegin
"Name: moveCranePipe()"
"Summary: moves the crane pipe to match the rotation of crane cab and platform."
"Module: Entity"
"CallOn: a crane struct that contains a 'pipe' script_brushmodel"
"Example: level.crane1 thread moveCranePipe();"
"SPMP: MP"
///ScriptDocEnd
=============
*/
moveCranePipe()
{
level endon( "game_ended" );
while ( 1 )
{
temp_origin_vec = ( Cos( self.platform.angles[1] + 90 ) * self.radiusoscillator.origin[2] + self.cab.origin[0], Sin( self.platform.angles[1] + 90 ) * self.radiusoscillator.origin[2] + self.cab.origin[1], self.heightOscillator.origin[2] );
// level.crane1pipe.origin = temp_origin_vec;
self.pipe MoveTo( temp_origin_vec, 0.05, 0.025, 0.025 );
//Do not move the pulley on the z-axis. The crane does not tilt up and down.
self.pulley MoveTo( ( temp_origin_vec[0], temp_origin_vec[1], self.pulley.origin[2] ), 0.05, 0.025, 0.025 );
self.hook MoveTo( temp_origin_vec + ( 0, 0, 270 ), 0.05, 0.025, 0.025 );
wait( 0.05 );
}
}
/*
=============
///ScriptDocBegin
"Name: handlePowerSurge()"
"Summary: starts VFX, sound and other events associated with the mp_dam power surge"
"Module: Entity"
"CallOn: An entity"
"Example: thread handlePowerSurge()"
"SPMP: MP"
///ScriptDocEnd
=============
*/
handlePowerSurge()
{
while ( true )
{
//The gap in time between surges.
wait( GetDvarInt( "mp_dam_surge_interval", 50 ) );
//Start harmless sparks without damage. This is a warning for players to run!
//Play spark vfx on spark tag origins.
foreach( sparktag in level.spark_origin_tags )
{
PlayFXOnTag( level.mp_dam_fx[ "dam_surge_sparks" ], sparktag, "tag_origin" );
}
foreach( pasystemtag in level.surge_vo_origin_tags )
{
pasystemtag thread play_sound_on_tag( level.pa_warning0, "tag_origin" );
}
//Wait another 5 seconds before triggering electric arcs and damage.
wait( GetDvarInt( "mp_dam_surge_delay", 7 ) );
level.power_surge_active = true;
//Double the rotation speed of the generators.
level.genrotatespeed = level.genrotatespeed * 2;
//Play electric arc vfx on spark tag origins.
foreach( sparktag in level.spark_origin_tags )
{
PlayFXOnTag( level.mp_dam_fx[ "dam_surge_arcs" ], sparktag, "tag_origin" );
}
foreach( smoketag in level.smoke_origin_tags )
{
// PlayFXOnTag( level.mp_dam_fx[ "dam_surge_smoke" ], smoketag, "tag_origin" );
//Start SFX associated with the faster fan rotation.
// smoketag thread play_loop_sound_on_entity( level.surge_fan_noise );
}
foreach( sparksfxtag in level.elec_sparks_origin_tags )
{
sparksfxtag thread play_loop_sound_on_entity( level.surge_sparks_noise );
}
foreach( pasystemtag in level.surge_vo_origin_tags )
{
pasystemtag thread play_sound_on_tag( level.pa_warning1, "tag_origin" );
}
wait( GetDvarInt( "mp_dam_surge_duration", 30 ) );
level.power_surge_active = false;
//Reset generator rotation speed.
level.genrotatespeed = level.genrotatespeed / 2;
//Stop spark vfx on spark tag origins.
foreach( sparktag in level.spark_origin_tags )
{
StopFXOnTag( level.mp_dam_fx[ "dam_surge_sparks" ], sparktag, "tag_origin" );
StopFXOnTag( level.mp_dam_fx[ "dam_surge_arcs" ], sparktag, "tag_origin" );
}
foreach( smoketag in level.smoke_origin_tags )
{
// StopFXOnTag( level.mp_dam_fx[ "dam_surge_smoke" ], smoketag, "tag_origin" );
//Stop SFX associated with the faster fan rotation.
// smoketag thread stop_loop_sound_on_entity( level.surge_fan_noise );
}
foreach( sparksfxtag in level.elec_sparks_origin_tags )
{
sparksfxtag thread stop_loop_sound_on_entity( level.surge_sparks_noise );
}
wait( 0.05 );
}
}
/*
=============
///ScriptDocBegin
"Name: handlePowerSurgeDamage()"
"Summary: checks whether the power surge is currently underway. If yes, damages players touching surge triggers."
"Module: Entity"
"CallOn: An entity"
"Example: thread handlePowerSurgeDamage()"
"SPMP: MP"
///ScriptDocEnd
=============
*/
handlePowerSurgeDamage()
{
while ( true )
{
if ( level.power_surge_active == true )
{
foreach( player in level.players )
{
foreach( trigmult in level.dam_surge_triggers )
{
if ( player IsTouching( trigmult ) )
{
player PlayRumbleOnEntity( "damage_heavy" );
player shellshock( "orbital_laser_mp", 1 ); //TODO: add a solar reflector .shock file if we ultimately want to keep that effect.
player DoDamage( 5, player.origin );
}
}
}
}
wait( 0.05 );
}
}
handle_glass_pathing()
{
skylights = GetGlassArray( "skylights" );
skylight_ents = GetEntArray( "skylights", "targetname" );
pathnode_orgs = GetEntArray( "glass_pathing", "targetname" );
if( !isDefined( skylight_ents ) )
return false;
threashold = 8;
//build glass array
foreach( skylight in skylights )
{
origin = GetGlassOrigin( skylight );
foreach( skylight_ent in skylight_ents )
{
if( distance( origin, skylight_ent.origin ) <= threashold )
{
skylight_ent.glass_id = skylight;
break;
}
}
}
array_thread( skylight_ents, ::handle_pathing_on_glass );
}
handle_pathing_on_glass()
{
level endon( "game_ended" );
pathing_blocker = GetEnt( self.target, "targetname" );
if( !isDefined( pathing_blocker ) )
return false;
pathing_blocker trigger_off();
pathing_blocker ConnectPaths();
waittill_glass_break( self.glass_id );
pathing_blocker trigger_on();
pathing_blocker DisconnectPaths();
pathing_blocker trigger_off();
}
waittill_glass_break( skylight )
{
level endon( "game_ended" );
while( true )
{
if( IsGlassDestroyed( skylight ) )
return true;
wait( .05 );
}
}