aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut2
-rw-r--r--Northstar.CustomServers/mod.json9
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut69
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut2
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut18
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut8
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut2
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut226
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut8
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut93
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut38
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut47
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut1262
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut1305
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut270
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/item_inventory/sv_item_inventory.gnut4
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city.nut6
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal.nut5
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut6
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut9
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai.nut6
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut602
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut9
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut5
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut11
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut567
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut7
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut8
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise_fd.nut616
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut7
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut5
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut24
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut6
41 files changed, 5419 insertions, 35 deletions
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
index 32a3c8f5..4a2cf64a 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
@@ -54,6 +54,8 @@ void function UpdateVisibleModes()
if ( !ModeSettings_RequiresAI( modesArray[ modeIndex ] ) || modesArray[ modeIndex ] == "aitdm" )
Hud_SetLocked( buttons[ i ], false )
+ else if( IsFDMode( modesArray[ i ] ) )
+ Hud_SetLocked( buttons[ i ], false )
else
Hud_SetLocked( buttons[ i ], true )
diff --git a/Northstar.CustomServers/mod.json b/Northstar.CustomServers/mod.json
index 14e1ff63..dba29bc5 100644
--- a/Northstar.CustomServers/mod.json
+++ b/Northstar.CustomServers/mod.json
@@ -149,6 +149,15 @@
"ServerCallback": {
"Before": "RespawnProtection_Init"
}
+ },
+
+ {
+ "Path": "gamemodes/_gamemode_fd_events.nut",
+ "RunOn": "( SERVER ) && MP"
+ },
+ {
+ "Path": "gamemodes/_gamemode_fd_nav.nut",
+ "RunOn": "( SERVER ) && MP"
}
]
}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut
index 37b89169..6b0fb7e4 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut
@@ -1 +1,68 @@
-//fuck \ No newline at end of file
+global function SpawnHarvester
+global function generateBeamFX
+global function generateShieldFX
+
+global struct HarvesterStruct {
+ entity harvester
+ entity particleBeam
+ entity particleShield
+ entity rings
+ float lastDamage
+ bool shieldBoost
+
+}
+
+HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,int shieldHealth,int team)
+{
+ entity harvester = CreateEntity( "prop_script" )
+ harvester.SetValueForModelKey( $"models/props/generator_coop/generator_coop.mdl" )
+ harvester.SetOrigin( origin )
+ harvester.SetAngles( angles )
+ harvester.kv.solid = SOLID_VPHYSICS
+
+ harvester.SetMaxHealth(health)
+ harvester.SetHealth(health)
+ harvester.SetShieldHealthMax(shieldHealth)
+ harvester.SetShieldHealth(shieldHealth)
+ harvester.EnableAttackableByAI( 30, 0, AI_AP_FLAG_NONE )
+ //harvester.SetIsValidAIMeleeTarget(false)
+ SetTeam(harvester,team)
+ DispatchSpawn( harvester )
+
+ SetGlobalNetEnt("FD_activeHarvester",harvester)
+
+ entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,origin,angles,0)
+ blackbox.Hide()
+ blackbox.Solid()
+ // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER
+ ToggleNPCPathsForEntity( blackbox, false )
+
+ entity rings = CreatePropDynamic(MODEL_HARVESTER_TOWER_RINGS,origin,angles,6)
+ thread PlayAnim( rings, "generator_cycle_fast" )
+
+
+
+ HarvesterStruct ret
+ ret.harvester = harvester
+ ret.lastDamage = Time()
+ ret.rings = rings
+
+ return ret
+}
+
+HarvesterStruct function generateBeamFX(HarvesterStruct harvester)
+{
+ entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0)
+ EffectSetControlPointVector( Harvester_Beam, 1, GetShieldTriLerpColor(0.0) )
+ harvester.particleBeam = Harvester_Beam
+ Harvester_Beam.DisableHibernation()
+ return harvester
+}
+
+HarvesterStruct function generateShieldFX(HarvesterStruct harvester)
+{
+ entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0)
+ EffectSetControlPointVector( Harvester_Shield, 1, GetShieldTriLerpColor(0.0) )
+ harvester.particleShield = Harvester_Shield
+ return harvester
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut
index e3addf81..a71b71f1 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut
@@ -219,7 +219,7 @@ void function CloakedDronePathThink( entity cloakedDrone )
continue
//Don't cloak arc titans
- if ( guy.GetTargetName() == "empTitan" )
+ if ( IsEMPTitan( guy ) )
continue
if ( IsSniperSpectre( guy ) )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut
index 638166c8..8fde4343 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut
@@ -3,6 +3,7 @@ untyped
global function EmpTitans_Init
global function EMPTitanThinkConstant
+global function IsEMPTitan
const DAMAGE_AGAINST_TITANS = 150
const DAMAGE_AGAINST_PILOTS = 40
@@ -11,6 +12,11 @@ const EMP_DAMAGE_TICK_RATE = 0.3
const FX_EMP_FIELD = $"P_xo_emp_field"
const FX_EMP_FIELD_1P = $"P_body_emp_1P"
+struct
+{
+ array<entity> empTitans
+} file
+
function EmpTitans_Init()
{
AddDamageCallbackSourceID( eDamageSourceId.titanEmpField, EmpField_DamagedEntity )
@@ -31,7 +37,8 @@ void function EMPTitanThinkConstant( entity titan )
DisableTitanRodeo( titan )
//Used to identify this titan as an arc titan
- SetTargetName( titan, "empTitan" )
+ // SetTargetName( titan, "empTitan" ) // unable to do this due to FD reasons
+ file.empTitans.append(titan)
//Wait for titan to stand up and exit bubble shield before deploying arc ability.
WaitTillHotDropComplete( titan )
@@ -88,6 +95,8 @@ void function EMPTitanThinkConstant( entity titan )
{
StopSoundOnEntity( titan, "EMP_Titan_Electrical_Field" )
EnableTitanRodeo( titan ) //Make the arc titan rodeoable now that it is no longer electrified.
+ if (file.empTitans.find(titan))
+ file.empTitans.remove(file.empTitans.find(titan))
}
foreach ( particleSystem in particles )
@@ -178,4 +187,9 @@ void function EmpField_DamagedEntity( entity target, var damageInfo )
string function GetEMPAttachmentForTitan( entity titan )
{
return "hijack"
-} \ No newline at end of file
+}
+
+bool function IsEMPTitan(entity titan)
+{
+ return file.empTitans.find(titan) != -1 ? true : false
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut
index 08598808..fe46aac5 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut
@@ -100,14 +100,14 @@ void function MortarMissileThink( entity missile, entity weaponOwner )
{
float frac = min( 1, pow( ( Time() - startTime ) / estTravelTime, 2.0 ) )
- if ( frac > 1.0 )
- break
+ if ( frac > 1.0 )
+ break
float homingSpeed = GraphCapped( frac, 0, 1, homingSpeedMin, homingSpeedMax )
- missile.SetHomingSpeeds( homingSpeed, 0 )
+ missile.SetHomingSpeeds( homingSpeed, 0 )
- wait 0.25
+ wait 0.25
}
missile.ClearMissileTargetPosition()
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut
index 0d4b43c9..2626abe1 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut
@@ -58,7 +58,7 @@ void function NukeTitanSeekOutGenerator( entity titan, entity generator )
{
titan.SetEnemy( generator )
thread AssaultOrigin( titan, validPos[0], goalRadius )
- titan.AssaultSetFightRadius( goalRadius )
+ titan.AssaultSetFightRadius( 0 ) // dont want to set a fight radius because then the nuke titan will stop and shoot
wait 0.5
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut
index 37b89169..71499431 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut
@@ -1 +1,225 @@
-//fuck \ No newline at end of file
+untyped
+
+global function MoveToSniperPosition
+global function SniperTitanThink
+
+const float SNIPER_TITAN_POSITION_SEARCH_RANGE = 4120
+
+
+
+void function MoveToSniperPosition( entity titan, vector origin, entity target )
+{
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+ target.EndSignal( "OnDeath" )
+ target.EndSignal( "OnDestroy" )
+
+ titan.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT )
+
+ float goalRadius = titan.GetMinGoalRadius()
+
+ OnThreadEnd(
+ function() : ( titan )
+ {
+ if ( !IsValid( titan ) )
+ return
+
+ local classname = titan.GetClassName()
+ titan.DisableNPCMoveFlag( NPCMF_PREFER_SPRINT )
+ }
+ )
+
+ local tries = 0
+ while( true )
+ {
+ local dist = Distance( titan.GetOrigin(), origin )
+ if ( dist <= goalRadius * 2 )
+ break
+
+ printt( "Sniper titan moving toward his goal", dist, tries++ )
+ titan.AssaultPoint( origin )
+ titan.AssaultSetGoalRadius( goalRadius )
+ titan.AssaultSetFightRadius( 0 )
+ local result = WaitSignal( titan, "OnFinishedAssault", "OnEnterGoalRadius" )
+ printt( "Sniper titan done moving into position")
+ }
+}
+
+void function SniperTitanThink( entity titan, entity generator)
+{
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+ generator.EndSignal( "OnDeath" )
+ generator.EndSignal( "OnDestroy" )
+
+ entity soul = titan.GetTitanSoul()
+ soul.EndSignal( "OnDestroy" )
+
+ titan.SetScriptName( "sniper_titan" )
+
+ WaitTillHotDropComplete( titan )
+
+ float minEngagementDuration = 5
+ StationaryAIPosition ornull sniperPosition = GetRandomStationaryPosition( titan.GetOrigin(), SNIPER_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.SNIPER_TITAN )
+ while ( sniperPosition == null )
+ {
+ // incase all stationary titan positions are in use wait for one to become available
+ wait 5
+ sniperPosition = GetRandomStationaryPosition( titan.GetOrigin(), SNIPER_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.SNIPER_TITAN )
+ }
+
+ expect StationaryAIPosition( sniperPosition )
+
+ ClaimStationaryAIPosition( sniperPosition )
+
+ OnThreadEnd(
+ function() : ( sniperPosition )
+ {
+ // release sniper position when dead
+ ReleaseStationaryAIPosition( sniperPosition )
+ }
+ )
+ titan.SetEnemyChangeCallback( EnemyChanged)
+ thread CheckEnemy( titan ,generator)
+ while( true )
+ {
+ WaitFrame()
+ vector origin = sniperPosition.origin
+ waitthread MoveToSniperPosition( titan, origin, generator )
+
+ thread SniperTitanAttack( titan, generator )
+
+ waitthread WaitForInterruption( titan ,generator)
+ }
+}
+// check if titan can see enemy
+void function CheckEnemy(entity titan,entity generator)
+{
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+ generator.EndSignal( "OnDeath" )
+ generator.EndSignal( "OnDestroy" )
+
+ while (IsValid(titan))
+ {
+ wait 1
+ if (!IsValid(titan.GetEnemy()))
+ continue
+
+ if (!titan.CanSee(titan.GetEnemy()) && titan.GetEnemy() == generator)
+ {
+ waitthread CreateSniperTarget( titan , generator)
+ wait 1 // wait for 1 second so the signal doesn't get called too soon
+ table result = WaitSignal( titan, "SniperSwitchedEnemy" )
+ }
+ }
+}
+
+void function CreateSniperTarget(entity titan,entity generator)
+{
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+ generator.EndSignal( "OnDeath" )
+ generator.EndSignal( "OnDestroy" )
+
+ vector origin = titan.EyePosition()
+ TraceResults result = TraceLine( origin, generator.GetOrigin() + <0, 0, 250>, titan , TRACE_MASK_BLOCKLOS, TRACE_COLLISION_GROUP_NONE )
+ // check if the endPos is too near the titan
+ while (Distance(result.endPos, origin) < 200 || Distance(result.endPos, generator.GetOrigin()) < 200)
+ {
+ wait 2.0
+ origin = titan.EyePosition()
+ result = TraceLine( origin, generator.GetOrigin() + <0, 0, 250>, titan )
+ }
+ entity snipertarget = CreateEntity( "info_target" )
+ DispatchSpawn( snipertarget )
+ snipertarget.SetOrigin( result.endPos ) // in front of the harvester i hope
+ SetTeam( snipertarget, TEAM_MILITIA )
+ snipertarget.EnableAttackableByAI( 40, 0, AI_AP_FLAG_NONE )
+ titan.SetEnemy( snipertarget )
+ wait 1 // wait for 1 second so the signal doesn't get called too soon
+ titan.WaitSignal( "SniperSwitchedEnemy" )
+
+ OnThreadEnd(
+ function() : ( snipertarget )
+ {
+ if ( !IsValid( snipertarget ) )
+ return
+
+ snipertarget.Destroy()
+ }
+ )
+}
+
+void function EnemyChanged( entity titan)
+{
+ titan.Signal( "SniperSwitchedEnemy" )
+ entity enemy = titan.GetEnemy()
+ if ( !IsValid( enemy ) ) // if you have no enemy, focus on attacking the harvester
+ {
+ thread SniperTitanAttack( titan, fd_harvester.harvester)
+ enemy = fd_harvester.harvester
+ }
+}
+
+function SniperTitanAttack( entity titan, entity target )
+{
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+
+ OnThreadEnd(
+ function() : ( titan )
+ {
+ if ( !IsValid( titan ) )
+ return
+ }
+ )
+ titan.SetEnemy( target )
+}
+
+void function WaitForInterruption( entity titan ,entity generator)
+{
+ Assert( IsNewThread(), "Must be threaded off" )
+
+ titan.EndSignal( "OnSyncedMeleeVictim" )
+ titan.EndSignal( "OnDeath" )
+ titan.EndSignal( "OnDestroy" )
+ generator.EndSignal( "OnDeath" )
+ generator.EndSignal( "OnDestroy" )
+
+ entity soul = titan.GetTitanSoul()
+ soul.EndSignal( "OnDestroy" )
+
+ float playerProximityDistSqr = pow( 256, 2 )
+ float healthBreakOff = ( titan.GetHealth() + soul.GetShieldHealth() ) * 0.9
+
+ while( true )
+ {
+ if ( IsEnemyWithinDist( titan, playerProximityDistSqr ) )
+ break
+ if ( ( titan.GetHealth() + soul.GetShieldHealth() ) < healthBreakOff )
+ break
+ wait 1
+ }
+
+ titan.ClearEnemy()
+}
+
+bool function IsEnemyWithinDist( entity titan, float dist )
+{
+ vector origin = titan.GetOrigin()
+ array<entity> players = GetPlayerArrayOfEnemies_Alive( titan.GetTeam() )
+
+ foreach( player in players )
+ {
+ if ( DistanceSqr( player.GetOrigin(), origin ) < dist )
+ return true
+ }
+
+ return false
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut
index 7e4d2cdd..26ddf3ca 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut
@@ -26,6 +26,7 @@ global function CreateRocketDroneGrunt
global function CreateShieldDrone
global function CreateShieldDroneGrunt
global function CreateSoldier
+global function CreateShieldCaptain
global function CreateSpectre
global function CreateStalker
global function CreateStryder
@@ -223,7 +224,7 @@ entity function CreateOgre( int team, vector origin, vector angles, array<string
entity function CreateArcTitan( int team, vector origin, vector angles, array<string> settingsMods = [] )
{
entity npc = CreateNPCTitan( "titan_stryder", team, origin, angles, settingsMods )
- SetSpawnOption_AISettings( npc, "npc_titan_arc" )
+ SetSpawnOption_AISettings( npc, "npc_titan_stryder_leadwall_arc" )
return npc
}
@@ -276,6 +277,11 @@ entity function CreateSoldier( int team, vector origin, vector angles )
return CreateNPC( "npc_soldier", team, origin, angles )
}
+entity function CreateShieldCaptain( int team, vector origin, vector angles )
+{
+ return CreateNPCFromAISettings( "npc_soldier_shield_captain", team, origin, angles ) // idek
+}
+
entity function CreateProwler( int team, vector origin, vector angles )
{
return CreateNPC( "npc_prowler", team, origin, angles )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut
index f49560e0..0b4d6a9a 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut
@@ -1,7 +1,9 @@
+untyped
global function AiStalker_Init
global function GetDeathForce
global function StalkerGearOverloads
global function StalkerMeltingDown
+global function FDStalkerThink
global function IsStalkerLimbBlownOff
@@ -157,6 +159,95 @@ void function StalkerOnDamaged_Internal( entity npc, var damageInfo )
npc.SetActivityModifier( ACT_MODIFIER_STAGGER, true )
}
}
+ if( GameRules_GetGameMode() == FD )
+ thread StalkerSprint( npc, damageInfo )
+}
+
+void function StalkerSprint( entity npc, var damageInfo )
+{
+ npc.EndSignal("OnDeath")
+ npc.EndSignal("OnDestroy")
+ float damage = DamageInfo_GetDamage( damageInfo )
+
+ if (!IsCrawling(npc)&&( npc.GetHealth() - damage < 50 || npc.GetHealth() <= 80))
+ {
+ entity weapon = npc.GetActiveWeapon()
+ if (IsValid(weapon))
+ npc.TakeActiveWeapon() // when stalkers fall over on harvester they will randomly shoot their guns, we don't want that.
+ npc.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT )
+ npc.SetCapabilityFlag( bits_CAP_MOVE_SHOOT | bits_CAP_WEAPON_RANGE_ATTACK1 | bits_CAP_AIM_GUN, false )
+ npc.SetNPCFlag( NPC_IGNORE_ALL, true )
+ npc.SetNPCFlag( NPC_DISABLE_SENSING, true )
+ npc.SetNoTarget( true )
+ npc.ClearMoveAnim()
+ npc.SetMoveAnim("sp_spectre_sprint_F")
+ npc.s.isSprinting = true
+ }
+}
+
+void function FDStalkerThink( entity npc, entity generator )
+{
+ npc.EndSignal( "OnDeath" )
+ npc.EndSignal( "OnDestroy" )
+ generator.EndSignal( "OnDeath" )
+ generator.EndSignal( "OnDestroy" )
+ npc.s.isSprinting <- false
+ thread FDStalkerGetsStunned( npc , generator )
+ while ( IsAlive( npc ) )
+ {
+ WaitFrame()
+
+ // cant sprint with 1 leg
+ // also upped to 1800 so that stalkers sprint from roughly their vanilla positions, could probably do it based on % of distance left to go?
+ if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (1800 * 1800) )
+ {
+ if(!IsCrawling( npc ) && !npc.s.isSprinting)
+ {
+ entity weapon = npc.GetActiveWeapon()
+ if (IsValid(weapon))
+ npc.TakeActiveWeapon() // when stalkers fall over on harvester they will randomly shoot their guns, we don't want that.
+ npc.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT )
+ npc.SetCapabilityFlag( bits_CAP_MOVE_SHOOT | bits_CAP_WEAPON_RANGE_ATTACK1 | bits_CAP_AIM_GUN, false )
+ npc.EnableNPCFlag( NPC_DISABLE_SENSING | NPC_IGNORE_ALL )
+ npc.ClearMoveAnim()
+ npc.SetMoveAnim("sp_spectre_sprint_F")
+ npc.SetNoTarget( true )
+ // stalkers were just going to the final node and stopping, meaning they never actually reached the harvester
+ npc.s.isSprinting = true
+ }
+ npc.AssaultPoint(generator.GetOrigin())
+ }
+
+ // upped from 230 to more accurately mimic vanilla i think?
+ if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > (275 * 275) )
+ continue
+
+ break
+ }
+
+ thread StalkerGearOverloads( npc )
+}
+
+void function FDStalkerGetsStunned( entity npc , entity generator )
+{
+ npc.EndSignal( "OnDeath" )
+ npc.EndSignal( "OnDestroy" )
+ npc.WaitSignal( "ArcStunned" )
+ print("arc trapped...")
+
+ if(IsCrawling(npc))
+ return
+
+ entity weapon = npc.GetActiveWeapon()
+ if (IsValid(weapon))
+ npc.TakeActiveWeapon() // when stalkers fall over on harvester they will randomly shoot their guns, we don't want that.
+ npc.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT )
+ npc.SetCapabilityFlag( bits_CAP_MOVE_SHOOT | bits_CAP_WEAPON_RANGE_ATTACK1 | bits_CAP_AIM_GUN, false )
+ npc.EnableNPCFlag( NPC_DISABLE_SENSING | NPC_IGNORE_ALL )
+ npc.ClearMoveAnim()
+ npc.SetMoveAnim("sp_spectre_sprint_F")
+ npc.SetNoTarget( true ) // stop keeping track of any player and instead go for the harvester
+ npc.s.isSprinting = true
}
bool function TryDismemberStalker( entity npc, var damageInfo, entity attacker, int hitGroup )
@@ -603,4 +694,4 @@ vector function GetDeathForce()
vector angles = <RandomFloatRange(-45,-75),RandomFloat(360),0>
vector forward = AnglesToForward( angles )
return forward * RandomFloatRange( 0.25, 0.75 )
-} \ No newline at end of file
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut
index 50b6cc75..2e7c938e 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut
@@ -5,6 +5,7 @@ global function GetRandomStationaryPosition
global function GetClosestAvailableStationaryPosition
global function ClaimStationaryAIPosition
global function ReleaseStationaryAIPosition
+global function DebugDrawStationaryAiPositions
global enum eStationaryAIPositionTypes
{
@@ -258,4 +259,39 @@ int function DistanceCompareClosestForStationaryAIPosition( ArrayDistanceEntryFo
return -1
return 0;
-} \ No newline at end of file
+}
+
+
+void function DebugDrawStationaryAiPositions(int typeMask){
+ thread DebugDrawStationaryAiPositions_thread(typeMask)
+}
+
+
+void function DebugDrawStationaryAiPositions_thread(int typeMask)
+{ while(true)
+ {
+ for(int i = 0;i<4;i++){
+ if((1<<i)&typeMask)
+ foreach(StationaryAIPosition a in file.stationaryPositions[i])
+ {
+ switch(i){
+ case 0:
+ DebugDrawSphere(a.origin,50,255,255,0,false,0.2)
+ case 1:
+ DebugDrawSphere(a.origin,50,0,255,255,false,0.2)
+ case 2:
+ DebugDrawSphere(a.origin,50,0,0,255,false,0.2)
+ case 3:
+ DebugDrawSphere(a.origin,50,255,0,255,false,0.2)
+ }
+ if(a.inUse){
+ DebugDrawSphere(a.origin,40,255,0,0,false,0.2)
+ }else{
+ DebugDrawSphere(a.origin,40,0,255,0,false,0.2)
+ }
+ }
+ }
+ wait 0.1
+ }
+
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut
index 73813385..9d3aabbc 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut
@@ -1,7 +1,10 @@
+untyped
global function AiTurret_Init
global function GetMegaTurretLinkedToPanel
global function MegaTurretUsabilityFunc
global function SetUsePromptForPanel
+global function RevivableTurret_DamageCallback
+global function RevivableTurret_Revive
void function AiTurret_Init()
{
@@ -21,4 +24,48 @@ string function MegaTurretUsabilityFunc( var turret, var panel )
void function SetUsePromptForPanel( var panel, var turret )
{
+}
+
+void function RevivableTurret_DamageCallback(entity turret,var damageInfo)
+{
+ if(turret.GetHealth()<DamageInfo_GetDamage(damageInfo))
+ {
+ turret.SetHealth(1)
+ turret.SetUsable()
+ turret.SetUsableByGroup("pilot")
+ turret.SetUsePrompts("#TURRET_WAKEUP_HOLD_USE","#TURRET_WAKEUP_PRESS_USE")
+ turret.useFunction = RevivableTurret_UseFunction
+ thread RevivableTurret_Kill(turret)
+ DamageInfo_SetDamage(damageInfo,0.0)
+ }
+}
+
+function RevivableTurret_UseFunction(player,turret)
+{
+ entity tur = expect entity(turret)
+ thread RevivableTurret_Revive(tur)
+ return true
+}
+
+
+void function RevivableTurret_Revive(entity turret)
+{
+ turret.SetHealth(turret.GetMaxHealth())
+ turret.ClearInvulnerable()
+ turret.Anim_ScriptedPlay( "deploy" )
+ wait 1.0
+ turret.EnableTurret()
+ turret.DisableNPCFlag( NPC_IGNORE_ALL )
+ turret.SetNoTarget( false )
+}
+
+void function RevivableTurret_Kill(entity turret)
+{
+ turret.EnableNPCFlag( NPC_IGNORE_ALL )
+ turret.SetNoTarget( true )
+ turret.SetInvulnerable()
+ turret.Anim_ScriptedPlay( "undeploy" )
+ wait 1
+ turret.SetNoTarget( true )
+ turret.DisableTurret()
} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
index 8a6b8bf0..068a41f0 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
@@ -1,12 +1,1270 @@
global function GamemodeFD_Init
global function RateSpawnpoints_FD
+global function startHarvester
+global function GetTargetNameForID
+
+global function DisableTitanSelection
+global function DisableTitanSelectionForPlayer
+global function EnableTitanSelection
+global function EnableTitanSelectionForPlayer
+
+struct player_struct_fd{
+ bool diedThisRound
+ int scoreThisRound
+ int totalMVPs
+ int mortarUnitsKilled
+ int moneySpend
+ int coresUsed
+ float longestTitanLife //not implemented yet
+ int turretsRepaired //not implemented yet
+ int moneyShared
+ float timeNearHarvester //dont know how to track
+ float longestLife
+ int heals //dont know what to track
+ int titanKills
+ float damageDealt
+ int harvesterHeals
+ float lastRespawn
+}
+
+global HarvesterStruct& fd_harvester
+global vector shopPosition
+global vector shopAngles = <0,0,0>
+global table<string,array<vector> > routes
+global array<entity> routeNodes
+global array<entity> spawnedNPCs
+
+
+
+
+struct {
+ array<entity> aiSpawnpoints
+ array<entity> smokePoints
+ array<float> harvesterDamageSource
+ bool havesterWasDamaged
+ bool harvesterShieldDown
+ float harvesterDamageTaken
+ table<entity,player_struct_fd> players
+ entity harvester_info
+}file
void function GamemodeFD_Init()
{
PrecacheModel( MODEL_ATTRITION_BANK )
+ PrecacheModel( $"models/humans/grunts/imc_grunt_shield_captain.mdl" )
+ PrecacheParticleSystem($"P_smokescreen_FD")
+
+ RegisterSignal( "SniperSwitchedEnemy" ) // for use in SniperTitanThink behavior.
+ RegisterSignal("FD_ReachedHarvester")
+ RegisterSignal("OnFailedToPath")
+
+ SetRoundBased(true)
+ SetShouldUseRoundWinningKillReplay(false)
+ Riff_ForceBoostAvailability( eBoostAvailability.Disabled )
+ PlayerEarnMeter_SetEnabled(false)
+ SetShouldUsePickLoadoutScreen( true )
+
+ //general Callbacks
+ AddCallback_EntitiesDidLoad(LoadEntities)
+ AddCallback_GameStateEnter(eGameState.Prematch,FD_createHarvester)
+ AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop)
+ AddCallback_OnRoundEndCleanup(FD_NPCCleanup)
+ AddCallback_OnClientConnected(GamemodeFD_InitPlayer)
+
+ //Damage Callbacks
+ AddDamageByCallback("player",FD_DamageByPlayerCallback)
+ AddDamageCallback( "player", DamageScaleByDifficulty )
+ AddDamageCallback( "npc_titan", DamageScaleByDifficulty )
+ AddDamageCallback( "npc_turret_sentry", DamageScaleByDifficulty )
+ AddDamageCallback( "npc_turret_sentry",RevivableTurret_DamageCallback)
+ //Spawn Callbacks
+ AddSpawnCallback( "npc_titan", HealthScaleByDifficulty )
+ AddSpawnCallback( "npc_super_spectre", HealthScaleByDifficulty )
+ AddSpawnCallback( "player", FD_PlayerRespawnCallback )
+ AddSpawnCallback("npc_turret_sentry", AddTurretSentry )
+ //death Callbacks
+ AddCallback_OnNPCKilled(OnNpcDeath)
+ AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled)
+
+ //Command Callbacks
+ AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady)
+ AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost)
+
+ //shop Callback
+ SetBoostPurchaseCallback(FD_BoostPurchaseCallback)
+ SetTeamReserveInteractCallback(FD_TeamReserveDepositOrWithdrawCallback)
+
+ //earn meter
+ ScoreEvent_SetupEarnMeterValuesForMixedModes()
+}
+
+void function FD_BoostPurchaseCallback(entity player,BoostStoreData data)
+{
+ file.players[player].moneySpend += data.cost
+}
+
+void function FD_PlayerRespawnCallback(entity player)
+{
+ if(player in file.players)
+ file.players[player].lastRespawn = Time()
+
+ Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" )
+}
+
+void function FD_TeamReserveDepositOrWithdrawCallback(entity player, string action,int amount)
+{
+ switch(action)
+ {
+ case"deposit":
+ file.players[player].moneyShared += amount
+ break
+ case"withdraw":
+ file.players[player].moneyShared -= amount
+ break
+ }
+}
+void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo)
+{
+ file.players[victim].longestLife = Time() - file.players[victim].lastRespawn
+ file.players[victim].diedThisRound = true
+ array<entity> militiaplayers = GetPlayerArrayOfTeam( TEAM_MILITIA )
+ int deaths = 0
+ foreach (entity player in militiaplayers)
+ if (!IsAlive(player))
+ deaths++
+
+ foreach( entity player in GetPlayerArray() )
+ {
+ if (player == victim || player.GetTeam() != TEAM_MILITIA)
+ continue
+
+ if (deaths == 1) // only one pilot died
+ PlayFactionDialogueToPlayer( "fd_singlePilotDown", player )
+ else if (deaths > 1 && deaths < militiaplayers.len() - 1) // multiple pilots died but at least one alive
+ PlayFactionDialogueToPlayer( "fd_multiPilotDown", player )
+ else if (deaths == militiaplayers.len() - 1) // ur shit out of luck ur the only survivor
+ PlayFactionDialogueToPlayer( "fd_onlyPlayerIsAlive", player )
+ }
+}
+
+void function FD_UsedCoreCallback(entity titan,entity weapon)
+{
+ if(!(titan in file.players))
+ {
+ return
+ }
+ file.players[titan].coresUsed += 1
+}
+
+void function GamemodeFD_InitPlayer(entity player)
+{
+ player_struct_fd data
+ data.diedThisRound = false
+ file.players[player] <- data
+ thread SetTurretSettings_threaded(player)
+ if(GetGlobalNetInt("FD_currentWave")>1)
+ PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0)
+
+ if ( GetGlobalNetInt("FD_currentWave") != 0 )
+ DisableTitanSelectionForPlayer( player ) // this might need moving to when they exit the titan selection UI when we do that
+ else
+ EnableTitanSelectionForPlayer( player )
+
+ if ( GetGlobalNetInt("FD_currentWave") != 0 )
+ DisableTitanSelectionForPlayer( player ) // this might need moving to when they exit the titan selection UI when we do that
+ else
+ EnableTitanSelectionForPlayer( player )
+
+}
+void function SetTurretSettings_threaded(entity player)
+{ //has to be delayed because PlayerConnect callbacks get called in wrong order
+ WaitFrame()
+ DeployableTurret_SetAISettingsForPlayer_AP(player,"npc_turret_sentry_burn_card_ap_fd")
+ DeployableTurret_SetAISettingsForPlayer_AT(player,"npc_turret_sentry_burn_card_at_fd")
+}
+
+void function OnNpcDeath( entity victim, entity attacker, var damageInfo )
+{
+ if(victim.IsTitan()&&attacker in file.players)
+ file.players[attacker].titanKills++
+ int victimTypeID = FD_GetAITypeID_ByString(victim.GetTargetName())
+ if(victimTypeID == eFD_AITypeIDs.TITAN_MORTAR||victimTypeID == eFD_AITypeIDs.SPECTRE_MORTAR)
+ if(attacker in file.players)
+ file.players[attacker].mortarUnitsKilled++
+ int findIndex = spawnedNPCs.find( victim )
+ if ( findIndex != -1 )
+ {
+ spawnedNPCs.remove( findIndex )
+
+ string netIndex = GetAiNetIdFromTargetName(victim.GetTargetName())
+ if(netIndex != "")
+ SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1)
+
+ SetGlobalNetInt("FD_AICount_Current",GetGlobalNetInt("FD_AICount_Current")-1)
+ }
+
+ if ( victim.GetOwner() == attacker || !attacker.IsPlayer() || attacker == victim || victim.GetBossPlayer() == attacker || victim.GetClassName() == "npc_turret_sentry" )
+ return
+
+ int playerScore = 0
+ int money = 0
+ int scriptDamageType = DamageInfo_GetCustomDamageType( damageInfo )
+ int damageSourceId = DamageInfo_GetDamageSourceIdentifier( damageInfo )
+
+ if ( victim.IsNPC() )
+ {
+ string eventName = FD_GetScoreEventName( victim.GetClassName() )
+ playerScore = ScoreEvent_GetPointValue( GetScoreEvent( eventName ) )
+
+ switch (victim.GetClassName())
+ {
+ case "npc_soldier":
+ money = 5
+ break
+ case "npc_drone":
+ case "npc_spectre":
+ money = 10
+ break
+ case "npc_stalker":
+ money = 15
+ break
+ case "npc_super_spectre":
+ money = 20
+ break
+ default:
+ money = 0 // titans seem to total up to 50 money undoomed health
+ }
+ foreach(player in GetPlayerArray())
+ Remote_CallFunction_NonReplay( player, "ServerCallback_OnTitanKilled", attacker.GetEncodedEHandle(), victim.GetEncodedEHandle(), scriptDamageType, damageSourceId )
+ }
+ if (money != 0)
+ AddMoneyToPlayer( attacker , money )
+
+ attacker.AddToPlayerGameStat( PGS_ASSAULT_SCORE, playerScore ) // seems to be how combat score is counted
+ file.players[attacker].scoreThisRound += playerScore
+ table<int, bool> alreadyAssisted
+ foreach( DamageHistoryStruct attackerInfo in victim.e.recentDamageHistory )
+ {
+ if ( !IsValid( attackerInfo.attacker ) || !attackerInfo.attacker.IsPlayer() || attackerInfo.attacker == victim )
+ continue
+
+ bool exists = attackerInfo.attacker.GetEncodedEHandle() in alreadyAssisted ? true : false
+ if( attackerInfo.attacker != attacker && !exists )
+ {
+ alreadyAssisted[attackerInfo.attacker.GetEncodedEHandle()] <- true
+ attackerInfo.attacker.AddToPlayerGameStat( PGS_DEFENSE_SCORE, playerScore ) // i assume this is how support score gets added
+ }
+ }
+
+
+}
+
+void function RateSpawnpoints_FD(int _0, array<entity> _1, int _2, entity _3){}
+
+bool function useShieldBoost(entity player,array<string> args)
+{
+ if((GetGlobalNetTime("FD_harvesterInvulTime")<Time())&&(player.GetPlayerNetInt("numHarvesterShieldBoost")>0))
+ {
+ fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax())
+ SetGlobalNetTime("FD_harvesterInvulTime",Time()+5)
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester, null, player)
+ player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 )
+ file.players[player].harvesterHeals += 1
+ }
+ return true
+}
+
+void function startMainGameLoop()
+{
+ thread mainGameLoop()
+}
+
+void function mainGameLoop()
+{
+ startHarvester()
+
+ bool showShop = false
+ for(int i = GetGlobalNetInt("FD_currentWave");i<waveEvents.len();i++)
+ {
+ if(!runWave(i,showShop))
+ break
+
+ if(i==0)
+ {
+ PlayerEarnMeter_SetEnabled(true)
+ showShop = true
+ foreach(entity player in GetPlayerArray())
+ {
+ PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0)
+ }
+ DisableTitanSelection()
+ }
+ else if (i + 1 == waveEvents.len() )
+ {
+ EnableTitanSelection()
+ }
+
+ }
+
+
+}
+
+
+
+array<int> function getHighestEnemyAmountsForWave(int waveIndex)
+{
+ table<int,int> npcs
+ npcs[eFD_AITypeIDs.TITAN]<-0
+ npcs[eFD_AITypeIDs.TITAN_NUKE]<-0
+ npcs[eFD_AITypeIDs.TITAN_ARC]<-0
+ npcs[eFD_AITypeIDs.TITAN_MORTAR]<-0
+ npcs[eFD_AITypeIDs.GRUNT]<-0
+ npcs[eFD_AITypeIDs.SPECTRE]<-0
+ npcs[eFD_AITypeIDs.SPECTRE_MORTAR]<-0
+ npcs[eFD_AITypeIDs.STALKER]<-0
+ npcs[eFD_AITypeIDs.REAPER]<-0
+ npcs[eFD_AITypeIDs.TICK]<-0
+ npcs[eFD_AITypeIDs.DRONE]<-0
+ npcs[eFD_AITypeIDs.DRONE_CLOAK]<-0
+ // npcs[eFD_AITypeIDs.RONIN]<-0
+ // npcs[eFD_AITypeIDs.NORTHSTAR]<-0
+ // npcs[eFD_AITypeIDs.SCORCH]<-0
+ // npcs[eFD_AITypeIDs.LEGION]<-0
+ // npcs[eFD_AITypeIDs.TONE]<-0
+ // npcs[eFD_AITypeIDs.ION]<-0
+ // npcs[eFD_AITypeIDs.MONARCH]<-0
+ // npcs[eFD_AITypeIDs.TITAN_SNIPER]<-0
+
+
+ foreach(WaveEvent e in waveEvents[waveIndex])
+ {
+ if(e.spawnEvent.spawnAmount==0)
+ continue
+ switch(e.spawnEvent.spawnType)
+ {
+ case(eFD_AITypeIDs.TITAN):
+ case(eFD_AITypeIDs.RONIN):
+ case(eFD_AITypeIDs.NORTHSTAR):
+ case(eFD_AITypeIDs.SCORCH):
+ case(eFD_AITypeIDs.TONE):
+ case(eFD_AITypeIDs.ION):
+ case(eFD_AITypeIDs.MONARCH):
+ case(eFD_AITypeIDs.LEGION):
+ case(eFD_AITypeIDs.TITAN_SNIPER):
+ npcs[eFD_AITypeIDs.TITAN]+=e.spawnEvent.spawnAmount
+ break
+ default:
+ npcs[e.spawnEvent.spawnType]+=e.spawnEvent.spawnAmount
+ }
+ }
+ array<int> ret = [-1,-1,-1,-1,-1,-1,-1,-1,-1]
+ foreach(int key,int value in npcs)
+ {
+ if(value==0)
+ continue
+ int lowestArrayIndex = 0
+ bool keyIsSet = false
+ foreach(index,int arrayValue in ret)
+ {
+ if(arrayValue==-1)
+ {
+ ret[index] = key
+ keyIsSet = true
+ break
+ }
+ if(npcs[ret[lowestArrayIndex]]>npcs[ret[index]])
+ lowestArrayIndex = index
+ }
+ if((!keyIsSet)&&(npcs[ret[lowestArrayIndex]]<value))
+ ret[lowestArrayIndex] = key
+ }
+ foreach(int val in ret){
+ printt("ArrayVal",val)
+ }
+ return ret
+
+}
+void function SetEnemyAmountNetVars(int waveIndex)
+{
+ int total = 0
+ table<int,int> npcs
+ npcs[eFD_AITypeIDs.TITAN]<-0
+ npcs[eFD_AITypeIDs.TITAN_NUKE]<-0
+ npcs[eFD_AITypeIDs.TITAN_ARC]<-0
+ npcs[eFD_AITypeIDs.TITAN_MORTAR]<-0
+ npcs[eFD_AITypeIDs.GRUNT]<-0
+ npcs[eFD_AITypeIDs.SPECTRE]<-0
+ npcs[eFD_AITypeIDs.SPECTRE_MORTAR]<-0
+ npcs[eFD_AITypeIDs.STALKER]<-0
+ npcs[eFD_AITypeIDs.REAPER]<-0
+ npcs[eFD_AITypeIDs.TICK]<-0
+ npcs[eFD_AITypeIDs.DRONE]<-0
+ npcs[eFD_AITypeIDs.DRONE_CLOAK]<-0
+ // npcs[eFD_AITypeIDs.RONIN]<-0
+ // npcs[eFD_AITypeIDs.NORTHSTAR]<-0
+ // npcs[eFD_AITypeIDs.SCORCH]<-0
+ // npcs[eFD_AITypeIDs.LEGION]<-0
+ // npcs[eFD_AITypeIDs.TONE]<-0
+ // npcs[eFD_AITypeIDs.ION]<-0
+ // npcs[eFD_AITypeIDs.MONARCH]<-0
+ // npcs[eFD_AITypeIDs.TITAN_SNIPER]<-0
+
+
+ foreach(WaveEvent e in waveEvents[waveIndex])
+ {
+ if(e.spawnEvent.spawnAmount==0)
+ continue
+ switch(e.spawnEvent.spawnType)
+ {
+ case(eFD_AITypeIDs.TITAN):
+ case(eFD_AITypeIDs.RONIN):
+ case(eFD_AITypeIDs.NORTHSTAR):
+ case(eFD_AITypeIDs.SCORCH):
+ case(eFD_AITypeIDs.TONE):
+ case(eFD_AITypeIDs.ION):
+ case(eFD_AITypeIDs.MONARCH):
+ case(eFD_AITypeIDs.LEGION):
+ case(eFD_AITypeIDs.TITAN_SNIPER):
+ npcs[eFD_AITypeIDs.TITAN]+=e.spawnEvent.spawnAmount
+ break
+ default:
+ npcs[e.spawnEvent.spawnType]+=e.spawnEvent.spawnAmount
+
+ }
+ total+= e.spawnEvent.spawnAmount
+ }
+ SetGlobalNetInt("FD_AICount_Titan",npcs[eFD_AITypeIDs.TITAN])
+ SetGlobalNetInt("FD_AICount_Titan_Nuke",npcs[eFD_AITypeIDs.TITAN_NUKE])
+ SetGlobalNetInt("FD_AICount_Titan_Mortar",npcs[eFD_AITypeIDs.TITAN_MORTAR])
+ SetGlobalNetInt("FD_AICount_Titan_Arc",npcs[eFD_AITypeIDs.TITAN_ARC])
+ SetGlobalNetInt("FD_AICount_Grunt",npcs[eFD_AITypeIDs.GRUNT])
+ SetGlobalNetInt("FD_AICount_Spectre",npcs[eFD_AITypeIDs.SPECTRE])
+ SetGlobalNetInt("FD_AICount_Spectre_Mortar",npcs[eFD_AITypeIDs.SPECTRE_MORTAR])
+ SetGlobalNetInt("FD_AICount_Stalker",npcs[eFD_AITypeIDs.STALKER])
+ SetGlobalNetInt("FD_AICount_Reaper",npcs[eFD_AITypeIDs.REAPER])
+ SetGlobalNetInt("FD_AICount_Ticks",npcs[eFD_AITypeIDs.TICK])
+ SetGlobalNetInt("FD_AICount_Drone",npcs[eFD_AITypeIDs.DRONE])
+ SetGlobalNetInt("FD_AICount_Drone_Cloak",npcs[eFD_AITypeIDs.DRONE_CLOAK])
+ SetGlobalNetInt("FD_AICount_Current",total)
+ SetGlobalNetInt("FD_AICount_Total",total)
+
+}
+
+
+
+bool function runWave(int waveIndex,bool shouldDoBuyTime)
+{
+
+ SetGlobalNetInt("FD_currentWave",waveIndex)
+ file.havesterWasDamaged = false
+ file.harvesterShieldDown = false
+ SetEnemyAmountNetVars(waveIndex)
+ for(int i = 0; i<20;i++)//Number of npc type ids
+ {
+ file.harvesterDamageSource.append(0.0)
+ }
+ foreach(entity player in GetPlayerArray())
+ {
+ file.players[player].diedThisRound = false
+ file.players[player].scoreThisRound = 0
+ }
+ array<int> enemys = getHighestEnemyAmountsForWave(waveIndex)
+
+ foreach(entity player in GetPlayerArray())
+ {
+ Remote_CallFunction_NonReplay(player,"ServerCallback_FD_AnnouncePreParty",enemys[0],enemys[1],enemys[2],enemys[3],enemys[4],enemys[5],enemys[6],enemys[7],enemys[8])
+ }
+ if(shouldDoBuyTime)
+ {
+ SetGlobalNetInt("FD_waveState",WAVE_STATE_BREAK)
+ OpenBoostStores()
+ foreach(entity player in GetPlayerArray())
+ Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyStoreOpen")
+ while(Time()<GetGlobalNetTime("FD_nextWaveStartTime"))
+ {
+ if(allPlayersReady())
+ SetGlobalNetTime("FD_nextWaveStartTime",Time())
+ WaitFrame()
+ }
+
+ CloseBoostStores()
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_StoreClosing)
+ }
+
+ //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10)
+ wait 10
+ SetGlobalNetInt("FD_waveState",WAVE_STATE_INCOMING)
+ foreach(entity player in GetPlayerArray())
+ {
+ Remote_CallFunction_NonReplay(player,"ServerCallback_FD_ClearPreParty")
+ player.SetPlayerNetBool("FD_readyForNextWave",false)
+ }
+ SetGlobalNetBool("FD_waveActive",true)
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveStart)
+ SetGlobalNetInt("FD_waveState",WAVE_STATE_BREAK)
+
+ //main wave loop
+ thread SetWaveStateReady()
+ executeWave()
+ SetGlobalNetInt("FD_waveState",WAVE_STATE_COMPLETE)
+ if(!IsAlive(fd_harvester.harvester))
+ {
+ float totalDamage = 0.0
+ array<float> highestDamage = [0.0,0.0,0.0]
+ array<int> highestDamageSource = [-1,-1,-1]
+ foreach(index,float damage in file.harvesterDamageSource)
+ {
+ totalDamage += damage
+ if(highestDamage[0]<damage)
+ {
+ highestDamage[2] = highestDamage[1]
+ highestDamageSource[2] = highestDamageSource[1]
+ highestDamage[1] = highestDamage[0]
+ highestDamageSource[1] = highestDamageSource[0]
+ highestDamageSource[0] = index
+ highestDamage[0] = damage
+ }
+ else if(highestDamage[1]<damage)
+ {
+ highestDamage[2] = highestDamage[1]
+ highestDamageSource[2] = highestDamageSource[1]
+ highestDamage[1] = damage
+ highestDamageSource[1] = index
+ }
+ else if(highestDamage[2]<damage)
+ {
+ highestDamage[2] = damage
+ highestDamageSource[2] = index
+ }
+ }
+
+ foreach(entity player in GetPlayerArray())
+ {
+ Remote_CallFunction_NonReplay(player,"ServerCallback_FD_DisplayHarvesterKiller",GetGlobalNetInt("FD_restartsRemaining"),getHintForTypeId(highestDamageSource[0]),highestDamageSource[0],highestDamage[0]/totalDamage,highestDamageSource[1],highestDamage[1]/totalDamage,highestDamageSource[2],highestDamage[2]/totalDamage)
+ }
+
+ if(GetGlobalNetInt("FD_restartsRemaining")>0)
+ FD_DecrementRestarts()
+ else
+ SetRoundBased(false)
+ SetWinner(TEAM_IMC)//restart round
+ spawnedNPCs = [] // reset npcs count
+ restetWaveEvents()
+ foreach(player in GetPlayerArray())
+ PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0)
+ return false
+ }
+
+
+ wait 2
+ //wave end
+
+ SetGlobalNetBool("FD_waveActive",false)
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd)
+
+ if ( isFinalWave() && IsAlive( fd_harvester.harvester ) )
+ {
+ //Game won code
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd)
+ foreach(entity player in GetPlayerArray())
+ {
+ AddPlayerScore(player,"FDTeamWave")
+ }
+ wait 1
+ int highestScore = 0;
+ entity highestScore_player = GetPlayerArray()[0]
+ foreach(entity player in GetPlayerArray())
+ {
+
+ if(!file.players[player].diedThisRound)
+ AddPlayerScore(player,"FDDidntDie")
+ if(highestScore<file.players[player].scoreThisRound)
+ {
+ highestScore = file.players[player].scoreThisRound
+ highestScore_player = player
+ }
+
+ }
+ file.players[highestScore_player].totalMVPs += 1
+ AddPlayerScore(highestScore_player,"FDWaveMVP")
+ wait 1
+ foreach(entity player in GetPlayerArray())
+ if(!file.havesterWasDamaged)
+ AddPlayerScore(player,"FDTeamFlawlessWave")
+
+
+
+
+ SetRoundBased(false)
+ SetWinner(TEAM_MILITIA)
+ PlayFactionDialogueToTeam( "fd_matchVictory", TEAM_MILITIA )
+ return true
+ }
+
+ if(!file.havesterWasDamaged)
+ {
+ PlayFactionDialogueToTeam( "fd_waveRecapPerfect", TEAM_MILITIA )
+ wait 5
+ }
+ else
+ {
+ float damagepercent = ( ( file.harvesterDamageTaken / fd_harvester.harvester.GetMaxHealth().tofloat() ) * 100 )
+ float healthpercent = ( ( fd_harvester.harvester.GetHealth().tofloat() / fd_harvester.harvester.GetMaxHealth() ) * 100 )
+ if (damagepercent < 5) // if less than 5% damage taken
+ PlayFactionDialogueToTeam( "fd_waveRecapNearPerfect", TEAM_MILITIA )
+ else if ( healthpercent < 15 ) // if less than 15% health remains and more than 5% damage taken
+ PlayFactionDialogueToTeam( "fd_waveRecapLowHealth", TEAM_MILITIA )
+ wait 5
+ }
+
+ if ( isSecondWave() )
+ {
+ // supposed to add dialogues like "GOOD WORK TEAM" then "YOUR TITAN IS READY"
+ // done ^
+ PlayFactionDialogueToTeam( "fd_titanReadyNag" , TEAM_MILITIA )
+ wait 5
+ }
+
+ //Player scoring
+ MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_NotifyWaveBonusIncoming)
+ wait 2
+ foreach(entity player in GetPlayerArray())
+ {
+ if (isSecondWave())
+ PlayFactionDialogueToPlayer( "fd_wavePayoutFirst", player )
+ else
+ PlayFactionDialogueToPlayer( "fd_wavePayoutAddtnl", player )
+ AddPlayerScore(player,"FDTeamWave")
+ AddMoneyToPlayer(player,GetCurrentPlaylistVarInt("fd_money_per_round",600))
+ // this function is called "Set" but in reality it is "Add"
+ SetJoinInProgressBonus( GetCurrentPlaylistVarInt("fd_money_per_round",600) )
+ EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P")
+ }
+ wait 1
+ int highestScore = 0;
+ entity highestScore_player = GetPlayerArray()[0]
+ foreach(entity player in GetPlayerArray())
+ {
+ if(!file.players[player].diedThisRound)
+ {
+ AddPlayerScore(player,"FDDidntDie")
+ player.AddToPlayerGameStat( PGS_ASSAULT_SCORE, FD_SCORE_DIDNT_DIE )
+ }
+ AddMoneyToPlayer(player,100)
+ EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P")
+ if(highestScore<file.players[player].scoreThisRound)
+ {
+ highestScore = file.players[player].scoreThisRound
+ highestScore_player = player
+ }
+
+ }
+ wait 1
+ file.players[highestScore_player].totalMVPs += 1
+ AddPlayerScore(highestScore_player,"FDWaveMVP")
+ AddMoneyToPlayer(highestScore_player,100)
+ highestScore_player.AddToPlayerGameStat( PGS_ASSAULT_SCORE, FD_SCORE_MVP )
+ EmitSoundOnEntityOnlyToPlayer(highestScore_player,highestScore_player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P")
+ foreach(entity player in GetPlayerArray())
+ {
+ Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyMVP",highestScore_player.GetEncodedEHandle())
+ }
+ wait 1
+ foreach(entity player in GetPlayerArray())
+ {
+
+ if(!file.havesterWasDamaged)
+ {
+ AddPlayerScore(player,"FDTeamFlawlessWave")
+ AddMoneyToPlayer(player,100)
+ player.AddToPlayerGameStat( PGS_ASSAULT_SCORE, FD_SCORE_TEAM_FLAWLESS_WAVE )
+ EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P")
+ }
+ }
+
+ wait 1
+
+ if(waveIndex<waveEvents.len())
+ SetGlobalNetTime("FD_nextWaveStartTime",Time()+75)
+
+ return true
+
+}
+
+void function SetWaveStateReady(){
+ wait 5
+ SetGlobalNetInt("FD_waveState",WAVE_STATE_IN_PROGRESS)
+}
+
+void function gameWonMedals(){
+ table<string,entity> medals
+ //most mvps
+}
+
+
+void function OnHarvesterDamaged(entity harvester, var damageInfo)
+{
+ if ( !IsValid( harvester ) )
+ return
+
+ if( fd_harvester.harvester != harvester )
+ return
+
+ if ( GetGlobalNetTime( "FD_harvesterInvulTime" ) > Time() )
+ {
+ harvester.SetShieldHealth( harvester.GetShieldHealthMax() )
+ return
+ }
+
+ int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo )
+ entity attacker = DamageInfo_GetAttacker( damageInfo )
+ float damageAmount = DamageInfo_GetDamage( damageInfo )
+
+ if ( !damageSourceID && !damageAmount && !attacker )
+ return
+
+ fd_harvester.lastDamage = Time()
+
+ damageAmount = (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0))
+
+
+
+ float shieldPercent = ( (harvester.GetShieldHealth().tofloat() / harvester.GetShieldHealthMax()) * 100 )
+ if ( shieldPercent < 100 && !file.harvesterShieldDown)
+ PlayFactionDialogueToTeam( "fd_baseShieldTakingDmg", TEAM_MILITIA )
+
+ if ( shieldPercent < 35 && !file.harvesterShieldDown) // idk i made this up
+ PlayFactionDialogueToTeam( "fd_baseShieldLow", TEAM_MILITIA )
+
+ if ( harvester.GetShieldHealth() == 0 )
+ {
+ if( !file.harvesterShieldDown )
+ {
+ PlayFactionDialogueToTeam( "fd_baseShieldDown", TEAM_MILITIA )
+ file.harvesterShieldDown = true // prevent shield dialogues from repeating
+ }
+ file.harvesterDamageTaken = file.harvesterDamageTaken + damageAmount // track damage for wave recaps
+ float newHealth = harvester.GetHealth() - damageAmount
+ float oldhealthpercent = ( ( harvester.GetHealth().tofloat() / harvester.GetMaxHealth() ) * 100 )
+ float healthpercent = ( ( newHealth / harvester.GetMaxHealth() ) * 100 )
+
+ if (healthpercent <= 75 && oldhealthpercent > 75) // we don't want the dialogue to keep saying "Harvester is below 75% health" everytime they take additional damage
+ PlayFactionDialogueToTeam( "fd_baseHealth75", TEAM_MILITIA )
+
+ if (healthpercent <= 50 && oldhealthpercent > 50)
+ PlayFactionDialogueToTeam( "fd_baseHealth50", TEAM_MILITIA )
+
+ if (healthpercent <= 25 && oldhealthpercent > 25)
+ PlayFactionDialogueToTeam( "fd_baseHealth25", TEAM_MILITIA )
+
+ if (healthpercent <= 10)
+ PlayFactionDialogueToTeam( "fd_baseLowHealth", TEAM_MILITIA )
+
+ if( newHealth <= 0 )
+ {
+ EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed")
+ newHealth = 0
+ PlayFactionDialogueToTeam( "fd_baseDeath", TEAM_MILITIA )
+ fd_harvester.rings.Anim_Stop()
+ }
+ harvester.SetHealth( newHealth )
+ file.havesterWasDamaged = true
+ }
+
+ if ( DamageInfo_GetDamageSourceIdentifier( damageInfo ) == eDamageSourceId.mp_titancore_laser_cannon )
+ DamageInfo_SetDamage( damageInfo, DamageInfo_GetDamage( damageInfo )/10 ) // laser core shreds super well for some reason
+
+ if ( attacker.IsPlayer() )
+ attacker.NotifyDidDamage( harvester, DamageInfo_GetHitBox( damageInfo ), DamageInfo_GetDamagePosition( damageInfo ), DamageInfo_GetCustomDamageType( damageInfo ), DamageInfo_GetDamage( damageInfo ), DamageInfo_GetDamageFlags( damageInfo ), DamageInfo_GetHitGroup( damageInfo ), DamageInfo_GetWeapon( damageInfo ), DamageInfo_GetDistFromAttackOrigin( damageInfo ) )
+}
+
+void function FD_NPCCleanup()
+{
+ foreach ( entity npc in GetEntArrayByClass_Expensive("C_AI_BaseNPC") )
+ if ( IsValid( npc ) )
+ npc.Destroy()
+}
+
+void function HarvesterThink()
+{
+ entity harvester = fd_harvester.harvester
+
+
+ EmitSoundOnEntity( harvester,"coop_generator_startup" )
+
+ float lastTime = Time()
+ wait 4
+ int lastShieldHealth = harvester.GetShieldHealth()
+ generateBeamFX( fd_harvester )
+ generateShieldFX( fd_harvester )
+
+ EmitSoundOnEntity( harvester, "coop_generator_ambient_healthy" )
+
+ bool isRegening = false // stops the regenning sound to keep stacking on top of each other
+
+ while ( IsAlive( harvester ) )
+ {
+ float currentTime = Time()
+ float deltaTime = currentTime -lastTime
+
+ if ( IsValid( fd_harvester.particleShield ) )
+ {
+ vector shieldColor = GetShieldTriLerpColor(1.0-(harvester.GetShieldHealth().tofloat()/harvester.GetShieldHealthMax().tofloat()))
+ EffectSetControlPointVector( fd_harvester.particleShield, 1, shieldColor )
+ }
+
+ if( IsValid( fd_harvester.particleBeam ) )
+ {
+ vector beamColor = GetShieldTriLerpColor( 1.0 - (harvester.GetHealth().tofloat() / harvester.GetMaxHealth().tofloat() ) )
+ EffectSetControlPointVector( fd_harvester.particleBeam, 1, beamColor )
+ }
+
+ if ( fd_harvester.harvester.GetShieldHealth() == 0 )
+ if( IsValid( fd_harvester.particleShield ) )
+ fd_harvester.particleShield.Destroy()
+
+ if ( ( ( currentTime-fd_harvester.lastDamage) >= GENERATOR_SHIELD_REGEN_DELAY ) && ( harvester.GetShieldHealth() < harvester.GetShieldHealthMax() ) )
+ {
+ if( !IsValid(fd_harvester.particleShield) )
+ generateShieldFX(fd_harvester)
+
+ //printt((currentTime-fd_harvester.lastDamage))
+
+ if(harvester.GetShieldHealth()==0)
+ EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_start")
+
+ if (!isRegening)
+ {
+ EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" )
+ file.harvesterShieldDown = false
+ if (GetGlobalNetBool("FD_waveActive"))
+ PlayFactionDialogueToTeam( "fd_baseShieldRecharging", TEAM_MILITIA )
+ else
+ PlayFactionDialogueToTeam( "fd_baseShieldRechargingShort", TEAM_MILITIA )
+ isRegening = true
+ }
+
+ float newShieldHealth = ( harvester.GetShieldHealthMax() / GENERATOR_SHIELD_REGEN_TIME * deltaTime ) + harvester.GetShieldHealth()
+
+ if ( newShieldHealth >= harvester.GetShieldHealthMax() )
+ {
+ StopSoundOnEntity(harvester,"coop_generator_shieldrecharge_resume")
+ harvester.SetShieldHealth(harvester.GetShieldHealthMax())
+ EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_end")
+ if (GetGlobalNetBool("FD_waveActive"))
+ PlayFactionDialogueToTeam( "fd_baseShieldUp", TEAM_MILITIA )
+ isRegening = false
+ }
+ else
+ {
+ harvester.SetShieldHealth(newShieldHealth)
+ }
+ } else if ( ( ( currentTime-fd_harvester.lastDamage) < GENERATOR_SHIELD_REGEN_DELAY ) && ( harvester.GetShieldHealth() < harvester.GetShieldHealthMax() ) )
+ isRegening = false
+
+ if ( ( lastShieldHealth > 0 ) && ( harvester.GetShieldHealth() == 0 ) )
+ EmitSoundOnEntity(harvester,"coop_generator_shielddown")
+
+ lastShieldHealth = harvester.GetShieldHealth()
+ lastTime = currentTime
+ WaitFrame()
+ }
+
+}
+
+void function startHarvester()
+{
+
+ thread HarvesterThink()
+ thread HarvesterAlarm()
+
+}
+
+void function HarvesterAlarm()
+{
+ while(IsAlive(fd_harvester.harvester))
+ {
+ if(fd_harvester.harvester.GetShieldHealth()==0)
+ {
+ wait EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm")
+ }
+ else
+ {
+ WaitFrame()
+ }
+ }
+}
+
+void function initNetVars()
+{
+ SetGlobalNetInt("FD_totalWaves",waveEvents.len())
+ SetGlobalNetInt("burn_turretLimit",2)
+ if(!FD_HasRestarted())
+ {
+ bool showShop = false
+ SetGlobalNetInt("FD_currentWave",0)
+ if(FD_IsDifficultyLevelOrHigher(eFDDifficultyLevel.INSANE))
+ FD_SetNumAllowedRestarts(0)
+ else
+ FD_SetNumAllowedRestarts(2)
+ }
+
+
+}
+
+void function FD_DamageByPlayerCallback(entity victim,var damageInfo)
+{
+ entity player = DamageInfo_GetAttacker(damageInfo)
+ if(!(player in file.players))
+ return
+ float damage = DamageInfo_GetDamage(damageInfo)
+ file.players[player].damageDealt += damage
+ file.players[player].scoreThisRound += damage.tointeger() //TODO NOT HOW SCORE WORKS
+ if(victim.IsTitan())
+ {
+ //TODO Money and score for titan damage
+ }
+
+}
+
+void function DamageScaleByDifficulty( entity ent, var damageInfo )
+{
+ entity attacker = DamageInfo_GetAttacker( damageInfo )
+
+ if ( !attacker )
+ return
+
+ if ( ent.GetTeam() != TEAM_MILITIA )
+ return
+
+ int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo )
+ float damageAmount = DamageInfo_GetDamage( damageInfo )
+
+ if ( !damageSourceID && !damageAmount )
+ return
+
+ if ( attacker.IsPlayer() && attacker.GetTeam() == TEAM_IMC ) // in case we ever want a PvP in Frontier Defense, don't scale their damage
+ return
+
+
+ if ( attacker == ent ) // dont scale self damage
+ return
+
+
+ DamageInfo_SetDamage( damageInfo, (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0)) )
+
+
+
}
-void function RateSpawnpoints_FD(int _0, array<entity> _1, int _2, entity _3)
+
+
+void function HealthScaleByDifficulty( entity ent )
+{
+
+ if ( ent.GetTeam() != TEAM_IMC )
+ return
+
+
+ if (ent.IsTitan()&& IsValid(GetPetTitanOwner( ent ) ) ) // in case we ever want pvp in FD
+ return
+
+ if ( ent.IsTitan() )
+ ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt("fd_titan_health_adjust",0) )
+ else
+ ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt("fd_reaper_health_adjust",0) )
+
+ if(GetCurrentPlaylistVarInt("fd_pro_titan_shields",0)&&ent.IsTitan()){
+ entity soul = ent.GetTitanSoul()
+ if(IsValid(soul)){
+ soul.SetShieldHealthMax(2500)
+ soul.SetShieldHealth(2500)
+ }
+ }
+
+
+}
+
+void function FD_createHarvester()
+{
+
+ fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),GetCurrentPlaylistVarInt("fd_harvester_health",25000),GetCurrentPlaylistVarInt("fd_harvester_shield",6000),TEAM_MILITIA)
+ fd_harvester.harvester.Minimap_SetAlignUpright( true )
+ fd_harvester.harvester.Minimap_AlwaysShow( TEAM_IMC, null )
+ fd_harvester.harvester.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ fd_harvester.harvester.Minimap_SetHeightTracking( true )
+ fd_harvester.harvester.Minimap_SetZOrder( MINIMAP_Z_OBJECT )
+ fd_harvester.harvester.Minimap_SetCustomState( eMinimapObject_prop_script.FD_HARVESTER )
+ AddEntityCallback_OnDamaged( fd_harvester.harvester, OnHarvesterDamaged )
+}
+
+bool function isFinalWave()
+{
+ return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves"))
+}
+
+bool function isSecondWave()
+{
+ return ((GetGlobalNetInt("FD_currentWave")+1)==1)
+}
+
+void function LoadEntities()
+{
+ CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,shopAngles)
+ foreach ( entity info_target in GetEntArrayByClass_Expensive("info_target") )
+ {
+
+ if ( GameModeRemove( info_target ) )
+ continue
+
+ if(info_target.HasKey("editorclass")){
+ switch(info_target.kv.editorclass){
+ case"info_fd_harvester":
+ file.harvester_info = info_target
+ break
+ case"info_fd_mode_model":
+ entity prop = CreatePropDynamic( info_target.GetModelName(), info_target.GetOrigin(), info_target.GetAngles(), 6 )
+ break
+ case"info_fd_ai_position":
+ AddStationaryAIPosition(info_target.GetOrigin(),int(info_target.kv.aiType))
+ break
+ case"info_fd_route_node":
+ routeNodes.append(info_target)
+ break
+ case"info_fd_smoke_screen":
+ file.smokePoints.append(info_target)
+ break
+ }
+ }
+ }
+ ValidateAndFinalizePendingStationaryPositions()
+ initNetVars()
+ SetTeam(GetTeamEnt(TEAM_IMC),TEAM_IMC)
+}
+
+
+bool function allPlayersReady()
+{
+ foreach(entity player in GetPlayerArray())
+ {
+ if(!player.GetPlayerNetBool("FD_readyForNextWave"))
+ return false
+ }
+ return true
+}
+
+void function CheckLastPlayerReady()
+{
+ int readyplayers = 0
+ entity notready
+ foreach(entity player in GetPlayerArray())
+ {
+ if(player.GetPlayerNetBool("FD_readyForNextWave"))
+ readyplayers++
+ else
+ notready = player // keep a track of this player
+ }
+ if (readyplayers == GetPlayerArray().len() - 1)
+ PlayFactionDialogueToPlayer( "fd_playerNeedsToReadyUp", notready ) // ready up i swear there's one player like this in every match i've played
+}
+
+bool function ClientCommandCallbackToggleReady( entity player, array<string> args )
+{
+ if(args[0]=="true")
+ player.SetPlayerNetBool("FD_readyForNextWave",true)
+ if(args[0]=="false")
+ player.SetPlayerNetBool("FD_readyForNextWave",false)
+
+ CheckLastPlayerReady()
+ return true
+}
+
+int function getHintForTypeId(int typeId)
+{
+ //this is maybe a bit of an naive aproch
+ switch(typeId)
+ {
+ case eFD_AITypeIDs.TITAN_NUKE:
+ return (348 +RandomIntRangeInclusive(0,1))
+ case eFD_AITypeIDs.TITAN_ARC:
+ return (350 +RandomIntRangeInclusive(0,1))
+ case eFD_AITypeIDs.TITAN_MORTAR:
+ return (352 +RandomIntRangeInclusive(0,1))
+ case eFD_AITypeIDs.GRUNT:
+ return 354
+ case eFD_AITypeIDs.SPECTRE:
+ return 355
+ case eFD_AITypeIDs.SPECTRE_MORTAR:
+ return (356 +RandomIntRangeInclusive(0,1))
+ case eFD_AITypeIDs.STALKER:
+ if(RandomIntRangeInclusive(0,1)==0)
+ return 358
+ else
+ return 361
+ case eFD_AITypeIDs.REAPER:
+ return (359 +RandomIntRangeInclusive(0,1))
+ case eFD_AITypeIDs.DRONE:
+ return 362
+ case eFD_AITypeIDs.TITAN_SNIPER:
+ return (371 +RandomIntRangeInclusive(0,2))
+ default:
+ return (363+RandomIntRangeInclusive(0,7))
+ }
+ unreachable
+}
+
+string function GetTargetNameForID(int typeId)
+{
+ switch(typeId)
+ {
+ case eFD_AITypeIDs.TITAN_NUKE:
+ return "npc_titan_nuke"
+ case eFD_AITypeIDs.LEGION:
+ return "npc_titan_ogre_minigun"
+ case eFD_AITypeIDs.TITAN_ARC:
+ return "empTitan"
+ case eFD_AITypeIDs.RONIN:
+ return "npc_titan_stryder_leadwall"
+ case eFD_AITypeIDs.TITAN_MORTAR:
+ return "npc_titan_mortar"
+ case eFD_AITypeIDs.TONE:
+ return "npc_titan_atlas_tracker"
+ case eFD_AITypeIDs.TITAN_SNIPER:
+ return "npc_titan_sniper"
+ case eFD_AITypeIDs.NORTHSTAR:
+ return "npc_titan_stryder_sniper"
+ case eFD_AITypeIDs.ION:
+ return "npc_titan_atlas_stickybomb"
+ case eFD_AITypeIDs.SCORCH:
+ return "npc_titan_ogre_meteor"
+ case eFD_AITypeIDs.MONARCH:
+ return "npc_titan_atlas_vanguard"
+ case eFD_AITypeIDs.GRUNT:
+ return "grunt"
+ case eFD_AITypeIDs.SPECTRE:
+ return "spectre"
+ case eFD_AITypeIDs.SPECTRE_MORTAR:
+ return "mortar_spectre"
+ case eFD_AITypeIDs.STALKER:
+ return "stalker"
+ case eFD_AITypeIDs.REAPER:
+ return "reaper"
+ case eFD_AITypeIDs.TICK:
+ return "tick"
+ case eFD_AITypeIDs.DRONE:
+ return "drone"
+ case eFD_AITypeIDs.DRONE_CLOAK:
+ return "Cloak Drone" // have to be like this for some reason in cl_gamemode_fd
+ default:
+ return "titan"
+ }
+ unreachable
+}
+
+string function GetAiNetIdFromTargetName(string targetName)
+{
+ switch ( targetName )
+ {
+ case "titan":
+ case "sniperTitan":
+ case "npc_titan_ogre_meteor_boss_fd":
+ case "npc_titan_ogre_meteor":
+ case "npc_titan_ogre_minigun_boss_fd":
+ case "npc_titan_ogre_minigun":
+ case "npc_titan_atlas_stickybomb_boss_fd":
+ case "npc_titan_atlas_stickybomb":
+ case "npc_titan_atlas_tracker_boss_fd":
+ case "npc_titan_atlas_tracker":
+ case "npc_titan_stryder_leadwall_boss_fd":
+ case "npc_titan_stryder_leadwall":
+ case "npc_titan_stryder_sniper_boss_fd":
+ case "npc_titan_stryder_sniper":
+ case "npc_titan_sniper":
+ case "npc_titan_sniper_tone":
+ case "npc_titan_atlas_vanguard_boss_fd":
+ case "npc_titan_atlas_vanguard":
+ return "FD_AICount_Titan"
+ case "empTitan":
+ case "npc_titan_arc":
+ return "FD_AICount_Titan_Arc"
+ case "mortarTitan":
+ case "npc_titan_mortar":
+ return "FD_AICount_Titan_Mortar"
+ case "nukeTitan":
+ case "npc_titan_nuke":
+ return "FD_AICount_Titan_Nuke"
+ case "npc_soldier":
+ case "grunt":
+ return "FD_AICount_Grunt"
+ case "spectre":
+ return "FD_AICount_Spectre"
+ case "mortar_spectre":
+ return "FD_AICount_Spectre_Mortar"
+ case "npc_stalker":
+ case "stalker":
+ return "FD_AICount_Stalker"
+ case "npc_super_spectre":
+ case "reaper":
+ return "FD_AICount_Reaper"
+ case "npc_drone":
+ case "drone":
+ return "FD_AICount_Drone"
+ case "cloakedDrone":
+ case "Cloaked Drone":
+ return "FD_AICount_Drone_Cloak"
+ case "tick":
+ return "FD_AICount_Ticks"
+ }
+ printt("unknown target name ",targetName)
+ return ""
+}
+
+
+
+void function AddTurretSentry(entity turret)
+{
+ turret.Minimap_AlwaysShow( TEAM_IMC, null )
+ turret.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ turret.Minimap_SetHeightTracking( true )
+ turret.Minimap_SetCustomState( eMinimapObject_npc.FD_TURRET )
+}
+
+void function DisableTitanSelection( )
{
+ foreach ( entity player in GetPlayerArray() )
+ {
+ DisableTitanSelectionForPlayer( player )
+ }
+}
-} \ No newline at end of file
+void function EnableTitanSelection( )
+{
+ foreach ( entity player in GetPlayerArray() )
+ {
+ EnableTitanSelectionForPlayer( player )
+ }
+}
+
+void function EnableTitanSelectionForPlayer( entity player )
+{
+ int enumCount = PersistenceGetEnumCount( "titanClasses" )
+ for ( int i = 0; i < enumCount; i++ )
+ {
+ string enumName = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ if ( enumName != "" )
+ player.SetPersistentVar( "titanClassLockState[" + enumName + "]", TITAN_CLASS_LOCK_STATE_AVAILABLE )
+
+ }
+}
+
+void function DisableTitanSelectionForPlayer( entity player )
+{
+ int enumCount = PersistenceGetEnumCount( "titanClasses" )
+ for ( int i = 0; i < enumCount; i++ )
+ {
+ string enumName = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ string selectedEnumName = PersistenceGetEnumItemNameForIndex( "titanClasses", player.GetPersistentVarAsInt("activeTitanLoadoutIndex") )
+ if ( enumName != "" && enumName != selectedEnumName )
+ player.SetPersistentVar( "titanClassLockState[" + enumName + "]", TITAN_CLASS_LOCK_STATE_LOCKED )
+ }
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut
new file mode 100644
index 00000000..4ebbcf61
--- /dev/null
+++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut
@@ -0,0 +1,1305 @@
+global function CreateSmokeEvent
+global function CreateArcTitanEvent
+global function CreateWaitForTimeEvent
+global function CreateSuperSpectreEvent
+global function CreateSuperSpectreEventWithMinion
+global function CreateDroppodGruntEvent
+global function CreateNukeTitanEvent
+global function CreateMortarTitanEvent
+global function CreateGenericSpawnEvent
+global function CreateGenericTitanSpawnWithAiSettingsEvent
+global function CreateDroppodStalkerEvent
+global function CreateDroppodSpectreMortarEvent
+global function CreateWaitUntilAliveEvent
+global function CreateWaitUntilAliveWeightedEvent
+global function CreateCloakDroneEvent
+global function CreateDroppodTickEvent
+global function CreateSpawnDroneEvent
+global function CreateToneSniperTitanEvent
+global function CreateNorthstarSniperTitanEvent //northstars are always sniper titans
+global function CreateIonTitanEvent
+global function CreateScorchTitanEvent
+global function CreateRoninTitanEvent
+global function CreateToneTitanEvent
+global function CreateLegionTitanEvent
+global function CreateMonarchTitanEvent
+global function executeWave
+global function restetWaveEvents
+
+global struct SmokeEvent{
+ vector position
+ float lifetime
+}
+
+global struct SpawnEvent{
+ vector origin
+ vector angles
+ string route //defines route taken by the ai
+ int skippedRouteNodes //defines how many route nodes will be skipped
+ int spawnType //Just used for Wave Info but can be used for spawn too should contain aid of spawned enemys
+ int spawnAmount //Just used for Wave Info but can be used for spawn too should contain amound of spawned enemys
+ string npcClassName
+ string aiSettings
+ string entityGlobalKey
+}
+
+global struct FlowControlEvent{
+ float waitTime
+ int splitNextEventIndex
+ int waitAmount
+ int waitEntityType
+ array<string> waitGlobalDataKey
+}
+
+global struct SoundEvent{
+ string soundEventName
+}
+
+global struct WaveEvent{
+ void functionref(SmokeEvent,SpawnEvent,FlowControlEvent,SoundEvent) eventFunction
+ bool shouldThread
+ int executeOnThisCall //will actually be executed when called this many times
+ int timesExecuted
+ int nextEventIndex
+ SmokeEvent smokeEvent
+ SpawnEvent spawnEvent
+ FlowControlEvent flowControlEvent
+ SoundEvent soundEvent
+
+}
+
+
+
+global table<string,entity> GlobalEventEntitys
+global array<array<WaveEvent> > waveEvents
+
+
+
+void function executeWave()
+{
+ print("executeWave Start")
+ thread runEvents(0)
+ while(IsAlive(fd_harvester.harvester)&&(!allEventsExecuted(GetGlobalNetInt("FD_currentWave"))))
+ WaitFrame()
+ wait 5 //incase droppod is last event so all npc are spawned
+ waitUntilLessThanAmountAlive(0)
+ waitUntilLessThanAmountAlive_expensive(0)
+
+ foreach(entity ent in GetEntArrayByClass_Expensive("npc_turret_sentry"))
+ RevivableTurret_Revive(ent)
+}
+
+bool function allEventsExecuted(int waveIndex)
+{
+ foreach(WaveEvent e in waveEvents[waveIndex])
+ {
+ if(e.executeOnThisCall>e.timesExecuted)
+ return false
+ }
+ return true
+}
+
+void function runEvents(int firstExecuteIndex)
+{
+ print("runEvents Start")
+ WaveEvent currentEvent = waveEvents[GetGlobalNetInt("FD_currentWave")][firstExecuteIndex]
+
+ while(true)
+ {
+ currentEvent.timesExecuted++
+ if(currentEvent.timesExecuted!=currentEvent.executeOnThisCall)
+ {
+ print("not on this call")
+ return
+ }
+ if(!IsAlive(fd_harvester.harvester))
+ {
+ print("harvesterDead")
+ return
+ }
+ if(currentEvent.shouldThread)
+ {
+ print("execute with thread")
+ thread currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.flowControlEvent,currentEvent.soundEvent)
+ }
+ else
+ {
+ print("execute without thread")
+ currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.flowControlEvent,currentEvent.soundEvent)
+ }
+ if(currentEvent.nextEventIndex==0)
+ {
+ print("zero index")
+ return
+ }
+ currentEvent = waveEvents[GetGlobalNetInt("FD_currentWave")][currentEvent.nextEventIndex]
+ }
+ print("runEvents End")
+}
+
+void function restetWaveEvents(){
+ foreach(WaveEvent event in waveEvents[GetGlobalNetInt("FD_currentWave")])
+ {
+ event.timesExecuted = 0
+ }
+}
+
+
+
+
+
+
+
+/****************************************************************************************************************\
+####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ######
+# # # # ## # # # # # ## # # # # # # # # # # #
+# # # # # # # # # # # # # # # # # # # # # # #
+##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ######
+# # # # # # # # # # # # # # # # # ####### # # # # #
+# # # # # ## # # # # # ## # # # # # # # # # #
+####### # ####### # # # ##### ####### # # ####### # # # # # ####### # #
+\*****************************************************************************************************************/
+
+WaveEvent function CreateSmokeEvent(vector position,float lifetime,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.eventFunction = spawnSmoke
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.smokeEvent.position = position
+ event.smokeEvent.lifetime = lifetime
+ return event
+}
+
+WaveEvent function CreateArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnArcTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_ARC
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnSuperSpectre
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.REAPER
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnSuperSpectreWithMinion
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.REAPER
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnDroppodGrunts
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.GRUNT
+ event.spawnEvent.spawnAmount = 4
+ event.spawnEvent.origin = origin
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnDroppodStalker
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.STALKER
+ event.spawnEvent.spawnAmount = 4
+ event.spawnEvent.origin = origin
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnDroppodSpectreMortar
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.SPECTRE_MORTAR
+ event.spawnEvent.spawnAmount = 4
+ event.spawnEvent.origin = origin
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateWaitForTimeEvent(float waitTime,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.shouldThread = false
+ event.eventFunction = waitForTime
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.flowControlEvent.waitTime = waitTime
+ return event
+}
+
+WaveEvent function CreateWaitUntilAliveEvent(int amount,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.eventFunction = waitUntilLessThanAmountAliveEvent
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = false
+ event.flowControlEvent.waitAmount = amount
+ return event
+}
+
+WaveEvent function CreateWaitUntilAliveWeightedEvent(int amount,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.eventFunction = waitUntilLessThanAmountAliveEventWeighted
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = false
+ event.flowControlEvent.waitAmount = amount
+ return event
+}
+
+WaveEvent function CreateGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnGenericNPC
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.npcClassName = npcClassName
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.spawnType = spawnType
+ event.spawnEvent.spawnAmount = spawnAmount
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnGenericNPCTitanwithSettings
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.npcClassName = npcClassName
+ event.spawnEvent.aiSettings = aiSettings
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.spawnType = spawnType
+ event.spawnEvent.spawnAmount = spawnAmount
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnNukeTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_NUKE
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnMortarTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_MORTAR
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = fd_spawnCloakDrone
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE_CLOAK
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateDroppodTickEvent( vector origin, int amount, string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnTick
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TICK
+ event.spawnEvent.spawnAmount = amount
+ event.spawnEvent.origin = origin
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnSniperTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnToneSniperTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+
+WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnIonTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.ION
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnScorchTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.SCORCH
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnRoninTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.RONIN
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnToneTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.TONE
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnLegionTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.LEGION
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = SpawnMonarchTitan
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.MONARCH
+ event.spawnEvent.spawnAmount = 1
+ event.spawnEvent.origin = origin
+ event.spawnEvent.angles = angles
+ event.spawnEvent.route = route
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ return event
+}
+
+WaveEvent function CreateWaitForDeathOfEntitysEvent(array<string> waitGlobalDataKey,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.eventFunction = waitForDeathOfEntitys
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event. shouldThread = false
+ event.flowControlEvent.waitGlobalDataKey = waitGlobalDataKey
+ return event
+}
+
+WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int nextEventIndex,int executeOnThisCall = 1)
+{
+ WaveEvent event
+ event.eventFunction = waitForLessThanAliveTyped
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = false
+ event.flowControlEvent.waitAmount = amount
+ event.flowControlEvent.waitEntityType = aiTypeId
+ return event
+}
+WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="")
+{
+ WaveEvent event
+ event.eventFunction = spawnDrones
+ event.executeOnThisCall = executeOnThisCall
+ event.nextEventIndex = nextEventIndex
+ event.shouldThread = true
+ event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE
+ event.spawnEvent.spawnAmount = 4
+ event.spawnEvent.origin = origin
+ event.spawnEvent.entityGlobalKey = entityGlobalKey
+ event.spawnEvent.route = route
+ return event
+}
+
+/************************************************************************************************************\
+####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # #####
+# # # # ## # # # # # ## # # # # # # # ## # # #
+# # # # # # # # # # # # # # # # # # # # # # #
+##### # # ##### # # # # ##### # # # # # # # # # # # # # #####
+# # # # # # # # # # # # # # # # # # # # # # #
+# # # # # ## # # # # # ## # # # # # # # ## # #
+####### # ####### # # # # ##### # # ##### # ### ####### # # #####
+\************************************************************************************************************/
+
+void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ printt("smoke")
+ SmokescreenStruct smokescreen
+ smokescreen.smokescreenFX = $"P_smokescreen_FD"
+ smokescreen.isElectric = false
+ smokescreen.origin = smokeEvent.position + < 0 , 0, 150>
+ smokescreen.angles = <0,0,0>
+ smokescreen.lifetime = smokeEvent.lifetime
+ smokescreen.fxXYRadius = 150
+ smokescreen.fxZRadius = 120
+ smokescreen.fxOffsets = [ <120.0, 0.0, 0.0>,<0.0, 120.0, 0.0>, <0.0, 0.0, 0.0>,<0.0, -120.0, 0.0>,< -120.0, 0.0, 0.0>, <0.0, 100.0, 0.0>]
+
+ Smokescreen(smokescreen)
+}
+void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ //TODO
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ array<vector> offsets = [ < 0, 32, 0 >, < 32, 0, 0 >, < 0, -32, 0 >, < -32, 0, 0 > ]
+
+
+ string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) )
+
+ for ( int i = 0; i < spawnEvent.spawnAmount; i++ )
+ {
+ entity guy
+
+ guy = CreateGenericDrone( TEAM_IMC, spawnEvent.origin + offsets[i], spawnEvent.angles )
+ SetSpawnOption_AISettings( guy, "npc_drone_plasma_fd" )
+
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy
+ SetTeam( guy, TEAM_IMC )
+ guy.DisableNPCFlag( NPC_ALLOW_INVESTIGATE )
+ guy.EnableNPCFlag(NPC_STAY_CLOSE_TO_SQUAD)
+ guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS | NPCMF_PREFER_SPRINT)
+ DispatchSpawn( guy )
+
+ //guy.GiveWeapon("mp_weapon_engineer_combat_drone")
+
+ SetSquad( guy, squadName )
+
+ SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.DRONE))
+ AddMinimapForHumans(guy)
+ spawnedNPCs.append(guy)
+ thread droneNav_thread(guy, spawnEvent.route, 0, 500, true)
+ }
+
+
+}
+
+void function waitForDeathOfEntitys(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ while(IsAlive(fd_harvester.harvester))
+ {
+ bool anyoneAlive = false
+ foreach(string key in flowControlEvent.waitGlobalDataKey )
+ {
+ if(!(key in GlobalEventEntitys))
+ continue
+ if(IsAlive(GlobalEventEntitys[key]))
+ anyoneAlive = true
+ }
+ if(!anyoneAlive)
+ break
+ }
+}
+
+void function waitForLessThanAliveTyped(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ while(IsAlive(fd_harvester.harvester))
+ {
+ int amount
+ foreach(entity npc in spawnedNPCs)
+ {
+ if(FD_GetAITypeID_ByString(npc.GetTargetName())) //TODO getaitypeid_bystring does not contain all possible strings
+ amount++
+ }
+ if(amount<=flowControlEvent.waitAmount)
+ break
+ WaitFrame()
+ }
+
+}
+
+void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles)
+ npc.DisableNPCFlag(NPC_ALLOW_INVESTIGATE | NPC_USE_SHOOTING_COVER|NPC_ALLOW_PATROL)
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ SetSpawnOption_AISettings(npc,"npc_titan_stryder_leadwall_arc")
+ spawnedNPCs.append(npc)
+ DispatchSpawn(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ npc.AssaultSetFightRadius(0)
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ thread singleNav_thread(npc,spawnEvent.route)
+ thread EMPTitanThinkConstant(npc)
+
+}
+
+void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ float waitUntil = Time() + flowControlEvent.waitTime
+ while(Time()<waitUntil)
+ {
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ WaitFrame()
+ }
+}
+
+void function waitUntilLessThanAmountAliveEvent(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ waitUntilLessThanAmountAlive(flowControlEvent.waitAmount)
+}
+void function waitUntilLessThanAmountAliveEventWeighted(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ waitUntilLessThanAmountAliveWeighted(flowControlEvent.waitAmount)
+}
+
+void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+
+ entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_super_spectre_fd")
+ spawnedNPCs.append(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ wait 4.7
+ DispatchSpawn(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType))
+ AddMinimapForHumans(npc)
+ thread SuperSpectre_WarpFall(npc)
+ npc.WaitSignal("WarpfallComplete")
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function spawnSuperSpectreWithMinion(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+
+ entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_super_spectre_fd")
+ spawnedNPCs.append(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ wait 4.7
+ DispatchSpawn(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType))
+ AddMinimapForHumans(npc)
+ thread SuperSpectre_WarpFall(npc)
+ npc.WaitSignal("WarpfallComplete")
+ thread ReaperMinionLauncherThink(npc)
+
+}
+
+void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity pod = CreateDropPod( spawnEvent.origin, <0,0,0> )
+ SetTeam( pod, TEAM_IMC )
+ InitFireteamDropPod( pod )
+ waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> )
+
+ string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) )
+ array<entity> guys
+ bool adychecked = false
+
+ for ( int i = 0; i < spawnEvent.spawnAmount; i++ )
+ {
+ entity guy
+
+ // should this grunt be a shield captain?
+ if (i < GetCurrentPlaylistVarInt("fd_grunt_shield_captains", 0))
+ guy = CreateShieldCaptain( TEAM_IMC, spawnEvent.origin,<0,0,0> )
+ else
+ guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> )
+
+
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy
+ SetTeam( guy, TEAM_IMC )
+ guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE )
+ guy.DisableNPCFlag( NPC_ALLOW_PATROL)
+ DispatchSpawn( guy )
+
+ guy.SetParent( pod, "ATTACH", true )
+ SetSquad( guy, squadName )
+
+ // should this grunt have an anti titan weapon instead of its normal weapon?
+ if (i < GetCurrentPlaylistVarInt("fd_grunt_at_weapon_users", 0))
+ {
+ guy.TakeActiveWeapon()
+ guy.GiveWeapon("mp_weapon_defender") // do grunts ever get a different anti titan weapon?
+ }
+
+ SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT))
+ AddMinimapForHumans(guy)
+ spawnedNPCs.append(guy)
+ guys.append( guy )
+ }
+
+ ActivateFireteamDropPod( pod, guys )
+ thread SquadNav_Thread( guys,spawnEvent.route )
+}
+
+void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity pod = CreateDropPod( spawnEvent.origin, <0,0,0> )
+ SetTeam( pod, TEAM_IMC )
+ InitFireteamDropPod( pod )
+ waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> )
+
+ string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) )
+ array<entity> guys
+ int difficultyLevel = FD_GetDifficultyLevel()
+
+ for ( int i = 0; i < spawnEvent.spawnAmount; i++ )
+ {
+ entity guy = CreateStalker( TEAM_IMC, spawnEvent.origin,<0,0,0> )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy
+ SetTeam( guy, TEAM_IMC )
+ guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE )
+ guy.DisableNPCFlag( NPC_ALLOW_PATROL)
+ SetSpawnOption_AISettings( guy, "npc_stalker_fd" )
+ DispatchSpawn( guy )
+
+ SetSquad( guy, squadName )
+ guy.AssaultSetFightRadius( 0 ) // makes them keep moving instead of stopping to shoot you.
+ AddMinimapForHumans(guy)
+ spawnedNPCs.append(guy)
+ SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER))
+ thread FDStalkerThink( guy , fd_harvester.harvester )
+ guys.append( guy )
+ }
+
+ switch ( difficultyLevel )
+ {
+ case eFDDifficultyLevel.EASY:
+ case eFDDifficultyLevel.NORMAL: // easy and normal stalkers have no weapons
+ foreach(npc in guys)
+ {
+ npc.TakeActiveWeapon()
+ npc.SetNoTarget( false )
+ npc.EnableNPCFlag( NPC_DISABLE_SENSING | NPC_IGNORE_ALL )
+ npc.SetEnemy( fd_harvester.harvester )
+ }
+ break
+ case eFDDifficultyLevel.HARD:
+ case eFDDifficultyLevel.MASTER:
+ case eFDDifficultyLevel.INSANE: // give all EPGs
+ foreach(npc in guys)
+ {
+ npc.TakeActiveWeapon()
+ npc.GiveWeapon( "mp_weapon_epg", [] )
+ npc.SetActiveWeaponByName( "mp_weapon_epg" )
+ }
+ break
+
+ default:
+ unreachable
+
+ }
+
+ ActivateFireteamDropPod( pod, guys )
+ SquadNav_Thread(guys,spawnEvent.route)
+
+}
+
+void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity pod = CreateDropPod( spawnEvent.origin, <0,0,0> )
+ SetTeam( pod, TEAM_IMC )
+ InitFireteamDropPod( pod )
+ waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> )
+
+ string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) )
+ array<entity> guys
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy
+ SetTeam( guy, TEAM_IMC )
+ DispatchSpawn( guy )
+
+ SetSquad( guy, squadName )
+ SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.SPECTRE_MORTAR))
+ AddMinimapForHumans(guy)
+ guys.append( guy )
+ }
+
+ ActivateFireteamDropPod( pod, guys )
+}
+
+void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ DispatchSpawn(npc)
+}
+
+void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles )
+ if( spawnEvent.aiSettings == "npc_titan_atlas_tracker_fd_sniper" )
+ SetTargetName( npc, "npc_titan_atlas_tracker" ) // required for client to create icons
+ SetSpawnOption_AISettings( npc, spawnEvent.aiSettings)
+ SetSpawnOption_Titanfall(npc)
+ DispatchSpawn(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+}
+
+
+void function SpawnIonTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_atlas",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_atlas_stickybomb_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function SpawnScorchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_ogre_meteor_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function SpawnRoninTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_stryder",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_stryder_leadwall_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function SpawnToneTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_atlas",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_atlas_tracker_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function SpawnLegionTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function SpawnMonarchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_atlas",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_atlas_vanguard_boss_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc, spawnEvent.route)
+}
+
+void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_nuke")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ npc.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS)
+ npc.AssaultSetFightRadius(0)
+ DispatchSpawn(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread singleNav_thread(npc,spawnEvent.route)
+ thread NukeTitanThink(npc,fd_harvester.harvester)
+
+}
+
+void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_atlas",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_atlas_tracker_mortar")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread MortarTitanThink(npc,fd_harvester.harvester)
+}
+
+void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_stryder",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_stryder_sniper_fd")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread SniperTitanThink(npc,fd_harvester.harvester)
+
+}
+
+void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity npc = CreateNPCTitan("titan_atlas",TEAM_IMC, spawnEvent.origin, spawnEvent.angles)
+ SetSpawnOption_AISettings(npc,"npc_titan_atlas_tracker_fd_sniper")
+ SetSpawnOption_Titanfall(npc)
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons
+ DispatchSpawn( npc )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ npc.AssaultSetFightRadius(0)
+ spawnedNPCs.append(npc)
+ AddMinimapForTitans(npc)
+ npc.WaitSignal( "TitanHotDropComplete" )
+ npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true )
+ thread SniperTitanThink(npc,fd_harvester.harvester)
+}
+
+void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, fd_harvester.harvester.GetOrigin() )
+ spawnedNPCs.append(npc)
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc
+ SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType))
+ AddMinimapForHumans(npc)
+}
+
+void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent)
+{
+ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0)
+ entity pod = CreateDropPod( spawnEvent.origin, <0,0,0> )
+ SetTeam( pod, TEAM_IMC )
+ InitFireteamDropPod( pod )
+ waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> )
+
+ string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) )
+ array<entity> guys
+
+ for ( int i = 0; i < spawnEvent.spawnAmount; i++ )
+ {
+ entity guy = CreateFragDrone( TEAM_IMC, spawnEvent.origin, <0,0,0> )
+ if(spawnEvent.entityGlobalKey!="")
+ GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy
+ SetSpawnOption_AISettings(guy, "npc_frag_drone_fd")
+ SetTeam( guy, TEAM_IMC )
+ guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE )
+ guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS | NPCMF_PREFER_SPRINT)
+ DispatchSpawn( guy )
+ AddMinimapForHumans(guy)
+ SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.TICK))
+ SetSquad( guy, squadName )
+ spawnedNPCs.append(guy)
+
+ guys.append( guy )
+ }
+
+ ActivateFireteamDropPod( pod, guys )
+ thread SquadNav_Thread(guys,spawnEvent.route)
+}
+
+
+
+/****************************************************************************************\
+####### # # ####### # # ####### # # ####### # ###### ####### ######
+# # # # ## # # # # # # # # # # #
+# # # # # # # # # # # # # # # # #
+##### # # ##### # # # # ####### ##### # ###### ##### ######
+# # # # # # # # # # # # # # # #
+# # # # # ## # # # # # # # # #
+####### # ####### # # # # # ####### ####### # ####### # #
+\****************************************************************************************/
+
+
+void function PingMinimap(float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex)
+{
+ foreach(entity player in GetPlayerArray())
+ {
+ Remote_CallFunction_NonReplay(player, "ServerCallback_FD_PingMinimap", x, y, duration, spreadRadius, ringRadius, colorIndex)
+ }
+}
+
+void function waitUntilLessThanAmountAlive(int amount)
+{
+ int deduct = 0
+ foreach (entity npc in spawnedNPCs)
+ {
+ if( !IsValid(npc) )
+ {
+ deduct++
+ continue
+ }
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ {
+ deduct++
+ continue
+ }
+ if(npc.GetTeam()==TEAM_MILITIA)
+ {
+ deduct++
+ continue
+ }
+ }
+ int aliveNPCs = spawnedNPCs.len() -deduct
+ while(aliveNPCs>amount)
+ {
+ WaitFrame()
+ deduct = 0
+ foreach (entity npc in spawnedNPCs)
+ {
+ if( !IsValid(npc) )
+ {
+ deduct++
+ continue
+ }
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ {
+ deduct++
+ continue
+ }
+ if(npc.GetTeam()==TEAM_MILITIA)
+ {
+ deduct++
+ continue
+ }
+ }
+ aliveNPCs = spawnedNPCs.len() -deduct
+
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ }
+}
+
+void function waitUntilLessThanAmountAliveWeighted(int amount,int humanWeight=1,int reaperWeight=3, int titanWeight=5)
+{
+
+ int aliveNPCsWeighted = 0;
+ foreach(npc in spawnedNPCs)
+ {
+ if(!IsValid(npc))
+ continue
+
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ continue
+
+ if(npc.GetTeam()==TEAM_MILITIA)
+ continue
+
+ if(npc.IsTitan())
+ aliveNPCsWeighted += titanWeight
+ else if(npc.GetTargetName()=="reaper")
+ aliveNPCsWeighted += reaperWeight
+ else
+ aliveNPCsWeighted += humanWeight
+ }
+ while(aliveNPCsWeighted>amount)
+ {
+ WaitFrame()
+ aliveNPCsWeighted = 0;
+ foreach(npc in spawnedNPCs)
+ {
+ if(!IsValid(npc))
+ continue
+
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ continue
+
+ if(npc.GetTeam()==TEAM_MILITIA)
+ continue
+
+ if(npc.IsTitan())
+ aliveNPCsWeighted += titanWeight
+ else if(npc.GetTargetName()=="reaper")
+ aliveNPCsWeighted += reaperWeight
+ else
+ aliveNPCsWeighted += humanWeight
+ }
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ }
+}
+
+void function waitUntilLessThanAmountAlive_expensive(int amount)
+{
+
+ array<entity> npcs = GetNPCArray()
+ int deduct = 0
+ foreach (entity npc in npcs)
+ {
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ {
+ deduct++
+ continue
+ }
+ if(npc.GetTeam()==TEAM_MILITIA)
+ {
+ deduct++
+ continue
+ }
+ }
+
+ int aliveTitans = npcs.len() - deduct
+ while(aliveTitans>amount)
+ {
+ WaitFrame()
+ npcs = GetNPCArray()
+ deduct = 0
+ foreach(entity npc in npcs)
+ {
+ if( IsValid( GetPetTitanOwner( npc ) ) )
+ {
+ deduct++
+ continue
+ }
+ if(npc.GetTeam()==TEAM_MILITIA)
+ {
+ deduct++
+ continue
+ }
+ }
+ aliveTitans = GetNPCArray().len() - deduct
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ }
+}
+
+void function AddMinimapForTitans(entity titan)
+{
+ titan.Minimap_SetAlignUpright( true )
+ titan.Minimap_AlwaysShow( TEAM_IMC, null )
+ titan.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ titan.Minimap_SetHeightTracking( true )
+ titan.Minimap_SetCustomState( eMinimapObject_npc_titan.AT_BOUNTY_BOSS )
+}
+
+// including drones
+void function AddMinimapForHumans(entity human)
+{
+ human.Minimap_SetAlignUpright( true )
+ human.Minimap_AlwaysShow( TEAM_IMC, null )
+ human.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ human.Minimap_SetHeightTracking( true )
+ human.Minimap_SetCustomState( eMinimapObject_npc.AI_TDM_AI )
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut
new file mode 100644
index 00000000..06753f78
--- /dev/null
+++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut
@@ -0,0 +1,270 @@
+global function singleNav_thread
+global function SquadNav_Thread
+global function droneNav_thread
+global function getRoute
+global function Dev_MarkRoute
+
+
+
+void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0, bool shouldLoop = false)
+{
+ npc.EndSignal( "OnDeath" )
+ npc.EndSignal( "OnDestroy" )
+
+
+
+ if(!npc.IsNPC()){
+ return
+ }
+
+
+
+ /*array<entity> routeArray = getRoute(routeName)
+ WaitFrame()//so other code setting up what happens on signals is run before this
+ if(routeArray.len()==0)
+ {
+
+ npc.Signal("OnFailedToPath")
+ return
+ }
+ int skippedNodes = 0
+ foreach(entity node in routeArray)
+ {
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ if(skippedNodes < nodesToSkip)
+ {
+ skippedNodes++
+ continue
+ }
+ npc.AssaultPoint(node.GetOrigin())
+ npc.AssaultSetGoalRadius( 50 )
+ int i = 0
+ table result = npc.WaitSignal("OnFinishedAssault","OnFailedToPath")
+ if(result.signal == "OnFailedToPath")
+ break
+ }*/
+
+ // NEW STUFF
+ WaitFrame() // so other code setting up what happens on signals is run before this
+
+ entity targetNode
+ if ( routeName == "" )
+ {
+ float dist = 1000000000
+ foreach ( entity node in routeNodes )
+ {
+ if( !node.HasKey("route_name") )
+ continue
+ if ( Distance( npc.GetOrigin(), node.GetOrigin() ) < dist )
+ {
+ dist = Distance( npc.GetOrigin(), node.GetOrigin() )
+ targetNode = node
+ }
+ }
+ printt("Entity had no route defined: using nearest node: " + targetNode.kv.route_name)
+ }
+ else
+ {
+ targetNode = GetRouteStart( routeName )
+ }
+
+ // skip nodes
+ for ( int i = 0; i < nodesToSkip; i++ )
+ {
+ targetNode = targetNode.GetLinkEnt()
+ }
+
+
+ while ( targetNode != null )
+ {
+ if( !IsAlive( fd_harvester.harvester ) )
+ return
+ npc.AssaultPoint( targetNode.GetOrigin() )
+ npc.AssaultSetGoalRadius( nextDistance )
+ npc.AssaultSetFightRadius( 0 )
+
+ table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" )
+
+ targetNode = targetNode.GetLinkEnt()
+ }
+
+ npc.Signal("FD_ReachedHarvester")
+}
+
+void function SquadNav_Thread( array<entity> npcs ,string routeName,int nodesToSkip = 0,float nextDistance = 200.0 )
+{
+ //TODO this function wont stop when noone alive anymore also it only works half of the time
+ /*
+ array<entity> routeArray = getRoute(routeName)
+ WaitFrame()//so other code setting up what happens on signals is run before this
+ if(routeArray.len()==0)
+ return
+
+ int nodeIndex = 0
+ foreach(entity node in routeArray)
+ {
+ if(!IsAlive(fd_harvester.harvester))
+ return
+ if(nodeIndex++ < nodesToSkip)
+ continue
+
+ SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance)
+
+ }*/
+ // NEW STUFF
+ WaitFrame() // so other code setting up what happens on signals is run before this
+
+ entity targetNode
+ if ( routeName == "" )
+ {
+ float dist = 1000000000
+ foreach ( entity node in routeNodes )
+ {
+ if( !node.HasKey("route_name") )
+ continue
+ if ( Distance( npcs[0].GetOrigin(), node.GetOrigin() ) < dist )
+ {
+ dist = Distance( npcs[0].GetOrigin(), node.GetOrigin() )
+ targetNode = node
+ }
+ }
+ printt("Entity had no route defined: using nearest node: " + targetNode.kv.route_name)
+ }
+ else
+ {
+ targetNode = GetRouteStart( routeName )
+ }
+
+ // skip nodes
+ for ( int i = 0; i < nodesToSkip; i++ )
+ {
+ targetNode = targetNode.GetLinkEnt()
+ }
+
+
+ while ( targetNode != null )
+ {
+ if( !IsAlive( fd_harvester.harvester ) )
+ return
+ SquadAssaultOrigin(npcs,targetNode.GetOrigin(),nextDistance)
+
+ targetNode = targetNode.GetLinkEnt()
+ }
+
+}
+
+void function droneNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0, bool shouldLoop = false)
+{
+ npc.EndSignal( "OnDeath" )
+ npc.EndSignal( "OnDestroy" )
+
+ if(!npc.IsNPC()){
+ return
+ }
+
+ // NEW STUFF
+ WaitFrame() // so other code setting up what happens on signals is run before this
+
+ entity targetNode
+ entity firstNode
+ if ( routeName == "" )
+ {
+ float dist = 1000000000
+ foreach ( entity node in routeNodes )
+ {
+ if( !node.HasKey("route_name") )
+ continue
+ if ( Distance( npc.GetOrigin(), node.GetOrigin() ) < dist )
+ {
+ dist = Distance( npc.GetOrigin(), node.GetOrigin() )
+ targetNode = node
+ firstNode = node
+ }
+ }
+ printt("Entity had no route defined: using nearest node: " + targetNode.kv.route_name)
+ }
+ else
+ {
+ targetNode = GetRouteStart( routeName )
+ }
+
+ // skip nodes
+ for ( int i = 0; i < nodesToSkip; i++ )
+ {
+ targetNode = targetNode.GetLinkEnt()
+ firstNode = targetNode.GetLinkEnt()
+ }
+
+
+ while ( targetNode != null )
+ {
+ if( !IsAlive( fd_harvester.harvester ) )
+ return
+ npc.AssaultPoint( targetNode.GetOrigin() + <0, 0, 300> )
+ npc.AssaultSetGoalRadius( nextDistance )
+ npc.AssaultSetGoalHeight( 100 )
+ npc.AssaultSetFightRadius( 0 )
+
+ table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" )
+
+ targetNode = targetNode.GetLinkEnt()
+ if ( targetNode == null )
+ printt("entity finished pathing")
+ if ( targetNode == null && shouldLoop )
+ {
+ printt("entity reached end of loop, looping")
+ targetNode = firstNode
+ }
+ }
+
+ npc.Signal("FD_ReachedHarvester")
+}
+
+entity function GetRouteStart( string routeName )
+{
+ foreach( entity node in routeNodes )
+ {
+ if( !node.HasKey("route_name") )
+ continue
+ if( expect string( node.kv.route_name ) == routeName )
+ {
+ return node
+ }
+ }
+}
+
+array<entity> function getRoute(string routeName)
+{
+ array<entity> ret
+ array<entity> currentNode = []
+ foreach(entity node in routeNodes)
+ {
+ if(!node.HasKey("route_name"))
+ continue
+ if(node.kv.route_name==routeName)
+ {
+ currentNode = [node]
+ break
+ }
+
+ }
+ if(currentNode.len()==0)
+ {
+ printt("Route not found")
+ return []
+ }
+ while(currentNode.len()!=0)
+ {
+ ret.append(currentNode[0])
+ currentNode = currentNode[0].GetLinkEntArray()
+ }
+ return ret
+}
+
+void function Dev_MarkRoute(string routename){
+ foreach(entity e in getRoute(routename))
+ {
+ DebugDrawSphere(e.GetOrigin(),30.0,255,0,255,false,40)
+ }
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/item_inventory/sv_item_inventory.gnut b/Northstar.CustomServers/mod/scripts/vscripts/item_inventory/sv_item_inventory.gnut
index 4e8f85ac..496ebf84 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/item_inventory/sv_item_inventory.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/item_inventory/sv_item_inventory.gnut
@@ -87,6 +87,10 @@ void function PlayerInventory_GiveInventoryItem( entity player, InventoryItem in
PlayerInventory_TakeInventoryItem( player )
player.GiveOffhandWeapon( inventoryItem.weaponRef, OFFHAND_INVENTORY, mods )
+ if ( inventoryItem.itemType == eInventoryItemType.burnmeter ) {
+ entity weapon = player.GetOffhandWeapon(OFFHAND_INVENTORY)
+ weapon.e.burnReward = inventoryItem.burnReward.ref
+ }
}
void function PlayerInventory_PushInventoryItem( entity player, InventoryItem inventoryItem )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city.nut
index 8b2a4060..4ff36dbf 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city.nut
@@ -25,6 +25,12 @@ void function CodeCallback_MapInit()
// there are some really busted titan startspawns that are on the fucking other side of the map from where they should be, so we remove them
AddSpawnCallback( "info_spawnpoint_titan_start", TrimBadTitanStartSpawns )
AddSpawnCallback( "sky_camera", FixSkycamFog )
+
+
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+
}
void function FixBatterySpawns( entity spawn )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal.nut
index 2e35417f..0c12ad18 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal.nut
@@ -4,6 +4,11 @@ void function CodeCallback_MapInit()
{
// there are some really busted titan startspawns that are on the fucking other side of the map from where they should be, so we remove them
AddSpawnCallback( "info_spawnpoint_titan_start", TrimBadTitanStartSpawns )
+
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+
}
void function TrimBadTitanStartSpawns( entity spawn )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut
index 0079d7e9..02b11010 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut
@@ -16,4 +16,10 @@ void function CreateEvacNodes()
AddEvacNode( CreateScriptRef( < -1035.991211, -671.114380, 824.180908 >, < 16.220453, -24.511070, 0 > ) )
SetEvacSpaceNode( GetEnt( "intro_spacenode" ) )
+
+
+
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut
index 37b89169..4bd40ff1 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut
@@ -1 +1,8 @@
-//fuck \ No newline at end of file
+global function CodeCallback_MapInit
+
+void function CodeCallback_MapInit()
+{
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai.nut
index 345a86d9..81d11795 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai.nut
@@ -1,5 +1,6 @@
global function CodeCallback_MapInit
+
struct {
int batteryIndex = 0
} file
@@ -14,6 +15,9 @@ void function CodeCallback_MapInit()
{
// Battery spawns (in LTS/Free Agents) are in old locations, so we move them to the proper locations
AddSpawnCallbackEditorClass( "script_ref", "script_power_up_other", FixBatterySpawns )
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
}
void function FixBatterySpawns( entity spawn )
@@ -24,4 +28,4 @@ void function FixBatterySpawns( entity spawn )
PowerUp powerupDef = GetPowerUpFromItemRef( expect string( spawn.kv.powerUpType ) )
if ( powerupDef.spawnFunc() )
spawn.SetOrigin( BATTERY_SPAWNS[file.batteryIndex++] )
-} \ No newline at end of file
+}
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut
index 37b89169..b1c67fd6 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut
@@ -1 +1,601 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+
+
+void function initFrontierDefenseData()
+{
+ shopPosition = < -3862.13, 1267.69, 1060.06 >
+
+ array<WaveEvent> wave1
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",1))
+ wave1.append(CreateWaitForTimeEvent(0.9332962,2))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",3))
+ wave1.append(CreateWaitForTimeEvent(1.1667023,4))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",5))
+ wave1.append(CreateWaitForTimeEvent(1.0499954,6))
+ wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",7))
+ wave1.append(CreateWaitForTimeEvent(1.0,8))
+ wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",9))
+ wave1.append(CreateWaitForTimeEvent(5.0,10))
+ wave1.append(CreateWaitUntilAliveEvent(4,11))
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",12))
+ wave1.append(CreateWaitForTimeEvent(1.1669998,13))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",14))
+ wave1.append(CreateWaitForTimeEvent(0.6159973,15))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",16))
+ wave1.append(CreateWaitForTimeEvent(0.8840027,17))
+ wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",18))
+ wave1.append(CreateWaitForTimeEvent(0.5999985,19))
+ wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",20))
+ wave1.append(CreateWaitForTimeEvent(5.0,21))
+ wave1.append(CreateWaitUntilAliveEvent(4,22))
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",23))
+ wave1.append(CreateWaitForTimeEvent(1.3829956,24))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",25))
+ wave1.append(CreateWaitForTimeEvent(0.6340027,26))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",27))
+ wave1.append(CreateWaitForTimeEvent(1.3829956,28))
+ wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",29))
+ wave1.append(CreateWaitForTimeEvent(1.5,30))
+ wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",31))
+ wave1.append(CreateWaitForTimeEvent(5.0,32))
+ wave1.append(CreateWaitUntilAliveEvent(4,33))
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",34))
+ wave1.append(CreateWaitForTimeEvent(1.5,35))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",36))
+ wave1.append(CreateWaitForTimeEvent(0.9840088,37))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",38))
+ wave1.append(CreateWaitForTimeEvent(1.5,39))
+ wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",40))
+ wave1.append(CreateWaitForTimeEvent(1.2829895,41))
+ wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",42))
+ wave1.append(CreateWaitForTimeEvent(5.0,43))
+ wave1.append(CreateWaitUntilAliveEvent(4,44))
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",45))
+ wave1.append(CreateWaitForTimeEvent(1.5,46))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",47))
+ wave1.append(CreateWaitForTimeEvent(1.1829987,48))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",49))
+ wave1.append(CreateWaitForTimeEvent(1.449997,50))
+ wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",51))
+ wave1.append(CreateWaitForTimeEvent(0.66700745,52))
+ wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",53))
+ wave1.append(CreateWaitForTimeEvent(5.0,54))
+ wave1.append(CreateWaitUntilAliveEvent(4,55))
+ wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",56))
+ wave1.append(CreateWaitForTimeEvent(1.2169952,57))
+ wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",58))
+ wave1.append(CreateWaitForTimeEvent(0.6159973,59))
+ wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",60))
+ wave1.append(CreateWaitForTimeEvent(1.4840088,61))
+ wave1.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,0))
+ waveEvents.append(wave1)
+ array<WaveEvent> wave2
+ wave2.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",1))
+ wave2.append(CreateWaitForTimeEvent(1.0169983,2))
+ wave2.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",3))
+ wave2.append(CreateWaitForTimeEvent(1.6500244,4))
+ wave2.append(CreateDroppodTickEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,4,"hillRouteClose",5))
+ wave2.append(CreateWaitForTimeEvent(1.0329895,6))
+ wave2.append(CreateDroppodTickEvent(< 1258.060059 , 921.593994 , 1330.750000 >,4,"hillRouteClose",7))
+ wave2.append(CreateWaitForTimeEvent(5.0,8))
+ wave2.append(CreateWaitUntilAliveEvent(4,9))
+ wave2.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,10))
+ wave2.append(CreateWaitForTimeEvent(1.0159912,11))
+ wave2.append(CreateToneSniperTitanEvent(< 1209.469971 , 579.406006 , 1332.310059 >,< 0.000000 , 169.541000 , 0.000000 >,12))
+ wave2.append(CreateWaitForTimeEvent(0.8999939,13))
+ wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",14))
+ wave2.append(CreateWaitForTimeEvent(1.3000183,15))
+ wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",16))
+ wave2.append(CreateWaitForTimeEvent(1.1499939,17))
+ wave2.append(CreateDroppodSpectreMortarEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",18))
+ wave2.append(CreateWaitForTimeEvent(5.0,19))
+ wave2.append(CreateWaitUntilAliveEvent(4,20))
+ wave2.append(CreateDroppodSpectreMortarEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",21))
+ wave2.append(CreateWaitForTimeEvent(0.6000061,22))
+ wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",23))
+ wave2.append(CreateWaitForTimeEvent(1.6999817,24))
+ wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",25))
+ wave2.append(CreateWaitForTimeEvent(2.9160156,26))
+ wave2.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",27))
+ wave2.append(CreateWaitForTimeEvent(5.0,28))
+ wave2.append(CreateWaitUntilAliveEvent(4,29))
+ wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",30))
+ wave2.append(CreateWaitForTimeEvent(0.8659973,31))
+ wave2.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",32))
+ wave2.append(CreateWaitForTimeEvent(0.6839905,33))
+ wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",34))
+ wave2.append(CreateWaitForTimeEvent(1.4160156,35))
+ wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",36))
+ wave2.append(CreateWaitForTimeEvent(0.6000061,37))
+ wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",38))
+ wave2.append(CreateWaitForTimeEvent(5.0,39))
+ wave2.append(CreateWaitUntilAliveEvent(4,40))
+ wave2.append(CreateSuperSpectreEvent(< 1856.959961 , -3177.639893 , 812.718018 >,< -0.000000 , -162.389999 , 0.000000 >,"",41))
+ wave2.append(CreateWaitForTimeEvent(1.03302,42))
+ wave2.append(CreateSuperSpectreEvent(< 3123.000000 , 4201.589844 , 950.937988 >,< 0.000000 , -117.246002 , 0.000000 >,"",43))
+ wave2.append(CreateWaitForTimeEvent(3.6169739,44))
+ wave2.append(CreateSuperSpectreEvent(< 681.140991 , -3538.780029 , 813.127014 >,< 0.000000 , -169.145996 , 0.000000 >,"",45))
+ wave2.append(CreateWaitForTimeEvent(0.78302,46))
+ wave2.append(CreateSuperSpectreEvent(< 2614.629883 , 4771.560059 , 947.968994 >,< 0.000000 , -141.108002 , 0.000000 >,"",47))
+ wave2.append(CreateWaitForTimeEvent(3.1829834,48))
+ wave2.append(CreateSuperSpectreEvent(< 2184.969971 , -3550.040039 , 819.479980 >,< 0.000000 , 177.582993 , 0.000000 >,"",49))
+ wave2.append(CreateWaitForTimeEvent(5.0,50))
+ wave2.append(CreateWaitUntilAliveEvent(4,51))
+ wave2.append(CreateSuperSpectreEvent(< 1764.410034 , 4424.220215 , 953.375000 >,< -0.000000 , -170.024002 , 0.000000 >,"",52))
+ wave2.append(CreateWaitForTimeEvent(5.0,53))
+ wave2.append(CreateWaitUntilAliveEvent(4,54))
+ wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",55))
+ wave2.append(CreateWaitForTimeEvent(1.1499939,56))
+ wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",57))
+ wave2.append(CreateWaitForTimeEvent(5.0,58))
+ wave2.append(CreateWaitUntilAliveEvent(4,59))
+ wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",60))
+ wave2.append(CreateWaitForTimeEvent(1.1170044,61))
+ wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",62))
+ wave2.append(CreateWaitForTimeEvent(0.8829956,63))
+ wave2.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",64))
+ wave2.append(CreateWaitForTimeEvent(3.5169983,65))
+ wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",66))
+ wave2.append(CreateWaitForTimeEvent(5.0,67))
+ wave2.append(CreateWaitUntilAliveEvent(4,68))
+ wave2.append(CreateDroppodGruntEvent(< 3248.840088 , 161.156006 , 951.781006 >,"",69))
+ wave2.append(CreateWaitForTimeEvent(2.6660156,70))
+ wave2.append(CreateDroppodGruntEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",71))
+ wave2.append(CreateWaitForTimeEvent(1.1999817,72))
+ wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",73))
+ wave2.append(CreateWaitForTimeEvent(5.0,74))
+ wave2.append(CreateWaitUntilAliveEvent(4,75))
+ wave2.append(CreateSuperSpectreEvent(< 4163.069824 , 1471.650024 , 944.281006 >,< -0.000000 , -179.416000 , 0.000000 >,"",76))
+ wave2.append(CreateWaitForTimeEvent(1.5159912,77))
+ wave2.append(CreateSuperSpectreEvent(< 4210.669922 , 895.575989 , 944.281006 >,< -0.000000 , -164.787003 , 0.000000 >,"",78))
+ wave2.append(CreateWaitForTimeEvent(2.75,79))
+ wave2.append(CreateSuperSpectreEvent(< 3577.010010 , 1491.959961 , 944.281006 >,< -0.000000 , 169.908005 , 0.000000 >,"",80))
+ wave2.append(CreateWaitForTimeEvent(1.1340027,81))
+ wave2.append(CreateSuperSpectreEvent(< 3982.860107 , 1778.540039 , 944.281006 >,< -0.000000 , 179.488007 , 0.000000 >,"",82))
+ wave2.append(CreateWaitForTimeEvent(5.0,83))
+ wave2.append(CreateWaitUntilAliveEvent(4,84))
+ wave2.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",85))
+ wave2.append(CreateWaitForTimeEvent(1.3840027,86))
+ wave2.append(CreateDroppodGruntEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",87))
+ wave2.append(CreateWaitForTimeEvent(5.0,88))
+ wave2.append(CreateWaitUntilAliveEvent(4,89))
+ wave2.append(CreateSuperSpectreEvent(< 2182.939941 , -3549.810059 , 819.468994 >,< 0.000000 , 177.582993 , 0.000000 >,"",90))
+ wave2.append(CreateWaitForTimeEvent(0.1159668,91))
+ wave2.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",92))
+ wave2.append(CreateWaitForTimeEvent(0.5670166,93))
+ wave2.append(CreateSuperSpectreEvent(< 2357.739990 , 4476.339844 , 962.960022 >,< -0.000000 , 177.669998 , 0.000000 >,"",94))
+ wave2.append(CreateWaitForTimeEvent(0.7000122,95))
+ wave2.append(CreateDroppodGruntEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",96))
+ wave2.append(CreateWaitForTimeEvent(5.0,97))
+ wave2.append(CreateWaitUntilAliveEvent(4,98))
+ wave2.append(CreateSuperSpectreEvent(< 2343.590088 , -3185.840088 , 788.312988 >,< -0.000000 , 174.550995 , 0.000000 >,"",99))
+ wave2.append(CreateWaitForTimeEvent(0.8500366,100))
+ wave2.append(CreateSuperSpectreEvent(< 2338.270020 , 4684.279785 , 952.682007 >,< -0.000000 , -167.669006 , 0.000000 >,"",101))
+ wave2.append(CreateWaitForTimeEvent(5.0,102))
+ wave2.append(CreateWaitUntilAliveEvent(4,103))
+ wave2.append(CreateSuperSpectreEvent(< 2177.209961 , -3539.600098 , 817.719971 >,< 0.000000 , 178.065994 , 0.000000 >,"",104))
+ wave2.append(CreateWaitForTimeEvent(1.0,105))
+ wave2.append(CreateSuperSpectreEvent(< 2401.719971 , 4475.089844 , 962.406006 >,< 0.000000 , 177.626999 , 0.000000 >,"",106))
+ wave2.append(CreateWaitForTimeEvent(0.0,107))
+ wave2.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",108))
+ wave2.append(CreateWaitForTimeEvent(1.032959,109))
+ wave2.append(CreateSuperSpectreEvent(< 2576.909912 , -3007.250000 , 796.093994 >,< 0.000000 , -165.850006 , 0.000000 >,"",110))
+ wave2.append(CreateWaitForTimeEvent(0.28302002,111))
+ wave2.append(CreateIonTitanEvent(< 2614.879883 , 4771.560059 , 951.000000 >,< 0.000000 , -141.108002 , 0.000000 >,"",112))
+ wave2.append(CreateWaitForTimeEvent(0.7839966,113))
+ wave2.append(CreateSuperSpectreEvent(< 2828.399902 , 4138.450195 , 938.893982 >,< 0.000000 , -171.078995 , 0.000000 >,"",114))
+ wave2.append(CreateWaitForTimeEvent(5.0,115))
+ wave2.append(CreateWaitUntilAliveEvent(4,116))
+ wave2.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",117))
+ wave2.append(CreateWaitForTimeEvent(5.0,118))
+ wave2.append(CreateWaitUntilAliveEvent(4,119))
+ wave2.append(CreateSuperSpectreEvent(< 4182.189941 , 917.906006 , 944.281006 >,< 0.000000 , -124.805000 , 0.000000 >,"",120))
+ wave2.append(CreateWaitForTimeEvent(1.3170166,121))
+ wave2.append(CreateSuperSpectreEvent(< 2747.790039 , 1574.170044 , 944.281006 >,< -0.000000 , -164.485001 , 0.000000 >,"",122))
+ wave2.append(CreateWaitForTimeEvent(5.0,123))
+ wave2.append(CreateWaitUntilAliveEvent(4,124))
+ wave2.append(CreateScorchTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",125))
+ wave2.append(CreateWaitForTimeEvent(1.0,126))
+ wave2.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",127))
+ wave2.append(CreateWaitForTimeEvent(0.1159668,128))
+ wave2.append(CreateSuperSpectreEvent(< 2169.590088 , -3540.250000 , 817.875000 >,< -0.000000 , 178.065002 , 0.000000 >,"",129))
+ wave2.append(CreateWaitForTimeEvent(1.3840332,130))
+ wave2.append(CreateSuperSpectreEvent(< 2354.810059 , 4476.589844 , 962.968994 >,< -0.000000 , 177.759003 , 0.000000 >,"",0))
+ waveEvents.append(wave2)
+ array<WaveEvent> wave3
+ wave3.append(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",1))
+ wave3.append(CreateWaitForTimeEvent(0.7670288,2))
+ wave3.append(CreateSpawnDroneEvent(< 1883.910034 , -1569.939941 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,"",3))
+ wave3.append(CreateWaitForTimeEvent(1.1499634,4))
+ wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",5))
+ wave3.append(CreateWaitForTimeEvent(1.3829956,6))
+ wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",7))
+ wave3.append(CreateWaitForTimeEvent(3.4000244,8))
+ wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",9))
+ wave3.append(CreateWaitForTimeEvent(1.1170044,10))
+ wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",11))
+ wave3.append(CreateWaitForTimeEvent(5.0,12))
+ wave3.append(CreateWaitUntilAliveEvent(4,13))
+ wave3.append(CreateSuperSpectreEvent(< 2170.020020 , -3549.570068 , 819.468994 >,< -0.000000 , 177.626007 , 0.000000 >,"",14))
+ wave3.append(CreateWaitForTimeEvent(1.0669556,15))
+ wave3.append(CreateSuperSpectreEvent(< 2577.060059 , -3007.379883 , 796.093994 >,< -0.000000 , -165.850006 , 0.000000 >,"",16))
+ wave3.append(CreateWaitForTimeEvent(1.1329956,17))
+ wave3.append(CreateSuperSpectreEvent(< 1512.939941 , -3294.090088 , 798.000000 >,< -0.000000 , 89.077103 , 0.000000 >,"",18))
+ wave3.append(CreateWaitForTimeEvent(1.4000244,19))
+ wave3.append(CreateSuperSpectreEvent(< 1531.000000 , -1779.880005 , 800.031006 >,< 0.000000 , 133.110001 , 0.000000 >,"",20))
+ wave3.append(CreateWaitForTimeEvent(5.0,21))
+ wave3.append(CreateWaitUntilAliveEvent(4,22))
+ wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",23))
+ wave3.append(CreateWaitForTimeEvent(0.6829834,24))
+ wave3.append(CreateIonTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",25))
+ wave3.append(CreateWaitForTimeEvent(0.7839966,26))
+ wave3.append(CreateIonTitanEvent(< 1503.810059 , -3600.189941 , 813.687988 >,< 0.000000 , 90.000000 , 0.000000 >,"",27))
+ wave3.append(CreateWaitForTimeEvent(1.0,28))
+ wave3.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",29))
+ wave3.append(CreateWaitForTimeEvent(5.0,30))
+ wave3.append(CreateWaitUntilAliveEvent(4,31))
+ wave3.append(CreateSpawnDroneEvent(< 2487.310059 , -2561.379883 , 5744.229980 >,< 0.004999 , 90.003700 , 0.000004 >,"",32))
+ wave3.append(CreateWaitForTimeEvent(0.0,33))
+ wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",34))
+ wave3.append(CreateWaitForTimeEvent(0.0,35))
+ wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",36))
+ wave3.append(CreateWaitForTimeEvent(0.0,37))
+ wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",38))
+ wave3.append(CreateWaitForTimeEvent(5.0,39))
+ wave3.append(CreateWaitUntilAliveEvent(4,40))
+ wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",41))
+ wave3.append(CreateWaitForTimeEvent(1.282959,42))
+ wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",43))
+ wave3.append(CreateWaitForTimeEvent(2.6170044,44))
+ wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",45))
+ wave3.append(CreateWaitForTimeEvent(0.9660034,46))
+ wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",47))
+ wave3.append(CreateWaitForTimeEvent(1.0999756,48))
+ wave3.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,49))
+ wave3.append(CreateWaitForTimeEvent(0.6170044,50))
+ wave3.append(CreateMonarchTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",51))
+ wave3.append(CreateWaitForTimeEvent(5.0,52))
+ wave3.append(CreateWaitUntilAliveEvent(4,53))
+ wave3.append(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",54))
+ wave3.append(CreateWaitForTimeEvent(0.61602783,55))
+ wave3.append(CreateRoninTitanEvent(< 2359.840088 , -1596.750000 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",56))
+ wave3.append(CreateWaitForTimeEvent(1.9840088,57))
+ wave3.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",58))
+ wave3.append(CreateWaitForTimeEvent(1.0999756,59))
+ wave3.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",60))
+ wave3.append(CreateWaitForTimeEvent(5.0,61))
+ wave3.append(CreateWaitUntilAliveEvent(4,62))
+ wave3.append(CreateSuperSpectreEvent(< 2180.080078 , -3539.689941 , 817.739014 >,< 0.000000 , 178.065994 , 0.000000 >,"",63))
+ wave3.append(CreateWaitForTimeEvent(0.6329956,64))
+ wave3.append(CreateLegionTitanEvent(< 2680.219971 , -1724.630005 , 809.718994 >,< 0.000000 , 169.320999 , 0.000000 >,"",65))
+ wave3.append(CreateWaitForTimeEvent(0.06695557,66))
+ wave3.append(CreateSuperSpectreEvent(< 2533.800049 , -3018.310059 , 795.421021 >,< 0.000000 , -165.806000 , 0.000000 >,"",67))
+ wave3.append(CreateWaitForTimeEvent(1.0170288,68))
+ wave3.append(CreateLegionTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",69))
+ wave3.append(CreateWaitForTimeEvent(0.16601562,70))
+ wave3.append(CreateSuperSpectreEvent(< 1512.839966 , -3298.719971 , 797.968994 >,< -0.000000 , 89.120796 , 0.000000 >,"",71))
+ wave3.append(CreateWaitForTimeEvent(1.0,72))
+ wave3.append(CreateSuperSpectreEvent(< 1499.910034 , -1748.660034 , 801.656006 >,< -0.000000 , 132.934998 , 0.000000 >,"",73))
+ wave3.append(CreateWaitForTimeEvent(2.2340088,74))
+ wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",75))
+ wave3.append(CreateWaitForTimeEvent(1.4829712,76))
+ wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",77))
+ wave3.append(CreateWaitForTimeEvent(2.9000244,78))
+ wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",79))
+ wave3.append(CreateWaitForTimeEvent(0.5999756,80))
+ wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",81))
+ wave3.append(CreateWaitForTimeEvent(0.6829834,82))
+ wave3.append(CreateScorchTitanEvent(< 1503.910034 , -3600.659912 , 813.781006 >,< 0.000000 , 90.000000 , 0.000000 >,"",83))
+ wave3.append(CreateWaitForTimeEvent(1.3170166,84))
+ wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",85))
+ wave3.append(CreateWaitForTimeEvent(5.0,86))
+ wave3.append(CreateWaitUntilAliveEvent(4,87))
+ wave3.append(CreateToneTitanEvent(< 1763.810059 , -1608.189941 , 810.000000 >,< 0.000000 , 90.000000 , 0.000000 >,"",88))
+ wave3.append(CreateWaitForTimeEvent(0.9000244,89))
+ wave3.append(CreateToneTitanEvent(< 2359.810059 , -1596.189941 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",90))
+ wave3.append(CreateWaitForTimeEvent(0.5839844,91))
+ wave3.append(CreateSpawnDroneEvent(< 1923.000000 , -1544.000000 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,"",92))
+ wave3.append(CreateWaitForTimeEvent(1.3330078,93))
+ wave3.append(CreateSpawnDroneEvent(< 1982.020020 , -1598.000000 , 1236.040039 >,< 0.000000 , 0.000000 , 0.000000 >,"",94))
+ wave3.append(CreateWaitForTimeEvent(5.0,95))
+ wave3.append(CreateWaitUntilAliveEvent(4,96))
+ wave3.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",97))
+ wave3.append(CreateWaitForTimeEvent(0.7999878,98))
+ wave3.append(CreateLegionTitanEvent(< 4453.589844 , 964.906006 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",99))
+ wave3.append(CreateWaitForTimeEvent(1.4000244,100))
+ wave3.append(CreateMonarchTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave3)
+ array<WaveEvent> wave4
+ wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",1))
+ wave4.append(CreateWaitForTimeEvent(0.6000366,2))
+ wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",3))
+ wave4.append(CreateWaitForTimeEvent(1.5169678,4))
+ wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",5))
+ wave4.append(CreateWaitForTimeEvent(0.8829956,6))
+ wave4.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",7))
+ wave4.append(CreateWaitForTimeEvent(0.6000366,8))
+ wave4.append(CreateToneTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",9))
+ wave4.append(CreateWaitForTimeEvent(1.0,10))
+ wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",11))
+ wave4.append(CreateWaitForTimeEvent(1.2000122,12))
+ wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",13))
+ wave4.append(CreateWaitForTimeEvent(1.5,14))
+ wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",15))
+ wave4.append(CreateWaitForTimeEvent(1.3499756,16))
+ wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",17))
+ wave4.append(CreateWaitForTimeEvent(1.2999878,18))
+ wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",19))
+ wave4.append(CreateWaitForTimeEvent(5.0,20))
+ wave4.append(CreateWaitUntilAliveEvent(4,21))
+ wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",22))
+ wave4.append(CreateWaitForTimeEvent(0.7000122,23))
+ wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",24))
+ wave4.append(CreateWaitForTimeEvent(0.9830322,25))
+ wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",26))
+ wave4.append(CreateWaitForTimeEvent(3.5999756,27))
+ wave4.append(CreateMortarTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,28))
+ wave4.append(CreateWaitForTimeEvent(0.5830078,29))
+ wave4.append(CreateMortarTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,30))
+ wave4.append(CreateWaitForTimeEvent(1.3499756,31))
+ wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",32))
+ wave4.append(CreateWaitForTimeEvent(1.0670166,33))
+ wave4.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",34))
+ wave4.append(CreateWaitForTimeEvent(1.21698,35))
+ wave4.append(CreateIonTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",36))
+ wave4.append(CreateWaitForTimeEvent(0.9160156,37))
+ wave4.append(CreateIonTitanEvent(< 3144.159912 , 2935.530029 , 917.187988 >,< 0.000000 , 179.341003 , 0.000000 >,"",38))
+ wave4.append(CreateWaitForTimeEvent(0.684021,39))
+ wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",40))
+ wave4.append(CreateWaitForTimeEvent(0.5999756,41))
+ wave4.append(CreateNukeTitanEvent(< -31.906300 , 4688.660156 , 1027.660034 >,< 0.000000 , -90.000000 , 0.000000 >,"",42))
+ wave4.append(CreateWaitForTimeEvent(1.2659912,43))
+ wave4.append(CreateNukeTitanEvent(< 1293.939941 , 1827.410034 , 1321.750000 >,< 0.000000 , 169.541000 , 0.000000 >,"",44))
+ wave4.append(CreateWaitForTimeEvent(1.5339966,45))
+ wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",46))
+ wave4.append(CreateWaitForTimeEvent(1.3000488,47))
+ wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",48))
+ wave4.append(CreateWaitForTimeEvent(5.0,49))
+ wave4.append(CreateWaitUntilAliveEvent(4,50))
+ wave4.append(CreateSuperSpectreEvent(< 2355.209961 , 4472.799805 , 963.218994 >,< -0.000000 , 175.473007 , 0.000000 >,"",51))
+ wave4.append(CreateWaitForTimeEvent(0.5999756,52))
+ wave4.append(CreateSuperSpectreEvent(< 2835.689941 , 4139.939941 , 939.281006 >,< 0.000000 , -171.078995 , 0.000000 >,"",53))
+ wave4.append(CreateWaitForTimeEvent(1.0170288,54))
+ wave4.append(CreateSuperSpectreEvent(< 1014.690002 , 4844.540039 , 941.236023 >,< -0.000000 , 173.994995 , 0.000000 >,"",55))
+ wave4.append(CreateWaitForTimeEvent(0.6170044,56))
+ wave4.append(CreateSuperSpectreEvent(< 2833.949951 , 2953.350098 , 910.458008 >,< -0.000000 , 178.046997 , 0.000000 >,"",57))
+ wave4.append(CreateWaitForTimeEvent(0.5830078,58))
+ wave4.append(CreateSuperSpectreEvent(< 4164.439941 , 1471.750000 , 944.281006 >,< -0.000000 , -179.429001 , 0.000000 >,"",59))
+ wave4.append(CreateWaitForTimeEvent(0.117004395,60))
+ wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",61))
+ wave4.append(CreateWaitForTimeEvent(1.0999756,62))
+ wave4.append(CreateSuperSpectreEvent(< 4207.680176 , 894.888977 , 944.281006 >,< -0.000000 , -167.283005 , 0.000000 >,"",63))
+ wave4.append(CreateWaitForTimeEvent(0.21600342,64))
+ wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",65))
+ wave4.append(CreateWaitForTimeEvent(0.9840088,66))
+ wave4.append(CreateSuperSpectreEvent(< 3570.689941 , 1491.780029 , 944.281006 >,< 0.000000 , 169.761002 , 0.000000 >,"",67))
+ wave4.append(CreateWaitForTimeEvent(0.23297119,68))
+ wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",69))
+ wave4.append(CreateWaitForTimeEvent(0.3670044,70))
+ wave4.append(CreateSuperSpectreEvent(< 3604.739990 , 835.104004 , 944.281006 >,< -0.000000 , -159.296997 , 0.000000 >,"",71))
+ wave4.append(CreateWaitForTimeEvent(5.0,72))
+ wave4.append(CreateWaitUntilAliveEvent(4,73))
+ wave4.append(CreateArcTitanEvent(< 2665.469971 , 4456.529785 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",74))
+ wave4.append(CreateWaitForTimeEvent(1.4199829,75))
+ wave4.append(CreateArcTitanEvent(< 3123.659912 , 4202.089844 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",76))
+ wave4.append(CreateWaitForTimeEvent(0.6799927,77))
+ wave4.append(CreateScorchTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",78))
+ wave4.append(CreateWaitForTimeEvent(1.2200317,79))
+ wave4.append(CreateScorchTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",80))
+ wave4.append(CreateWaitForTimeEvent(0.90997314,81))
+ wave4.append(CreateToneTitanEvent(< 3738.659912 , 1985.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",82))
+ wave4.append(CreateWaitForTimeEvent(0.5700073,83))
+ wave4.append(CreateToneTitanEvent(< -31.812500 , 4688.189941 , 1027.560059 >,< 0.000000 , -90.000000 , 0.000000 >,"",84))
+ wave4.append(CreateWaitForTimeEvent(1.4000244,85))
+ wave4.append(CreateRoninTitanEvent(< 1294.030029 , 1827.339966 , 1321.719971 >,< 0.000000 , 169.541000 , 0.000000 >,"",86))
+ wave4.append(CreateWaitForTimeEvent(0.9299927,87))
+ wave4.append(CreateRoninTitanEvent(< 4278.029785 , 1771.339966 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",88))
+ wave4.append(CreateWaitForTimeEvent(0.8899536,89))
+ wave4.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,90))
+ wave4.append(CreateWaitForTimeEvent(1.210083,91))
+ wave4.append(CreateToneSniperTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,92))
+ wave4.append(CreateWaitForTimeEvent(1.0,93))
+ wave4.append(CreateSpawnDroneEvent(< 4432.939941 , 1262.939941 , 1244.000000 >,< 0.000000 , 0.000000 , 0.000000 >,"",94))
+ wave4.append(CreateWaitForTimeEvent(4.3898926,95))
+ wave4.append(CreateSuperSpectreEvent(< 3878.439941 , 933.812988 , 944.281006 >,< -0.000000 , -79.509102 , 0.000000 >,"",96))
+ wave4.append(CreateWaitForTimeEvent(1.2000732,97))
+ wave4.append(CreateSuperSpectreEvent(< 4008.780029 , 378.406006 , 944.281006 >,< 0.000000 , -120.498001 , 0.000000 >,"",98))
+ wave4.append(CreateWaitForTimeEvent(0.92993164,99))
+ wave4.append(CreateSuperSpectreEvent(< 2916.810059 , 2679.780029 , 939.000000 >,< -0.000000 , -44.335999 , 0.000000 >,"",100))
+ wave4.append(CreateWaitForTimeEvent(0.5800781,101))
+ wave4.append(CreateSuperSpectreEvent(< 545.906006 , 1309.910034 , 1438.750000 >,< 0.000000 , -166.860001 , 0.000000 >,"",102))
+ wave4.append(CreateWaitForTimeEvent(5.0,103))
+ wave4.append(CreateWaitUntilAliveEvent(4,104))
+ wave4.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",105))
+ wave4.append(CreateWaitForTimeEvent(1.0198975,106))
+ wave4.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",107))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,108))
+ wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",109))
+ wave4.append(CreateWaitForTimeEvent(1.5,110))
+ wave4.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",111))
+ wave4.append(CreateWaitForTimeEvent(0.60998535,112))
+ wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave4)
+ array<WaveEvent> wave5
+ wave5.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",1))
+ wave5.append(CreateWaitForTimeEvent(1.2000732,2))
+ wave5.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",3))
+ wave5.append(CreateWaitForTimeEvent(0.79992676,4))
+ wave5.append(CreateDroppodStalkerEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",5))
+ wave5.append(CreateWaitForTimeEvent(0.9400635,6))
+ wave5.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",7))
+ wave5.append(CreateWaitForTimeEvent(5.0,8))
+ wave5.append(CreateWaitUntilAliveEvent(4,9))
+ wave5.append(CreateSuperSpectreEvent(< 1094.089966 , 1330.660034 , 1354.969971 >,< -0.000000 , 157.544006 , 0.000000 >,"",10))
+ wave5.append(CreateWaitForTimeEvent(0.7800293,11))
+ wave5.append(CreateSuperSpectreEvent(< 857.406006 , 739.843994 , 1373.030029 >,< -0.000000 , 151.962997 , 0.000000 >,"",12))
+ wave5.append(CreateWaitForTimeEvent(2.0700684,13))
+ wave5.append(CreateSuperSpectreEvent(< 1048.969971 , 1660.810059 , 1349.089966 >,< 0.000000 , -100.986000 , 0.000000 >,"",14))
+ wave5.append(CreateWaitForTimeEvent(1.2099609,15))
+ wave5.append(CreateSuperSpectreEvent(< 2724.129883 , 2458.629883 , 946.155029 >,< -0.000000 , -127.245003 , 0.000000 >,"",16))
+ wave5.append(CreateWaitForTimeEvent(5.0,17))
+ wave5.append(CreateWaitUntilAliveEvent(4,18))
+ wave5.append(CreateSuperSpectreEvent(< 1092.119995 , 1331.380005 , 1355.650024 >,< 0.000000 , 157.500000 , 0.000000 >,"",19))
+ wave5.append(CreateWaitForTimeEvent(1.1699219,20))
+ wave5.append(CreateSuperSpectreEvent(< 938.187988 , 707.406006 , 1362.939941 >,< -0.000000 , 153.720993 , 0.000000 >,"",21))
+ wave5.append(CreateWaitForTimeEvent(2.710083,22))
+ wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",23))
+ wave5.append(CreateWaitForTimeEvent(1.1199951,24))
+ wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",25))
+ wave5.append(CreateWaitForTimeEvent(2.2999268,26))
+ wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",27))
+ wave5.append(CreateWaitForTimeEvent(1.3000488,28))
+ wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",29))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,30))
+ wave5.append(CreateSuperSpectreEvent(< 1511.339966 , -1445.229980 , 825.757996 >,< -0.000000 , 141.589996 , 0.000000 >,"",31))
+ wave5.append(CreateWaitForTimeEvent(0.099975586,32))
+ wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",33))
+ wave5.append(CreateWaitForTimeEvent(0.57995605,34))
+ wave5.append(CreateSuperSpectreEvent(< 2086.750000 , -1459.000000 , 810.750000 >,< -0.000000 , 143.964996 , 0.000000 >,"",35))
+ wave5.append(CreateWaitForTimeEvent(0.6199951,36))
+ wave5.append(CreateIonTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",37))
+ wave5.append(CreateWaitForTimeEvent(0.8800049,38))
+ wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",39))
+ wave5.append(CreateWaitForTimeEvent(1.3399658,40))
+ wave5.append(CreateLegionTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",41))
+ wave5.append(CreateWaitForTimeEvent(5.0,42))
+ wave5.append(CreateWaitUntilAliveEvent(4,43))
+ wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",44))
+ wave5.append(CreateWaitForTimeEvent(0.92004395,45))
+ wave5.append(CreateDroppodStalkerEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",46))
+ wave5.append(CreateWaitForTimeEvent(5.0,47))
+ wave5.append(CreateWaitUntilAliveEvent(4,48))
+ wave5.append(CreateIonTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",49))
+ wave5.append(CreateWaitForTimeEvent(0.9499512,50))
+ wave5.append(CreateIonTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",51))
+ wave5.append(CreateWaitForTimeEvent(0.17004395,52))
+ wave5.append(CreateSuperSpectreEvent(< 1548.780029 , -1475.209961 , 805.556030 >,< -0.000000 , 141.876999 , 0.000000 >,"",53))
+ wave5.append(CreateWaitForTimeEvent(1.5,54))
+ wave5.append(CreateSuperSpectreEvent(< 2087.750000 , -1461.540039 , 810.366028 >,< -0.000000 , 143.395004 , 0.000000 >,"",55))
+ wave5.append(CreateWaitForTimeEvent(3.9799805,56))
+ wave5.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",57))
+ wave5.append(CreateWaitForTimeEvent(1.3399658,58))
+ wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",59))
+ wave5.append(CreateWaitForTimeEvent(0.85998535,60))
+ wave5.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",61))
+ wave5.append(CreateWaitForTimeEvent(0.9400635,62))
+ wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",63))
+ wave5.append(CreateWaitForTimeEvent(1.1099854,64))
+ wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",65))
+ wave5.append(CreateWaitForTimeEvent(1.9899902,66))
+ wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",67))
+ wave5.append(CreateWaitForTimeEvent(0.8100586,68))
+ wave5.append(CreateScorchTitanEvent(< 2411.909912 , -1108.660034 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",69))
+ wave5.append(CreateWaitForTimeEvent(1.289917,70))
+ wave5.append(CreateSuperSpectreEvent(< 1511.310059 , -1437.780029 , 826.656006 >,< -0.000000 , 142.382996 , 0.000000 >,"",71))
+ wave5.append(CreateWaitForTimeEvent(0.710083,72))
+ wave5.append(CreateSuperSpectreEvent(< 2129.800049 , -1492.459961 , 806.202026 >,< 0.000000 , 143.744995 , 0.000000 >,"",73))
+ wave5.append(CreateWaitForTimeEvent(5.0,74))
+ wave5.append(CreateWaitUntilAliveEvent(4,75))
+ wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",76))
+ wave5.append(CreateWaitForTimeEvent(0.5600586,77))
+ wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",78))
+ wave5.append(CreateWaitForTimeEvent(1.3199463,79))
+ wave5.append(CreateMonarchTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",80))
+ wave5.append(CreateWaitForTimeEvent(5.0,81))
+ wave5.append(CreateWaitUntilAliveEvent(4,82))
+ wave5.append(CreateSuperSpectreEvent(< 1511.160034 , -1437.079956 , 809.958008 >,< -0.000000 , 142.475998 , 0.000000 >,"",83))
+ wave5.append(CreateWaitForTimeEvent(1.1899414,84))
+ wave5.append(CreateSuperSpectreEvent(< 2091.909912 , -1464.430054 , 809.992981 >,< -0.000000 , 143.503998 , 0.000000 >,"",85))
+ wave5.append(CreateWaitForTimeEvent(1.8800049,86))
+ wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",87))
+ wave5.append(CreateWaitForTimeEvent(1.1500244,88))
+ wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",89))
+ wave5.append(CreateWaitForTimeEvent(0.3499756,90))
+ wave5.append(CreateSuperSpectreEvent(< 1452.199951 , -1794.530029 , 804.614990 >,< -0.000000 , 112.485001 , 0.000000 >,"",91))
+ wave5.append(CreateWaitForTimeEvent(0.22998047,92))
+ wave5.append(CreateDroppodStalkerEvent(< 896.656006 , -1227.339966 , 964.437988 >,"",93))
+ wave5.append(CreateWaitForTimeEvent(0.8699951,94))
+ wave5.append(CreateSuperSpectreEvent(< 2162.209961 , -1065.609985 , 806.807007 >,< -0.000000 , -174.283005 , 0.000000 >,"",95))
+ wave5.append(CreateWaitForTimeEvent(0.11999512,96))
+ wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",97))
+ wave5.append(CreateWaitForTimeEvent(5.0,98))
+ wave5.append(CreateWaitUntilAliveEvent(4,99))
+ wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",100))
+ wave5.append(CreateWaitForTimeEvent(0.5999756,101))
+ wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",102))
+ wave5.append(CreateWaitForTimeEvent(0.60009766,103))
+ wave5.append(CreateSpawnDroneEvent(< 2674.979980 , 4322.020020 , 1283.979980 >,< 0.000000 , 0.000000 , 0.000000 >,"",104))
+ wave5.append(CreateWaitForTimeEvent(5.0,105))
+ wave5.append(CreateWaitUntilAliveEvent(4,106))
+ wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",107))
+ wave5.append(CreateWaitForTimeEvent(1.2999268,108))
+ wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",109))
+ wave5.append(CreateWaitForTimeEvent(0.70007324,110))
+ wave5.append(CreateSpawnDroneEvent(< 2363.000000 , -3327.010010 , 1235.989990 >,< 0.000000 , 0.000000 , 0.000000 >,"",111))
+ wave5.append(CreateWaitForTimeEvent(6.0,112))
+ wave5.append(CreateScorchTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",113))
+ wave5.append(CreateWaitForTimeEvent(1.2999268,114))
+ wave5.append(CreateScorchTitanEvent(< 2359.909912 , -1596.660034 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",115))
+ wave5.append(CreateWaitForTimeEvent(1.4000244,116))
+ wave5.append(CreateIonTitanEvent(< 1559.810059 , -2024.189941 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",117))
+ wave5.append(CreateWaitForTimeEvent(0.6999512,118))
+ wave5.append(CreateIonTitanEvent(< 2411.810059 , -1108.189941 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",119))
+ wave5.append(CreateWaitForTimeEvent(5.0,120))
+ wave5.append(CreateWaitUntilAliveEvent(4,121))
+ wave5.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,122))
+ wave5.append(CreateWaitForTimeEvent(0.9000244,123))
+ wave5.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,124))
+ wave5.append(CreateWaitForTimeEvent(1.0999756,125))
+ wave5.append(CreateArcTitanEvent(< 3867.219971 , 1445.689941 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",126))
+ wave5.append(CreateWaitForTimeEvent(5.0,127))
+ wave5.append(CreateWaitUntilAliveEvent(4,128))
+ wave5.append(CreateNukeTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",129))
+ wave5.append(CreateWaitForTimeEvent(1.2000732,130))
+ wave5.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",131))
+ wave5.append(CreateWaitForTimeEvent(1.2999268,132))
+ wave5.append(CreateNukeTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",133))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,134))
+ wave5.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",135))
+ wave5.append(CreateWaitForTimeEvent(1.0999756,136))
+ wave5.append(CreateNukeTitanEvent(< 1817.469971 , -3586.379883 , 814.062988 >,< 0.000000 , 90.000000 , 0.000000 >,"",137))
+ wave5.append(CreateWaitForTimeEvent(0.6999512,138))
+ wave5.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",139))
+ wave5.append(CreateWaitForTimeEvent(5.0,140))
+ wave5.append(CreateWaitUntilAliveEvent(4,141))
+ wave5.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",142))
+ wave5.append(CreateWaitForTimeEvent(1.3000488,143))
+ wave5.append(CreateToneTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",144))
+ wave5.append(CreateWaitForTimeEvent(1.3000488,145))
+ wave5.append(CreateScorchTitanEvent(< 3867.129883 , 1445.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave5)
+
+ //waveEvents.append(wave0)
+ //waveEvents.append(wave1)
+ //waveEvents.append(wave2)
+ //waveEvents.append(wave3)
+ //waveEvents.append(wave4)
+}
+
+/*
+void function initFrontierDefenseData()
+{
+ shopPosition =
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+}*/
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut
index 37b89169..4bd40ff1 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut
@@ -1 +1,8 @@
-//fuck \ No newline at end of file
+global function CodeCallback_MapInit
+
+void function CodeCallback_MapInit()
+{
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut
index f4b48f6d..73059b9e 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut
@@ -4,6 +4,11 @@ void function CodeCallback_MapInit()
{
// there are some really busted titan startspawns that are on the fucking other side of the map from where they should be, so we remove them
AddSpawnCallback( "info_spawnpoint_titan_start", TrimBadTitanStartSpawns )
+
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+
}
void function TrimBadTitanStartSpawns( entity spawn )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut
index 37b89169..03701458 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut
@@ -1 +1,10 @@
-//fuck \ No newline at end of file
+global function CodeCallback_MapInit
+
+void function CodeCallback_MapInit()
+{
+ // Load Frontier Defense Data
+
+ print(GameRules_GetGameMode())
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut
index 37b89169..cd7d7895 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut
@@ -1 +1,566 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = < -800.156, -4250, -63 >
+ shopAngles = < 9, 60, 0 >
+
+ int index = 1
+ array<WaveEvent> wave1
+ wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5,index++))
+ wave1.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4965.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5,index++))
+ wave1.append(CreateDroppodGruntEvent(< 68.781303 , -516.468994 , -97.937500 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.5999985,index++))
+ wave1.append(CreateDroppodGruntEvent(< -770.500000 , 1070.060059 , -159.781006 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.9000015,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2420.310059 , -1135.250000 , -159.218994 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ // replaced this with the one below because it seemed off?
+ //wave1.append(CreateSpawnDroneEvent(< -697.750000 , 940.593994 , 153.656006 >,< -0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave1.append(CreateWaitForTimeEvent(0.5999985,index++))
+ // replaced this with the one below because it seemed off?
+ //wave1.append(CreateSpawnDroneEvent(< 2696.909912 , -388.062988 , 349.250000 >,< -0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4965.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave1.append(CreateWaitForTimeEvent(1.199997,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.1000061,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.2999954,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.25,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5830078,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4731.839844 , -2077.219971 , -35.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.7829895,index++))
+ wave1.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.3340149,index++))
+ wave1.append(CreateDroppodGruntEvent(< -610.500000 , 1743.060059 , 93.156303 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.2659912,index++))
+ wave1.append(CreateSuperSpectreEvent(< 779.500000 , -365.375000 , -166.093994 >,< 0.000000 , -52.734402 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.6170044,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.2999878,index++))
+ wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4877.899902 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave1.append(CreateWaitForTimeEvent(2.0170135,index++))
+ wave1.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4810.569824 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave1.append(CreateWaitForTimeEvent(0.6659851,index++))
+ wave1.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4955.319824 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave1.append(CreateWaitForTimeEvent(2.0,index++))
+ wave1.append(CreateSuperSpectreEvent(< 2918.379883 , -3060.629883 , -25.187500 >,< -0.000000 , -170.770996 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.300003,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0829926,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.93400574,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.9000092,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4009.219971 , 3091.500000 , -2.406250 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4009.219971 , 3091.500000 , -2.406250 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.4669952,index++))
+ wave1.append(CreateDroppodGruntEvent(< 5542.589844 , 2078.189941 , -31.531300 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0330048,index++))
+ wave1.append(CreateDroppodGruntEvent(< 5204.000000 , 1308.000000 , 7.593750 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateSuperSpectreEvent(< -523.031006 , 807.125000 , -167.218994 >,< 0.000000 , -91.450203 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.2169952,index++))
+ wave1.append(CreateSuperSpectreEvent(< 3316.060059 , -2935.530029 , -67.218803 >,< -0.000000 , -156.182007 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.1000061,index++))
+ wave1.append(CreateDroppodSpectreMortarEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0,index++))
+ wave1.append(CreateDroppodSpectreMortarEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5,index++))
+ wave1.append(CreateDroppodSpectreMortarEvent(< -1008.880005 , 1265.500000 , -159.781006 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0,index++))
+ wave1.append(CreateDroppodSpectreMortarEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",0))
+ waveEvents.append(wave1)
+ index = 1
+ array<WaveEvent> wave2
+ wave2.append(CreateSpawnDroneEvent(< 6090.759766 , 146.453995 , 4888.700195 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave2.append(CreateWaitForTimeEvent(1.1170044,index++))
+ wave2.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.78302,index++))
+ wave2.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.21698,index++))
+ wave2.append(CreateDroppodGruntEvent(< 68.781303 , -516.468994 , -97.937500 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.7669983,index++))
+ wave2.append(CreateDroppodGruntEvent(< -770.500000 , 1070.060059 , -159.781006 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.0,index++))
+ wave2.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4870.890137 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave2.append(CreateWaitForTimeEvent(2.7000122,index++))
+ wave2.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4831.279785 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4886.330078 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4918.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave2.append(CreateWaitForTimeEvent(1.4830322,index++))
+ wave2.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.6170044,index++))
+ wave2.append(CreateDroppodSpectreMortarEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.3500366,index++))
+ wave2.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.0,index++))
+ wave2.append(CreateToneSniperTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.1670532,index++))
+ wave2.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.4829712,index++))
+ wave2.append(CreateMortarTitanEvent(< -515.187988 , 1099.160034 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 68.781303 , -516.468994 , -97.937500 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.5170288,index++))
+ wave2.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.0999756,index++))
+ wave2.append(CreateDroppodGruntEvent(< -770.500000 , 1070.060059 , -159.781006 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8829956,index++))
+ wave2.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.6170044,index++))
+ wave2.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.3670044,index++))
+ wave2.append(CreateDroppodGruntEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.8999634,index++))
+ wave2.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave2.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.532959,index++))
+ wave2.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8670044,index++))
+ wave2.append(CreateNukeTitanEvent(< 2758.840088 , -436.187988 , -75.156303 >,< -0.922852 , -141.942993 , -1.582030 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.61602783,index++))
+ wave2.append(CreateNukeTitanEvent(< -515.281006 , 1099.630005 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8999634,index++))
+ wave2.append(CreateNukeTitanEvent(< 4027.840088 , -2180.129883 , -61.937500 >,< -0.922852 , -143.613007 , -1.582030 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8840332,index++))
+ wave2.append(CreateNukeTitanEvent(< -918.125000 , 890.625000 , -155.250000 >,< 0.000000 , 90.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave2)
+ index = 1
+ array<WaveEvent> wave3
+ wave3.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4893.919922 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0170288,index++))
+ wave3.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4813.379883 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8829956,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4935.830078 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.7839966,index++))
+ wave3.append(CreateSpawnDroneEvent(< 4582.979980 , 2624.050049 , 4906.810059 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9160156,index++))
+ wave3.append(CreateSpawnDroneEvent(< 4024.330078 , 3117.510010 , 4947.189941 >,< 0.004999 , -25.792200 , 0.000004 >,"centerRightDrones_Loop4",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4889.950195 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateSuperSpectreEvent(< -515.437988 , -263.281006 , 420.281006 >,< -0.000000 , 176.923996 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2160034,index++))
+ wave3.append(CreateSuperSpectreEvent(< 2567.189941 , -3095.969971 , 25.437500 >,< -0.000000 , -174.945999 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.10003662,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4936.169922 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4946.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.717041,index++))
+ wave3.append(CreateSpawnDroneEvent(< 2880.760010 , 3060.300049 , 4874.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.782959,index++))
+ wave3.append(CreateSpawnDroneEvent(< 4569.009766 , 2664.110107 , 4897.569824 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.4169922,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3984.270020 , 3103.570068 , 4931.939941 >,< 0.004999 , -25.792200 , 0.000004 >,"centerRightDrones_Loop4",index++))
+ wave3.append(CreateWaitForTimeEvent(1.4830322,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4931.640137 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(4.0999756,index++))
+ wave3.append(CreateIonTitanEvent(< -515.187988 , 1099.160034 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0170288,index++))
+ wave3.append(CreateIonTitanEvent(< 3574.409912 , -2788.219971 , -68.312500 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< 25.437500 , -2.062500 , -159.781006 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.96698,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.950012,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4920.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.4829712,index++))
+ wave3.append(CreateMortarTitanEvent(< -515.187988 , 1099.160034 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,index++))
+ wave3.append(CreateWaitForTimeEvent(0.717041,index++))
+ wave3.append(CreateMortarTitanEvent(< 3574.409912 , -2788.219971 , -68.312500 >,< 0.000000 , 0.000000 , 0.000000 >,index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.5,index++))
+ wave3.append(CreateDroppodGruntEvent(< -610.500000 , 1743.060059 , 93.156303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3829956,index++))
+ wave3.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.21698,index++))
+ wave3.append(CreateToneSniperTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave3.append(CreateWaitForTimeEvent(0.6000366,index++))
+ wave3.append(CreateMortarTitanEvent(< 1984.030029 , 138.125000 , -75.031303 >,< -0.922852 , -97.602501 , -1.582030 >,index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.5,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave3.append(CreateSuperSpectreEvent(< 512.492004 , -288.734985 , -167.218994 >,< 0.000000 , 148.755005 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.41705322,index++))
+ wave3.append(CreateDroppodGruntEvent(< -610.500000 , 1743.060059 , 93.156303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.017029,index++))
+ wave3.append(CreateSuperSpectreEvent(< 3324.590088 , -2931.780029 , -67.531303 >,< 0.000000 , -156.138000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(2.6829834,index++))
+ wave3.append(CreateSpawnDroneEvent(< 6090.759766 , 146.453995 , 4907.120117 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.217041,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4934.399902 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1329956,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(4.049988,index++))
+ wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4905.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2330322,index++))
+ wave3.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4808.120117 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave3.append(CreateSpawnDroneEvent(< 5204.000000 , 1275.729980 , 4938.310059 >,< 0.004999 , -89.996300 , 0.000004 >,"centerRightDrones_Loop2",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4898.049805 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1669922,index++))
+ wave3.append(CreateSpawnDroneEvent(< 4542.890137 , 2610.110107 , 4888.470215 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3330078,index++))
+ wave3.append(CreateSpawnDroneEvent(< 2826.729980 , 3086.419922 , 4851.450195 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9500122,index++))
+ wave3.append(CreateNukeTitanEvent(< 3573.939941 , -2788.310059 , -68.281303 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.532959,index++))
+ wave3.append(CreateNukeTitanEvent(< -1799.530029 , 1310.839966 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.7839966,index++))
+ wave3.append(CreateNukeTitanEvent(< 4027.840088 , -2180.129883 , -61.937500 >,< -0.922852 , -143.613007 , -1.582030 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.5,index++))
+ wave3.append(CreateNukeTitanEvent(< -2077.379883 , 950.062988 , -143.813004 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(4.31604,index++))
+ wave3.append(CreateSuperSpectreEvent(< -522.593994 , -251.406006 , 416.437988 >,< -0.000000 , 169.408997 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4864.759766 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8840332,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4941.009766 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8999634,index++))
+ wave3.append(CreateScorchTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.5159912,index++))
+ wave3.append(CreateScorchTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.467041,index++))
+ wave3.append(CreateNukeTitanEvent(< 3573.939941 , -2788.310059 , -68.281303 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9329834,index++))
+ wave3.append(CreateNukeTitanEvent(< -1799.530029 , 1310.839966 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3999634,index++))
+ wave3.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2000122,index++))
+ wave3.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave3.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",0))
+ waveEvents.append(wave3)
+ index = 1
+ array<WaveEvent> wave4
+ wave4.append(CreateIonTitanEvent(< -1799.910034 , 1310.530029 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSuperSpectreEvent(< -2619.399902 , 511.446014 , -141.567993 >,< -0.000000 , -139.373001 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateSuperSpectreEvent(< -1172.420044 , 1221.010010 , -167.218994 >,< 0.000000 , -175.912994 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.11999512,index++))
+ wave4.append(CreateSpawnDroneEvent(< 6090.759766 , 146.453995 , 4879.229980 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave4.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4925.459961 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0599365,index++))
+ wave4.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1400146,index++))
+ wave4.append(CreateDroppodSpectreMortarEvent(< 5542.589844 , 2078.189941 , -31.531300 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1199951,index++))
+ wave4.append(CreateDroppodSpectreMortarEvent(< -3375.090088 , -1307.969971 , -90.593803 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1600342,index++))
+ wave4.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateScorchTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.7800293,index++))
+ wave4.append(CreateScorchTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.920044,index++))
+ wave4.append(CreateSuperSpectreEvent(< 275.593994 , -144.656006 , -156.968994 >,< 0.000000 , -168.091003 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateRoninTitanEvent(< -1799.439941 , 1310.839966 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSuperSpectreEvent(< -2191.379883 , 875.562988 , -139.968994 >,< -0.000000 , -142.382996 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.11999512,index++))
+ wave4.append(CreateRoninTitanEvent(< 3573.840088 , -2788.250000 , -68.250000 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.57995605,index++))
+ wave4.append(CreateSuperSpectreEvent(< -1868.939941 , 1052.229980 , -153.057007 >,< -0.000000 , -156.475006 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3465.909912 , -2830.469971 , -68.375000 >,< -0.922858 , -149.106003 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9699707,index++))
+ wave4.append(CreateIonTitanEvent(< 5136.720215 , -2059.379883 , -105.125000 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3640.330078 , -2726.229980 , -72.381897 >,< -0.922858 , -146.380997 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3683.840088 , -2703.780029 , -69.718803 >,< -0.922858 , -149.766006 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.6800537,index++))
+ wave4.append(CreateSuperSpectreEvent(< 2472.750000 , -733.406006 , -117.594002 >,< -0.922852 , -132.231003 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.79003906,index++))
+ wave4.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0100098,index++))
+ wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSuperSpectreEvent(< 2614.300049 , -3101.199951 , 14.673600 >,< 0.000000 , -172.837006 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.8199463,index++))
+ wave4.append(CreateSuperSpectreEvent(< -2551.510010 , 644.447998 , -123.125000 >,< -0.922858 , -132.886993 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.4100342,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3910.250000 , -2404.560059 , -89.156303 >,< -0.922852 , -121.376999 , -1.582030 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4890.120117 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(0.8099365,index++))
+ wave4.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4814.129883 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateSpawnDroneEvent(< 5234.000000 , 1305.729980 , 4936.160156 >,< 0.004999 , -89.996300 , 0.000004 >,"centerRightDrones_Loop2",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2000732,index++))
+ wave4.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4911.430176 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4940.600098 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(0.8300781,index++))
+ wave4.append(CreateSpawnDroneEvent(< 2866.790039 , 3100.360107 , 4857.200195 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2799072,index++))
+ wave4.append(CreateToneSniperTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave4.append(CreateWaitForTimeEvent(1.2900391,index++))
+ wave4.append(CreateToneTitanEvent(< -515.187988 , 1099.160034 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.60998535,index++))
+ wave4.append(CreateToneTitanEvent(< 3574.409912 , -2788.219971 , -68.312500 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(2.9899902,index++))
+ wave4.append(CreateDroppodGruntEvent(< 68.781303 , -516.468994 , -97.937500 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.4100342,index++))
+ wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4861.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave4.append(CreateWaitForTimeEvent(0.98999023,index++))
+ wave4.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4831.629883 >,< 0.004999 , -73.121300 , 0.000004 >,"centerLeftDrones_Loop3",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1099854,index++))
+ wave4.append(CreateSpawnDroneEvent(< 5204.000000 , 1335.729980 , 4926.459961 >,< 0.004999 , -89.996300 , 0.000004 >,"centerRightDrones_Loop2",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateToneSniperTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave4.append(CreateDroppodGruntEvent(< -1197.939941 , 1928.560059 , 80.031303 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1099854,index++))
+ wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0400391,index++))
+ wave4.append(CreateSuperSpectreEvent(< 496.070007 , -280.742004 , -167.218994 >,< 0.000000 , 148.403000 , 0.000000 >,"",0))
+ waveEvents.append(wave4)
+ index = 1
+ array<WaveEvent> wave5
+ wave5.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.7800293,index++))
+ wave5.append(CreateDroppodSpectreMortarEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1300049,index++))
+ wave5.append(CreateDroppodSpectreMortarEvent(< 5204.000000 , 1308.000000 , 7.593750 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1899414,index++))
+ wave5.append(CreateMortarTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateNukeTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave5.append(CreateNukeTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(4.580078,index++))
+ wave5.append(CreateSuperSpectreEvent(< 4956.689941 , 1462.579956 , 55.508598 >,< -0.000000 , -158.052002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.92993164,index++))
+ wave5.append(CreateSuperSpectreEvent(< 3183.560059 , 2090.909912 , -48.263699 >,< -0.000000 , -105.017998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateNorthstarSniperTitanEvent(< 5251.560059 , 2049.379883 , 13.093800 >,< 0.000000 , -90.000000 , 0.000000 >,index++))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,index++))
+ wave5.append(CreateToneSniperTitanEvent(< 4249.970215 , 2936.689941 , -44.187500 >,< 0.000000 , -90.000000 , 0.000000 >,index++))
+ wave5.append(CreateWaitForTimeEvent(6.910034,index++))
+ wave5.append(CreateNukeTitanEvent(< 5748.529785 , 1979.339966 , -71.062500 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3898926,index++))
+ wave5.append(CreateNukeTitanEvent(< 3610.939941 , 2928.689941 , 22.218800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(3.9000244,index++))
+ wave5.append(CreateArcTitanEvent(< 2758.969971 , -436.187988 , -75.125000 >,< -0.922852 , -141.942993 , -1.582030 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0100098,index++))
+ wave5.append(CreateSuperSpectreEvent(< 4416.339844 , 1310.920044 , 4.697280 >,< 0.000000 , -124.364998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.98999023,index++))
+ wave5.append(CreateSuperSpectreEvent(< 5161.879883 , 804.687988 , -41.937500 >,< 0.000000 , -134.824005 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateNukeTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateNukeTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.23999023,index++))
+ wave5.append(CreateSpawnDroneEvent(< 3027.270020 , 1470.109985 , 196.347000 >,< 13.667000 , -114.433998 , 0.000000 >,"centerRightDrones_Loop6",index++))
+ wave5.append(CreateWaitForTimeEvent(0.10998535,index++))
+ wave5.append(CreateSpawnDroneEvent(< 2938.060059 , 1411.089966 , 100.563004 >,< 13.667000 , -110.039001 , 0.000000 >,"centerRightDrones_Loop6",index++))
+ wave5.append(CreateWaitForTimeEvent(0.11999512,index++))
+ wave5.append(CreateSpawnDroneEvent(< 3031.810059 , 1541.949951 , 103.435997 >,< 12.767300 , -112.807999 , -0.000001 >,"centerRightDrones_Loop6",index++))
+ wave5.append(CreateWaitForTimeEvent(3.5999756,index++))
+ wave5.append(CreateSuperSpectreEvent(< 5122.479980 , 1549.989990 , 38.913399 >,< -0.000000 , -147.757004 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.82006836,index++))
+ wave5.append(CreateSuperSpectreEvent(< 3277.000000 , 2468.239990 , -11.818300 >,< -0.000000 , -106.505997 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.709961,index++))
+ wave5.append(CreateSuperSpectreEvent(< 3270.409912 , 2209.939941 , -29.437500 >,< -0.000000 , -109.906998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave5.append(CreateSuperSpectreEvent(< 5253.410156 , 1635.689941 , 16.718800 >,< 0.000000 , -146.908997 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateNukeTitanEvent(< 5605.439941 , 1266.410034 , -54.562500 >,< 0.000000 , -162.641998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2199707,index++))
+ wave5.append(CreateNukeTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.6800537,index++))
+ wave5.append(CreateSuperSpectreEvent(< 5153.359863 , 1756.530029 , 39.026600 >,< 0.000000 , -111.313004 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2199707,index++))
+ wave5.append(CreateArcTitanEvent(< 5748.660156 , 1979.380005 , -71.062500 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.70007324,index++))
+ wave5.append(CreateNukeTitanEvent(< 5375.560059 , 2948.280029 , -33.250000 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave5.append(CreateSuperSpectreEvent(< 5297.750000 , 59.281300 , -167.063004 >,< 0.000000 , -54.975601 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.16992188,index++))
+ wave5.append(CreateNukeTitanEvent(< 3897.439941 , 3308.530029 , -20.593800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5300293,index++))
+ wave5.append(CreateSuperSpectreEvent(< 3347.310059 , 2737.810059 , 18.812500 >,< -0.000000 , -102.084999 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.47998047,index++))
+ wave5.append(CreateArcTitanEvent(< 2758.969971 , -436.187988 , -75.125000 >,< -0.922852 , -141.942993 , -1.582030 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave5.append(CreateNukeTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2900391,index++))
+ wave5.append(CreateNukeTitanEvent(< 3610.939941 , 2928.689941 , 22.218800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.60998535,index++))
+ wave5.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4942.560059 >,< 0.004999 , -115.792000 , 0.000004 >,"centerRightDrones_Loop1",index++))
+ wave5.append(CreateWaitForTimeEvent(0.73999023,index++))
+ wave5.append(CreateNukeTitanEvent(< 5797.589844 , 1407.689941 , -93.906303 >,< 0.000000 , -161.498993 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.7800293,index++))
+ wave5.append(CreateNukeTitanEvent(< 4320.029785 , 2913.030029 , -56.593800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0200195,index++))
+ wave5.append(CreateSuperSpectreEvent(< 3990.439941 , 419.718994 , -130.875000 >,< -0.000000 , -171.210999 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3599854,index++))
+ wave5.append(CreateSuperSpectreEvent(< 2692.169922 , 2159.280029 , -142.787003 >,< -0.000000 , -84.377403 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateArcTitanEvent(< 5251.560059 , 2049.379883 , 13.093800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4399414,index++))
+ wave5.append(CreateNukeTitanEvent(< 5748.529785 , 1979.339966 , -71.062500 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8800049,index++))
+ wave5.append(CreateNukeTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave5.append(CreateMortarTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++))
+ wave5.append(CreateWaitForTimeEvent(0.7199707,index++))
+ wave5.append(CreateNukeTitanEvent(< 5797.589844 , 1407.689941 , -93.906303 >,< 0.000000 , -161.498993 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave5.append(CreateNukeTitanEvent(< 3610.939941 , 2928.689941 , 22.218800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(2.9100342,index++))
+ wave5.append(CreateNukeTitanEvent(< 5375.560059 , 2948.280029 , -33.250000 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.77001953,index++))
+ wave5.append(CreateNukeTitanEvent(< 3897.439941 , 3308.530029 , -20.593800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3199463,index++))
+ wave5.append(CreateNukeTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3601074,index++))
+ wave5.append(CreateNukeTitanEvent(< 4699.589844 , 2906.159912 , -72.843803 >,< 0.000000 , -115.795998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateSuperSpectreEvent(< -524.656006 , -249.875000 , 416.437988 >,< -0.000000 , 161.938004 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateScorchTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.9199219,index++))
+ wave5.append(CreateScorchTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateNukeTitanEvent(< 5605.439941 , 1266.410034 , -54.562500 >,< 0.000000 , -162.641998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3800049,index++))
+ wave5.append(CreateNukeTitanEvent(< 1484.500000 , 968.593994 , 98.031303 >,< -0.922852 , -141.942993 , -1.582030 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveWeightedEvent(12,index++))
+ wave5.append(CreateScorchTitanEvent(< 5251.529785 , 2049.280029 , 13.125000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8300781,index++))
+ wave5.append(CreateScorchTitanEvent(< 4249.879883 , 2937.159912 , -44.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4899902,index++))
+ wave5.append(CreateNukeTitanEvent(< 5748.529785 , 1979.339966 , -71.062500 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateNukeTitanEvent(< 3610.939941 , 2928.689941 , 22.218800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8800049,index++))
+ wave5.append(CreateNukeTitanEvent(< 5797.589844 , 1407.689941 , -93.906303 >,< 0.000000 , -161.498993 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.7199707,index++))
+ wave5.append(CreateNukeTitanEvent(< 3897.439941 , 3308.530029 , -20.593800 >,< 0.000000 , -113.642998 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.60998535,index++))
+ wave5.append(CreateNukeTitanEvent(< 5375.560059 , 2948.280029 , -33.250000 >,< 0.000000 , -142.690002 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.9499512,index++))
+ wave5.append(CreateNukeTitanEvent(< 4699.589844 , 2906.159912 , -72.843803 >,< 0.000000 , -115.795998 , 0.000000 >,"",0))
+ waveEvents.append(wave5)
+
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut
index 37b89169..5c6a18ed 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut
@@ -1 +1,6 @@
-//fuck \ No newline at end of file
+void function CodeCallback_MapInit()
+{
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut
index 37b89169..94dce470 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut
@@ -1 +1,7 @@
-//fuck \ No newline at end of file
+global function CodeCallback_MapInit
+
+void function CodeCallback_MapInit()
+{
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise_fd.nut
index 37b89169..c3fe53db 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise_fd.nut
@@ -1 +1,615 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+
+
+void function initFrontierDefenseData()
+{
+ shopPosition = < -5165.42, -679.285, 384.031> //only aproximate position
+
+
+ int index = 1
+ array<WaveEvent> wave1
+ wave1.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateNukeTitanEvent(< 2007.030029 , -57.000000 , 243.468994 >,< -0.000000 , -157.455994 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.2999954,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0999985,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3224.000000 , 1101.719971 , 327.562988 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3637.560059 , 571.968994 , 151.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateNukeTitanEvent(< 1989.280029 , -64.187500 , 243.438004 >,< -0.000000 , -158.511002 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateSuperSpectreEvent(< 2611.629883 , 78.937500 , 197.813004 >,< 0.000000 , -168.794006 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3637.560059 , 571.968994 , 151.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -991.843994 , 411.093994 , 254.656006 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0999908,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.800003,index++))
+ wave1.append(CreateDroppodStalkerEvent(< 2117.560059 , 1491.969971 , 21.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.3999939,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2995.780029 , -1754.030029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2442.189941 , -522.093994 , 391.562988 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3349.560059 , -12.031300 , 161.313004 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2240.590088 , -572.375000 , 357.218994 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2442.189941 , -522.093994 , 391.562988 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3637.560059 , 571.968994 , 151.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.5,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2240.590088 , -572.375000 , 357.218994 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.2000122,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2228.689941 , 278.750000 , 324.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2117.560059 , 1491.969971 , 21.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave1.append(CreateDroppodStalkerEvent(< -2442.189941 , -522.093994 , 391.562988 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.8339844,index++))
+ wave1.append(CreateDroppodGruntEvent(< 3349.560059 , -12.031300 , 161.313004 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.0830078,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2240.590088 , -572.375000 , 357.218994 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -2442.189941 , -522.093994 , 391.562988 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.7669983,index++))
+ wave1.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.1999817,index++))
+ wave1.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.3170166,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(0.7999878,index++))
+ wave1.append(CreateDroppodGruntEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< 2117.560059 , 1491.969971 , 21.625000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -1274.589966 , 1488.410034 , 271.593994 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(2.5,index++))
+ wave1.append(CreateDroppodGruntEvent(< -996.187988 , -1501.560059 , 255.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.3999939,index++))
+ wave1.append(CreateDroppodGruntEvent(< -1252.689941 , -1680.530029 , 255.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(1.7669983,index++))
+ wave1.append(CreateDroppodGruntEvent(< -1589.910034 , 1445.589966 , 271.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateDroppodGruntEvent(< -996.187988 , -1501.560059 , 255.500000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateSuperSpectreEvent(< 1823.390015 , -62.063999 , 229.139999 >,< -0.000000 , -178.341995 , 0.000000 >,"",index++))
+ wave1.append(CreateWaitForTimeEvent(5.0,index++))
+ wave1.append(CreateWaitUntilAliveEvent(0,index++))
+ wave1.append(CreateNukeTitanEvent(< 2072.510010 , -114.669998 , 240.608994 >,< 0.000000 , -2.153320 , 0.000000 >,"",0))
+ waveEvents.append(wave1)
+ index = 1
+ array<WaveEvent> wave2
+ wave2.append(CreateDroppodGruntEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.0,index++))
+ wave2.append(CreateDroppodGruntEvent(< -3224.000000 , 1101.719971 , 327.562988 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave2.append(CreateDroppodStalkerEvent(< -3104.379883 , 1348.000000 , 327.500000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.9169922,index++))
+ wave2.append(CreateDroppodStalkerEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveEvent(0,index++))
+ wave2.append(CreateScorchTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveEvent(0,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2337.030029 , -69.686699 , 226.059998 >,< -0.000000 , -179.475006 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.3170166,index++))
+ wave2.append(CreateSuperSpectreEvent(< 41.778801 , 1492.930054 , 207.095001 >,< -0.000000 , -107.139999 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.3330078,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1897.969971 , 3546.590088 , 11.343800 >,< -0.000000 , -97.514702 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.5830078,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2715.909912 , 2444.469971 , 287.549011 >,< -0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8170166,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1463.780029 , 1324.219971 , 131.906006 >,< -0.000000 , -139.350998 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.75,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1463.060059 , 797.065979 , 169.285995 >,< -0.000000 , 167.210999 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8329468,index++))
+ wave2.append(CreateSuperSpectreEvent(< 936.437988 , 2916.439941 , 45.218800 >,< 0.000000 , -98.833000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.6340332,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1320.030029 , 3197.560059 , 20.562500 >,< 0.000000 , -170.464005 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.9500122,index++))
+ wave2.append(CreateScorchTitanEvent(< 1403.640015 , 6.090660 , 248.841995 >,< -0.000000 , 154.104996 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.3330078,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1887.949951 , 2189.469971 , 8.031250 >,< -0.000000 , -178.822998 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveEvent(0,index++))
+ wave2.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.53302,index++))
+ wave2.append(CreateSuperSpectreEvent(< 158.718994 , 1828.060059 , 205.938004 >,< 0.000000 , -112.807999 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.56695557,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1455.800049 , 791.848999 , 172.475998 >,< -0.000000 , 166.639999 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8170166,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2348.000000 , -132.188004 , 234.906006 >,< -0.000000 , 166.641006 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.1000366,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1475.770020 , 1334.510010 , 127.028000 >,< 0.000000 , -139.307007 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.6159668,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2163.419922 , 1372.069946 , 38.044701 >,< -0.000000 , -165.878006 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.7000122,index++))
+ wave2.append(CreateArcTitanEvent(< 3600.000000 , 21.718800 , 194.000000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.5839844,index++))
+ wave2.append(CreateSuperSpectreEvent(< 889.906006 , 2926.129883 , 50.593800 >,< -0.000000 , -93.427696 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8829956,index++))
+ wave2.append(CreateScorchTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.5170288,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2071.060059 , 2108.060059 , 8.031250 >,< 0.000000 , -160.093002 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.065979,index++))
+ wave2.append(CreateArcTitanEvent(< 1324.250000 , 43.000000 , 256.625000 >,< -0.000000 , 154.600006 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.21698,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1455.780029 , 792.064026 , 172.410004 >,< -0.000000 , 166.639008 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave2.append(CreateSuperSpectreEvent(< 153.862000 , 1829.819946 , 206.039993 >,< -0.000000 , -112.330002 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.23297119,index++))
+ wave2.append(CreateScorchTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.5170288,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1576.560059 , -228.938004 , 236.343994 >,< -0.000000 , -173.188004 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.75,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1478.390015 , 1336.760010 , 125.976997 >,< 0.000000 , -139.307007 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.7000122,index++))
+ wave2.append(CreateArcTitanEvent(< 1272.239990 , 68.484001 , 256.885986 >,< -0.000000 , 154.994003 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8999634,index++))
+ wave2.append(CreateSuperSpectreEvent(< 889.038025 , 2913.489990 , 50.996201 >,< -0.000000 , -93.384903 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.5830078,index++))
+ wave2.append(CreateScorchTitanEvent(< 1209.160034 , 96.343803 , 256.281006 >,< -0.000000 , 154.688004 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.4500122,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2054.219971 , 2189.840088 , 8.031250 >,< 0.000000 , -178.550003 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.8170166,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1611.719971 , -210.145996 , 235.520004 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.2999878,index++))
+ wave2.append(CreateSuperSpectreEvent(< 150.729996 , 1828.010010 , 206.033005 >,< 0.000000 , -112.105003 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.3170166,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2517.409912 , 274.963013 , 213.567001 >,< 0.000000 , -150.468994 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(5.0,index++))
+ wave2.append(CreateWaitUntilAliveEvent(0,index++))
+ wave2.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2351.110107 , -69.093002 , 225.748001 >,< -0.000000 , -179.738007 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.3000488,index++))
+ wave2.append(CreateSuperSpectreEvent(< 153.097000 , 1827.900024 , 206.031998 >,< 0.000000 , -112.323997 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.1170044,index++))
+ wave2.append(CreateSuperSpectreEvent(< 3145.469971 , 43.000000 , 169.281006 >,< -0.000000 , -180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.56695557,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2774.689941 , 1398.219971 , 69.062500 >,< -0.000000 , 17.050800 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.03302,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1480.160034 , 1338.219971 , 125.280998 >,< 0.000000 , -139.350998 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.08300781,index++))
+ wave2.append(CreateScorchTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.9840088,index++))
+ wave2.append(CreateNukeTitanEvent(< 2775.560059 , 220.063004 , 174.468994 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.39996338,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1897.969971 , 3546.590088 , 11.343800 >,< 0.000000 , -97.514603 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.81604004,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2715.909912 , 2444.469971 , 264.968994 >,< -0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(1.93396,index++))
+ wave2.append(CreateArcTitanEvent(< 1344.760010 , 33.344200 , 256.279999 >,< -0.000000 , 154.438995 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.46600342,index++))
+ wave2.append(CreateSuperSpectreEvent(< 938.549988 , -22.322100 , 250.496002 >,< -0.000000 , 135.744995 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.4500122,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1322.630005 , 3196.280029 , 19.882500 >,< 0.000000 , -173.231995 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(0.6500244,index++))
+ wave2.append(CreateSuperSpectreEvent(< 2501.810059 , -40.656300 , 215.906006 >,< -0.000000 , 179.735992 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(2.8169556,index++))
+ wave2.append(CreateSuperSpectreEvent(< 1895.780029 , 2189.280029 , 8.031250 >,< -0.000000 , -179.473007 , 0.000000 >,"",index++))
+ wave2.append(CreateWaitForTimeEvent(3.4170532,index++))
+ wave2.append(CreateScorchTitanEvent(< 1701.880005 , -121.780998 , 227.375000 >,< -0.000000 , -13.095700 , 0.000000 >,"",0))
+ waveEvents.append(wave2)
+ index = 1
+ array<WaveEvent> wave3
+ wave3.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8170166,index++))
+ wave3.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3829956,index++))
+ wave3.append(CreateArcTitanEvent(< 2474.689941 , 1404.589966 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3637.560059 , 571.968994 , 151.500000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0830078,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3349.560059 , -12.031300 , 161.313004 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8170166,index++))
+ wave3.append(CreateDroppodStalkerEvent(< 2117.560059 , 1491.969971 , 21.625000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave3.append(CreateDroppodStalkerEvent(< 2221.560059 , -196.031006 , 250.625000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(3.1170044,index++))
+ wave3.append(CreateDroppodGruntEvent(< 2677.560059 , 1907.969971 , 53.250000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(2.5499878,index++))
+ wave3.append(CreateArcTitanEvent(< 1323.239990 , 43.979000 , 256.675995 >,< -0.000000 , 174.664993 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveEvent(0,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3637.560059 , 571.968994 , 151.500000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.6170044,index++))
+ wave3.append(CreateDroppodGruntEvent(< 3349.560059 , -12.031300 , 161.313004 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1329956,index++))
+ wave3.append(CreateDroppodStalkerEvent(< 2117.560059 , 1491.969971 , 21.625000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.6669922,index++))
+ wave3.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2000122,index++))
+ wave3.append(CreateToneSniperTitanEvent(< 3599.439941 , 21.687500 , 193.781006 >,< 0.000000 , 180.000000 , 0.000000 >,index++))
+ wave3.append(CreateWaitForTimeEvent(5.017029,index++))
+ wave3.append(CreateSuperSpectreEvent(< 3145.469971 , 43.000000 , 419.500000 >,< -0.000000 , -180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.3659668,index++))
+ wave3.append(CreateToneTitanEvent(< 2474.090088 , 1404.560059 , 63.500000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.23400879,index++))
+ wave3.append(CreateSuperSpectreEvent(< 1904.189941 , 3540.340088 , 11.500000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.5,index++))
+ wave3.append(CreateToneTitanEvent(< 2695.500000 , 3543.280029 , 30.843800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave3.append(CreateSuperSpectreEvent(< 2276.209961 , -301.247009 , 255.914001 >,< -0.000000 , 123.747002 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2000122,index++))
+ wave3.append(CreateSuperSpectreEvent(< 1281.839966 , 3074.530029 , 14.156300 >,< -0.000000 , -166.376999 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.6999512,index++))
+ wave3.append(CreateSuperSpectreEvent(< 1002.700012 , -84.696800 , 254.085007 >,< 0.000000 , 135.615005 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3330078,index++))
+ wave3.append(CreateArcTitanEvent(< 1407.380005 , 4.218750 , 249.938004 >,< 0.000000 , 154.072006 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.117004395,index++))
+ wave3.append(CreateSuperSpectreEvent(< 422.968994 , 2117.439941 , 153.593994 >,< -0.000000 , -152.798004 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.6160278,index++))
+ wave3.append(CreateToneSniperTitanEvent(< 1608.089966 , -689.601013 , 258.437988 >,< -0.000000 , -164.445999 , 0.000000 >,index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveEvent(0,index++))
+ wave3.append(CreateToneTitanEvent(< 3599.439941 , 21.687500 , 193.781006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8999634,index++))
+ wave3.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3829956,index++))
+ wave3.append(CreateNukeTitanEvent(< 1904.250000 , 3554.129883 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.184021,index++))
+ wave3.append(CreateNukeTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave3.append(CreateToneSniperTitanEvent(< 2645.750000 , -114.375000 , 234.563004 >,< 0.000000 , 180.000000 , 0.000000 >,index++))
+ wave3.append(CreateWaitForTimeEvent(1.4330444,index++))
+ wave3.append(CreateSpawnDroneEvent(< 3503.659912 , 11.184200 , 463.877014 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.6669922,index++))
+ wave3.append(CreateDroppodStalkerEvent(< -991.843994 , 411.093994 , 254.656006 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveEvent(0,index++))
+ wave3.append(CreateSuperSpectreEvent(< 3325.479980 , 201.667007 , 179.955002 >,< -0.000000 , -158.610992 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8670044,index++))
+ wave3.append(CreateSuperSpectreEvent(< 1677.130005 , 3349.620117 , 18.890200 >,< 0.000000 , -153.281006 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.217041,index++))
+ wave3.append(CreateSpawnDroneEvent(< 191.919998 , -1930.219971 , 6534.589844 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.315979,index++))
+ wave3.append(CreateSpawnDroneEvent(< 478.014008 , -2108.659912 , 6535.350098 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave3.append(CreateArcTitanEvent(< 2474.689941 , 1404.589966 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2669678,index++))
+ wave3.append(CreateToneTitanEvent(< 3562.219971 , 596.968994 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.8330078,index++))
+ wave3.append(CreateToneTitanEvent(< 1904.339966 , 3553.659912 , 13.750000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1669922,index++))
+ wave3.append(CreateToneTitanEvent(< 3599.439941 , 21.687500 , 193.781006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1329956,index++))
+ wave3.append(CreateScorchTitanEvent(< 1580.530029 , 3133.030029 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0840454,index++))
+ wave3.append(CreateScorchTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.782959,index++))
+ wave3.append(CreateScorchTitanEvent(< 2646.219971 , -114.280998 , 234.438004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.1500244,index++))
+ wave3.append(CreateNukeTitanEvent(< 2368.409912 , 2199.159912 , 11.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2669678,index++))
+ wave3.append(CreateNukeTitanEvent(< 3321.590088 , 3089.659912 , 53.437500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0,index++))
+ wave3.append(CreateNukeTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveEvent(0,index++))
+ wave3.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(0.79992676,index++))
+ wave3.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave3.append(CreateArcTitanEvent(< 1580.630005 , 3133.000000 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.3000488,index++))
+ wave3.append(CreateArcTitanEvent(< 2695.469971 , 3543.840088 , 31.062500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave3.append(CreateArcTitanEvent(< 2730.000000 , 2866.090088 , 13.093800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(1.2999268,index++))
+ wave3.append(CreateArcTitanEvent(< 991.500000 , 3212.439941 , 79.531303 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave3.append(CreateWaitForTimeEvent(5.0,index++))
+ wave3.append(CreateWaitUntilAliveEvent(0,index++))
+ wave3.append(CreateArcTitanEvent(< 2716.030029 , 2445.219971 , 17.687500 >,< 0.000000 , -90.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave3)
+ index = 1
+ array<WaveEvent> wave4
+ wave4.append(CreateSpawnDroneEvent(< 102.452003 , -2172.350098 , 6554.939941 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2000732,index++))
+ wave4.append(CreateSpawnDroneEvent(< -445.360992 , 2927.620117 , 6683.160156 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSpawnDroneEvent(< 70.420502 , -2144.540039 , 6547.779785 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave4.append(CreateSpawnDroneEvent(< 191.919998 , -1930.219971 , 6563.669922 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateSpawnDroneEvent(< -417.548004 , 2959.649902 , 6676.850098 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSpawnDroneEvent(< 74.639198 , -2204.379883 , 6556.439941 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.8000488,index++))
+ wave4.append(CreateScorchTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave4.append(CreateSpawnDroneEvent(< 3523.969971 , 589.687988 , 463.968994 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateScorchTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave4.append(CreateScorchTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave4.append(CreateArcTitanEvent(< 2474.689941 , 1404.589966 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.89990234,index++))
+ wave4.append(CreateDroppodStalkerEvent(< -3218.719971 , -1766.530029 , 391.500000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2000732,index++))
+ wave4.append(CreateDroppodStalkerEvent(< -3328.030029 , 1423.030029 , 327.500000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(2.9000244,index++))
+ wave4.append(CreateScorchTitanEvent(< 2695.409912 , 3543.750000 , 31.031300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave4.append(CreateScorchTitanEvent(< 1930.030029 , 3156.879883 , 11.156300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.79992676,index++))
+ wave4.append(CreateSuperSpectreEvent(< 2485.379883 , 2253.969971 , 8.031250 >,< 0.000000 , -151.039993 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.20007324,index++))
+ wave4.append(CreateScorchTitanEvent(< 1585.530029 , 3552.379883 , 53.968800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3107.750000 , 2873.530029 , 11.531300 >,< -0.000000 , -114.477997 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5,index++))
+ wave4.append(CreateArcTitanEvent(< 3171.560059 , 608.468994 , 150.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave4.append(CreateArcTitanEvent(< 1700.560059 , 1538.380005 , 21.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateArcTitanEvent(< 2474.689941 , 1404.589966 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3266.909912 , 586.875000 , 161.000000 >,< 0.000000 , -169.102005 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2999268,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3319.340088 , 120.438004 , 158.375000 >,< -0.000000 , 179.209000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSuperSpectreEvent(< 2479.770020 , 2250.840088 , 8.031250 >,< 0.000000 , -151.039993 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave4.append(CreateSuperSpectreEvent(< 1670.160034 , 3346.110107 , 18.495300 >,< 0.000000 , -153.237000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.5,index++))
+ wave4.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.6999512,index++))
+ wave4.append(CreateSuperSpectreEvent(< 3104.560059 , 2874.250000 , 11.468800 >,< -0.000000 , -119.355003 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.70007324,index++))
+ wave4.append(CreateSuperSpectreEvent(< 1285.500000 , 3074.939941 , 13.343800 >,< -0.000000 , -166.641006 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2999268,index++))
+ wave4.append(CreateSuperSpectreEvent(< 2612.909912 , 3263.360107 , 8.372550 >,< 0.000000 , -93.867203 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateSpawnDroneEvent(< 3436.909912 , 101.063004 , 463.968994 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave4.append(CreateScorchTitanEvent(< 1904.250000 , 3554.129883 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateScorchTitanEvent(< 2715.969971 , 2445.129883 , 17.687500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.6999512,index++))
+ wave4.append(CreateScorchTitanEvent(< 1580.530029 , 3133.030029 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.60009766,index++))
+ wave4.append(CreateToneSniperTitanEvent(< 2695.500000 , 3543.280029 , 30.843800 >,< 0.000000 , -90.000000 , 0.000000 >,index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateArcTitanEvent(< 991.500000 , 3212.439941 , 79.531303 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1000977,index++))
+ wave4.append(CreateSpawnDroneEvent(< 74.639198 , -2204.379883 , 6556.759766 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave4.append(CreateSpawnDroneEvent(< -417.548004 , 2959.649902 , 6681.479980 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSpawnDroneEvent(< 74.639198 , -2204.379883 , 6554.790039 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2000732,index++))
+ wave4.append(CreateSpawnDroneEvent(< 164.108002 , -1962.290039 , 6565.899902 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.2999268,index++))
+ wave4.append(CreateSpawnDroneEvent(< -417.548004 , 2959.649902 , 6676.520020 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(5.0,index++))
+ wave4.append(CreateWaitUntilAliveEvent(0,index++))
+ wave4.append(CreateSpawnDroneEvent(< 74.639198 , -2204.379883 , 6552.459961 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave4.append(CreateArcTitanEvent(< 2716.030029 , 2445.219971 , 17.687500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.5,index++))
+ wave4.append(CreateArcTitanEvent(< 3321.659912 , 3089.750000 , 53.437500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0,index++))
+ wave4.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.6999512,index++))
+ wave4.append(CreateArcTitanEvent(< 3600.000000 , 21.718800 , 194.000000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave4.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave4.append(CreateArcTitanEvent(< 2695.469971 , 3543.840088 , 31.062500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave4.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave4.append(CreateArcTitanEvent(< 1580.630005 , 3133.000000 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave4)
+ index = 1
+ array<WaveEvent> wave5
+ wave5.append(CreateToneSniperTitanEvent(< 3599.439941 , 21.687500 , 193.781006 >,< 0.000000 , 180.000000 , 0.000000 >,index++))
+ wave5.append(CreateWaitForTimeEvent(0.5800781,index++))
+ wave5.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave5.append(CreateArcTitanEvent(< 3146.219971 , 42.875000 , 172.218994 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.82995605,index++))
+ wave5.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateToneTitanEvent(< 2645.750000 , -114.375000 , 234.563004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5699463,index++))
+ wave5.append(CreateToneTitanEvent(< 1580.060059 , 3132.939941 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.95007324,index++))
+ wave5.append(CreateNukeTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3699951,index++))
+ wave5.append(CreateNukeTitanEvent(< 2368.409912 , 2199.159912 , 11.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave5.append(CreateNukeTitanEvent(< 3321.590088 , 3089.659912 , 53.437500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateNukeTitanEvent(< 2695.409912 , 3543.750000 , 31.031300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.079956,index++))
+ wave5.append(CreateNukeTitanEvent(< 3608.689941 , 324.875000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1500244,index++))
+ wave5.append(CreateNukeTitanEvent(< 991.468994 , 3212.340088 , 79.500000 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2700195,index++))
+ wave5.append(CreateSpawnDroneEvent(< 102.452003 , -2172.350098 , 6532.419922 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.60998535,index++))
+ wave5.append(CreateSpawnDroneEvent(< 196.169998 , -1990.069946 , 6516.410156 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2999268,index++))
+ wave5.append(CreateSpawnDroneEvent(< -417.548004 , 2959.649902 , 6638.049805 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1000977,index++))
+ wave5.append(CreateSpawnDroneEvent(< -355.891998 , 3169.709961 , 6646.209961 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(3.8999023,index++))
+ wave5.append(CreateSpawnDroneEvent(< 102.452003 , -2172.350098 , 6502.850098 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateSpawnDroneEvent(< 74.639198 , -2204.379883 , 6526.680176 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.72998047,index++))
+ wave5.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.97998047,index++))
+ wave5.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.420044,index++))
+ wave5.append(CreateNukeTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.880005,index++))
+ wave5.append(CreateToneTitanEvent(< 2645.750000 , -114.375000 , 234.563004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave5.append(CreateSpawnDroneEvent(< 3496.929932 , 95.000397 , 463.927002 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,index++))
+ wave5.append(CreateNukeTitanEvent(< 3171.469971 , 608.500000 , 150.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.9000244,index++))
+ wave5.append(CreateNukeTitanEvent(< 3608.689941 , 324.875000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1199951,index++))
+ wave5.append(CreateNukeTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.79992676,index++))
+ wave5.append(CreateToneTitanEvent(< 2367.909912 , 2199.060059 , 11.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.5,index++))
+ wave5.append(CreateSpawnDroneEvent(< 191.919998 , -1930.219971 , 6518.930176 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0999756,index++))
+ wave5.append(CreateSpawnDroneEvent(< 478.014008 , -2108.659912 , 6532.169922 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2800293,index++))
+ wave5.append(CreateSpawnDroneEvent(< 70.420502 , -2144.540039 , 6517.500000 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4899902,index++))
+ wave5.append(CreateSpawnDroneEvent(< 3466.889893 , 69.121399 , 591.948975 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5999756,index++))
+ wave5.append(CreateSpawnDroneEvent(< -323.829987 , 3141.929932 , 6701.140137 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateSpawnDroneEvent(< 196.169998 , -1990.069946 , 6509.910156 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1600342,index++))
+ wave5.append(CreateSpawnDroneEvent(< 445.983002 , -2080.850098 , 6576.009766 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4499512,index++))
+ wave5.append(CreateNukeTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3699951,index++))
+ wave5.append(CreateNukeTitanEvent(< 3171.469971 , 608.500000 , 150.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3200684,index++))
+ wave5.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1799316,index++))
+ wave5.append(CreateNukeTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3300781,index++))
+ wave5.append(CreateNukeTitanEvent(< 2646.219971 , -114.280998 , 234.438004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4499512,index++))
+ wave5.append(CreateNukeTitanEvent(< 2368.409912 , 2199.159912 , 11.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8399658,index++))
+ wave5.append(CreateSpawnDroneEvent(< 2550.909912 , 1338.000000 , 392.437988 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1600342,index++))
+ wave5.append(CreateSpawnDroneEvent(< 2652.000000 , 1237.910034 , 520.499023 >,< 0.000000 , 0.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0200195,index++))
+ wave5.append(CreateArcTitanEvent(< 3321.659912 , 3089.750000 , 53.437500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave5.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave5.append(CreateArcTitanEvent(< 2474.689941 , 1404.589966 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,index++))
+ wave5.append(CreateNukeTitanEvent(< 1904.250000 , 3554.129883 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.3800049,index++))
+ wave5.append(CreateNukeTitanEvent(< 1580.530029 , 3133.030029 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.73999023,index++))
+ wave5.append(CreateNukeTitanEvent(< 2729.939941 , 2866.000000 , 13.093800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.89990234,index++))
+ wave5.append(CreateSpawnDroneEvent(< 102.452003 , -2172.350098 , 6507.430176 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.5600586,index++))
+ wave5.append(CreateSpawnDroneEvent(< 164.108002 , -1962.290039 , 6557.959961 >,< 0.004999 , -175.953003 , 0.000004 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8000488,index++))
+ wave5.append(CreateNukeTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1199951,index++))
+ wave5.append(CreateNukeTitanEvent(< 3562.689941 , 597.062988 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1600342,index++))
+ wave5.append(CreateNukeTitanEvent(< 2646.219971 , -114.280998 , 234.438004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1999512,index++))
+ wave5.append(CreateNukeTitanEvent(< 1904.250000 , 3554.129883 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.2199707,index++))
+ wave5.append(CreateNukeTitanEvent(< 2715.969971 , 2445.129883 , 17.687500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.60009766,index++))
+ wave5.append(CreateToneTitanEvent(< 2474.090088 , 1404.560059 , 63.500000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.5,index++))
+ wave5.append(CreateNukeTitanEvent(< 1580.530029 , 3133.030029 , 12.375000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.57995605,index++))
+ wave5.append(CreateNukeTitanEvent(< 2695.409912 , 3543.750000 , 31.031300 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.420044,index++))
+ wave5.append(CreateNukeTitanEvent(< 3321.590088 , 3089.659912 , 53.437500 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1199951,index++))
+ wave5.append(CreateNukeTitanEvent(< 3599.909912 , 21.781300 , 193.906006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.95996094,index++))
+ wave5.append(CreateNukeTitanEvent(< 1700.469971 , 1538.439941 , 21.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateNukeTitanEvent(< 2474.560059 , 1404.660034 , 63.562500 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0300293,index++))
+ wave5.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.1699219,index++))
+ wave5.append(CreateArcTitanEvent(< 3600.000000 , 21.718800 , 194.000000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0200195,index++))
+ wave5.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateNukeTitanEvent(< 3146.129883 , 42.906300 , 172.250000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.8100586,index++))
+ wave5.append(CreateNukeTitanEvent(< 2646.219971 , -114.280998 , 234.438004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4899902,index++))
+ wave5.append(CreateNukeTitanEvent(< 2368.409912 , 2199.159912 , 11.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateArcTitanEvent(< 3562.780029 , 597.000000 , 147.031006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.7800293,index++))
+ wave5.append(CreateArcTitanEvent(< 3600.000000 , 21.718800 , 194.000000 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0200195,index++))
+ wave5.append(CreateArcTitanEvent(< 3146.219971 , 42.875000 , 172.218994 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateArcTitanEvent(< 1904.310059 , 3554.219971 , 13.718800 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.67993164,index++))
+ wave5.append(CreateScorchTitanEvent(< 255.968994 , 2110.750000 , 184.938004 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0300293,index++))
+ wave5.append(CreateScorchTitanEvent(< 1700.469971 , 1538.439941 , 21.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(5.0,index++))
+ wave5.append(CreateWaitUntilAliveEvent(0,index++))
+ wave5.append(CreateScorchTitanEvent(< 255.968994 , 2110.750000 , 184.938004 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(0.70007324,index++))
+ wave5.append(CreateNukeTitanEvent(< 1762.500000 , 758.437988 , 143.593994 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.0,index++))
+ wave5.append(CreateNukeTitanEvent(< 2646.219971 , -114.280998 , 234.438004 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++))
+ wave5.append(CreateWaitForTimeEvent(1.4000244,index++))
+ wave5.append(CreateNukeTitanEvent(< 1700.469971 , 1538.439941 , 21.031300 >,< 0.000000 , 180.000000 , 0.000000 >,"",0))
+ waveEvents.append(wave5)
+
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut
index 37b89169..5c6a18ed 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut
@@ -1 +1,6 @@
-//fuck \ No newline at end of file
+void function CodeCallback_MapInit()
+{
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut
index 341493ba..d19d88ee 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut
@@ -29,8 +29,13 @@ void function CodeCallback_MapInit()
// currently disabled until finished: intro
if ( !IsFFAGame() )
ClassicMP_SetLevelIntro( WargamesIntroSetup, 20.0 )
+
+ // Load Frontier Defense Data
+ if(GameRules_GetGameMode()=="fd")
+ initFrontierDefenseData()
}
+
void function AddEvacNodes()
{
AddEvacNode( GetEnt( "evac_location1" ) )
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut
index 37b89169..cd3e2822 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut
@@ -1 +1,23 @@
-//fuck \ No newline at end of file
+global function initFrontierDefenseData
+void function initFrontierDefenseData()
+{
+ shopPosition = <0,0,0>
+
+
+ array<WaveEvent> wave0
+ array<WaveEvent> wave1
+ array<WaveEvent> wave2
+ array<WaveEvent> wave3
+ array<WaveEvent> wave4
+
+
+
+
+
+
+ waveEvents.append(wave0)
+ waveEvents.append(wave1)
+ waveEvents.append(wave2)
+ waveEvents.append(wave3)
+ waveEvents.append(wave4)
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut
index 6ec0bc0a..b4045f3e 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut
@@ -97,6 +97,8 @@ function CloakerThink( entity cloaker, float radius, array<string> ents = [ "any
void function CloakerCloaksGuy( guy )
{
+ if( guy.IsNPC() )
+ guy.SetCanCloak(true) // if you don't want to cloak specific targets, it should be handled by shouldCloakGuyFunc in CloakerThink
guy.SetCloakDuration( 2.0, -1, 0 )
EmitSoundOnEntity( guy, CLOAKED_DRONE_CLOAK_START_SFX )
EmitSoundOnEntity( guy, CLOAKED_DRONE_CLOAK_LOOP_SFX )
@@ -110,6 +112,8 @@ void function CloakerDeCloaksGuy( guy )
StopSoundOnEntity( guy, CLOAKED_DRONE_CLOAK_LOOP_SFX )
guy.Minimap_AlwaysShow( TEAM_IMC, null )
guy.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ if( guy.IsNPC() )
+ guy.SetCanCloak(false)
}
bool function CloakerShouldCloakGuy( entity cloaker, entity guy )
@@ -118,4 +122,4 @@ bool function CloakerShouldCloakGuy( entity cloaker, entity guy )
return false
return true
-} \ No newline at end of file
+}