From ccecc951d4a37902c5d07311a6108b68a3542609 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 17 Feb 2022 02:33:37 +0100 Subject: [PATCH 01/99] Spawn Harvester and load Npc Routes --- .../vscripts/gamemodes/_gamemode_fd.nut | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 8a6b8bf0b..843614546 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,12 +1,119 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD + +struct { + array aiSpawnpoints + array smokePoints + array routeNodes +}file + void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) + AddCallback_EntitiesDidLoad(LoadEntities) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) { +} + +void function spawnSmokes() +{ + +} + + +array function getRoute(string routeName) +{ + foreach(entity node in file.routeNodes) + { + if(!node.HasKey("route_name")) + continue + if(node.kv.route_name==routeName) + return node.GetLinkEntArray() + } + printt("Route not found") + return [] +} + +vector function getShopPosition() +{ + switch(GetMapName()) + { + case"mp_forwardbase_kodai": + return < -3862.13, 1267.69, 1060.06> + default: + return <0,0,0> + } + unreachable + +} + + + +void function LoadEntities() +{ + CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) + + + + + 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": + entity harvester = CreateEntity( "prop_script" ) + harvester.SetValueForModelKey( $"models/props/generator_coop/generator_coop.mdl" ) + harvester.SetOrigin( info_target.GetOrigin() ) + harvester.SetAngles( info_target.GetAngles() ) + harvester.kv.solid = SOLID_VPHYSICS + harvester.SetHealth(25000) + harvester.SetShieldHealthMax(6000) + harvester.SetShieldHealth(6000) + SetTeam(harvester,TEAM_IMC) + DispatchSpawn( harvester ) + SetGlobalNetEnt("FD_activeHarvester",harvester) + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) + // blackbox.Hide() + // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + + entity rings = CreatePropDynamic(MODEL_HARVESTER_TOWER_RINGS,info_target.GetOrigin(),info_target.GetAngles(),6) + thread PlayAnim( rings, "generator_cycle_fast" ) + + entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) + entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + + 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": + file.aiSpawnpoints.append(info_target) + break + case"info_fd_route_node": + file.routeNodes.append(info_target) + break + case"info_fd_smoke_screen": + file.smokePoints.append(info_target) + break + } + + + + } + + + + + } + } \ No newline at end of file From 3b017e19ea525ef7386a02cdd5b620ced146edc2 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 17 Feb 2022 19:20:49 +0100 Subject: [PATCH 02/99] Harvester Color change with health --- .../vscripts/gamemodes/_gamemode_fd.nut | 137 +++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 843614546..8e5a01882 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,17 +1,32 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD +global function useHarvesterShieldBoost +struct HarvesterStruct { + entity harvester + entity particleBeam + entity particleShield + entity rings + float lastDamage + bool shieldBoost + +} + struct { array aiSpawnpoints array smokePoints array routeNodes + HarvesterStruct harvester + table harvesterDamageSource + bool haversterWasDamaged }file void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) AddCallback_EntitiesDidLoad(LoadEntities) + AddDamageCallback("prop_script",OnDamagedPropScript) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) @@ -19,6 +34,22 @@ void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) } +bool function useHarvesterShieldBoost() //returns true when acturally used +{ + if(file.harvester.harvester.GetShieldHealth() function getRoute(string routeName) return [] } -vector function getShopPosition() +vector function getShopPosition() { switch(GetMapName()) { @@ -51,12 +82,104 @@ vector function getShopPosition() } +void function waveStart() +{ + file.haversterWasDamaged = false +} + + +void function OnDamagedPropScript(entity prop,var damageInfo) +{ + + if(!IsValid(file.harvester.harvester)) + return + + if(!IsValid(prop)) + return + + if(file.harvester.harvester!=prop) + return + + if(structHarvester.shieldBoost) + { + harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + return + } + + int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo ) + entity attacker = DamageInfo_GetAttacker( damageInfo ) + float damageAmount = DamageInfo_GetDamage( damageInfo ) + + if ( !damageSourceID ) + return + + if ( !damageAmount ) + return + + if ( !attacker ) + return + //TODO Log damage source for round lose screen + file.harvester.lastDamage = Time() + if(prop.GetShieldHealth()==0) + { + float newHealth = prop.GetHealth()-damageAmount + if(newHealth<0) + { + newHealth=0 + file.harvester.rings.Destroy() + } + + + prop.SetHealth(newHealth) + file.haversterWasDamaged = true + } + + + +} + +void function HarvesterThink(HarvesterStruct structHarvester) +{ + entity harvester = structHarvester.harvester + entity particleBeam = structHarvester.particleBeam + entity particleShield = structHarvester.particleShield + + float lastTime = Time() + WaitFrame() + + + + while(IsAlive(harvester)){ + float currentTime = Time() + float deltaTime = currentTime -lastTime + vector shieldColor = GraphCappedVector(harvester.GetShieldHealth(), 0, harvester.GetShieldHealthMax(),TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) + EffectSetControlPointVector( particleShield, 1, shieldColor ) + vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) + EffectSetControlPointVector( particleBeam, 1, beamColor ) + if(((currentTime-structHarvester.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=harvester.GetShieldHealthMax()) + { + harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + } + else + { + harvester.SetShieldHealth(newShieldHealth) + } + } + lastTime = currentTime + WaitFrame() + } + +} void function LoadEntities() { CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) - + OpenBoostStores() @@ -74,12 +197,16 @@ void function LoadEntities() harvester.SetOrigin( info_target.GetOrigin() ) harvester.SetAngles( info_target.GetAngles() ) harvester.kv.solid = SOLID_VPHYSICS + + harvester.SetMaxHealth(25000) harvester.SetHealth(25000) harvester.SetShieldHealthMax(6000) harvester.SetShieldHealth(6000) SetTeam(harvester,TEAM_IMC) DispatchSpawn( harvester ) + SetGlobalNetEnt("FD_activeHarvester",harvester) + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) // blackbox.Hide() // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER @@ -92,6 +219,12 @@ void function LoadEntities() entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + file.harvester.harvester = harvester + file.harvester.particleBeam = Harvester_Beam + file.harvester.particleShield = Harvester_Shield + file.harvester.lastDamage = Time() + file.harvester.rings = rings + thread HarvesterThink(file.harvester) break case"info_fd_mode_model": entity prop = CreatePropDynamic( info_target.GetModelName(), info_target.GetOrigin(), info_target.GetAngles(), 6 ) From 5fe2f99b4ac67163463ce1034566d9770f92b011 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 19 Feb 2022 02:32:33 +0100 Subject: [PATCH 03/99] moved harvester creation, added harvester sound, added smokes --- .../mod/scripts/vscripts/_harvester.gnut | 58 +++++- .../vscripts/gamemodes/_gamemode_fd.nut | 173 +++++++++++------- 2 files changed, 164 insertions(+), 67 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 37b891699..71bbd3451 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -1 +1,57 @@ -//fuck \ No newline at end of file +global function SpawnHarvester +global function startHarvesterFX + +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) + SetTeam(harvester,team) + DispatchSpawn( harvester ) + + SetGlobalNetEnt("FD_activeHarvester",harvester) + + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) + // blackbox.Hide() + // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + + 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 startHarvesterFX(HarvesterStruct harvester) +{ + entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) + entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + harvester.particleBeam = Harvester_Beam + harvester.particleShield = Harvester_Shield + return harvester +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 8e5a01882..4f434fd2c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,23 +1,16 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD global function useHarvesterShieldBoost +global function spawnSmokes +global function waveStart +global function startHarvester - -struct HarvesterStruct { - entity harvester - entity particleBeam - entity particleShield - entity rings - float lastDamage - bool shieldBoost - -} +global HarvesterStruct harvesterStruct struct { array aiSpawnpoints array smokePoints array routeNodes - HarvesterStruct harvester table harvesterDamageSource bool haversterWasDamaged }file @@ -25,8 +18,10 @@ struct { void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) + PrecacheParticleSystem($"P_smokescreen_FD") AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) + } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) @@ -36,23 +31,40 @@ void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) bool function useHarvesterShieldBoost() //returns true when acturally used { - if(file.harvester.harvester.GetShieldHealth() + smokescreen.angles = pos.GetAngles() + smokescreen.lifetime = 30 + 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) + } } @@ -85,24 +97,38 @@ vector function getShopPosition() void function waveStart() { file.haversterWasDamaged = false + array enemys = [eFD_AITypeIDs.TITAN,eFD_AITypeIDs.GRUNT,-1,-1,-1,-1,-1,-1,-1] + + SetGlobalNetInt("FD_currentWave",2) + SetGlobalNetBool("FD_waveActive",true) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.TITAN), 69) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.GRUNT), 420) + + 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]) + } + + } void function OnDamagedPropScript(entity prop,var damageInfo) { - if(!IsValid(file.harvester.harvester)) + if(!IsValid(harvesterStruct.harvester)) return if(!IsValid(prop)) return - if(file.harvester.harvester!=prop) + if(harvesterStruct.harvester!=prop) return - if(structHarvester.shieldBoost) + if(harvesterStruct.shieldBoost) { - harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + prop.SetShieldHealth(prop.GetShieldHealthMax()) return } @@ -119,14 +145,16 @@ void function OnDamagedPropScript(entity prop,var damageInfo) if ( !attacker ) return //TODO Log damage source for round lose screen - file.harvester.lastDamage = Time() + harvesterStruct.lastDamage = Time() if(prop.GetShieldHealth()==0) { float newHealth = prop.GetHealth()-damageAmount if(newHealth<0) - { + { + EmitSoundAtPosition(TEAM_UNASSIGNED,harvesterStruct.harvester.GetOrigin(),"coop_generator_destroyed") newHealth=0 - file.harvester.rings.Destroy() + harvesterStruct.rings.Destroy() + } @@ -138,17 +166,24 @@ void function OnDamagedPropScript(entity prop,var damageInfo) } -void function HarvesterThink(HarvesterStruct structHarvester) +void function HarvesterThink() { - entity harvester = structHarvester.harvester - entity particleBeam = structHarvester.particleBeam - entity particleShield = structHarvester.particleShield - + entity harvester = harvesterStruct.harvester + + EmitSoundOnEntity(harvester,"coop_generator_startup") float lastTime = Time() - WaitFrame() - + wait 4 + int lastShieldHealth = 6000 + HarvesterStruct temp = startHarvesterFX(harvesterStruct) + harvesterStruct.particleBeam = temp.particleBeam + harvesterStruct.particleShield = temp.particleShield + wait 5 + EmitSoundOnEntity(harvester,"coop_generator_ambient_healthy") + entity particleBeam = harvesterStruct.particleBeam + entity particleShield = harvesterStruct.particleShield + while(IsAlive(harvester)){ float currentTime = Time() @@ -157,27 +192,61 @@ void function HarvesterThink(HarvesterStruct structHarvester) EffectSetControlPointVector( particleShield, 1, shieldColor ) vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) EffectSetControlPointVector( particleBeam, 1, beamColor ) - if(((currentTime-structHarvester.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=harvester.GetShieldHealthMax()) { + StopSoundOnEntity(harvester,"coop_generator_shieldrecharge_resume") harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_end") + } else { harvester.SetShieldHealth(newShieldHealth) } } + 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(harvesterStruct.harvester)) + { + if(harvesterStruct.harvester.GetShieldHealth()==0) + { + EmitSoundOnEntity(harvesterStruct.harvester,"coop_generator_underattack_alarm") + wait 2.5 + } + else + { + WaitFrame() + } + } +} void function LoadEntities() { + SetGlobalNetInt("FD_totalWaves",5) + SetGlobalNetInt("FD_restartsRemaining",2) CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) OpenBoostStores() @@ -192,39 +261,11 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - entity harvester = CreateEntity( "prop_script" ) - harvester.SetValueForModelKey( $"models/props/generator_coop/generator_coop.mdl" ) - harvester.SetOrigin( info_target.GetOrigin() ) - harvester.SetAngles( info_target.GetAngles() ) - harvester.kv.solid = SOLID_VPHYSICS - - harvester.SetMaxHealth(25000) - harvester.SetHealth(25000) - harvester.SetShieldHealthMax(6000) - harvester.SetShieldHealth(6000) - SetTeam(harvester,TEAM_IMC) - DispatchSpawn( harvester ) - - SetGlobalNetEnt("FD_activeHarvester",harvester) - - // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) - // blackbox.Hide() - // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER - - entity rings = CreatePropDynamic(MODEL_HARVESTER_TOWER_RINGS,info_target.GetOrigin(),info_target.GetAngles(),6) - thread PlayAnim( rings, "generator_cycle_fast" ) + HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) + harvesterStruct.harvester = ret.harvester + harvesterStruct.rings = ret.rings + harvesterStruct.lastDamage = ret.lastDamage - entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) - entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) - - file.harvester.harvester = harvester - file.harvester.particleBeam = Harvester_Beam - file.harvester.particleShield = Harvester_Shield - file.harvester.lastDamage = Time() - file.harvester.rings = rings - thread HarvesterThink(file.harvester) break case"info_fd_mode_model": entity prop = CreatePropDynamic( info_target.GetModelName(), info_target.GetOrigin(), info_target.GetAngles(), 6 ) From 5579adf02f42513eb881fbf536fdea009ea79f83 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 21 Feb 2022 00:54:52 +0100 Subject: [PATCH 04/99] Added wave event logic added some first Events created method to get 9 most spawned enemies for client ui split Harvester Fx to make shield disappear when down --- .../mod/scripts/vscripts/_harvester.gnut | 18 +- .../vscripts/gamemodes/_gamemode_fd.nut | 471 +++++++++++++++--- .../mp/levels/mp_forwardbase_kodai.nut | 8 +- .../mp/levels/mp_forwardbase_kodai_fd.nut | 59 ++- 4 files changed, 465 insertions(+), 91 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 71bbd3451..e5e60bf24 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -1,5 +1,6 @@ global function SpawnHarvester -global function startHarvesterFX +global function generateBeamFX +global function generateShieldFX global struct HarvesterStruct { entity harvester @@ -45,13 +46,18 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i return ret } -HarvesterStruct function startHarvesterFX(HarvesterStruct harvester) +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, < 126.0, 188.0, 236.0 > ) - entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + EffectSetControlPointVector( Harvester_Beam, 1, GetShieldTriLerpColor(0.0) ) harvester.particleBeam = Harvester_Beam - harvester.particleShield = Harvester_Shield 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/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 4f434fd2c..ef952b24a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,11 +1,47 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD -global function useHarvesterShieldBoost -global function spawnSmokes -global function waveStart global function startHarvester +global function createSmokeEvent +global function createArcTitanEvent +global function createWaitForTimeEvent +global function createSuperSpectreEvent +global function createDroppodGruntEvent + +global struct SmokeEvent{ + vector position + float lifetime +} + +global struct SpawnEvent{ + vector origin + vector angles + string route + 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 amount of spawned enemys + string npcClassName + string aiSettings +} + +global struct WaitEvent{ + float amount +} + +global struct SoundEvent{ + string soundEventName +} + +global struct WaveEvent{ + void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction + SmokeEvent smokeEvent + SpawnEvent spawnEvent + WaitEvent waitEvent + SoundEvent soundEvent +} -global HarvesterStruct harvesterStruct + +global HarvesterStruct fd_harvester +global vector shopPosition +global array > waveEvents struct { array aiSpawnpoints @@ -21,53 +57,43 @@ void function GamemodeFD_Init() PrecacheParticleSystem($"P_smokescreen_FD") AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) - + AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) + AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) { - + } -bool function useHarvesterShieldBoost() //returns true when acturally used +bool function useShieldBoost(entity player,array args) { - if(harvesterStruct.harvester.GetShieldHealth()0)) + { + fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) + SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) + player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) } - return false + return true } -void function useHarvesterShieldBoost_threaded() + +void function startMainGameLoop() { - harvesterStruct.shieldBoost = true - wait 5 - harvesterStruct.shieldBoost = false + thread mainGameLoop() } -void function spawnSmokes() -{ - entity owner = GetPlayerArray()[0] - foreach(entity pos in file.smokePoints) - { - SmokescreenStruct smokescreen - smokescreen.smokescreenFX = $"P_smokescreen_FD" - smokescreen.ownerTeam = owner.GetTeam() - smokescreen.damageSource = eDamageSourceId.mp_weapon_grenade_electric_smoke - smokescreen.deploySound1p = "explo_electric_smoke_impact" - smokescreen.deploySound3p = "explo_electric_smoke_impact" - smokescreen.isElectric = false - smokescreen.origin = pos.GetOrigin()+<0,0,150> - smokescreen.angles = pos.GetAngles() - smokescreen.lifetime = 30 - 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 mainGameLoop() +{ + startHarvester() + runWave(0) + } + + + + array function getRoute(string routeName) { foreach(entity node in file.routeNodes) @@ -80,36 +106,98 @@ array function getRoute(string routeName) printt("Route not found") return [] } - -vector function getShopPosition() +array function getEnemyTypesForWave(int wave) { - switch(GetMapName()) + table 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[wave]) { - case"mp_forwardbase_kodai": - return < -3862.13, 1267.69, 1060.06> - default: - return <0,0,0> + 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.TITAN_SNIPER): + npcs[eFD_AITypeIDs.TITAN]+=e.spawnEvent.spawnAmount + break + default: + npcs[e.spawnEvent.spawnType]+=e.spawnEvent.spawnAmount + } + } + array ret = [-1,-1,-1,-1,-1,-1,-1,-1,-1] + foreach(int key,int value in npcs){ + printt("Key",key,"has value",value) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID(key),value) + 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]] enemys = [eFD_AITypeIDs.TITAN,eFD_AITypeIDs.GRUNT,-1,-1,-1,-1,-1,-1,-1] + array enemys = getEnemyTypesForWave(waveIndex) - SetGlobalNetInt("FD_currentWave",2) + SetGlobalNetInt("FD_currentWave",waveIndex) SetGlobalNetBool("FD_waveActive",true) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.TITAN), 69) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.GRUNT), 420) + 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]) } - + foreach(WaveEvent event in waveEvents[waveIndex]) + { + event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + } } @@ -117,16 +205,16 @@ void function waveStart() void function OnDamagedPropScript(entity prop,var damageInfo) { - if(!IsValid(harvesterStruct.harvester)) + if(!IsValid(fd_harvester.harvester)) return if(!IsValid(prop)) return - if(harvesterStruct.harvester!=prop) + if(fd_harvester.harvester!=prop) return - if(harvesterStruct.shieldBoost) + if(GetGlobalNetTime("FD_harvesterInvulTime")>Time()) { prop.SetShieldHealth(prop.GetShieldHealthMax()) return @@ -145,19 +233,19 @@ void function OnDamagedPropScript(entity prop,var damageInfo) if ( !attacker ) return //TODO Log damage source for round lose screen - harvesterStruct.lastDamage = Time() + + fd_harvester.lastDamage = Time() if(prop.GetShieldHealth()==0) { + float newHealth = prop.GetHealth()-damageAmount if(newHealth<0) { - EmitSoundAtPosition(TEAM_UNASSIGNED,harvesterStruct.harvester.GetOrigin(),"coop_generator_destroyed") + EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") newHealth=0 - harvesterStruct.rings.Destroy() - + fd_harvester.rings.Destroy() } - - + prop.SetHealth(newHealth) file.haversterWasDamaged = true } @@ -168,33 +256,42 @@ void function OnDamagedPropScript(entity prop,var damageInfo) void function HarvesterThink() { - entity harvester = harvesterStruct.harvester + entity harvester = fd_harvester.harvester EmitSoundOnEntity(harvester,"coop_generator_startup") float lastTime = Time() wait 4 - int lastShieldHealth = 6000 - HarvesterStruct temp = startHarvesterFX(harvesterStruct) - harvesterStruct.particleBeam = temp.particleBeam - harvesterStruct.particleShield = temp.particleShield - wait 5 + int lastShieldHealth = harvester.GetShieldHealth() + generateBeamFX(fd_harvester) + generateShieldFX(fd_harvester) + EmitSoundOnEntity(harvester,"coop_generator_ambient_healthy") - entity particleBeam = harvesterStruct.particleBeam - entity particleShield = harvesterStruct.particleShield + while(IsAlive(harvester)){ float currentTime = Time() float deltaTime = currentTime -lastTime - vector shieldColor = GraphCappedVector(harvester.GetShieldHealth(), 0, harvester.GetShieldHealthMax(),TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) - EffectSetControlPointVector( particleShield, 1, shieldColor ) - vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) - EffectSetControlPointVector( particleBeam, 1, beamColor ) - if(((currentTime-harvesterStruct.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=5) + SetGlobalNetInt("FD_restartsRemaining",0) + else + SetGlobalNetInt("FD_restartsRemaining",2) + +} + void function LoadEntities() { - SetGlobalNetInt("FD_totalWaves",5) - SetGlobalNetInt("FD_restartsRemaining",2) - CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) + initNetVars() + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) OpenBoostStores() @@ -262,9 +367,9 @@ void function LoadEntities() switch(info_target.kv.editorclass){ case"info_fd_harvester": HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) - harvesterStruct.harvester = ret.harvester - harvesterStruct.rings = ret.rings - harvesterStruct.lastDamage = ret.lastDamage + fd_harvester.harvester = ret.harvester + fd_harvester.rings = ret.rings + fd_harvester.lastDamage = ret.lastDamage break case"info_fd_mode_model": @@ -272,6 +377,9 @@ void function LoadEntities() break case"info_fd_ai_position": file.aiSpawnpoints.append(info_target) + if(info_target.kv.aiType=="3") + CreatePropDynamic($"models/vehicle/escape_pod/escape_pod.mdl",info_target.GetOrigin(),info_target.GetAngles(),6) + break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -290,4 +398,201 @@ void function LoadEntities() } -} \ No newline at end of file +} + +/****************************************************************************************************************\ +####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### +# # # # ## # # # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### +# # # # # # # # # # # # # # # # # ####### # # # # # +# # # # # ## # # # # # ## # # # # # # # # # # +####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # +\*****************************************************************************************************************/ + +WaveEvent function createSmokeEvent(vector position,float lifetime) +{ + WaveEvent event + event.eventFunction = spawnSmoke + event.smokeEvent.position = position + event.smokeEvent.lifetime = lifetime + return event +} + +WaveEvent function createArcTitanEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnArcTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_ARC + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + +WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnSuperSpectre + event.spawnEvent.spawnType= eFD_AITypeIDs.REAPER + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + +WaveEvent function createDroppodGruntEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodGrunts + event.spawnEvent.spawnType= eFD_AITypeIDs.GRUNT + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + +WaveEvent function createWaitForTimeEvent(float amount) +{ + WaveEvent event + event.eventFunction = waitForTime + event.waitEvent.amount = amount + return event +} + +WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount) +{ + WaveEvent event + event.eventFunction = spawnGenericNPC + event.spawnEvent.npcClassName = npcClassName + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + event.spawnEvent.spawnType = spawnType + event.spawnEvent.spawnAmount = spawnAmount + return event +} + + +WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount) +{ + WaveEvent event + event.eventFunction = spawnGenericNPCTitanwithSettings + 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 + return event +} + +/************************************************************************************************************\ +####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### +# # # # ## # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # ## # # # # # ## # # # # # # # ## # # +####### # ####### # # # # ##### # # ##### # ### ####### # # ##### +\************************************************************************************************************/ + +void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + printt("smoke") + SmokescreenStruct smokescreen + smokescreen.smokescreenFX = $"P_smokescreen_FD" + smokescreen.isElectric = false + smokescreen.origin = smokeEvent.position + 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 spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + DispatchSpawn(npc) +} + +void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + wait waitEvent.amount +} + +void function waitUntil(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + wait waitEvent.amount +} + +void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + DispatchSpawn(npc) +} + +void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + CreateTrackedDroppod(spawnEvent.origin,TEAM_IMC) +} +void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) + DispatchSpawn(npc) +} +void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) + SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) + DispatchSpawn(npc) +} +void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) + SetSpawnOption_AISettings(npc,"npc_titan_minigun_nuke") + DispachSpawn(npc) +} + +/********************************************************************************************************************\ +# # ####### # ###### ####### ###### ####### # # # # ##### ####### ### ####### # # ##### +# # # # # # # # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # # +####### ##### # ###### ##### ###### ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # ## # # # # # # # ## # # +# # ####### ####### # ####### # # # ##### # # ##### # ### ####### # # ##### +\********************************************************************************************************************/ + + +void function CreateTrackedDroppod( vector origin, int team , ) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSoldier( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} 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 37b891699..94dce4707 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 +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_forwardbase_kodai_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut index 37b891699..bc68d794a 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,58 @@ -//fuck \ No newline at end of file +global function initFrontierDefenseData + + +void function initFrontierDefenseData() +{ + shopPosition = < -3862.13, 1267.69, 1060.06> + + + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) + //wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + //wave0.append(createWaitForTimeEvent(5)) + wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"")) + wave0.append(createDroppodGruntEvent(< -12, 1720, 1556>,"")) + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +} + +/* +void function initFrontierDefenseData() +{ + shopPosition = + + SmokeEvent emptySmokeEvent + SpawnEvent emptySpawnEvent + WaitEvent emptyWaitEvent + SoundEvent emptySoundEvent + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + + + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +}*/ \ No newline at end of file From e5307e8d91068b046d799b5c064b3ab673957fae Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 22 Feb 2022 23:10:19 +0100 Subject: [PATCH 05/99] More Events and Titan Navigation --- .../mod/scripts/vscripts/_harvester.gnut | 10 +- .../scripts/vscripts/ai/_ai_emp_titans.gnut | 2 +- .../mod/scripts/vscripts/ai/_ai_spawn.gnut | 2 +- .../vscripts/gamemodes/_gamemode_fd.nut | 304 ++++++++++++++---- .../mp/levels/mp_forwardbase_kodai_fd.nut | 27 +- 5 files changed, 275 insertions(+), 70 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index e5e60bf24..3ba6a6db4 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -24,14 +24,18 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i 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,info_target.GetOrigin(),info_target.GetAngles(),6) - // blackbox.Hide() - // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + 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" ) 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 638166c83..fd1bbff1d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut @@ -28,7 +28,7 @@ void function EMPTitanThinkConstant( entity titan ) titan.EndSignal( "StopEMPField" ) //We don't want pilots accidently rodeoing an electrified titan. - DisableTitanRodeo( titan ) + // DisableTitanRodeo( titan ) //Used to identify this titan as an arc titan SetTargetName( titan, "empTitan" ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut index 7e4d2cddf..8599f4294 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut @@ -223,7 +223,7 @@ entity function CreateOgre( int team, vector origin, vector angles, array 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 } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index ef952b24a..7f75144bc 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -6,6 +6,12 @@ global function createArcTitanEvent global function createWaitForTimeEvent global function createSuperSpectreEvent global function createDroppodGruntEvent +global function createNukeTitanEvent +global function createGenericSpawnEvent +global function createGenericTitanSpawnWithAiSettingsEvent +global function createDroppodStalkerEvent +global function createDroppodSpectreMortarEvent +global function createWaitUntilAliveEvent global struct SmokeEvent{ vector position @@ -17,7 +23,7 @@ global struct SpawnEvent{ vector angles string route 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 amount 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 } @@ -42,6 +48,7 @@ global struct WaveEvent{ global HarvesterStruct fd_harvester global vector shopPosition global array > waveEvents +global table > routes struct { array aiSpawnpoints @@ -59,13 +66,13 @@ void function GamemodeFD_Init() AddDamageCallback("prop_script",OnDamagedPropScript) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) -} + RegisterSignal("FD_ReachedHarvester") + RegisterSignal("OnFailedToPath") -void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) -{ - } +void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} + bool function useShieldBoost(entity player,array args) { if((GetGlobalNetTime("FD_harvesterInvulTime")0)) @@ -85,27 +92,44 @@ void function startMainGameLoop() void function mainGameLoop() { startHarvester() - runWave(0) + bool showShop = false + for(int i = 0;i<2;i++)//for(int i = 0;i function getRoute(string routeName) -{ +{ + array ret + array currentNode = [] foreach(entity node in file.routeNodes) { if(!node.HasKey("route_name")) continue if(node.kv.route_name==routeName) - return node.GetLinkEntArray() + { + currentNode = [node] + break + } + + } + if(currentNode.len()==0) + { + printt("Route not found") + return [] } - printt("Route not found") - return [] + while(currentNode.len()!=0) + { + ret.append(currentNode[0]) + currentNode = currentNode[0].GetLinkEntArray() + } + return ret } + array function getEnemyTypesForWave(int wave) { table npcs @@ -180,28 +204,41 @@ array function getEnemyTypesForWave(int wave) } -void function runWave(int waveIndex) -{ - file.haversterWasDamaged = false - array enemys = getEnemyTypesForWave(waveIndex) - +void function runWave(int waveIndex,bool shouldDoBuyTime) +{ SetGlobalNetInt("FD_currentWave",waveIndex) - SetGlobalNetBool("FD_waveActive",true) - - + file.haversterWasDamaged = false + array enemys = getEnemyTypesForWave(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) + { + SetGlobalNetTime("FD_nextWaveStartTime",Time()+75) + OpenBoostStores() + wait 75 + CloseBoostStores() + } + else + { + //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10) + wait 10 + } + + SetGlobalNetBool("FD_waveActive",true) + + + foreach(WaveEvent event in waveEvents[waveIndex]) { event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + } - + SetGlobalNetBool("FD_waveActive",false) } - void function OnDamagedPropScript(entity prop,var damageInfo) { @@ -316,7 +353,9 @@ void function HarvesterThink() } } -void function startHarvester(){ + +void function startHarvester() +{ thread HarvesterThink() thread HarvesterAlarm() @@ -330,8 +369,7 @@ void function HarvesterAlarm() { if(fd_harvester.harvester.GetShieldHealth()==0) { - EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm") - wait 2.5 + wait EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm") } else { @@ -339,7 +377,9 @@ void function HarvesterAlarm() } } } -void function initNetVars(){ + +void function initNetVars() +{ SetGlobalNetInt("FD_totalWaves",waveEvents.len()) if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) SetGlobalNetInt("FD_restartsRemaining",0) @@ -353,7 +393,6 @@ void function LoadEntities() { initNetVars() CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) - OpenBoostStores() @@ -366,20 +405,16 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) + HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_MILITIA) fd_harvester.harvester = ret.harvester fd_harvester.rings = ret.rings fd_harvester.lastDamage = ret.lastDamage - 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": file.aiSpawnpoints.append(info_target) - if(info_target.kv.aiType=="3") - CreatePropDynamic($"models/vehicle/escape_pod/escape_pod.mdl",info_target.GetOrigin(),info_target.GetAngles(),6) - break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -388,16 +423,47 @@ void function LoadEntities() file.smokePoints.append(info_target) break } - - - } + } + +} - +void function titanNav_thread(entity titan, string routeName) +{ + printt("Start NAV") + if((!titan.IsTitan())||(!titan.IsNPC())) + return + + + array routeArray = getRoute(routeName) + WaitFrame()//so other code setting up what happens on signals is run before this + if(routeArray.len()==0) + { + + titan.Signal("OnFailedToPath") + return + } + foreach(entity node in routeArray) + { + if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin())5000)&&IsAlive(titan)) + { + WaitFrame() + printt(Distance(titan.GetOrigin(),node.GetOrigin())) + // i++ + // if(i>1200) + // { + // titan.Signal("OnFailedToPath") + // return + // } + } } - + titan.Signal("FD_ReachedHarvester") } /****************************************************************************************************************\ @@ -454,6 +520,28 @@ WaveEvent function createDroppodGruntEvent(vector origin,string route) return event } +WaveEvent function createDroppodStalkerEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodStalker + event.spawnEvent.spawnType= eFD_AITypeIDs.STALKER + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + +WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodSpectreMortar + event.spawnEvent.spawnType= eFD_AITypeIDs.SPECTRE_MORTAR + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + WaveEvent function createWaitForTimeEvent(float amount) { WaveEvent event @@ -462,6 +550,14 @@ WaveEvent function createWaitForTimeEvent(float amount) return event } +WaveEvent function createWaitUntilAliveEvent(int amount) +{ + WaveEvent event + event.eventFunction = waitUntilLessThanAmountAlive + event.waitEvent.amount = amount.tofloat() + return event +} + WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount) { WaveEvent event @@ -475,7 +571,6 @@ WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vec return event } - WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount) { WaveEvent event @@ -490,6 +585,20 @@ WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassNam return event } +WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnNukeTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_NUKE + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + + + /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### # # # # ## # # # # # ## # # # # # # # ## # # # @@ -513,12 +622,16 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w 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 spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + thread titanNav_thread(npc,spawnEvent.route) DispatchSpawn(npc) + thread NPCTitanHotdrops(npc,true) + thread EMPTitanThinkConstant(npc) } void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -526,9 +639,20 @@ void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent wait waitEvent.amount } -void function waitUntil(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ - wait waitEvent.amount + + + +void function waitUntilLessThanAmountAlive(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + int aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + while(aliveTitans>waitEvent.amount.tointeger()) + { + printt("Titans alive",aliveTitans,waitEvent.amount.tointeger()) + WaitFrame() + aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + + } + } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -539,8 +663,19 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - CreateTrackedDroppod(spawnEvent.origin,TEAM_IMC) + thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC) } + +void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + thread CreateTrackedDroppodStalker(spawnEvent.origin,TEAM_IMC) +} + +void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + thread CreateTrackedDroppodSpectreMortar(spawnEvent.origin,TEAM_IMC) +} + void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) @@ -555,22 +690,26 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) - SetSpawnOption_AISettings(npc,"npc_titan_minigun_nuke") - DispachSpawn(npc) + SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_nuke") + thread titanNav_thread(npc,spawnEvent.route) + DispatchSpawn(npc) + + thread NPCTitanHotdrops(npc,true) + NukeTitanThink(npc,fd_harvester.harvester) } -/********************************************************************************************************************\ -# # ####### # ###### ####### ###### ####### # # # # ##### ####### ### ####### # # ##### -# # # # # # # # # # # # ## # # # # # # # ## # # # -# # # # # # # # # # # # # # # # # # # # # # # # -####### ##### # ###### ##### ###### ##### # # # # # # # # # # # # # ##### -# # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # ## # # # # # # # ## # # -# # ####### ####### # ####### # # # ##### # # ##### # ### ####### # # ##### -\********************************************************************************************************************/ +/****************************************************************************************\ +####### # # ####### # # ####### # # ####### # ###### ####### ###### +# # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # +##### # # ##### # # # # ####### ##### # ###### ##### ###### +# # # # # # # # # # # # # # # # +# # # # # ## # # # # # # # # # +####### # ####### # # # # # ####### ####### # ####### # # +\****************************************************************************************/ -void function CreateTrackedDroppod( vector origin, int team , ) +void function CreateTrackedDroppodSoldier( vector origin, int team) { @@ -596,3 +735,56 @@ void function CreateTrackedDroppod( vector origin, int team , ) ActivateFireteamDropPod( pod, guys ) } + +void function CreateTrackedDroppodSpectreMortar( vector origin, int team) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSpectre( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} +void function CreateTrackedDroppodStalker( vector origin, int team) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateStalker( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} \ 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 bc68d794a..5b05a3d7d 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 @@ -16,11 +16,24 @@ void function initFrontierDefenseData() //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) - //wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) - //wave0.append(createWaitForTimeEvent(5)) - wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) - wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"")) - wave0.append(createDroppodGruntEvent(< -12, 1720, 1556>,"")) + // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + // wave0.append(createWaitForTimeEvent(10)) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + + for(int i = 0; i<2;i++){ + wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + wave0.append(createWaitForTimeEvent(3)) + } + wave0.append(createWaitUntilAliveEvent(0)) + for(int i = 0; i<3;i++){ + wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + wave1.append(createWaitForTimeEvent(3)) + } + wave1.append(createWaitUntilAliveEvent(0)) + // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + + //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) waveEvents.append(wave0) waveEvents.append(wave1) @@ -34,10 +47,6 @@ void function initFrontierDefenseData() { shopPosition = - SmokeEvent emptySmokeEvent - SpawnEvent emptySpawnEvent - WaitEvent emptyWaitEvent - SoundEvent emptySoundEvent array wave0 array wave1 From 2fe15bb9303024c5da20604a30aa91d23cd9fa0f Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 24 Feb 2022 17:50:40 +0100 Subject: [PATCH 06/99] Added Array to track alive Titans Added rise shop --- .../vscripts/gamemodes/_gamemode_fd.nut | 35 ++++++++++++--- .../scripts/vscripts/mp/levels/mp_rise.nut | 8 +++- .../scripts/vscripts/mp/levels/mp_rise_fd.nut | 44 ++++++++++++++++++- 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 7f75144bc..55f667d73 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -56,6 +56,7 @@ struct { array routeNodes table harvesterDamageSource bool haversterWasDamaged + array spawnedNPCs }file void function GamemodeFD_Init() @@ -68,7 +69,23 @@ void function GamemodeFD_Init() AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") + AddDeathCallback("npc_titan",OnNpcDeath) + AddDeathCallback("npc_stalker",OnNpcDeath) + AddDeathCallback("npc_spectre",OnNpcDeath) + AddDeathCallback("npc_super_spectre",OnNpcDeath) + AddDeathCallback("npc_soldier",OnNpcDeath) + AddDeathCallback("npc_frag_drone",OnNpcDeath) + AddDeathCallback("npc_drone",OnNpcDeath) + +} +void function OnNpcDeath( entity ent, var damageInfo ){ + int findIndex = file.spawnedNPCs.find( ent ) + if ( findIndex != -1 ) + { + file.spawnedNPCs.remove( findIndex ) + } + printt("callback") } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} @@ -629,8 +646,9 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven { entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) - thread NPCTitanHotdrops(npc,true) + file.spawnedNPCs.append(npc) thread EMPTitanThinkConstant(npc) } @@ -644,20 +662,22 @@ void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent void function waitUntilLessThanAmountAlive(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - int aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() - while(aliveTitans>waitEvent.amount.tointeger()) + int aliveTitans = file.spawnedNPCs.len() + int testamount = waitEvent.amount.tointeger() + while(aliveTitans>testamount) { - printt("Titans alive",aliveTitans,waitEvent.amount.tointeger()) + printt("Titans alive",aliveTitans,testamount) WaitFrame() - aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + aliveTitans = file.spawnedNPCs.len() } - + printt("Titans alive end",aliveTitans,testamount) } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) } @@ -692,9 +712,10 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_nuke") thread titanNav_thread(npc,spawnEvent.route) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) + file.spawnedNPCs.append(npc) - thread NPCTitanHotdrops(npc,true) NukeTitanThink(npc,fd_harvester.harvester) } 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 37b891699..94dce4707 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 37b891699..744859715 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,43 @@ -//fuck \ No newline at end of file +global function initFrontierDefenseData + + +void function initFrontierDefenseData() +{ + shopPosition = < -5165.42, -679.285, 384.031> //only aproximate position + + + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) + // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + // wave0.append(createWaitForTimeEvent(10)) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + + // for(int i = 0; i<2;i++){ + // wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createWaitForTimeEvent(3)) + // } + // wave0.append(createWaitUntilAliveEvent(0)) + // for(int i = 0; i<3;i++){ + // wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave1.append(createWaitForTimeEvent(3)) + // } + // wave1.append(createWaitUntilAliveEvent(0)) + // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + + //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +} \ No newline at end of file From 2b7b09105c5c1e943d80b83834365ad181e68dc9 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 11 Mar 2022 00:35:51 +0100 Subject: [PATCH 07/99] Added waveend scoring --- .../vscripts/gamemodes/_gamemode_fd.nut | 169 +++++++++++++++--- .../mp/levels/mp_forwardbase_kodai_fd.nut | 30 ++-- 2 files changed, 162 insertions(+), 37 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 55f667d73..66bd0a36f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -45,30 +45,46 @@ global struct WaveEvent{ } + global HarvesterStruct fd_harvester global vector shopPosition global array > waveEvents global table > routes + +struct player_struct_fd{ + bool diedThisRound + int scoreThisRound + +} + + struct { array aiSpawnpoints array smokePoints array routeNodes table harvesterDamageSource - bool haversterWasDamaged + bool havesterWasDamaged array spawnedNPCs + table players }file void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) PrecacheParticleSystem($"P_smokescreen_FD") + + RegisterSignal("FD_ReachedHarvester") + RegisterSignal("OnFailedToPath") + + + AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) - AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) - RegisterSignal("FD_ReachedHarvester") - RegisterSignal("OnFailedToPath") + AddCallback_OnClientConnected(GamemodeFD_InitPlayer) + AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) AddDeathCallback("npc_spectre",OnNpcDeath) @@ -76,9 +92,25 @@ void function GamemodeFD_Init() AddDeathCallback("npc_soldier",OnNpcDeath) AddDeathCallback("npc_frag_drone",OnNpcDeath) AddDeathCallback("npc_drone",OnNpcDeath) - + + AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) + AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) +} + +void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo) +{ + file.players[victim].diedThisRound = true } +void function GamemodeFD_InitPlayer(entity player){ + player_struct_fd data + data.diedThisRound = false + data.scoreThisRound = 0 + file.players[player] <- data +} + + + void function OnNpcDeath( entity ent, var damageInfo ){ int findIndex = file.spawnedNPCs.find( ent ) if ( findIndex != -1 ) @@ -96,6 +128,7 @@ bool function useShieldBoost(entity player,array args) { fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) + MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) } return true @@ -110,7 +143,7 @@ void function mainGameLoop() { startHarvester() bool showShop = false - for(int i = 0;i<2;i++)//for(int i = 0;i function getEnemyTypesForWave(int wave) void function runWave(int waveIndex,bool shouldDoBuyTime) { + + + + SetGlobalNetInt("FD_currentWave",waveIndex) - file.haversterWasDamaged = false + file.havesterWasDamaged = false + foreach(player_struct_fd player in file.players) + { + player.diedThisRound = false + player.scoreThisRound = 0 + } array enemys = getEnemyTypesForWave(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) { - SetGlobalNetTime("FD_nextWaveStartTime",Time()+75) + OpenBoostStores() - wait 75 + foreach(entity player in GetPlayerArray()) + Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyStoreOpen") + while(Time()5000)&&IsAlive(titan)) + while((Distance(titan.GetOrigin(),node.GetOrigin())>5000)) { WaitFrame() printt(Distance(titan.GetOrigin(),node.GetOrigin())) @@ -483,6 +591,24 @@ void function titanNav_thread(entity titan, string routeName) titan.Signal("FD_ReachedHarvester") } +bool function allPlayersReady() +{ + foreach(entity player in GetPlayerArray()) + { + if(!player.GetPlayerNetBool("FD_readyForNextWave")) + return false + } + return true +} + +bool function ClientCommandCallbackToggleReady( entity player, array args ) +{ + if(args[0]=="true") + player.SetPlayerNetBool("FD_readyForNextWave",true) + if(args[0]=="flase") + player.SetPlayerNetBool("FD_readyForNextWave",false) + return true +} /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -632,7 +758,7 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w SmokescreenStruct smokescreen smokescreen.smokescreenFX = $"P_smokescreen_FD" smokescreen.isElectric = false - smokescreen.origin = smokeEvent.position + smokescreen.origin = smokeEvent.position + < 0 , 0, 150> smokescreen.angles = <0,0,0> smokescreen.lifetime = smokeEvent.lifetime smokescreen.fxXYRadius = 150 @@ -647,6 +773,7 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) + npc.DisableNPCFlag(NPC_ALLOW_INVESTIGATE | NPC_USE_SHOOTING_COVER|NPC_ALLOW_PATROL) DispatchSpawn(npc) file.spawnedNPCs.append(npc) thread EMPTitanThinkConstant(npc) @@ -701,12 +828,14 @@ void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEv entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) DispatchSpawn(npc) } + void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) DispatchSpawn(npc) } + void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) @@ -716,7 +845,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve DispatchSpawn(npc) file.spawnedNPCs.append(npc) - NukeTitanThink(npc,fd_harvester.harvester) + //NukeTitanThink(npc,fd_harvester.harvester) //currently crashes game } /****************************************************************************************\ 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 5b05a3d7d..d4ac4c5aa 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 @@ -15,31 +15,27 @@ void function initFrontierDefenseData() - //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) - // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + //wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) + // wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) // wave0.append(createWaitForTimeEvent(10)) - // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - for(int i = 0; i<2;i++){ - wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - wave0.append(createWaitForTimeEvent(3)) - } + + wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) + wave0.append(createWaitUntilAliveEvent(0)) - for(int i = 0; i<3;i++){ - wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - wave1.append(createWaitForTimeEvent(3)) - } + wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) - // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) + //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) + //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) waveEvents.append(wave0) waveEvents.append(wave1) - waveEvents.append(wave2) - waveEvents.append(wave3) - waveEvents.append(wave4) + //waveEvents.append(wave2) + //waveEvents.append(wave3) + //waveEvents.append(wave4) } /* From 12b8838ee8141079f14511a1a1c781c04eebd786 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 12 Mar 2022 21:15:18 +0100 Subject: [PATCH 08/99] Added Restart and Win and Mortar Titan --- .../vscripts/gamemodes/_gamemode_fd.nut | 222 ++++++++++++++---- .../mp/levels/mp_forwardbase_kodai_fd.nut | 6 +- 2 files changed, 175 insertions(+), 53 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 66bd0a36f..f7b5e33d8 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -7,11 +7,13 @@ global function createWaitForTimeEvent global function createSuperSpectreEvent 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 createCloakDroneEvent global struct SmokeEvent{ vector position @@ -67,6 +69,7 @@ struct { bool havesterWasDamaged array spawnedNPCs table players + entity harvester_info }file void function GamemodeFD_Init() @@ -76,15 +79,18 @@ void function GamemodeFD_Init() RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") - + SetRoundBased(true) + SetShouldUseRoundWinningKillReplay(false) AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) + AddCallback_GameStateEnter(eGameState.Prematch,FD_createHarvester) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddCallback_OnClientConnected(GamemodeFD_InitPlayer) AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) AddDeathCallback("npc_spectre",OnNpcDeath) @@ -102,7 +108,8 @@ void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var dama file.players[victim].diedThisRound = true } -void function GamemodeFD_InitPlayer(entity player){ +void function GamemodeFD_InitPlayer(entity player) +{ player_struct_fd data data.diedThisRound = false data.scoreThisRound = 0 @@ -111,7 +118,8 @@ void function GamemodeFD_InitPlayer(entity player){ -void function OnNpcDeath( entity ent, var damageInfo ){ +void function OnNpcDeath( entity ent, var damageInfo ) +{ int findIndex = file.spawnedNPCs.find( ent ) if ( findIndex != -1 ) { @@ -135,23 +143,31 @@ bool function useShieldBoost(entity player,array args) } void function startMainGameLoop() -{ +{ thread mainGameLoop() } void function mainGameLoop() -{ +{ startHarvester() + bool showShop = false - for(int i = 0;i function getRoute(string routeName) { array ret @@ -254,7 +270,7 @@ array function getEnemyTypesForWave(int wave) } -void function runWave(int waveIndex,bool shouldDoBuyTime) +bool function runWave(int waveIndex,bool shouldDoBuyTime) { @@ -291,22 +307,30 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10) wait 10 - + 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) //main wave loop + foreach(WaveEvent event in waveEvents[waveIndex]) { event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) - + if(!IsAlive(fd_harvester.harvester)) + return false + waitUntilLessThanAmountAlive(0) } + + + + wait 2 //wave end SetGlobalNetBool("FD_waveActive",false) @@ -344,9 +368,14 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) AddPlayerScore(highestScore_player,"FDWaveMVP") AddMoneyToPlayer(highestScore_player,100) 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") @@ -355,7 +384,7 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) } } wait 10 - + return true } @@ -411,6 +440,14 @@ void function OnDamagedPropScript(entity prop,var damageInfo) } +void function FD_NPCCleanup() +{ + foreach(entity npc in file.spawnedNPCs){ + if(IsValid(npc)) + npc.Destroy() + } +} + void function HarvesterThink() { entity harvester = fd_harvester.harvester @@ -482,7 +519,6 @@ void function startHarvester() } - void function HarvesterAlarm() { while(IsAlive(fd_harvester.harvester)) @@ -501,21 +537,31 @@ void function HarvesterAlarm() void function initNetVars() { SetGlobalNetInt("FD_totalWaves",waveEvents.len()) - if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) - SetGlobalNetInt("FD_restartsRemaining",0) - else - SetGlobalNetInt("FD_restartsRemaining",2) + + if(!FD_HasRestarted()) + { + bool showShop = false + SetGlobalNetInt("FD_currentWave",0) + if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) + FD_SetNumAllowedRestarts(0) + else + FD_SetNumAllowedRestarts(2) + } } +void function FD_createHarvester() +{ + HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),1,1,TEAM_IMC)//,25000,6000,TEAM_MILITIA) + fd_harvester.harvester = ret.harvester + fd_harvester.rings = ret.rings + fd_harvester.lastDamage = ret.lastDamage +} void function LoadEntities() { - initNetVars() + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) - - - foreach ( entity info_target in GetEntArrayByClass_Expensive("info_target") ) { @@ -525,16 +571,13 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_MILITIA) - fd_harvester.harvester = ret.harvester - fd_harvester.rings = ret.rings - fd_harvester.lastDamage = ret.lastDamage + 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": - file.aiSpawnpoints.append(info_target) + AddStationaryAIPosition(info_target.GetOrigin(),int(info_target.kv.aiType)) break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -545,10 +588,10 @@ void function LoadEntities() } } } - + ValidateAndFinalizePendingStationaryPositions() + initNetVars() } - void function titanNav_thread(entity titan, string routeName) { titan.EndSignal( "OnDeath" ) @@ -609,6 +652,7 @@ bool function ClientCommandCallbackToggleReady( entity player, array arg player.SetPlayerNetBool("FD_readyForNextWave",false) return true } + /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -696,7 +740,7 @@ WaveEvent function createWaitForTimeEvent(float amount) WaveEvent function createWaitUntilAliveEvent(int amount) { WaveEvent event - event.eventFunction = waitUntilLessThanAmountAlive + event.eventFunction = waitUntilLessThanAmountAliveEvent event.waitEvent.amount = amount.tofloat() return event } @@ -740,7 +784,26 @@ WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route return event } +WaveEvent function createMortarTitanEvent(vector origin,vector angles) +{ + WaveEvent event + event.eventFunction = spawnMortarTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_MORTAR + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} +WaveEvent function createCloakDroneEvent(vector origin,vector angles){ + WaveEvent event + event.eventFunction = fd_spawnCloakDrone + event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE_CLOAK + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### @@ -769,7 +832,8 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w } void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) @@ -781,28 +845,23 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - wait waitEvent.amount + float waitUntil = Time() + waitEvent.amount + while(Time()testamount) - { - printt("Titans alive",aliveTitans,testamount) - WaitFrame() - aliveTitans = file.spawnedNPCs.len() - - } - printt("Titans alive end",aliveTitans,testamount) + waitUntilLessThanAmountAlive(int(waitEvent.amount)) } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) @@ -810,42 +869,79 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC) } void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodStalker(spawnEvent.origin,TEAM_IMC) } void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodSpectreMortar(spawnEvent.origin,TEAM_IMC) } void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) DispatchSpawn(npc) } void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) DispatchSpawn(npc) + file.spawnedNPCs.append(npc) } void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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") thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) + npc.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) + DispatchSpawn(npc) + file.spawnedNPCs.append(npc) + thread NukeTitanThink(npc,fd_harvester.harvester) + +} + +void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) DispatchSpawn(npc) file.spawnedNPCs.append(npc) + thread MortarTitanThink(npc,fd_harvester.harvester) - //NukeTitanThink(npc,fd_harvester.harvester) //currently crashes game +} + +void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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_atlas_tracker_mortar") + SetSpawnOption_Titanfall(npc) + DispatchSpawn(npc) + file.spawnedNPCs.append(npc) + thread MortarTitanThink(npc,fd_harvester.harvester) + +} +void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, file.harvester_info.GetOrigin() ) + file.spawnedNPCs.append(npc) } /****************************************************************************************\ @@ -937,4 +1033,28 @@ void function CreateTrackedDroppodStalker( vector origin, int team) } ActivateFireteamDropPod( pod, guys ) +} + +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 aliveTitans = file.spawnedNPCs.len() + + while(aliveTitans>amount) + { + printt("Titans alive",aliveTitans,amount) + WaitFrame() + aliveTitans = file.spawnedNPCs.len() + if(!IsAlive(fd_harvester.harvester)) + break + + } + printt("Titans alive end",aliveTitans,amount) } \ 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 d4ac4c5aa..901e6dd30 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 @@ -21,8 +21,8 @@ void function initFrontierDefenseData() // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - + wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) + wave0.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave0.append(createWaitUntilAliveEvent(0)) wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) @@ -31,6 +31,8 @@ void function initFrontierDefenseData() //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) + waveEvents.append(wave0) + waveEvents.append(wave0) waveEvents.append(wave1) //waveEvents.append(wave2) From 83131ab861e601609256836cf631bb3e65abe16b Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 15 Mar 2022 03:44:43 +0100 Subject: [PATCH 09/99] Added Game End Conditions Changed super spectres --- .../vscripts/gamemodes/_gamemode_fd.nut | 80 ++++++++++++++----- .../mp/levels/mp_forwardbase_kodai_fd.nut | 18 ++--- 2 files changed, 69 insertions(+), 29 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index f7b5e33d8..bff0ebab4 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -82,6 +82,8 @@ void function GamemodeFD_Init() SetRoundBased(true) SetShouldUseRoundWinningKillReplay(false) + Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) + PlayerEarnMeter_SetEnabled(false) AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) @@ -156,16 +158,20 @@ void function mainGameLoop() { if(!runWave(i,showShop)) break - showShop = true - } - if(IsAlive(fd_harvester.harvester)) - { - //Game won code - SetWinner(TEAM_MILITIA) - return + + if(i==0) + { + PlayerEarnMeter_SetEnabled(true) + showShop = true + foreach(entity player in GetPlayerArray()) + { + PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) + } + } + } - //restart round - SetWinner(TEAM_IMC) + + } array function getRoute(string routeName) @@ -326,9 +332,20 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) return false waitUntilLessThanAmountAlive(0) } + if(!IsAlive(fd_harvester.harvester)) + { + + } - - + if(!IsAlive(fd_harvester.harvester)) + { + if(GetGlobalNetInt("FD_restartsRemaining")>0) + FD_DecrementRestarts() + else + SetRoundBased(false) + SetWinner(TEAM_IMC)//restart round + return false + } wait 2 @@ -383,6 +400,13 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P") } } + if(isFinalWave()&&IsAlive(fd_harvester.harvester)) + { + //Game won code + SetRoundBased(false) + SetWinner(TEAM_MILITIA) + return true + } wait 10 return true @@ -552,12 +576,17 @@ void function initNetVars() void function FD_createHarvester() { - HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),1,1,TEAM_IMC)//,25000,6000,TEAM_MILITIA) + HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) fd_harvester.harvester = ret.harvester fd_harvester.rings = ret.rings fd_harvester.lastDamage = ret.lastDamage } +bool function isFinalWave() +{ + return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves")) +} + void function LoadEntities() { @@ -588,6 +617,7 @@ void function LoadEntities() } } } + AddStationaryAIPosition(< -12, 1720, 1456 >,4) ValidateAndFinalizePendingStationaryPositions() initNetVars() } @@ -599,7 +629,7 @@ void function titanNav_thread(entity titan, string routeName) printt("Start NAV") - if((!titan.IsTitan())||(!titan.IsNPC())) + if(!titan.IsNPC()) return @@ -619,7 +649,7 @@ void function titanNav_thread(entity titan, string routeName) continue titan.AssaultPoint(node.GetOrigin()) int i = 0 - while((Distance(titan.GetOrigin(),node.GetOrigin())>5000)) + while((Distance(titan.GetOrigin(),node.GetOrigin())>500)) { WaitFrame() printt(Distance(titan.GetOrigin(),node.GetOrigin())) @@ -860,11 +890,14 @@ void function waitUntilLessThanAmountAliveEvent(SmokeEvent smokeEvent,SpawnEvent } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) - SetSpawnOption_Titanfall(npc) - DispatchSpawn(npc) + SetSpawnOption_AISettings(npc,"npc_super_spectre_fd") + file.spawnedNPCs.append(npc) + + thread spawnSuperSpectre_threaded(npc) } void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -917,6 +950,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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") @@ -924,14 +958,13 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE DispatchSpawn(npc) file.spawnedNPCs.append(npc) thread MortarTitanThink(npc,fd_harvester.harvester) - } void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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_atlas_tracker_mortar") + SetSpawnOption_AISettings(npc,"npc_titan_stryder_sniper_fd") SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) file.spawnedNPCs.append(npc) @@ -953,7 +986,14 @@ void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,Wa # # # # # ## # # # # # # # # # ####### # ####### # # # # # ####### ####### # ####### # # \****************************************************************************************/ - +void function spawnSuperSpectre_threaded(entity npc) +{ + + wait 4.7 + DispatchSpawn(npc) + thread SuperSpectre_WarpFall(npc) + thread Reaper_LaunchFragDrone_Think( npc, "npc_frag_drone_fd") +} void function CreateTrackedDroppodSoldier( vector origin, int team) { 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 901e6dd30..9fe180451 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 @@ -13,27 +13,27 @@ void function initFrontierDefenseData() array wave3 array wave4 - + wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, < 0,0,0 >, "hillRouteClose")) //wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) // wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) // wave0.append(createWaitForTimeEvent(10)) // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - - wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) - wave0.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) + + //wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) + //.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave0.append(createWaitUntilAliveEvent(0)) wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - + //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) waveEvents.append(wave0) - waveEvents.append(wave0) + //waveEvents.append(wave0) waveEvents.append(wave1) //waveEvents.append(wave2) //waveEvents.append(wave3) @@ -43,7 +43,7 @@ void function initFrontierDefenseData() /* void function initFrontierDefenseData() { - shopPosition = + shopPosition = array wave0 @@ -52,8 +52,8 @@ void function initFrontierDefenseData() array wave3 array wave4 - - + + From c7178117149bdf57ba40a6a32d9022588ba998aa Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 17 Feb 2022 02:33:37 +0100 Subject: [PATCH 10/99] Spawn Harvester and load Npc Routes --- .../vscripts/gamemodes/_gamemode_fd.nut | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 8a6b8bf0b..843614546 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,12 +1,119 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD + +struct { + array aiSpawnpoints + array smokePoints + array routeNodes +}file + void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) + AddCallback_EntitiesDidLoad(LoadEntities) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) { +} + +void function spawnSmokes() +{ + +} + + +array function getRoute(string routeName) +{ + foreach(entity node in file.routeNodes) + { + if(!node.HasKey("route_name")) + continue + if(node.kv.route_name==routeName) + return node.GetLinkEntArray() + } + printt("Route not found") + return [] +} + +vector function getShopPosition() +{ + switch(GetMapName()) + { + case"mp_forwardbase_kodai": + return < -3862.13, 1267.69, 1060.06> + default: + return <0,0,0> + } + unreachable + +} + + + +void function LoadEntities() +{ + CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) + + + + + 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": + entity harvester = CreateEntity( "prop_script" ) + harvester.SetValueForModelKey( $"models/props/generator_coop/generator_coop.mdl" ) + harvester.SetOrigin( info_target.GetOrigin() ) + harvester.SetAngles( info_target.GetAngles() ) + harvester.kv.solid = SOLID_VPHYSICS + harvester.SetHealth(25000) + harvester.SetShieldHealthMax(6000) + harvester.SetShieldHealth(6000) + SetTeam(harvester,TEAM_IMC) + DispatchSpawn( harvester ) + SetGlobalNetEnt("FD_activeHarvester",harvester) + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) + // blackbox.Hide() + // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + + entity rings = CreatePropDynamic(MODEL_HARVESTER_TOWER_RINGS,info_target.GetOrigin(),info_target.GetAngles(),6) + thread PlayAnim( rings, "generator_cycle_fast" ) + + entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) + entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + + 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": + file.aiSpawnpoints.append(info_target) + break + case"info_fd_route_node": + file.routeNodes.append(info_target) + break + case"info_fd_smoke_screen": + file.smokePoints.append(info_target) + break + } + + + + } + + + + + } + } \ No newline at end of file From 62a2ffddc21cd6c8dba8dd7e072fbbad3194683f Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 17 Feb 2022 19:20:49 +0100 Subject: [PATCH 11/99] Harvester Color change with health --- .../vscripts/gamemodes/_gamemode_fd.nut | 137 +++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 843614546..8e5a01882 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,17 +1,32 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD +global function useHarvesterShieldBoost +struct HarvesterStruct { + entity harvester + entity particleBeam + entity particleShield + entity rings + float lastDamage + bool shieldBoost + +} + struct { array aiSpawnpoints array smokePoints array routeNodes + HarvesterStruct harvester + table harvesterDamageSource + bool haversterWasDamaged }file void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) AddCallback_EntitiesDidLoad(LoadEntities) + AddDamageCallback("prop_script",OnDamagedPropScript) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) @@ -19,6 +34,22 @@ void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) } +bool function useHarvesterShieldBoost() //returns true when acturally used +{ + if(file.harvester.harvester.GetShieldHealth() function getRoute(string routeName) return [] } -vector function getShopPosition() +vector function getShopPosition() { switch(GetMapName()) { @@ -51,12 +82,104 @@ vector function getShopPosition() } +void function waveStart() +{ + file.haversterWasDamaged = false +} + + +void function OnDamagedPropScript(entity prop,var damageInfo) +{ + + if(!IsValid(file.harvester.harvester)) + return + + if(!IsValid(prop)) + return + + if(file.harvester.harvester!=prop) + return + + if(structHarvester.shieldBoost) + { + harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + return + } + + int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo ) + entity attacker = DamageInfo_GetAttacker( damageInfo ) + float damageAmount = DamageInfo_GetDamage( damageInfo ) + + if ( !damageSourceID ) + return + + if ( !damageAmount ) + return + + if ( !attacker ) + return + //TODO Log damage source for round lose screen + file.harvester.lastDamage = Time() + if(prop.GetShieldHealth()==0) + { + float newHealth = prop.GetHealth()-damageAmount + if(newHealth<0) + { + newHealth=0 + file.harvester.rings.Destroy() + } + + + prop.SetHealth(newHealth) + file.haversterWasDamaged = true + } + + + +} + +void function HarvesterThink(HarvesterStruct structHarvester) +{ + entity harvester = structHarvester.harvester + entity particleBeam = structHarvester.particleBeam + entity particleShield = structHarvester.particleShield + + float lastTime = Time() + WaitFrame() + + + + while(IsAlive(harvester)){ + float currentTime = Time() + float deltaTime = currentTime -lastTime + vector shieldColor = GraphCappedVector(harvester.GetShieldHealth(), 0, harvester.GetShieldHealthMax(),TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) + EffectSetControlPointVector( particleShield, 1, shieldColor ) + vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) + EffectSetControlPointVector( particleBeam, 1, beamColor ) + if(((currentTime-structHarvester.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=harvester.GetShieldHealthMax()) + { + harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + } + else + { + harvester.SetShieldHealth(newShieldHealth) + } + } + lastTime = currentTime + WaitFrame() + } + +} void function LoadEntities() { CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) - + OpenBoostStores() @@ -74,12 +197,16 @@ void function LoadEntities() harvester.SetOrigin( info_target.GetOrigin() ) harvester.SetAngles( info_target.GetAngles() ) harvester.kv.solid = SOLID_VPHYSICS + + harvester.SetMaxHealth(25000) harvester.SetHealth(25000) harvester.SetShieldHealthMax(6000) harvester.SetShieldHealth(6000) SetTeam(harvester,TEAM_IMC) DispatchSpawn( harvester ) + SetGlobalNetEnt("FD_activeHarvester",harvester) + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) // blackbox.Hide() // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER @@ -92,6 +219,12 @@ void function LoadEntities() entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + file.harvester.harvester = harvester + file.harvester.particleBeam = Harvester_Beam + file.harvester.particleShield = Harvester_Shield + file.harvester.lastDamage = Time() + file.harvester.rings = rings + thread HarvesterThink(file.harvester) break case"info_fd_mode_model": entity prop = CreatePropDynamic( info_target.GetModelName(), info_target.GetOrigin(), info_target.GetAngles(), 6 ) From bc47d316929fcad6f9e39309bf1ad9bcebf4bd2b Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 19 Feb 2022 02:32:33 +0100 Subject: [PATCH 12/99] moved harvester creation, added harvester sound, added smokes --- .../mod/scripts/vscripts/_harvester.gnut | 58 +++++- .../vscripts/gamemodes/_gamemode_fd.nut | 173 +++++++++++------- 2 files changed, 164 insertions(+), 67 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 37b891699..71bbd3451 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -1 +1,57 @@ -//fuck \ No newline at end of file +global function SpawnHarvester +global function startHarvesterFX + +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) + SetTeam(harvester,team) + DispatchSpawn( harvester ) + + SetGlobalNetEnt("FD_activeHarvester",harvester) + + // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) + // blackbox.Hide() + // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + + 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 startHarvesterFX(HarvesterStruct harvester) +{ + entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) + entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) + EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + harvester.particleBeam = Harvester_Beam + harvester.particleShield = Harvester_Shield + return harvester +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 8e5a01882..4f434fd2c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,23 +1,16 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD global function useHarvesterShieldBoost +global function spawnSmokes +global function waveStart +global function startHarvester - -struct HarvesterStruct { - entity harvester - entity particleBeam - entity particleShield - entity rings - float lastDamage - bool shieldBoost - -} +global HarvesterStruct harvesterStruct struct { array aiSpawnpoints array smokePoints array routeNodes - HarvesterStruct harvester table harvesterDamageSource bool haversterWasDamaged }file @@ -25,8 +18,10 @@ struct { void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) + PrecacheParticleSystem($"P_smokescreen_FD") AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) + } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) @@ -36,23 +31,40 @@ void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) bool function useHarvesterShieldBoost() //returns true when acturally used { - if(file.harvester.harvester.GetShieldHealth() + smokescreen.angles = pos.GetAngles() + smokescreen.lifetime = 30 + 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) + } } @@ -85,24 +97,38 @@ vector function getShopPosition() void function waveStart() { file.haversterWasDamaged = false + array enemys = [eFD_AITypeIDs.TITAN,eFD_AITypeIDs.GRUNT,-1,-1,-1,-1,-1,-1,-1] + + SetGlobalNetInt("FD_currentWave",2) + SetGlobalNetBool("FD_waveActive",true) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.TITAN), 69) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.GRUNT), 420) + + 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]) + } + + } void function OnDamagedPropScript(entity prop,var damageInfo) { - if(!IsValid(file.harvester.harvester)) + if(!IsValid(harvesterStruct.harvester)) return if(!IsValid(prop)) return - if(file.harvester.harvester!=prop) + if(harvesterStruct.harvester!=prop) return - if(structHarvester.shieldBoost) + if(harvesterStruct.shieldBoost) { - harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + prop.SetShieldHealth(prop.GetShieldHealthMax()) return } @@ -119,14 +145,16 @@ void function OnDamagedPropScript(entity prop,var damageInfo) if ( !attacker ) return //TODO Log damage source for round lose screen - file.harvester.lastDamage = Time() + harvesterStruct.lastDamage = Time() if(prop.GetShieldHealth()==0) { float newHealth = prop.GetHealth()-damageAmount if(newHealth<0) - { + { + EmitSoundAtPosition(TEAM_UNASSIGNED,harvesterStruct.harvester.GetOrigin(),"coop_generator_destroyed") newHealth=0 - file.harvester.rings.Destroy() + harvesterStruct.rings.Destroy() + } @@ -138,17 +166,24 @@ void function OnDamagedPropScript(entity prop,var damageInfo) } -void function HarvesterThink(HarvesterStruct structHarvester) +void function HarvesterThink() { - entity harvester = structHarvester.harvester - entity particleBeam = structHarvester.particleBeam - entity particleShield = structHarvester.particleShield - + entity harvester = harvesterStruct.harvester + + EmitSoundOnEntity(harvester,"coop_generator_startup") float lastTime = Time() - WaitFrame() - + wait 4 + int lastShieldHealth = 6000 + HarvesterStruct temp = startHarvesterFX(harvesterStruct) + harvesterStruct.particleBeam = temp.particleBeam + harvesterStruct.particleShield = temp.particleShield + wait 5 + EmitSoundOnEntity(harvester,"coop_generator_ambient_healthy") + entity particleBeam = harvesterStruct.particleBeam + entity particleShield = harvesterStruct.particleShield + while(IsAlive(harvester)){ float currentTime = Time() @@ -157,27 +192,61 @@ void function HarvesterThink(HarvesterStruct structHarvester) EffectSetControlPointVector( particleShield, 1, shieldColor ) vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) EffectSetControlPointVector( particleBeam, 1, beamColor ) - if(((currentTime-structHarvester.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=harvester.GetShieldHealthMax()) { + StopSoundOnEntity(harvester,"coop_generator_shieldrecharge_resume") harvester.SetShieldHealth(harvester.GetShieldHealthMax()) + EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_end") + } else { harvester.SetShieldHealth(newShieldHealth) } } + 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(harvesterStruct.harvester)) + { + if(harvesterStruct.harvester.GetShieldHealth()==0) + { + EmitSoundOnEntity(harvesterStruct.harvester,"coop_generator_underattack_alarm") + wait 2.5 + } + else + { + WaitFrame() + } + } +} void function LoadEntities() { + SetGlobalNetInt("FD_totalWaves",5) + SetGlobalNetInt("FD_restartsRemaining",2) CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) OpenBoostStores() @@ -192,39 +261,11 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - entity harvester = CreateEntity( "prop_script" ) - harvester.SetValueForModelKey( $"models/props/generator_coop/generator_coop.mdl" ) - harvester.SetOrigin( info_target.GetOrigin() ) - harvester.SetAngles( info_target.GetAngles() ) - harvester.kv.solid = SOLID_VPHYSICS - - harvester.SetMaxHealth(25000) - harvester.SetHealth(25000) - harvester.SetShieldHealthMax(6000) - harvester.SetShieldHealth(6000) - SetTeam(harvester,TEAM_IMC) - DispatchSpawn( harvester ) - - SetGlobalNetEnt("FD_activeHarvester",harvester) - - // entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,info_target.GetOrigin(),info_target.GetAngles(),6) - // blackbox.Hide() - // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER - - entity rings = CreatePropDynamic(MODEL_HARVESTER_TOWER_RINGS,info_target.GetOrigin(),info_target.GetAngles(),6) - thread PlayAnim( rings, "generator_cycle_fast" ) + HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) + harvesterStruct.harvester = ret.harvester + harvesterStruct.rings = ret.rings + harvesterStruct.lastDamage = ret.lastDamage - entity Harvester_Beam = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_BEAM),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Beam, 1, < 126.0, 188.0, 236.0 > ) - entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) - - file.harvester.harvester = harvester - file.harvester.particleBeam = Harvester_Beam - file.harvester.particleShield = Harvester_Shield - file.harvester.lastDamage = Time() - file.harvester.rings = rings - thread HarvesterThink(file.harvester) break case"info_fd_mode_model": entity prop = CreatePropDynamic( info_target.GetModelName(), info_target.GetOrigin(), info_target.GetAngles(), 6 ) From c56e68e17c7f525a69311e36ba76a6aad3e27ee4 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 21 Feb 2022 00:54:52 +0100 Subject: [PATCH 13/99] Added wave event logic added some first Events created method to get 9 most spawned enemies for client ui split Harvester Fx to make shield disappear when down --- .../mod/scripts/vscripts/_harvester.gnut | 18 +- .../vscripts/gamemodes/_gamemode_fd.nut | 471 +++++++++++++++--- .../mp/levels/mp_forwardbase_kodai.nut | 7 + .../mp/levels/mp_forwardbase_kodai_fd.nut | 59 ++- 4 files changed, 465 insertions(+), 90 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 71bbd3451..e5e60bf24 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -1,5 +1,6 @@ global function SpawnHarvester -global function startHarvesterFX +global function generateBeamFX +global function generateShieldFX global struct HarvesterStruct { entity harvester @@ -45,13 +46,18 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i return ret } -HarvesterStruct function startHarvesterFX(HarvesterStruct harvester) +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, < 126.0, 188.0, 236.0 > ) - entity Harvester_Shield = StartParticleEffectOnEntity_ReturnEntity(harvester.harvester,GetParticleSystemIndex(FX_HARVESTER_OVERSHIELD),FX_PATTACH_ABSORIGIN_FOLLOW,0) - EffectSetControlPointVector( Harvester_Shield, 1, < 126.0, 188.0, 236.0 > ) + EffectSetControlPointVector( Harvester_Beam, 1, GetShieldTriLerpColor(0.0) ) harvester.particleBeam = Harvester_Beam - harvester.particleShield = Harvester_Shield 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/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 4f434fd2c..ef952b24a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,11 +1,47 @@ global function GamemodeFD_Init global function RateSpawnpoints_FD -global function useHarvesterShieldBoost -global function spawnSmokes -global function waveStart global function startHarvester +global function createSmokeEvent +global function createArcTitanEvent +global function createWaitForTimeEvent +global function createSuperSpectreEvent +global function createDroppodGruntEvent + +global struct SmokeEvent{ + vector position + float lifetime +} + +global struct SpawnEvent{ + vector origin + vector angles + string route + 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 amount of spawned enemys + string npcClassName + string aiSettings +} + +global struct WaitEvent{ + float amount +} + +global struct SoundEvent{ + string soundEventName +} + +global struct WaveEvent{ + void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction + SmokeEvent smokeEvent + SpawnEvent spawnEvent + WaitEvent waitEvent + SoundEvent soundEvent +} -global HarvesterStruct harvesterStruct + +global HarvesterStruct fd_harvester +global vector shopPosition +global array > waveEvents struct { array aiSpawnpoints @@ -21,53 +57,43 @@ void function GamemodeFD_Init() PrecacheParticleSystem($"P_smokescreen_FD") AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) - + AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) + AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) { - + } -bool function useHarvesterShieldBoost() //returns true when acturally used +bool function useShieldBoost(entity player,array args) { - if(harvesterStruct.harvester.GetShieldHealth()0)) + { + fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) + SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) + player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) } - return false + return true } -void function useHarvesterShieldBoost_threaded() + +void function startMainGameLoop() { - harvesterStruct.shieldBoost = true - wait 5 - harvesterStruct.shieldBoost = false + thread mainGameLoop() } -void function spawnSmokes() -{ - entity owner = GetPlayerArray()[0] - foreach(entity pos in file.smokePoints) - { - SmokescreenStruct smokescreen - smokescreen.smokescreenFX = $"P_smokescreen_FD" - smokescreen.ownerTeam = owner.GetTeam() - smokescreen.damageSource = eDamageSourceId.mp_weapon_grenade_electric_smoke - smokescreen.deploySound1p = "explo_electric_smoke_impact" - smokescreen.deploySound3p = "explo_electric_smoke_impact" - smokescreen.isElectric = false - smokescreen.origin = pos.GetOrigin()+<0,0,150> - smokescreen.angles = pos.GetAngles() - smokescreen.lifetime = 30 - 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 mainGameLoop() +{ + startHarvester() + runWave(0) + } + + + + array function getRoute(string routeName) { foreach(entity node in file.routeNodes) @@ -80,36 +106,98 @@ array function getRoute(string routeName) printt("Route not found") return [] } - -vector function getShopPosition() +array function getEnemyTypesForWave(int wave) { - switch(GetMapName()) + table 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[wave]) { - case"mp_forwardbase_kodai": - return < -3862.13, 1267.69, 1060.06> - default: - return <0,0,0> + 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.TITAN_SNIPER): + npcs[eFD_AITypeIDs.TITAN]+=e.spawnEvent.spawnAmount + break + default: + npcs[e.spawnEvent.spawnType]+=e.spawnEvent.spawnAmount + } + } + array ret = [-1,-1,-1,-1,-1,-1,-1,-1,-1] + foreach(int key,int value in npcs){ + printt("Key",key,"has value",value) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID(key),value) + 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]] enemys = [eFD_AITypeIDs.TITAN,eFD_AITypeIDs.GRUNT,-1,-1,-1,-1,-1,-1,-1] + array enemys = getEnemyTypesForWave(waveIndex) - SetGlobalNetInt("FD_currentWave",2) + SetGlobalNetInt("FD_currentWave",waveIndex) SetGlobalNetBool("FD_waveActive",true) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.TITAN), 69) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( eFD_AITypeIDs.GRUNT), 420) + 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]) } - + foreach(WaveEvent event in waveEvents[waveIndex]) + { + event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + } } @@ -117,16 +205,16 @@ void function waveStart() void function OnDamagedPropScript(entity prop,var damageInfo) { - if(!IsValid(harvesterStruct.harvester)) + if(!IsValid(fd_harvester.harvester)) return if(!IsValid(prop)) return - if(harvesterStruct.harvester!=prop) + if(fd_harvester.harvester!=prop) return - if(harvesterStruct.shieldBoost) + if(GetGlobalNetTime("FD_harvesterInvulTime")>Time()) { prop.SetShieldHealth(prop.GetShieldHealthMax()) return @@ -145,19 +233,19 @@ void function OnDamagedPropScript(entity prop,var damageInfo) if ( !attacker ) return //TODO Log damage source for round lose screen - harvesterStruct.lastDamage = Time() + + fd_harvester.lastDamage = Time() if(prop.GetShieldHealth()==0) { + float newHealth = prop.GetHealth()-damageAmount if(newHealth<0) { - EmitSoundAtPosition(TEAM_UNASSIGNED,harvesterStruct.harvester.GetOrigin(),"coop_generator_destroyed") + EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") newHealth=0 - harvesterStruct.rings.Destroy() - + fd_harvester.rings.Destroy() } - - + prop.SetHealth(newHealth) file.haversterWasDamaged = true } @@ -168,33 +256,42 @@ void function OnDamagedPropScript(entity prop,var damageInfo) void function HarvesterThink() { - entity harvester = harvesterStruct.harvester + entity harvester = fd_harvester.harvester EmitSoundOnEntity(harvester,"coop_generator_startup") float lastTime = Time() wait 4 - int lastShieldHealth = 6000 - HarvesterStruct temp = startHarvesterFX(harvesterStruct) - harvesterStruct.particleBeam = temp.particleBeam - harvesterStruct.particleShield = temp.particleShield - wait 5 + int lastShieldHealth = harvester.GetShieldHealth() + generateBeamFX(fd_harvester) + generateShieldFX(fd_harvester) + EmitSoundOnEntity(harvester,"coop_generator_ambient_healthy") - entity particleBeam = harvesterStruct.particleBeam - entity particleShield = harvesterStruct.particleShield + while(IsAlive(harvester)){ float currentTime = Time() float deltaTime = currentTime -lastTime - vector shieldColor = GraphCappedVector(harvester.GetShieldHealth(), 0, harvester.GetShieldHealthMax(),TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) - EffectSetControlPointVector( particleShield, 1, shieldColor ) - vector beamColor = GraphCappedVector(harvester.GetHealth(), 0, harvester.GetMaxHealth(), TEAM_COLOR_ENEMY, TEAM_COLOR_FRIENDLY) - EffectSetControlPointVector( particleBeam, 1, beamColor ) - if(((currentTime-harvesterStruct.lastDamage)>=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=GENERATOR_SHIELD_REGEN_DELAY)&&(harvester.GetShieldHealth()=5) + SetGlobalNetInt("FD_restartsRemaining",0) + else + SetGlobalNetInt("FD_restartsRemaining",2) + +} + void function LoadEntities() { - SetGlobalNetInt("FD_totalWaves",5) - SetGlobalNetInt("FD_restartsRemaining",2) - CreateBoostStoreLocation(TEAM_MILITIA,getShopPosition(),<0,0,0>) + initNetVars() + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) OpenBoostStores() @@ -262,9 +367,9 @@ void function LoadEntities() switch(info_target.kv.editorclass){ case"info_fd_harvester": HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) - harvesterStruct.harvester = ret.harvester - harvesterStruct.rings = ret.rings - harvesterStruct.lastDamage = ret.lastDamage + fd_harvester.harvester = ret.harvester + fd_harvester.rings = ret.rings + fd_harvester.lastDamage = ret.lastDamage break case"info_fd_mode_model": @@ -272,6 +377,9 @@ void function LoadEntities() break case"info_fd_ai_position": file.aiSpawnpoints.append(info_target) + if(info_target.kv.aiType=="3") + CreatePropDynamic($"models/vehicle/escape_pod/escape_pod.mdl",info_target.GetOrigin(),info_target.GetAngles(),6) + break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -290,4 +398,201 @@ void function LoadEntities() } -} \ No newline at end of file +} + +/****************************************************************************************************************\ +####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### +# # # # ## # # # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### +# # # # # # # # # # # # # # # # # ####### # # # # # +# # # # # ## # # # # # ## # # # # # # # # # # +####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # +\*****************************************************************************************************************/ + +WaveEvent function createSmokeEvent(vector position,float lifetime) +{ + WaveEvent event + event.eventFunction = spawnSmoke + event.smokeEvent.position = position + event.smokeEvent.lifetime = lifetime + return event +} + +WaveEvent function createArcTitanEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnArcTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_ARC + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + +WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnSuperSpectre + event.spawnEvent.spawnType= eFD_AITypeIDs.REAPER + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + +WaveEvent function createDroppodGruntEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodGrunts + event.spawnEvent.spawnType= eFD_AITypeIDs.GRUNT + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + +WaveEvent function createWaitForTimeEvent(float amount) +{ + WaveEvent event + event.eventFunction = waitForTime + event.waitEvent.amount = amount + return event +} + +WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount) +{ + WaveEvent event + event.eventFunction = spawnGenericNPC + event.spawnEvent.npcClassName = npcClassName + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + event.spawnEvent.spawnType = spawnType + event.spawnEvent.spawnAmount = spawnAmount + return event +} + + +WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount) +{ + WaveEvent event + event.eventFunction = spawnGenericNPCTitanwithSettings + 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 + return event +} + +/************************************************************************************************************\ +####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### +# # # # ## # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # ## # # # # # ## # # # # # # # ## # # +####### # ####### # # # # ##### # # ##### # ### ####### # # ##### +\************************************************************************************************************/ + +void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + printt("smoke") + SmokescreenStruct smokescreen + smokescreen.smokescreenFX = $"P_smokescreen_FD" + smokescreen.isElectric = false + smokescreen.origin = smokeEvent.position + 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 spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + DispatchSpawn(npc) +} + +void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + wait waitEvent.amount +} + +void function waitUntil(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + wait waitEvent.amount +} + +void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + DispatchSpawn(npc) +} + +void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + CreateTrackedDroppod(spawnEvent.origin,TEAM_IMC) +} +void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) + DispatchSpawn(npc) +} +void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) + SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) + DispatchSpawn(npc) +} +void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) + SetSpawnOption_AISettings(npc,"npc_titan_minigun_nuke") + DispachSpawn(npc) +} + +/********************************************************************************************************************\ +# # ####### # ###### ####### ###### ####### # # # # ##### ####### ### ####### # # ##### +# # # # # # # # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # # +####### ##### # ###### ##### ###### ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # ## # # # # # # # ## # # +# # ####### ####### # ####### # # # ##### # # ##### # ### ####### # # ##### +\********************************************************************************************************************/ + + +void function CreateTrackedDroppod( vector origin, int team , ) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSoldier( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} 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 345a86d9b..76dbb3108 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 @@ -24,4 +24,11 @@ void function FixBatterySpawns( entity spawn ) PowerUp powerupDef = GetPowerUpFromItemRef( expect string( spawn.kv.powerUpType ) ) if ( powerupDef.spawnFunc() ) spawn.SetOrigin( BATTERY_SPAWNS[file.batteryIndex++] ) +} +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_forwardbase_kodai_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut index 37b891699..bc68d794a 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,58 @@ -//fuck \ No newline at end of file +global function initFrontierDefenseData + + +void function initFrontierDefenseData() +{ + shopPosition = < -3862.13, 1267.69, 1060.06> + + + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) + //wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + //wave0.append(createWaitForTimeEvent(5)) + wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"")) + wave0.append(createDroppodGruntEvent(< -12, 1720, 1556>,"")) + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +} + +/* +void function initFrontierDefenseData() +{ + shopPosition = + + SmokeEvent emptySmokeEvent + SpawnEvent emptySpawnEvent + WaitEvent emptyWaitEvent + SoundEvent emptySoundEvent + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + + + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +}*/ \ No newline at end of file From f306be5d74400b3f61ff5b4d4366351412304dde Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 22 Feb 2022 23:10:19 +0100 Subject: [PATCH 14/99] More Events and Titan Navigation --- .../mod/scripts/vscripts/_harvester.gnut | 10 +- .../scripts/vscripts/ai/_ai_emp_titans.gnut | 2 +- .../mod/scripts/vscripts/ai/_ai_spawn.gnut | 2 +- .../vscripts/gamemodes/_gamemode_fd.nut | 304 ++++++++++++++---- .../mp/levels/mp_forwardbase_kodai_fd.nut | 27 +- 5 files changed, 275 insertions(+), 70 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index e5e60bf24..3ba6a6db4 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -24,14 +24,18 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i 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,info_target.GetOrigin(),info_target.GetAngles(),6) - // blackbox.Hide() - // blackbox.kv.CollisionGroup = TRACE_COLLISION_GROUP_PLAYER + 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" ) 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 638166c83..fd1bbff1d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut @@ -28,7 +28,7 @@ void function EMPTitanThinkConstant( entity titan ) titan.EndSignal( "StopEMPField" ) //We don't want pilots accidently rodeoing an electrified titan. - DisableTitanRodeo( titan ) + // DisableTitanRodeo( titan ) //Used to identify this titan as an arc titan SetTargetName( titan, "empTitan" ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut index 7e4d2cddf..8599f4294 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut @@ -223,7 +223,7 @@ entity function CreateOgre( int team, vector origin, vector angles, array 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 } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index ef952b24a..7f75144bc 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -6,6 +6,12 @@ global function createArcTitanEvent global function createWaitForTimeEvent global function createSuperSpectreEvent global function createDroppodGruntEvent +global function createNukeTitanEvent +global function createGenericSpawnEvent +global function createGenericTitanSpawnWithAiSettingsEvent +global function createDroppodStalkerEvent +global function createDroppodSpectreMortarEvent +global function createWaitUntilAliveEvent global struct SmokeEvent{ vector position @@ -17,7 +23,7 @@ global struct SpawnEvent{ vector angles string route 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 amount 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 } @@ -42,6 +48,7 @@ global struct WaveEvent{ global HarvesterStruct fd_harvester global vector shopPosition global array > waveEvents +global table > routes struct { array aiSpawnpoints @@ -59,13 +66,13 @@ void function GamemodeFD_Init() AddDamageCallback("prop_script",OnDamagedPropScript) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) -} + RegisterSignal("FD_ReachedHarvester") + RegisterSignal("OnFailedToPath") -void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3) -{ - } +void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} + bool function useShieldBoost(entity player,array args) { if((GetGlobalNetTime("FD_harvesterInvulTime")0)) @@ -85,27 +92,44 @@ void function startMainGameLoop() void function mainGameLoop() { startHarvester() - runWave(0) + bool showShop = false + for(int i = 0;i<2;i++)//for(int i = 0;i function getRoute(string routeName) -{ +{ + array ret + array currentNode = [] foreach(entity node in file.routeNodes) { if(!node.HasKey("route_name")) continue if(node.kv.route_name==routeName) - return node.GetLinkEntArray() + { + currentNode = [node] + break + } + + } + if(currentNode.len()==0) + { + printt("Route not found") + return [] } - printt("Route not found") - return [] + while(currentNode.len()!=0) + { + ret.append(currentNode[0]) + currentNode = currentNode[0].GetLinkEntArray() + } + return ret } + array function getEnemyTypesForWave(int wave) { table npcs @@ -180,28 +204,41 @@ array function getEnemyTypesForWave(int wave) } -void function runWave(int waveIndex) -{ - file.haversterWasDamaged = false - array enemys = getEnemyTypesForWave(waveIndex) - +void function runWave(int waveIndex,bool shouldDoBuyTime) +{ SetGlobalNetInt("FD_currentWave",waveIndex) - SetGlobalNetBool("FD_waveActive",true) - - + file.haversterWasDamaged = false + array enemys = getEnemyTypesForWave(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) + { + SetGlobalNetTime("FD_nextWaveStartTime",Time()+75) + OpenBoostStores() + wait 75 + CloseBoostStores() + } + else + { + //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10) + wait 10 + } + + SetGlobalNetBool("FD_waveActive",true) + + + foreach(WaveEvent event in waveEvents[waveIndex]) { event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + } - + SetGlobalNetBool("FD_waveActive",false) } - void function OnDamagedPropScript(entity prop,var damageInfo) { @@ -316,7 +353,9 @@ void function HarvesterThink() } } -void function startHarvester(){ + +void function startHarvester() +{ thread HarvesterThink() thread HarvesterAlarm() @@ -330,8 +369,7 @@ void function HarvesterAlarm() { if(fd_harvester.harvester.GetShieldHealth()==0) { - EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm") - wait 2.5 + wait EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm") } else { @@ -339,7 +377,9 @@ void function HarvesterAlarm() } } } -void function initNetVars(){ + +void function initNetVars() +{ SetGlobalNetInt("FD_totalWaves",waveEvents.len()) if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) SetGlobalNetInt("FD_restartsRemaining",0) @@ -353,7 +393,6 @@ void function LoadEntities() { initNetVars() CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) - OpenBoostStores() @@ -366,20 +405,16 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_IMC) + HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_MILITIA) fd_harvester.harvester = ret.harvester fd_harvester.rings = ret.rings fd_harvester.lastDamage = ret.lastDamage - 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": file.aiSpawnpoints.append(info_target) - if(info_target.kv.aiType=="3") - CreatePropDynamic($"models/vehicle/escape_pod/escape_pod.mdl",info_target.GetOrigin(),info_target.GetAngles(),6) - break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -388,16 +423,47 @@ void function LoadEntities() file.smokePoints.append(info_target) break } - - - } + } + +} - +void function titanNav_thread(entity titan, string routeName) +{ + printt("Start NAV") + if((!titan.IsTitan())||(!titan.IsNPC())) + return + + + array routeArray = getRoute(routeName) + WaitFrame()//so other code setting up what happens on signals is run before this + if(routeArray.len()==0) + { + + titan.Signal("OnFailedToPath") + return + } + foreach(entity node in routeArray) + { + if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin())5000)&&IsAlive(titan)) + { + WaitFrame() + printt(Distance(titan.GetOrigin(),node.GetOrigin())) + // i++ + // if(i>1200) + // { + // titan.Signal("OnFailedToPath") + // return + // } + } } - + titan.Signal("FD_ReachedHarvester") } /****************************************************************************************************************\ @@ -454,6 +520,28 @@ WaveEvent function createDroppodGruntEvent(vector origin,string route) return event } +WaveEvent function createDroppodStalkerEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodStalker + event.spawnEvent.spawnType= eFD_AITypeIDs.STALKER + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + +WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route) +{ + WaveEvent event + event.eventFunction = spawnDroppodSpectreMortar + event.spawnEvent.spawnType= eFD_AITypeIDs.SPECTRE_MORTAR + event.spawnEvent.spawnAmount = 4 + event.spawnEvent.origin = origin + event.spawnEvent.route = route + return event +} + WaveEvent function createWaitForTimeEvent(float amount) { WaveEvent event @@ -462,6 +550,14 @@ WaveEvent function createWaitForTimeEvent(float amount) return event } +WaveEvent function createWaitUntilAliveEvent(int amount) +{ + WaveEvent event + event.eventFunction = waitUntilLessThanAmountAlive + event.waitEvent.amount = amount.tofloat() + return event +} + WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount) { WaveEvent event @@ -475,7 +571,6 @@ WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vec return event } - WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount) { WaveEvent event @@ -490,6 +585,20 @@ WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassNam return event } +WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route) +{ + WaveEvent event + event.eventFunction = spawnNukeTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_NUKE + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + event.spawnEvent.route = route + return event +} + + + /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### # # # # ## # # # # # ## # # # # # # # ## # # # @@ -513,12 +622,16 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w 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 spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + thread titanNav_thread(npc,spawnEvent.route) DispatchSpawn(npc) + thread NPCTitanHotdrops(npc,true) + thread EMPTitanThinkConstant(npc) } void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -526,9 +639,20 @@ void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent wait waitEvent.amount } -void function waitUntil(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ - wait waitEvent.amount + + + +void function waitUntilLessThanAmountAlive(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + int aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + while(aliveTitans>waitEvent.amount.tointeger()) + { + printt("Titans alive",aliveTitans,waitEvent.amount.tointeger()) + WaitFrame() + aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + + } + } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -539,8 +663,19 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - CreateTrackedDroppod(spawnEvent.origin,TEAM_IMC) + thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC) } + +void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + thread CreateTrackedDroppodStalker(spawnEvent.origin,TEAM_IMC) +} + +void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + thread CreateTrackedDroppodSpectreMortar(spawnEvent.origin,TEAM_IMC) +} + void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) @@ -555,22 +690,26 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) - SetSpawnOption_AISettings(npc,"npc_titan_minigun_nuke") - DispachSpawn(npc) + SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_nuke") + thread titanNav_thread(npc,spawnEvent.route) + DispatchSpawn(npc) + + thread NPCTitanHotdrops(npc,true) + NukeTitanThink(npc,fd_harvester.harvester) } -/********************************************************************************************************************\ -# # ####### # ###### ####### ###### ####### # # # # ##### ####### ### ####### # # ##### -# # # # # # # # # # # # ## # # # # # # # ## # # # -# # # # # # # # # # # # # # # # # # # # # # # # -####### ##### # ###### ##### ###### ##### # # # # # # # # # # # # # ##### -# # # # # # # # # # # # # # # # # # # # # # # -# # # # # # # # # # # # ## # # # # # # # ## # # -# # ####### ####### # ####### # # # ##### # # ##### # ### ####### # # ##### -\********************************************************************************************************************/ +/****************************************************************************************\ +####### # # ####### # # ####### # # ####### # ###### ####### ###### +# # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # +##### # # ##### # # # # ####### ##### # ###### ##### ###### +# # # # # # # # # # # # # # # # +# # # # # ## # # # # # # # # # +####### # ####### # # # # # ####### ####### # ####### # # +\****************************************************************************************/ -void function CreateTrackedDroppod( vector origin, int team , ) +void function CreateTrackedDroppodSoldier( vector origin, int team) { @@ -596,3 +735,56 @@ void function CreateTrackedDroppod( vector origin, int team , ) ActivateFireteamDropPod( pod, guys ) } + +void function CreateTrackedDroppodSpectreMortar( vector origin, int team) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSpectre( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} +void function CreateTrackedDroppodStalker( vector origin, int team) +{ + + + entity pod = CreateDropPod( origin, <0,0,0> ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateStalker( team, origin,<0,0,0> ) + + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} \ 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 bc68d794a..5b05a3d7d 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 @@ -16,11 +16,24 @@ void function initFrontierDefenseData() //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) - //wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) - //wave0.append(createWaitForTimeEvent(5)) - wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) - wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"")) - wave0.append(createDroppodGruntEvent(< -12, 1720, 1556>,"")) + // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + // wave0.append(createWaitForTimeEvent(10)) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + + for(int i = 0; i<2;i++){ + wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + wave0.append(createWaitForTimeEvent(3)) + } + wave0.append(createWaitUntilAliveEvent(0)) + for(int i = 0; i<3;i++){ + wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + wave1.append(createWaitForTimeEvent(3)) + } + wave1.append(createWaitUntilAliveEvent(0)) + // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + + //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) waveEvents.append(wave0) waveEvents.append(wave1) @@ -34,10 +47,6 @@ void function initFrontierDefenseData() { shopPosition = - SmokeEvent emptySmokeEvent - SpawnEvent emptySpawnEvent - WaitEvent emptyWaitEvent - SoundEvent emptySoundEvent array wave0 array wave1 From 6bc02db86ceb6009fae579704d24e222bc69dda7 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 24 Feb 2022 17:50:40 +0100 Subject: [PATCH 15/99] Added Array to track alive Titans Added rise shop --- .../vscripts/gamemodes/_gamemode_fd.nut | 35 ++++++++++++--- .../scripts/vscripts/mp/levels/mp_rise.nut | 8 +++- .../scripts/vscripts/mp/levels/mp_rise_fd.nut | 44 ++++++++++++++++++- 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 7f75144bc..55f667d73 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -56,6 +56,7 @@ struct { array routeNodes table harvesterDamageSource bool haversterWasDamaged + array spawnedNPCs }file void function GamemodeFD_Init() @@ -68,7 +69,23 @@ void function GamemodeFD_Init() AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") + AddDeathCallback("npc_titan",OnNpcDeath) + AddDeathCallback("npc_stalker",OnNpcDeath) + AddDeathCallback("npc_spectre",OnNpcDeath) + AddDeathCallback("npc_super_spectre",OnNpcDeath) + AddDeathCallback("npc_soldier",OnNpcDeath) + AddDeathCallback("npc_frag_drone",OnNpcDeath) + AddDeathCallback("npc_drone",OnNpcDeath) + +} +void function OnNpcDeath( entity ent, var damageInfo ){ + int findIndex = file.spawnedNPCs.find( ent ) + if ( findIndex != -1 ) + { + file.spawnedNPCs.remove( findIndex ) + } + printt("callback") } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} @@ -629,8 +646,9 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven { entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) - thread NPCTitanHotdrops(npc,true) + file.spawnedNPCs.append(npc) thread EMPTitanThinkConstant(npc) } @@ -644,20 +662,22 @@ void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent void function waitUntilLessThanAmountAlive(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - int aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() - while(aliveTitans>waitEvent.amount.tointeger()) + int aliveTitans = file.spawnedNPCs.len() + int testamount = waitEvent.amount.tointeger() + while(aliveTitans>testamount) { - printt("Titans alive",aliveTitans,waitEvent.amount.tointeger()) + printt("Titans alive",aliveTitans,testamount) WaitFrame() - aliveTitans = GetEntArrayByClass_Expensive("npc_titan").len() + aliveTitans = file.spawnedNPCs.len() } - + printt("Titans alive end",aliveTitans,testamount) } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) } @@ -692,9 +712,10 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) SetSpawnOption_AISettings(npc,"npc_titan_ogre_minigun_nuke") thread titanNav_thread(npc,spawnEvent.route) + SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) + file.spawnedNPCs.append(npc) - thread NPCTitanHotdrops(npc,true) NukeTitanThink(npc,fd_harvester.harvester) } 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 37b891699..94dce4707 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 37b891699..744859715 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,43 @@ -//fuck \ No newline at end of file +global function initFrontierDefenseData + + +void function initFrontierDefenseData() +{ + shopPosition = < -5165.42, -679.285, 384.031> //only aproximate position + + + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) + // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + // wave0.append(createWaitForTimeEvent(10)) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + + // for(int i = 0; i<2;i++){ + // wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createWaitForTimeEvent(3)) + // } + // wave0.append(createWaitUntilAliveEvent(0)) + // for(int i = 0; i<3;i++){ + // wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave1.append(createWaitForTimeEvent(3)) + // } + // wave1.append(createWaitUntilAliveEvent(0)) + // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + + //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +} \ No newline at end of file From 9eb7612150ed7d0ad7a8d74ec5c559a4676c68cf Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 11 Mar 2022 00:35:51 +0100 Subject: [PATCH 16/99] Added waveend scoring --- .../vscripts/gamemodes/_gamemode_fd.nut | 169 +++++++++++++++--- .../mp/levels/mp_forwardbase_kodai_fd.nut | 30 ++-- 2 files changed, 162 insertions(+), 37 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 55f667d73..66bd0a36f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -45,30 +45,46 @@ global struct WaveEvent{ } + global HarvesterStruct fd_harvester global vector shopPosition global array > waveEvents global table > routes + +struct player_struct_fd{ + bool diedThisRound + int scoreThisRound + +} + + struct { array aiSpawnpoints array smokePoints array routeNodes table harvesterDamageSource - bool haversterWasDamaged + bool havesterWasDamaged array spawnedNPCs + table players }file void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) PrecacheParticleSystem($"P_smokescreen_FD") + + RegisterSignal("FD_ReachedHarvester") + RegisterSignal("OnFailedToPath") + + + AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) - AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) - RegisterSignal("FD_ReachedHarvester") - RegisterSignal("OnFailedToPath") + AddCallback_OnClientConnected(GamemodeFD_InitPlayer) + AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) AddDeathCallback("npc_spectre",OnNpcDeath) @@ -76,9 +92,25 @@ void function GamemodeFD_Init() AddDeathCallback("npc_soldier",OnNpcDeath) AddDeathCallback("npc_frag_drone",OnNpcDeath) AddDeathCallback("npc_drone",OnNpcDeath) - + + AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) + AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) +} + +void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo) +{ + file.players[victim].diedThisRound = true } +void function GamemodeFD_InitPlayer(entity player){ + player_struct_fd data + data.diedThisRound = false + data.scoreThisRound = 0 + file.players[player] <- data +} + + + void function OnNpcDeath( entity ent, var damageInfo ){ int findIndex = file.spawnedNPCs.find( ent ) if ( findIndex != -1 ) @@ -96,6 +128,7 @@ bool function useShieldBoost(entity player,array args) { fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) + MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) } return true @@ -110,7 +143,7 @@ void function mainGameLoop() { startHarvester() bool showShop = false - for(int i = 0;i<2;i++)//for(int i = 0;i function getEnemyTypesForWave(int wave) void function runWave(int waveIndex,bool shouldDoBuyTime) { + + + + SetGlobalNetInt("FD_currentWave",waveIndex) - file.haversterWasDamaged = false + file.havesterWasDamaged = false + foreach(player_struct_fd player in file.players) + { + player.diedThisRound = false + player.scoreThisRound = 0 + } array enemys = getEnemyTypesForWave(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) { - SetGlobalNetTime("FD_nextWaveStartTime",Time()+75) + OpenBoostStores() - wait 75 + foreach(entity player in GetPlayerArray()) + Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyStoreOpen") + while(Time()5000)&&IsAlive(titan)) + while((Distance(titan.GetOrigin(),node.GetOrigin())>5000)) { WaitFrame() printt(Distance(titan.GetOrigin(),node.GetOrigin())) @@ -483,6 +591,24 @@ void function titanNav_thread(entity titan, string routeName) titan.Signal("FD_ReachedHarvester") } +bool function allPlayersReady() +{ + foreach(entity player in GetPlayerArray()) + { + if(!player.GetPlayerNetBool("FD_readyForNextWave")) + return false + } + return true +} + +bool function ClientCommandCallbackToggleReady( entity player, array args ) +{ + if(args[0]=="true") + player.SetPlayerNetBool("FD_readyForNextWave",true) + if(args[0]=="flase") + player.SetPlayerNetBool("FD_readyForNextWave",false) + return true +} /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -632,7 +758,7 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w SmokescreenStruct smokescreen smokescreen.smokescreenFX = $"P_smokescreen_FD" smokescreen.isElectric = false - smokescreen.origin = smokeEvent.position + smokescreen.origin = smokeEvent.position + < 0 , 0, 150> smokescreen.angles = <0,0,0> smokescreen.lifetime = smokeEvent.lifetime smokescreen.fxXYRadius = 150 @@ -647,6 +773,7 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) + npc.DisableNPCFlag(NPC_ALLOW_INVESTIGATE | NPC_USE_SHOOTING_COVER|NPC_ALLOW_PATROL) DispatchSpawn(npc) file.spawnedNPCs.append(npc) thread EMPTitanThinkConstant(npc) @@ -701,12 +828,14 @@ void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEv entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) DispatchSpawn(npc) } + void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) DispatchSpawn(npc) } + void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = CreateNPCTitan("titan_ogre",TEAM_IMC, spawnEvent.origin, spawnEvent.angles) @@ -716,7 +845,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve DispatchSpawn(npc) file.spawnedNPCs.append(npc) - NukeTitanThink(npc,fd_harvester.harvester) + //NukeTitanThink(npc,fd_harvester.harvester) //currently crashes game } /****************************************************************************************\ 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 5b05a3d7d..d4ac4c5aa 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 @@ -15,31 +15,27 @@ void function initFrontierDefenseData() - //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) - // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) + //wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) + // wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) // wave0.append(createWaitForTimeEvent(10)) - // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) + // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - for(int i = 0; i<2;i++){ - wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - wave0.append(createWaitForTimeEvent(3)) - } + + wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) + wave0.append(createWaitUntilAliveEvent(0)) - for(int i = 0; i<3;i++){ - wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - wave1.append(createWaitForTimeEvent(3)) - } + wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) - // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) + // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) + //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) + //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) waveEvents.append(wave0) waveEvents.append(wave1) - waveEvents.append(wave2) - waveEvents.append(wave3) - waveEvents.append(wave4) + //waveEvents.append(wave2) + //waveEvents.append(wave3) + //waveEvents.append(wave4) } /* From 0b5e8151a81758eef5b1c6637292f401f3a7167b Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 12 Mar 2022 21:15:18 +0100 Subject: [PATCH 17/99] Added Restart and Win and Mortar Titan --- .../vscripts/gamemodes/_gamemode_fd.nut | 222 ++++++++++++++---- .../mp/levels/mp_forwardbase_kodai_fd.nut | 6 +- 2 files changed, 175 insertions(+), 53 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 66bd0a36f..f7b5e33d8 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -7,11 +7,13 @@ global function createWaitForTimeEvent global function createSuperSpectreEvent 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 createCloakDroneEvent global struct SmokeEvent{ vector position @@ -67,6 +69,7 @@ struct { bool havesterWasDamaged array spawnedNPCs table players + entity harvester_info }file void function GamemodeFD_Init() @@ -76,15 +79,18 @@ void function GamemodeFD_Init() RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") - + SetRoundBased(true) + SetShouldUseRoundWinningKillReplay(false) AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) + AddCallback_GameStateEnter(eGameState.Prematch,FD_createHarvester) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddCallback_OnClientConnected(GamemodeFD_InitPlayer) AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) AddDeathCallback("npc_spectre",OnNpcDeath) @@ -102,7 +108,8 @@ void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var dama file.players[victim].diedThisRound = true } -void function GamemodeFD_InitPlayer(entity player){ +void function GamemodeFD_InitPlayer(entity player) +{ player_struct_fd data data.diedThisRound = false data.scoreThisRound = 0 @@ -111,7 +118,8 @@ void function GamemodeFD_InitPlayer(entity player){ -void function OnNpcDeath( entity ent, var damageInfo ){ +void function OnNpcDeath( entity ent, var damageInfo ) +{ int findIndex = file.spawnedNPCs.find( ent ) if ( findIndex != -1 ) { @@ -135,23 +143,31 @@ bool function useShieldBoost(entity player,array args) } void function startMainGameLoop() -{ +{ thread mainGameLoop() } void function mainGameLoop() -{ +{ startHarvester() + bool showShop = false - for(int i = 0;i function getRoute(string routeName) { array ret @@ -254,7 +270,7 @@ array function getEnemyTypesForWave(int wave) } -void function runWave(int waveIndex,bool shouldDoBuyTime) +bool function runWave(int waveIndex,bool shouldDoBuyTime) { @@ -291,22 +307,30 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10) wait 10 - + 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) //main wave loop + foreach(WaveEvent event in waveEvents[waveIndex]) { event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) - + if(!IsAlive(fd_harvester.harvester)) + return false + waitUntilLessThanAmountAlive(0) } + + + + wait 2 //wave end SetGlobalNetBool("FD_waveActive",false) @@ -344,9 +368,14 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) AddPlayerScore(highestScore_player,"FDWaveMVP") AddMoneyToPlayer(highestScore_player,100) 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") @@ -355,7 +384,7 @@ void function runWave(int waveIndex,bool shouldDoBuyTime) } } wait 10 - + return true } @@ -411,6 +440,14 @@ void function OnDamagedPropScript(entity prop,var damageInfo) } +void function FD_NPCCleanup() +{ + foreach(entity npc in file.spawnedNPCs){ + if(IsValid(npc)) + npc.Destroy() + } +} + void function HarvesterThink() { entity harvester = fd_harvester.harvester @@ -482,7 +519,6 @@ void function startHarvester() } - void function HarvesterAlarm() { while(IsAlive(fd_harvester.harvester)) @@ -501,21 +537,31 @@ void function HarvesterAlarm() void function initNetVars() { SetGlobalNetInt("FD_totalWaves",waveEvents.len()) - if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) - SetGlobalNetInt("FD_restartsRemaining",0) - else - SetGlobalNetInt("FD_restartsRemaining",2) + + if(!FD_HasRestarted()) + { + bool showShop = false + SetGlobalNetInt("FD_currentWave",0) + if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) + FD_SetNumAllowedRestarts(0) + else + FD_SetNumAllowedRestarts(2) + } } +void function FD_createHarvester() +{ + HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),1,1,TEAM_IMC)//,25000,6000,TEAM_MILITIA) + fd_harvester.harvester = ret.harvester + fd_harvester.rings = ret.rings + fd_harvester.lastDamage = ret.lastDamage +} void function LoadEntities() { - initNetVars() + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) - - - foreach ( entity info_target in GetEntArrayByClass_Expensive("info_target") ) { @@ -525,16 +571,13 @@ void function LoadEntities() if(info_target.HasKey("editorclass")){ switch(info_target.kv.editorclass){ case"info_fd_harvester": - HarvesterStruct ret = SpawnHarvester(info_target.GetOrigin(),info_target.GetAngles(),25000,6000,TEAM_MILITIA) - fd_harvester.harvester = ret.harvester - fd_harvester.rings = ret.rings - fd_harvester.lastDamage = ret.lastDamage + 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": - file.aiSpawnpoints.append(info_target) + AddStationaryAIPosition(info_target.GetOrigin(),int(info_target.kv.aiType)) break case"info_fd_route_node": file.routeNodes.append(info_target) @@ -545,10 +588,10 @@ void function LoadEntities() } } } - + ValidateAndFinalizePendingStationaryPositions() + initNetVars() } - void function titanNav_thread(entity titan, string routeName) { titan.EndSignal( "OnDeath" ) @@ -609,6 +652,7 @@ bool function ClientCommandCallbackToggleReady( entity player, array arg player.SetPlayerNetBool("FD_readyForNextWave",false) return true } + /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -696,7 +740,7 @@ WaveEvent function createWaitForTimeEvent(float amount) WaveEvent function createWaitUntilAliveEvent(int amount) { WaveEvent event - event.eventFunction = waitUntilLessThanAmountAlive + event.eventFunction = waitUntilLessThanAmountAliveEvent event.waitEvent.amount = amount.tofloat() return event } @@ -740,7 +784,26 @@ WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route return event } +WaveEvent function createMortarTitanEvent(vector origin,vector angles) +{ + WaveEvent event + event.eventFunction = spawnMortarTitan + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_MORTAR + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} +WaveEvent function createCloakDroneEvent(vector origin,vector angles){ + WaveEvent event + event.eventFunction = fd_spawnCloakDrone + event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE_CLOAK + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### @@ -769,7 +832,8 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w } void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) @@ -781,28 +845,23 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { - wait waitEvent.amount + float waitUntil = Time() + waitEvent.amount + while(Time()testamount) - { - printt("Titans alive",aliveTitans,testamount) - WaitFrame() - aliveTitans = file.spawnedNPCs.len() - - } - printt("Titans alive end",aliveTitans,testamount) + waitUntilLessThanAmountAlive(int(waitEvent.amount)) } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) @@ -810,42 +869,79 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC) } void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodStalker(spawnEvent.origin,TEAM_IMC) } void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) thread CreateTrackedDroppodSpectreMortar(spawnEvent.origin,TEAM_IMC) } void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) DispatchSpawn(npc) } void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateNPCTitan( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) DispatchSpawn(npc) + file.spawnedNPCs.append(npc) } void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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") thread titanNav_thread(npc,spawnEvent.route) SetSpawnOption_Titanfall(npc) + npc.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) + DispatchSpawn(npc) + file.spawnedNPCs.append(npc) + thread NukeTitanThink(npc,fd_harvester.harvester) + +} + +void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) DispatchSpawn(npc) file.spawnedNPCs.append(npc) + thread MortarTitanThink(npc,fd_harvester.harvester) - //NukeTitanThink(npc,fd_harvester.harvester) //currently crashes game +} + +void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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_atlas_tracker_mortar") + SetSpawnOption_Titanfall(npc) + DispatchSpawn(npc) + file.spawnedNPCs.append(npc) + thread MortarTitanThink(npc,fd_harvester.harvester) + +} +void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, file.harvester_info.GetOrigin() ) + file.spawnedNPCs.append(npc) } /****************************************************************************************\ @@ -937,4 +1033,28 @@ void function CreateTrackedDroppodStalker( vector origin, int team) } ActivateFireteamDropPod( pod, guys ) +} + +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 aliveTitans = file.spawnedNPCs.len() + + while(aliveTitans>amount) + { + printt("Titans alive",aliveTitans,amount) + WaitFrame() + aliveTitans = file.spawnedNPCs.len() + if(!IsAlive(fd_harvester.harvester)) + break + + } + printt("Titans alive end",aliveTitans,amount) } \ 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 d4ac4c5aa..901e6dd30 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 @@ -21,8 +21,8 @@ void function initFrontierDefenseData() // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - + wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) + wave0.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave0.append(createWaitUntilAliveEvent(0)) wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) @@ -31,6 +31,8 @@ void function initFrontierDefenseData() //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) + waveEvents.append(wave0) + waveEvents.append(wave0) waveEvents.append(wave1) //waveEvents.append(wave2) From 5c44d18fc00d1a78f4721a17965d13ca0e4cba05 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 15 Mar 2022 03:44:43 +0100 Subject: [PATCH 18/99] Added Game End Conditions Changed super spectres --- .../vscripts/gamemodes/_gamemode_fd.nut | 80 ++++++++++++++----- .../mp/levels/mp_forwardbase_kodai_fd.nut | 18 ++--- 2 files changed, 69 insertions(+), 29 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index f7b5e33d8..bff0ebab4 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -82,6 +82,8 @@ void function GamemodeFD_Init() SetRoundBased(true) SetShouldUseRoundWinningKillReplay(false) + Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) + PlayerEarnMeter_SetEnabled(false) AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) @@ -156,16 +158,20 @@ void function mainGameLoop() { if(!runWave(i,showShop)) break - showShop = true - } - if(IsAlive(fd_harvester.harvester)) - { - //Game won code - SetWinner(TEAM_MILITIA) - return + + if(i==0) + { + PlayerEarnMeter_SetEnabled(true) + showShop = true + foreach(entity player in GetPlayerArray()) + { + PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) + } + } + } - //restart round - SetWinner(TEAM_IMC) + + } array function getRoute(string routeName) @@ -326,9 +332,20 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) return false waitUntilLessThanAmountAlive(0) } + if(!IsAlive(fd_harvester.harvester)) + { + + } - - + if(!IsAlive(fd_harvester.harvester)) + { + if(GetGlobalNetInt("FD_restartsRemaining")>0) + FD_DecrementRestarts() + else + SetRoundBased(false) + SetWinner(TEAM_IMC)//restart round + return false + } wait 2 @@ -383,6 +400,13 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P") } } + if(isFinalWave()&&IsAlive(fd_harvester.harvester)) + { + //Game won code + SetRoundBased(false) + SetWinner(TEAM_MILITIA) + return true + } wait 10 return true @@ -552,12 +576,17 @@ void function initNetVars() void function FD_createHarvester() { - HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),1,1,TEAM_IMC)//,25000,6000,TEAM_MILITIA) + HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) fd_harvester.harvester = ret.harvester fd_harvester.rings = ret.rings fd_harvester.lastDamage = ret.lastDamage } +bool function isFinalWave() +{ + return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves")) +} + void function LoadEntities() { @@ -588,6 +617,7 @@ void function LoadEntities() } } } + AddStationaryAIPosition(< -12, 1720, 1456 >,4) ValidateAndFinalizePendingStationaryPositions() initNetVars() } @@ -599,7 +629,7 @@ void function titanNav_thread(entity titan, string routeName) printt("Start NAV") - if((!titan.IsTitan())||(!titan.IsNPC())) + if(!titan.IsNPC()) return @@ -619,7 +649,7 @@ void function titanNav_thread(entity titan, string routeName) continue titan.AssaultPoint(node.GetOrigin()) int i = 0 - while((Distance(titan.GetOrigin(),node.GetOrigin())>5000)) + while((Distance(titan.GetOrigin(),node.GetOrigin())>500)) { WaitFrame() printt(Distance(titan.GetOrigin(),node.GetOrigin())) @@ -860,11 +890,14 @@ void function waitUntilLessThanAmountAliveEvent(SmokeEvent smokeEvent,SpawnEvent } void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) - SetSpawnOption_Titanfall(npc) - DispatchSpawn(npc) + SetSpawnOption_AISettings(npc,"npc_super_spectre_fd") + file.spawnedNPCs.append(npc) + + thread spawnSuperSpectre_threaded(npc) } void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -917,6 +950,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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") @@ -924,14 +958,13 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE DispatchSpawn(npc) file.spawnedNPCs.append(npc) thread MortarTitanThink(npc,fd_harvester.harvester) - } void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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_atlas_tracker_mortar") + SetSpawnOption_AISettings(npc,"npc_titan_stryder_sniper_fd") SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) file.spawnedNPCs.append(npc) @@ -953,7 +986,14 @@ void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,Wa # # # # # ## # # # # # # # # # ####### # ####### # # # # # ####### ####### # ####### # # \****************************************************************************************/ - +void function spawnSuperSpectre_threaded(entity npc) +{ + + wait 4.7 + DispatchSpawn(npc) + thread SuperSpectre_WarpFall(npc) + thread Reaper_LaunchFragDrone_Think( npc, "npc_frag_drone_fd") +} void function CreateTrackedDroppodSoldier( vector origin, int team) { 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 901e6dd30..9fe180451 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 @@ -13,27 +13,27 @@ void function initFrontierDefenseData() array wave3 array wave4 - + wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, < 0,0,0 >, "hillRouteClose")) //wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) // wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) // wave0.append(createWaitForTimeEvent(10)) // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - - wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) - wave0.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) + + //wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) + //.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave0.append(createWaitUntilAliveEvent(0)) wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) wave1.append(createWaitUntilAliveEvent(0)) // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - + //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) waveEvents.append(wave0) - waveEvents.append(wave0) + //waveEvents.append(wave0) waveEvents.append(wave1) //waveEvents.append(wave2) //waveEvents.append(wave3) @@ -43,7 +43,7 @@ void function initFrontierDefenseData() /* void function initFrontierDefenseData() { - shopPosition = + shopPosition = array wave0 @@ -52,8 +52,8 @@ void function initFrontierDefenseData() array wave3 array wave4 - - + + From 7b11a56fc7dadf4b1dd0d59cb3add439b1b88c61 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 25 Mar 2022 20:40:36 +0100 Subject: [PATCH 19/99] Added Game Loss screen -prepared some fd awards for win screen -added shouldThread option to waveEvents --- .../vscripts/gamemodes/_gamemode_fd.nut | 222 +++++++++++++++--- 1 file changed, 183 insertions(+), 39 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index bff0ebab4..a89d5a300 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -40,6 +40,7 @@ global struct SoundEvent{ global struct WaveEvent{ void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction + bool shouldThread SmokeEvent smokeEvent SpawnEvent spawnEvent WaitEvent waitEvent @@ -56,8 +57,20 @@ global table > routes struct player_struct_fd{ bool diedThisRound - int scoreThisRound - + float scoreThisRound + int totalMVPs + int mortarUnitsKilled + int moneySpend + int coresUsed + float longestTitanLife + int turretsRepaired + int moneyShared + float timeNearHarvester + float longestLife + int heals + int titanKills + float damageDealt + int harvesterHeals } @@ -65,7 +78,7 @@ struct { array aiSpawnpoints array smokePoints array routeNodes - table harvesterDamageSource + array harvesterDamageSource bool havesterWasDamaged array spawnedNPCs table players @@ -79,11 +92,13 @@ void function GamemodeFD_Init() RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") + SetRoundBased(true) SetShouldUseRoundWinningKillReplay(false) - Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) PlayerEarnMeter_SetEnabled(false) + SetShouldUsePickLoadoutScreen( true ) + AddCallback_EntitiesDidLoad(LoadEntities) AddDamageCallback("prop_script",OnDamagedPropScript) @@ -91,7 +106,9 @@ void function GamemodeFD_Init() AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddCallback_OnClientConnected(GamemodeFD_InitPlayer) AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) - + AddCallback_OnRoundEndCleanup(FD_NPCCleanup) + AddDamageByCallback("player",FD_DamageByPlayerCallback) + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) @@ -100,25 +117,39 @@ void function GamemodeFD_Init() AddDeathCallback("npc_soldier",OnNpcDeath) AddDeathCallback("npc_frag_drone",OnNpcDeath) AddDeathCallback("npc_drone",OnNpcDeath) + SetUsedCoreCallback(FD_UsedCoreCallback) AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) + + + } + void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo) { file.players[victim].diedThisRound = true } +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 data.scoreThisRound = 0 file.players[player] <- data -} - + +} void function OnNpcDeath( entity ent, var damageInfo ) { @@ -127,7 +158,7 @@ void function OnNpcDeath( entity ent, var damageInfo ) { file.spawnedNPCs.remove( findIndex ) } - printt("callback") + } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} @@ -140,6 +171,7 @@ bool function useShieldBoost(entity player,array args) SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) + file.players[player].harvesterHeals += 1 } return true } @@ -279,11 +311,12 @@ array function getEnemyTypesForWave(int wave) bool function runWave(int waveIndex,bool shouldDoBuyTime) { - - - SetGlobalNetInt("FD_currentWave",waveIndex) file.havesterWasDamaged = false + for(int i = 0; i<20;i++)//Number of npc type ids + { + file.harvesterDamageSource.append(0.0) + } foreach(player_struct_fd player in file.players) { player.diedThisRound = false @@ -327,18 +360,51 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) foreach(WaveEvent event in waveEvents[waveIndex]) { - event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + if(event.shouldThread) + thread event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) + else + event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) if(!IsAlive(fd_harvester.harvester)) - return false - waitUntilLessThanAmountAlive(0) - } - if(!IsAlive(fd_harvester.harvester)) - { - + break + } - + waitUntilLessThanAmountAlive_expensive(0) if(!IsAlive(fd_harvester.harvester)) - { + { + float totalDamage = 0.0 + array highestDamage = [0.0,0.0,0.0] + array highestDamageSource = [-1,-1,-1] + foreach(index,float damage in file.harvesterDamageSource) + { + totalDamage += damage + if(highestDamage[0]0) FD_DecrementRestarts() else @@ -365,7 +431,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P") } wait 1 - int highestScore = 0; + float highestScore = 0; entity highestScore_player = GetPlayerArray()[0] foreach(entity player in GetPlayerArray()) { @@ -382,6 +448,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } wait 1 + file.players[highestScore_player].totalMVPs += 1 AddPlayerScore(highestScore_player,"FDWaveMVP") AddMoneyToPlayer(highestScore_player,100) EmitSoundOnEntityOnlyToPlayer(highestScore_player,highestScore_player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P") @@ -447,13 +514,17 @@ void function OnDamagedPropScript(entity prop,var damageInfo) fd_harvester.lastDamage = Time() if(prop.GetShieldHealth()==0) { + int attackerID = FD_GetAITypeID_ByString(attacker.GetTargetName()) + file.harvesterDamageSource[attackerID] += damageAmount + + float newHealth = prop.GetHealth()-damageAmount if(newHealth<0) { EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") newHealth=0 - fd_harvester.rings.Destroy() + fd_harvester.rings.Destroy()//TODO death animation } prop.SetHealth(newHealth) @@ -466,7 +537,7 @@ void function OnDamagedPropScript(entity prop,var damageInfo) void function FD_NPCCleanup() { - foreach(entity npc in file.spawnedNPCs){ + foreach(entity npc in GetEntArrayByClass_Expensive("C_AI_BaseNPC")){ if(IsValid(npc)) npc.Destroy() } @@ -566,7 +637,7 @@ void function initNetVars() { bool showShop = false SetGlobalNetInt("FD_currentWave",0) - if(GetCurrentPlaylistVarInt("fd_difficulty",0)>=5) + if(FD_IsDifficultyLevelOrHigher(eFDDifficultyLevel.INSANE)) FD_SetNumAllowedRestarts(0) else FD_SetNumAllowedRestarts(2) @@ -574,6 +645,17 @@ void function initNetVars() } +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 //TODO NOT HOW SCORE WORKS + +} + void function FD_createHarvester() { HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) @@ -622,7 +704,7 @@ void function LoadEntities() initNetVars() } -void function titanNav_thread(entity titan, string routeName) +void function titanNav_thread(entity titan, string routeName,float nextDistance = 500.0) { titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) @@ -644,15 +726,16 @@ void function titanNav_thread(entity titan, string routeName) foreach(entity node in routeArray) { - + if(!IsAlive(fd_harvester.harvester)) + return if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin())500)) + while((Distance(titan.GetOrigin(),node.GetOrigin())>nextDistance)) { WaitFrame() - printt(Distance(titan.GetOrigin(),node.GetOrigin())) + //printt(Distance(titan.GetOrigin(),node.GetOrigin())) // i++ // if(i>1200) // { @@ -678,11 +761,45 @@ bool function ClientCommandCallbackToggleReady( entity player, array arg { if(args[0]=="true") player.SetPlayerNetBool("FD_readyForNextWave",true) - if(args[0]=="flase") + if(args[0]=="false") player.SetPlayerNetBool("FD_readyForNextWave",false) 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 +} + /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -697,6 +814,7 @@ WaveEvent function createSmokeEvent(vector position,float lifetime) { WaveEvent event event.eventFunction = spawnSmoke + event.shouldThread = true event.smokeEvent.position = position event.smokeEvent.lifetime = lifetime return event @@ -706,6 +824,7 @@ WaveEvent function createArcTitanEvent(vector origin,vector angles,string route) { WaveEvent event event.eventFunction = spawnArcTitan + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_ARC event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin @@ -718,6 +837,7 @@ WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string ro { WaveEvent event event.eventFunction = spawnSuperSpectre + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.REAPER event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin @@ -730,6 +850,7 @@ WaveEvent function createDroppodGruntEvent(vector origin,string route) { WaveEvent event event.eventFunction = spawnDroppodGrunts + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.GRUNT event.spawnEvent.spawnAmount = 4 event.spawnEvent.origin = origin @@ -741,6 +862,7 @@ WaveEvent function createDroppodStalkerEvent(vector origin,string route) { WaveEvent event event.eventFunction = spawnDroppodStalker + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.STALKER event.spawnEvent.spawnAmount = 4 event.spawnEvent.origin = origin @@ -752,6 +874,7 @@ WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route) { WaveEvent event event.eventFunction = spawnDroppodSpectreMortar + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.SPECTRE_MORTAR event.spawnEvent.spawnAmount = 4 event.spawnEvent.origin = origin @@ -762,6 +885,7 @@ WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route) WaveEvent function createWaitForTimeEvent(float amount) { WaveEvent event + event.shouldThread = false event.eventFunction = waitForTime event.waitEvent.amount = amount return event @@ -771,6 +895,7 @@ WaveEvent function createWaitUntilAliveEvent(int amount) { WaveEvent event event.eventFunction = waitUntilLessThanAmountAliveEvent + event.shouldThread = false event.waitEvent.amount = amount.tofloat() return event } @@ -779,6 +904,7 @@ WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vec { WaveEvent event event.eventFunction = spawnGenericNPC + event.shouldThread = true event.spawnEvent.npcClassName = npcClassName event.spawnEvent.origin = origin event.spawnEvent.angles = angles @@ -792,6 +918,7 @@ WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassNam { WaveEvent event event.eventFunction = spawnGenericNPCTitanwithSettings + event.shouldThread = true event.spawnEvent.npcClassName = npcClassName event.spawnEvent.aiSettings = aiSettings event.spawnEvent.origin = origin @@ -806,6 +933,7 @@ WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route { WaveEvent event event.eventFunction = spawnNukeTitan + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_NUKE event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin @@ -818,6 +946,7 @@ WaveEvent function createMortarTitanEvent(vector origin,vector angles) { WaveEvent event event.eventFunction = spawnMortarTitan + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_MORTAR event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin @@ -826,8 +955,9 @@ WaveEvent function createMortarTitanEvent(vector origin,vector angles) } WaveEvent function createCloakDroneEvent(vector origin,vector angles){ - WaveEvent event + WaveEvent event event.eventFunction = fd_spawnCloakDrone + event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE_CLOAK event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin @@ -865,11 +995,11 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) - thread titanNav_thread(npc,spawnEvent.route) - SetSpawnOption_Titanfall(npc) - npc.DisableNPCFlag(NPC_ALLOW_INVESTIGATE | NPC_USE_SHOOTING_COVER|NPC_ALLOW_PATROL) + file.spawnedNPCs.append(npc) DispatchSpawn(npc) - file.spawnedNPCs.append(npc) + npc.DisableNPCFlag(NPC_ALLOW_INVESTIGATE | NPC_USE_SHOOTING_COVER|NPC_ALLOW_PATROL) + SetSpawnOption_Titanfall(npc) + thread titanNav_thread(npc,spawnEvent.route) thread EMPTitanThinkConstant(npc) } @@ -992,7 +1122,7 @@ void function spawnSuperSpectre_threaded(entity npc) wait 4.7 DispatchSpawn(npc) thread SuperSpectre_WarpFall(npc) - thread Reaper_LaunchFragDrone_Think( npc, "npc_frag_drone_fd") + thread ReaperMinionLauncherThink(npc) } void function CreateTrackedDroppodSoldier( vector origin, int team) @@ -1084,17 +1214,31 @@ void function PingMinimap(float x, float y, float duration, float spreadRadius, } void function waitUntilLessThanAmountAlive(int amount) -{ +{ + printt("start wait") int aliveTitans = file.spawnedNPCs.len() while(aliveTitans>amount) { - printt("Titans alive",aliveTitans,amount) WaitFrame() aliveTitans = file.spawnedNPCs.len() if(!IsAlive(fd_harvester.harvester)) break - + printt("titans alive ", aliveTitans) + } +} + +void function waitUntilLessThanAmountAlive_expensive(int amount) +{ + printt("start wait") + int aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() + + while(aliveTitans>amount) + { + WaitFrame() + aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() + if(!IsAlive(fd_harvester.harvester)) + break + printt("titans alive ", aliveTitans) } - printt("Titans alive end",aliveTitans,amount) } \ No newline at end of file From db9778a64c1e9e6e8e3112a4d8077f78f868ab68 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 9 May 2022 19:01:31 +0800 Subject: [PATCH 20/99] Harvester changes (#350) - changed from PropScriptDamaged to AddEntityCallback_OnDamaged - should also register damage if there's an opposing enemy player - changed HarvesterStruct to HarvesterStruct& - fix looping harvester shield regenning noise - format some code (i cant stand it) --- .../vscripts/gamemodes/_gamemode_fd.nut | 377 +++++++++--------- 1 file changed, 188 insertions(+), 189 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index a89d5a300..95428281d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -49,7 +49,7 @@ global struct WaveEvent{ -global HarvesterStruct fd_harvester +global HarvesterStruct& fd_harvester global vector shopPosition global array > waveEvents global table > routes @@ -101,14 +101,13 @@ void function GamemodeFD_Init() AddCallback_EntitiesDidLoad(LoadEntities) - AddDamageCallback("prop_script",OnDamagedPropScript) AddCallback_GameStateEnter(eGameState.Prematch,FD_createHarvester) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) AddCallback_OnClientConnected(GamemodeFD_InitPlayer) AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) AddCallback_OnRoundEndCleanup(FD_NPCCleanup) AddDamageByCallback("player",FD_DamageByPlayerCallback) - + AddDeathCallback("npc_titan",OnNpcDeath) AddDeathCallback("npc_stalker",OnNpcDeath) @@ -148,7 +147,7 @@ void function GamemodeFD_InitPlayer(entity player) data.scoreThisRound = 0 file.players[player] <- data - + } void function OnNpcDeath( entity ent, var damageInfo ) @@ -158,7 +157,7 @@ void function OnNpcDeath( entity ent, var damageInfo ) { file.spawnedNPCs.remove( findIndex ) } - + } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} @@ -166,7 +165,7 @@ void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} bool function useShieldBoost(entity player,array args) { if((GetGlobalNetTime("FD_harvesterInvulTime")0)) - { + { fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester) @@ -177,20 +176,20 @@ bool function useShieldBoost(entity player,array args) } void function startMainGameLoop() -{ +{ thread mainGameLoop() } void function mainGameLoop() -{ +{ startHarvester() - + bool showShop = false for(int i = GetGlobalNetInt("FD_currentWave");i function getRoute(string routeName) -{ +{ array ret array currentNode = [] foreach(entity node in file.routeNodes) @@ -219,7 +218,7 @@ array function getRoute(string routeName) currentNode = [node] break } - + } if(currentNode.len()==0) { @@ -257,7 +256,7 @@ array function getEnemyTypesForWave(int wave) // npcs[eFD_AITypeIDs.ION]<-0 // npcs[eFD_AITypeIDs.MONARCH]<-0 // npcs[eFD_AITypeIDs.TITAN_SNIPER]<-0 - + foreach(WaveEvent e in waveEvents[wave]) { @@ -309,7 +308,7 @@ array function getEnemyTypesForWave(int wave) } bool function runWave(int waveIndex,bool shouldDoBuyTime) -{ +{ SetGlobalNetInt("FD_currentWave",waveIndex) file.havesterWasDamaged = false @@ -321,7 +320,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) { player.diedThisRound = false player.scoreThisRound = 0 - } + } array enemys = getEnemyTypesForWave(waveIndex) foreach(entity player in GetPlayerArray()) { @@ -329,21 +328,21 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } if(shouldDoBuyTime) { - + OpenBoostStores() foreach(entity player in GetPlayerArray()) Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyStoreOpen") while(Time() highestDamage = [0.0,0.0,0.0] array highestDamageSource = [-1,-1,-1] @@ -399,12 +398,12 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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 @@ -420,7 +419,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd) if(waveIndexTime()) + + if ( GetGlobalNetTime( "FD_harvesterInvulTime" ) > Time() ) { - prop.SetShieldHealth(prop.GetShieldHealthMax()) - return + harvester.SetShieldHealth( harvester.GetShieldHealthMax() ) + return } int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo ) entity attacker = DamageInfo_GetAttacker( damageInfo ) float damageAmount = DamageInfo_GetDamage( damageInfo ) - - if ( !damageSourceID ) - return - if ( !damageAmount ) - return + if ( !damageSourceID && !damageAmount && !attacker ) + return - if ( !attacker ) - return - //TODO Log damage source for round lose screen - fd_harvester.lastDamage = Time() - if(prop.GetShieldHealth()==0) - { - int attackerID = FD_GetAITypeID_ByString(attacker.GetTargetName()) - - file.harvesterDamageSource[attackerID] += damageAmount - - float newHealth = prop.GetHealth()-damageAmount - if(newHealth<0) - { - EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") - newHealth=0 - fd_harvester.rings.Destroy()//TODO death animation - } - - prop.SetHealth(newHealth) - file.havesterWasDamaged = true + if ( harvester.GetShieldHealth() == 0 ) + { + float newHealth = harvester.GetHealth() - damageAmount + if( newHealth <= 0 ) + { + EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") + newHealth = 0 + fd_harvester.rings.Destroy() + } + harvester.SetHealth( newHealth ) } - - + 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)) + 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") + + 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") - - + 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)){ + while ( IsAlive( harvester ) ) + { float currentTime = Time() float deltaTime = currentTime -lastTime - if(IsValid(fd_harvester.particleShield)) + + 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)) + + if( IsValid( fd_harvester.particleBeam ) ) { - vector beamColor = GetShieldTriLerpColor(1.0-(harvester.GetHealth().tofloat()/harvester.GetMaxHealth().tofloat())) + 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)) + + 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()= 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") - EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_resume") - float newShieldHealth = (harvester.GetShieldHealthMax()/GENERATOR_SHIELD_REGEN_TIME*deltaTime)+harvester.GetShieldHealth() - if(newShieldHealth>=harvester.GetShieldHealthMax()) + + if (!isRegening) + { + EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" ) + 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") - + isRegening = false } else { harvester.SetShieldHealth(newShieldHealth) } - } - if((lastShieldHealth>0)&&(harvester.GetShieldHealth()==0)) + } 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() @@ -632,36 +633,34 @@ void function HarvesterAlarm() void function initNetVars() { SetGlobalNetInt("FD_totalWaves",waveEvents.len()) - + if(!FD_HasRestarted()) { bool showShop = false SetGlobalNetInt("FD_currentWave",0) if(FD_IsDifficultyLevelOrHigher(eFDDifficultyLevel.INSANE)) FD_SetNumAllowedRestarts(0) - else + 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 //TODO NOT HOW SCORE WORKS - + } void function FD_createHarvester() { - HarvesterStruct ret = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) - fd_harvester.harvester = ret.harvester - fd_harvester.rings = ret.rings - fd_harvester.lastDamage = ret.lastDamage + fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) + AddEntityCallback_OnDamaged( fd_harvester.harvester, OnHarvesterDamaged ) } bool function isFinalWave() @@ -669,16 +668,16 @@ bool function isFinalWave() return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves")) } -void function LoadEntities() -{ - +void function LoadEntities() +{ + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) 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": @@ -705,7 +704,7 @@ void function LoadEntities() } void function titanNav_thread(entity titan, string routeName,float nextDistance = 500.0) -{ +{ titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) @@ -713,19 +712,19 @@ void function titanNav_thread(entity titan, string routeName,float nextDistance printt("Start NAV") if(!titan.IsNPC()) return - - + + array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) - { - + { + titan.Signal("OnFailedToPath") return } foreach(entity node in routeArray) - { + { if(!IsAlive(fd_harvester.harvester)) return if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin()) arg } int function getHintForTypeId(int typeId) -{ +{ //this is maybe a bit of an naive aproch switch(typeId) { @@ -801,13 +800,13 @@ int function getHintForTypeId(int typeId) } /****************************************************************************************************************\ -####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### -# # # # ## # # # # # ## # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # -##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### -# # # # # # # # # # # # # # # # # ####### # # # # # -# # # # # ## # # # # # ## # # # # # # # # # # -####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # +####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### +# # # # ## # # # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### +# # # # # # # # # # # # # # # # # ####### # # # # # +# # # # # ## # # # # # ## # # # # # # # # # # +####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # \*****************************************************************************************************************/ WaveEvent function createSmokeEvent(vector position,float lifetime) @@ -966,17 +965,17 @@ WaveEvent function createCloakDroneEvent(vector origin,vector angles){ } /************************************************************************************************************\ -####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### -# # # # ## # # # # # ## # # # # # # # ## # # # -# # # # # # # # # # # # # # # # # # # # # # # -##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### -# # # # # # # # # # # # # # # # # # # # # # # -# # # # # ## # # # # # ## # # # # # # # ## # # -####### # ####### # # # # ##### # # ##### # ### ####### # # ##### +####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### +# # # # ## # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # ## # # # # # ## # # # # # # # ## # # +####### # ####### # # # # ##### # # ##### # ### ####### # # ##### \************************************************************************************************************/ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ printt("smoke") SmokescreenStruct smokescreen smokescreen.smokescreenFX = $"P_smokescreen_FD" @@ -992,7 +991,7 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w } void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ +{ PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) entity npc = CreateArcTitan(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) file.spawnedNPCs.append(npc) @@ -1007,7 +1006,7 @@ void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent { float waitUntil = Time() + waitEvent.amount while(Time() ) SetTeam( pod, team ) InitFireteamDropPod( pod ) waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) array guys - - for ( int i = 0; i < 4; i++ ) + + for ( int i = 0; i < 4; i++ ) { entity guy = CreateSoldier( team, origin,<0,0,0> ) - + SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) DispatchSpawn( guy ) - + SetSquad( guy, squadName ) guys.append( guy ) } - + ActivateFireteamDropPod( pod, guys ) } void function CreateTrackedDroppodSpectreMortar( vector origin, int team) { - - + + entity pod = CreateDropPod( origin, <0,0,0> ) SetTeam( pod, team ) InitFireteamDropPod( pod ) waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) array guys - - for ( int i = 0; i < 4; i++ ) + + for ( int i = 0; i < 4; i++ ) { entity guy = CreateSpectre( team, origin,<0,0,0> ) - + SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) DispatchSpawn( guy ) - + SetSquad( guy, squadName ) guys.append( guy ) } - + ActivateFireteamDropPod( pod, guys ) } void function CreateTrackedDroppodStalker( vector origin, int team) { - - + + entity pod = CreateDropPod( origin, <0,0,0> ) SetTeam( pod, team ) InitFireteamDropPod( pod ) waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) array guys - - for ( int i = 0; i < 4; i++ ) + + for ( int i = 0; i < 4; i++ ) { entity guy = CreateStalker( team, origin,<0,0,0> ) - + SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) DispatchSpawn( guy ) - + SetSquad( guy, squadName ) guys.append( guy ) } - + ActivateFireteamDropPod( pod, guys ) } @@ -1214,10 +1213,10 @@ void function PingMinimap(float x, float y, float duration, float spreadRadius, } void function waitUntilLessThanAmountAlive(int amount) -{ +{ printt("start wait") int aliveTitans = file.spawnedNPCs.len() - + while(aliveTitans>amount) { WaitFrame() @@ -1229,10 +1228,10 @@ void function waitUntilLessThanAmountAlive(int amount) } void function waitUntilLessThanAmountAlive_expensive(int amount) -{ +{ printt("start wait") int aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() - + while(aliveTitans>amount) { WaitFrame() @@ -1241,4 +1240,4 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) break printt("titans alive ", aliveTitans) } -} \ No newline at end of file +} From 0c6ff1343083731618d48ff3f1f32e09f35243c3 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Wed, 11 May 2022 14:09:41 +0200 Subject: [PATCH 21/99] Indent fix Replaced spaces for indentation with tabs in the few places it was done --- .../vscripts/gamemodes/_gamemode_fd.nut | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 95428281d..fac1de814 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -481,15 +481,15 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) void function OnHarvesterDamaged(entity harvester, var damageInfo) { if ( !IsValid( harvester ) ) - return + return if( fd_harvester.harvester != harvester ) return if ( GetGlobalNetTime( "FD_harvesterInvulTime" ) > Time() ) { - harvester.SetShieldHealth( harvester.GetShieldHealthMax() ) - return + harvester.SetShieldHealth( harvester.GetShieldHealthMax() ) + return } int damageSourceID = DamageInfo_GetDamageSourceIdentifier( damageInfo ) @@ -497,27 +497,27 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) float damageAmount = DamageInfo_GetDamage( damageInfo ) if ( !damageSourceID && !damageAmount && !attacker ) - return + return fd_harvester.lastDamage = Time() if ( harvester.GetShieldHealth() == 0 ) { - float newHealth = harvester.GetHealth() - damageAmount - if( newHealth <= 0 ) - { - EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") - newHealth = 0 - fd_harvester.rings.Destroy() - } - harvester.SetHealth( newHealth ) + float newHealth = harvester.GetHealth() - damageAmount + if( newHealth <= 0 ) + { + EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") + newHealth = 0 + fd_harvester.rings.Destroy() + } + harvester.SetHealth( newHealth ) } 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 ) ) + 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() @@ -577,7 +577,7 @@ void function HarvesterThink() if (!isRegening) { - EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" ) + EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" ) isRegening = true } From 9d77289574cf8e410ec66264c1d7bd542fa5d6d7 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Wed, 11 May 2022 20:22:08 +0800 Subject: [PATCH 22/99] Update _gamemode_fd.nut (#353) - prevent final wave scoring by setting victory condition first - added CreateTickEvent, SpawnTick, CreateTrackedDroppodTick functions - fixed Arc Titans not spawning correctly - fixed Nuke Titans not moving --- .../vscripts/gamemodes/_gamemode_fd.nut | 76 ++++++++++++++++--- 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index fac1de814..58f497a64 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -14,6 +14,7 @@ global function createDroppodStalkerEvent global function createDroppodSpectreMortarEvent global function createWaitUntilAliveEvent global function createCloakDroneEvent +global function CreateTickEvent global struct SmokeEvent{ vector position @@ -415,6 +416,15 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) wait 2 //wave end + + if ( isFinalWave() && IsAlive( fd_harvester.harvester ) ) + { + //Game won code + SetRoundBased(false) + SetWinner(TEAM_MILITIA) + return true + } + SetGlobalNetBool("FD_waveActive",false) MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd) if(waveIndex ) + SetTeam( pod, team ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + + string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + array guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateFragDrone( team, origin, <0,0,0> ) + + SetSpawnOption_AISettings(guy, "npc_frag_drone_fd") + SetTeam( guy, team ) + guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE ) + guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + + if (route != "") + thread titanNav_thread(guy, route) // not working i think + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) +} + void function PingMinimap(float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex) { foreach(entity player in GetPlayerArray()) From dd4a613adb63b30b50a86c0e9a359cb9025351d1 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Thu, 12 May 2022 19:49:09 +0800 Subject: [PATCH 23/99] Frontier Defense stuff (#355) * Update _gamemode_fd.nut - stop including player-owned Auto-Titans in the final check - Add CreateToneSniperEvent and CreateNorthstarSniperTitanEvent - Sniper titans have their own AI pathing (See _ai_sniper_titans.nut) - Added Combat and Support Scoring - Added experimental human nav paths - Moved all AddDeathCallbacks for NPCs into AddCallback_OnNPCKilled - NPCs check logs doesn't spam the console - fixed overhead icon not showing * Update _ai_cloak_drone.gnut - changed to IsEMPTitan check - no idea why cloak is not working * Update _ai_emp_titans.gnut - Added IsEMPTitan check * Update _ai_sniper_titans.gnut - Experimental pathing, they work, they wont attack * Update mp_forwardbase_kodai_fd.nut - Wave 1 in Kodai is fully done ( i think, might need to add more smokes in between subwaves ) --- .../scripts/vscripts/ai/_ai_cloak_drone.gnut | 49 +++- .../scripts/vscripts/ai/_ai_emp_titans.gnut | 20 +- .../vscripts/ai/_ai_sniper_titans.gnut | 89 +++++- .../vscripts/gamemodes/_gamemode_fd.nut | 258 ++++++++++++++++-- .../mp/levels/mp_forwardbase_kodai_fd.nut | 78 +++++- 5 files changed, 450 insertions(+), 44 deletions(-) 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 e3addf812..33437ad71 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 ) ) @@ -334,7 +334,11 @@ void function CloakedDronePathFollowNPC( entity cloakedDrone, entity goalNPC ) function() : ( goalNPC ) { if ( IsAlive( goalNPC ) ) + { goalNPC.s.cloakedDrone = null + if(IsCloaked(goalNPC)) + goalNPC.Signal( "KillHandleCloakEnd" ) + } } ) @@ -382,6 +386,9 @@ void function CloakedDronePathFollowNPC( entity cloakedDrone, entity goalNPC ) float startTime = Time() path.goalValid = false + if(!IsCloaked(goalNPC)) + CloakNPC(goalNPC) + CloakedDroneFindPathDefault( path, defaultHeight, mins, maxs, cloakedDrone, goalNPC, mask ) //find a new path if necessary @@ -676,3 +683,43 @@ function IsSquadCenterClose( npc, dist = 256 ) return false } + +void function CloakNPC ( entity npc ) +{ + npc.SetCloakDuration( 1.0, -1, 1.0 ) + + EmitSoundOnEntity( npc, "cloak_on_3P" ) + EmitSoundOnEntity( npc, "cloak_sustain_loop_3P" ) + + thread HandleNPCCloakEnd( npc ) +} + +void function HandleNPCCloakEnd( entity npc ) +{ + npc.EndSignal( "OnDeath" ) + npc.Signal( "OnStartCloak" ) + npc.EndSignal( "OnStartCloak" ) + npc.EndSignal( "KillHandleCloakEnd" ) //Calling DisableCloak() after EnableCloak() doesn't kill this thread by design (to allow attacking through cloak etc), so this signal is for when you want to kill this thread + + OnThreadEnd( + function() : ( npc ) + { + if ( !IsValid( npc ) ) + return + + StopSoundOnEntity( npc, "cloak_sustain_loop_3P" ) + + if ( !IsCloaked( npc ) ) + return + + if ( !IsAlive( npc ) || !npc.IsHuman() ) + { + EmitSoundOnEntity( npc, "cloak_interruptend_3P" ) + npc.SetCloakDuration( 0, 0, 1.0 ) + return + } + } + ) + + WaitForever() +} 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 fd1bbff1d..8fde43439 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 empTitans +} file + function EmpTitans_Init() { AddDamageCallbackSourceID( eDamageSourceId.titanEmpField, EmpField_DamagedEntity ) @@ -28,10 +34,11 @@ void function EMPTitanThinkConstant( entity titan ) titan.EndSignal( "StopEMPField" ) //We don't want pilots accidently rodeoing an electrified titan. - // DisableTitanRodeo( 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_sniper_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut index 37b891699..f91699b43 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,88 @@ -//fuck \ No newline at end of file +untyped + +global function MoveToSniperPosition +global function SniperTitanThink + +const float SNIPER_TITAN_POSITION_SEARCH_RANGE = 2048 + +void function MoveToSniperPosition( entity titan, vector origin, entity target ) +{ + titan.EndSignal( "OnSyncedMeleeVictim" ) + titan.EndSignal( "OnDeath" ) + titan.EndSignal( "OnDestroy" ) + + titan.SetLookDistOverride( 320 ) + titan.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT ) + + float goalRadius = titan.GetMinGoalRadius() + + OnThreadEnd( + function() : ( titan ) + { + if ( !IsValid( titan ) ) + return + + local classname = titan.GetClassName() + titan.DisableLookDistOverride() + 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.SetEnemy( target ) + local result = WaitSignal( titan, "OnFinishedAssault", "OnEnterGoalRadius" ) + } +} + +void function SniperTitanThink( entity titan, entity generator ) +{ + titan.EndSignal( "OnSyncedMeleeVictim" ) + titan.EndSignal( "OnDeath" ) + titan.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 mortar position when dead + ReleaseStationaryAIPosition( sniperPosition ) + } + ) + + while( true ) + { + vector origin = sniperPosition.origin + titan.SetEnemy( generator ) + waitthread MoveToSniperPosition( titan, origin, generator ) + + WaitForever() + } +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 58f497a64..e50abd161 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -15,6 +15,8 @@ global function createDroppodSpectreMortarEvent global function createWaitUntilAliveEvent global function createCloakDroneEvent global function CreateTickEvent +global function CreateToneSniperTitanEvent +global function CreateNorthstarSniperTitanEvent global struct SmokeEvent{ vector position @@ -110,13 +112,7 @@ void function GamemodeFD_Init() AddDamageByCallback("player",FD_DamageByPlayerCallback) - AddDeathCallback("npc_titan",OnNpcDeath) - AddDeathCallback("npc_stalker",OnNpcDeath) - AddDeathCallback("npc_spectre",OnNpcDeath) - AddDeathCallback("npc_super_spectre",OnNpcDeath) - AddDeathCallback("npc_soldier",OnNpcDeath) - AddDeathCallback("npc_frag_drone",OnNpcDeath) - AddDeathCallback("npc_drone",OnNpcDeath) + AddCallback_OnNPCKilled(OnNpcDeath) SetUsedCoreCallback(FD_UsedCoreCallback) AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) @@ -151,14 +147,64 @@ void function GamemodeFD_InitPlayer(entity player) } -void function OnNpcDeath( entity ent, var damageInfo ) +void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { - int findIndex = file.spawnedNPCs.find( ent ) + int findIndex = file.spawnedNPCs.find( victim ) if ( findIndex != -1 ) { file.spawnedNPCs.remove( findIndex ) } + if ( victim.GetOwner() == attacker && !attacker.IsPlayer() && attacker == victim ) + return + + int playerScore = 0 + int money = 0 + 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": // not sure + 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 + } + } + if (money != 0) + { + AddMoneyToPlayer( attacker , money ) + print("give that fat stash babeeeee") + } + + attacker.AddToPlayerGameStat( PGS_ASSAULT_SCORE, playerScore ) // seems to be how combat score is counted + + table 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 _1, int _2, entity _3){} @@ -272,6 +318,7 @@ array function getEnemyTypesForWave(int wave) 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 @@ -460,6 +507,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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()) { @@ -473,6 +521,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) { 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") } } @@ -733,11 +782,12 @@ void function titanNav_thread(entity titan, string routeName,float nextDistance if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin())nextDistance)) { WaitFrame() - //printt(Distance(titan.GetOrigin(),node.GetOrigin())) + // printt(Distance(titan.GetOrigin(),node.GetOrigin())) // i++ // if(i>1200) // { @@ -749,6 +799,44 @@ void function titanNav_thread(entity titan, string routeName,float nextDistance titan.Signal("FD_ReachedHarvester") } +void function HumanNav_Thread( entity npc ) +{ + npc.EndSignal( "OnDeath" ) + npc.EndSignal( "OnDestroy" ) + + entity generator = fd_harvester.harvester + float goalRadius = 100 + float checkRadiusSqr = 400 * 400 + + array pos = NavMesh_GetNeighborPositions( generator.GetOrigin(), HULL_HUMAN, 5 ) + pos = ArrayClosestVector( pos, npc.GetOrigin() ) + + array validPos + foreach ( point in pos ) + { + if ( DistanceSqr( generator.GetOrigin(), point ) <= checkRadiusSqr && NavMesh_IsPosReachableForAI( npc, point ) ) + { + validPos.append( point ) + } + } + + int posLen = validPos.len() + while( posLen >= 1 ) + { + npc.SetEnemy( generator ) + thread AssaultOrigin( npc, validPos[0], goalRadius ) + npc.AssaultSetFightRadius( goalRadius ) + + wait 0.5 + + if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > checkRadiusSqr ) + continue + + break + } + npc.Signal("FD_ReachedHarvester") +} + bool function allPlayersReady() { foreach(entity player in GetPlayerArray()) @@ -802,6 +890,37 @@ int function getHintForTypeId(int typeId) 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 "npc_titan_arc" + case eFD_AITypeIDs.RONIN: + return "npc_titan_stryder_leadwall" + case eFD_AITypeIDs.TITAN_MORTAR: + return "npc_titanmortar" + case eFD_AITypeIDs.TONE: + return "npc_titan_atlas_tracker" + case eFD_AITypeIDs.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" + default: + return "titan" + } + unreachable +} + /****************************************************************************************************************\ ####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### # # # # ## # # # # # ## # # # # # # # # # # # @@ -979,6 +1098,30 @@ WaveEvent function CreateTickEvent( vector origin, vector angles, int amount = 4 return event } +WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles) +{ + WaveEvent event + event.eventFunction = spawnSniperTitan + event.shouldThread = true + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} + +WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles) +{ + WaveEvent event + event.eventFunction = SpawnToneSniperTitan + event.shouldThread = true + event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER + event.spawnEvent.spawnAmount = 1 + event.spawnEvent.origin = origin + event.spawnEvent.angles = angles + return event +} + /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### # # # # ## # # # # # ## # # # # # # # ## # # # @@ -1011,9 +1154,13 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven 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") file.spawnedNPCs.append(npc) DispatchSpawn(npc) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread titanNav_thread(npc,spawnEvent.route) thread EMPTitanThinkConstant(npc) } @@ -1048,7 +1195,7 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC) + thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC, spawnEvent.route) } void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -1074,8 +1221,14 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent { 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) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) file.spawnedNPCs.append(npc) } @@ -1085,9 +1238,13 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve 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) DispatchSpawn(npc) file.spawnedNPCs.append(npc) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread titanNav_thread(npc,spawnEvent.route) thread NukeTitanThink(npc,fd_harvester.harvester) @@ -1100,8 +1257,12 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE 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) file.spawnedNPCs.append(npc) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread MortarTitanThink(npc,fd_harvester.harvester) } @@ -1111,11 +1272,32 @@ void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE 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) file.spawnedNPCs.append(npc) - thread MortarTitanThink(npc,fd_harvester.harvester) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread SniperTitanThink(npc,fd_harvester.harvester) + +} + +void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + npc.Minimap_AlwaysShow( TEAM_IMC, null ) + npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread SniperTitanThink(npc,fd_harvester.harvester) } + void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, file.harvester_info.GetOrigin() ) @@ -1150,7 +1332,7 @@ void function spawnSuperSpectre_threaded(entity npc) thread ReaperMinionLauncherThink(npc) } -void function CreateTrackedDroppodSoldier( vector origin, int team) +void function CreateTrackedDroppodSoldier( vector origin, int team, string route = "") { @@ -1161,6 +1343,7 @@ void function CreateTrackedDroppodSoldier( vector origin, int team) string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) array guys + bool adychecked = false for ( int i = 0; i < 4; i++ ) { @@ -1168,9 +1351,17 @@ void function CreateTrackedDroppodSoldier( vector origin, int team) SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) DispatchSpawn( guy ) - SetSquad( guy, squadName ) + guy.SetParent( pod, "ATTACH", true ) + SetSquad( guy, squadName ) + + thread HumanNav_Thread(guy) + + guy.Minimap_AlwaysShow( TEAM_IMC, null ) + guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) + file.spawnedNPCs.append(guy) guys.append( guy ) } @@ -1247,13 +1438,13 @@ void function CreateTrackedDroppodTick( vector origin, int team, string route = SetSpawnOption_AISettings(guy, "npc_frag_drone_fd") SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE ) - guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) + guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS | NPCMF_PREFER_SPRINT) DispatchSpawn( guy ) - + guy.Minimap_AlwaysShow( TEAM_IMC, null ) + guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) SetSquad( guy, squadName ) - if (route != "") - thread titanNav_thread(guy, route) // not working i think + thread HumanNav_Thread(guy) // not working i think guys.append( guy ) } @@ -1272,28 +1463,47 @@ void function waitUntilLessThanAmountAlive(int amount) { printt("start wait") int aliveTitans = file.spawnedNPCs.len() - + float lasttime = Time() while(aliveTitans>amount) { WaitFrame() aliveTitans = file.spawnedNPCs.len() if(!IsAlive(fd_harvester.harvester)) break - printt("titans alive ", aliveTitans) + if (Time() > lasttime + 5) // stop log spam + { + printt("npcs alive ", aliveTitans) + lasttime = Time() + } } } void function waitUntilLessThanAmountAlive_expensive(int amount) { printt("start wait") - int aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() - + array npcs = GetEntArrayByClassWildCard_Expensive("*npc*") + int deduct = 0 + for ( int i = npcs.len() - 1; i >= 0; i-- ) + { + entity npc = npcs[i] + if (IsValid(GetPetTitanOwner( npc ))) + { + print("found player npc titan") + deduct++ + } + } + float lasttime = Time() + int aliveTitans = npcs.len() while(aliveTitans>amount) { WaitFrame() - aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() + aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() - deduct if(!IsAlive(fd_harvester.harvester)) break - printt("titans alive ", aliveTitans) + if (Time() > lasttime + 5) // stop log spam + { + printt("npcs alive ", aliveTitans) + lasttime = Time() + } } } 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 9fe180451..341cfc212 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 @@ -3,9 +3,7 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { - shopPosition = < -3862.13, 1267.69, 1060.06> - - + shopPosition = < -3862.13, 1267.69, 1060.06 > array wave0 array wave1 @@ -13,18 +11,68 @@ void function initFrontierDefenseData() array wave3 array wave4 - wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, < 0,0,0 >, "hillRouteClose")) - - //wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) - // wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) - // wave0.append(createWaitForTimeEvent(10)) - // wave0.append(createSuperSpectreEvent(< -64, 964, 1456>,<0,0,0>,"")) - - + //wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, <0,0,0 >, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) + + wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) + wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) + + wave0.append(createWaitForTimeEvent(7)) + wave0.append(createWaitUntilAliveEvent(1)) + + wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 2193, 434, 955>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 909, 3094, 968>, "hillRouteClose")) + + wave0.append(createWaitForTimeEvent(7)) + wave0.append(createWaitUntilAliveEvent(1)) + + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) + + wave0.append(createWaitForTimeEvent(7)) + wave0.append(createWaitUntilAliveEvent(1)) + + wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 2193, 434, 955>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 909, 3094, 968>, "hillRouteClose")) + + wave0.append(createWaitForTimeEvent(7)) + wave0.append(createWaitUntilAliveEvent(1)) + + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) + + wave0.append(createWaitForTimeEvent(7)) + wave0.append(createWaitUntilAliveEvent(1)) + + wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) + wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) + wave0.append(CreateToneSniperTitanEvent( < 1373, 1219, 1314>, <0,0,0>)) + // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 4, "hillRouteClose" )) + wave0.append(createWaitForTimeEvent(10)) + + // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 56, "hillRouteClose" )) //wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) - //.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave0.append(createWaitUntilAliveEvent(0)) - wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) + wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>, "hillRouteClose")) + wave1.append(createNukeTitanEvent( < -64, 964, 1456>,<0,0,0>, "hillRouteClose")) + wave1.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) wave1.append(createWaitUntilAliveEvent(0)) // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) @@ -32,7 +80,7 @@ void function initFrontierDefenseData() //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) waveEvents.append(wave0) - + //waveEvents.append(wave0) waveEvents.append(wave1) //waveEvents.append(wave2) @@ -62,4 +110,4 @@ void function initFrontierDefenseData() waveEvents.append(wave2) waveEvents.append(wave3) waveEvents.append(wave4) -}*/ \ No newline at end of file +}*/ From 11b7f3e52f69560f357575f57d282533198ab283 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 12 May 2022 14:44:23 +0200 Subject: [PATCH 24/99] give medals at game end --- .../vscripts/gamemodes/_gamemode_fd.nut | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 58f497a64..8985b4772 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -24,7 +24,8 @@ global struct SmokeEvent{ global struct SpawnEvent{ vector origin vector angles - string route + 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 @@ -420,6 +421,32 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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 + float highestScore = 0; + entity highestScore_player = GetPlayerArray()[0] + foreach(entity player in GetPlayerArray()) + { + player_struct_fd data = file.players[player] + if(!data.diedThisRound) + AddPlayerScore(player,"FDDidntDie") + if(highestScore Date: Thu, 12 May 2022 20:04:17 +0200 Subject: [PATCH 25/99] Made wait until events more readable also remove debugging prints --- .../vscripts/gamemodes/_gamemode_fd.nut | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 322973790..319837204 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1487,49 +1487,36 @@ void function PingMinimap(float x, float y, float duration, float spreadRadius, void function waitUntilLessThanAmountAlive(int amount) { - printt("start wait") + int aliveTitans = file.spawnedNPCs.len() - float lasttime = Time() while(aliveTitans>amount) { WaitFrame() aliveTitans = file.spawnedNPCs.len() if(!IsAlive(fd_harvester.harvester)) break - if (Time() > lasttime + 5) // stop log spam - { - printt("npcs alive ", aliveTitans) - lasttime = Time() - } } } void function waitUntilLessThanAmountAlive_expensive(int amount) { - printt("start wait") - array npcs = GetEntArrayByClassWildCard_Expensive("*npc*") + + array npcs = GetNPCArray() int deduct = 0 - for ( int i = npcs.len() - 1; i >= 0; i-- ) - { - entity npc = npcs[i] - if (IsValid(GetPetTitanOwner( npc ))) - { - print("found player npc titan") + for (entity npc in npcs) + if (IsValid(GetPetTitanOwner( npcs[i] ))) deduct++ - } - } - float lasttime = Time() - int aliveTitans = npcs.len() + int aliveTitans = npcs.len() - deduct while(aliveTitans>amount) { WaitFrame() - aliveTitans = GetEntArrayByClassWildCard_Expensive("*npc*").len() - deduct + npcs = GetNPCArray() + detuct = 0 + foreach(entity npc in npcs) + if (IsValid(GetPetTitanOwner( npcs[i] ))) + deduct++ + aliveTitans = GetNPCArray().len() - deduct if(!IsAlive(fd_harvester.harvester)) break - if (Time() > lasttime + 5) // stop log spam - { - printt("npcs alive ", aliveTitans) - lasttime = Time() - } } } From 1d456047c267a7d08a493b53b8e244a25189ae2f Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 13 May 2022 03:43:24 +0200 Subject: [PATCH 26/99] Fixed Nav --- .../vscripts/gamemodes/_gamemode_fd.nut | 109 ++++++++---------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 319837204..aff522403 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -782,86 +782,68 @@ void function LoadEntities() initNetVars() } -void function titanNav_thread(entity titan, string routeName,float nextDistance = 500.0) +void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,float nextDistance = 500.0) { - titan.EndSignal( "OnDeath" ) - titan.EndSignal( "OnDestroy" ) + npc.EndSignal( "OnDeath" ) + npc.EndSignal( "OnDestroy" ) - printt("Start NAV") - if(!titan.IsNPC()) + + if(!npc.IsNPC()) return - + array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) { - titan.Signal("OnFailedToPath") + npc.Signal("OnFailedToPath") return } - + int scippedNodes = 0 foreach(entity node in routeArray) { if(!IsAlive(fd_harvester.harvester)) return - if(Distance(fd_harvester.harvester.GetOrigin(),titan.GetOrigin())nextDistance)) + if(scippedNodes < nodesToScip) { - WaitFrame() - // printt(Distance(titan.GetOrigin(),node.GetOrigin())) - // i++ - // if(i>1200) - // { - // titan.Signal("OnFailedToPath") - // return - // } + scippedNodes++ + continue } + npc.AssaultPoint(node.GetOrigin()) + npc.AssaultSetGoalRadius( 100 ) + int i = 0 + table result = npc.WaitSignal("OnFinishedAssault","OnFailedToPath") + if(result.signal == "OnFailedToPath") + break } - titan.Signal("FD_ReachedHarvester") + npc.Signal("FD_ReachedHarvester") } -void function HumanNav_Thread( entity npc ) +void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) { - npc.EndSignal( "OnDeath" ) - npc.EndSignal( "OnDestroy" ) - - entity generator = fd_harvester.harvester - float goalRadius = 100 - float checkRadiusSqr = 400 * 400 - - array pos = NavMesh_GetNeighborPositions( generator.GetOrigin(), HULL_HUMAN, 5 ) - pos = ArrayClosestVector( pos, npc.GetOrigin() ) + //TODO this function wont stop when noone alive anymore + + array routeArray = getRoute(routeName) + WaitFrame()//so other code setting up what happens on signals is run before this + if(routeArray.len()==0) + return - array validPos - foreach ( point in pos ) + int scippedNodes = 0 + foreach(entity node in routeArray) { - if ( DistanceSqr( generator.GetOrigin(), point ) <= checkRadiusSqr && NavMesh_IsPosReachableForAI( npc, point ) ) + if(!IsAlive(fd_harvester.harvester)) + return + if(scippedNodes < nodesToScip) { - validPos.append( point ) + scippedNodes++ + continue } + SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) + } - int posLen = validPos.len() - while( posLen >= 1 ) - { - npc.SetEnemy( generator ) - thread AssaultOrigin( npc, validPos[0], goalRadius ) - npc.AssaultSetFightRadius( goalRadius ) - - wait 0.5 - - if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > checkRadiusSqr ) - continue - - break - } - npc.Signal("FD_ReachedHarvester") } bool function allPlayersReady() @@ -1188,7 +1170,7 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven npc.Minimap_AlwaysShow( TEAM_IMC, null ) npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread titanNav_thread(npc,spawnEvent.route) + thread singleNav_thread(npc,spawnEvent.route) thread EMPTitanThinkConstant(npc) } @@ -1274,7 +1256,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve npc.Minimap_AlwaysShow( TEAM_IMC, null ) npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread titanNav_thread(npc,spawnEvent.route) + thread singleNav_thread(npc,spawnEvent.route) thread NukeTitanThink(npc,fd_harvester.harvester) } @@ -1377,13 +1359,13 @@ void function CreateTrackedDroppodSoldier( vector origin, int team, string route SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) + DispatchSpawn( guy ) guy.SetParent( pod, "ATTACH", true ) SetSquad( guy, squadName ) - thread HumanNav_Thread(guy) + guy.Minimap_AlwaysShow( TEAM_IMC, null ) guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) @@ -1392,6 +1374,9 @@ void function CreateTrackedDroppodSoldier( vector origin, int team, string route } ActivateFireteamDropPod( pod, guys ) + + SquadNav_Thread(guys,route) + } void function CreateTrackedDroppodSpectreMortar( vector origin, int team) @@ -1470,11 +1455,13 @@ void function CreateTrackedDroppodTick( vector origin, int team, string route = guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) SetSquad( guy, squadName ) - thread HumanNav_Thread(guy) // not working i think + guys.append( guy ) } ActivateFireteamDropPod( pod, guys ) + + SquadNav_Thread(guys,route) } void function PingMinimap(float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex) @@ -1503,17 +1490,17 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) array npcs = GetNPCArray() int deduct = 0 - for (entity npc in npcs) - if (IsValid(GetPetTitanOwner( npcs[i] ))) + foreach (entity npc in npcs) + if (IsValid(GetPetTitanOwner( npc ))) deduct++ int aliveTitans = npcs.len() - deduct while(aliveTitans>amount) { WaitFrame() npcs = GetNPCArray() - detuct = 0 + deduct = 0 foreach(entity npc in npcs) - if (IsValid(GetPetTitanOwner( npcs[i] ))) + if (IsValid(GetPetTitanOwner( npc ))) deduct++ aliveTitans = GetNPCArray().len() - deduct if(!IsAlive(fd_harvester.harvester)) From 1b355246798b14bf992ca046c55d1344aaeaa521 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Fri, 13 May 2022 18:47:09 +0800 Subject: [PATCH 27/99] Another Frontier Defense update (#356) * Update _gamemode_fd.nut - a lot of dialogues ( one pilot died, multi pilot died, last pilot standing, shield getting damaged, shield recharging, shield low, health taking damage, health below 75/50/25, health gone, win dialogue, wave end recaps ) - fixed minimaps via functions below (including harvester) - added function AddMinimapToHumans, AddMinimapToTitans, AddTurretSentry - display overhead icon after titan done hotdropping - think i mostly got the waves countdown as similar as possible to vanilla behavior - prevent crash when using harvester shield boost - scoreboard now tracks the amount of enemy alive on the field * Update _gamemode_fd.nut - fixed some indents and removed NPCMoveFlag --- .../vscripts/gamemodes/_gamemode_fd.nut | 260 ++++++++++++++---- 1 file changed, 212 insertions(+), 48 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index aff522403..a2f95818b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -84,6 +84,8 @@ struct { array routeNodes array harvesterDamageSource bool havesterWasDamaged + bool harvesterShieldDown + float harvesterDamageTaken array spawnedNPCs table players entity harvester_info @@ -114,6 +116,7 @@ void function GamemodeFD_Init() AddCallback_OnNPCKilled(OnNpcDeath) + AddSpawnCallback("npc_turret_sentry", AddTurretSentry ) SetUsedCoreCallback(FD_UsedCoreCallback) AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) @@ -127,6 +130,24 @@ void function GamemodeFD_Init() void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo) { file.players[victim].diedThisRound = true + array 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) @@ -154,9 +175,21 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) if ( findIndex != -1 ) { file.spawnedNPCs.remove( findIndex ) + SetGlobalNetInt( "FD_AICount_Current", file.spawnedNPCs.len() ) + string name = victim.GetTargetName() + int aitype = FD_GetAITypeID_ByString(name) + try + { + if (GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) > -1) + SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype ), GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) - 1) // lower scoreboard number by 1 + } + catch (exception) + { + print (exception) + } } - if ( victim.GetOwner() == attacker && !attacker.IsPlayer() && attacker == victim ) + if ( victim.GetOwner() == attacker || !attacker.IsPlayer() || attacker == victim ) return int playerScore = 0 @@ -186,10 +219,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) } } if (money != 0) - { AddMoneyToPlayer( attacker , money ) - print("give that fat stash babeeeee") - } attacker.AddToPlayerGameStat( PGS_ASSAULT_SCORE, playerScore ) // seems to be how combat score is counted @@ -216,7 +246,7 @@ bool function useShieldBoost(entity player,array args) { fd_harvester.harvester.SetShieldHealth(fd_harvester.harvester.GetShieldHealthMax()) SetGlobalNetTime("FD_harvesterInvulTime",Time()+5) - MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester) + MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester, null, player) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) file.players[player].harvesterHeals += 1 } @@ -356,11 +386,13 @@ array function getEnemyTypesForWave(int wave) } + bool function runWave(int waveIndex,bool shouldDoBuyTime) { SetGlobalNetInt("FD_currentWave",waveIndex) file.havesterWasDamaged = false + file.harvesterShieldDown = false for(int i = 0; i<20;i++)//Number of npc type ids { file.harvesterDamageSource.append(0.0) @@ -417,6 +449,10 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } waitUntilLessThanAmountAlive_expensive(0) + + SetGlobalNetInt("FD_AICount_Total", file.spawnedNPCs.len()) + SetGlobalNetInt("FD_AICount_Current", file.spawnedNPCs.len()) + if(!IsAlive(fd_harvester.harvester)) { float totalDamage = 0.0 @@ -458,6 +494,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) else SetRoundBased(false) SetWinner(TEAM_IMC)//restart round + file.spawnedNPCs = [] // reset npcs count return false } @@ -465,6 +502,9 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) wait 2 //wave end + SetGlobalNetBool("FD_waveActive",false) + MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd) + if ( isFinalWave() && IsAlive( fd_harvester.harvester ) ) { //Game won code @@ -496,19 +536,43 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) AddPlayerScore(player,"FDTeamFlawlessWave") SetRoundBased(false) SetWinner(TEAM_MILITIA) + PlayFactionDialogueToTeam( "fd_matchVictory", TEAM_MILITIA ) return true } - SetGlobalNetBool("FD_waveActive",false) - MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd) - if(waveIndex 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.Destroy() } harvester.SetHealth( newHealth ) + file.havesterWasDamaged = true } if ( DamageInfo_GetDamageSourceIdentifier( damageInfo ) == eDamageSourceId.mp_titancore_laser_cannon ) @@ -655,10 +756,15 @@ void function HarvesterThink() EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_start") if (!isRegening) - { + { EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" ) - isRegening = true - } + 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() @@ -667,6 +773,8 @@ void function HarvesterThink() 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 @@ -739,6 +847,12 @@ void function FD_DamageByPlayerCallback(entity victim,var damageInfo) void function FD_createHarvester() { fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,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 ) } @@ -747,6 +861,11 @@ bool function isFinalWave() return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves")) } +bool function isSecondWave() +{ + return ((GetGlobalNetInt("FD_currentWave")+1)==1) +} + void function LoadEntities() { @@ -788,11 +907,11 @@ void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,f npc.EndSignal( "OnDestroy" ) - + if(!npc.IsNPC()) return - + array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) @@ -824,7 +943,7 @@ void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,f void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) { //TODO this function wont stop when noone alive anymore - + array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) @@ -841,7 +960,7 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS continue } SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) - + } } @@ -912,10 +1031,11 @@ string function GetTargetNameForID(int typeId) case eFD_AITypeIDs.RONIN: return "npc_titan_stryder_leadwall" case eFD_AITypeIDs.TITAN_MORTAR: - return "npc_titanmortar" + 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: @@ -924,6 +1044,22 @@ string function GetTargetNameForID(int typeId) 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 "cloakedDrone" default: return "titan" } @@ -1167,8 +1303,8 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven SetSpawnOption_AISettings(npc,"npc_titan_stryder_leadwall_arc") file.spawnedNPCs.append(npc) DispatchSpawn(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread singleNav_thread(npc,spawnEvent.route) thread EMPTitanThinkConstant(npc) @@ -1197,10 +1333,15 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait entity npc = CreateSuperSpectre(TEAM_IMC,spawnEvent.origin,spawnEvent.angles) SetSpawnOption_AISettings(npc,"npc_super_spectre_fd") file.spawnedNPCs.append(npc) + wait 4.7 DispatchSpawn(npc) + AddMinimapForHumans(npc) thread SuperSpectre_WarpFall(npc) thread ReaperMinionLauncherThink(npc) + + SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) + thread spawnSuperSpectre_threaded(npc) } void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -1237,10 +1378,10 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent SetSpawnOption_AISettings( npc, spawnEvent.aiSettings) SetSpawnOption_Titanfall(npc) DispatchSpawn(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) - npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) } void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -1253,8 +1394,8 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve npc.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS) DispatchSpawn(npc) file.spawnedNPCs.append(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread singleNav_thread(npc,spawnEvent.route) thread NukeTitanThink(npc,fd_harvester.harvester) @@ -1271,8 +1412,8 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn(npc) file.spawnedNPCs.append(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread MortarTitanThink(npc,fd_harvester.harvester) } @@ -1286,8 +1427,8 @@ void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn(npc) file.spawnedNPCs.append(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread SniperTitanThink(npc,fd_harvester.harvester) @@ -1302,8 +1443,8 @@ void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,W SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) file.spawnedNPCs.append(npc) - npc.Minimap_AlwaysShow( TEAM_IMC, null ) - npc.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) thread SniperTitanThink(npc,fd_harvester.harvester) @@ -1313,6 +1454,8 @@ void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,Wa { entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, file.harvester_info.GetOrigin() ) file.spawnedNPCs.append(npc) + SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) + AddMinimapForHumans(npc) } void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) @@ -1337,7 +1480,6 @@ void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent w void function spawnSuperSpectre_threaded(entity npc) { - } void function CreateTrackedDroppodSoldier( vector origin, int team, string route = "") @@ -1351,7 +1493,7 @@ void function CreateTrackedDroppodSoldier( vector origin, int team, string route string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) array guys - bool adychecked = false + bool adychecked = false for ( int i = 0; i < 4; i++ ) { @@ -1359,24 +1501,18 @@ void function CreateTrackedDroppodSoldier( vector origin, int team, string route SetTeam( guy, team ) guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - DispatchSpawn( guy ) guy.SetParent( pod, "ATTACH", true ) SetSquad( guy, squadName ) - - - guy.Minimap_AlwaysShow( TEAM_IMC, null ) - guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) + AddMinimapForHumans(guy) file.spawnedNPCs.append(guy) guys.append( guy ) } ActivateFireteamDropPod( pod, guys ) - - SquadNav_Thread(guys,route) - } void function CreateTrackedDroppodSpectreMortar( vector origin, int team) @@ -1400,6 +1536,8 @@ void function CreateTrackedDroppodSpectreMortar( vector origin, int team) DispatchSpawn( guy ) SetSquad( guy, squadName ) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.SPECTRE_MORTAR)) + AddMinimapForHumans(guy) guys.append( guy ) } @@ -1426,6 +1564,8 @@ void function CreateTrackedDroppodStalker( vector origin, int team) DispatchSpawn( guy ) SetSquad( guy, squadName ) + AddMinimapForHumans(guy) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) guys.append( guy ) } @@ -1451,17 +1591,14 @@ void function CreateTrackedDroppodTick( vector origin, int team, string route = guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE ) guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS | NPCMF_PREFER_SPRINT) DispatchSpawn( guy ) - guy.Minimap_AlwaysShow( TEAM_IMC, null ) - guy.Minimap_AlwaysShow( TEAM_MILITIA, null ) + AddMinimapForHumans(guy) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.TICK)) SetSquad( guy, squadName ) - guys.append( guy ) } ActivateFireteamDropPod( pod, guys ) - - SquadNav_Thread(guys,route) } void function PingMinimap(float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex) @@ -1507,3 +1644,30 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) break } } + +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 ) +} + +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 ) +} From b20b1cc199ae58af2033e5d40d43e2cea96e2ebf Mon Sep 17 00:00:00 2001 From: x3Karma Date: Sat, 14 May 2022 01:43:53 +0800 Subject: [PATCH 28/99] Add Health and Damage Scaling to FD (#359) - also add dialogue if last player is not ready --- .../vscripts/gamemodes/_gamemode_fd.nut | 169 +++++++++++++++++- 1 file changed, 163 insertions(+), 6 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index a2f95818b..5e5692e0b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -114,6 +114,12 @@ void function GamemodeFD_Init() AddCallback_OnRoundEndCleanup(FD_NPCCleanup) AddDamageByCallback("player",FD_DamageByPlayerCallback) + AddDamageCallback( "player", DamageScaleByDifficulty ) + AddDamageCallback( "npc_titan", DamageScaleByDifficulty ) + AddDamageCallback( "npc_turret_sentry", DamageScaleByDifficulty ) + AddSpawnCallback( "npc_titan", HealthScaleByDifficulty ) + AddSpawnCallback( "npc_super_spectre", HealthScaleByDifficulty ) + AddCallback_OnNPCKilled(OnNpcDeath) AddSpawnCallback("npc_turret_sentry", AddTurretSentry ) @@ -178,11 +184,11 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) SetGlobalNetInt( "FD_AICount_Current", file.spawnedNPCs.len() ) string name = victim.GetTargetName() int aitype = FD_GetAITypeID_ByString(name) - try + try { if (GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) > -1) SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype ), GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) - 1) // lower scoreboard number by 1 - } + } catch (exception) { print (exception) @@ -450,9 +456,6 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } waitUntilLessThanAmountAlive_expensive(0) - SetGlobalNetInt("FD_AICount_Total", file.spawnedNPCs.len()) - SetGlobalNetInt("FD_AICount_Current", file.spawnedNPCs.len()) - if(!IsAlive(fd_harvester.harvester)) { float totalDamage = 0.0 @@ -651,6 +654,35 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) return fd_harvester.lastDamage = Time() + + int difficultyLevel = FD_GetDifficultyLevel() + switch ( difficultyLevel ) + { + case eFDDifficultyLevel.EASY: + case eFDDifficultyLevel.NORMAL: // easy and normal have no damage scaling + break + + case eFDDifficultyLevel.HARD: + { + DamageInfo_SetDamage( damageInfo, (damageAmount * 1.5) ) + damageAmount = (damageAmount * 1.5) // for use in health calculations below + break + } + + case eFDDifficultyLevel.MASTER: + case eFDDifficultyLevel.INSANE: + { + DamageInfo_SetDamage( damageInfo, (damageAmount * 2.5) ) + damageAmount = (damageAmount * 2.5) // for use in health calculations below + break + } + + default: + unreachable + + } + + float shieldPercent = ( (harvester.GetShieldHealth().tofloat() / harvester.GetShieldHealthMax()) * 100 ) if ( shieldPercent < 100 && !file.harvesterShieldDown) PlayFactionDialogueToTeam( "fd_baseShieldTakingDmg", TEAM_MILITIA ) @@ -844,9 +876,117 @@ void function FD_DamageByPlayerCallback(entity victim,var damageInfo) } +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 + + int difficultyLevel = FD_GetDifficultyLevel() + switch ( difficultyLevel ) + { + case eFDDifficultyLevel.EASY: + case eFDDifficultyLevel.NORMAL: // easy and normal have no damage scaling + break + + case eFDDifficultyLevel.HARD: + DamageInfo_SetDamage( damageInfo, (damageAmount * 1.5) ) + break + + case eFDDifficultyLevel.MASTER: + case eFDDifficultyLevel.INSANE: + DamageInfo_SetDamage( damageInfo, (damageAmount * 2.5) ) + break + + default: + unreachable + + } + +} + +void function HealthScaleByDifficulty( entity ent ) +{ + + if ( ent.GetTeam() != TEAM_IMC ) + return + + if ( ent.IsTitan() ) + if ( IsValid(GetPetTitanOwner( ent ) ) ) // in case we ever want pvp in FD + return + + int difficultyLevel = FD_GetDifficultyLevel() + switch ( difficultyLevel ) + { + case eFDDifficultyLevel.EASY: + if ( ent.IsTitan() ) + ent.SetMaxHealth( ent.GetMaxHealth() - 5000 ) + else + ent.SetMaxHealth( ent.GetMaxHealth() - 2000 ) + case eFDDifficultyLevel.NORMAL: + if ( ent.IsTitan() ) + ent.SetMaxHealth( ent.GetMaxHealth() - 2500 ) + else + ent.SetMaxHealth( ent.GetMaxHealth() - 1000 ) + break + + case eFDDifficultyLevel.HARD: // no changes in Hard Mode + break + + case eFDDifficultyLevel.MASTER: + case eFDDifficultyLevel.INSANE: + if ( ent.IsTitan() ) + { + ent.SetShieldHealthMax( 2500 ) // apparently they have 0, costs me some time debugging this ffs + ent.SetShieldHealth( 2500 ) + } + break + + default: + unreachable + + } + +} + void function FD_createHarvester() { - fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,6000,TEAM_MILITIA) + int shieldamount = 6000 + int difficultyLevel = FD_GetDifficultyLevel() + switch ( difficultyLevel ) + { + case eFDDifficultyLevel.EASY: + case eFDDifficultyLevel.NORMAL: // easy and normal have no shield changes + break + + case eFDDifficultyLevel.HARD: + shieldamount = 5000 + break + + case eFDDifficultyLevel.MASTER: + case eFDDifficultyLevel.INSANE: + shieldamount = 4000 + break + + default: + unreachable + + } + + fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,shieldamount,TEAM_MILITIA) fd_harvester.harvester.Minimap_SetAlignUpright( true ) fd_harvester.harvester.Minimap_AlwaysShow( TEAM_IMC, null ) fd_harvester.harvester.Minimap_AlwaysShow( TEAM_MILITIA, null ) @@ -975,12 +1115,29 @@ bool function allPlayersReady() 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 args ) { if(args[0]=="true") player.SetPlayerNetBool("FD_readyForNextWave",true) if(args[0]=="false") player.SetPlayerNetBool("FD_readyForNextWave",false) + + CheckLastPlayerReady() return true } From d525fbbdbd5391d1f87257bcb44bc3ab8b892ec5 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 14 May 2022 23:12:23 +0200 Subject: [PATCH 29/99] Fixed some ui stuff and moved droppod into one function again --- .../vscripts/gamemodes/_gamemode_fd.nut | 370 ++++++++++-------- .../mp/levels/mp_forwardbase_kodai_fd.nut | 8 +- 2 files changed, 217 insertions(+), 161 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 5e5692e0b..75d89a2d5 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -181,23 +181,29 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) if ( findIndex != -1 ) { file.spawnedNPCs.remove( findIndex ) - SetGlobalNetInt( "FD_AICount_Current", file.spawnedNPCs.len() ) - string name = victim.GetTargetName() - int aitype = FD_GetAITypeID_ByString(name) - try + switch(FD_GetAITypeID_ByString(victim.GetTargetName())) //FD_GetAINetIndex_byAITypeID does not support all titan ids { - if (GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) > -1) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype ), GetGlobalNetInt(FD_GetAINetIndex_byAITypeID( aitype )) - 1) // lower scoreboard number by 1 - } - catch (exception) - { - print (exception) - } + 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): + SetGlobalNetInt("FD_AICount_Titan",GetGlobalNetInt("FD_AICount_Titan")-1) + break + default: + string netIndex = FD_GetAINetIndex_byAITypeID(FD_GetAITypeID_ByString(victim.GetTargetName())) + if(netIndex != "") + SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) + } } if ( victim.GetOwner() == attacker || !attacker.IsPlayer() || attacker == victim ) return - + int playerScore = 0 int money = 0 if ( victim.IsNPC() ) @@ -242,6 +248,8 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) attackerInfo.attacker.AddToPlayerGameStat( PGS_DEFENSE_SCORE, playerScore ) // i assume this is how support score gets added } } + + } void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} @@ -317,7 +325,7 @@ array function getRoute(string routeName) return ret } -array function getEnemyTypesForWave(int wave) +array function getHighestEnemyAmountsForWave(int waveIndex) { table npcs npcs[eFD_AITypeIDs.TITAN]<-0 @@ -342,7 +350,7 @@ array function getEnemyTypesForWave(int wave) // npcs[eFD_AITypeIDs.TITAN_SNIPER]<-0 - foreach(WaveEvent e in waveEvents[wave]) + foreach(WaveEvent e in waveEvents[waveIndex]) { if(e.spawnEvent.spawnAmount==0) continue @@ -364,9 +372,8 @@ array function getEnemyTypesForWave(int wave) } } array ret = [-1,-1,-1,-1,-1,-1,-1,-1,-1] - foreach(int key,int value in npcs){ - printt("Key",key,"has value",value) - SetGlobalNetInt(FD_GetAINetIndex_byAITypeID(key),value) + foreach(int key,int value in npcs) + { if(value==0) continue int lowestArrayIndex = 0 @@ -391,6 +398,72 @@ array function getEnemyTypesForWave(int wave) return ret } +void function SetEnemyAmountNetVars(int waveIndex) +{ + int total = 0 + table 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) @@ -399,6 +472,7 @@ 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) @@ -408,14 +482,15 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) player.diedThisRound = false player.scoreThisRound = 0 } - array enemys = getEnemyTypesForWave(waveIndex) + array 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") @@ -429,10 +504,10 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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") @@ -440,12 +515,13 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } SetGlobalNetBool("FD_waveActive",true) MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveStart) - - + SetGlobalNetInt("FD_waveState",WAVE_STATE_BREAK) + //main wave loop - + thread SetWaveStateReady() foreach(WaveEvent event in waveEvents[waveIndex]) { + if(event.shouldThread) thread event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) else @@ -455,7 +531,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } waitUntilLessThanAmountAlive_expensive(0) - + SetGlobalNetInt("FD_waveState",WAVE_STATE_COMPLETE) if(!IsAlive(fd_harvester.harvester)) { float totalDamage = 0.0 @@ -632,6 +708,12 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) } +void function SetWaveStateReady(){ + wait 5 + SetGlobalNetInt("FD_waveState",WAVE_STATE_IN_PROGRESS) +} + + void function OnHarvesterDamaged(entity harvester, var damageInfo) { if ( !IsValid( harvester ) ) @@ -795,7 +877,7 @@ void function HarvesterThink() PlayFactionDialogueToTeam( "fd_baseShieldRecharging", TEAM_MILITIA ) else PlayFactionDialogueToTeam( "fd_baseShieldRechargingShort", TEAM_MILITIA ) - isRegening = true + isRegening = true } float newShieldHealth = ( harvester.GetShieldHealthMax() / GENERATOR_SHIELD_REGEN_TIME * deltaTime ) + harvester.GetShieldHealth() @@ -1082,23 +1164,21 @@ void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,f void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) { - //TODO this function wont stop when noone alive anymore + //TODO this function wont stop when noone alive anymore also it only works half of the time array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) return - int scippedNodes = 0 + int nodeIndex = 0 foreach(entity node in routeArray) { if(!IsAlive(fd_harvester.harvester)) return - if(scippedNodes < nodesToScip) - { - scippedNodes++ + if(nodeIndex++ < nodesToScip) continue - } + SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) } @@ -1498,25 +1578,98 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait thread ReaperMinionLauncherThink(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) - thread spawnSuperSpectre_threaded(npc) + } void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - thread CreateTrackedDroppodSoldier(spawnEvent.origin,TEAM_IMC, spawnEvent.route) + 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 guys + bool adychecked = false + + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + { + entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + 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 ) + + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) + AddMinimapForHumans(guy) + file.spawnedNPCs.append(guy) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) + SquadNav_Thread(guys,spawnEvent.route) } void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - thread CreateTrackedDroppodStalker(spawnEvent.origin,TEAM_IMC) + 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 guys + + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + { + entity guy = CreateStalker( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + SetTeam( guy, TEAM_IMC ) + guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + guy.DisableNPCFlag( NPC_ALLOW_PATROL) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + AddMinimapForHumans(guy) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) + SquadNav_Thread(guys,spawnEvent.route) } void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - thread CreateTrackedDroppodSpectreMortar(spawnEvent.origin,TEAM_IMC) + 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 guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + 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,WaitEvent waitEvent,SoundEvent soundEvent) @@ -1618,134 +1771,21 @@ void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,Wa void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - for (int i = 0; i < floor(spawnEvent.spawnAmount / 4); i++) - { - thread CreateTrackedDroppodTick(spawnEvent.origin, TEAM_IMC, spawnEvent.route) - wait 0.5 - } -} - -/****************************************************************************************\ -####### # # ####### # # ####### # # ####### # ###### ####### ###### -# # # # ## # # # # # # # # # # # -# # # # # # # # # # # # # # # # # -##### # # ##### # # # # ####### ##### # ###### ##### ###### -# # # # # # # # # # # # # # # # -# # # # # ## # # # # # # # # # -####### # ####### # # # # # ####### ####### # ####### # # -\****************************************************************************************/ -void function spawnSuperSpectre_threaded(entity npc) -{ - -} - -void function CreateTrackedDroppodSoldier( vector origin, int team, string route = "") -{ - - - entity pod = CreateDropPod( origin, <0,0,0> ) - SetTeam( pod, team ) - InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - - string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) - array guys - bool adychecked = false - - for ( int i = 0; i < 4; i++ ) - { - entity guy = CreateSoldier( team, origin,<0,0,0> ) - - SetTeam( guy, team ) - guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - DispatchSpawn( guy ) - - guy.SetParent( pod, "ATTACH", true ) - SetSquad( guy, squadName ) - - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) - AddMinimapForHumans(guy) - file.spawnedNPCs.append(guy) - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) -} - -void function CreateTrackedDroppodSpectreMortar( vector origin, int team) -{ - - - entity pod = CreateDropPod( origin, <0,0,0> ) - SetTeam( pod, team ) - InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - - string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) - array guys - - for ( int i = 0; i < 4; i++ ) - { - entity guy = CreateSpectre( team, origin,<0,0,0> ) - - SetTeam( guy, team ) - guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - DispatchSpawn( guy ) - - SetSquad( guy, squadName ) - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.SPECTRE_MORTAR)) - AddMinimapForHumans(guy) - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) -} -void function CreateTrackedDroppodStalker( vector origin, int team) -{ - - - entity pod = CreateDropPod( origin, <0,0,0> ) - SetTeam( pod, team ) - InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) - - string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) - array guys - - for ( int i = 0; i < 4; i++ ) - { - entity guy = CreateStalker( team, origin,<0,0,0> ) - - SetTeam( guy, team ) - guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - DispatchSpawn( guy ) - - SetSquad( guy, squadName ) - AddMinimapForHumans(guy) - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) -} - -void function CreateTrackedDroppodTick( vector origin, int team, string route = "" ) -{ - entity pod = CreateDropPod( origin, <0,0,0> ) - SetTeam( pod, team ) + entity pod = CreateDropPod( spawnEvent.origin, <0,0,0> ) + SetTeam( pod, TEAM_IMC ) InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", origin, <0,0,0> ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> ) - string squadName = MakeSquadName( team, UniqueString( "ZiplineTable" ) ) + string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array guys - for ( int i = 0; i < 4; i++ ) + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { - entity guy = CreateFragDrone( team, origin, <0,0,0> ) + entity guy = CreateFragDrone( TEAM_IMC, spawnEvent.origin, <0,0,0> ) SetSpawnOption_AISettings(guy, "npc_frag_drone_fd") - SetTeam( guy, team ) - guy.EnableNPCFlag( NPC_ALLOW_PATROL | NPC_ALLOW_INVESTIGATE ) + SetTeam( guy, TEAM_IMC ) + guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE ) guy.EnableNPCMoveFlag(NPCMF_WALK_ALWAYS | NPCMF_PREFER_SPRINT) DispatchSpawn( guy ) AddMinimapForHumans(guy) @@ -1756,8 +1796,24 @@ void function CreateTrackedDroppodTick( vector origin, int team, string route = } ActivateFireteamDropPod( pod, guys ) + 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()) 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 341cfc212..19f7c0e67 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 @@ -27,8 +27,8 @@ void function initFrontierDefenseData() wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 2193, 434, 955>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 909, 3094, 968>, "hillRouteClose")) + wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose")) + wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose")) wave0.append(createWaitForTimeEvent(7)) wave0.append(createWaitUntilAliveEvent(1)) @@ -45,8 +45,8 @@ void function initFrontierDefenseData() wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 2193, 434, 955>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 909, 3094, 968>, "hillRouteClose")) + wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose")) + wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose")) wave0.append(createWaitForTimeEvent(7)) wave0.append(createWaitUntilAliveEvent(1)) From 217f476f7aeeb0bb4a18a534075a979d8e95115b Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 16 May 2022 04:41:33 +0200 Subject: [PATCH 30/99] track gamestats for endgame medals --- .../vscripts/gamemodes/_gamemode_fd.nut | 88 ++++++++++++------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 75d89a2d5..7ace05916 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -51,32 +51,32 @@ global struct WaveEvent{ SoundEvent soundEvent } - - -global HarvesterStruct& fd_harvester -global vector shopPosition -global array > waveEvents -global table > routes - - struct player_struct_fd{ bool diedThisRound float scoreThisRound int totalMVPs - int mortarUnitsKilled + int mortarUnitsKilled //not implemented yet int moneySpend int coresUsed - float longestTitanLife - int turretsRepaired + float longestTitanLife //not implemented yet + int turretsRepaired //not implemented yet int moneyShared - float timeNearHarvester - float longestLife - int heals - int titanKills + float timeNearHarvester //dont know how to track + float longestLife //not implemented yet + int heals //dont know what to track + int titanKills //not implemented yet float damageDealt int harvesterHeals } +global HarvesterStruct& fd_harvester +global vector shopPosition +global array > waveEvents +global table > routes + + + + struct { array aiSpawnpoints @@ -128,11 +128,29 @@ void function GamemodeFD_Init() AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) + //shop Callback + SetBoostPurchaseCallback(FD_BoostPurchaseCallback) + SetTeamReserveInteractCallback(FD_TeamReserveDepositOrWithdrawCallback) +} - +void function FD_BoostPurchaseCallback(entity player,BoostStoreData data) +{ + file.players[player].moneySpend += data.cost } +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].diedThisRound = true @@ -166,10 +184,9 @@ void function FD_UsedCoreCallback(entity titan,entity weapon) } void function GamemodeFD_InitPlayer(entity player) -{ +{ player_struct_fd data data.diedThisRound = false - data.scoreThisRound = 0 file.players[player] <- data @@ -198,7 +215,8 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) string netIndex = FD_GetAINetIndex_byAITypeID(FD_GetAITypeID_ByString(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 ) @@ -477,10 +495,10 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) { file.harvesterDamageSource.append(0.0) } - foreach(player_struct_fd player in file.players) + foreach(entity player in GetPlayerArray()) { - player.diedThisRound = false - player.scoreThisRound = 0 + file.players[player].diedThisRound = false + file.players[player].scoreThisRound = 0 } array enemys = getHighestEnemyAmountsForWave(waveIndex) @@ -597,12 +615,12 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) entity highestScore_player = GetPlayerArray()[0] foreach(entity player in GetPlayerArray()) { - player_struct_fd data = file.players[player] - if(!data.diedThisRound) + + if(!file.players[player].diedThisRound) AddPlayerScore(player,"FDDidntDie") - if(highestScore Date: Mon, 30 May 2022 05:01:33 +0200 Subject: [PATCH 31/99] Split FD into multiple files -added dummy wave creation function for all "vanilla" FD maps -reworked event handling to support multiple event threads -tracking more variables for end medals -added debugging function to stationary firing positions --- .../vscripts/ai/_ai_mortar_titans.gnut | 8 +- .../ai/_ai_stationary_firing_positions.gnut | 38 +- .../vscripts/gamemodes/_gamemode_fd.nut | 845 +++--------------- .../gamemodes/_gamemode_fd_events.nut | 736 +++++++++++++++ .../vscripts/gamemodes/_gamemode_fd_nav.nut | 97 ++ .../vscripts/mp/levels/mp_angel_city.nut | 6 + .../vscripts/mp/levels/mp_angel_city_fd.nut | 24 +- .../mp/levels/mp_black_water_canal.nut | 5 + .../mp/levels/mp_black_water_canal_fd.nut | 24 +- .../vscripts/mp/levels/mp_colony02.nut | 6 + .../vscripts/mp/levels/mp_colony02_fd.nut | 24 +- .../scripts/vscripts/mp/levels/mp_drydock.nut | 7 +- .../vscripts/mp/levels/mp_drydock_fd.nut | 24 +- .../mp/levels/mp_forwardbase_kodai_fd.nut | 119 +-- .../scripts/vscripts/mp/levels/mp_glitch.nut | 7 +- .../vscripts/mp/levels/mp_glitch_fd.nut | 24 +- .../scripts/vscripts/mp/levels/mp_grave.nut | 5 + .../vscripts/mp/levels/mp_grave_fd.nut | 24 +- .../vscripts/mp/levels/mp_homestead.nut | 7 +- .../vscripts/mp/levels/mp_homestead_fd.nut | 24 +- .../scripts/vscripts/mp/levels/mp_relic02.nut | 7 +- .../vscripts/mp/levels/mp_relic02_fd.nut | 24 +- .../scripts/vscripts/mp/levels/mp_thaw.nut | 7 +- .../scripts/vscripts/mp/levels/mp_thaw_fd.nut | 24 +- .../vscripts/mp/levels/mp_wargames.nut | 5 + .../vscripts/mp/levels/mp_wargames_fd.nut | 24 +- 26 files changed, 1327 insertions(+), 818 deletions(-) create mode 100644 Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut create mode 100644 Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut 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 08598808a..fe46aac5d 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_stationary_firing_positions.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stationary_firing_positions.gnut index 50b6cc759..2e7c938e4 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< > waveEvents global table > routes - +global array routeNodes +global array spawnedNPCs @@ -81,12 +36,10 @@ global table > routes struct { array aiSpawnpoints array smokePoints - array routeNodes array harvesterDamageSource bool havesterWasDamaged bool harvesterShieldDown float harvesterDamageTaken - array spawnedNPCs table players entity harvester_info }file @@ -105,26 +58,28 @@ void function GamemodeFD_Init() PlayerEarnMeter_SetEnabled(false) SetShouldUsePickLoadoutScreen( true ) - + //general Callbacks AddCallback_EntitiesDidLoad(LoadEntities) AddCallback_GameStateEnter(eGameState.Prematch,FD_createHarvester) AddCallback_GameStateEnter( eGameState.Playing,startMainGameLoop) - AddCallback_OnClientConnected(GamemodeFD_InitPlayer) - AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) AddCallback_OnRoundEndCleanup(FD_NPCCleanup) - AddDamageByCallback("player",FD_DamageByPlayerCallback) + AddCallback_OnClientConnected(GamemodeFD_InitPlayer) + //Damage Callbacks + AddDamageByCallback("player",FD_DamageByPlayerCallback) AddDamageCallback( "player", DamageScaleByDifficulty ) AddDamageCallback( "npc_titan", DamageScaleByDifficulty ) AddDamageCallback( "npc_turret_sentry", DamageScaleByDifficulty ) + //Spawn Callbacks AddSpawnCallback( "npc_titan", HealthScaleByDifficulty ) AddSpawnCallback( "npc_super_spectre", HealthScaleByDifficulty ) - - - AddCallback_OnNPCKilled(OnNpcDeath) + AddSpawnCallback( "player", FD_PlayerRespawnCallback ) AddSpawnCallback("npc_turret_sentry", AddTurretSentry ) - SetUsedCoreCallback(FD_UsedCoreCallback) - + //death Callbacks + AddCallback_OnNPCKilled(OnNpcDeath) + AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + + //Command Callbacks AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) @@ -138,6 +93,11 @@ 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() +} void function FD_TeamReserveDepositOrWithdrawCallback(entity player, string action,int amount) { @@ -153,6 +113,7 @@ void function FD_TeamReserveDepositOrWithdrawCallback(entity player, string acti } 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 militiaplayers = GetPlayerArrayOfTeam( TEAM_MILITIA ) int deaths = 0 @@ -193,12 +154,18 @@ void function GamemodeFD_InitPlayer(entity player) } void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) -{ - int findIndex = file.spawnedNPCs.find( victim ) +{ + 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 ) { - file.spawnedNPCs.remove( findIndex ) - switch(FD_GetAITypeID_ByString(victim.GetTargetName())) //FD_GetAINetIndex_byAITypeID does not support all titan ids + spawnedNPCs.remove( findIndex ) + switch(victimTypeID) //FD_GetAINetIndex_byAITypeID does not support all titan ids { case(eFD_AITypeIDs.TITAN): case(eFD_AITypeIDs.RONIN): @@ -212,7 +179,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) SetGlobalNetInt("FD_AICount_Titan",GetGlobalNetInt("FD_AICount_Titan")-1) break default: - string netIndex = FD_GetAINetIndex_byAITypeID(FD_GetAITypeID_ByString(victim.GetTargetName())) + string netIndex = GetAiNetIdFromTargetName(victim.GetTargetName()) if(netIndex != "") SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) } @@ -252,7 +219,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) AddMoneyToPlayer( attacker , money ) attacker.AddToPlayerGameStat( PGS_ASSAULT_SCORE, playerScore ) // seems to be how combat score is counted - + file.players[attacker].scoreThisRound += playerScore table alreadyAssisted foreach( DamageHistoryStruct attackerInfo in victim.e.recentDamageHistory ) { @@ -315,33 +282,7 @@ void function mainGameLoop() } -array function getRoute(string routeName) -{ - array ret - array currentNode = [] - foreach(entity node in file.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 -} array function getHighestEnemyAmountsForWave(int waveIndex) { @@ -537,18 +478,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) //main wave loop thread SetWaveStateReady() - foreach(WaveEvent event in waveEvents[waveIndex]) - { - - if(event.shouldThread) - thread event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) - else - event.eventFunction(event.smokeEvent,event.spawnEvent,event.waitEvent,event.soundEvent) - if(!IsAlive(fd_harvester.harvester)) - break - - } - waitUntilLessThanAmountAlive_expensive(0) + executeWave() SetGlobalNetInt("FD_waveState",WAVE_STATE_COMPLETE) if(!IsAlive(fd_harvester.harvester)) { @@ -591,7 +521,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) else SetRoundBased(false) SetWinner(TEAM_IMC)//restart round - file.spawnedNPCs = [] // reset npcs count + spawnedNPCs = [] // reset npcs count return false } @@ -611,7 +541,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) AddPlayerScore(player,"FDTeamWave") } wait 1 - float highestScore = 0; + int highestScore = 0; entity highestScore_player = GetPlayerArray()[0] foreach(entity player in GetPlayerArray()) { @@ -631,6 +561,10 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) foreach(entity player in GetPlayerArray()) if(!file.havesterWasDamaged) AddPlayerScore(player,"FDTeamFlawlessWave") + + + + SetRoundBased(false) SetWinner(TEAM_MILITIA) PlayFactionDialogueToTeam( "fd_matchVictory", TEAM_MILITIA ) @@ -675,7 +609,7 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) EmitSoundOnEntityOnlyToPlayer(player,player,"HUD_MP_BountyHunt_BankBonusPts_Deposit_Start_1P") } wait 1 - float highestScore = 0; + int highestScore = 0; entity highestScore_player = GetPlayerArray()[0] foreach(entity player in GetPlayerArray()) { @@ -730,6 +664,11 @@ void function SetWaveStateReady(){ SetGlobalNetInt("FD_waveState",WAVE_STATE_IN_PROGRESS) } +void function gameWonMedals(){ + table medals + //most mvps +} + void function OnHarvesterDamaged(entity harvester, var damageInfo) { @@ -971,7 +910,7 @@ void function FD_DamageByPlayerCallback(entity victim,var damageInfo) return float damage = DamageInfo_GetDamage(damageInfo) file.players[player].damageDealt += damage - file.players[player].scoreThisRound += damage //TODO NOT HOW SCORE WORKS + file.players[player].scoreThisRound += damage.tointeger() //TODO NOT HOW SCORE WORKS if(victim.IsTitan()) { //TODO Money and score for titan damage @@ -1133,7 +1072,7 @@ void function LoadEntities() AddStationaryAIPosition(info_target.GetOrigin(),int(info_target.kv.aiType)) break case"info_fd_route_node": - file.routeNodes.append(info_target) + routeNodes.append(info_target) break case"info_fd_smoke_screen": file.smokePoints.append(info_target) @@ -1146,67 +1085,7 @@ void function LoadEntities() initNetVars() } -void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,float nextDistance = 500.0) -{ - npc.EndSignal( "OnDeath" ) - npc.EndSignal( "OnDestroy" ) - - - - if(!npc.IsNPC()) - return - - - array 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 scippedNodes = 0 - foreach(entity node in routeArray) - { - if(!IsAlive(fd_harvester.harvester)) - return - if(scippedNodes < nodesToScip) - { - scippedNodes++ - continue - } - npc.AssaultPoint(node.GetOrigin()) - npc.AssaultSetGoalRadius( 100 ) - int i = 0 - table result = npc.WaitSignal("OnFinishedAssault","OnFailedToPath") - if(result.signal == "OnFailedToPath") - break - } - npc.Signal("FD_ReachedHarvester") -} - -void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) -{ - //TODO this function wont stop when noone alive anymore also it only works half of the time - - array 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++ < nodesToScip) - continue - - SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) - - } -} bool function allPlayersReady() { @@ -1326,576 +1205,64 @@ string function GetTargetNameForID(int typeId) unreachable } -/****************************************************************************************************************\ -####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### -# # # # ## # # # # # ## # # # # # # # # # # # -# # # # # # # # # # # # # # # # # # # # # # # -##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### -# # # # # # # # # # # # # # # # # ####### # # # # # -# # # # # ## # # # # # ## # # # # # # # # # # -####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # -\*****************************************************************************************************************/ - -WaveEvent function createSmokeEvent(vector position,float lifetime) -{ - WaveEvent event - event.eventFunction = spawnSmoke - event.shouldThread = true - event.smokeEvent.position = position - event.smokeEvent.lifetime = lifetime - return event -} - -WaveEvent function createArcTitanEvent(vector origin,vector angles,string route) -{ - WaveEvent event - event.eventFunction = spawnArcTitan - 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 - return event -} - -WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route) -{ - WaveEvent event - event.eventFunction = spawnSuperSpectre - 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 - return event -} - -WaveEvent function createDroppodGruntEvent(vector origin,string route) -{ - WaveEvent event - event.eventFunction = spawnDroppodGrunts - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.GRUNT - event.spawnEvent.spawnAmount = 4 - event.spawnEvent.origin = origin - event.spawnEvent.route = route - return event -} - -WaveEvent function createDroppodStalkerEvent(vector origin,string route) -{ - WaveEvent event - event.eventFunction = spawnDroppodStalker - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.STALKER - event.spawnEvent.spawnAmount = 4 - event.spawnEvent.origin = origin - event.spawnEvent.route = route - return event -} - -WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route) -{ - WaveEvent event - event.eventFunction = spawnDroppodSpectreMortar - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.SPECTRE_MORTAR - event.spawnEvent.spawnAmount = 4 - event.spawnEvent.origin = origin - event.spawnEvent.route = route - return event -} - -WaveEvent function createWaitForTimeEvent(float amount) -{ - WaveEvent event - event.shouldThread = false - event.eventFunction = waitForTime - event.waitEvent.amount = amount - return event -} - -WaveEvent function createWaitUntilAliveEvent(int amount) -{ - WaveEvent event - event.eventFunction = waitUntilLessThanAmountAliveEvent - event.shouldThread = false - event.waitEvent.amount = amount.tofloat() - return event -} - -WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount) -{ - WaveEvent event - event.eventFunction = spawnGenericNPC - 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 - return event -} - -WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount) -{ - WaveEvent event - event.eventFunction = spawnGenericNPCTitanwithSettings - 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 - return event -} - -WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route) -{ - WaveEvent event - event.eventFunction = spawnNukeTitan - 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 - return event -} - -WaveEvent function createMortarTitanEvent(vector origin,vector angles) -{ - WaveEvent event - event.eventFunction = spawnMortarTitan - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_MORTAR - event.spawnEvent.spawnAmount = 1 - event.spawnEvent.origin = origin - event.spawnEvent.angles = angles - return event -} - -WaveEvent function createCloakDroneEvent(vector origin,vector angles){ - WaveEvent event - event.eventFunction = fd_spawnCloakDrone - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE_CLOAK - event.spawnEvent.spawnAmount = 1 - event.spawnEvent.origin = origin - event.spawnEvent.angles = angles - return event -} - -WaveEvent function CreateTickEvent( vector origin, vector angles, int amount = 4, string route = "" ) -{ - WaveEvent event - event.eventFunction = SpawnTick - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.TICK - event.spawnEvent.spawnAmount = amount - event.spawnEvent.origin = origin - event.spawnEvent.angles = angles - return event -} - -WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles) -{ - WaveEvent event - event.eventFunction = spawnSniperTitan - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER - event.spawnEvent.spawnAmount = 1 - event.spawnEvent.origin = origin - event.spawnEvent.angles = angles - return event -} - -WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles) -{ - WaveEvent event - event.eventFunction = SpawnToneSniperTitan - event.shouldThread = true - event.spawnEvent.spawnType= eFD_AITypeIDs.TITAN_SNIPER - event.spawnEvent.spawnAmount = 1 - event.spawnEvent.origin = origin - event.spawnEvent.angles = angles - return event -} - -/************************************************************************************************************\ -####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### -# # # # ## # # # # # ## # # # # # # # ## # # # -# # # # # # # # # # # # # # # # # # # # # # # -##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### -# # # # # # # # # # # # # # # # # # # # # # # -# # # # # ## # # # # # ## # # # # # # # ## # # -####### # ####### # # # # ##### # # ##### # ### ####### # # ##### -\************************************************************************************************************/ - -void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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") - file.spawnedNPCs.append(npc) - DispatchSpawn(npc) - AddMinimapForTitans(npc) - npc.WaitSignal( "TitanHotDropComplete" ) - npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc,spawnEvent.route) - thread EMPTitanThinkConstant(npc) -} - -void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) -{ - float waitUntil = Time() + waitEvent.amount - while(Time() ) - SetTeam( pod, TEAM_IMC ) - InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> ) - - string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) - array guys - bool adychecked = false - - for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) - { - entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) - - 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 ) - - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) - AddMinimapForHumans(guy) - file.spawnedNPCs.append(guy) - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) - SquadNav_Thread(guys,spawnEvent.route) -} - -void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 guys - - for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) - { - entity guy = CreateStalker( TEAM_IMC, spawnEvent.origin,<0,0,0> ) - - SetTeam( guy, TEAM_IMC ) - guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) - guy.DisableNPCFlag( NPC_ALLOW_PATROL) - DispatchSpawn( guy ) - - SetSquad( guy, squadName ) - AddMinimapForHumans(guy) - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) - SquadNav_Thread(guys,spawnEvent.route) - -} - -void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 guys - - for ( int i = 0; i < 4; i++ ) - { - entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> ) - - 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,WaitEvent waitEvent,SoundEvent soundEvent) -{ - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) - DispatchSpawn(npc) -} - -void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) - file.spawnedNPCs.append(npc) - AddMinimapForTitans(npc) - npc.WaitSignal( "TitanHotDropComplete" ) - npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) -} - -void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) - DispatchSpawn(npc) - file.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,WaitEvent waitEvent,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) - file.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,WaitEvent waitEvent,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) - file.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,WaitEvent waitEvent,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 ) - file.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,WaitEvent waitEvent,SoundEvent soundEvent) -{ - entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, file.harvester_info.GetOrigin() ) - file.spawnedNPCs.append(npc) - SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) - AddMinimapForHumans(npc) -} - -void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,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 guys - - for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) - { - entity guy = CreateFragDrone( TEAM_IMC, spawnEvent.origin, <0,0,0> ) - - 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 ) - - guys.append( guy ) - } - - ActivateFireteamDropPod( pod, guys ) - 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 aliveTitans = file.spawnedNPCs.len() - while(aliveTitans>amount) - { - WaitFrame() - aliveTitans = file.spawnedNPCs.len() - if(!IsAlive(fd_harvester.harvester)) - break - } -} - -void function waitUntilLessThanAmountAlive_expensive(int amount) -{ - - array npcs = GetNPCArray() - int deduct = 0 - foreach (entity npc in npcs) - if (IsValid(GetPetTitanOwner( npc ))) - deduct++ - int aliveTitans = npcs.len() - deduct - while(aliveTitans>amount) - { - WaitFrame() - npcs = GetNPCArray() - deduct = 0 - foreach(entity npc in npcs) - if (IsValid(GetPetTitanOwner( npc ))) - deduct++ - aliveTitans = GetNPCArray().len() - deduct - if(!IsAlive(fd_harvester.harvester)) - break - } -} - -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 ) -} void function AddTurretSentry(entity turret) { 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 000000000..5a8996ec5 --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -0,0 +1,736 @@ +global function createSmokeEvent +global function createArcTitanEvent +global function createWaitForTimeEvent +global function createSuperSpectreEvent +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 createCloakDroneEvent +global function CreateTickEvent +global function CreateToneSniperTitanEvent +global function CreateNorthstarSniperTitanEvent +global function executeWave + + +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 +} + +global struct WaitEvent{ + float amount +} + +global struct SoundEvent{ + string soundEventName +} + +global struct WaveEvent{ + void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction + bool shouldThread + int executeOnThisCall //will actually be executed when called this many times + int timesExecuted + int nextEventIndex + SmokeEvent smokeEvent + SpawnEvent spawnEvent + WaitEvent waitEvent + SoundEvent soundEvent +} + + + + +global array > waveEvents + + + +void function executeWave() +{ + print("executeWave Start") + thread runEvents(0) + while(IsAlive(fd_harvester.harvester)&&(!allEventsExecuted(GetGlobalNetInt("FD_currentWave")))) + WaitFrame() + waitUntilLessThanAmountAlive(0) + waitUntilLessThanAmountAlive_expensive(0) +} + +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.waitEvent,currentEvent.soundEvent) + } + else + { + print("execute without thread") + currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.waitEvent,currentEvent.soundEvent) + } + if(currentEvent.nextEventIndex==0) + { + print("zero index") + return + } + currentEvent = waveEvents[GetGlobalNetInt("FD_currentWave")][currentEvent.nextEventIndex] + } + print("runEvents End") +} + + + + + + + + + + +/****************************************************************************************************************\ +####### # # ####### # # ####### ##### ####### # # ####### ###### # ####### ####### ###### +# # # # ## # # # # # ## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # # #### ##### # # # ##### ###### # # # # # ###### +# # # # # # # # # # # # # # # # # ####### # # # # # +# # # # # ## # # # # # ## # # # # # # # # # # +####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # +\*****************************************************************************************************************/ + +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) +{ + 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 + return event +} + +WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createWaitForTimeEvent(float amount,int nextEventIndex,int executeOnThisCall = 1) +{ + WaveEvent event + event.shouldThread = false + event.eventFunction = waitForTime + event.executeOnThisCall = executeOnThisCall + event.nextEventIndex = nextEventIndex + event.waitEvent.amount = amount + 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.waitEvent.amount = amount.tofloat() + return event +} + +WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vector angles,string route,int spawnType,int spawnAmount,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassName,string aiSettings,vector origin,vector angles,string route,int spawnType,int spawnAmount,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function createCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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.angles = angles + return event +} + +WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +/************************************************************************************************************\ +####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### +# # # # ## # # # # # ## # # # # # # # ## # # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### # # # # ##### # # # # # # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # +# # # # # ## # # # # # ## # # # # # # # ## # # +####### # ####### # # # # ##### # # ##### # ### ####### # # ##### +\************************************************************************************************************/ + +void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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>] + + +} + +void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) + thread singleNav_thread(npc,spawnEvent.route) + thread EMPTitanThinkConstant(npc) + +} + +void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +{ + float waitUntil = Time() + waitEvent.amount + while(Time() ) + SetTeam( pod, TEAM_IMC ) + InitFireteamDropPod( pod ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> ) + + string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) + array guys + bool adychecked = false + + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + { + entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + 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 ) + + 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,WaitEvent waitEvent,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 guys + + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + { + entity guy = CreateStalker( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + SetTeam( guy, TEAM_IMC ) + guy.EnableNPCFlag( NPC_ALLOW_INVESTIGATE | NPC_ALLOW_HAND_SIGNALS | NPC_ALLOW_FLEE ) + guy.DisableNPCFlag( NPC_ALLOW_PATROL) + DispatchSpawn( guy ) + + SetSquad( guy, squadName ) + AddMinimapForHumans(guy) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) + guys.append( guy ) + } + + ActivateFireteamDropPod( pod, guys ) + thread SquadNav_Thread(guys,spawnEvent.route) + +} + +void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 guys + + for ( int i = 0; i < 4; i++ ) + { + entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + + 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,WaitEvent waitEvent,SoundEvent soundEvent) +{ + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + entity npc = CreateNPC( spawnEvent.npcClassName, TEAM_IMC, spawnEvent.origin, spawnEvent.angles ) + DispatchSpawn(npc) +} + +void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) + spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) +} + +void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) + 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,WaitEvent waitEvent,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) + 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,WaitEvent waitEvent,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) + 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,WaitEvent waitEvent,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 ) + 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,WaitEvent waitEvent,SoundEvent soundEvent) +{ + entity npc = SpawnCloakDrone( TEAM_IMC, spawnEvent.origin, spawnEvent.angles, fd_harvester.harvester.GetOrigin() ) + spawnedNPCs.append(npc) + SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) + AddMinimapForHumans(npc) +} + +void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,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 guys + + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + { + entity guy = CreateFragDrone( TEAM_IMC, spawnEvent.origin, <0,0,0> ) + + 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 ) + + 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 aliveTitans = spawnedNPCs.len() + while(aliveTitans>amount) + { + WaitFrame() + aliveTitans = spawnedNPCs.len() + if(!IsAlive(fd_harvester.harvester)) + return + } +} + +void function waitUntilLessThanAmountAlive_expensive(int amount) +{ + + array npcs = GetNPCArray() + int deduct = 0 + foreach (entity npc in npcs) + if (IsValid(GetPetTitanOwner( npc ))) + deduct++ + int aliveTitans = npcs.len() - deduct + while(aliveTitans>amount) + { + WaitFrame() + npcs = GetNPCArray() + deduct = 0 + foreach(entity npc in npcs) + if (IsValid(GetPetTitanOwner( npc ))) + deduct++ + 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 ) +} \ No newline at end of file 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 000000000..1ca2bc16a --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -0,0 +1,97 @@ +global function singleNav_thread +global function SquadNav_Thread +global function getRoute + + + +void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,float nextDistance = 500.0) +{ + npc.EndSignal( "OnDeath" ) + npc.EndSignal( "OnDestroy" ) + + + + if(!npc.IsNPC()){ + return + } + + + + array 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 scippedNodes = 0 + foreach(entity node in routeArray) + { + if(!IsAlive(fd_harvester.harvester)) + return + if(scippedNodes < nodesToScip) + { + scippedNodes++ + continue + } + npc.AssaultPoint(node.GetOrigin()) + npc.AssaultSetGoalRadius( 50 ) + int i = 0 + table result = npc.WaitSignal("OnFinishedAssault","OnFailedToPath") + if(result.signal == "OnFailedToPath") + break + } + npc.Signal("FD_ReachedHarvester") +} + +void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) +{ + //TODO this function wont stop when noone alive anymore also it only works half of the time + + array 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++ < nodesToScip) + continue + + SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) + + } + +} + +array function getRoute(string routeName) +{ + array ret + array 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 +} \ No newline at end of file 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 8b2a40605..4ff36dbf4 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 2e35417fe..0c12ad18f 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 40cf942ec..83338c8ea 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut @@ -11,4 +11,10 @@ void function CodeCallback_MapInit() 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 37b891699..5c6a18ed6 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,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_drydock_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut index 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_forwardbase_kodai_fd.nut index 19f7c0e67..b8c0740d7 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 @@ -12,68 +12,69 @@ void function initFrontierDefenseData() array wave4 //wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, <0,0,0 >, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) - - wave0.append(createSmokeEvent(< -12, 1720, 1456>,30)) - wave0.append(createSmokeEvent(< -64, 964, 1456>,30)) - - wave0.append(createWaitForTimeEvent(7)) - wave0.append(createWaitUntilAliveEvent(1)) - - wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose")) - wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose")) - - wave0.append(createWaitForTimeEvent(7)) - wave0.append(createWaitUntilAliveEvent(1)) - - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) - - wave0.append(createWaitForTimeEvent(7)) - wave0.append(createWaitUntilAliveEvent(1)) - - wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose")) - wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose")) - - wave0.append(createWaitForTimeEvent(7)) - wave0.append(createWaitUntilAliveEvent(1)) - - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose")) - - wave0.append(createWaitForTimeEvent(7)) - wave0.append(createWaitUntilAliveEvent(1)) - - wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) - wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(CreateToneSniperTitanEvent( < 1373, 1219, 1314>, <0,0,0>)) + + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",1)) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",2)) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",3)) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",4)) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",5)) + + wave0.append(createSmokeEvent(< -12, 1720, 1456>,30,6)) + wave0.append(createSmokeEvent(< -64, 964, 1456>,30,7)) + + wave0.append(createWaitForTimeEvent(7,8)) + wave0.append(createWaitUntilAliveEvent(1,9)) + + wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose",10)) + wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose",11)) + wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose",12)) + wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose",13)) + wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose",14)) + + wave0.append(createWaitForTimeEvent(7,15)) + wave0.append(createWaitUntilAliveEvent(1,16)) + + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",17)) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",18)) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",19)) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",20)) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",21)) + + wave0.append(createWaitForTimeEvent(7,22)) + wave0.append(createWaitUntilAliveEvent(1,23)) + + wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose",24)) + wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose",25)) + wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose",26)) + wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose",27)) + wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose",28)) + + wave0.append(createWaitForTimeEvent(7,29)) + wave0.append(createWaitUntilAliveEvent(1,30)) + + wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",31)) + wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",32)) + wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",33)) + wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",34)) + wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",35)) + + wave0.append(createWaitForTimeEvent(7,36)) + wave0.append(createWaitUntilAliveEvent(1,37)) + + //wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) + //wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) + //wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) + wave0.append(CreateToneSniperTitanEvent( < 1373, 1219, 1314>, <0,0,0>,0)) // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 4, "hillRouteClose" )) - wave0.append(createWaitForTimeEvent(10)) + // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 56, "hillRouteClose" )) //wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) - wave0.append(createWaitUntilAliveEvent(0)) - wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>, "hillRouteClose")) - wave1.append(createNukeTitanEvent( < -64, 964, 1456>,<0,0,0>, "hillRouteClose")) - wave1.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) - wave1.append(createWaitUntilAliveEvent(0)) + + //wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>, "hillRouteClose")) + //wave1.append(createNukeTitanEvent( < -64, 964, 1456>,<0,0,0>, "hillRouteClose")) + //wave1.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) + //wave1.append(createWaitUntilAliveEvent(0)) // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) @@ -82,7 +83,7 @@ void function initFrontierDefenseData() waveEvents.append(wave0) //waveEvents.append(wave0) - waveEvents.append(wave1) + //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 37b891699..5c6a18ed6 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,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_glitch_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut index 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 f4b48f6d4..73059b9e3 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 37b891699..5c6a18ed6 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,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_homestead_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut index 37b891699..dcdd2c9a5 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,23 @@ -//fuck \ No newline at end of file +global function initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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_relic02.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut index 37b891699..5c6a18ed6 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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_thaw.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut index 37b891699..5c6a18ed6 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array 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 5af013461..c1290bb0d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut @@ -29,6 +29,11 @@ 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() 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 37b891699..dcdd2c9a5 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 initFrontiereDefenseData +void function initFrontierDefenseData() +{ + shopPosition = <0,0,0> + + + array wave0 + array wave1 + array wave2 + array wave3 + array wave4 + + + + + + + waveEvents.append(wave0) + waveEvents.append(wave1) + waveEvents.append(wave2) + waveEvents.append(wave3) + waveEvents.append(wave4) +} \ No newline at end of file From 25bca6ab1b2610eb022b59704dcb5c1ecce90891 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 30 May 2022 19:33:50 +0800 Subject: [PATCH 32/99] [FD] Stalker Changes Only (#372) * Added Stalker Sprinting after taking sufficient damage / arc'd / near harvester * Add correct weapons according to difficulty for Stalkers --- .../mod/scripts/vscripts/ai/_ai_stalker.gnut | 79 ++++++++++++++++++- .../gamemodes/_gamemode_fd_events.nut | 41 +++++++++- 2 files changed, 115 insertions(+), 5 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut index f49560e02..29e235b55 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut @@ -2,6 +2,7 @@ global function AiStalker_Init global function GetDeathForce global function StalkerGearOverloads global function StalkerMeltingDown +global function FDStalkerThink global function IsStalkerLimbBlownOff @@ -157,6 +158,82 @@ 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 ( 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") + } +} + +void function FDStalkerThink( entity npc, entity generator ) +{ + npc.EndSignal( "OnDeath" ) + npc.EndSignal( "OnDestroy" ) + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) + bool isSprinting = false + thread FDStalkerGetsStunned( npc , generator ) + while (IsAlive(npc)) + { + WaitFrame() + + if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (600 * 600) && !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 ) + isSprinting = true + } + + if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > (230 * 230) ) + continue + + break + } + + thread StalkerGearOverloads( npc ) +} + +void function FDStalkerGetsStunned( entity npc , entity generator ) +{ + npc.EndSignal( "OnDeath" ) + npc.EndSignal( "OnDestroy" ) + npc.WaitSignal( "ArcStunned" ) + print("arc trapped...") + + 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 } bool function TryDismemberStalker( entity npc, var damageInfo, entity attacker, int hitGroup ) @@ -603,4 +680,4 @@ vector function GetDeathForce() vector angles = 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/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 5a8996ec5..af63aeee2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -483,6 +483,7 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wa string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array guys + int difficultyLevel = FD_GetDifficultyLevel() for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { @@ -491,16 +492,48 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wa 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) + file.spawnedNPCs.append(guy) SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) + thread FDStalkerThink( guy , fd_harvester.harvester ) guys.append( guy ) - } + } - ActivateFireteamDropPod( pod, guys ) - thread SquadNav_Thread(guys,spawnEvent.route) + 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) } @@ -733,4 +766,4 @@ void function AddMinimapForHumans(entity human) human.Minimap_AlwaysShow( TEAM_MILITIA, null ) human.Minimap_SetHeightTracking( true ) human.Minimap_SetCustomState( eMinimapObject_npc.AI_TDM_AI ) -} \ No newline at end of file +} From 9103a2061ae36e8f8759b21576657c42a19cbc9b Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 30 May 2022 19:35:46 +0800 Subject: [PATCH 33/99] [FD] Sniper Titans Changes (#373) * Sniper Titans behavior update * RegisterSignal for Sniper Titans * End threads if Harvester is destroyed --- .../vscripts/ai/_ai_sniper_titans.gnut | 161 ++++++++++++++++-- .../vscripts/gamemodes/_gamemode_fd.nut | 1 + 2 files changed, 152 insertions(+), 10 deletions(-) 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 f91699b43..1f27ff828 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut @@ -3,15 +3,21 @@ untyped global function MoveToSniperPosition global function SniperTitanThink -const float SNIPER_TITAN_POSITION_SEARCH_RANGE = 2048 +const float SNIPER_TITAN_POSITION_SEARCH_RANGE = 4120 + +struct +{ + entity harvester +} file void function MoveToSniperPosition( entity titan, vector origin, entity target ) { titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) + file.harvester.EndSignal( "OnDeath" ) + file.harvester.EndSignal( "OnDestroy" ) - titan.SetLookDistOverride( 320 ) titan.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT ) float goalRadius = titan.GetMinGoalRadius() @@ -23,7 +29,6 @@ void function MoveToSniperPosition( entity titan, vector origin, entity target ) return local classname = titan.GetClassName() - titan.DisableLookDistOverride() titan.DisableNPCMoveFlag( NPCMF_PREFER_SPRINT ) } ) @@ -38,21 +43,24 @@ void function MoveToSniperPosition( entity titan, vector origin, entity target ) printt( "Sniper titan moving toward his goal", dist, tries++ ) titan.AssaultPoint( origin ) titan.AssaultSetGoalRadius( goalRadius ) - titan.SetEnemy( target ) + titan.AssaultSetFightRadius( 0 ) local result = WaitSignal( titan, "OnFinishedAssault", "OnEnterGoalRadius" ) + printt( "Sniper titan done moving into position") } } -void function SniperTitanThink( entity titan, entity generator ) +void function SniperTitanThink( entity titan, entity generator) { titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) + file.harvester.EndSignal( "OnDeath" ) + file.harvester.EndSignal( "OnDestroy" ) entity soul = titan.GetTitanSoul() soul.EndSignal( "OnDestroy" ) - // titan.SetScriptName( "sniper_titan" ) + titan.SetScriptName( "sniper_titan" ) WaitTillHotDropComplete( titan ) @@ -72,17 +80,150 @@ void function SniperTitanThink( entity titan, entity generator ) OnThreadEnd( function() : ( sniperPosition ) { - // release mortar position when dead + // release sniper position when dead ReleaseStationaryAIPosition( sniperPosition ) } ) - + file.harvester = generator + titan.SetEnemyChangeCallback( EnemyChanged ) + thread CheckEnemy( titan ) while( true ) { + WaitFrame() vector origin = sniperPosition.origin - titan.SetEnemy( generator ) waitthread MoveToSniperPosition( titan, origin, generator ) - WaitForever() + thread SniperTitanAttack( titan, generator ) + + waitthread WaitForInterruption( titan ) + } +} +// check if titan can see enemy +void function CheckEnemy(entity titan) +{ + titan.EndSignal( "OnSyncedMeleeVictim" ) + titan.EndSignal( "OnDeath" ) + titan.EndSignal( "OnDestroy" ) + file.harvester.EndSignal( "OnDeath" ) + file.harvester.EndSignal( "OnDestroy" ) + + while (IsValid(titan)) + { + wait 1 + if (!IsValid(titan.GetEnemy())) + continue + + if (!titan.CanSee(titan.GetEnemy()) && titan.GetEnemy() == file.harvester) + { + waitthread CreateSniperTarget( titan ) + 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) +{ + titan.EndSignal( "OnSyncedMeleeVictim" ) + titan.EndSignal( "OnDeath" ) + titan.EndSignal( "OnDestroy" ) + file.harvester.EndSignal( "OnDeath" ) + file.harvester.EndSignal( "OnDestroy" ) + + vector origin = titan.EyePosition() + TraceResults result = TraceLine( origin, file.harvester.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, file.harvester.GetOrigin()) < 200) + { + wait 2.0 + origin = titan.EyePosition() + result = TraceLine( origin, file.harvester.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, file.harvester ) + enemy = file.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 ) +{ + Assert( IsNewThread(), "Must be threaded off" ) + + titan.EndSignal( "OnSyncedMeleeVictim" ) + titan.EndSignal( "OnDeath" ) + titan.EndSignal( "OnDestroy" ) + file.harvester.EndSignal( "OnDeath" ) + file.harvester.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 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/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index f26cdf6ef..7bc180ed3 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -49,6 +49,7 @@ void function GamemodeFD_Init() PrecacheModel( MODEL_ATTRITION_BANK ) PrecacheParticleSystem($"P_smokescreen_FD") + RegisterSignal( "SniperSwitchedEnemy" ) // for use in SniperTitanThink behavior. RegisterSignal("FD_ReachedHarvester") RegisterSignal("OnFailedToPath") From 14b38ad5277317f66a1d0212d58c536f7da89b27 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 30 May 2022 19:37:01 +0800 Subject: [PATCH 34/99] [FD] Cloak Drone Changes (#374) * Revert _ai_cloak_drone.gnut * Fix Cloak Drones (and maybe Cloak Field) not cloaking targets correctly --- .../scripts/vscripts/ai/_ai_cloak_drone.gnut | 47 ------------------- .../scripts/vscripts/weapons/_cloaker.gnut | 6 ++- 2 files changed, 5 insertions(+), 48 deletions(-) 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 33437ad71..a71b71f10 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_cloak_drone.gnut @@ -334,11 +334,7 @@ void function CloakedDronePathFollowNPC( entity cloakedDrone, entity goalNPC ) function() : ( goalNPC ) { if ( IsAlive( goalNPC ) ) - { goalNPC.s.cloakedDrone = null - if(IsCloaked(goalNPC)) - goalNPC.Signal( "KillHandleCloakEnd" ) - } } ) @@ -386,9 +382,6 @@ void function CloakedDronePathFollowNPC( entity cloakedDrone, entity goalNPC ) float startTime = Time() path.goalValid = false - if(!IsCloaked(goalNPC)) - CloakNPC(goalNPC) - CloakedDroneFindPathDefault( path, defaultHeight, mins, maxs, cloakedDrone, goalNPC, mask ) //find a new path if necessary @@ -683,43 +676,3 @@ function IsSquadCenterClose( npc, dist = 256 ) return false } - -void function CloakNPC ( entity npc ) -{ - npc.SetCloakDuration( 1.0, -1, 1.0 ) - - EmitSoundOnEntity( npc, "cloak_on_3P" ) - EmitSoundOnEntity( npc, "cloak_sustain_loop_3P" ) - - thread HandleNPCCloakEnd( npc ) -} - -void function HandleNPCCloakEnd( entity npc ) -{ - npc.EndSignal( "OnDeath" ) - npc.Signal( "OnStartCloak" ) - npc.EndSignal( "OnStartCloak" ) - npc.EndSignal( "KillHandleCloakEnd" ) //Calling DisableCloak() after EnableCloak() doesn't kill this thread by design (to allow attacking through cloak etc), so this signal is for when you want to kill this thread - - OnThreadEnd( - function() : ( npc ) - { - if ( !IsValid( npc ) ) - return - - StopSoundOnEntity( npc, "cloak_sustain_loop_3P" ) - - if ( !IsCloaked( npc ) ) - return - - if ( !IsAlive( npc ) || !npc.IsHuman() ) - { - EmitSoundOnEntity( npc, "cloak_interruptend_3P" ) - npc.SetCloakDuration( 0, 0, 1.0 ) - return - } - } - ) - - WaitForever() -} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/weapons/_cloaker.gnut index 6ec0bc0ac..b4045f3ed 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 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 +} From 1b696045a30272d8d1d766b76958564e436f2bab Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 30 May 2022 19:47:54 +0800 Subject: [PATCH 35/99] Small fixes for gamemode_fd (#376) --- .../vscripts/gamemodes/_gamemode_fd.nut | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 7bc180ed3..9348f0210 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -182,16 +182,24 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) default: string netIndex = GetAiNetIdFromTargetName(victim.GetTargetName()) if(netIndex != "") - SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) + SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) + else + { + if (victim.GetTargetName() == "Cloak Drone") // special case for cloak drone, someone in respawn fucked up here + SetGlobalNetInt( "FD_AICount_Drone_Cloak", GetGlobalNetInt("FD_AICount_Drone_Cloak")-1) + } } SetGlobalNetInt("FD_AICount_Current",GetGlobalNetInt("FD_AICount_Current")-1) } - if ( victim.GetOwner() == attacker || !attacker.IsPlayer() || attacker == victim ) + 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() ) @@ -203,7 +211,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) money = 5 break case "npc_drone": - case "npc_spectre": // not sure + case "npc_spectre": money = 10 break case "npc_stalker": @@ -215,6 +223,8 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) 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 ) @@ -758,7 +768,7 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") newHealth = 0 PlayFactionDialogueToTeam( "fd_baseDeath", TEAM_MILITIA ) - fd_harvester.rings.Destroy() + fd_harvester.rings.Anim_Stop() } harvester.SetHealth( newHealth ) file.havesterWasDamaged = true @@ -981,6 +991,7 @@ void function HealthScaleByDifficulty( entity ent ) ent.SetMaxHealth( ent.GetMaxHealth() - 5000 ) else ent.SetMaxHealth( ent.GetMaxHealth() - 2000 ) + break case eFDDifficultyLevel.NORMAL: if ( ent.IsTitan() ) ent.SetMaxHealth( ent.GetMaxHealth() - 2500 ) @@ -995,8 +1006,12 @@ void function HealthScaleByDifficulty( entity ent ) case eFDDifficultyLevel.INSANE: if ( ent.IsTitan() ) { - ent.SetShieldHealthMax( 2500 ) // apparently they have 0, costs me some time debugging this ffs - ent.SetShieldHealth( 2500 ) + entity soul = ent.GetTitanSoul() + if (IsValid(soul)) + { + soul.SetShieldHealthMax( 2500 ) // apparently they have 0, costs me some time debugging this ffs + soul.SetShieldHealth( 2500 ) + } } break @@ -1087,7 +1102,6 @@ void function LoadEntities() } - bool function allPlayersReady() { foreach(entity player in GetPlayerArray()) @@ -1167,7 +1181,7 @@ string function GetTargetNameForID(int typeId) case eFD_AITypeIDs.LEGION: return "npc_titan_ogre_minigun" case eFD_AITypeIDs.TITAN_ARC: - return "npc_titan_arc" + return "empTitan" case eFD_AITypeIDs.RONIN: return "npc_titan_stryder_leadwall" case eFD_AITypeIDs.TITAN_MORTAR: @@ -1199,7 +1213,7 @@ string function GetTargetNameForID(int typeId) case eFD_AITypeIDs.DRONE: return "drone" case eFD_AITypeIDs.DRONE_CLOAK: - return "cloakedDrone" + return "Cloak Drone" // have to be like this for some reason in cl_gamemode_fd default: return "titan" } From e2a94756be58fd353320608f743816dbd5fd5c06 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 30 May 2022 20:12:16 +0800 Subject: [PATCH 36/99] [FD] Add more Titan events as well as separate Reaper events (#378) * Add more Titan events as well as separate Reaper events --- .../gamemodes/_gamemode_fd_events.nut | 238 +++++++++++++++++- 1 file changed, 230 insertions(+), 8 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index af63aeee2..4c44dac74 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -2,6 +2,7 @@ global function createSmokeEvent global function createArcTitanEvent global function createWaitForTimeEvent global function createSuperSpectreEvent +global function createSuperSpectreEventWithMinion global function createDroppodGruntEvent global function createNukeTitanEvent global function createMortarTitanEvent @@ -13,7 +14,13 @@ global function createWaitUntilAliveEvent global function createCloakDroneEvent global function CreateTickEvent global function CreateToneSniperTitanEvent -global function CreateNorthstarSniperTitanEvent +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 @@ -179,6 +186,21 @@ WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string ro return event } +WaveEvent function createSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1) { WaveEvent event @@ -361,6 +383,97 @@ WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int ne return event } + +WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + +WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +{ + 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 + return event +} + /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### # # # # ## # # # # # ## # # # # # # # ## # # # @@ -432,11 +545,29 @@ void function spawnSuperSpectre(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait wait 4.7 DispatchSpawn(npc) + SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) AddMinimapForHumans(npc) thread SuperSpectre_WarpFall(npc) - thread ReaperMinionLauncherThink(npc) + npc.WaitSignal("WarpfallComplete") + thread singleNav_thread(npc, spawnEvent.route) +} + +void function spawnSuperSpectreWithMinion(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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) + + 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,WaitEvent waitEvent,SoundEvent soundEvent) @@ -460,13 +591,13 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wai guy.DisableNPCFlag( NPC_ALLOW_PATROL) DispatchSpawn( guy ) - guy.SetParent( pod, "ATTACH", true ) - SetSquad( guy, squadName ) + guy.SetParent( pod, "ATTACH", true ) + SetSquad( guy, squadName ) - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) - AddMinimapForHumans(guy) - spawnedNPCs.append(guy) - guys.append( guy ) + SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) + AddMinimapForHumans(guy) + spawnedNPCs.append(guy) + guys.append( guy ) } ActivateFireteamDropPod( pod, guys ) @@ -586,6 +717,97 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) } + +void function SpawnIonTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + +void function SpawnScorchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + +void function SpawnRoninTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + +void function SpawnToneTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + +void function SpawnLegionTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + +void function SpawnMonarchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,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 ) + file.spawnedNPCs.append(npc) + AddMinimapForTitans(npc) + npc.WaitSignal( "TitanHotDropComplete" ) + npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) + thread CommonAIThink(npc, spawnEvent.route) +} + void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) From db3129c542e073f2a81fbe231dc9b2c2b103194c Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 31 May 2022 20:05:20 +0200 Subject: [PATCH 37/99] New wait events and split event also fixed other events --- .../vscripts/gamemodes/_gamemode_fd.nut | 29 +- .../gamemodes/_gamemode_fd_events.nut | 264 +++++++++++++----- 2 files changed, 196 insertions(+), 97 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 9348f0210..e92f9b7ff 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -166,29 +166,11 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) if ( findIndex != -1 ) { spawnedNPCs.remove( findIndex ) - switch(victimTypeID) //FD_GetAINetIndex_byAITypeID does not support all titan ids - { - 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): - SetGlobalNetInt("FD_AICount_Titan",GetGlobalNetInt("FD_AICount_Titan")-1) - break - default: - string netIndex = GetAiNetIdFromTargetName(victim.GetTargetName()) - if(netIndex != "") - SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) - else - { - if (victim.GetTargetName() == "Cloak Drone") // special case for cloak drone, someone in respawn fucked up here - SetGlobalNetInt( "FD_AICount_Drone_Cloak", GetGlobalNetInt("FD_AICount_Drone_Cloak")-1) - } - } + + string netIndex = GetAiNetIdFromTargetName(victim.GetTargetName()) + if(netIndex != "") + SetGlobalNetInt(netIndex,GetGlobalNetInt(netIndex)-1) + SetGlobalNetInt("FD_AICount_Current",GetGlobalNetInt("FD_AICount_Current")-1) } @@ -1269,6 +1251,7 @@ string function GetAiNetIdFromTargetName(string targetName) case "drone": return "FD_AICount_Drone" case "cloakedDrone": + case "Cloaked Drone": return "FD_AICount_Drone_Cloak" case "tick": return "FD_AICount_Ticks" diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 4c44dac74..751134a61 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -38,10 +38,15 @@ global struct SpawnEvent{ 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 WaitEvent{ - float amount +global struct FlowControlEvent{ + float waitTime + int splitNextEventIndex + int waitAmount + int waitEntityType + array waitGlobalDataKey } global struct SoundEvent{ @@ -49,20 +54,21 @@ global struct SoundEvent{ } global struct WaveEvent{ - void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction + 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 - WaitEvent waitEvent + FlowControlEvent flowControlEvent SoundEvent soundEvent + } - +global table GlobalEventEntitys global array > waveEvents @@ -108,12 +114,12 @@ void function runEvents(int firstExecuteIndex) if(currentEvent.shouldThread) { print("execute with thread") - thread currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.waitEvent,currentEvent.soundEvent) + thread currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.flowControlEvent,currentEvent.soundEvent) } else { print("execute without thread") - currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.waitEvent,currentEvent.soundEvent) + currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.flowControlEvent,currentEvent.soundEvent) } if(currentEvent.nextEventIndex==0) { @@ -156,7 +162,7 @@ WaveEvent function createSmokeEvent(vector position,float lifetime,int nextEvent return event } -WaveEvent function createArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function createArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnArcTitan @@ -168,10 +174,11 @@ WaveEvent function createArcTitanEvent(vector origin,vector angles,string route, 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) +WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnSuperSpectre @@ -183,10 +190,11 @@ WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string ro 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) +WaveEvent function createSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnSuperSpectreWithMinion @@ -198,10 +206,11 @@ WaveEvent function createSuperSpectreEventWithMinion(vector origin,vector angles 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) +WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodGrunts @@ -212,10 +221,11 @@ WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEv 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) +WaveEvent function createDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodStalker @@ -226,10 +236,11 @@ WaveEvent function createDroppodStalkerEvent(vector origin,string route,int next 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) +WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodSpectreMortar @@ -240,17 +251,18 @@ WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route,in event.spawnEvent.spawnAmount = 4 event.spawnEvent.origin = origin event.spawnEvent.route = route + event.spawnEvent.entityGlobalKey = entityGlobalKey return event } -WaveEvent function createWaitForTimeEvent(float amount,int nextEventIndex,int executeOnThisCall = 1) +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.waitEvent.amount = amount + event.flowControlEvent.waitTime = waitTime return event } @@ -261,11 +273,11 @@ WaveEvent function createWaitUntilAliveEvent(int amount,int nextEventIndex,int e event.executeOnThisCall = executeOnThisCall event.nextEventIndex = nextEventIndex event.shouldThread = false - event.waitEvent.amount = amount.tofloat() + 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) +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 @@ -278,10 +290,11 @@ WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vec 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) +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 @@ -295,10 +308,11 @@ WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassNam 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) +WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnNukeTitan @@ -310,10 +324,11 @@ WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route 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) +WaveEvent function createMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnMortarTitan @@ -324,10 +339,11 @@ WaveEvent function createMortarTitanEvent(vector origin,vector angles,int nextEv 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) +WaveEvent function createCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = fd_spawnCloakDrone @@ -338,10 +354,11 @@ WaveEvent function createCloakDroneEvent(vector origin,vector angles,int nextEve event.spawnEvent.spawnAmount = 1 event.spawnEvent.origin = origin event.spawnEvent.angles = angles + event.spawnEvent.entityGlobalKey = entityGlobalKey return event } -WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, string route,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnTick @@ -352,10 +369,11 @@ WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, st event.spawnEvent.spawnAmount = amount event.spawnEvent.origin = origin event.spawnEvent.angles = angles + event.spawnEvent.entityGlobalKey = entityGlobalKey return event } -WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnSniperTitan @@ -366,10 +384,11 @@ WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,i 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) +WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnToneSniperTitan @@ -380,11 +399,12 @@ WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int ne 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) +WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnIonTitan @@ -396,10 +416,11 @@ WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route, 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) +WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnScorchTitan @@ -411,10 +432,11 @@ WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string rou 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) +WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnRoninTitan @@ -426,10 +448,11 @@ WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string rout 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) +WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnToneTitan @@ -441,10 +464,11 @@ WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route 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) +WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnLegionTitan @@ -456,10 +480,11 @@ WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string rou 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) +WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnMonarchTitan @@ -471,6 +496,30 @@ WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string ro event.spawnEvent.origin = origin event.spawnEvent.angles = angles event.spawnEvent.route = route + event.spawnEvent.entityGlobalKey = entityGlobalKey + return event +} + +WaveEvent function CreateWaitForDeathOfEntitysEvent(array 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 } @@ -484,7 +533,7 @@ WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string ro ####### # ####### # # # # ##### # # ##### # ### ####### # # ##### \************************************************************************************************************/ -void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) { printt("smoke") SmokescreenStruct smokescreen @@ -500,7 +549,41 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent w } -void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -514,14 +597,15 @@ void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven 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,WaitEvent waitEvent,SoundEvent soundEvent) +void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) { - float waitUntil = Time() + waitEvent.amount + float waitUntil = Time() + flowControlEvent.waitTime while(Time() ) @@ -585,7 +671,8 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wai for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { entity 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) @@ -604,7 +691,7 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wai thread SquadNav_Thread(guys,spawnEvent.route) } -void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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> ) @@ -619,7 +706,8 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wa 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) @@ -629,7 +717,7 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wa SetSquad( guy, squadName ) guy.AssaultSetFightRadius( 0 ) // makes them keep moving instead of stopping to shoot you. AddMinimapForHumans(guy) - file.spawnedNPCs.append(guy) + spawnedNPCs.append(guy) SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.STALKER)) thread FDStalkerThink( guy , fd_harvester.harvester ) guys.append( guy ) @@ -668,7 +756,7 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wa } -void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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> ) @@ -682,7 +770,8 @@ void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEv 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 ) @@ -695,14 +784,16 @@ void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEv ActivateFireteamDropPod( pod, guys ) } -void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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,WaitEvent waitEvent,SoundEvent soundEvent) +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 ) @@ -711,6 +802,8 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent 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" ) @@ -718,7 +811,7 @@ void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent } -void function SpawnIonTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -726,14 +819,16 @@ void function SpawnIonTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEven SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function SpawnScorchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -741,14 +836,16 @@ void function SpawnScorchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function SpawnRoninTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -756,14 +853,16 @@ void function SpawnRoninTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEv SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function SpawnToneTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -771,14 +870,16 @@ void function SpawnToneTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function SpawnLegionTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -786,14 +887,16 @@ void function SpawnLegionTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function SpawnMonarchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -801,14 +904,16 @@ void function SpawnMonarchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Wait SetSpawnOption_Titanfall(npc) SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) // required for client to create icons DispatchSpawn( npc ) - file.spawnedNPCs.append(npc) + if(spawnEvent.entityGlobalKey!="") + GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc + spawnedNPCs.append(npc) AddMinimapForTitans(npc) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread CommonAIThink(npc, spawnEvent.route) + thread singleNav_thread(npc, spawnEvent.route) } -void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -818,6 +923,8 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve 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" ) @@ -827,7 +934,7 @@ void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEve } -void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) { PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) @@ -836,6 +943,8 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE 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" ) @@ -843,7 +952,7 @@ void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE thread MortarTitanThink(npc,fd_harvester.harvester) } -void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -851,6 +960,8 @@ void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE 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" ) @@ -859,7 +970,7 @@ void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitE } -void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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) @@ -867,6 +978,8 @@ void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,W 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) @@ -875,15 +988,17 @@ void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,W thread SniperTitanThink(npc,fd_harvester.harvester) } -void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent) +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,WaitEvent waitEvent,SoundEvent soundEvent) +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> ) @@ -897,7 +1012,8 @@ void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,WaitEvent w 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 ) From d5989edef55c2b6d14e671819c87f9fe65f4b377 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 16 Jun 2022 15:58:05 +0200 Subject: [PATCH 38/99] fix crash in sniper titan ai --- .../vscripts/ai/_ai_sniper_titans.gnut | 56 +++++++++---------- 1 file changed, 26 insertions(+), 30 deletions(-) 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 1f27ff828..714994311 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut @@ -5,18 +5,15 @@ global function SniperTitanThink const float SNIPER_TITAN_POSITION_SEARCH_RANGE = 4120 -struct -{ - entity harvester -} file + void function MoveToSniperPosition( entity titan, vector origin, entity target ) { titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) - file.harvester.EndSignal( "OnDeath" ) - file.harvester.EndSignal( "OnDestroy" ) + target.EndSignal( "OnDeath" ) + target.EndSignal( "OnDestroy" ) titan.EnableNPCMoveFlag( NPCMF_PREFER_SPRINT ) @@ -54,8 +51,8 @@ void function SniperTitanThink( entity titan, entity generator) titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) - file.harvester.EndSignal( "OnDeath" ) - file.harvester.EndSignal( "OnDestroy" ) + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) entity soul = titan.GetTitanSoul() soul.EndSignal( "OnDestroy" ) @@ -84,9 +81,8 @@ void function SniperTitanThink( entity titan, entity generator) ReleaseStationaryAIPosition( sniperPosition ) } ) - file.harvester = generator - titan.SetEnemyChangeCallback( EnemyChanged ) - thread CheckEnemy( titan ) + titan.SetEnemyChangeCallback( EnemyChanged) + thread CheckEnemy( titan ,generator) while( true ) { WaitFrame() @@ -95,17 +91,17 @@ void function SniperTitanThink( entity titan, entity generator) thread SniperTitanAttack( titan, generator ) - waitthread WaitForInterruption( titan ) + waitthread WaitForInterruption( titan ,generator) } } // check if titan can see enemy -void function CheckEnemy(entity titan) +void function CheckEnemy(entity titan,entity generator) { titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) - file.harvester.EndSignal( "OnDeath" ) - file.harvester.EndSignal( "OnDestroy" ) + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) while (IsValid(titan)) { @@ -113,37 +109,37 @@ void function CheckEnemy(entity titan) if (!IsValid(titan.GetEnemy())) continue - if (!titan.CanSee(titan.GetEnemy()) && titan.GetEnemy() == file.harvester) + if (!titan.CanSee(titan.GetEnemy()) && titan.GetEnemy() == generator) { - waitthread CreateSniperTarget( titan ) + 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) +void function CreateSniperTarget(entity titan,entity generator) { titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) - file.harvester.EndSignal( "OnDeath" ) - file.harvester.EndSignal( "OnDestroy" ) + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) vector origin = titan.EyePosition() - TraceResults result = TraceLine( origin, file.harvester.GetOrigin() + <0, 0, 250>, titan , TRACE_MASK_BLOCKLOS, TRACE_COLLISION_GROUP_NONE ) + 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, file.harvester.GetOrigin()) < 200) + while (Distance(result.endPos, origin) < 200 || Distance(result.endPos, generator.GetOrigin()) < 200) { wait 2.0 origin = titan.EyePosition() - result = TraceLine( origin, file.harvester.GetOrigin() + <0, 0, 250>, titan ) + 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 ) + 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" ) @@ -159,14 +155,14 @@ void function CreateSniperTarget(entity titan) ) } -void function EnemyChanged( entity titan ) +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, file.harvester ) - enemy = file.harvester + thread SniperTitanAttack( titan, fd_harvester.harvester) + enemy = fd_harvester.harvester } } @@ -186,15 +182,15 @@ function SniperTitanAttack( entity titan, entity target ) titan.SetEnemy( target ) } -void function WaitForInterruption( entity titan ) +void function WaitForInterruption( entity titan ,entity generator) { Assert( IsNewThread(), "Must be threaded off" ) titan.EndSignal( "OnSyncedMeleeVictim" ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) - file.harvester.EndSignal( "OnDeath" ) - file.harvester.EndSignal( "OnDestroy" ) + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) entity soul = titan.GetTitanSoul() soul.EndSignal( "OnDestroy" ) From 6a2513f0d54e1b6cbc2ebcd583e4a9fe22627443 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 7 Jul 2022 23:19:17 +0100 Subject: [PATCH 39/99] improved sprinting and detonating logic for FD (#410) --- Northstar.CustomServers/mod.json | 9 +++++++++ .../mod/scripts/vscripts/ai/_ai_stalker.gnut | 11 ++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Northstar.CustomServers/mod.json b/Northstar.CustomServers/mod.json index 172bff117..4fbb248d0 100644 --- a/Northstar.CustomServers/mod.json +++ b/Northstar.CustomServers/mod.json @@ -138,6 +138,15 @@ "ServerCallback": { "Before": "RespawnProtection_Init" } + }, + + { + "Path": "gamemodes/_gamemode_fd_events.nut", + "RunOn": "( SERVER ) && MP" + }, + { + "Path": "gamemodes/_gamemode_fd_nav.nut", + "RunOn": "( SERVER ) && MP" } ] } \ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut index 29e235b55..9ff479f95 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut @@ -191,11 +191,13 @@ void function FDStalkerThink( entity npc, entity generator ) generator.EndSignal( "OnDestroy" ) bool isSprinting = false thread FDStalkerGetsStunned( npc , generator ) - while (IsAlive(npc)) + while ( IsAlive( npc ) ) { WaitFrame() - if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (600 * 600) && !isSprinting) + // 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 ( !IsCrawling( npc ) && DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (1800 * 1800) && !isSprinting ) { entity weapon = npc.GetActiveWeapon() if (IsValid(weapon)) @@ -206,10 +208,13 @@ void function FDStalkerThink( entity npc, entity generator ) 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.AssaultPoint(generator.GetOrigin()) isSprinting = true } - if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > (230 * 230) ) + // upped from 230 to more accurately mimic vanilla i think? + if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) > (275 * 275) ) continue break From 827025ea2855ae2695450e153fefe257d30fae23 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 8 Jul 2022 20:32:23 +0200 Subject: [PATCH 40/99] Changed Damage Scaling and Health Values to PlaylistVars --- .../vscripts/gamemodes/_gamemode_fd.nut | 126 +++--------------- .../gamemodes/_gamemode_fd_events.nut | 4 +- 2 files changed, 22 insertions(+), 108 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index e92f9b7ff..c97c491eb 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -686,32 +686,8 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) fd_harvester.lastDamage = Time() - int difficultyLevel = FD_GetDifficultyLevel() - switch ( difficultyLevel ) - { - case eFDDifficultyLevel.EASY: - case eFDDifficultyLevel.NORMAL: // easy and normal have no damage scaling - break - - case eFDDifficultyLevel.HARD: - { - DamageInfo_SetDamage( damageInfo, (damageAmount * 1.5) ) - damageAmount = (damageAmount * 1.5) // for use in health calculations below - break - } - - case eFDDifficultyLevel.MASTER: - case eFDDifficultyLevel.INSANE: - { - DamageInfo_SetDamage( damageInfo, (damageAmount * 2.5) ) - damageAmount = (damageAmount * 2.5) // for use in health calculations below - break - } + damageAmount = (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0)) - default: - unreachable - - } float shieldPercent = ( (harvester.GetShieldHealth().tofloat() / harvester.GetShieldHealthMax()) * 100 ) @@ -929,27 +905,9 @@ void function DamageScaleByDifficulty( entity ent, var damageInfo ) if ( attacker.IsPlayer() && attacker.GetTeam() == TEAM_IMC ) // in case we ever want a PvP in Frontier Defense, don't scale their damage return - - int difficultyLevel = FD_GetDifficultyLevel() - switch ( difficultyLevel ) - { - case eFDDifficultyLevel.EASY: - case eFDDifficultyLevel.NORMAL: // easy and normal have no damage scaling - break - - case eFDDifficultyLevel.HARD: - DamageInfo_SetDamage( damageInfo, (damageAmount * 1.5) ) - break - - case eFDDifficultyLevel.MASTER: - case eFDDifficultyLevel.INSANE: - DamageInfo_SetDamage( damageInfo, (damageAmount * 2.5) ) - break - - default: - unreachable - - } + + DamageInfo_SetDamage( damageInfo, (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0)) ) + } @@ -961,74 +919,30 @@ void function HealthScaleByDifficulty( entity ent ) if ( ent.GetTeam() != TEAM_IMC ) return - if ( ent.IsTitan() ) - if ( IsValid(GetPetTitanOwner( ent ) ) ) // in case we ever want pvp in FD - return - - int difficultyLevel = FD_GetDifficultyLevel() - switch ( difficultyLevel ) - { - case eFDDifficultyLevel.EASY: - if ( ent.IsTitan() ) - ent.SetMaxHealth( ent.GetMaxHealth() - 5000 ) - else - ent.SetMaxHealth( ent.GetMaxHealth() - 2000 ) - break - case eFDDifficultyLevel.NORMAL: - if ( ent.IsTitan() ) - ent.SetMaxHealth( ent.GetMaxHealth() - 2500 ) - else - ent.SetMaxHealth( ent.GetMaxHealth() - 1000 ) - break - - case eFDDifficultyLevel.HARD: // no changes in Hard Mode - break - - case eFDDifficultyLevel.MASTER: - case eFDDifficultyLevel.INSANE: - if ( ent.IsTitan() ) - { - entity soul = ent.GetTitanSoul() - if (IsValid(soul)) - { - soul.SetShieldHealthMax( 2500 ) // apparently they have 0, costs me some time debugging this ffs - soul.SetShieldHealth( 2500 ) - } - } - break - - default: - unreachable + 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() { - int shieldamount = 6000 - int difficultyLevel = FD_GetDifficultyLevel() - switch ( difficultyLevel ) - { - case eFDDifficultyLevel.EASY: - case eFDDifficultyLevel.NORMAL: // easy and normal have no shield changes - break - - case eFDDifficultyLevel.HARD: - shieldamount = 5000 - break - - case eFDDifficultyLevel.MASTER: - case eFDDifficultyLevel.INSANE: - shieldamount = 4000 - break - - default: - unreachable - - } - fd_harvester = SpawnHarvester(file.harvester_info.GetOrigin(),file.harvester_info.GetAngles(),25000,shieldamount,TEAM_MILITIA) + 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 ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 751134a61..fbde5b463 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -14,7 +14,7 @@ global function createWaitUntilAliveEvent global function createCloakDroneEvent global function CreateTickEvent global function CreateToneSniperTitanEvent -global function CreateNorthstarSniperTitanEvent // northstars are always sniper titans +global function CreateNorthstarSniperTitanEvent //northstars are always sniper titans global function CreateIonTitanEvent global function CreateScorchTitanEvent global function CreateRoninTitanEvent @@ -546,7 +546,7 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControl 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 waitForDeathOfEntitys(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) From 519c6c40ff7a1aa41075989552d8a5534e49d483 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 8 Jul 2022 21:00:21 +0100 Subject: [PATCH 41/99] [FD] Give grunts shield captains and anti titan weapons based on difficulty (#412) * Create function for spawning a shield captain * give grunts anti titan weapons and captains on higher difficulties * Add default values to GetCurrentPlaylistVarInt usage --- .../mod/scripts/vscripts/ai/_ai_spawn.gnut | 6 ++++++ .../vscripts/gamemodes/_gamemode_fd.nut | 4 ++-- .../gamemodes/_gamemode_fd_events.nut | 21 ++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut index 8599f4294..26ddf3ca8 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 @@ -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/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index c97c491eb..bb18d0bbb 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -4,7 +4,6 @@ global function startHarvester global function GetTargetNameForID - struct player_struct_fd{ bool diedThisRound int scoreThisRound @@ -47,6 +46,7 @@ struct { 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. @@ -1182,4 +1182,4 @@ void function AddTurretSentry(entity turret) turret.Minimap_AlwaysShow( TEAM_MILITIA, null ) turret.Minimap_SetHeightTracking( true ) turret.Minimap_SetCustomState( eMinimapObject_npc.FD_TURRET ) -} +} \ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index fbde5b463..3357d6250 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -668,9 +668,17 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Flo array guys bool adychecked = false - for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) + for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { - entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + 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 ) @@ -681,6 +689,13 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Flo 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) @@ -688,7 +703,7 @@ void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Flo } ActivateFireteamDropPod( pod, guys ) - thread SquadNav_Thread(guys,spawnEvent.route) + thread SquadNav_Thread( guys,spawnEvent.route ) } void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) From 64515b881fa1d42ea06e8d26314585ea18eb14e3 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sat, 9 Jul 2022 11:59:56 +0100 Subject: [PATCH 42/99] [FD] General Small Changes (#411) * Remove AssaultSetFightRadius * Remove damage scaling for self damage * scip -> skip * Change to use 0 AssaultSetFightRadius --- .../mod/scripts/vscripts/ai/_ai_nuke_titans.gnut | 2 +- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 8 +++++++- .../scripts/vscripts/gamemodes/_gamemode_fd_nav.nut | 12 ++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) 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 0d4b43c92..2626abe15 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/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index bb18d0bbb..ec7657639 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -905,10 +905,16 @@ void function DamageScaleByDifficulty( entity ent, var damageInfo ) 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)) ) + } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index 1ca2bc16a..c1d0c7a93 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -4,7 +4,7 @@ global function getRoute -void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,float nextDistance = 500.0) +void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0) { npc.EndSignal( "OnDeath" ) npc.EndSignal( "OnDestroy" ) @@ -25,14 +25,14 @@ void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,f npc.Signal("OnFailedToPath") return } - int scippedNodes = 0 + int skippedNodes = 0 foreach(entity node in routeArray) { if(!IsAlive(fd_harvester.harvester)) return - if(scippedNodes < nodesToScip) + if(skippedNodes < nodesToSkip) { - scippedNodes++ + skippedNodes++ continue } npc.AssaultPoint(node.GetOrigin()) @@ -45,7 +45,7 @@ void function singleNav_thread(entity npc, string routeName,int nodesToScip= 0,f npc.Signal("FD_ReachedHarvester") } -void function SquadNav_Thread( array npcs ,string routeName,int nodesToScip = 0,float nextDistance = 200.0) +void function SquadNav_Thread( array 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 @@ -59,7 +59,7 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS { if(!IsAlive(fd_harvester.harvester)) return - if(nodeIndex++ < nodesToScip) + if(nodeIndex++ < nodesToSkip) continue SquadAssaultOrigin(npcs,node.GetOrigin(),nextDistance) From 151263b04067e2b724a4f07ea2e30629df5b7e70 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sat, 9 Jul 2022 16:24:17 +0100 Subject: [PATCH 43/99] highlight friendly players through walls (#413) --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index ec7657639..c9ae57b45 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -98,6 +98,8 @@ 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) From 16f71ec3ba0ba689b0061646c13bd11bd3a99a57 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 9 Jul 2022 18:08:05 +0200 Subject: [PATCH 44/99] Enable Selecting FD gamemodes in Private Match --- Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut | 2 ++ 1 file changed, 2 insertions(+) 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 a017fb422..608db46ea 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 ] ) ) Hud_SetLocked( buttons[ i ], false ) + else if( IsFDMode( modesArray[ i ] ) ) + Hud_SetLocked( buttons[ i ], false ) else Hud_SetLocked( buttons[ i ], true ) From 2289030ac53ceef0f3f54607ed732083692fc064 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 10 Jul 2022 16:33:28 +0200 Subject: [PATCH 45/99] Renamed Event Functions and added Drone event --- .../vscripts/gamemodes/_gamemode_fd.nut | 11 ++- .../gamemodes/_gamemode_fd_events.nut | 84 ++++++++++++------- 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index c9ae57b45..26ab22229 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -152,8 +152,14 @@ void function GamemodeFD_InitPlayer(entity player) player_struct_fd data data.diedThisRound = false file.players[player] <- data + thread SetTurretSettings_threaded(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 ) @@ -861,7 +867,7 @@ void function HarvesterAlarm() void function initNetVars() { SetGlobalNetInt("FD_totalWaves",waveEvents.len()) - + SetGlobalNetInt("burn_turretLimit",2) if(!FD_HasRestarted()) { bool showShop = false @@ -871,6 +877,7 @@ void function initNetVars() else FD_SetNumAllowedRestarts(2) } + } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 3357d6250..9b2216579 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -1,18 +1,19 @@ -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 createCloakDroneEvent -global function CreateTickEvent +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 CreateCloakDroneEvent +global function CreateDroppodTickEvent +global function CreateSpawnDroneEvent global function CreateToneSniperTitanEvent global function CreateNorthstarSniperTitanEvent //northstars are always sniper titans global function CreateIonTitanEvent @@ -150,7 +151,7 @@ void function runEvents(int firstExecuteIndex) ####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # \*****************************************************************************************************************/ -WaveEvent function createSmokeEvent(vector position,float lifetime,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateSmokeEvent(vector position,float lifetime,int nextEventIndex,int executeOnThisCall = 1) { WaveEvent event event.eventFunction = spawnSmoke @@ -162,7 +163,7 @@ WaveEvent function createSmokeEvent(vector position,float lifetime,int nextEvent return event } -WaveEvent function createArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnArcTitan @@ -178,7 +179,7 @@ WaveEvent function createArcTitanEvent(vector origin,vector angles,string route, return event } -WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnSuperSpectre @@ -194,7 +195,7 @@ WaveEvent function createSuperSpectreEvent(vector origin,vector angles,string ro return event } -WaveEvent function createSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnSuperSpectreWithMinion @@ -210,7 +211,7 @@ WaveEvent function createSuperSpectreEventWithMinion(vector origin,vector angles return event } -WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodGrunts @@ -225,7 +226,7 @@ WaveEvent function createDroppodGruntEvent(vector origin,string route,int nextEv return event } -WaveEvent function createDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodStalker @@ -240,7 +241,7 @@ WaveEvent function createDroppodStalkerEvent(vector origin,string route,int next return event } -WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDroppodSpectreMortar @@ -255,7 +256,7 @@ WaveEvent function createDroppodSpectreMortarEvent(vector origin,string route,in return event } -WaveEvent function createWaitForTimeEvent(float waitTime,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitForTimeEvent(float waitTime,int nextEventIndex,int executeOnThisCall = 1) { WaveEvent event event.shouldThread = false @@ -266,7 +267,7 @@ WaveEvent function createWaitForTimeEvent(float waitTime,int nextEventIndex,int return event } -WaveEvent function createWaitUntilAliveEvent(int amount,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitUntilAliveEvent(int amount,int nextEventIndex,int executeOnThisCall = 1) { WaveEvent event event.eventFunction = waitUntilLessThanAmountAliveEvent @@ -277,7 +278,7 @@ WaveEvent function createWaitUntilAliveEvent(int amount,int nextEventIndex,int e 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 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 @@ -294,7 +295,7 @@ WaveEvent function createGenericSpawnEvent(string npcClassName,vector origin,vec 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 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 @@ -312,7 +313,7 @@ WaveEvent function createGenericTitanSpawnWithAiSettingsEvent(string npcClassNam return event } -WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnNukeTitan @@ -328,7 +329,7 @@ WaveEvent function createNukeTitanEvent(vector origin,vector angles,string route return event } -WaveEvent function createMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnMortarTitan @@ -343,7 +344,7 @@ WaveEvent function createMortarTitanEvent(vector origin,vector angles,int nextEv return event } -WaveEvent function createCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = fd_spawnCloakDrone @@ -358,7 +359,7 @@ WaveEvent function createCloakDroneEvent(vector origin,vector angles,int nextEve return event } -WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodTickEvent( vector origin, int amount, string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = SpawnTick @@ -368,7 +369,6 @@ WaveEvent function CreateTickEvent( vector origin, vector angles, int amount, st event.spawnEvent.spawnType= eFD_AITypeIDs.TICK event.spawnEvent.spawnAmount = amount event.spawnEvent.origin = origin - event.spawnEvent.angles = angles event.spawnEvent.entityGlobalKey = entityGlobalKey return event } @@ -522,6 +522,19 @@ WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int n 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 = SpawnMonarchTitan + event.executeOnThisCall = executeOnThisCall + event.nextEventIndex = nextEventIndex + event.shouldThread = true + event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE + event.spawnEvent.spawnAmount = 0 + event.spawnEvent.origin = origin + event.spawnEvent.entityGlobalKey = entityGlobalKey + return event +} /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### @@ -548,6 +561,10 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControl Smokescreen(smokescreen) } +void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +{ + //TODO +} void function waitForDeathOfEntitys(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) { @@ -1094,8 +1111,11 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) npcs = GetNPCArray() deduct = 0 foreach(entity npc in npcs) - if (IsValid(GetPetTitanOwner( npc ))) + { + if( IsValid( GetPetTitanOwner( npc ) ) ) deduct++ + //if( npc.GetAISettingsName()=="") + } aliveTitans = GetNPCArray().len() - deduct if(!IsAlive(fd_harvester.harvester)) return From c40ad59d36c923475ecefb504f7b2578b5449527 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 10 Jul 2022 17:15:08 +0200 Subject: [PATCH 46/99] Add code generated forward base codai complete waves --- .../mp/levels/mp_forwardbase_kodai_fd.nut | 631 ++++++++++++++++-- 1 file changed, 559 insertions(+), 72 deletions(-) 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 b8c0740d7..084ce8d52 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 @@ -5,82 +5,569 @@ void function initFrontierDefenseData() { shopPosition = < -3862.13, 1267.69, 1060.06 > - array wave0 array 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(0,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(0,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(0,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(0,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(0,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 wave2 + wave2.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"",1)) + wave2.append(CreateWaitForTimeEvent(1.0169983,2)) + wave2.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"",3)) + wave2.append(CreateWaitForTimeEvent(1.6500244,4)) + wave2.append(CreateDroppodTickEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,4,"",5)) + wave2.append(CreateWaitForTimeEvent(1.0329895,6)) + wave2.append(CreateDroppodTickEvent(< 1258.060059 , 921.593994 , 1330.750000 >,4,"",7)) + wave2.append(CreateWaitForTimeEvent(5.0,8)) + wave2.append(CreateWaitUntilAliveEvent(0,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(0,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(0,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(0,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(0,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(0,54)) + wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"",55)) + wave2.append(CreateWaitForTimeEvent(1.1499939,56)) + wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"",57)) + wave2.append(CreateWaitForTimeEvent(5.0,58)) + wave2.append(CreateWaitUntilAliveEvent(0,59)) + wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"",60)) + wave2.append(CreateWaitForTimeEvent(1.1170044,61)) + wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"",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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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 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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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 wave4 - - //wave0.append(createSuperSpectreEvent(< -64, 964, 1456>, <0,0,0 >, "hillRouteClose")) - - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",1)) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",2)) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",3)) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",4)) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",5)) - - wave0.append(createSmokeEvent(< -12, 1720, 1456>,30,6)) - wave0.append(createSmokeEvent(< -64, 964, 1456>,30,7)) - - wave0.append(createWaitForTimeEvent(7,8)) - wave0.append(createWaitUntilAliveEvent(1,9)) - - wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose",10)) - wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose",11)) - wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose",12)) - wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose",13)) - wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose",14)) - - wave0.append(createWaitForTimeEvent(7,15)) - wave0.append(createWaitUntilAliveEvent(1,16)) - - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",17)) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",18)) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",19)) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",20)) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",21)) - - wave0.append(createWaitForTimeEvent(7,22)) - wave0.append(createWaitUntilAliveEvent(1,23)) - - wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose",24)) - wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose",25)) - wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose",26)) - wave0.append(createDroppodStalkerEvent( < 2193, 434, 955>, "hillRouteClose",27)) - wave0.append(createDroppodStalkerEvent( < 909, 3094, 968>, "hillRouteClose",28)) - - wave0.append(createWaitForTimeEvent(7,29)) - wave0.append(createWaitUntilAliveEvent(1,30)) - - wave0.append(createDroppodGruntEvent( < 865, 694, 1380>, "hillRouteClose",31)) - wave0.append(createDroppodGruntEvent( < 885, 1722, 1377>, "hillRouteClose",32)) - wave0.append(createDroppodGruntEvent( < 1226, 1391, 1355>, "hillRouteClose",33)) - wave0.append(createDroppodGruntEvent( < 1258, 922, 1331>, "hillRouteClose",34)) - wave0.append(createDroppodGruntEvent( < 1117, 330, 1372>, "hillRouteClose",35)) - - wave0.append(createWaitForTimeEvent(7,36)) - wave0.append(createWaitUntilAliveEvent(1,37)) - - //wave0.append(createDroppodGruntEvent( < 1309, 2122, 1324>, "hillRouteClose")) - //wave0.append(createDroppodGruntEvent( < 985, -110, 1369>, "hillRouteClose")) - //wave0.append(createDroppodGruntEvent( < 264, 2840, 968>, "hillRouteClose")) - wave0.append(CreateToneSniperTitanEvent( < 1373, 1219, 1314>, <0,0,0>,0)) - // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 4, "hillRouteClose" )) - - - // wave0.append(CreateTickEvent( < -64, 964, 1458>, <0,0,0>, 56, "hillRouteClose" )) - //wave0.append(createMortarTitanEvent(< 1632, 4720, 944>,<0,0,0>)) - - //wave1.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>, "hillRouteClose")) - //wave1.append(createNukeTitanEvent( < -64, 964, 1456>,<0,0,0>, "hillRouteClose")) - //wave1.append(createCloakDroneEvent(< 1632, 4720, 1200>,<0,0,0>)) - //wave1.append(createWaitUntilAliveEvent(0)) - // wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - - //wave0.append(createArcTitanEvent(< -12, 1720, 1456>,<0,0,0>,"hillRouteClose")) - //wave0.append(createDroppodStalkerEvent(< -12, 1720, 1456>,"")) - - waveEvents.append(wave0) + 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(0,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(0,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(0,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(0,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 wave5 + wave5.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"",1)) + wave5.append(CreateWaitForTimeEvent(1.2000732,2)) + wave5.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"",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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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(0,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) From 0ba7672a4607655b31f576f00e504d8e358a3b2f Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 10 Jul 2022 18:19:13 +0200 Subject: [PATCH 47/99] Prevent Harvester explosion fx when all players out of render range --- Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut | 1 + 1 file changed, 1 insertion(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 3ba6a6db4..6b0fb7e4c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -55,6 +55,7 @@ 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 } From 748c19beabf6eb2af20dd0634ee4a984f1647d0f Mon Sep 17 00:00:00 2001 From: x3Karma Date: Mon, 11 Jul 2022 03:34:38 +0800 Subject: [PATCH 48/99] Spelling Fix (#418) --- .../mod/scripts/vscripts/mp/levels/mp_angel_city_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_black_water_canal_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_colony02_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_drydock_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_glitch_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_grave_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_relic02_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_thaw_fd.nut | 2 +- .../mod/scripts/vscripts/mp/levels/mp_wargames_fd.nut | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> 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 dcdd2c9a5..cd3e28228 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,4 +1,4 @@ -global function initFrontiereDefenseData +global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = <0,0,0> From 1b066f46b9c4e12ac364aea7c0f1c013d018db87 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 11 Jul 2022 16:38:18 +0200 Subject: [PATCH 49/99] Add Generated Events for homestead also fix mapinit not being called on some maps --- .../gamemodes/_gamemode_fd_events.nut | 2 +- .../scripts/vscripts/mp/levels/mp_drydock.nut | 2 + .../scripts/vscripts/mp/levels/mp_glitch.nut | 2 + .../vscripts/mp/levels/mp_homestead.nut | 4 + .../vscripts/mp/levels/mp_homestead_fd.nut | 569 +++++++++++++++++- 5 files changed, 564 insertions(+), 15 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 9b2216579..77bef39b7 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -525,7 +525,7 @@ WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int n WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event - event.eventFunction = SpawnMonarchTitan + event.eventFunction = spawnDrones event.executeOnThisCall = executeOnThisCall event.nextEventIndex = nextEventIndex event.shouldThread = true 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 5c6a18ed6..4bd40ff1f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut @@ -1,3 +1,5 @@ +global function CodeCallback_MapInit + void function CodeCallback_MapInit() { // Load Frontier Defense Data 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 5c6a18ed6..4bd40ff1f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut @@ -1,3 +1,5 @@ +global function CodeCallback_MapInit + void function CodeCallback_MapInit() { // Load Frontier Defense Data 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 5c6a18ed6..037014584 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut @@ -1,6 +1,10 @@ +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 cd3e28228..25b1cc54e 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,23 +1,564 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { - shopPosition = <0,0,0> - - - array wave0 + shopPosition = < -792.552, -4243.41, -7.65455> + int index = 1 + print("INIT FRONTIERDATA") array wave1 - array wave2 - array wave3 - array wave4 - - - - - - - waveEvents.append(wave0) + wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(1.5,index++)) + wave1.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4965.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateSpawnDroneEvent(< -697.750000 , 940.593994 , 153.656006 >,< -0.000000 , 0.000000 , 0.000000 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(0.5999985,index++)) + wave1.append(CreateSpawnDroneEvent(< 2696.909912 , -388.062988 , 349.250000 >,< -0.000000 , 0.000000 , 0.000000 >,"",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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4810.569824 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(0.6659851,index++)) + wave1.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4955.319824 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< 4009.219971 , 3091.500000 , -2.406250 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",0)) waveEvents.append(wave1) + index = 1 + array wave2 + wave2.append(CreateSpawnDroneEvent(< 6090.759766 , 146.453995 , 4888.700195 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4870.890137 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(2.7000122,index++)) + wave2.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4831.279785 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4886.330078 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4918.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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 wave3 + wave3.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4893.919922 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0170288,index++)) + wave3.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4813.379883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.8829956,index++)) + wave3.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4935.830078 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.7839966,index++)) + wave3.append(CreateSpawnDroneEvent(< 4582.979980 , 2624.050049 , 4906.810059 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.9160156,index++)) + wave3.append(CreateSpawnDroneEvent(< 4024.330078 , 3117.510010 , 4947.189941 >,< 0.004999 , -25.792200 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4889.950195 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,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 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4946.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.717041,index++)) + wave3.append(CreateSpawnDroneEvent(< 2880.760010 , 3060.300049 , 4874.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.782959,index++)) + wave3.append(CreateSpawnDroneEvent(< 4569.009766 , 2664.110107 , 4897.569824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.4169922,index++)) + wave3.append(CreateSpawnDroneEvent(< 3984.270020 , 3103.570068 , 4931.939941 >,< 0.004999 , -25.792200 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.4830322,index++)) + wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4931.640137 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4920.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,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 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.217041,index++)) + wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4934.399902 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,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(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4905.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.2330322,index++)) + wave3.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4808.120117 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave3.append(CreateSpawnDroneEvent(< 5204.000000 , 1275.729980 , 4938.310059 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4898.049805 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.1669922,index++)) + wave3.append(CreateSpawnDroneEvent(< 4542.890137 , 2610.110107 , 4888.470215 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.3330078,index++)) + wave3.append(CreateSpawnDroneEvent(< 2826.729980 , 3086.419922 , 4851.450195 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(5.0,index++)) + wave3.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4864.759766 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.8840332,index++)) + wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4941.009766 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",0)) waveEvents.append(wave3) + index = 1 + array wave4 + wave4.append(CreateIonTitanEvent(< -1799.910034 , 1310.530029 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(4.4000244,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 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave4.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4925.459961 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateRoninTitanEvent(< -1799.439941 , 1310.839966 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(4.1800537,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(3.9300537,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(3.9199219,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4890.120117 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.8099365,index++)) + wave4.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4814.129883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.5,index++)) + wave4.append(CreateSpawnDroneEvent(< 5234.000000 , 1305.729980 , 4936.160156 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2000732,index++)) + wave4.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4911.430176 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4940.600098 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.8300781,index++)) + wave4.append(CreateSpawnDroneEvent(< 2866.790039 , 3100.360107 , 4857.200195 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4861.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.98999023,index++)) + wave4.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4831.629883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.1099854,index++)) + wave4.append(CreateSpawnDroneEvent(< 5204.000000 , 1335.729980 , 4926.459961 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(3.119995,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(CreateWaitUntilAliveEvent(0,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 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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(5.0,index++)) + wave5.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.10998535,index++)) + wave5.append(CreateSpawnDroneEvent(< 2938.060059 , 1411.089966 , 100.563004 >,< 13.667000 , -110.039001 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.11999512,index++)) + wave5.append(CreateSpawnDroneEvent(< 3031.810059 , 1541.949951 , 103.435997 >,< 12.767300 , -112.807999 , -0.000001 >,"",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(CreateWaitUntilAliveEvent(0,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 >,"",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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,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 From 0c7ee5e843e3698c587bc3331aaecbd9cf7e731d Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 11 Jul 2022 23:29:32 +0200 Subject: [PATCH 50/99] Update homestead events --- .../vscripts/mp/levels/mp_homestead_fd.nut | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) 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 25b1cc54e..b2f1c5510 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,9 +1,8 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { - shopPosition = < -792.552, -4243.41, -7.65455> + shopPosition = < -792.552, -4243.41, -20.65455> int index = 1 - print("INIT FRONTIERDATA") array wave1 wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave1.append(CreateWaitForTimeEvent(1.5,index++)) @@ -34,8 +33,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(5.0,index++)) wave1.append(CreateWaitUntilAliveEvent(0,index++)) wave1.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,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++)) @@ -48,8 +46,7 @@ void function initFrontierDefenseData() 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 >,"",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitForTimeEvent(2.0170135,index++)) wave1.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4810.569824 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) wave1.append(CreateWaitForTimeEvent(0.6659851,index++)) wave1.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4955.319824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -64,8 +61,7 @@ void function initFrontierDefenseData() 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(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) @@ -215,8 +211,7 @@ void function initFrontierDefenseData() wave3.append(CreateSpawnDroneEvent(< 3984.270020 , 3103.570068 , 4931.939941 >,< 0.004999 , -25.792200 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(1.4830322,index++)) wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4931.640137 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,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++)) @@ -225,8 +220,7 @@ void function initFrontierDefenseData() 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.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitForTimeEvent(5.950012,index++)) wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4920.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(1.4829712,index++)) wave3.append(CreateMortarTitanEvent(< -515.187988 , 1099.160034 , -162.281006 >,< 0.000000 , -90.000000 , 0.000000 >,index++)) @@ -257,8 +251,7 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(5.0,index++)) wave3.append(CreateWaitUntilAliveEvent(0,index++)) wave3.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,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 >,"",index++)) @@ -269,8 +262,7 @@ void function initFrontierDefenseData() 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(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitForTimeEvent(4.049988,index++)) wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4905.089844 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(1.2330322,index++)) wave3.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4808.120117 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) @@ -291,8 +283,7 @@ void function initFrontierDefenseData() 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(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) @@ -321,7 +312,8 @@ void function initFrontierDefenseData() index = 1 array wave4 wave4.append(CreateIonTitanEvent(< -1799.910034 , 1310.530029 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(4.4000244,index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,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++)) @@ -352,19 +344,22 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(5.0,index++)) wave4.append(CreateWaitUntilAliveEvent(0,index++)) wave4.append(CreateRoninTitanEvent(< -1799.439941 , 1310.839966 , -164.218994 >,< -0.922852 , -151.830994 , -1.582030 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(4.1800537,index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,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(3.9300537,index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,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(3.9199219,index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,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++)) @@ -413,7 +408,8 @@ void function initFrontierDefenseData() wave4.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4831.629883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(1.1099854,index++)) wave4.append(CreateSpawnDroneEvent(< 5204.000000 , 1335.729980 , 4926.459961 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(3.119995,index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveEvent(0,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(CreateWaitUntilAliveEvent(0,index++)) @@ -446,8 +442,7 @@ void function initFrontierDefenseData() 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(5.0,index++)) - wave5.append(CreateWaitUntilAliveEvent(0,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++)) @@ -561,4 +556,5 @@ void function initFrontierDefenseData() 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 From b9cfd8d22065a3b8396d9156313eef72405a5201 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 12 Jul 2022 05:20:16 +0200 Subject: [PATCH 51/99] Bunch of small fixes -reset wave Executed on lose -Weighted WaitUntilAlive Event -don't count militia npcs in wait events -wait so all NPCs are spawned before final wait -add ticks to spawnedNPCs so the are counted correctly -give money and set titan to full on connect -set titan to full on wave restart --- .../vscripts/gamemodes/_gamemode_fd.nut | 6 + .../gamemodes/_gamemode_fd_events.nut | 130 ++++++++++++++++-- 2 files changed, 126 insertions(+), 10 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 26ab22229..e97ab396a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -153,6 +153,9 @@ void function GamemodeFD_InitPlayer(entity player) data.diedThisRound = false file.players[player] <- data thread SetTurretSettings_threaded(player) + SetMoneyForPlayer(player,GetGlobalNetInt("FD_currentWave")*GetCurrentPlaylistVarInt("fd_money_per_round",600)) + if(GetGlobalNetInt("FD_currentWave")>1) + PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) } void function SetTurretSettings_threaded(entity player) @@ -523,6 +526,9 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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 } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 77bef39b7..302974157 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -23,7 +23,7 @@ global function CreateToneTitanEvent global function CreateLegionTitanEvent global function CreateMonarchTitanEvent global function executeWave - +global function restetWaveEvents global struct SmokeEvent{ vector position @@ -80,6 +80,7 @@ void function executeWave() 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) } @@ -132,8 +133,12 @@ void function runEvents(int firstExecuteIndex) print("runEvents End") } - - +void function restetWaveEvents(){ + foreach(WaveEvent event in waveEvents[GetGlobalNetInt("FD_currentWave")]) + { + event.timesExecuted = 0 + } +} @@ -278,6 +283,17 @@ WaveEvent function CreateWaitUntilAliveEvent(int amount,int nextEventIndex,int e 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 @@ -517,7 +533,7 @@ WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int n event.eventFunction = waitForLessThanAliveTyped event.executeOnThisCall = executeOnThisCall event.nextEventIndex = nextEventIndex - event. shouldThread = false + event.shouldThread = false event.flowControlEvent.waitAmount = amount event.flowControlEvent.waitEntityType = aiTypeId return event @@ -635,6 +651,10 @@ void function waitUntilLessThanAmountAliveEvent(SmokeEvent smokeEvent,SpawnEvent { 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) { @@ -1054,6 +1074,7 @@ void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControl AddMinimapForHumans(guy) SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.TICK)) SetSquad( guy, squadName ) + spawnedNPCs.append(guy) guys.append( guy ) } @@ -1084,13 +1105,84 @@ void function PingMinimap(float x, float y, float duration, float spreadRadius, } void function waitUntilLessThanAmountAlive(int amount) +{ + int deduct = 0 + foreach (entity npc in spawnedNPCs) + { + 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( 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 aliveTitans = spawnedNPCs.len() - while(aliveTitans>amount) + int aliveNPCsWeighted = 0; + foreach(npc in spawnedNPCs) + { + 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() - aliveTitans = spawnedNPCs.len() + aliveNPCsWeighted = 0; + foreach(npc in spawnedNPCs) + { + 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 } @@ -1102,8 +1194,19 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) array npcs = GetNPCArray() int deduct = 0 foreach (entity npc in npcs) - if (IsValid(GetPetTitanOwner( npc ))) - deduct++ + { + if( IsValid( GetPetTitanOwner( npc ) ) ) + { + deduct++ + continue + } + if(npc.GetTeam()==TEAM_MILITIA) + { + deduct++ + continue + } + } + int aliveTitans = npcs.len() - deduct while(aliveTitans>amount) { @@ -1113,8 +1216,15 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) foreach(entity npc in npcs) { if( IsValid( GetPetTitanOwner( npc ) ) ) + { deduct++ - //if( npc.GetAISettingsName()=="") + continue + } + if(npc.GetTeam()==TEAM_MILITIA) + { + deduct++ + continue + } } aliveTitans = GetNPCArray().len() - deduct if(!IsAlive(fd_harvester.harvester)) From eb46de39a5d14da45a69ee4826c4fd3113358fe8 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Tue, 12 Jul 2022 04:22:17 +0100 Subject: [PATCH 52/99] improve nav + a couple other things (#421) --- .../vscripts/gamemodes/_gamemode_fd.nut | 62 +++++++++- .../vscripts/gamemodes/_gamemode_fd_nav.nut | 101 ++++++++++++++- .../vscripts/mp/_base_gametype_mp.gnut | 1 + .../mp/levels/mp_forwardbase_kodai_fd.nut | 108 ++++++++-------- .../vscripts/mp/levels/mp_homestead_fd.nut | 116 +++++++++--------- 5 files changed, 271 insertions(+), 117 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index e97ab396a..15da68662 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -3,6 +3,10 @@ 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 @@ -25,6 +29,7 @@ struct player_struct_fd{ global HarvesterStruct& fd_harvester global vector shopPosition +global vector shopAngles = <0,0,0> global table > routes global array routeNodes global array spawnedNPCs @@ -157,6 +162,11 @@ void function GamemodeFD_InitPlayer(entity 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 ) + } void function SetTurretSettings_threaded(entity player) { //has to be delayed because PlayerConnect callbacks get called in wrong order @@ -277,8 +287,13 @@ void function mainGameLoop() showShop = true foreach(entity player in GetPlayerArray()) { - PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) + PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) } + DisableTitanSelection() + } + else if (i + 1 == waveEvents.len() ) + { + EnableTitanSelection() } } @@ -985,8 +1000,7 @@ bool function isSecondWave() void function LoadEntities() { - - CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,<0,0,0>) + CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,shopAngles) foreach ( entity info_target in GetEntArrayByClass_Expensive("info_target") ) { @@ -1203,4 +1217,44 @@ void function AddTurretSentry(entity turret) turret.Minimap_AlwaysShow( TEAM_MILITIA, null ) turret.Minimap_SetHeightTracking( true ) turret.Minimap_SetCustomState( eMinimapObject_npc.FD_TURRET ) -} \ No newline at end of file +} + +void function DisableTitanSelection( ) +{ + foreach ( entity player in GetPlayerArray() ) + { + DisableTitanSelectionForPlayer( player ) + } +} + +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_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index c1d0c7a93..572827660 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -17,7 +17,7 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f - array routeArray = getRoute(routeName) + /*array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) { @@ -41,7 +41,52 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f 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( npc.GetMinGoalRadius() ) + npc.AssaultSetFightRadius( 0 ) + + table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" ) + + targetNode = targetNode.GetLinkEnt() + } + npc.Signal("FD_ReachedHarvester") } @@ -49,7 +94,7 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS { //TODO this function wont stop when noone alive anymore also it only works half of the time - array routeArray = getRoute(routeName) + /*array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) return @@ -64,8 +109,60 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS 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() + } + +} + +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 function getRoute(string routeName) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut index 8d29c6126..df6829c88 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut @@ -121,6 +121,7 @@ void function CodeCallback_OnClientConnectionStarted( entity player ) // playerconnected void function CodeCallback_OnClientConnectionCompleted( entity player ) { + InitPersistentData( player ) if ( IsLobby() ) { Lobby_OnClientConnectionCompleted( player ) 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 084ce8d52..b1c67fd68 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 @@ -16,7 +16,7 @@ void function initFrontierDefenseData() 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(0,11)) + 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)) @@ -27,7 +27,7 @@ void function initFrontierDefenseData() 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(0,22)) + 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)) @@ -38,7 +38,7 @@ void function initFrontierDefenseData() 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(0,33)) + 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)) @@ -49,7 +49,7 @@ void function initFrontierDefenseData() 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(0,44)) + 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)) @@ -60,7 +60,7 @@ void function initFrontierDefenseData() 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(0,55)) + 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)) @@ -70,15 +70,15 @@ void function initFrontierDefenseData() wave1.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,0)) waveEvents.append(wave1) array wave2 - wave2.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"",1)) + 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,"",3)) + 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,"",5)) + 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,"",7)) + wave2.append(CreateDroppodTickEvent(< 1258.060059 , 921.593994 , 1330.750000 >,4,"hillRouteClose",7)) wave2.append(CreateWaitForTimeEvent(5.0,8)) - wave2.append(CreateWaitUntilAliveEvent(0,9)) + 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)) @@ -89,7 +89,7 @@ void function initFrontierDefenseData() 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(0,20)) + 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)) @@ -98,7 +98,7 @@ void function initFrontierDefenseData() 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(0,29)) + 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)) @@ -109,7 +109,7 @@ void function initFrontierDefenseData() 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(0,40)) + 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)) @@ -120,31 +120,31 @@ void function initFrontierDefenseData() 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(0,51)) + 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(0,54)) - wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"",55)) + 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,"",57)) + wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",57)) wave2.append(CreateWaitForTimeEvent(5.0,58)) - wave2.append(CreateWaitUntilAliveEvent(0,59)) - wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"",60)) + 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,"",62)) + 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(0,68)) + 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(0,75)) + 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)) @@ -153,12 +153,12 @@ void function initFrontierDefenseData() 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(0,84)) + 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(0,89)) + 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)) @@ -167,12 +167,12 @@ void function initFrontierDefenseData() 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(0,98)) + 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(0,103)) + 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)) @@ -185,15 +185,15 @@ void function initFrontierDefenseData() 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(0,116)) + 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(0,119)) + 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(0,124)) + 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)) @@ -215,7 +215,7 @@ void function initFrontierDefenseData() 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(0,13)) + 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)) @@ -224,7 +224,7 @@ void function initFrontierDefenseData() 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(0,22)) + 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)) @@ -233,7 +233,7 @@ void function initFrontierDefenseData() 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(0,31)) + 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)) @@ -242,7 +242,7 @@ void function initFrontierDefenseData() 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(0,40)) + 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)) @@ -255,7 +255,7 @@ void function initFrontierDefenseData() 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(0,53)) + 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)) @@ -264,7 +264,7 @@ void function initFrontierDefenseData() 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(0,62)) + 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)) @@ -289,7 +289,7 @@ void function initFrontierDefenseData() 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(0,87)) + 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)) @@ -298,7 +298,7 @@ void function initFrontierDefenseData() 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(0,96)) + 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)) @@ -326,7 +326,7 @@ void function initFrontierDefenseData() 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(0,21)) + 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)) @@ -355,7 +355,7 @@ void function initFrontierDefenseData() 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(0,50)) + 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)) @@ -378,7 +378,7 @@ void function initFrontierDefenseData() 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(0,73)) + 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)) @@ -409,7 +409,7 @@ void function initFrontierDefenseData() 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(0,104)) + 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)) @@ -421,15 +421,15 @@ void function initFrontierDefenseData() wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) waveEvents.append(wave4) array wave5 - wave5.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"",1)) + 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,"",3)) + 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(0,9)) + 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)) @@ -438,7 +438,7 @@ void function initFrontierDefenseData() 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(0,18)) + 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)) @@ -463,12 +463,12 @@ void function initFrontierDefenseData() 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(0,43)) + 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(0,48)) + 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)) @@ -495,14 +495,14 @@ void function initFrontierDefenseData() 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(0,75)) + 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(0,82)) + 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)) @@ -519,14 +519,14 @@ void function initFrontierDefenseData() 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(0,99)) + 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(0,106)) + 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)) @@ -541,14 +541,14 @@ void function initFrontierDefenseData() 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(0,121)) + 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(0,128)) + 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)) @@ -561,7 +561,7 @@ void function initFrontierDefenseData() 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(0,141)) + 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)) 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 b2f1c5510..193cc159e 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,7 +1,9 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { - shopPosition = < -792.552, -4243.41, -20.65455> + shopPosition = < -800.156, -4250, -63 > + shopAngles = < 9, 60, 0 > + int index = 1 array wave1 wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -16,7 +18,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.0,index++)) wave1.append(CreateDroppodGruntEvent(< 2420.310059 , -1135.250000 , -159.218994 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,index++)) wave1.append(CreateSpawnDroneEvent(< -697.750000 , 940.593994 , 153.656006 >,< -0.000000 , 0.000000 , 0.000000 >,"",index++)) wave1.append(CreateWaitForTimeEvent(0.5999985,index++)) wave1.append(CreateSpawnDroneEvent(< 2696.909912 , -388.062988 , 349.250000 >,< -0.000000 , 0.000000 , 0.000000 >,"",index++)) @@ -31,7 +33,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.5830078,index++)) wave1.append(CreateDroppodGruntEvent(< 4731.839844 , -2077.219971 , -35.625000 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -42,7 +44,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(0.6170044,index++)) wave1.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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 >,"",index++)) @@ -53,7 +55,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -64,19 +66,19 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(2.9000092,index++)) wave1.append(CreateDroppodGruntEvent(< 4009.219971 , 3091.500000 , -2.406250 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -87,16 +89,16 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.0,index++)) wave1.append(CreateDroppodSpectreMortarEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,index++)) wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,index++)) wave1.append(CreateDroppodGruntEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,index++)) wave1.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(0,index++)) + wave1.append(CreateWaitUntilAliveEvent(6,index++)) wave1.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",0)) waveEvents.append(wave1) index = 1 @@ -111,51 +113,51 @@ void function initFrontierDefenseData() wave2.append(CreateWaitForTimeEvent(0.7669983,index++)) wave2.append(CreateDroppodGruntEvent(< -770.500000 , 1070.060059 , -159.781006 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,index++)) wave2.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4870.890137 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave2.append(CreateWaitForTimeEvent(2.7000122,index++)) wave2.append(CreateSpawnDroneEvent(< 6012.029785 , 1321.359985 , 4831.279785 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,index++)) wave2.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4886.330078 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,index++)) wave2.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4918.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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++)) @@ -166,7 +168,7 @@ void function initFrontierDefenseData() wave2.append(CreateWaitForTimeEvent(2.8999634,index++)) wave2.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(0,index++)) + wave2.append(CreateWaitUntilAliveEvent(6,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++)) @@ -191,17 +193,17 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(0.9160156,index++)) wave3.append(CreateSpawnDroneEvent(< 4024.330078 , 3117.510010 , 4947.189941 >,< 0.004999 , -25.792200 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,index++)) wave3.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4889.950195 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,index++)) wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4946.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(0.717041,index++)) wave3.append(CreateSpawnDroneEvent(< 2880.760010 , 3060.300049 , 4874.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -216,7 +218,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -227,7 +229,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -240,7 +242,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -249,7 +251,7 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(0.41705322,index++)) wave3.append(CreateDroppodGruntEvent(< -610.500000 , 1743.060059 , 93.156303 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -258,7 +260,7 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(1.217041,index++)) wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4934.399902 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -269,7 +271,7 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) wave3.append(CreateSpawnDroneEvent(< 5204.000000 , 1275.729980 , 4938.310059 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,index++)) wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4898.049805 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(1.1669922,index++)) wave3.append(CreateSpawnDroneEvent(< 4542.890137 , 2610.110107 , 4888.470215 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -286,7 +288,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,index++)) wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4864.759766 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave3.append(CreateWaitForTimeEvent(0.8840332,index++)) wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4941.009766 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -299,21 +301,21 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave3.append(CreateWaitUntilAliveEvent(6,index++)) wave3.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",0)) waveEvents.append(wave3) index = 1 array 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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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++)) @@ -326,7 +328,7 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.1400146,index++)) wave4.append(CreateDroppodSpectreMortarEvent(< 5542.589844 , 2078.189941 , -31.531300 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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++)) @@ -335,50 +337,50 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.1600342,index++)) wave4.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,index++)) wave4.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4890.120117 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(0.8099365,index++)) wave4.append(CreateSpawnDroneEvent(< 5994.600098 , 1378.760010 , 4814.129883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) @@ -387,7 +389,7 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.2000732,index++)) wave4.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4911.430176 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,index++)) wave4.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4940.600098 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(0.8300781,index++)) wave4.append(CreateSpawnDroneEvent(< 2866.790039 , 3100.360107 , 4857.200195 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) @@ -402,17 +404,17 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.4100342,index++)) wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,index++)) wave4.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4861.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(0.98999023,index++)) wave4.append(CreateSpawnDroneEvent(< 6032.029785 , 1358.760010 , 4831.629883 >,< 0.004999 , -73.121300 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(1.1099854,index++)) wave4.append(CreateSpawnDroneEvent(< 5204.000000 , 1335.729980 , 4926.459961 >,< 0.004999 , -89.996300 , 0.000004 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave4.append(CreateWaitUntilAliveEvent(6,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++)) @@ -429,7 +431,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) @@ -438,7 +440,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) @@ -453,7 +455,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) @@ -472,7 +474,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) @@ -505,7 +507,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) @@ -526,20 +528,20 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(0,index++)) + wave5.append(CreateWaitUntilAliveEvent(6,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++)) From 3739df36a838f32ca03621120944663d3b71b963 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Tue, 12 Jul 2022 15:13:52 +0100 Subject: [PATCH 53/99] set weapon.e.burnReward when giving a burn reward (#417) --- .../scripts/vscripts/item_inventory/sv_item_inventory.gnut | 4 ++++ 1 file changed, 4 insertions(+) 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 4e8f85aca..496ebf843 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 ) From b601f40395fc940e805e1cbb13efda64fb75fcf1 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Tue, 12 Jul 2022 20:19:44 +0100 Subject: [PATCH 54/99] [FD] Drone event functionality (#422) * improve nav + a couple other things * Add drone nav function and give drones routes in homestead --- .../vscripts/gamemodes/_gamemode_fd.nut | 5 + .../gamemodes/_gamemode_fd_events.nut | 35 +++++- .../vscripts/gamemodes/_gamemode_fd_nav.nut | 78 ++++++++++++- .../vscripts/mp/levels/mp_homestead_fd.nut | 104 +++++++++--------- 4 files changed, 166 insertions(+), 56 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 15da68662..aa148e0cc 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -167,6 +167,11 @@ void function GamemodeFD_InitPlayer(entity player) 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 diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 302974157..11c6774a2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -546,9 +546,10 @@ WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string rout event.nextEventIndex = nextEventIndex event.shouldThread = true event.spawnEvent.spawnType= eFD_AITypeIDs.DRONE - event.spawnEvent.spawnAmount = 0 + event.spawnEvent.spawnAmount = 4 event.spawnEvent.origin = origin event.spawnEvent.entityGlobalKey = entityGlobalKey + event.spawnEvent.route = route return event } @@ -580,6 +581,38 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControl void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) { //TODO + PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + array offsets = [ < 0, 100, 0 >, < 100, 0, 0 >, < 0, -100, 0 >, < -100, 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) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index 572827660..9fa041519 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -1,10 +1,11 @@ global function singleNav_thread global function SquadNav_Thread +global function droneNav_thread global function getRoute -void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0) +void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0, bool shouldLoop = false) { npc.EndSignal( "OnDeath" ) npc.EndSignal( "OnDestroy" ) @@ -79,7 +80,7 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f if( !IsAlive( fd_harvester.harvester ) ) return npc.AssaultPoint( targetNode.GetOrigin() ) - npc.AssaultSetGoalRadius( npc.GetMinGoalRadius() ) + npc.AssaultSetGoalRadius( nextDistance ) npc.AssaultSetFightRadius( 0 ) table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" ) @@ -90,11 +91,11 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f npc.Signal("FD_ReachedHarvester") } -void function SquadNav_Thread( array npcs ,string routeName,int nodesToSkip = 0,float nextDistance = 200.0) +void function SquadNav_Thread( array 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 routeArray = getRoute(routeName) + /* + array routeArray = getRoute(routeName) WaitFrame()//so other code setting up what happens on signals is run before this if(routeArray.len()==0) return @@ -152,6 +153,73 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS } +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 ) 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 193cc159e..0d107d5d1 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 @@ -6,9 +6,9 @@ void function initFrontierDefenseData() int index = 1 array wave1 - wave1.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4918.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + 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 >,"",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++)) @@ -19,9 +19,13 @@ void function initFrontierDefenseData() wave1.append(CreateDroppodGruntEvent(< 2420.310059 , -1135.250000 , -159.218994 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) wave1.append(CreateWaitUntilAliveEvent(6,index++)) - wave1.append(CreateSpawnDroneEvent(< -697.750000 , 940.593994 , 153.656006 >,< -0.000000 , 0.000000 , 0.000000 >,"",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++)) - wave1.append(CreateSpawnDroneEvent(< 2696.909912 , -388.062988 , 349.250000 >,< -0.000000 , 0.000000 , 0.000000 >,"",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++)) @@ -47,11 +51,11 @@ void function initFrontierDefenseData() wave1.append(CreateWaitUntilAliveEvent(6,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 >,"",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 >,"",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 >,"",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++)) @@ -103,7 +107,7 @@ void function initFrontierDefenseData() waveEvents.append(wave1) index = 1 array wave2 - wave2.append(CreateSpawnDroneEvent(< 6090.759766 , 146.453995 , 4888.700195 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + 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++)) @@ -119,15 +123,15 @@ void function initFrontierDefenseData() wave2.append(CreateDroppodGruntEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) wave2.append(CreateWaitUntilAliveEvent(6,index++)) - wave2.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4870.890137 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave2.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4886.330078 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave2.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4918.220215 >,< 0.004999 , -115.792000 , 0.000004 >,"",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++)) @@ -183,36 +187,36 @@ void function initFrontierDefenseData() waveEvents.append(wave2) index = 1 array wave3 - wave3.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4893.919922 >,< 0.004999 , -115.792000 , 0.000004 >,"",index++)) + 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 >,"",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 >,"",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 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave3.append(CreateSpawnDroneEvent(< 3341.850098 , 2237.580078 , 4889.950195 >,< 0.004999 , -115.792000 , 0.000004 >,"",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(CreateWaitUntilAliveEvent(6,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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave3.append(CreateSpawnDroneEvent(< 3381.919922 , 2251.550049 , 4946.819824 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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 >,"",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 >,"",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 >,"",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++)) @@ -223,7 +227,7 @@ void function initFrontierDefenseData() 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 >,"",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++)) @@ -256,27 +260,27 @@ void function initFrontierDefenseData() 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 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,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 >,"",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 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave3.append(CreateSpawnDroneEvent(< 3367.949951 , 2291.610107 , 4898.049805 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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 >,"",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++)) @@ -289,9 +293,9 @@ void function initFrontierDefenseData() wave3.append(CreateSuperSpectreEvent(< -522.593994 , -251.406006 , 416.437988 >,< -0.000000 , 169.408997 , 0.000000 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) wave3.append(CreateWaitUntilAliveEvent(6,index++)) - wave3.append(CreateSpawnDroneEvent(< 6076.790039 , 186.516006 , 4864.759766 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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++)) @@ -320,9 +324,9 @@ void function initFrontierDefenseData() 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 >,"",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 >,"",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++)) @@ -381,18 +385,18 @@ void function initFrontierDefenseData() wave4.append(CreateSuperSpectreEvent(< 3910.250000 , -2404.560059 , -89.156303 >,< -0.922852 , -121.376999 , -1.582030 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) wave4.append(CreateWaitUntilAliveEvent(6,index++)) - wave4.append(CreateSpawnDroneEvent(< 6050.669922 , 132.485001 , 4890.120117 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) - wave4.append(CreateSpawnDroneEvent(< 3327.889893 , 2277.639893 , 4940.600098 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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++)) @@ -405,11 +409,11 @@ void function initFrontierDefenseData() wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) wave4.append(CreateWaitUntilAliveEvent(6,index++)) - wave4.append(CreateSpawnDroneEvent(< 6036.729980 , 172.546997 , 4861.959961 >,< 0.004999 , -115.792000 , 0.000004 >,"",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 >,"",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 >,"",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(CreateWaitUntilAliveEvent(6,index++)) wave4.append(CreateToneSniperTitanEvent(< 1484.189941 , 968.218994 , 97.968803 >,< -0.922852 , -141.942993 , -1.582030 >,index++)) @@ -460,11 +464,11 @@ void function initFrontierDefenseData() 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 >,"",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 >,"",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 >,"",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++)) @@ -497,7 +501,7 @@ void function initFrontierDefenseData() 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 >,"",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++)) From 19dd033bf3e008d8c792cd99ade15ec40a250c31 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Wed, 13 Jul 2022 01:55:47 +0100 Subject: [PATCH 55/99] [FD] Drone improvements + move homestead to use Weighted wait functions (#423) * improve nav + a couple other things * Add drone nav function and give drones routes in homestead * fix race condition and stuff --- .../vscripts/gamemodes/_gamemode_fd.nut | 3 +- .../gamemodes/_gamemode_fd_events.nut | 3 +- .../vscripts/mp/levels/mp_homestead_fd.nut | 112 +++++++++--------- 3 files changed, 60 insertions(+), 58 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index aa148e0cc..8952c9158 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -158,7 +158,6 @@ void function GamemodeFD_InitPlayer(entity player) data.diedThisRound = false file.players[player] <- data thread SetTurretSettings_threaded(player) - SetMoneyForPlayer(player,GetGlobalNetInt("FD_currentWave")*GetCurrentPlaylistVarInt("fd_money_per_round",600)) if(GetGlobalNetInt("FD_currentWave")>1) PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) @@ -633,6 +632,8 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) 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 diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 11c6774a2..45e3b296e 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -11,6 +11,7 @@ global function CreateGenericTitanSpawnWithAiSettingsEvent global function CreateDroppodStalkerEvent global function CreateDroppodSpectreMortarEvent global function CreateWaitUntilAliveEvent +global function CreateWaitUntilAliveWeightedEvent global function CreateCloakDroneEvent global function CreateDroppodTickEvent global function CreateSpawnDroneEvent @@ -582,7 +583,7 @@ void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowContro { //TODO PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) - array offsets = [ < 0, 100, 0 >, < 100, 0, 0 >, < 0, -100, 0 >, < -100, 0, 0 > ] + array offsets = [ < 0, 32, 0 >, < 32, 0, 0 >, < 0, -32, 0 >, < -32, 0, 0 > ] string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) 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 0d107d5d1..cd7d78950 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 @@ -18,7 +18,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.0,index++)) wave1.append(CreateDroppodGruntEvent(< 2420.310059 , -1135.250000 , -159.218994 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -37,7 +37,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.5830078,index++)) wave1.append(CreateDroppodGruntEvent(< 4731.839844 , -2077.219971 , -35.625000 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -48,7 +48,7 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(0.6170044,index++)) wave1.append(CreateDroppodGruntEvent(< -3570.879883 , -1498.500000 , -49.625000 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,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++)) @@ -59,7 +59,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -70,19 +70,19 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(2.9000092,index++)) wave1.append(CreateDroppodGruntEvent(< 4009.219971 , 3091.500000 , -2.406250 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) @@ -93,16 +93,16 @@ void function initFrontierDefenseData() wave1.append(CreateWaitForTimeEvent(1.0,index++)) wave1.append(CreateDroppodSpectreMortarEvent(< 2870.810059 , -2727.629883 , 77.968803 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++)) wave1.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++)) wave1.append(CreateDroppodGruntEvent(< -1881.280029 , 1307.310059 , -159.781006 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++)) wave1.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++)) wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveEvent(6,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(12,index++)) wave1.append(CreateDroppodGruntEvent(< 2696.000000 , -1068.719971 , -92.687500 >,"",0)) waveEvents.append(wave1) index = 1 @@ -117,51 +117,51 @@ void function initFrontierDefenseData() wave2.append(CreateWaitForTimeEvent(0.7669983,index++)) wave2.append(CreateDroppodGruntEvent(< -770.500000 , 1070.060059 , -159.781006 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) @@ -172,7 +172,7 @@ void function initFrontierDefenseData() wave2.append(CreateWaitForTimeEvent(2.8999634,index++)) wave2.append(CreateDroppodGruntEvent(< 2812.340088 , -1307.750000 , -156.563004 >,"",index++)) wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveEvent(6,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++)) @@ -197,17 +197,17 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) @@ -222,7 +222,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -233,7 +233,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -246,7 +246,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -255,7 +255,7 @@ void function initFrontierDefenseData() wave3.append(CreateWaitForTimeEvent(0.41705322,index++)) wave3.append(CreateDroppodGruntEvent(< -610.500000 , 1743.060059 , 93.156303 >,"",index++)) wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveEvent(6,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++)) @@ -264,7 +264,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -275,7 +275,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -292,7 +292,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -305,21 +305,21 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(12,index++)) wave3.append(CreateDroppodGruntEvent(< 4230.189941 , -366.312988 , 22.968800 >,"",0)) waveEvents.append(wave3) index = 1 array 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(CreateWaitUntilAliveEvent(6,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++)) @@ -332,7 +332,7 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.1400146,index++)) wave4.append(CreateDroppodSpectreMortarEvent(< 5542.589844 , 2078.189941 , -31.531300 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(6,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++)) @@ -341,50 +341,50 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.1600342,index++)) wave4.append(CreateDroppodSpectreMortarEvent(< 3754.719971 , -2589.250000 , -63.906300 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) @@ -393,7 +393,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -408,17 +408,17 @@ void function initFrontierDefenseData() wave4.append(CreateWaitForTimeEvent(1.4100342,index++)) wave4.append(CreateDroppodGruntEvent(< 3917.000000 , -2654.719971 , -81.468803 >,"",index++)) wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) @@ -435,7 +435,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -444,7 +444,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -459,7 +459,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -478,7 +478,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -511,7 +511,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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++)) @@ -532,20 +532,20 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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(CreateWaitUntilAliveEvent(6,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++)) From 88d765b41f4ff94c59fa535d53e708274fa22d26 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Wed, 13 Jul 2022 03:39:33 +0200 Subject: [PATCH 56/99] Basic Rise waves and Fix Nuke Titans doing Team Damage --- .../vscripts/gamemodes/_gamemode_fd.nut | 5 +- .../scripts/vscripts/mp/levels/mp_rise_fd.nut | 630 +++++++++++++++++- 2 files changed, 604 insertions(+), 31 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 8952c9158..aefb556b8 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -92,6 +92,9 @@ void function GamemodeFD_Init() //shop Callback SetBoostPurchaseCallback(FD_BoostPurchaseCallback) SetTeamReserveInteractCallback(FD_TeamReserveDepositOrWithdrawCallback) + + //earn meter + ScoreEvent_SetupEarnMeterValuesForMixedModes() } void function FD_BoostPurchaseCallback(entity player,BoostStoreData data) @@ -1033,9 +1036,9 @@ void function LoadEntities() } } } - AddStationaryAIPosition(< -12, 1720, 1456 >,4) ValidateAndFinalizePendingStationaryPositions() initNetVars() + SetTeam(GetTeamEnt(TEAM_IMC),TEAM_IMC) } 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 744859715..f1061a832 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 @@ -6,38 +6,608 @@ void function initFrontierDefenseData() shopPosition = < -5165.42, -679.285, 384.031> //only aproximate position - - array wave0 + int index = 1 array wave1 - array wave2 - array wave3 - array wave4 - - - - //wave0.append(createSmokeEvent(< -12, 1720, 1556>,30)) - // wave0.append(createSmokeEvent(< -64, 964, 1556>,30)) - // wave0.append(createWaitForTimeEvent(10)) - // wave0.append(createSuperSpectreEvent(< -64, 964, 1556>,<0,0,0>,"")) - - // for(int i = 0; i<2;i++){ - // wave0.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - // wave0.append(createWaitForTimeEvent(3)) - // } - // wave0.append(createWaitUntilAliveEvent(0)) - // for(int i = 0; i<3;i++){ - // wave1.append(createNukeTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - // wave1.append(createWaitForTimeEvent(3)) - // } - // wave1.append(createWaitUntilAliveEvent(0)) - // wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - - //wave0.append(createArcTitanEvent(< -12, 1720, 1556>,<0,0,0>,"hillRouteClose")) - // wave0.append(createDroppodStalkerEvent(< -12, 1720, 1556>,"")) - - waveEvents.append(wave0) + 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 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 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 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) -} \ No newline at end of file + index = 1 + array 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 From 7b166b56af07e3c15243fccfcc3aced991c73c08 Mon Sep 17 00:00:00 2001 From: x3Karma Date: Sat, 16 Jul 2022 05:58:12 +0800 Subject: [PATCH 57/99] why is there an extra } (#426) --- .../mod/scripts/vscripts/mp/levels/mp_wargames.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4a53c4fe7..d19d88eee 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut @@ -34,7 +34,7 @@ void function CodeCallback_MapInit() if(GameRules_GetGameMode()=="fd") initFrontierDefenseData() } -} + void function AddEvacNodes() { From 69976de61288fc2a83d531c1ccfd90801f884998 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 16 Jul 2022 01:00:06 +0200 Subject: [PATCH 58/99] Add missing bracket in mp_rise_fd --- .../mod/scripts/vscripts/mp/levels/mp_rise_fd.nut | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 f1061a832..c3fe53dbb 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 @@ -610,4 +610,6 @@ void function initFrontierDefenseData() 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 + waveEvents.append(wave5) + +} \ No newline at end of file From ee1644422ea43574aa1b151b75b482a623fe9410 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 17 Jul 2022 03:25:09 +0200 Subject: [PATCH 59/99] Add Revive to Turrets --- .../mod/scripts/vscripts/ai/_ai_turret.gnut | 47 +++++++++++++++++++ .../vscripts/gamemodes/_gamemode_fd.nut | 1 + .../gamemodes/_gamemode_fd_events.nut | 3 ++ .../vscripts/gamemodes/_gamemode_fd_nav.nut | 8 ++++ 4 files changed, 59 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut index 738133856..9d3aabbcc 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() function getRoute(string routeName) 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 From d0f226b23eae12e3b27199db673d45f37708d5fc Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 17 Jul 2022 04:40:03 +0200 Subject: [PATCH 60/99] Check if NPC is still valid in wait events Fixes #429 --- .../gamemodes/_gamemode_fd_events.nut | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index e5fda4674..39fdce22a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -1146,6 +1146,11 @@ void function waitUntilLessThanAmountAlive(int amount) int deduct = 0 foreach (entity npc in spawnedNPCs) { + if( !IsValid ) + { + deduct++ + continue + } if( IsValid( GetPetTitanOwner( npc ) ) ) { deduct++ @@ -1163,7 +1168,12 @@ void function waitUntilLessThanAmountAlive(int amount) WaitFrame() deduct = 0 foreach (entity npc in spawnedNPCs) - { + { + if( !IsValid ) + { + deduct++ + continue + } if( IsValid( GetPetTitanOwner( npc ) ) ) { deduct++ @@ -1187,7 +1197,10 @@ void function waitUntilLessThanAmountAliveWeighted(int amount,int humanWeight=1, int aliveNPCsWeighted = 0; foreach(npc in spawnedNPCs) - { + { + if(!IsValid(npc)) + continue + if( IsValid( GetPetTitanOwner( npc ) ) ) continue @@ -1207,8 +1220,11 @@ void function waitUntilLessThanAmountAliveWeighted(int amount,int humanWeight=1, aliveNPCsWeighted = 0; foreach(npc in spawnedNPCs) { + if(!IsValid(npc)) + continue + if( IsValid( GetPetTitanOwner( npc ) ) ) - continue + continue if(npc.GetTeam()==TEAM_MILITIA) continue From 78a92fdae360f610302a9766e381a0fd8a3e661a Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 17 Jul 2022 04:51:00 +0200 Subject: [PATCH 61/99] Fix d0f226b23eae12e3b27199db673d45f37708d5fc --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 39fdce22a..4ebbcf616 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -1146,7 +1146,7 @@ void function waitUntilLessThanAmountAlive(int amount) int deduct = 0 foreach (entity npc in spawnedNPCs) { - if( !IsValid ) + if( !IsValid(npc) ) { deduct++ continue @@ -1169,7 +1169,7 @@ void function waitUntilLessThanAmountAlive(int amount) deduct = 0 foreach (entity npc in spawnedNPCs) { - if( !IsValid ) + if( !IsValid(npc) ) { deduct++ continue From 7df82f8a57c17e6f25d024cbe9f2d695193fef53 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 17 Jul 2022 20:22:57 +0200 Subject: [PATCH 62/99] Fixed stalkers running with missing leg(s) --- .../mod/scripts/vscripts/ai/_ai_stalker.gnut | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut index 9ff479f95..0b4d6a9a8 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_stalker.gnut @@ -1,3 +1,4 @@ +untyped global function AiStalker_Init global function GetDeathForce global function StalkerGearOverloads @@ -168,7 +169,7 @@ void function StalkerSprint( entity npc, var damageInfo ) npc.EndSignal("OnDestroy") float damage = DamageInfo_GetDamage( damageInfo ) - if ( npc.GetHealth() - damage < 50 || npc.GetHealth() <= 80) + if (!IsCrawling(npc)&&( npc.GetHealth() - damage < 50 || npc.GetHealth() <= 80)) { entity weapon = npc.GetActiveWeapon() if (IsValid(weapon)) @@ -180,6 +181,7 @@ void function StalkerSprint( entity npc, var damageInfo ) npc.SetNoTarget( true ) npc.ClearMoveAnim() npc.SetMoveAnim("sp_spectre_sprint_F") + npc.s.isSprinting = true } } @@ -189,7 +191,7 @@ void function FDStalkerThink( entity npc, entity generator ) npc.EndSignal( "OnDestroy" ) generator.EndSignal( "OnDeath" ) generator.EndSignal( "OnDestroy" ) - bool isSprinting = false + npc.s.isSprinting <- false thread FDStalkerGetsStunned( npc , generator ) while ( IsAlive( npc ) ) { @@ -197,20 +199,23 @@ void function FDStalkerThink( entity npc, entity generator ) // 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 ( !IsCrawling( npc ) && DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (1800 * 1800) && !isSprinting ) + if ( DistanceSqr( npc.GetOrigin(), generator.GetOrigin() ) < (1800 * 1800) ) { - 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 + 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()) - isSprinting = true } // upped from 230 to more accurately mimic vanilla i think? @@ -230,6 +235,9 @@ void function FDStalkerGetsStunned( entity npc , entity generator ) 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. @@ -239,6 +247,7 @@ void function FDStalkerGetsStunned( entity npc , entity generator ) 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 ) From bcec5a5e9edd2a2af3a017ea4b250a9ba1112e6f Mon Sep 17 00:00:00 2001 From: BobTheBob9 Date: Sun, 17 Jul 2022 23:58:43 +0100 Subject: [PATCH 63/99] dont remove amped weapons after entering titans --- .../vscripts/burnmeter/_burnmeter.gnut | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut index 056f0313a..afa8ff3de 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut @@ -65,6 +65,7 @@ void function BurnMeter_Init() AddCallback_OnClientConnected( InitBurncardsForLateJoiner ) AddCallback_OnPlayerRespawned( StartPhaseRewindLifetime ) + AddCallback_OnPlayerRespawned( InitialisePermenantAmpedWeaponsForPlayer ) AddCallback_OnTitanBecomesPilot( RemoveAmpedWeaponsForTitanPilot ) // necessary signals @@ -82,16 +83,10 @@ void function BurnMeter_SetBoostRewardCount( string burnRef, int rewardCount ) file.boostRewardCount[burnRef] <- rewardCount } -int function BurnMeter_GetLimitedRewardCount( entity player, string burnRef = "" ) +int function BurnMeter_GetLimitedRewardCount( entity player ) { - // added burnRef as a parameter, used for dice roll - // means we dont call two lots of BurnReward_GetRandom() whilst also being able to give multiple items per dice roll (ticks) - if (burnRef == "") - { - EarnObject earnObject = PlayerEarnMeter_GetReward( player ) - burnRef = earnObject.ref - } - + EarnObject earnObject = PlayerEarnMeter_GetReward( player ) + string burnRef = earnObject.ref int limit = -1 int rewardCount = 1 @@ -339,9 +334,10 @@ void function PlayerUsesAmpedWeaponsBurncardThreaded( entity player ) void function RemoveAmpedWeaponsForTitanPilot( entity player, entity titan ) { - foreach ( entity weapon in player.GetMainWeapons() ) - foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) ) - weapon.RemoveMod( mod ) + if ( !( "hasPermenantAmpedWeapons" in player.s ) || !player.s.hasPermenantAmpedWeapons ) + foreach ( entity weapon in player.GetMainWeapons() ) + foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) ) + weapon.RemoveMod( mod ) } void function PlayerUsesSmartPistolBurncard( entity player ) @@ -514,8 +510,15 @@ void function PlayerUsesNukeBurncardThreaded( entity player ) thread TitanEjectPlayer( titan, true ) } +void function InitialisePermenantAmpedWeaponsForPlayer( entity player ) +{ + player.s.hasPermenantAmpedWeapons <- false +} + void function PlayerUsesPermanentAmpedWeaponsBurncard( entity player ) { + player.s.hasPermenantAmpedWeapons = true + array weapons = player.GetMainWeapons() //weapons.extend( player.GetOffhandWeapons() ) // idk? unsure of vanilla behaviour here foreach ( entity weapon in weapons ) From 3e72be3a9e6ef9a37981ea501684c9c1651f6b78 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 18 Jul 2022 17:35:48 +0200 Subject: [PATCH 64/99] Revert BurnMeter_getLimitedRewardCount changes --- .../mod/scripts/vscripts/burnmeter/_burnmeter.gnut | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut index afa8ff3de..7ff4bcf87 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut @@ -83,10 +83,16 @@ void function BurnMeter_SetBoostRewardCount( string burnRef, int rewardCount ) file.boostRewardCount[burnRef] <- rewardCount } -int function BurnMeter_GetLimitedRewardCount( entity player ) +int function BurnMeter_GetLimitedRewardCount( entity player, string burnRef = "" ) { - EarnObject earnObject = PlayerEarnMeter_GetReward( player ) - string burnRef = earnObject.ref + // added burnRef as a parameter, used for dice roll + // means we dont call two lots of BurnReward_GetRandom() whilst also being able to give multiple items per dice roll (ticks) + if (burnRef == "") + { + EarnObject earnObject = PlayerEarnMeter_GetReward( player ) + burnRef = earnObject.ref + } + int limit = -1 int rewardCount = 1 From c698f0a496793058e450cbfa72c3b939a6f4b1cc Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 21 Jul 2022 15:23:29 +0100 Subject: [PATCH 65/99] replaced shield captains with "shield captains" to match vanilla (#442) --- .../mod/scripts/vscripts/ai/_ai_spawn.gnut | 6 --- .../gamemodes/_gamemode_fd_events.nut | 39 +++++++++---------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut index 26ddf3ca8..8599f4294 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_spawn.gnut @@ -26,7 +26,6 @@ global function CreateRocketDroneGrunt global function CreateShieldDrone global function CreateShieldDroneGrunt global function CreateSoldier -global function CreateShieldCaptain global function CreateSpectre global function CreateStalker global function CreateStryder @@ -277,11 +276,6 @@ 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/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 4ebbcf616..e15fbfb62 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -730,49 +730,46 @@ void function spawnSuperSpectreWithMinion(SmokeEvent smokeEvent,SpawnEvent spawn } -void function spawnDroppodGrunts(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function spawnDroppodGrunts( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + 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> ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, < 0, 0, 0 > ) string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array 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> ) - + entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) - if(spawnEvent.entityGlobalKey!="") - GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy + 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) + guy.DisableNPCFlag( NPC_ALLOW_PATROL ) DispatchSpawn( guy ) + // should this grunt be a shield captain? + if (i < GetCurrentPlaylistVarInt( "fd_grunt_shield_captains", 0 ) ) + thread ActivatePersonalShield( 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)) + 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? + guy.GiveWeapon( "mp_weapon_defender" ) // do grunts ever get a different anti titan weapon? - yes, TODO + // atm they arent using their AT weapons ever, but they do in fact get them, in fact some grunts are getting 2 since they already get a rocket_launcher + // this seems to be a problem elsewhere as opposed to something that is wrong here } - SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.GRUNT)) - AddMinimapForHumans(guy) - spawnedNPCs.append(guy) + SetTargetName( guy, GetTargetNameForID( eFD_AITypeIDs.GRUNT ) ) // do shield captains get their own target name in vanilla? + AddMinimapForHumans( guy ) + spawnedNPCs.append( guy ) guys.append( guy ) } From 5cee2bd32aa30dbc6011889c2ae3594a9468dcb3 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 21 Jul 2022 15:24:05 +0100 Subject: [PATCH 66/99] Add mortar spectre logic (no anims) (#441) --- .../vscripts/ai/_ai_mortar_spectres.gnut | 225 +++++++++++++++++- .../vscripts/ai/_ai_mortar_titans.gnut | 4 +- .../vscripts/ai/_ai_sniper_titans.gnut | 4 +- .../gamemodes/_gamemode_fd_events.nut | 24 +- 4 files changed, 241 insertions(+), 16 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut index 080e2f68c..8abd7c719 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut @@ -1,7 +1,228 @@ +untyped + global function MortarSpectreGetSquadFiringPositions +global function MortarSpectreSquadThink + +global function SpectresPlayAnim + +const float MORTAR_SPECTRE_ABORT_ATTACK_HEALTH_FRAC = 0.50 // will stop mortar attack if any of the spectres health gets below 50% of their current health. +const float MORTAR_SPECTRE_POSITION_SEARCH_RANGE = 6144 //3072 // How far away from their spawn point a mortar spectre squad will look for positions to mortar from. +const float MORTAR_SPECTRE_ENGAGE_DELAY = 3.0 // How long before a mortar spectre squad start to attack the generator if interrupted getting to their mortar position. +const float MORTAR_SPECTRE_REENGAGE_DELAY = 7.0 // How long before a mortar spectre squad goes back to attacking the generator after breaking of an attack. + +const float MORTAR_SPECTRE_TRACKER_SHIELD_MAX = 1000.0 // just using 1000 for now, doesnt really matter as long as the shieldFrac is accurate enough + +const array MORTAR_SPECTRE_POSITION_OFFSETS = [ < 60, 0, 0 >, < 0, 60, 0 >, < -60, 0, 0 >, < 0, -60, 0 > ] // guessing + array function MortarSpectreGetSquadFiringPositions( vector origin, vector testTarget ) { - array< vector > ret + array ret + foreach ( vector position in MORTAR_SPECTRE_POSITION_OFFSETS ) + { + ret.append( OriginToGround( testTarget + position + < 0, 0, 100 > ) ) // offsetting by 100 up so that OriginToGround doesnt put it down a floor + } return ret -} \ No newline at end of file +} + +// -------------------------------------------------------------------- +// MORTAR SPECTRE LOGIC +// -------------------------------------------------------------------- + +void function MortarSpectreSquadThink( array< entity > spectres, entity harvester ) +{ + if ( spectres.len() == 0) + return + + // get the closest available stationary position for mortar spectres + StationaryAIPosition ornull mortarPosition = GetClosestAvailableStationaryPosition( /* spectres[0] isnt ideal but the spectres all spawn in the same position atm */ spectres[0].GetOrigin(), MORTAR_SPECTRE_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_SPECTRE ) + while ( mortarPosition == null ) + { + // in case all stationary spectre positions are in use wait for one to become available + wait 5 + // should change this to use an average position or the start position or something but for now this is fine + mortarPosition = GetClosestAvailableStationaryPosition( spectres[0].GetOrigin(), MORTAR_SPECTRE_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_SPECTRE ) + } + // create the entity responsible for managing this squad of spectres + // note: client shows the ui thing for this entity if the y angle is not 0 + // it also shows the set up time thing based on the shield frac of the entity? weird + entity squadMarker = CreatePropScript( $"models/dev/empty_model.mdl", expect StationaryAIPosition( mortarPosition ).origin + < 0, 0, 150 >, < 0, 1, 0 > ) + SetTargetName( squadMarker, "mortarPosition" ) + squadMarker.SetShieldHealthMax( MORTAR_SPECTRE_TRACKER_SHIELD_MAX ) + squadMarker.Minimap_SetCustomState( eMinimapObject_prop_script.FD_MORTAR_POSITION ) + + thread MortarSpectreSquadDeathThink( spectres, squadMarker ) + + // wait until at least 1 spectre has reached their position + int i = 0 + foreach( entity spectre in spectres ) + { + thread MortarSpectreMoveToMortarPosition( spectre, squadMarker, OriginToGround( expect StationaryAIPosition( mortarPosition ).origin + MORTAR_SPECTRE_POSITION_OFFSETS[i] + < 0, 0, 100 > ) ) + + if ( i++ >= MORTAR_SPECTRE_POSITION_OFFSETS.len() ) + { + i = 0 + } + } + squadMarker.WaitSignal( "BeginMortarAttack" ) + // show the ui thing + squadMarker.SetAngles( < 0, 0, 0 > ) + // start the setup timer + float setupEndTime = Time() + GetCurrentPlaylistVarFloat( "fd_mortar_spectre_setup_time", 5 ) // default to 5 seconds + // wait for setup timer + while ( Time() < setupEndTime ) + { + WaitFrame() + float timeRemainingFrac = ( setupEndTime - Time() ) / GetCurrentPlaylistVarFloat( "fd_mortar_spectre_setup_time", 5 ) // default to 5 seconds + squadMarker.SetShieldHealth( ( 1 - timeRemainingFrac ) * MORTAR_SPECTRE_TRACKER_SHIELD_MAX ) + } + + + if ( GetCurrentPlaylistVarFloat( "fd_grunt_shield_captains", 1 ) ) // idk if correct or not? doest seem to be a playlist var for mortar spectre shield + { + // create shield here + + } + + foreach( entity spectre in spectres ) + { + thread MortarSpectreAttack( spectre, harvester, squadMarker ) + } +} + +void function MortarSpectreAttack( entity spectre, entity harvester, entity signaler ) +{ + spectre.EndSignal( "OnSyncedMeleeVictim" ) + spectre.EndSignal( "OnDeath" ) + spectre.EndSignal( "OnDestroy" ) + + string originalWeaponClassName + array originalWeaponMods + + spectre.ai.mortarTarget = harvester + + thread MortarSpectreInterruptThink( spectre, harvester, signaler ) + + while( true ) + { + entity weapon = spectre.GetActiveWeapon() + + while ( weapon.IsWeaponOffhand() ) + { + WaitFrame() + weapon = spectre.GetActiveWeapon() + } + originalWeaponClassName = weapon.GetWeaponClassName() + originalWeaponMods = weapon.GetMods() + + spectre.TakeWeaponNow( weapon.GetWeaponClassName() ) + spectre.GiveWeapon( "mp_weapon_rocket_launcher", [ "fd_mortar_mode" ] ) + thread MortarSpectreAttacksHarvester( spectre, harvester, signaler ) + + spectre.WaitSignal( "InterruptMortarAttack" ) + + spectre.TakeWeaponNow( "mp_weapon_rocket_launcher" ) + spectre.GiveWeapon( originalWeaponClassName, originalWeaponMods ) + + + wait MORTAR_SPECTRE_REENGAGE_DELAY + } +} + +// this should hopefully be replaced with an animation that fires the mortar rockets properly, but i cant find it, so this will have to do +void function MortarSpectreAttacksHarvester( entity spectre, entity harvester, entity signaler ) +{ + spectre.EndSignal( "InterruptMortarAttack" ) + spectre.EndSignal( "OnSyncedMeleeVictim" ) + spectre.EndSignal( "OnDeath" ) + spectre.EndSignal( "OnDestroy" ) + + entity weapon = spectre.GetActiveWeapon() + wait RandomFloatRange( 0, 4 ) // this is a complete guess, idk how long it takes for them to shoot normally + while ( true ) + { + entity missile = weapon.FireWeaponMissile( spectre.GetOrigin(), < 0, 0, 90 >, 1800.0, damageTypes.projectileImpact, damageTypes.explosive, false, PROJECTILE_NOT_PREDICTED ) + weapon.SetWeaponPrimaryAmmoCount( weapon.GetWeaponPrimaryAmmoCount() - 1 ) // remove the ammo manually + MortarMissileFiredCallback( missile, spectre ) + wait RandomFloatRange( 6, 10 ) // this is a complete guess, idk how long it takes for them to shoot normally + } +} + +void function MortarSpectreSquadDeathThink( array< entity > spectres, entity signaler ) +{ + int numAlive = spectres.len() // assume all alive at start + while ( numAlive != 0 ) + { + WaitFrame() + numAlive = spectres.len() + foreach ( entity spectre in spectres ) + { + if ( IsValid( spectre ) && IsAlive( spectre ) ) + continue + numAlive-- + } + } + signaler.Destroy() +} + +void function MortarSpectreMoveToMortarPosition( entity spectre, entity signaler, vector position ) +{ + spectre.EndSignal( "OnSyncedMeleeVictim" ) + spectre.EndSignal( "OnDeath" ) + spectre.EndSignal( "OnDestroy" ) + + spectre.AssaultPoint( position ) + spectre.AssaultSetGoalRadius( spectre.GetMinGoalRadius() ) + spectre.AssaultSetFightRadius( 0 ) + + table result = spectre.WaitSignal( "OnFinishedAssault", "OnFailedToPath" ) + if ( result.signal == "OnFinishedAssault" ) + signaler.Signal( "BeginMortarAttack" ) +} + +void function MortarSpectreInterruptThink( entity spectre, entity harvester, entity signaler ) +{ + spectre.EndSignal( "OnSyncedMeleeVictim" ) + spectre.EndSignal( "OnDeath" ) + spectre.EndSignal( "OnDestroy" ) + + float oldHealth = spectre.GetHealth().tofloat() + + while ( true ) + { + WaitFrame() + // check if we have taken enough damage to warrant an interruption, and we are close enough to the mortar position + if ( spectre.GetHealth().tofloat() / oldHealth < MORTAR_SPECTRE_ABORT_ATTACK_HEALTH_FRAC && Distance2D( spectre.GetOrigin(), signaler.GetOrigin() ) <= 80 ) // random magic 80 for now + { + oldHealth = spectre.GetHealth().tofloat() + spectre.Signal( "InterruptMortarAttack" ) + continue + } + + if ( IsValid( spectre.GetEnemy() ) && spectre.CanSee( spectre.GetEnemy() ) && !IsCloaked( spectre.GetEnemy() ) ) + { + oldHealth = spectre.GetHealth().tofloat() + spectre.Signal( "InterruptMortarAttack" ) + } + } +} + +void function SpectresPlayAnim( string anim ) +{ + foreach (entity spectre in GetNPCArrayByClass("npc_spectre")) + { + thread thing( anim, spectre) + } +} + +void function thing( string anim, entity spectre ) +{ + try + { + PlayAnim( spectre, anim) + } + catch (ex) + { + print(ex) + } +} 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 fe46aac5d..f23c05f90 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_titans.gnut @@ -304,12 +304,12 @@ void function MortarTitanThink( entity titan, entity generator ) WaitTillHotDropComplete( titan ) float minEngagementDuration = 5 - StationaryAIPosition ornull mortarPosition = GetRandomStationaryPosition( titan.GetOrigin(), MORTAR_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_TITAN ) + StationaryAIPosition ornull mortarPosition = GetClosestAvailableStationaryPosition( titan.GetOrigin(), MORTAR_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_TITAN ) while ( mortarPosition == null ) { // incase all stationary titan positions are in use wait for one to become available wait 5 - mortarPosition = GetRandomStationaryPosition( titan.GetOrigin(), MORTAR_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_TITAN ) + mortarPosition = GetClosestAvailableStationaryPosition( titan.GetOrigin(), MORTAR_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.MORTAR_TITAN ) } expect StationaryAIPosition( mortarPosition ) 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 714994311..c09154f4e 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut @@ -62,12 +62,12 @@ void function SniperTitanThink( entity titan, entity generator) WaitTillHotDropComplete( titan ) float minEngagementDuration = 5 - StationaryAIPosition ornull sniperPosition = GetRandomStationaryPosition( titan.GetOrigin(), SNIPER_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.SNIPER_TITAN ) + StationaryAIPosition ornull sniperPosition = GetClosestAvailableStationaryPosition( 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 ) + sniperPosition = GetClosestAvailableStationaryPosition( titan.GetOrigin(), SNIPER_TITAN_POSITION_SEARCH_RANGE, eStationaryAIPositionTypes.SNIPER_TITAN ) } expect StationaryAIPosition( sniperPosition ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index e15fbfb62..d69b17fd0 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -856,11 +856,12 @@ void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEv for ( int i = 0; i < 4; i++ ) { entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + SetSpawnOption_AISettings(guy, "npc_spectre_mortar") if(spawnEvent.entityGlobalKey!="") GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy SetTeam( guy, TEAM_IMC ) DispatchSpawn( guy ) - + spawnedNPCs.append(guy) SetSquad( guy, squadName ) SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.SPECTRE_MORTAR)) AddMinimapForHumans(guy) @@ -868,6 +869,9 @@ void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEv } ActivateFireteamDropPod( pod, guys ) + + thread MortarSpectreSquadThink( guys, fd_harvester.harvester ) + } void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) @@ -1138,10 +1142,10 @@ void function PingMinimap(float x, float y, float duration, float spreadRadius, } } -void function waitUntilLessThanAmountAlive(int amount) +void function waitUntilLessThanAmountAlive( int amount ) { int deduct = 0 - foreach (entity npc in spawnedNPCs) + foreach ( entity npc in spawnedNPCs ) { if( !IsValid(npc) ) { @@ -1153,20 +1157,20 @@ void function waitUntilLessThanAmountAlive(int amount) deduct++ continue } - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) { deduct++ continue } } int aliveNPCs = spawnedNPCs.len() -deduct - while(aliveNPCs>amount) + while ( aliveNPCs>amount ) { WaitFrame() deduct = 0 - foreach (entity npc in spawnedNPCs) - { - if( !IsValid(npc) ) + foreach ( entity npc in spawnedNPCs ) + { + if ( !IsValid( npc ) ) { deduct++ continue @@ -1176,7 +1180,7 @@ void function waitUntilLessThanAmountAlive(int amount) deduct++ continue } - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) { deduct++ continue @@ -1184,7 +1188,7 @@ void function waitUntilLessThanAmountAlive(int amount) } aliveNPCs = spawnedNPCs.len() -deduct - if(!IsAlive(fd_harvester.harvester)) + if ( !IsAlive( fd_harvester.harvester ) ) return } } From 39e75408ca8884078424f20ae01d038bb1aaec79 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 21 Jul 2022 20:57:22 +0100 Subject: [PATCH 67/99] [FD] Quick mortar spectre fix (#443) --- .../mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut index 8abd7c719..13cbde6b1 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut @@ -86,7 +86,8 @@ void function MortarSpectreSquadThink( array< entity > spectres, entity harveste foreach( entity spectre in spectres ) { - thread MortarSpectreAttack( spectre, harvester, squadMarker ) + if ( IsValid( spectre ) ) + thread MortarSpectreAttack( spectre, harvester, squadMarker ) } } From ef5c3d408ddf8fd64445e30b3106543a9a925baa Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 21 Jul 2022 23:00:41 +0100 Subject: [PATCH 68/99] [FD] Fixing another mortar spectre crash (#444) --- .../mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut index 13cbde6b1..df391a88f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut @@ -72,9 +72,13 @@ void function MortarSpectreSquadThink( array< entity > spectres, entity harveste // wait for setup timer while ( Time() < setupEndTime ) { - WaitFrame() + if ( !IsValid( squadMarker ) ) + { + break + } float timeRemainingFrac = ( setupEndTime - Time() ) / GetCurrentPlaylistVarFloat( "fd_mortar_spectre_setup_time", 5 ) // default to 5 seconds squadMarker.SetShieldHealth( ( 1 - timeRemainingFrac ) * MORTAR_SPECTRE_TRACKER_SHIELD_MAX ) + WaitFrame() } From 3376f726e962b97d798b3a7e7f03ccfe45cfe971 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Fri, 22 Jul 2022 00:11:40 +0200 Subject: [PATCH 69/99] Fix Turret dying Fix Turret when Damage was exactly Health Some Formatting fixes --- .../mod/scripts/vscripts/ai/_ai_turret.gnut | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut index 9d3aabbcc..5961d8399 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut @@ -26,31 +26,31 @@ void function SetUsePromptForPanel( var panel, var turret ) } -void function RevivableTurret_DamageCallback(entity turret,var damageInfo) +void function RevivableTurret_DamageCallback( entity turret, var damageInfo ) { - if(turret.GetHealth() Date: Fri, 22 Jul 2022 00:11:50 +0100 Subject: [PATCH 70/99] potentially fix nuke titan crash? (#445) --- .../mod/scripts/vscripts/ai/_ai_nuke_titans.gnut | 3 +++ 1 file changed, 3 insertions(+) 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 2626abe15..1e8ec3168 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_nuke_titans.gnut @@ -33,6 +33,9 @@ void function NukeTitanSeekOutGenerator( entity titan, entity generator ) titan.EndSignal( "OnDeath" ) titan.EndSignal( "OnDestroy" ) titan.EndSignal( "Doomed" ) + // should fix crash with invalid generator? + generator.EndSignal( "OnDeath" ) + generator.EndSignal( "OnDestroy" ) WaitSignal( titan, "FD_ReachedHarvester", "OnFailedToPath" ) From 2275aceea6d8f3db04b1b9de2d9556cb7554d373 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 22 Jul 2022 22:13:02 +0100 Subject: [PATCH 71/99] [FD] More Mortar Spectre fixes (#449) * Some more IsValid checks for mortar spectres * check to make sure spectre actually has a weapon --- .../scripts/vscripts/ai/_ai_mortar_spectres.gnut | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut index df391a88f..a136c2c9c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut @@ -110,13 +110,12 @@ void function MortarSpectreAttack( entity spectre, entity harvester, entity sign while( true ) { - entity weapon = spectre.GetActiveWeapon() - - while ( weapon.IsWeaponOffhand() ) - { - WaitFrame() - weapon = spectre.GetActiveWeapon() - } + array weapons = spectre.GetMainWeapons() + if ( weapons.len() == 0 ) + break + entity weapon = weapons[0] + if ( !IsValid( weapon ) ) + break originalWeaponClassName = weapon.GetWeaponClassName() originalWeaponMods = weapon.GetMods() @@ -131,6 +130,8 @@ void function MortarSpectreAttack( entity spectre, entity harvester, entity sign wait MORTAR_SPECTRE_REENGAGE_DELAY + if ( !IsValid( spectre ) ) + break } } From 92e0c79759e4388320f565f3922ff5608aff19d6 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sat, 23 Jul 2022 15:25:07 +0100 Subject: [PATCH 72/99] [FD] Tick Improvements (#450) * Format SpawnTick and disable flag that broke stuff * Fixed ticks not counting down on death * Make ticks more aggressive towards players --- .../vscripts/gamemodes/_gamemode_fd.nut | 14 +++++++++++++ .../gamemodes/_gamemode_fd_events.nut | 21 +++++++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 068a41f0f..d630cbed0 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -85,6 +85,7 @@ void function GamemodeFD_Init() //death Callbacks AddCallback_OnNPCKilled(OnNpcDeath) AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddDeathCallback( "npc_frag_drone", OnTickDeath ) // ticks dont come up in the other callback because of course they dont //Command Callbacks AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) @@ -183,6 +184,19 @@ void function SetTurretSettings_threaded(entity player) DeployableTurret_SetAISettingsForPlayer_AT(player,"npc_turret_sentry_burn_card_at_fd") } +void function OnTickDeath( entity victim, var damageInfo ) +{ + int findIndex = spawnedNPCs.find( victim ) + if ( findIndex != -1 ) + { + spawnedNPCs.remove( findIndex ) + + SetGlobalNetInt( "FD_AICount_Ticks", GetGlobalNetInt( "FD_AICount_Ticks" ) -1 ) + + SetGlobalNetInt( "FD_AICount_Current", GetGlobalNetInt( "FD_AICount_Current" ) -1 ) + } +} + void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { if(victim.IsTitan()&&attacker in file.players) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index d69b17fd0..8792a8613 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -1088,9 +1088,9 @@ void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,Fl AddMinimapForHumans(npc) } -void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function SpawnTick( SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent ) { - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + 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 ) @@ -1102,23 +1102,22 @@ void function SpawnTick(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControl 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") + 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)) + AddMinimapForHumans( guy ) + SetTargetName( guy, GetTargetNameForID( eFD_AITypeIDs.TICK ) ) SetSquad( guy, squadName ) - spawnedNPCs.append(guy) - + spawnedNPCs.append( guy ) + guy.AssaultSetFightRadius( expect int( guy.Dev_GetAISettingByKeyField("LookDistDefault_Combat") ) ) // make the ticks target players very aggressively guys.append( guy ) } ActivateFireteamDropPod( pod, guys ) - thread SquadNav_Thread(guys,spawnEvent.route) + thread SquadNav_Thread( guys, spawnEvent.route ) } From 14ee2ce0a4fcee0e9f2afce87936016cd8b72568 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sat, 23 Jul 2022 20:43:49 +0100 Subject: [PATCH 73/99] [FD] Forwardbase Kodai improvements + attempt to stop AI from clipping into the harvester (#452) * Change Kodai to use weighted events and cloak drones * Set Kodai drones to not loop their route * Stop AI from clipping into the harvester Not perfect, but now at least they clip into it less, and dont stay in it --- .../mod/scripts/vscripts/_harvester.gnut | 7 +- .../gamemodes/_gamemode_fd_events.nut | 6 +- .../mp/levels/mp_forwardbase_kodai_fd.nut | 108 +++++++++--------- 3 files changed, 64 insertions(+), 57 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 6b0fb7e4c..e2acd1bd9 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -25,8 +25,13 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i harvester.SetShieldHealthMax(shieldHealth) harvester.SetShieldHealth(shieldHealth) harvester.EnableAttackableByAI( 30, 0, AI_AP_FLAG_NONE ) - //harvester.SetIsValidAIMeleeTarget(false) + SetObjectCanBeMeleed( harvester, false ) SetTeam(harvester,team) + // create dangerous area to all AI because we dont want any AI clipping into the harvester ever + // radius of 90 cos thats like 7.5 metres? AI shouldnt rally need to get closer than that (except nuke titans and stalkers) + // stalkers dont care about dangerous areas + // nuke titan detonation radius is larger than 90 + AI_CreateDangerousArea_Static( harvester, null, 90, TEAM_INVALID, true, true, origin ) DispatchSpawn( harvester ) SetGlobalNetEnt("FD_activeHarvester",harvester) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 8792a8613..5b641ee81 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -41,6 +41,7 @@ global struct SpawnEvent{ string npcClassName string aiSettings string entityGlobalKey + bool shouldLoop = false } global struct FlowControlEvent{ @@ -542,7 +543,7 @@ WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int n event.flowControlEvent.waitEntityType = aiTypeId return event } -WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string route,int nextEventIndex, bool shouldLoop = true, int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event event.eventFunction = spawnDrones @@ -554,6 +555,7 @@ WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string rout event.spawnEvent.origin = origin event.spawnEvent.entityGlobalKey = entityGlobalKey event.spawnEvent.route = route + event.spawnEvent.shouldLoop = shouldLoop return event } @@ -613,7 +615,7 @@ void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowContro SetTargetName( guy, GetTargetNameForID(eFD_AITypeIDs.DRONE)) AddMinimapForHumans(guy) spawnedNPCs.append(guy) - thread droneNav_thread(guy, spawnEvent.route, 0, 500, true) + thread droneNav_thread(guy, spawnEvent.route, 0, 500, spawnEvent.shouldLoop) } 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 b1c67fd68..186b85fc4 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 @@ -16,7 +16,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(8,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)) @@ -27,7 +27,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(8,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)) @@ -38,7 +38,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(8,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)) @@ -49,7 +49,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(8,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)) @@ -60,7 +60,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(8,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)) @@ -78,7 +78,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(12,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)) @@ -89,7 +89,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -98,7 +98,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -109,7 +109,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -120,15 +120,15 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -137,14 +137,14 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -153,12 +153,12 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -167,12 +167,12 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -185,15 +185,15 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -205,7 +205,7 @@ void function initFrontierDefenseData() array 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(CreateCloakDroneEvent(< 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)) @@ -215,7 +215,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -224,7 +224,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -233,16 +233,16 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,31)) + wave3.append(CreateSpawnDroneEvent(< 2487.310059 , -2561.379883 , 5744.229980 >,< 0.004999 , 90.003700 , 0.000004 >,"",32, false)) wave3.append(CreateWaitForTimeEvent(0.0,33)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",34)) + wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",34, false)) wave3.append(CreateWaitForTimeEvent(0.0,35)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",36)) + wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",36, false)) wave3.append(CreateWaitForTimeEvent(0.0,37)) - wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",38)) + wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",38, false)) wave3.append(CreateWaitForTimeEvent(5.0,39)) - wave3.append(CreateWaitUntilAliveEvent(4,40)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -255,7 +255,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -264,7 +264,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -289,16 +289,16 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 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(CreateCloakDroneEvent(< 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -326,7 +326,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -355,7 +355,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -378,7 +378,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -399,7 +399,7 @@ void function initFrontierDefenseData() 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(CreateCloakDroneEvent(< 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)) @@ -409,7 +409,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -429,7 +429,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -438,7 +438,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -463,12 +463,12 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -495,14 +495,14 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -519,19 +519,19 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 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)) @@ -541,14 +541,14 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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)) @@ -561,7 +561,7 @@ void function initFrontierDefenseData() 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(CreateWaitUntilAliveWeightedEvent(16,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)) From d420367d429e6a4f21d4b7661ac4a19ac1c3420b Mon Sep 17 00:00:00 2001 From: Maya Date: Sun, 24 Jul 2022 19:53:10 +0200 Subject: [PATCH 74/99] [FD]Formatting Frontier Defense Gamemode Files (#439) * Formatting Frontier Defense Gamemode Files Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Co-authored-by: x3Karma --- .../mod/scripts/vscripts/_harvester.gnut | 28 +- .../scripts/vscripts/ai/_ai_emp_titans.gnut | 14 +- .../ai/_ai_stationary_firing_positions.gnut | 41 +- .../vscripts/gamemodes/_gamemode_fd.nut | 680 +++++++++--------- .../gamemodes/_gamemode_fd_events.nut | 623 ++++++++-------- .../vscripts/gamemodes/_gamemode_fd_nav.nut | 56 +- .../vscripts/mp/levels/mp_angel_city.nut | 4 +- .../mp/levels/mp_black_water_canal.nut | 4 +- .../vscripts/mp/levels/mp_colony02.nut | 10 +- .../scripts/vscripts/mp/levels/mp_drydock.nut | 4 +- .../mp/levels/mp_forwardbase_kodai.nut | 5 +- .../scripts/vscripts/mp/levels/mp_glitch.nut | 4 +- .../scripts/vscripts/mp/levels/mp_grave.nut | 2 +- .../vscripts/mp/levels/mp_homestead.nut | 6 +- .../scripts/vscripts/mp/levels/mp_relic02.nut | 4 +- .../scripts/vscripts/mp/levels/mp_rise.nut | 5 +- .../scripts/vscripts/mp/levels/mp_thaw.nut | 4 +- .../vscripts/mp/levels/mp_wargames.nut | 4 +- 18 files changed, 756 insertions(+), 742 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index e2acd1bd9..4e381031a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -12,7 +12,7 @@ global struct HarvesterStruct { } -HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,int shieldHealth,int team) +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" ) @@ -20,10 +20,10 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i harvester.SetAngles( angles ) harvester.kv.solid = SOLID_VPHYSICS - harvester.SetMaxHealth(health) - harvester.SetHealth(health) - harvester.SetShieldHealthMax(shieldHealth) - harvester.SetShieldHealth(shieldHealth) + harvester.SetMaxHealth( health ) + harvester.SetHealth( health ) + harvester.SetShieldHealthMax( shieldHealth ) + harvester.SetShieldHealth( shieldHealth ) harvester.EnableAttackableByAI( 30, 0, AI_AP_FLAG_NONE ) SetObjectCanBeMeleed( harvester, false ) SetTeam(harvester,team) @@ -34,15 +34,15 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i AI_CreateDangerousArea_Static( harvester, null, 90, TEAM_INVALID, true, true, origin ) DispatchSpawn( harvester ) - SetGlobalNetEnt("FD_activeHarvester",harvester) + SetGlobalNetEnt( "FD_activeHarvester", harvester ) - entity blackbox = CreatePropDynamic(MODEL_HARVESTER_TOWER_COLLISION,origin,angles,0) + 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) + entity rings = CreatePropDynamic( MODEL_HARVESTER_TOWER_RINGS, origin, angles, 6 ) thread PlayAnim( rings, "generator_cycle_fast" ) @@ -55,19 +55,19 @@ HarvesterStruct function SpawnHarvester(vector origin,vector angles,int health,i return ret } -HarvesterStruct function generateBeamFX(HarvesterStruct harvester) +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) ) + 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) +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) ) + 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_emp_titans.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut index 8fde43439..2792d617b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_emp_titans.gnut @@ -38,7 +38,7 @@ void function EMPTitanThinkConstant( entity titan ) //Used to identify this titan as an arc titan // SetTargetName( titan, "empTitan" ) // unable to do this due to FD reasons - file.empTitans.append(titan) + file.empTitans.append( titan ) //Wait for titan to stand up and exit bubble shield before deploying arc ability. WaitTillHotDropComplete( titan ) @@ -95,8 +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)) + if (file.empTitans.find( titan ) ) + file.empTitans.remove( file.empTitans.find( titan ) ) } foreach ( particleSystem in particles ) @@ -117,7 +117,7 @@ void function EMPTitanThinkConstant( entity titan ) { origin = titan.GetAttachmentOrigin( attachID ) - RadiusDamage( + RadiusDamage( origin, // center titan, // attacker titan, // inflictor @@ -143,7 +143,7 @@ void function EmpField_DamagedEntity( entity target, var damageInfo ) entity titan = DamageInfo_GetAttacker( damageInfo ) if ( !IsValid( titan ) ) - return + return local className = target.GetClassName() if ( className == "rpg_missile" || className == "npc_turret_sentry" || className == "grenade" ) @@ -189,7 +189,7 @@ string function GetEMPAttachmentForTitan( entity titan ) return "hijack" } -bool function IsEMPTitan(entity titan) +bool function IsEMPTitan( entity titan ) { - return file.empTitans.find(titan) != -1 ? true : false + return file.empTitans.find( titan ) != -1 ? true : false } 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 2e7c938e4..430de58a7 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 @@ -262,36 +262,41 @@ int function DistanceCompareClosestForStationaryAIPosition( ArrayDistanceEntryFo } -void function DebugDrawStationaryAiPositions(int typeMask){ - thread DebugDrawStationaryAiPositions_thread(typeMask) +void function DebugDrawStationaryAiPositions( int typeMask ) +{ + thread DebugDrawStationaryAiPositions_thread( typeMask ) } -void function DebugDrawStationaryAiPositions_thread(int typeMask) -{ while(true) +void function DebugDrawStationaryAiPositions_thread( int typeMask ) +{ + while( true ) { - for(int i = 0;i<4;i++){ - if((1< -global table > routes +global vector shopAngles = < 0, 0, 0 > +global table< string, array > routes global array routeNodes global array spawnedNPCs @@ -52,27 +52,27 @@ void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) PrecacheModel( $"models/humans/grunts/imc_grunt_shield_captain.mdl" ) - PrecacheParticleSystem($"P_smokescreen_FD") + PrecacheParticleSystem( $"P_smokescreen_FD" ) RegisterSignal( "SniperSwitchedEnemy" ) // for use in SniperTitanThink behavior. - RegisterSignal("FD_ReachedHarvester") - RegisterSignal("OnFailedToPath") + RegisterSignal( "FD_ReachedHarvester" ) + RegisterSignal( "OnFailedToPath" ) - SetRoundBased(true) - SetShouldUseRoundWinningKillReplay(false) + SetRoundBased( true ) + SetShouldUseRoundWinningKillReplay( false ) Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) - PlayerEarnMeter_SetEnabled(false) + 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) + 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) + AddDamageByCallback( "player", FD_DamageByPlayerCallback) AddDamageCallback( "player", DamageScaleByDifficulty ) AddDamageCallback( "npc_titan", DamageScaleByDifficulty ) AddDamageCallback( "npc_turret_sentry", DamageScaleByDifficulty ) @@ -83,38 +83,38 @@ void function GamemodeFD_Init() AddSpawnCallback( "player", FD_PlayerRespawnCallback ) AddSpawnCallback("npc_turret_sentry", AddTurretSentry ) //death Callbacks - AddCallback_OnNPCKilled(OnNpcDeath) - AddCallback_OnPlayerKilled(GamemodeFD_OnPlayerKilled) + AddCallback_OnNPCKilled( OnNpcDeath ) + AddCallback_OnPlayerKilled( GamemodeFD_OnPlayerKilled ) AddDeathCallback( "npc_frag_drone", OnTickDeath ) // ticks dont come up in the other callback because of course they dont //Command Callbacks - AddClientCommandCallback("FD_ToggleReady",ClientCommandCallbackToggleReady) - AddClientCommandCallback("FD_UseHarvesterShieldBoost",useShieldBoost) + AddClientCommandCallback( "FD_ToggleReady", ClientCommandCallbackToggleReady ) + AddClientCommandCallback( "FD_UseHarvesterShieldBoost", useShieldBoost ) //shop Callback - SetBoostPurchaseCallback(FD_BoostPurchaseCallback) - SetTeamReserveInteractCallback(FD_TeamReserveDepositOrWithdrawCallback) + SetBoostPurchaseCallback( FD_BoostPurchaseCallback ) + SetTeamReserveInteractCallback( FD_TeamReserveDepositOrWithdrawCallback ) //earn meter ScoreEvent_SetupEarnMeterValuesForMixedModes() } -void function FD_BoostPurchaseCallback(entity player,BoostStoreData data) +void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) { file.players[player].moneySpend += data.cost } -void function FD_PlayerRespawnCallback(entity player) +void function FD_PlayerRespawnCallback( entity player ) { - if(player in file.players) + 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) +void function FD_TeamReserveDepositOrWithdrawCallback( entity player, string action, int amount ) { - switch(action) + switch( action ) { case"deposit": file.players[player].moneyShared += amount @@ -124,64 +124,64 @@ void function FD_TeamReserveDepositOrWithdrawCallback(entity player, string acti break } } -void function GamemodeFD_OnPlayerKilled(entity victim, entity attacker, var damageInfo) +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 militiaplayers = GetPlayerArrayOfTeam( TEAM_MILITIA ) int deaths = 0 - foreach (entity player in militiaplayers) - if (!IsAlive(player)) + foreach ( entity player in militiaplayers ) + if ( !IsAlive( player ) ) deaths++ foreach( entity player in GetPlayerArray() ) { - if (player == victim || player.GetTeam() != TEAM_MILITIA) + if ( player == victim || player.GetTeam() != TEAM_MILITIA ) continue - if (deaths == 1) // only one pilot died + 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 + 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 + 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) +void function FD_UsedCoreCallback( entity titan, entity weapon ) { - if(!(titan in file.players)) + if( !( titan in file.players ) ) { return } file.players[titan].coresUsed += 1 } -void function GamemodeFD_InitPlayer(entity player) +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) + thread SetTurretSettings_threaded( player ) + if( GetGlobalNetInt( "FD_currentWave" ) > 1 ) + PlayerEarnMeter_AddEarnedAndOwned( player, 1.0, 1.0 ) - if ( GetGlobalNetInt("FD_currentWave") != 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 ) + 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) +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") + DeployableTurret_SetAISettingsForPlayer_AP( player, "npc_turret_sentry_burn_card_ap_fd" ) + DeployableTurret_SetAISettingsForPlayer_AT( player, "npc_turret_sentry_burn_card_at_fd" ) } void function OnTickDeath( entity victim, var damageInfo ) @@ -199,25 +199,25 @@ void function OnTickDeath( entity victim, var damageInfo ) void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { - if(victim.IsTitan()&&attacker in file.players) + 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) + 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) + string netIndex = GetAiNetIdFromTargetName( victim.GetTargetName() ) + if( netIndex != "" ) + SetGlobalNetInt( netIndex, GetGlobalNetInt( netIndex ) - 1 ) - SetGlobalNetInt("FD_AICount_Current",GetGlobalNetInt("FD_AICount_Current")-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" ) + if ( victim.GetOwner() == attacker || !attacker.IsPlayer() || ( attacker == victim ) || ( victim.GetBossPlayer() == attacker ) || victim.GetClassName() == "npc_turret_sentry" ) return int playerScore = 0 @@ -230,7 +230,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) string eventName = FD_GetScoreEventName( victim.GetClassName() ) playerScore = ScoreEvent_GetPointValue( GetScoreEvent( eventName ) ) - switch (victim.GetClassName()) + switch ( victim.GetClassName() ) { case "npc_soldier": money = 5 @@ -248,10 +248,10 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) default: money = 0 // titans seem to total up to 50 money undoomed health } - foreach(player in GetPlayerArray()) + foreach( player in GetPlayerArray() ) Remote_CallFunction_NonReplay( player, "ServerCallback_OnTitanKilled", attacker.GetEncodedEHandle(), victim.GetEncodedEHandle(), scriptDamageType, damageSourceId ) } - if (money != 0) + if ( money != 0 ) AddMoneyToPlayer( attacker , money ) attacker.AddToPlayerGameStat( PGS_ASSAULT_SCORE, playerScore ) // seems to be how combat score is counted @@ -273,15 +273,18 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) } -void function RateSpawnpoints_FD(int _0, array _1, int _2, entity _3){} +void function RateSpawnpoints_FD( int _0, array _1, int _2, entity _3 ) +{ + +} -bool function useShieldBoost(entity player,array args) +bool function useShieldBoost( entity player, array args ) { - if((GetGlobalNetTime("FD_harvesterInvulTime")0)) + 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) + 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 } @@ -298,22 +301,22 @@ void function mainGameLoop() startHarvester() bool showShop = false - for(int i = GetGlobalNetInt("FD_currentWave");i function getHighestEnemyAmountsForWave(int waveIndex) +array function getHighestEnemyAmountsForWave( int waveIndex ) { table 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]) + 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) + if( e.spawnEvent.spawnAmount == 0 ) continue - switch(e.spawnEvent.spawnType) + 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 + 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 + npcs[e.spawnEvent.spawnType] += e.spawnEvent.spawnAmount } } - array ret = [-1,-1,-1,-1,-1,-1,-1,-1,-1] - foreach(int key,int value in npcs) + array ret = [ -1, -1, -1, -1, -1, -1, -1, -1, -1 ] + foreach( int key, int value in npcs ) { - if(value==0) + if( value == 0 ) continue int lowestArrayIndex = 0 bool keyIsSet = false - foreach(index,int arrayValue in ret) + foreach( index, int arrayValue in ret ) { - if(arrayValue==-1) + if( arrayValue == -1 ) { ret[index] = key keyIsSet = true break } - if(npcs[ret[lowestArrayIndex]]>npcs[ret[index]]) + if( npcs[ ret[lowestArrayIndex] ] > npcs[ ret[index] ] ) lowestArrayIndex = index } - if((!keyIsSet)&&(npcs[ret[lowestArrayIndex]] 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]) + 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) + if( e.spawnEvent.spawnAmount == 0 ) continue - switch(e.spawnEvent.spawnType) + 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 + 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 + 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) + 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) +bool function runWave( int waveIndex, bool shouldDoBuyTime ) { - SetGlobalNetInt("FD_currentWave",waveIndex) + SetGlobalNetInt( "FD_currentWave", waveIndex ) file.havesterWasDamaged = false file.harvesterShieldDown = false - SetEnemyAmountNetVars(waveIndex) - for(int i = 0; i<20;i++)//Number of npc type ids + SetEnemyAmountNetVars( waveIndex ) + for( int i = 0; i < 20; i++ )//Number of npc type ids { - file.harvesterDamageSource.append(0.0) + file.harvesterDamageSource.append( 0.0 ) } - foreach(entity player in GetPlayerArray()) + foreach( entity player in GetPlayerArray() ) { file.players[player].diedThisRound = false file.players[player].scoreThisRound = 0 } - array enemys = getHighestEnemyAmountsForWave(waveIndex) + array enemys = getHighestEnemyAmountsForWave( waveIndex ) - foreach(entity player in GetPlayerArray()) + 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]) + 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) + if( shouldDoBuyTime ) { - SetGlobalNetInt("FD_waveState",WAVE_STATE_BREAK) + SetGlobalNetInt( "FD_waveState", WAVE_STATE_BREAK ) OpenBoostStores() - foreach(entity player in GetPlayerArray()) - Remote_CallFunction_NonReplay(player,"ServerCallback_FD_NotifyStoreOpen") - while(Time() highestDamage = [0.0,0.0,0.0] - array highestDamageSource = [-1,-1,-1] + array highestDamage = [ 0.0, 0.0, 0.0 ] + array highestDamageSource = [ -1, -1, -1 ] foreach(index,float damage in file.harvesterDamageSource) { totalDamage += damage - if(highestDamage[0]0) + if( GetGlobalNetInt( "FD_restartsRemaining" ) > 0 ) FD_DecrementRestarts() else SetRoundBased(false) - SetWinner(TEAM_IMC)//restart round + SetWinner( TEAM_IMC )//restart round spawnedNPCs = [] // reset npcs count restetWaveEvents() - foreach(player in GetPlayerArray()) - PlayerEarnMeter_AddEarnedAndOwned(player,1.0,1.0) + foreach( player in GetPlayerArray() ) + PlayerEarnMeter_AddEarnedAndOwned( player, 1.0, 1.0 ) return false } @@ -573,26 +577,26 @@ bool function runWave(int waveIndex,bool shouldDoBuyTime) wait 2 //wave end - SetGlobalNetBool("FD_waveActive",false) - MessageToTeam(TEAM_MILITIA,eEventNotifications.FD_AnnounceWaveEnd) + 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()) + MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_AnnounceWaveEnd ) + foreach( entity player in GetPlayerArray() ) { - AddPlayerScore(player,"FDTeamWave") + AddPlayerScore( player, "FDTeamWave" ) } wait 1 int highestScore = 0; entity highestScore_player = GetPlayerArray()[0] - foreach(entity player in GetPlayerArray()) + foreach( entity player in GetPlayerArray() ) { - if(!file.players[player].diedThisRound) - AddPlayerScore(player,"FDDidntDie") - if(highestScore medals //most mvps } -void function OnHarvesterDamaged(entity harvester, var damageInfo) +void function OnHarvesterDamaged( entity harvester, var damageInfo ) { if ( !IsValid( harvester ) ) return @@ -739,15 +745,15 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) fd_harvester.lastDamage = Time() - damageAmount = (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0)) + damageAmount = ( damageAmount * GetCurrentPlaylistVarFloat( "fd_player_damage_scalar", 1.0 ) ) - float shieldPercent = ( (harvester.GetShieldHealth().tofloat() / harvester.GetShieldHealthMax()) * 100 ) - if ( shieldPercent < 100 && !file.harvesterShieldDown) + 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 + if ( shieldPercent < 35 && !file.harvesterShieldDown ) // idk i made this up PlayFactionDialogueToTeam( "fd_baseShieldLow", TEAM_MILITIA ) if ( harvester.GetShieldHealth() == 0 ) @@ -762,21 +768,21 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) 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 + 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) + if ( healthpercent <= 50 && oldhealthpercent > 50 ) PlayFactionDialogueToTeam( "fd_baseHealth50", TEAM_MILITIA ) - if (healthpercent <= 25 && oldhealthpercent > 25) + if ( healthpercent <= 25 && oldhealthpercent > 25 ) PlayFactionDialogueToTeam( "fd_baseHealth25", TEAM_MILITIA ) - if (healthpercent <= 10) + if( healthpercent <= 10 ) PlayFactionDialogueToTeam( "fd_baseLowHealth", TEAM_MILITIA ) if( newHealth <= 0 ) { - EmitSoundAtPosition(TEAM_UNASSIGNED,fd_harvester.harvester.GetOrigin(),"coop_generator_destroyed") + EmitSoundAtPosition( TEAM_UNASSIGNED, fd_harvester.harvester.GetOrigin(), "coop_generator_destroyed" ) newHealth = 0 PlayFactionDialogueToTeam( "fd_baseDeath", TEAM_MILITIA ) fd_harvester.rings.Anim_Stop() @@ -786,7 +792,7 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) } if ( DamageInfo_GetDamageSourceIdentifier( damageInfo ) == eDamageSourceId.mp_titancore_laser_cannon ) - DamageInfo_SetDamage( damageInfo, DamageInfo_GetDamage( damageInfo )/10 ) // laser core shreds super well for some reason + 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 ) ) @@ -794,7 +800,7 @@ void function OnHarvesterDamaged(entity harvester, var damageInfo) void function FD_NPCCleanup() { - foreach ( entity npc in GetEntArrayByClass_Expensive("C_AI_BaseNPC") ) + foreach ( entity npc in GetEntArrayByClass_Expensive( "C_AI_BaseNPC" ) ) if ( IsValid( npc ) ) npc.Destroy() } @@ -804,7 +810,7 @@ void function HarvesterThink() entity harvester = fd_harvester.harvester - EmitSoundOnEntity( harvester,"coop_generator_startup" ) + EmitSoundOnEntity( harvester, "coop_generator_startup" ) float lastTime = Time() wait 4 @@ -823,13 +829,13 @@ void function HarvesterThink() if ( IsValid( fd_harvester.particleShield ) ) { - vector shieldColor = GetShieldTriLerpColor(1.0-(harvester.GetShieldHealth().tofloat()/harvester.GetShieldHealthMax().tofloat())) + 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() ) ) + vector beamColor = GetShieldTriLerpColor( 1.0 - ( harvester.GetHealth().tofloat() / harvester.GetMaxHealth().tofloat() ) ) EffectSetControlPointVector( fd_harvester.particleBeam, 1, beamColor ) } @@ -837,21 +843,21 @@ void function HarvesterThink() if( IsValid( fd_harvester.particleShield ) ) fd_harvester.particleShield.Destroy() - if ( ( ( currentTime-fd_harvester.lastDamage) >= GENERATOR_SHIELD_REGEN_DELAY ) && ( harvester.GetShieldHealth() < harvester.GetShieldHealthMax() ) ) + if ( ( ( currentTime-fd_harvester.lastDamage ) >= GENERATOR_SHIELD_REGEN_DELAY ) && ( harvester.GetShieldHealth() < harvester.GetShieldHealthMax() ) ) { - if( !IsValid(fd_harvester.particleShield) ) - generateShieldFX(fd_harvester) + if( !IsValid( fd_harvester.particleShield ) ) + generateShieldFX( fd_harvester ) //printt((currentTime-fd_harvester.lastDamage)) - if(harvester.GetShieldHealth()==0) - EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_start") + if( harvester.GetShieldHealth() == 0 ) + EmitSoundOnEntity( harvester, "coop_generator_shieldrecharge_start" ) if (!isRegening) { - EmitSoundOnEntity( harvester,"coop_generator_shieldrecharge_resume" ) + EmitSoundOnEntity( harvester, "coop_generator_shieldrecharge_resume" ) file.harvesterShieldDown = false - if (GetGlobalNetBool("FD_waveActive")) + if (GetGlobalNetBool( "FD_waveActive" ) ) PlayFactionDialogueToTeam( "fd_baseShieldRecharging", TEAM_MILITIA ) else PlayFactionDialogueToTeam( "fd_baseShieldRechargingShort", TEAM_MILITIA ) @@ -862,22 +868,22 @@ void function HarvesterThink() if ( newShieldHealth >= harvester.GetShieldHealthMax() ) { - StopSoundOnEntity(harvester,"coop_generator_shieldrecharge_resume") - harvester.SetShieldHealth(harvester.GetShieldHealthMax()) - EmitSoundOnEntity(harvester,"coop_generator_shieldrecharge_end") - if (GetGlobalNetBool("FD_waveActive")) + 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) + harvester.SetShieldHealth( newShieldHealth ) } - } else if ( ( ( currentTime-fd_harvester.lastDamage) < GENERATOR_SHIELD_REGEN_DELAY ) && ( harvester.GetShieldHealth() < harvester.GetShieldHealthMax() ) ) + } 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") + EmitSoundOnEntity( harvester, "coop_generator_shielddown" ) lastShieldHealth = harvester.GetShieldHealth() lastTime = currentTime @@ -896,11 +902,11 @@ void function startHarvester() void function HarvesterAlarm() { - while(IsAlive(fd_harvester.harvester)) + while( IsAlive( fd_harvester.harvester ) ) { - if(fd_harvester.harvester.GetShieldHealth()==0) + if( fd_harvester.harvester.GetShieldHealth() == 0 ) { - wait EmitSoundOnEntity(fd_harvester.harvester,"coop_generator_underattack_alarm") + wait EmitSoundOnEntity( fd_harvester.harvester, "coop_generator_underattack_alarm" ) } else { @@ -911,16 +917,16 @@ void function HarvesterAlarm() void function initNetVars() { - SetGlobalNetInt("FD_totalWaves",waveEvents.len()) - SetGlobalNetInt("burn_turretLimit",2) + 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) + SetGlobalNetInt( "FD_currentWave", 0 ) + if( FD_IsDifficultyLevelOrHigher( eFDDifficultyLevel.INSANE ) ) + FD_SetNumAllowedRestarts( 0 ) else - FD_SetNumAllowedRestarts(2) + FD_SetNumAllowedRestarts( 2 ) } @@ -928,13 +934,13 @@ void function initNetVars() void function FD_DamageByPlayerCallback(entity victim,var damageInfo) { - entity player = DamageInfo_GetAttacker(damageInfo) - if(!(player in file.players)) + entity player = DamageInfo_GetAttacker( damageInfo ) + if( !( player in file.players ) ) return - float damage = DamageInfo_GetDamage(damageInfo) + float damage = DamageInfo_GetDamage( damageInfo ) file.players[player].damageDealt += damage file.players[player].scoreThisRound += damage.tointeger() //TODO NOT HOW SCORE WORKS - if(victim.IsTitan()) + if( victim.IsTitan() ) { //TODO Money and score for titan damage } @@ -965,7 +971,7 @@ void function DamageScaleByDifficulty( entity ent, var damageInfo ) return - DamageInfo_SetDamage( damageInfo, (damageAmount * GetCurrentPlaylistVarFloat("fd_player_damage_scalar",1.0)) ) + DamageInfo_SetDamage( damageInfo, ( damageAmount * GetCurrentPlaylistVarFloat( "fd_player_damage_scalar", 1.0 ) ) ) @@ -984,15 +990,17 @@ void function HealthScaleByDifficulty( entity ent ) return if ( ent.IsTitan() ) - ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt("fd_titan_health_adjust",0) ) + ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt( "fd_titan_health_adjust", 0 ) ) else - ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt("fd_reaper_health_adjust",0) ) + ent.SetMaxHealth( ent.GetMaxHealth() + GetCurrentPlaylistVarInt( "fd_reaper_health_adjust", 0 ) ) - if(GetCurrentPlaylistVarInt("fd_pro_titan_shields",0)&&ent.IsTitan()){ + if( GetCurrentPlaylistVarInt( "fd_pro_titan_shields", 0 ) && ent.IsTitan() ) + { entity soul = ent.GetTitanSoul() - if(IsValid(soul)){ - soul.SetShieldHealthMax(2500) - soul.SetShieldHealth(2500) + if( IsValid( soul ) ) + { + soul.SetShieldHealthMax( 2500 ) + soul.SetShieldHealth( 2500 ) } } @@ -1002,7 +1010,7 @@ void function HealthScaleByDifficulty( entity ent ) 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 = 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 ) @@ -1014,54 +1022,56 @@ void function FD_createHarvester() bool function isFinalWave() { - return ((GetGlobalNetInt("FD_currentWave")+1)==GetGlobalNetInt("FD_totalWaves")) + return ( ( GetGlobalNetInt( "FD_currentWave" ) + 1 ) == GetGlobalNetInt( "FD_totalWaves" ) ) } bool function isSecondWave() { - return ((GetGlobalNetInt("FD_currentWave")+1)==1) + return ( (GetGlobalNetInt( "FD_currentWave" ) + 1 ) == 1 ) } void function LoadEntities() { - CreateBoostStoreLocation(TEAM_MILITIA,shopPosition,shopAngles) - foreach ( entity info_target in GetEntArrayByClass_Expensive("info_target") ) + 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": + 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": + 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)) + case "info_fd_ai_position": + AddStationaryAIPosition( info_target.GetOrigin(), int( info_target.kv.aiType ) ) break - case"info_fd_route_node": - routeNodes.append(info_target) + case "info_fd_route_node": + routeNodes.append( info_target ) break - case"info_fd_smoke_screen": - file.smokePoints.append(info_target) + case "info_fd_smoke_screen": + file.smokePoints.append( info_target ) break } } } ValidateAndFinalizePendingStationaryPositions() initNetVars() - SetTeam(GetTeamEnt(TEAM_IMC),TEAM_IMC) + SetTeam( GetTeamEnt( TEAM_IMC ), TEAM_IMC ) } bool function allPlayersReady() { - foreach(entity player in GetPlayerArray()) + foreach( entity player in GetPlayerArray() ) { - if(!player.GetPlayerNetBool("FD_readyForNextWave")) + if( !player.GetPlayerNetBool( "FD_readyForNextWave" ) ) return false } return true @@ -1071,65 +1081,65 @@ void function CheckLastPlayerReady() { int readyplayers = 0 entity notready - foreach(entity player in GetPlayerArray()) + foreach( entity player in GetPlayerArray() ) { - if(player.GetPlayerNetBool("FD_readyForNextWave")) + if( player.GetPlayerNetBool( "FD_readyForNextWave" ) ) readyplayers++ else notready = player // keep a track of this player } - if (readyplayers == GetPlayerArray().len() - 1) + 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 args ) { - if(args[0]=="true") - player.SetPlayerNetBool("FD_readyForNextWave",true) - if(args[0]=="false") - player.SetPlayerNetBool("FD_readyForNextWave",false) + 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) +int function getHintForTypeId( int typeId ) { //this is maybe a bit of an naive aproch - switch(typeId) + switch( typeId ) { case eFD_AITypeIDs.TITAN_NUKE: - return (348 +RandomIntRangeInclusive(0,1)) + return ( 348 + RandomIntRangeInclusive( 0, 1 ) ) case eFD_AITypeIDs.TITAN_ARC: - return (350 +RandomIntRangeInclusive(0,1)) + return ( 350 + RandomIntRangeInclusive( 0, 1 ) ) case eFD_AITypeIDs.TITAN_MORTAR: - return (352 +RandomIntRangeInclusive(0,1)) + 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)) + return ( 356 + RandomIntRangeInclusive( 0, 1 ) ) case eFD_AITypeIDs.STALKER: - if(RandomIntRangeInclusive(0,1)==0) + if( RandomIntRangeInclusive( 0, 1 ) == 0 ) return 358 else return 361 case eFD_AITypeIDs.REAPER: - return (359 +RandomIntRangeInclusive(0,1)) + return ( 359 + RandomIntRangeInclusive( 0, 1 ) ) case eFD_AITypeIDs.DRONE: return 362 case eFD_AITypeIDs.TITAN_SNIPER: - return (371 +RandomIntRangeInclusive(0,2)) + return ( 371 + RandomIntRangeInclusive( 0, 2 ) ) default: - return (363+RandomIntRangeInclusive(0,7)) + return ( 363 + RandomIntRangeInclusive( 0, 7 ) ) } unreachable } -string function GetTargetNameForID(int typeId) +string function GetTargetNameForID( int typeId ) { - switch(typeId) + switch( typeId ) { case eFD_AITypeIDs.TITAN_NUKE: return "npc_titan_nuke" @@ -1175,7 +1185,7 @@ string function GetTargetNameForID(int typeId) unreachable } -string function GetAiNetIdFromTargetName(string targetName) +string function GetAiNetIdFromTargetName( string targetName ) { switch ( targetName ) { @@ -1229,13 +1239,13 @@ string function GetAiNetIdFromTargetName(string targetName) case "tick": return "FD_AICount_Ticks" } - printt("unknown target name ",targetName) + printt( "unknown target name ", targetName ) return "" } -void function AddTurretSentry(entity turret) +void function AddTurretSentry( entity turret ) { turret.Minimap_AlwaysShow( TEAM_IMC, null ) turret.Minimap_AlwaysShow( TEAM_MILITIA, null ) @@ -1243,7 +1253,7 @@ void function AddTurretSentry(entity turret) turret.Minimap_SetCustomState( eMinimapObject_npc.FD_TURRET ) } -void function DisableTitanSelection( ) +void function DisableTitanSelection() { foreach ( entity player in GetPlayerArray() ) { @@ -1251,7 +1261,7 @@ void function DisableTitanSelection( ) } } -void function EnableTitanSelection( ) +void function EnableTitanSelection() { foreach ( entity player in GetPlayerArray() ) { diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 5b641ee81..f72a08da9 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -71,75 +71,76 @@ global struct WaveEvent{ -global table GlobalEventEntitys -global array > waveEvents +global table< string, entity > GlobalEventEntitys +global array< array > waveEvents void function executeWave() { - print("executeWave Start") - thread runEvents(0) - while(IsAlive(fd_harvester.harvester)&&(!allEventsExecuted(GetGlobalNetInt("FD_currentWave")))) + 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) + waitUntilLessThanAmountAlive( 0 ) + waitUntilLessThanAmountAlive_expensive( 0 ) - foreach(entity ent in GetEntArrayByClass_Expensive("npc_turret_sentry")) - RevivableTurret_Revive(ent) + foreach (entity ent in GetEntArrayByClass_Expensive( "npc_turret_sentry" ) ) + RevivableTurret_Revive( ent ) } -bool function allEventsExecuted(int waveIndex) +bool function allEventsExecuted( int waveIndex ) { - foreach(WaveEvent e in waveEvents[waveIndex]) + foreach( WaveEvent e in waveEvents[waveIndex] ) { - if(e.executeOnThisCall>e.timesExecuted) + if( e.executeOnThisCall > e.timesExecuted ) return false } return true } -void function runEvents(int firstExecuteIndex) +void function runEvents( int firstExecuteIndex ) { - print("runEvents Start") - WaveEvent currentEvent = waveEvents[GetGlobalNetInt("FD_currentWave")][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") + print( "not on this call" ) return } - if(!IsAlive(fd_harvester.harvester)) + if( !IsAlive(fd_harvester.harvester ) ) { - print("harvesterDead") + print( "harvesterDead" ) return } - if(currentEvent.shouldThread) + if( currentEvent.shouldThread ) { - print("execute with thread") - thread currentEvent.eventFunction(currentEvent.smokeEvent,currentEvent.spawnEvent,currentEvent.flowControlEvent,currentEvent.soundEvent) + 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) + print( "execute without thread" ) + currentEvent.eventFunction( currentEvent.smokeEvent, currentEvent.spawnEvent, currentEvent.flowControlEvent, currentEvent.soundEvent ) } - if(currentEvent.nextEventIndex==0) + if( currentEvent.nextEventIndex == 0 ) { - print("zero index") + print( "zero index" ) return } - currentEvent = waveEvents[GetGlobalNetInt("FD_currentWave")][currentEvent.nextEventIndex] + currentEvent = waveEvents[GetGlobalNetInt( "FD_currentWave" )][currentEvent.nextEventIndex] } - print("runEvents End") + print( "runEvents End" ) } -void function restetWaveEvents(){ - foreach(WaveEvent event in waveEvents[GetGlobalNetInt("FD_currentWave")]) +void function restetWaveEvents() +{ + foreach( WaveEvent event in waveEvents[GetGlobalNetInt( "FD_currentWave" )] ) { event.timesExecuted = 0 } @@ -161,7 +162,7 @@ void function restetWaveEvents(){ ####### # ####### # # # ##### ####### # # ####### # # # # # ####### # # \*****************************************************************************************************************/ -WaveEvent function CreateSmokeEvent(vector position,float lifetime,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateSmokeEvent( vector position, float lifetime, int nextEventIndex, int executeOnThisCall = 1 ) { WaveEvent event event.eventFunction = spawnSmoke @@ -173,7 +174,7 @@ WaveEvent function CreateSmokeEvent(vector position,float lifetime,int nextEvent return event } -WaveEvent function CreateArcTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateArcTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnArcTitan @@ -189,7 +190,7 @@ WaveEvent function CreateArcTitanEvent(vector origin,vector angles,string route, return event } -WaveEvent function CreateSuperSpectreEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateSuperSpectreEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnSuperSpectre @@ -205,7 +206,7 @@ WaveEvent function CreateSuperSpectreEvent(vector origin,vector angles,string ro return event } -WaveEvent function CreateSuperSpectreEventWithMinion(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateSuperSpectreEventWithMinion( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnSuperSpectreWithMinion @@ -221,7 +222,7 @@ WaveEvent function CreateSuperSpectreEventWithMinion(vector origin,vector angles return event } -WaveEvent function CreateDroppodGruntEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodGruntEvent( vector origin, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnDroppodGrunts @@ -236,7 +237,7 @@ WaveEvent function CreateDroppodGruntEvent(vector origin,string route,int nextEv return event } -WaveEvent function CreateDroppodStalkerEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodStalkerEvent( vector origin, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnDroppodStalker @@ -251,7 +252,7 @@ WaveEvent function CreateDroppodStalkerEvent(vector origin,string route,int next return event } -WaveEvent function CreateDroppodSpectreMortarEvent(vector origin,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodSpectreMortarEvent( vector origin, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnDroppodSpectreMortar @@ -266,7 +267,7 @@ WaveEvent function CreateDroppodSpectreMortarEvent(vector origin,string route,in return event } -WaveEvent function CreateWaitForTimeEvent(float waitTime,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitForTimeEvent( float waitTime, int nextEventIndex, int executeOnThisCall = 1 ) { WaveEvent event event.shouldThread = false @@ -277,7 +278,7 @@ WaveEvent function CreateWaitForTimeEvent(float waitTime,int nextEventIndex,int return event } -WaveEvent function CreateWaitUntilAliveEvent(int amount,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitUntilAliveEvent( int amount, int nextEventIndex, int executeOnThisCall = 1 ) { WaveEvent event event.eventFunction = waitUntilLessThanAmountAliveEvent @@ -288,7 +289,7 @@ WaveEvent function CreateWaitUntilAliveEvent(int amount,int nextEventIndex,int e return event } -WaveEvent function CreateWaitUntilAliveWeightedEvent(int amount,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitUntilAliveWeightedEvent( int amount, int nextEventIndex, int executeOnThisCall = 1 ) { WaveEvent event event.eventFunction = waitUntilLessThanAmountAliveEventWeighted @@ -299,7 +300,7 @@ WaveEvent function CreateWaitUntilAliveWeightedEvent(int amount,int nextEventInd 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 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 @@ -316,7 +317,7 @@ WaveEvent function CreateGenericSpawnEvent(string npcClassName,vector origin,vec 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 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 @@ -334,7 +335,7 @@ WaveEvent function CreateGenericTitanSpawnWithAiSettingsEvent(string npcClassNam return event } -WaveEvent function CreateNukeTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateNukeTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnNukeTitan @@ -350,7 +351,7 @@ WaveEvent function CreateNukeTitanEvent(vector origin,vector angles,string route return event } -WaveEvent function CreateMortarTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateMortarTitanEvent( vector origin, vector angles, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnMortarTitan @@ -365,7 +366,7 @@ WaveEvent function CreateMortarTitanEvent(vector origin,vector angles,int nextEv return event } -WaveEvent function CreateCloakDroneEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateCloakDroneEvent( vector origin, vector angles, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = fd_spawnCloakDrone @@ -380,7 +381,7 @@ WaveEvent function CreateCloakDroneEvent(vector origin,vector angles,int nextEve return event } -WaveEvent function CreateDroppodTickEvent( vector origin, int amount, string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateDroppodTickEvent( vector origin, int amount, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnTick @@ -394,7 +395,7 @@ WaveEvent function CreateDroppodTickEvent( vector origin, int amount, string rou return event } -WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateNorthstarSniperTitanEvent( vector origin, vector angles, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = spawnSniperTitan @@ -409,7 +410,7 @@ WaveEvent function CreateNorthstarSniperTitanEvent(vector origin,vector angles,i return event } -WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateToneSniperTitanEvent( vector origin, vector angles, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnToneSniperTitan @@ -425,7 +426,7 @@ WaveEvent function CreateToneSniperTitanEvent(vector origin,vector angles,int ne } -WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateIonTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnIonTitan @@ -441,7 +442,7 @@ WaveEvent function CreateIonTitanEvent(vector origin,vector angles,string route, return event } -WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateScorchTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnScorchTitan @@ -457,7 +458,7 @@ WaveEvent function CreateScorchTitanEvent(vector origin,vector angles,string rou return event } -WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateRoninTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnRoninTitan @@ -473,7 +474,7 @@ WaveEvent function CreateRoninTitanEvent(vector origin,vector angles,string rout return event } -WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateToneTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnToneTitan @@ -489,7 +490,7 @@ WaveEvent function CreateToneTitanEvent(vector origin,vector angles,string route return event } -WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateLegionTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnLegionTitan @@ -505,7 +506,7 @@ WaveEvent function CreateLegionTitanEvent(vector origin,vector angles,string rou return event } -WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string route,int nextEventIndex,int executeOnThisCall = 1,string entityGlobalKey="") +WaveEvent function CreateMonarchTitanEvent( vector origin, vector angles, string route, int nextEventIndex, int executeOnThisCall = 1, string entityGlobalKey = "" ) { WaveEvent event event.eventFunction = SpawnMonarchTitan @@ -521,7 +522,7 @@ WaveEvent function CreateMonarchTitanEvent(vector origin,vector angles,string ro return event } -WaveEvent function CreateWaitForDeathOfEntitysEvent(array waitGlobalDataKey,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitForDeathOfEntitysEvent( array waitGlobalDataKey, int nextEventIndex, int executeOnThisCall = 1 ) { WaveEvent event event.eventFunction = waitForDeathOfEntitys @@ -532,7 +533,7 @@ WaveEvent function CreateWaitForDeathOfEntitysEvent(array waitGlobalData return event } -WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int nextEventIndex,int executeOnThisCall = 1) +WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int nextEventIndex,int executeOnThisCall = 1 ) { WaveEvent event event.eventFunction = waitForLessThanAliveTyped @@ -543,6 +544,7 @@ WaveEvent function CreateWaitForLessThanTypedEvent(int aiTypeId,int amount,int n event.flowControlEvent.waitEntityType = aiTypeId return event } + WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string route,int nextEventIndex, bool shouldLoop = true, int executeOnThisCall = 1,string entityGlobalKey="") { WaveEvent event @@ -569,25 +571,25 @@ WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string rout ####### # ####### # # # # ##### # # ##### # ### ####### # # ##### \************************************************************************************************************/ -void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function spawnSmoke( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - printt("smoke") + 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.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.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) +void function spawnDrones( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { //TODO - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + PingMinimap( spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0 ) array offsets = [ < 0, 32, 0 >, < 32, 0, 0 >, < 0, -32, 0 >, < -32, 0, 0 > ] @@ -600,142 +602,142 @@ void function spawnDrones(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowContro 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 + 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) + 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, spawnEvent.shouldLoop) + SetTargetName( guy, GetTargetNameForID( eFD_AITypeIDs.DRONE ) ) + AddMinimapForHumans( guy ) + spawnedNPCs.append( guy ) + thread droneNav_thread(guy, spawnEvent.route, 0, 500, spawnEvent.shouldLoop ) } } -void function waitForDeathOfEntitys(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function waitForDeathOfEntitys( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - while(IsAlive(fd_harvester.harvester)) + while( IsAlive( fd_harvester.harvester ) ) { bool anyoneAlive = false - foreach(string key in flowControlEvent.waitGlobalDataKey ) + foreach( string key in flowControlEvent.waitGlobalDataKey ) { - if(!(key in GlobalEventEntitys)) + if( !( key in GlobalEventEntitys ) ) continue - if(IsAlive(GlobalEventEntitys[key])) + if( IsAlive( GlobalEventEntitys[key] ) ) anyoneAlive = true } - if(!anyoneAlive) + if( !anyoneAlive ) break } } -void function waitForLessThanAliveTyped(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function waitForLessThanAliveTyped( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - while(IsAlive(fd_harvester.harvester)) + while( IsAlive( fd_harvester.harvester ) ) { int amount - foreach(entity npc in spawnedNPCs) + foreach( entity npc in spawnedNPCs ) { - if(FD_GetAITypeID_ByString(npc.GetTargetName())) //TODO getaitypeid_bystring does not contain all possible strings + if( FD_GetAITypeID_ByString( npc.GetTargetName() ) ) //TODO getaitypeid_bystring does not contain all possible strings amount++ } - if(amount<=flowControlEvent.waitAmount) + if( amount <= flowControlEvent.waitAmount ) break WaitFrame() } } -void function spawnArcTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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) + 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) + npc.AssaultSetFightRadius( 0 ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - thread singleNav_thread(npc,spawnEvent.route) - thread EMPTitanThinkConstant(npc) + thread singleNav_thread( npc, spawnEvent.route ) + thread EMPTitanThinkConstant( npc ) } -void function waitForTime(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function waitForTime( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { float waitUntil = Time() + flowControlEvent.waitTime - while(Time() ) + entity pod = CreateDropPod( spawnEvent.origin, < 0, 0, 0 > ) SetTeam( pod, TEAM_IMC ) InitFireteamDropPod( pod ) waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, < 0, 0, 0 > ) @@ -745,10 +747,10 @@ void function spawnDroppodGrunts( SmokeEvent smokeEvent, SpawnEvent spawnEvent, for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { - entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin,<0,0,0> ) + entity guy = CreateSoldier( TEAM_IMC, spawnEvent.origin, < 0, 0, 0 > ) - if( spawnEvent.entityGlobalKey!="" ) - GlobalEventEntitys[ spawnEvent.entityGlobalKey + i.tostring() ] <- guy + 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 ) @@ -779,13 +781,13 @@ void function spawnDroppodGrunts( SmokeEvent smokeEvent, SpawnEvent spawnEvent, thread SquadNav_Thread( guys,spawnEvent.route ) } -void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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> ) + 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> ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, < 0, 0, 0 > ) string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array guys @@ -793,9 +795,9 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Fl 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 + 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) @@ -804,9 +806,9 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Fl 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)) + AddMinimapForHumans( guy ) + spawnedNPCs.append( guy ) + SetTargetName( guy, GetTargetNameForID( eFD_AITypeIDs.STALKER ) ) thread FDStalkerThink( guy , fd_harvester.harvester ) guys.append( guy ) } @@ -815,7 +817,7 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Fl { case eFDDifficultyLevel.EASY: case eFDDifficultyLevel.NORMAL: // easy and normal stalkers have no weapons - foreach(npc in guys) + foreach( npc in guys ) { npc.TakeActiveWeapon() npc.SetNoTarget( false ) @@ -826,7 +828,7 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Fl case eFDDifficultyLevel.HARD: case eFDDifficultyLevel.MASTER: case eFDDifficultyLevel.INSANE: // give all EPGs - foreach(npc in guys) + foreach( npc in guys ) { npc.TakeActiveWeapon() npc.GiveWeapon( "mp_weapon_epg", [] ) @@ -840,27 +842,27 @@ void function spawnDroppodStalker(SmokeEvent smokeEvent,SpawnEvent spawnEvent,Fl } ActivateFireteamDropPod( pod, guys ) - SquadNav_Thread(guys,spawnEvent.route) + SquadNav_Thread( guys, spawnEvent.route ) } -void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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> ) + 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> ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, < 0, 0, 0 > ) string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array guys for ( int i = 0; i < 4; i++ ) { - entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,<0,0,0> ) - SetSpawnOption_AISettings(guy, "npc_spectre_mortar") - if(spawnEvent.entityGlobalKey!="") - GlobalEventEntitys[spawnEvent.entityGlobalKey+i.tostring()] <- guy + entity guy = CreateSpectre( TEAM_IMC, spawnEvent.origin,< 0, 0, 0 > ) + SetSpawnOption_AISettings( guy, "npc_spectre_mortar" ) + if( spawnEvent.entityGlobalKey != "" ) + GlobalEventEntitys[ spawnEvent.entityGlobalKey + i.tostring() ] <- guy SetTeam( guy, TEAM_IMC ) DispatchSpawn( guy ) spawnedNPCs.append(guy) @@ -876,235 +878,234 @@ void function spawnDroppodSpectreMortar(SmokeEvent smokeEvent,SpawnEvent spawnEv } -void function spawnGenericNPC(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function spawnGenericNPC( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - DispatchSpawn(npc) + DispatchSpawn( npc ) } -void function spawnGenericNPCTitanwithSettings(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function spawnGenericNPCTitanwithSettings( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - PingMinimap(spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0) + 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!="") + SetSpawnOption_AISettings( npc, spawnEvent.aiSettings ) + SetSpawnOption_Titanfall( npc ) + DispatchSpawn( npc ) + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(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) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function SpawnScorchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function SpawnRoninTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function SpawnToneTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function SpawnLegionTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function SpawnMonarchTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread singleNav_thread(npc, spawnEvent.route) + thread singleNav_thread( npc, spawnEvent.route ) } -void function spawnNukeTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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!="") + 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) + 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) + thread singleNav_thread( npc, spawnEvent.route ) + thread NukeTitanThink( npc, fd_harvester.harvester ) } -void function spawnMortarTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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!="") + 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) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread MortarTitanThink(npc,fd_harvester.harvester) + thread MortarTitanThink( npc, fd_harvester.harvester ) } -void function spawnSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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!="") + 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) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread SniperTitanThink(npc,fd_harvester.harvester) + thread SniperTitanThink( npc, fd_harvester.harvester ) } -void function SpawnToneSniperTitan(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +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 + 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!="") + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - npc.AssaultSetFightRadius(0) - spawnedNPCs.append(npc) - AddMinimapForTitans(npc) + npc.AssaultSetFightRadius( 0 ) + spawnedNPCs.append( npc ) + AddMinimapForTitans( npc ) npc.WaitSignal( "TitanHotDropComplete" ) npc.GetTitanSoul().SetTitanSoulNetBool( "showOverheadIcon", true ) - thread SniperTitanThink(npc,fd_harvester.harvester) + thread SniperTitanThink( npc, fd_harvester.harvester ) } -void function fd_spawnCloakDrone(SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function fd_spawnCloakDrone( SmokeEvent smokeEvent, 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!="") + spawnedNPCs.append( npc ) + if( spawnEvent.entityGlobalKey != "" ) GlobalEventEntitys[spawnEvent.entityGlobalKey] <- npc - SetTargetName( npc, GetTargetNameForID(spawnEvent.spawnType)) - AddMinimapForHumans(npc) + SetTargetName( npc, GetTargetNameForID( spawnEvent.spawnType ) ) + AddMinimapForHumans( npc ) } -void function SpawnTick( SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent ) +void function SpawnTick( 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> ) + entity pod = CreateDropPod( spawnEvent.origin, < 0, 0, 0 > ) SetTeam( pod, TEAM_IMC ) InitFireteamDropPod( pod ) - waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, <0,0,0> ) + waitthread LaunchAnimDropPod( pod, "pod_testpath", spawnEvent.origin, < 0, 0, 0 > ) string squadName = MakeSquadName( TEAM_IMC, UniqueString( "ZiplineTable" ) ) array guys for ( int i = 0; i < spawnEvent.spawnAmount; i++ ) { - entity guy = CreateFragDrone( TEAM_IMC, spawnEvent.origin, <0,0,0> ) - if( spawnEvent.entityGlobalKey!="" ) + 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 ) @@ -1114,7 +1115,7 @@ void function SpawnTick( SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowContro SetTargetName( guy, GetTargetNameForID( eFD_AITypeIDs.TICK ) ) SetSquad( guy, squadName ) spawnedNPCs.append( guy ) - guy.AssaultSetFightRadius( expect int( guy.Dev_GetAISettingByKeyField("LookDistDefault_Combat") ) ) // make the ticks target players very aggressively + guy.AssaultSetFightRadius( expect int( guy.Dev_GetAISettingByKeyField( "LookDistDefault_Combat" ) ) ) // make the ticks target players very aggressively guys.append( guy ) } @@ -1135,11 +1136,11 @@ void function SpawnTick( SmokeEvent smokeEffect,SpawnEvent spawnEvent,FlowContro \****************************************************************************************/ -void function PingMinimap(float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex) +void function PingMinimap( float x, float y, float duration, float spreadRadius, float ringRadius, int colorIndex ) { - foreach(entity player in GetPlayerArray()) + foreach( entity player in GetPlayerArray() ) { - Remote_CallFunction_NonReplay(player, "ServerCallback_FD_PingMinimap", x, y, duration, spreadRadius, ringRadius, colorIndex) + Remote_CallFunction_NonReplay( player, "ServerCallback_FD_PingMinimap", x, y, duration, spreadRadius, ringRadius, colorIndex ) } } @@ -1164,14 +1165,14 @@ void function waitUntilLessThanAmountAlive( int amount ) continue } } - int aliveNPCs = spawnedNPCs.len() -deduct - while ( aliveNPCs>amount ) + int aliveNPCs = spawnedNPCs.len() - deduct + while( aliveNPCs > amount ) { WaitFrame() deduct = 0 foreach ( entity npc in spawnedNPCs ) { - if ( !IsValid( npc ) ) + if( !IsValid( npc ) ) { deduct++ continue @@ -1187,75 +1188,75 @@ void function waitUntilLessThanAmountAlive( int amount ) continue } } - aliveNPCs = spawnedNPCs.len() -deduct + aliveNPCs = spawnedNPCs.len() - deduct - if ( !IsAlive( fd_harvester.harvester ) ) + if( !IsAlive( fd_harvester.harvester ) ) return } } -void function waitUntilLessThanAmountAliveWeighted(int amount,int humanWeight=1,int reaperWeight=3, int titanWeight=5) +void function waitUntilLessThanAmountAliveWeighted( int amount, int humanWeight = 1, int reaperWeight = 3, int titanWeight = 5 ) { int aliveNPCsWeighted = 0; - foreach(npc in spawnedNPCs) + foreach( npc in spawnedNPCs ) { - if(!IsValid(npc)) + if( !IsValid( npc ) ) continue if( IsValid( GetPetTitanOwner( npc ) ) ) continue - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) continue - if(npc.IsTitan()) + if( npc.IsTitan() ) aliveNPCsWeighted += titanWeight - else if(npc.GetTargetName()=="reaper") + else if( npc.GetTargetName() == "reaper" ) aliveNPCsWeighted += reaperWeight else aliveNPCsWeighted += humanWeight } - while(aliveNPCsWeighted>amount) + while( aliveNPCsWeighted > amount ) { WaitFrame() aliveNPCsWeighted = 0; - foreach(npc in spawnedNPCs) + foreach( npc in spawnedNPCs ) { - if(!IsValid(npc)) + if( !IsValid( npc ) ) continue if( IsValid( GetPetTitanOwner( npc ) ) ) continue - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) continue - if(npc.IsTitan()) + if( npc.IsTitan() ) aliveNPCsWeighted += titanWeight - else if(npc.GetTargetName()=="reaper") + else if( npc.GetTargetName() == "reaper" ) aliveNPCsWeighted += reaperWeight else aliveNPCsWeighted += humanWeight } - if(!IsAlive(fd_harvester.harvester)) + if( !IsAlive( fd_harvester.harvester ) ) return } } -void function waitUntilLessThanAmountAlive_expensive(int amount) +void function waitUntilLessThanAmountAlive_expensive( int amount ) { array npcs = GetNPCArray() int deduct = 0 - foreach (entity npc in npcs) + foreach ( entity npc in npcs ) { if( IsValid( GetPetTitanOwner( npc ) ) ) { deduct++ continue } - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) { deduct++ continue @@ -1263,31 +1264,31 @@ void function waitUntilLessThanAmountAlive_expensive(int amount) } int aliveTitans = npcs.len() - deduct - while(aliveTitans>amount) + while( aliveTitans > amount ) { WaitFrame() npcs = GetNPCArray() deduct = 0 - foreach(entity npc in npcs) + foreach( entity npc in npcs ) { if( IsValid( GetPetTitanOwner( npc ) ) ) { deduct++ continue } - if(npc.GetTeam()==TEAM_MILITIA) + if( npc.GetTeam() == TEAM_MILITIA ) { deduct++ continue } } aliveTitans = GetNPCArray().len() - deduct - if(!IsAlive(fd_harvester.harvester)) + if( !IsAlive( fd_harvester.harvester ) ) return } } -void function AddMinimapForTitans(entity titan) +void function AddMinimapForTitans( entity titan ) { titan.Minimap_SetAlignUpright( true ) titan.Minimap_AlwaysShow( TEAM_IMC, null ) @@ -1297,7 +1298,7 @@ void function AddMinimapForTitans(entity titan) } // including drones -void function AddMinimapForHumans(entity human) +void function AddMinimapForHumans( entity human ) { human.Minimap_SetAlignUpright( true ) human.Minimap_AlwaysShow( TEAM_IMC, null ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index 06753f780..2d76c99ed 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -6,16 +6,15 @@ global function Dev_MarkRoute -void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,float nextDistance = 500.0, bool shouldLoop = false) +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()){ + if( !npc.IsNPC() ) return - } @@ -54,7 +53,7 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f float dist = 1000000000 foreach ( entity node in routeNodes ) { - if( !node.HasKey("route_name") ) + if( !node.HasKey( "route_name" ) ) continue if ( Distance( npc.GetOrigin(), node.GetOrigin() ) < dist ) { @@ -89,10 +88,10 @@ void function singleNav_thread(entity npc, string routeName,int nodesToSkip= 0,f targetNode = targetNode.GetLinkEnt() } - npc.Signal("FD_ReachedHarvester") + npc.Signal( "FD_ReachedHarvester" ) } -void function SquadNav_Thread( array npcs ,string routeName,int nodesToSkip = 0,float nextDistance = 200.0 ) +void function SquadNav_Thread( array 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 /* @@ -121,7 +120,7 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS float dist = 1000000000 foreach ( entity node in routeNodes ) { - if( !node.HasKey("route_name") ) + if( !node.HasKey( "route_name" ) ) continue if ( Distance( npcs[0].GetOrigin(), node.GetOrigin() ) < dist ) { @@ -141,27 +140,27 @@ void function SquadNav_Thread( array npcs ,string routeName,int nodesToS { targetNode = targetNode.GetLinkEnt() } - while ( targetNode != null ) { if( !IsAlive( fd_harvester.harvester ) ) return - SquadAssaultOrigin(npcs,targetNode.GetOrigin(),nextDistance) + + 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) +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()){ + if( !npc.IsNPC() ) return - } + // NEW STUFF WaitFrame() // so other code setting up what happens on signals is run before this @@ -173,7 +172,7 @@ void function droneNav_thread(entity npc, string routeName,int nodesToSkip= 0,fl float dist = 1000000000 foreach ( entity node in routeNodes ) { - if( !node.HasKey("route_name") ) + if( !node.HasKey( "route_name" ) ) continue if ( Distance( npc.GetOrigin(), node.GetOrigin() ) < dist ) { @@ -182,7 +181,7 @@ void function droneNav_thread(entity npc, string routeName,int nodesToSkip= 0,fl firstNode = node } } - printt("Entity had no route defined: using nearest node: " + targetNode.kv.route_name) + printt( "Entity had no route defined: using nearest node: " + targetNode.kv.route_name ) } else { @@ -210,22 +209,22 @@ void function droneNav_thread(entity npc, string routeName,int nodesToSkip= 0,fl targetNode = targetNode.GetLinkEnt() if ( targetNode == null ) - printt("entity finished pathing") + printt( "entity finished pathing" ) if ( targetNode == null && shouldLoop ) { - printt("entity reached end of loop, looping") + printt( "entity reached end of loop, looping" ) targetNode = firstNode } } - npc.Signal("FD_ReachedHarvester") + npc.Signal( "FD_ReachedHarvester" ) } entity function GetRouteStart( string routeName ) { foreach( entity node in routeNodes ) { - if( !node.HasKey("route_name") ) + if( !node.HasKey( "route_name" ) ) continue if( expect string( node.kv.route_name ) == routeName ) { @@ -234,37 +233,38 @@ entity function GetRouteStart( string routeName ) } } -array function getRoute(string routeName) +array function getRoute( string routeName ) { array ret array currentNode = [] foreach(entity node in routeNodes) { - if(!node.HasKey("route_name")) + if( !node.HasKey( "route_name" ) ) continue - if(node.kv.route_name==routeName) + if( node.kv.route_name == routeName ) { currentNode = [node] break } } - if(currentNode.len()==0) + if( currentNode.len() == 0 ) { - printt("Route not found") + printt( "Route not found" ) return [] } - while(currentNode.len()!=0) + while( currentNode.len() != 0 ) { - ret.append(currentNode[0]) + ret.append( currentNode[0] ) currentNode = currentNode[0].GetLinkEntArray() } return ret } -void function Dev_MarkRoute(string routename){ - foreach(entity e in getRoute(routename)) +void function Dev_MarkRoute( string routename ) +{ + foreach( entity e in getRoute( routename ) ) { - DebugDrawSphere(e.GetOrigin(),30.0,255,0,255,false,40) + DebugDrawSphere( e.GetOrigin(), 30.0, 255, 0, 255, false, 40 ) } } \ No newline at end of file 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 4ff36dbf4..1781a21f7 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 @@ -28,8 +28,8 @@ void function CodeCallback_MapInit() // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } 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 0c12ad18f..46525ceac 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 @@ -6,8 +6,8 @@ void function CodeCallback_MapInit() AddSpawnCallback( "info_spawnpoint_titan_start", TrimBadTitanStartSpawns ) // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } 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 02b110108..f0c17dcfd 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_colony02.nut @@ -3,6 +3,10 @@ global function CodeCallback_MapInit void function CodeCallback_MapInit() { AddCallback_EntitiesDidLoad( CreateEvacNodes ) + + // Load Frontier Defense Data + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } void function CreateEvacNodes() @@ -16,10 +20,4 @@ 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_drydock.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut index 4bd40ff1f..e6eb493d2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_drydock.nut @@ -3,6 +3,6 @@ global function CodeCallback_MapInit void function CodeCallback_MapInit() { // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } \ 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 81d11795c..99965a1b2 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 @@ -15,9 +15,10 @@ 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() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } void function FixBatterySpawns( entity spawn ) 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 4bd40ff1f..e6eb493d2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_glitch.nut @@ -3,6 +3,6 @@ global function CodeCallback_MapInit void function CodeCallback_MapInit() { // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } \ 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 73059b9e3..9b5d30803 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_grave.nut @@ -6,7 +6,7 @@ void function CodeCallback_MapInit() AddSpawnCallback( "info_spawnpoint_titan_start", TrimBadTitanStartSpawns ) // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") + if( GameRules_GetGameMode() == "fd" ) initFrontierDefenseData() } 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 037014584..e6eb493d2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_homestead.nut @@ -3,8 +3,6 @@ global function CodeCallback_MapInit void function CodeCallback_MapInit() { // Load Frontier Defense Data - - print(GameRules_GetGameMode()) - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } \ 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 5c6a18ed6..3441fc607 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_relic02.nut @@ -1,6 +1,6 @@ void function CodeCallback_MapInit() { // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } \ 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 94dce4707..e6eb493d2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_rise.nut @@ -2,6 +2,7 @@ global function CodeCallback_MapInit void function CodeCallback_MapInit() { - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + // 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.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut index 5c6a18ed6..3441fc607 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut @@ -1,6 +1,6 @@ void function CodeCallback_MapInit() { // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } \ 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 d19d88eee..bb03f1f55 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_wargames.nut @@ -31,8 +31,8 @@ void function CodeCallback_MapInit() ClassicMP_SetLevelIntro( WargamesIntroSetup, 20.0 ) // Load Frontier Defense Data - if(GameRules_GetGameMode()=="fd") - initFrontierDefenseData() + if( GameRules_GetGameMode() == "fd" ) + initFrontierDefenseData() } From e507514d342bde6a9eb0eec51ef3a3d739219858 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Wed, 27 Jul 2022 03:33:18 +0100 Subject: [PATCH 75/99] [FD] Warning events, smoke changes, and improved kodai events (#456) * Add check to ensure spectre's weapon belongs to the spectre * Create CreateWarningEvent function * kodai event improvements (smoke + warnings) * what the hell * improve smokes a bit --- .../vscripts/ai/_ai_mortar_spectres.gnut | 3 + .../gamemodes/_gamemode_fd_events.nut | 35 +- .../mp/levels/mp_forwardbase_kodai_fd.nut | 1154 +++++++++-------- 3 files changed, 640 insertions(+), 552 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut index a136c2c9c..c63d9dd22 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_mortar_spectres.gnut @@ -147,6 +147,9 @@ void function MortarSpectreAttacksHarvester( entity spectre, entity harvester, e wait RandomFloatRange( 0, 4 ) // this is a complete guess, idk how long it takes for them to shoot normally while ( true ) { + // if the spectre drops the weapon, or if something somehow steals it, we should stop firing missiles from it + if ( weapon.GetWeaponOwner() != spectre ) + break entity missile = weapon.FireWeaponMissile( spectre.GetOrigin(), < 0, 0, 90 >, 1800.0, damageTypes.projectileImpact, damageTypes.explosive, false, PROJECTILE_NOT_PREDICTED ) weapon.SetWeaponPrimaryAmmoCount( weapon.GetWeaponPrimaryAmmoCount() - 1 ) // remove the ammo manually MortarMissileFiredCallback( missile, spectre ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index f72a08da9..17f761c12 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -23,6 +23,7 @@ global function CreateRoninTitanEvent global function CreateToneTitanEvent global function CreateLegionTitanEvent global function CreateMonarchTitanEvent +global function CreateWarningEvent global function executeWave global function restetWaveEvents @@ -69,7 +70,14 @@ global struct WaveEvent{ } - +global enum FD_IncomingWarnings +{ + CloakDrone, + ArcTitan, + Reaper, + MortarTitan, + NukeTitan +} global table< string, entity > GlobalEventEntitys global array< array > waveEvents @@ -561,6 +569,20 @@ WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string rout return event } + + +WaveEvent function CreateWarningEvent( int warningType, int nextEventIndex, int executeOnThisCall = 1 ) +{ + WaveEvent event + event.eventFunction = PlayWarning + event.executeOnThisCall = executeOnThisCall + event.nextEventIndex = nextEventIndex + event.shouldThread = false + + event.soundEvent.soundEventName = "fd_inc" + ["CloakDrone", "ArcTitan", "Reaper", "TitansMortar", "TitansNuke"][warningType] + "Clump" + return event +} + /************************************************************************************************************\ ####### # # ####### # # ####### ####### # # # # ##### ####### ### ####### # # ##### # # # # ## # # # # # ## # # # # # # # ## # # # @@ -571,18 +593,23 @@ WaveEvent function CreateSpawnDroneEvent(vector origin,vector angles,string rout ####### # ####### # # # # ##### # # ##### # ### ####### # # ##### \************************************************************************************************************/ -void function spawnSmoke( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) +void function PlayWarning( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) +{ + PlayFactionDialogueToTeam( soundEvent.soundEventName, TEAM_MILITIA ) +} + +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.origin = smokeEvent.position + < 0, 0, 100 > 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.fxOffsets = [ < 130.0, 0.0, 0.0 >, < 0.0, 130.0, 0.0 >, < 0.0, 0.0, 0.0 >, < 0.0, -130.0, 0.0 >, < -130.0, 0.0, 0.0 >, < 0.0, 100.0, 0.0 > ] Smokescreen(smokescreen) } 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 186b85fc4..2e3b031d7 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 @@ -5,567 +5,625 @@ void function initFrontierDefenseData() { shopPosition = < -3862.13, 1267.69, 1060.06 > + int index = 1 + array 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(CreateWaitUntilAliveWeightedEvent(8,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(CreateWaitUntilAliveWeightedEvent(8,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(CreateWaitUntilAliveWeightedEvent(8,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(CreateWaitUntilAliveWeightedEvent(8,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(CreateWaitUntilAliveWeightedEvent(8,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(CreateSmokeEvent(< -12, 1720, 1540 >, 90, index++)) + wave1.append(CreateWaitForTimeEvent(0.2,index++)) + wave1.append(CreateSmokeEvent(< -64, 964, 1540 >, 90, index++)) + wave1.append(CreateWaitForTimeEvent(0.4,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.9332962,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.1667023,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.0499954,index++)) + wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.0,index++)) + wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.1669998,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.6159973,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.8840027,index++)) + wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.5999985,index++)) + wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.3829956,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.6340027,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.3829956,index++)) + wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.5,index++)) + wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.5,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.9840088,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.5,index++)) + wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.2829895,index++)) + wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.5,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.1829987,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.449997,index++)) + wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.66700745,index++)) + wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(5.0,index++)) + wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) + wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.2169952,index++)) + wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(0.6159973,index++)) + wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) + wave1.append(CreateWaitForTimeEvent(1.4840088,index++)) wave1.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,0)) waveEvents.append(wave1) + index = 1 array 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(CreateWaitUntilAliveWeightedEvent(12,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(0.1,index++)) + wave2.append(CreateSmokeEvent(< -12, 1720, 1540 >, 120, index++)) + wave2.append(CreateWaitForTimeEvent(0.2,index++)) + wave2.append(CreateSmokeEvent(< -64, 964, 1540 >, 120, index++)) + wave2.append(CreateWaitForTimeEvent(0.7169983,index++)) + wave2.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(1.6500244,index++)) + wave2.append(CreateDroppodTickEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(1.0329895,index++)) + wave2.append(CreateDroppodTickEvent(< 1258.060059 , 921.593994 , 1330.750000 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++)) + wave2.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) + wave2.append(CreateWaitForTimeEvent(1.0159912,index++)) + wave2.append(CreateToneSniperTitanEvent(< 1209.469971 , 579.406006 , 1332.310059 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) + wave2.append(CreateWaitForTimeEvent(0.8999939,index++)) + wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.3000183,index++)) + wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.1499939,index++)) + wave2.append(CreateDroppodSpectreMortarEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodSpectreMortarEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.6000061,index++)) + wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.6999817,index++)) + wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(2.9160156,index++)) + wave2.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.8659973,index++)) + wave2.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.6839905,index++)) + wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.4160156,index++)) + wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.6000061,index++)) + wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) + wave2.append(CreateSuperSpectreEvent(< 1856.959961 , -3177.639893 , 812.718018 >,< -0.000000 , -162.389999 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.03302,index++)) + wave2.append(CreateSuperSpectreEvent(< 3123.000000 , 4201.589844 , 950.937988 >,< 0.000000 , -117.246002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(3.6169739,index++)) + wave2.append(CreateSuperSpectreEvent(< 681.140991 , -3538.780029 , 813.127014 >,< 0.000000 , -169.145996 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.78302,index++)) + wave2.append(CreateSuperSpectreEvent(< 2614.629883 , 4771.560059 , 947.968994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(3.1829834,index++)) + wave2.append(CreateSuperSpectreEvent(< 2184.969971 , -3550.040039 , 819.479980 >,< 0.000000 , 177.582993 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSuperSpectreEvent(< 1764.410034 , 4424.220215 , 953.375000 >,< -0.000000 , -170.024002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(1.1499939,index++)) + wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(1.1170044,index++)) + wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",index++)) + wave2.append(CreateWaitForTimeEvent(0.8829956,index++)) + wave2.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(3.5169983,index++)) + wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodGruntEvent(< 3248.840088 , 161.156006 , 951.781006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(2.6660156,index++)) + wave2.append(CreateDroppodGruntEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.1999817,index++)) + wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSuperSpectreEvent(< 4163.069824 , 1471.650024 , 944.281006 >,< -0.000000 , -179.416000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.5159912,index++)) + wave2.append(CreateSuperSpectreEvent(< 4210.669922 , 895.575989 , 944.281006 >,< -0.000000 , -164.787003 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(2.75,index++)) + wave2.append(CreateSuperSpectreEvent(< 3577.010010 , 1491.959961 , 944.281006 >,< -0.000000 , 169.908005 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.1340027,index++)) + wave2.append(CreateSuperSpectreEvent(< 3982.860107 , 1778.540039 , 944.281006 >,< -0.000000 , 179.488007 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.3840027,index++)) + wave2.append(CreateDroppodGruntEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSuperSpectreEvent(< 2182.939941 , -3549.810059 , 819.468994 >,< 0.000000 , 177.582993 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.1159668,index++)) + wave2.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.5670166,index++)) + wave2.append(CreateSuperSpectreEvent(< 2357.739990 , 4476.339844 , 962.960022 >,< -0.000000 , 177.669998 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.7000122,index++)) + wave2.append(CreateDroppodGruntEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSmokeEvent(< 2684, 1252, 1092 >, 120, index++)) + wave2.append(CreateWaitForTimeEvent(0.2,index++)) + wave2.append(CreateSmokeEvent(< 2452, 1812, 1092 >, 120, index++)) + wave2.append(CreateWaitForTimeEvent(0.2,index++)) + wave2.append(CreateSmokeEvent(< 2336, 636, 1092 >, 120, index++)) + wave2.append(CreateWaitForTimeEvent(0.6,index++)) + wave2.append(CreateSuperSpectreEvent(< 2343.590088 , -3185.840088 , 788.312988 >,< -0.000000 , 174.550995 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.8500366,index++)) + wave2.append(CreateSuperSpectreEvent(< 2338.270020 , 4684.279785 , 952.682007 >,< -0.000000 , -167.669006 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSuperSpectreEvent(< 2177.209961 , -3539.600098 , 817.719971 >,< 0.000000 , 178.065994 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.0,index++)) + wave2.append(CreateSuperSpectreEvent(< 2401.719971 , 4475.089844 , 962.406006 >,< 0.000000 , 177.626999 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.0,index++)) + wave2.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.032959,index++)) + wave2.append(CreateSuperSpectreEvent(< 2576.909912 , -3007.250000 , 796.093994 >,< 0.000000 , -165.850006 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.28302002,index++)) + wave2.append(CreateIonTitanEvent(< 2614.879883 , 4771.560059 , 951.000000 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.7839966,index++)) + wave2.append(CreateSuperSpectreEvent(< 2828.399902 , 4138.450195 , 938.893982 >,< 0.000000 , -171.078995 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateSuperSpectreEvent(< 4182.189941 , 917.906006 , 944.281006 >,< 0.000000 , -124.805000 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.3170166,index++)) + wave2.append(CreateSuperSpectreEvent(< 2747.790039 , 1574.170044 , 944.281006 >,< -0.000000 , -164.485001 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(5.0,index++)) + wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave2.append(CreateScorchTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.0,index++)) + wave2.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(0.1159668,index++)) + wave2.append(CreateSuperSpectreEvent(< 2169.590088 , -3540.250000 , 817.875000 >,< -0.000000 , 178.065002 , 0.000000 >,"",index++)) + wave2.append(CreateWaitForTimeEvent(1.3840332,index++)) wave2.append(CreateSuperSpectreEvent(< 2354.810059 , 4476.589844 , 962.968994 >,< -0.000000 , 177.759003 , 0.000000 >,"",0)) waveEvents.append(wave2) + index = 1 array 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(CreateCloakDroneEvent(< 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,31)) - wave3.append(CreateSpawnDroneEvent(< 2487.310059 , -2561.379883 , 5744.229980 >,< 0.004999 , 90.003700 , 0.000004 >,"",32, false)) - wave3.append(CreateWaitForTimeEvent(0.0,33)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",34, false)) - wave3.append(CreateWaitForTimeEvent(0.0,35)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",36, false)) - wave3.append(CreateWaitForTimeEvent(0.0,37)) - wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",38, false)) - wave3.append(CreateWaitForTimeEvent(5.0,39)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 1923.000000 , -1544.000000 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,92)) - wave3.append(CreateWaitForTimeEvent(1.3330078,93)) - wave3.append(CreateCloakDroneEvent(< 1982.020020 , -1598.000000 , 1236.040039 >,< 0.000000 , 0.000000 , 0.000000 >,94)) - wave3.append(CreateWaitForTimeEvent(5.0,95)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,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(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.1670288,index++)) + wave3.append(CreateSmokeEvent(< -2264, -2096, 928 >, 120, index++)) + wave3.append(CreateWaitForTimeEvent(0.333,index++)) + wave3.append(CreateSmokeEvent(< -3132, -1904, 928 >, 120, index++)) + wave3.append(CreateWaitForTimeEvent(0.2,index++)) + wave3.append(CreateSmokeEvent(< -1548, -2240, 928 >, 120, index++)) + wave3.append(CreateWaitForTimeEvent(0.067,index++)) + wave3.append(CreateCloakDroneEvent(< 1883.910034 , -1569.939941 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave3.append(CreateWaitForTimeEvent(1.1499634,index++)) + wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.3829956,index++)) + wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(3.4000244,index++)) + wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.1170044,index++)) + wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) + wave3.append(CreateSuperSpectreEvent(< 2170.020020 , -3549.570068 , 819.468994 >,< -0.000000 , 177.626007 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0669556,index++)) + wave3.append(CreateSuperSpectreEvent(< 2577.060059 , -3007.379883 , 796.093994 >,< -0.000000 , -165.850006 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.1329956,index++)) + wave3.append(CreateSuperSpectreEvent(< 1512.939941 , -3294.090088 , 798.000000 >,< -0.000000 , 89.077103 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.4000244,index++)) + wave3.append(CreateSuperSpectreEvent(< 1531.000000 , -1779.880005 , 800.031006 >,< 0.000000 , 133.110001 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.6829834,index++)) + wave3.append(CreateIonTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.7839966,index++)) + wave3.append(CreateIonTitanEvent(< 1503.810059 , -3600.189941 , 813.687988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0,index++)) + wave3.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateSpawnDroneEvent(< 2487.310059 , -2561.379883 , 5744.229980 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) + wave3.append(CreateWaitForTimeEvent(0.0,index++)) + wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) + wave3.append(CreateWaitForTimeEvent(0.0,index++)) + wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) + wave3.append(CreateWaitForTimeEvent(0.0,index++)) + wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.282959,index++)) + wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(2.6170044,index++)) + wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.9660034,index++)) + wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave3.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) + wave3.append(CreateWaitForTimeEvent(0.6170044,index++)) + wave3.append(CreateMonarchTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.61602783,index++)) + wave3.append(CreateRoninTitanEvent(< 2359.840088 , -1596.750000 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.9840088,index++)) + wave3.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave3.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateSuperSpectreEvent(< 2180.080078 , -3539.689941 , 817.739014 >,< 0.000000 , 178.065994 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.6329956,index++)) + wave3.append(CreateLegionTitanEvent(< 2680.219971 , -1724.630005 , 809.718994 >,< 0.000000 , 169.320999 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.06695557,index++)) + wave3.append(CreateSuperSpectreEvent(< 2533.800049 , -3018.310059 , 795.421021 >,< 0.000000 , -165.806000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0170288,index++)) + wave3.append(CreateLegionTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.16601562,index++)) + wave3.append(CreateSuperSpectreEvent(< 1512.839966 , -3298.719971 , 797.968994 >,< -0.000000 , 89.120796 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.0,index++)) + wave3.append(CreateSuperSpectreEvent(< 1499.910034 , -1748.660034 , 801.656006 >,< -0.000000 , 132.934998 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(2.2340088,index++)) + wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.4829712,index++)) + wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(2.9000244,index++)) + wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.5999756,index++)) + wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.6829834,index++)) + wave3.append(CreateScorchTitanEvent(< 1503.910034 , -3600.659912 , 813.781006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.3170166,index++)) + wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateToneTitanEvent(< 1763.810059 , -1608.189941 , 810.000000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.9000244,index++)) + wave3.append(CreateToneTitanEvent(< 2359.810059 , -1596.189941 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.5839844,index++)) + wave3.append(CreateWarningEvent(FD_IncomingWarnings.CloakDrone,index++)) + wave3.append(CreateCloakDroneEvent(< 1923.000000 , -1544.000000 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave3.append(CreateWaitForTimeEvent(1.3330078,index++)) + wave3.append(CreateCloakDroneEvent(< 1982.020020 , -1598.000000 , 1236.040039 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave3.append(CreateWaitForTimeEvent(5.0,index++)) + wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave3.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(0.7999878,index++)) + wave3.append(CreateLegionTitanEvent(< 4453.589844 , 964.906006 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) + wave3.append(CreateWaitForTimeEvent(1.4000244,index++)) wave3.append(CreateMonarchTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) waveEvents.append(wave3) + index = 1 array 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.6000366,index++)) + wave4.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) + wave4.append(CreateWaitForTimeEvent(0.1,index++)) + wave4.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) + wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.1,index++)) + wave4.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) + wave4.append(CreateWaitForTimeEvent(0.8,index++)) + wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.8829956,index++)) + wave4.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.6000366,index++)) + wave4.append(CreateToneTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0,index++)) + wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2000122,index++)) + wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.5,index++)) + wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.3499756,index++)) + wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2999878,index++)) + wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.7000122,index++)) + wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.9830322,index++)) + wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(3.5999756,index++)) + wave4.append(CreateWarningEvent(FD_IncomingWarnings.MortarTitan,index++)) + wave4.append(CreateMortarTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,index++)) + wave4.append(CreateWaitForTimeEvent(0.5830078,index++)) + wave4.append(CreateMortarTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,index++)) + wave4.append(CreateWaitForTimeEvent(1.3499756,index++)) + wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0670166,index++)) + wave4.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.21698,index++)) + wave4.append(CreateIonTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.9160156,index++)) + wave4.append(CreateIonTitanEvent(< 3144.159912 , 2935.530029 , 917.187988 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.684021,index++)) + wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.5999756,index++)) + wave4.append(CreateNukeTitanEvent(< -31.906300 , 4688.660156 , 1027.660034 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2659912,index++)) + wave4.append(CreateNukeTitanEvent(< 1293.939941 , 1827.410034 , 1321.750000 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.5339966,index++)) + wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.3000488,index++)) + wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave4.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) + wave4.append(CreateSuperSpectreEvent(< 2355.209961 , 4472.799805 , 963.218994 >,< -0.000000 , 175.473007 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.5999756,index++)) + wave4.append(CreateSuperSpectreEvent(< 2835.689941 , 4139.939941 , 939.281006 >,< 0.000000 , -171.078995 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0170288,index++)) + wave4.append(CreateSuperSpectreEvent(< 1014.690002 , 4844.540039 , 941.236023 >,< -0.000000 , 173.994995 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.6170044,index++)) + wave4.append(CreateSuperSpectreEvent(< 2833.949951 , 2953.350098 , 910.458008 >,< -0.000000 , 178.046997 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.5830078,index++)) + wave4.append(CreateSuperSpectreEvent(< 4164.439941 , 1471.750000 , 944.281006 >,< -0.000000 , -179.429001 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.117004395,index++)) + wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave4.append(CreateSuperSpectreEvent(< 4207.680176 , 894.888977 , 944.281006 >,< -0.000000 , -167.283005 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.21600342,index++)) + wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.9840088,index++)) + wave4.append(CreateSuperSpectreEvent(< 3570.689941 , 1491.780029 , 944.281006 >,< 0.000000 , 169.761002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.23297119,index++)) + wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.3670044,index++)) + wave4.append(CreateSuperSpectreEvent(< 3604.739990 , 835.104004 , 944.281006 >,< -0.000000 , -159.296997 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave4.append(CreateWarningEvent(FD_IncomingWarnings.ArcTitan,index++)) + wave4.append(CreateArcTitanEvent(< 2665.469971 , 4456.529785 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.1,index++)) + wave4.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) + wave4.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) + wave4.append(CreateWaitForTimeEvent(0.2,index++)) + wave4.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) + wave4.append(CreateWaitForTimeEvent(0.9199829,index++)) + wave4.append(CreateArcTitanEvent(< 3123.659912 , 4202.089844 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.6799927,index++)) + wave4.append(CreateScorchTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2200317,index++)) + wave4.append(CreateScorchTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.90997314,index++)) + wave4.append(CreateToneTitanEvent(< 3738.659912 , 1985.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.5700073,index++)) + wave4.append(CreateToneTitanEvent(< -31.812500 , 4688.189941 , 1027.560059 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.4000244,index++)) + wave4.append(CreateRoninTitanEvent(< 1294.030029 , 1827.339966 , 1321.719971 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.9299927,index++)) + wave4.append(CreateRoninTitanEvent(< 4278.029785 , 1771.339966 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.8899536,index++)) + wave4.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,index++)) + wave4.append(CreateWaitForTimeEvent(1.210083,index++)) + wave4.append(CreateToneSniperTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,index++)) + wave4.append(CreateWaitForTimeEvent(1.0,index++)) + wave4.append(CreateCloakDroneEvent(< 4432.939941 , 1262.939941 , 1244.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave4.append(CreateWaitForTimeEvent(4.3898926,index++)) + wave4.append(CreateSuperSpectreEvent(< 3878.439941 , 933.812988 , 944.281006 >,< -0.000000 , -79.509102 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.2000732,index++)) + wave4.append(CreateSuperSpectreEvent(< 4008.780029 , 378.406006 , 944.281006 >,< 0.000000 , -120.498001 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.92993164,index++)) + wave4.append(CreateSuperSpectreEvent(< 2916.810059 , 2679.780029 , 939.000000 >,< -0.000000 , -44.335999 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.5800781,index++)) + wave4.append(CreateSuperSpectreEvent(< 545.906006 , 1309.910034 , 1438.750000 >,< 0.000000 , -166.860001 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(5.0,index++)) + wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave4.append(CreateWarningEvent(FD_IncomingWarnings.NukeTitan,index++)) + wave4.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.0198975,index++)) + wave4.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.9000244,index++)) + wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(1.5,index++)) + wave4.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave4.append(CreateWaitForTimeEvent(0.60998535,index++)) wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) waveEvents.append(wave4) + index = 1 array 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 2674.979980 , 4322.020020 , 1283.979980 >,< 0.000000 , 0.000000 , 0.000000 >,104)) - wave5.append(CreateWaitForTimeEvent(5.0,105)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,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(CreateCloakDroneEvent(< 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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateWaitUntilAliveWeightedEvent(16,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(CreateSmokeEvent(< -12, 1720, 1540 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.1,index++)) + wave5.append(CreateSmokeEvent(< -64, 964, 1540 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.3,index++)) + wave5.append(CreateSmokeEvent(< -2264, -2096, 928 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.3,index++)) + wave5.append(CreateSmokeEvent(< -3132, -1904, 928 >, 120, index++)) + wave5.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",index++)) + wave5.append(CreateWaitForTimeEvent(0.1,index++)) + wave5.append(CreateSmokeEvent(< -1548, -2240, 928 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.1,index++)) + wave5.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.2,index++)) + wave5.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.3,index++)) + wave5.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) + wave5.append(CreateWaitForTimeEvent(0.4,index++)) + wave5.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",index++)) + wave5.append(CreateWaitForTimeEvent(0.79992676,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.9400635,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateSuperSpectreEvent(< 1094.089966 , 1330.660034 , 1354.969971 >,< -0.000000 , 157.544006 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.7800293,index++)) + wave5.append(CreateSuperSpectreEvent(< 857.406006 , 739.843994 , 1373.030029 >,< -0.000000 , 151.962997 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(2.0700684,index++)) + wave5.append(CreateSuperSpectreEvent(< 1048.969971 , 1660.810059 , 1349.089966 >,< 0.000000 , -100.986000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.2099609,index++)) + wave5.append(CreateSuperSpectreEvent(< 2724.129883 , 2458.629883 , 946.155029 >,< -0.000000 , -127.245003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateSuperSpectreEvent(< 1092.119995 , 1331.380005 , 1355.650024 >,< 0.000000 , 157.500000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.1699219,index++)) + wave5.append(CreateSuperSpectreEvent(< 938.187988 , 707.406006 , 1362.939941 >,< -0.000000 , 153.720993 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(2.710083,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.1199951,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(2.2999268,index++)) + wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) + wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.8000488,index++)) + wave5.append(CreateSuperSpectreEvent(< 1511.339966 , -1445.229980 , 825.757996 >,< -0.000000 , 141.589996 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.099975586,index++)) + wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.57995605,index++)) + wave5.append(CreateSuperSpectreEvent(< 2086.750000 , -1459.000000 , 810.750000 >,< -0.000000 , 143.964996 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.6199951,index++)) + wave5.append(CreateIonTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.8800049,index++)) + wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3399658,index++)) + wave5.append(CreateLegionTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.92004395,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateIonTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.9499512,index++)) + wave5.append(CreateIonTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.17004395,index++)) + wave5.append(CreateSuperSpectreEvent(< 1548.780029 , -1475.209961 , 805.556030 >,< -0.000000 , 141.876999 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.5,index++)) + wave5.append(CreateSuperSpectreEvent(< 2087.750000 , -1461.540039 , 810.366028 >,< -0.000000 , 143.395004 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(3.9799805,index++)) + wave5.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3399658,index++)) + wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.85998535,index++)) + wave5.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.9400635,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.1099854,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.9899902,index++)) + wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.8100586,index++)) + wave5.append(CreateScorchTitanEvent(< 2411.909912 , -1108.660034 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.289917,index++)) + wave5.append(CreateSuperSpectreEvent(< 1511.310059 , -1437.780029 , 826.656006 >,< -0.000000 , 142.382996 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.710083,index++)) + wave5.append(CreateSuperSpectreEvent(< 2129.800049 , -1492.459961 , 806.202026 >,< 0.000000 , 143.744995 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.5600586,index++)) + wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3199463,index++)) + wave5.append(CreateMonarchTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateSuperSpectreEvent(< 1511.160034 , -1437.079956 , 809.958008 >,< -0.000000 , 142.475998 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.1899414,index++)) + wave5.append(CreateSuperSpectreEvent(< 2091.909912 , -1464.430054 , 809.992981 >,< -0.000000 , 143.503998 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.8800049,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.1500244,index++)) + wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.3499756,index++)) + wave5.append(CreateSuperSpectreEvent(< 1452.199951 , -1794.530029 , 804.614990 >,< -0.000000 , 112.485001 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.22998047,index++)) + wave5.append(CreateDroppodStalkerEvent(< 896.656006 , -1227.339966 , 964.437988 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.8699951,index++)) + wave5.append(CreateSuperSpectreEvent(< 2162.209961 , -1065.609985 , 806.807007 >,< -0.000000 , -174.283005 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.11999512,index++)) + wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.5999756,index++)) + wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.60009766,index++)) + wave5.append(CreateCloakDroneEvent(< 2674.979980 , 4322.020020 , 1283.979980 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) + wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.70007324,index++)) + wave5.append(CreateCloakDroneEvent(< 2363.000000 , -3327.010010 , 1235.989990 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) + wave5.append(CreateWaitForTimeEvent(6.0,index++)) + wave5.append(CreateScorchTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) + wave5.append(CreateScorchTitanEvent(< 2359.909912 , -1596.660034 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.4000244,index++)) + wave5.append(CreateIonTitanEvent(< 1559.810059 , -2024.189941 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.6999512,index++)) + wave5.append(CreateIonTitanEvent(< 2411.810059 , -1108.189941 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) + wave5.append(CreateWaitForTimeEvent(0.9000244,index++)) + wave5.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,index++)) + wave5.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave5.append(CreateArcTitanEvent(< 3867.219971 , 1445.689941 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateNukeTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.2000732,index++)) + wave5.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) + wave5.append(CreateNukeTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.8000488,index++)) + wave5.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.0999756,index++)) + wave5.append(CreateNukeTitanEvent(< 1817.469971 , -3586.379883 , 814.062988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(0.6999512,index++)) + wave5.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(5.0,index++)) + wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) + wave5.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) + wave5.append(CreateToneTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) + wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) wave5.append(CreateScorchTitanEvent(< 3867.129883 , 1445.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) waveEvents.append(wave5) From 3fdf27f65d36b96eea3afe71fbd552944fdb1f7c Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Wed, 27 Jul 2022 22:48:54 +0100 Subject: [PATCH 76/99] [FD] Drones fix + formatting (#457) * nav improvements * formatting kodai events * formatting spawnSmoke * remove redundant section --- .../vscripts/gamemodes/_gamemode_fd.nut | 5 - .../gamemodes/_gamemode_fd_events.nut | 3 +- .../vscripts/gamemodes/_gamemode_fd_nav.nut | 13 +- .../mp/levels/mp_forwardbase_kodai_fd.nut | 1260 ++++++++--------- 4 files changed, 624 insertions(+), 657 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index c8ad470d3..423e2ce62 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -171,11 +171,6 @@ void function GamemodeFD_InitPlayer( entity player ) 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 diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 17f761c12..d66061551 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -598,7 +598,7 @@ void function PlayWarning( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowCon PlayFactionDialogueToTeam( soundEvent.soundEventName, TEAM_MILITIA ) } -void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControlEvent flowControlEvent,SoundEvent soundEvent) +void function spawnSmoke( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { printt( "smoke" ) SmokescreenStruct smokescreen @@ -613,6 +613,7 @@ void function spawnSmoke(SmokeEvent smokeEvent,SpawnEvent spawnEvent,FlowControl Smokescreen(smokescreen) } + void function spawnDrones( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { //TODO diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index 2d76c99ed..cf7827f7c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -6,7 +6,7 @@ global function Dev_MarkRoute -void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0, float nextDistance = 500.0, bool shouldLoop = false ) +void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0, float nextDistance = -1.0, bool shouldLoop = false ) { npc.EndSignal( "OnDeath" ) npc.EndSignal( "OnDestroy" ) @@ -15,7 +15,8 @@ void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0 if( !npc.IsNPC() ) return - + if ( nextDistance == -1 ) + nextDistance = npc.GetMinGoalRadius() /*array routeArray = getRoute(routeName) @@ -83,7 +84,7 @@ void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0 npc.AssaultSetGoalRadius( nextDistance ) npc.AssaultSetFightRadius( 0 ) - table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" ) + table result = npc.WaitSignal( "OnFinishedAssault", "OnEnterGoalRadius", "OnFailedToPath" ) targetNode = targetNode.GetLinkEnt() } @@ -205,14 +206,14 @@ void function droneNav_thread( entity npc, string routeName,int nodesToSkip= 0,f npc.AssaultSetGoalHeight( 100 ) npc.AssaultSetFightRadius( 0 ) - table result = npc.WaitSignal( "OnFinishedAssault", "OnFailedToPath" ) + table result = npc.WaitSignal( "OnFinishedAssault", "OnEnterGoalRadius", "OnFailedToPath" ) targetNode = targetNode.GetLinkEnt() if ( targetNode == null ) - printt( "entity finished pathing" ) + printt( "drone finished pathing" ) if ( targetNode == null && shouldLoop ) { - printt( "entity reached end of loop, looping" ) + printt( "drone reached end of loop, looping" ) targetNode = firstNode } } 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 2e3b031d7..e7a042945 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 @@ -7,653 +7,623 @@ void function initFrontierDefenseData() int index = 1 - array wave1 - wave1.append(CreateSmokeEvent(< -12, 1720, 1540 >, 90, index++)) - wave1.append(CreateWaitForTimeEvent(0.2,index++)) - wave1.append(CreateSmokeEvent(< -64, 964, 1540 >, 90, index++)) - wave1.append(CreateWaitForTimeEvent(0.4,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.9332962,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.1667023,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.0499954,index++)) - wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.0,index++)) - wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.1669998,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.6159973,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.8840027,index++)) - wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.5999985,index++)) - wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.3829956,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.6340027,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.3829956,index++)) - wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.5,index++)) - wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.5,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.9840088,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.5,index++)) - wave1.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.2829895,index++)) - wave1.append(CreateDroppodStalkerEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.5,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.1829987,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.449997,index++)) - wave1.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.66700745,index++)) - wave1.append(CreateDroppodGruntEvent(< 1116.630005 , 329.750000 , 1372.280029 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(5.0,index++)) - wave1.append(CreateWaitUntilAliveWeightedEvent(8,index++)) - wave1.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.2169952,index++)) - wave1.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(0.6159973,index++)) - wave1.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"hillRouteClose",index++)) - wave1.append(CreateWaitForTimeEvent(1.4840088,index++)) - wave1.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,0)) - waveEvents.append(wave1) + array< WaveEvent > wave1 + wave1.append( CreateSmokeEvent( < -12, 1720, 1540 >, 90, index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave1.append( CreateSmokeEvent( < -64, 964, 1540 >, 90, index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.4, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.9332962, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.1667023, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.0499954, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1258.060059, 921.593994, 1330.750000 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1116.630005, 329.750000, 1372.280029 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave1.append( CreateWaitUntilAliveWeightedEvent( 8, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.1669998, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.6159973, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.8840027, index++ ) ) + wave1.append( CreateDroppodStalkerEvent( < 1258.060059, 921.593994, 1330.750000 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.5999985, index++ ) ) + wave1.append( CreateDroppodStalkerEvent( < 1116.630005, 329.750000, 1372.280029 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave1.append( CreateWaitUntilAliveWeightedEvent( 8, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.3829956, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.6340027, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.3829956, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1258.060059, 921.593994, 1330.750000 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1116.630005, 329.750000, 1372.280029 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave1.append( CreateWaitUntilAliveWeightedEvent( 8, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.9840088, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave1.append( CreateDroppodStalkerEvent( < 1258.060059, 921.593994, 1330.750000 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.2829895, index++ ) ) + wave1.append( CreateDroppodStalkerEvent( < 1116.630005, 329.750000, 1372.280029 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave1.append( CreateWaitUntilAliveWeightedEvent( 8, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.1829987, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.449997, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1258.060059, 921.593994, 1330.750000 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.66700745, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1116.630005, 329.750000, 1372.280029 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave1.append( CreateWaitUntilAliveWeightedEvent( 8, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.2169952, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 0.6159973, index++ ) ) + wave1.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "hillRouteClose", index++ ) ) + wave1.append( CreateWaitForTimeEvent( 1.4840088, index++ ) ) + wave1.append( CreateToneSniperTitanEvent( < 1373.469971, 1219.410034, 1314.339966 >, < 0.000000, 169.541000, 0.000000 >, 0 ) ) + waveEvents.append( wave1 ) index = 1 - array wave2 - wave2.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(0.1,index++)) - wave2.append(CreateSmokeEvent(< -12, 1720, 1540 >, 120, index++)) - wave2.append(CreateWaitForTimeEvent(0.2,index++)) - wave2.append(CreateSmokeEvent(< -64, 964, 1540 >, 120, index++)) - wave2.append(CreateWaitForTimeEvent(0.7169983,index++)) - wave2.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(1.6500244,index++)) - wave2.append(CreateDroppodTickEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(1.0329895,index++)) - wave2.append(CreateDroppodTickEvent(< 1258.060059 , 921.593994 , 1330.750000 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(12,index++)) - wave2.append(CreateToneSniperTitanEvent(< 1373.469971 , 1219.410034 , 1314.339966 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) - wave2.append(CreateWaitForTimeEvent(1.0159912,index++)) - wave2.append(CreateToneSniperTitanEvent(< 1209.469971 , 579.406006 , 1332.310059 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) - wave2.append(CreateWaitForTimeEvent(0.8999939,index++)) - wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.3000183,index++)) - wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.1499939,index++)) - wave2.append(CreateDroppodSpectreMortarEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodSpectreMortarEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.6000061,index++)) - wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.6999817,index++)) - wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(2.9160156,index++)) - wave2.append(CreateDroppodGruntEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodGruntEvent(< 864.625000 , 693.750000 , 1379.910034 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.8659973,index++)) - wave2.append(CreateDroppodGruntEvent(< 884.625000 , 1721.750000 , 1377.410034 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.6839905,index++)) - wave2.append(CreateDroppodGruntEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.4160156,index++)) - wave2.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.6000061,index++)) - wave2.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) - wave2.append(CreateSuperSpectreEvent(< 1856.959961 , -3177.639893 , 812.718018 >,< -0.000000 , -162.389999 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.03302,index++)) - wave2.append(CreateSuperSpectreEvent(< 3123.000000 , 4201.589844 , 950.937988 >,< 0.000000 , -117.246002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(3.6169739,index++)) - wave2.append(CreateSuperSpectreEvent(< 681.140991 , -3538.780029 , 813.127014 >,< 0.000000 , -169.145996 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.78302,index++)) - wave2.append(CreateSuperSpectreEvent(< 2614.629883 , 4771.560059 , 947.968994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(3.1829834,index++)) - wave2.append(CreateSuperSpectreEvent(< 2184.969971 , -3550.040039 , 819.479980 >,< 0.000000 , 177.582993 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSuperSpectreEvent(< 1764.410034 , 4424.220215 , 953.375000 >,< -0.000000 , -170.024002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(1.1499939,index++)) - wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodTickEvent(< 3248.840088 , 161.156006 , 951.781006 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(1.1170044,index++)) - wave2.append(CreateDroppodTickEvent(< 3156.560059 , 2266.939941 , 951.781006 >,4,"hillRouteClose",index++)) - wave2.append(CreateWaitForTimeEvent(0.8829956,index++)) - wave2.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(3.5169983,index++)) - wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodGruntEvent(< 3248.840088 , 161.156006 , 951.781006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(2.6660156,index++)) - wave2.append(CreateDroppodGruntEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.1999817,index++)) - wave2.append(CreateDroppodGruntEvent(< 2336.000000 , 1968.000000 , 953.531006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSuperSpectreEvent(< 4163.069824 , 1471.650024 , 944.281006 >,< -0.000000 , -179.416000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.5159912,index++)) - wave2.append(CreateSuperSpectreEvent(< 4210.669922 , 895.575989 , 944.281006 >,< -0.000000 , -164.787003 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(2.75,index++)) - wave2.append(CreateSuperSpectreEvent(< 3577.010010 , 1491.959961 , 944.281006 >,< -0.000000 , 169.908005 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.1340027,index++)) - wave2.append(CreateSuperSpectreEvent(< 3982.860107 , 1778.540039 , 944.281006 >,< -0.000000 , 179.488007 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.3840027,index++)) - wave2.append(CreateDroppodGruntEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSuperSpectreEvent(< 2182.939941 , -3549.810059 , 819.468994 >,< 0.000000 , 177.582993 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.1159668,index++)) - wave2.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.5670166,index++)) - wave2.append(CreateSuperSpectreEvent(< 2357.739990 , 4476.339844 , 962.960022 >,< -0.000000 , 177.669998 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.7000122,index++)) - wave2.append(CreateDroppodGruntEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSmokeEvent(< 2684, 1252, 1092 >, 120, index++)) - wave2.append(CreateWaitForTimeEvent(0.2,index++)) - wave2.append(CreateSmokeEvent(< 2452, 1812, 1092 >, 120, index++)) - wave2.append(CreateWaitForTimeEvent(0.2,index++)) - wave2.append(CreateSmokeEvent(< 2336, 636, 1092 >, 120, index++)) - wave2.append(CreateWaitForTimeEvent(0.6,index++)) - wave2.append(CreateSuperSpectreEvent(< 2343.590088 , -3185.840088 , 788.312988 >,< -0.000000 , 174.550995 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.8500366,index++)) - wave2.append(CreateSuperSpectreEvent(< 2338.270020 , 4684.279785 , 952.682007 >,< -0.000000 , -167.669006 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSuperSpectreEvent(< 2177.209961 , -3539.600098 , 817.719971 >,< 0.000000 , 178.065994 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.0,index++)) - wave2.append(CreateSuperSpectreEvent(< 2401.719971 , 4475.089844 , 962.406006 >,< 0.000000 , 177.626999 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.0,index++)) - wave2.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.032959,index++)) - wave2.append(CreateSuperSpectreEvent(< 2576.909912 , -3007.250000 , 796.093994 >,< 0.000000 , -165.850006 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.28302002,index++)) - wave2.append(CreateIonTitanEvent(< 2614.879883 , 4771.560059 , 951.000000 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.7839966,index++)) - wave2.append(CreateSuperSpectreEvent(< 2828.399902 , 4138.450195 , 938.893982 >,< 0.000000 , -171.078995 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateSuperSpectreEvent(< 4182.189941 , 917.906006 , 944.281006 >,< 0.000000 , -124.805000 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.3170166,index++)) - wave2.append(CreateSuperSpectreEvent(< 2747.790039 , 1574.170044 , 944.281006 >,< -0.000000 , -164.485001 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(5.0,index++)) - wave2.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave2.append(CreateScorchTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.0,index++)) - wave2.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(0.1159668,index++)) - wave2.append(CreateSuperSpectreEvent(< 2169.590088 , -3540.250000 , 817.875000 >,< -0.000000 , 178.065002 , 0.000000 >,"",index++)) - wave2.append(CreateWaitForTimeEvent(1.3840332,index++)) - wave2.append(CreateSuperSpectreEvent(< 2354.810059 , 4476.589844 , 962.968994 >,< -0.000000 , 177.759003 , 0.000000 >,"",0)) - waveEvents.append(wave2) + array< WaveEvent > wave2 + wave2.append( CreateDroppodTickEvent( < 864.625000, 693.750000, 1379.910034 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave2.append( CreateSmokeEvent( < -12, 1720, 1540 >, 120, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave2.append( CreateSmokeEvent( < -64, 964, 1540 >, 120, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.7169983, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 884.625000, 1721.750000, 1377.410034 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.6500244, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 1226.410034, 1391.130005, 1334.689941 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.0329895, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 1258.060059, 921.593994, 1330.750000 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 12, index++ ) ) + wave2.append( CreateToneSniperTitanEvent( < 1373.469971, 1219.410034, 1314.339966 >, < 0.000000, 169.541000, 0.000000 >, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.0159912, index++ ) ) + wave2.append( CreateToneSniperTitanEvent( < 1209.469971, 579.406006, 1332.310059 >, < 0.000000, 169.541000, 0.000000 >, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.8999939, index++ ) ) + wave2.append( CreateToneTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.3000183, index++ ) ) + wave2.append( CreateToneTitanEvent( < 2665.060059, 4456.129883, 960.687988 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.1499939, index++ ) ) + wave2.append( CreateDroppodSpectreMortarEvent( < 864.625000, 693.750000, 1379.910034 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodSpectreMortarEvent( < 884.625000, 1721.750000, 1377.410034 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.6000061, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.6999817, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 2.9160156, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 1258.060059, 921.593994, 1330.750000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 864.625000, 693.750000, 1379.910034 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.8659973, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 884.625000, 1721.750000, 1377.410034 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.6839905, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 1226.410034, 1391.130005, 1334.689941 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.4160156, index++ ) ) + wave2.append( CreateToneTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.6000061, index++ ) ) + wave2.append( CreateToneTitanEvent( < 2665.060059, 4456.129883, 960.687988 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateWarningEvent( FD_IncomingWarnings.Reaper, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 1856.959961, -3177.639893, 812.718018 >, < -0.000000, -162.389999, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.03302, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 3123.000000, 4201.589844, 950.937988 >, < 0.000000, -117.246002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 3.6169739, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 681.140991, -3538.780029, 813.127014 >, < 0.000000, -169.145996, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.78302, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2614.629883, 4771.560059, 947.968994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 3.1829834, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2184.969971, -3550.040039, 819.479980 >, < 0.000000, 177.582993, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 1764.410034, 4424.220215, 953.375000 >, < -0.000000, -170.024002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 3248.840088, 161.156006, 951.781006 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.1499939, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 3156.560059, 2266.939941, 951.781006 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 3248.840088, 161.156006, 951.781006 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.1170044, index++ ) ) + wave2.append( CreateDroppodTickEvent( < 3156.560059, 2266.939941, 951.781006 >, 4, "hillRouteClose", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.8829956, index++ ) ) + wave2.append( CreateToneTitanEvent( < 4466.220215, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 3.5169983, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 2336.000000, 1968.000000, 953.531006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 3248.840088, 161.156006, 951.781006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 2.6660156, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 3156.560059, 2266.939941, 951.781006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.1999817, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 2336.000000, 1968.000000, 953.531006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 4163.069824, 1471.650024, 944.281006 >, < -0.000000, -179.416000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.5159912, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 4210.669922, 895.575989, 944.281006 >, < -0.000000, -164.787003, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 2.75, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 3577.010010, 1491.959961, 944.281006 >, < -0.000000, 169.908005, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.1340027, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 3982.860107, 1778.540039, 944.281006 >, < -0.000000, 179.488007, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.3840027, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 1935.839966, 3727.840088, 931.656006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2182.939941, -3549.810059, 819.468994 >, < 0.000000, 177.582993, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.1159668, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 1045.339966, -2843.340088, 804.812988 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.5670166, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2357.739990, 4476.339844, 962.960022 >, < -0.000000, 177.669998, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.7000122, index++ ) ) + wave2.append( CreateDroppodGruntEvent( < 2111.840088, 3295.840088, 939.031006 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSmokeEvent( < 2684, 1252, 1092 >, 120, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave2.append( CreateSmokeEvent( < 2452, 1812, 1092 >, 120, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave2.append( CreateSmokeEvent( < 2336, 636, 1092 >, 120, index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.6, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2343.590088, -3185.840088, 788.312988 >, < -0.000000, 174.550995, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.8500366, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2338.270020, 4684.279785, 952.682007 >, < -0.000000, -167.669006, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2177.209961, -3539.600098, 817.719971 >, < 0.000000, 178.065994, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2401.719971, 4475.089844, 962.406006 >, < 0.000000, 177.626999, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.0, index++ ) ) + wave2.append( CreateIonTitanEvent( < 1817.380005, -3585.909912, 813.937988 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.032959, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2576.909912, -3007.250000, 796.093994 >, < 0.000000, -165.850006, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.28302002, index++ ) ) + wave2.append( CreateIonTitanEvent( < 2614.879883, 4771.560059, 951.000000 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.7839966, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2828.399902, 4138.450195, 938.893982 >, < 0.000000, -171.078995, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateLegionTitanEvent( < 4466.689941, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 4182.189941, 917.906006, 944.281006 >, < 0.000000, -124.805000, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.3170166, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2747.790039, 1574.170044, 944.281006 >, < -0.000000, -164.485001, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave2.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave2.append( CreateScorchTitanEvent( < 2821.659912, -2937.090088, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave2.append( CreateScorchTitanEvent( < 3123.560059, 4202.060059, 954.343994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 0.1159668, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2169.590088, -3540.250000, 817.875000 >, < -0.000000, 178.065002, 0.000000 >, "", index++ ) ) + wave2.append( CreateWaitForTimeEvent( 1.3840332, index++ ) ) + wave2.append( CreateSuperSpectreEvent( < 2354.810059, 4476.589844, 962.968994 >, < -0.000000, 177.759003, 0.000000 >, "", 0 ) ) + waveEvents.append( wave2 ) index = 1 - array wave3 - wave3.append(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.1670288,index++)) - wave3.append(CreateSmokeEvent(< -2264, -2096, 928 >, 120, index++)) - wave3.append(CreateWaitForTimeEvent(0.333,index++)) - wave3.append(CreateSmokeEvent(< -3132, -1904, 928 >, 120, index++)) - wave3.append(CreateWaitForTimeEvent(0.2,index++)) - wave3.append(CreateSmokeEvent(< -1548, -2240, 928 >, 120, index++)) - wave3.append(CreateWaitForTimeEvent(0.067,index++)) - wave3.append(CreateCloakDroneEvent(< 1883.910034 , -1569.939941 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave3.append(CreateWaitForTimeEvent(1.1499634,index++)) - wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.3829956,index++)) - wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(3.4000244,index++)) - wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.1170044,index++)) - wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) - wave3.append(CreateSuperSpectreEvent(< 2170.020020 , -3549.570068 , 819.468994 >,< -0.000000 , 177.626007 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0669556,index++)) - wave3.append(CreateSuperSpectreEvent(< 2577.060059 , -3007.379883 , 796.093994 >,< -0.000000 , -165.850006 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.1329956,index++)) - wave3.append(CreateSuperSpectreEvent(< 1512.939941 , -3294.090088 , 798.000000 >,< -0.000000 , 89.077103 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.4000244,index++)) - wave3.append(CreateSuperSpectreEvent(< 1531.000000 , -1779.880005 , 800.031006 >,< 0.000000 , 133.110001 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.6829834,index++)) - wave3.append(CreateIonTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.7839966,index++)) - wave3.append(CreateIonTitanEvent(< 1503.810059 , -3600.189941 , 813.687988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0,index++)) - wave3.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateSpawnDroneEvent(< 2487.310059 , -2561.379883 , 5744.229980 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) - wave3.append(CreateWaitForTimeEvent(0.0,index++)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2591.379883 , 5744.189941 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) - wave3.append(CreateWaitForTimeEvent(0.0,index++)) - wave3.append(CreateSpawnDroneEvent(< 2457.310059 , -2531.379883 , 5744.319824 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) - wave3.append(CreateWaitForTimeEvent(0.0,index++)) - wave3.append(CreateSpawnDroneEvent(< 2427.310059 , -2561.379883 , 5744.549805 >,< 0.004999 , 90.003700 , 0.000004 >,"",index++, false)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.282959,index++)) - wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(2.6170044,index++)) - wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.9660034,index++)) - wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) - wave3.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) - wave3.append(CreateWaitForTimeEvent(0.6170044,index++)) - wave3.append(CreateMonarchTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateRoninTitanEvent(< 1763.839966 , -1608.750000 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.61602783,index++)) - wave3.append(CreateRoninTitanEvent(< 2359.840088 , -1596.750000 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.9840088,index++)) - wave3.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0999756,index++)) - wave3.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateSuperSpectreEvent(< 2180.080078 , -3539.689941 , 817.739014 >,< 0.000000 , 178.065994 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.6329956,index++)) - wave3.append(CreateLegionTitanEvent(< 2680.219971 , -1724.630005 , 809.718994 >,< 0.000000 , 169.320999 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.06695557,index++)) - wave3.append(CreateSuperSpectreEvent(< 2533.800049 , -3018.310059 , 795.421021 >,< 0.000000 , -165.806000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0170288,index++)) - wave3.append(CreateLegionTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.16601562,index++)) - wave3.append(CreateSuperSpectreEvent(< 1512.839966 , -3298.719971 , 797.968994 >,< -0.000000 , 89.120796 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.0,index++)) - wave3.append(CreateSuperSpectreEvent(< 1499.910034 , -1748.660034 , 801.656006 >,< -0.000000 , 132.934998 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(2.2340088,index++)) - wave3.append(CreateDroppodGruntEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.4829712,index++)) - wave3.append(CreateDroppodGruntEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(2.9000244,index++)) - wave3.append(CreateDroppodGruntEvent(< 346.312988 , -2838.659912 , 803.968994 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.5999756,index++)) - wave3.append(CreateDroppodGruntEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.6829834,index++)) - wave3.append(CreateScorchTitanEvent(< 1503.910034 , -3600.659912 , 813.781006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.3170166,index++)) - wave3.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateToneTitanEvent(< 1763.810059 , -1608.189941 , 810.000000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.9000244,index++)) - wave3.append(CreateToneTitanEvent(< 2359.810059 , -1596.189941 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.5839844,index++)) - wave3.append(CreateWarningEvent(FD_IncomingWarnings.CloakDrone,index++)) - wave3.append(CreateCloakDroneEvent(< 1923.000000 , -1544.000000 , 1108.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave3.append(CreateWaitForTimeEvent(1.3330078,index++)) - wave3.append(CreateCloakDroneEvent(< 1982.020020 , -1598.000000 , 1236.040039 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave3.append(CreateWaitForTimeEvent(5.0,index++)) - wave3.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave3.append(CreateLegionTitanEvent(< 4466.689941 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(0.7999878,index++)) - wave3.append(CreateLegionTitanEvent(< 4453.589844 , 964.906006 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) - wave3.append(CreateWaitForTimeEvent(1.4000244,index++)) - wave3.append(CreateMonarchTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) - waveEvents.append(wave3) + array< WaveEvent > wave3 + wave3.append( CreateRoninTitanEvent( < 1763.839966, -1608.750000, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.1670288, index++ ) ) + wave3.append( CreateSmokeEvent( < -2264, -2096, 928 >, 120, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.333, index++ ) ) + wave3.append( CreateSmokeEvent( < -3132, -1904, 928 >, 120, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave3.append( CreateSmokeEvent( < -1548, -2240, 928 >, 120, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.067, index++ ) ) + wave3.append( CreateCloakDroneEvent( < 1883.910034, -1569.939941, 1108.000000 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.1499634, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.3829956, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1045.339966, -2843.340088, 804.812988 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 3.4000244, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 346.312988, -2838.659912, 803.968994 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.1170044, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateWarningEvent( FD_IncomingWarnings.Reaper, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 2170.020020, -3549.570068, 819.468994 >, < -0.000000, 177.626007, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0669556, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 2577.060059, -3007.379883, 796.093994 >, < -0.000000, -165.850006, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.1329956, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 1512.939941, -3294.090088, 798.000000 >, < -0.000000, 89.077103, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.4000244, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 1531.000000, -1779.880005, 800.031006 >, < 0.000000, 133.110001, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateScorchTitanEvent( < 2475.909912, -3544.659912, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.6829834, index++ ) ) + wave3.append( CreateIonTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.7839966, index++ ) ) + wave3.append( CreateIonTitanEvent( < 1503.810059, -3600.189941, 813.687988 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave3.append( CreateScorchTitanEvent( < 1559.910034, -2024.660034, 803.031006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateSpawnDroneEvent( < 2487.310059, -2561.379883, 5744.229980 >, < 0.004999, 90.003700, 0.000004 >, "", index++, false ) ) + wave3.append( CreateWaitForTimeEvent( 0.0, index++ ) ) + wave3.append( CreateSpawnDroneEvent( < 2457.310059, -2591.379883, 5744.189941 >, < 0.004999, 90.003700, 0.000004 >, "", index++, false ) ) + wave3.append( CreateWaitForTimeEvent( 0.0, index++ ) ) + wave3.append( CreateSpawnDroneEvent( < 2457.310059, -2531.379883, 5744.319824 >, < 0.004999, 90.003700, 0.000004 >, "", index++, false ) ) + wave3.append( CreateWaitForTimeEvent( 0.0, index++ ) ) + wave3.append( CreateSpawnDroneEvent( < 2427.310059, -2561.379883, 5744.549805 >, < 0.004999, 90.003700, 0.000004 >, "", index++, false ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.282959, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1045.339966, -2843.340088, 804.812988 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 2.6170044, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 346.312988, -2838.659912, 803.968994 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.9660034, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0999756, index++ ) ) + wave3.append( CreateToneSniperTitanEvent( < 4466.220215, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.6170044, index++ ) ) + wave3.append( CreateMonarchTitanEvent( < 4453.129883, 964.750000, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateRoninTitanEvent( < 1763.839966, -1608.750000, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.61602783, index++ ) ) + wave3.append( CreateRoninTitanEvent( < 2359.840088, -1596.750000, 802.718994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.9840088, index++ ) ) + wave3.append( CreateToneTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0999756, index++ ) ) + wave3.append( CreateToneTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 2180.080078, -3539.689941, 817.739014 >, < 0.000000, 178.065994, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.6329956, index++ ) ) + wave3.append( CreateLegionTitanEvent( < 2680.219971, -1724.630005, 809.718994 >, < 0.000000, 169.320999, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.06695557, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 2533.800049, -3018.310059, 795.421021 >, < 0.000000, -165.806000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0170288, index++ ) ) + wave3.append( CreateLegionTitanEvent( < 1763.910034, -1608.660034, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.16601562, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 1512.839966, -3298.719971, 797.968994 >, < -0.000000, 89.120796, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave3.append( CreateSuperSpectreEvent( < 1499.910034, -1748.660034, 801.656006 >, < -0.000000, 132.934998, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 2.2340088, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.4829712, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1045.339966, -2843.340088, 804.812988 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 2.9000244, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 346.312988, -2838.659912, 803.968994 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.5999756, index++ ) ) + wave3.append( CreateDroppodGruntEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.6829834, index++ ) ) + wave3.append( CreateScorchTitanEvent( < 1503.910034, -3600.659912, 813.781006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.3170166, index++ ) ) + wave3.append( CreateScorchTitanEvent( < 2475.909912, -3544.659912, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateToneTitanEvent( < 1763.810059, -1608.189941, 810.000000 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.9000244, index++ ) ) + wave3.append( CreateToneTitanEvent( < 2359.810059, -1596.189941, 802.718994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.5839844, index++ ) ) + wave3.append( CreateWarningEvent( FD_IncomingWarnings.CloakDrone, index++ ) ) + wave3.append( CreateCloakDroneEvent( < 1923.000000, -1544.000000, 1108.000000 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.3330078, index++ ) ) + wave3.append( CreateCloakDroneEvent( < 1982.020020, -1598.000000, 1236.040039 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave3.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave3.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave3.append( CreateLegionTitanEvent( < 4466.689941, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 0.7999878, index++ ) ) + wave3.append( CreateLegionTitanEvent( < 4453.589844, 964.906006, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, "", index++ ) ) + wave3.append( CreateWaitForTimeEvent( 1.4000244, index++ ) ) + wave3.append( CreateMonarchTitanEvent( < 3866.659912, 1445.630005, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", 0 ) ) + waveEvents.append( wave3 ) index = 1 - array wave4 - wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.6000366,index++)) - wave4.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) - wave4.append(CreateWaitForTimeEvent(0.1,index++)) - wave4.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) - wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.1,index++)) - wave4.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) - wave4.append(CreateWaitForTimeEvent(0.8,index++)) - wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.8829956,index++)) - wave4.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.6000366,index++)) - wave4.append(CreateToneTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.0,index++)) - wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.2000122,index++)) - wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.5,index++)) - wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.3499756,index++)) - wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.2999878,index++)) - wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.7000122,index++)) - wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.9830322,index++)) - wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(3.5999756,index++)) - wave4.append(CreateWarningEvent(FD_IncomingWarnings.MortarTitan,index++)) - wave4.append(CreateMortarTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,index++)) - wave4.append(CreateWaitForTimeEvent(0.5830078,index++)) - wave4.append(CreateMortarTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,index++)) - wave4.append(CreateWaitForTimeEvent(1.3499756,index++)) - wave4.append(CreateScorchTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.0670166,index++)) - wave4.append(CreateScorchTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.21698,index++)) - wave4.append(CreateIonTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.9160156,index++)) - wave4.append(CreateIonTitanEvent(< 3144.159912 , 2935.530029 , 917.187988 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.684021,index++)) - wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.5999756,index++)) - wave4.append(CreateNukeTitanEvent(< -31.906300 , 4688.660156 , 1027.660034 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.2659912,index++)) - wave4.append(CreateNukeTitanEvent(< 1293.939941 , 1827.410034 , 1321.750000 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.5339966,index++)) - wave4.append(CreateDroppodStalkerEvent(< 908.750000 , 3093.629883 , 967.500000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.3000488,index++)) - wave4.append(CreateDroppodStalkerEvent(< 3156.560059 , 2266.939941 , 951.781006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave4.append(CreateWarningEvent(FD_IncomingWarnings.Reaper,index++)) - wave4.append(CreateSuperSpectreEvent(< 2355.209961 , 4472.799805 , 963.218994 >,< -0.000000 , 175.473007 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.5999756,index++)) - wave4.append(CreateSuperSpectreEvent(< 2835.689941 , 4139.939941 , 939.281006 >,< 0.000000 , -171.078995 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.0170288,index++)) - wave4.append(CreateSuperSpectreEvent(< 1014.690002 , 4844.540039 , 941.236023 >,< -0.000000 , 173.994995 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.6170044,index++)) - wave4.append(CreateSuperSpectreEvent(< 2833.949951 , 2953.350098 , 910.458008 >,< -0.000000 , 178.046997 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.5830078,index++)) - wave4.append(CreateSuperSpectreEvent(< 4164.439941 , 1471.750000 , 944.281006 >,< -0.000000 , -179.429001 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.117004395,index++)) - wave4.append(CreateDroppodStalkerEvent(< 1935.839966 , 3727.840088 , 931.656006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.0999756,index++)) - wave4.append(CreateSuperSpectreEvent(< 4207.680176 , 894.888977 , 944.281006 >,< -0.000000 , -167.283005 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.21600342,index++)) - wave4.append(CreateDroppodStalkerEvent(< 2111.840088 , 3295.840088 , 939.031006 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.9840088,index++)) - wave4.append(CreateSuperSpectreEvent(< 3570.689941 , 1491.780029 , 944.281006 >,< 0.000000 , 169.761002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.23297119,index++)) - wave4.append(CreateDroppodStalkerEvent(< 1087.839966 , 3863.840088 , 931.750000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.3670044,index++)) - wave4.append(CreateSuperSpectreEvent(< 3604.739990 , 835.104004 , 944.281006 >,< -0.000000 , -159.296997 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave4.append(CreateWarningEvent(FD_IncomingWarnings.ArcTitan,index++)) - wave4.append(CreateArcTitanEvent(< 2665.469971 , 4456.529785 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.1,index++)) - wave4.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) - wave4.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) - wave4.append(CreateWaitForTimeEvent(0.2,index++)) - wave4.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) - wave4.append(CreateWaitForTimeEvent(0.9199829,index++)) - wave4.append(CreateArcTitanEvent(< 3123.659912 , 4202.089844 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.6799927,index++)) - wave4.append(CreateScorchTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.2200317,index++)) - wave4.append(CreateScorchTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.90997314,index++)) - wave4.append(CreateToneTitanEvent(< 3738.659912 , 1985.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.5700073,index++)) - wave4.append(CreateToneTitanEvent(< -31.812500 , 4688.189941 , 1027.560059 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.4000244,index++)) - wave4.append(CreateRoninTitanEvent(< 1294.030029 , 1827.339966 , 1321.719971 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.9299927,index++)) - wave4.append(CreateRoninTitanEvent(< 4278.029785 , 1771.339966 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.8899536,index++)) - wave4.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,index++)) - wave4.append(CreateWaitForTimeEvent(1.210083,index++)) - wave4.append(CreateToneSniperTitanEvent(< 3866.659912 , 1445.630005 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,index++)) - wave4.append(CreateWaitForTimeEvent(1.0,index++)) - wave4.append(CreateCloakDroneEvent(< 4432.939941 , 1262.939941 , 1244.000000 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave4.append(CreateWaitForTimeEvent(4.3898926,index++)) - wave4.append(CreateSuperSpectreEvent(< 3878.439941 , 933.812988 , 944.281006 >,< -0.000000 , -79.509102 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.2000732,index++)) - wave4.append(CreateSuperSpectreEvent(< 4008.780029 , 378.406006 , 944.281006 >,< 0.000000 , -120.498001 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.92993164,index++)) - wave4.append(CreateSuperSpectreEvent(< 2916.810059 , 2679.780029 , 939.000000 >,< -0.000000 , -44.335999 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.5800781,index++)) - wave4.append(CreateSuperSpectreEvent(< 545.906006 , 1309.910034 , 1438.750000 >,< 0.000000 , -166.860001 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(5.0,index++)) - wave4.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave4.append(CreateWarningEvent(FD_IncomingWarnings.NukeTitan,index++)) - wave4.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.0198975,index++)) - wave4.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.9000244,index++)) - wave4.append(CreateNukeTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(1.5,index++)) - wave4.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave4.append(CreateWaitForTimeEvent(0.60998535,index++)) - wave4.append(CreateNukeTitanEvent(< 3739.129883 , 1985.719971 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",0)) - waveEvents.append(wave4) + array< WaveEvent > wave4 + wave4.append( CreateDroppodStalkerEvent( < 1935.839966, 3727.840088, 931.656006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.6000366, index++ ) ) + wave4.append( CreateSmokeEvent( < -2596, 3224, 1104 >, 120, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave4.append( CreateSmokeEvent( < -3252, 3052, 1104 >, 120, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 2111.840088, 3295.840088, 939.031006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave4.append( CreateSmokeEvent( < -1728, 3136, 1104 >, 120, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.8, index++ ) ) + wave4.append( CreateScorchTitanEvent( < 2665.340088, 4456.500000, 960.656006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.8829956, index++ ) ) + wave4.append( CreateToneTitanEvent( < 3123.250000, 4201.689941, 954.281006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.6000366, index++ ) ) + wave4.append( CreateToneTitanEvent( < 1324.160034, 4820.189941, 937.531006 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3144.659912, 2935.629883, 917.218994 >, < 0.000000, 179.341003, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.2000122, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3739.129883, 1985.719971, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 1087.839966, 3863.840088, 931.750000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.3499756, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 908.750000, 3093.629883, 967.500000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.2999878, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 3156.560059, 2266.939941, 951.781006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave4.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 1935.839966, 3727.840088, 931.656006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.7000122, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 2111.840088, 3295.840088, 939.031006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9830322, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 1087.839966, 3863.840088, 931.750000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 3.5999756, index++ ) ) + wave4.append( CreateWarningEvent( FD_IncomingWarnings.MortarTitan, index++ ) ) + wave4.append( CreateMortarTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5830078, index++ ) ) + wave4.append( CreateMortarTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.3499756, index++ ) ) + wave4.append( CreateScorchTitanEvent( < 2665.340088, 4456.500000, 960.656006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0670166, index++ ) ) + wave4.append( CreateScorchTitanEvent( < 3123.560059, 4202.060059, 954.343994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.21698, index++ ) ) + wave4.append( CreateIonTitanEvent( < 1324.160034, 4820.189941, 937.531006 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9160156, index++ ) ) + wave4.append( CreateIonTitanEvent( < 3144.159912, 2935.530029, 917.187988 >, < 0.000000, 179.341003, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.684021, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3739.129883, 1985.719971, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5999756, index++ ) ) + wave4.append( CreateNukeTitanEvent( < -31.906300, 4688.660156, 1027.660034 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.2659912, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 1293.939941, 1827.410034, 1321.750000 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.5339966, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 908.750000, 3093.629883, 967.500000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.3000488, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 3156.560059, 2266.939941, 951.781006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave4.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave4.append( CreateWarningEvent( FD_IncomingWarnings.Reaper, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 2355.209961, 4472.799805, 963.218994 >, < -0.000000, 175.473007, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5999756, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 2835.689941, 4139.939941, 939.281006 >, < 0.000000, -171.078995, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0170288, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 1014.690002, 4844.540039, 941.236023 >, < -0.000000, 173.994995, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.6170044, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 2833.949951, 2953.350098, 910.458008 >, < -0.000000, 178.046997, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5830078, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 4164.439941, 1471.750000, 944.281006 >, < -0.000000, -179.429001, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.117004395, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 1935.839966, 3727.840088, 931.656006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0999756, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 4207.680176, 894.888977, 944.281006 >, < -0.000000, -167.283005, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.21600342, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 2111.840088, 3295.840088, 939.031006 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9840088, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 3570.689941, 1491.780029, 944.281006 >, < 0.000000, 169.761002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.23297119, index++ ) ) + wave4.append( CreateDroppodStalkerEvent( < 1087.839966, 3863.840088, 931.750000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.3670044, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 3604.739990, 835.104004, 944.281006 >, < -0.000000, -159.296997, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave4.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave4.append( CreateWarningEvent( FD_IncomingWarnings.ArcTitan, index++ ) ) + wave4.append( CreateArcTitanEvent( < 2665.469971, 4456.529785, 960.656006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave4.append( CreateSmokeEvent( < -2596, 3224, 1104 >, 120, index++ ) ) + wave4.append( CreateSmokeEvent( < -3252, 3052, 1104 >, 120, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave4.append( CreateSmokeEvent( < -1728, 3136, 1104 >, 120, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9199829, index++ ) ) + wave4.append( CreateArcTitanEvent( < 3123.659912, 4202.089844, 954.343994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.6799927, index++ ) ) + wave4.append( CreateScorchTitanEvent( < 1324.060059, 4820.660156, 937.562988 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.2200317, index++ ) ) + wave4.append( CreateScorchTitanEvent( < 3144.659912, 2935.629883, 917.218994 >, < 0.000000, 179.341003, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.90997314, index++ ) ) + wave4.append( CreateToneTitanEvent( < 3738.659912, 1985.630005, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5700073, index++ ) ) + wave4.append( CreateToneTitanEvent( < -31.812500, 4688.189941, 1027.560059 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.4000244, index++ ) ) + wave4.append( CreateRoninTitanEvent( < 1294.030029, 1827.339966, 1321.719971 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9299927, index++ ) ) + wave4.append( CreateRoninTitanEvent( < 4278.029785, 1771.339966, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.8899536, index++ ) ) + wave4.append( CreateToneSniperTitanEvent( < 4453.129883, 964.750000, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.210083, index++ ) ) + wave4.append( CreateToneSniperTitanEvent( < 3866.659912, 1445.630005, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0, index++ ) ) + wave4.append( CreateCloakDroneEvent( < 4432.939941, 1262.939941, 1244.000000 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave4.append( CreateWaitForTimeEvent( 4.3898926, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 3878.439941, 933.812988, 944.281006 >, < -0.000000, -79.509102, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.2000732, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 4008.780029, 378.406006, 944.281006 >, < 0.000000, -120.498001, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.92993164, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 2916.810059, 2679.780029, 939.000000 >, < -0.000000, -44.335999, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.5800781, index++ ) ) + wave4.append( CreateSuperSpectreEvent( < 545.906006, 1309.910034, 1438.750000 >, < 0.000000, -166.860001, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave4.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave4.append( CreateWarningEvent( FD_IncomingWarnings.NukeTitan, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 2665.340088, 4456.500000, 960.656006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.0198975, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3123.560059, 4202.060059, 954.343994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.9000244, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3144.659912, 2935.629883, 917.218994 >, < 0.000000, 179.341003, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 1324.060059, 4820.660156, 937.562988 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave4.append( CreateWaitForTimeEvent( 0.60998535, index++ ) ) + wave4.append( CreateNukeTitanEvent( < 3739.129883, 1985.719971, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", 0 ) ) + waveEvents.append( wave4 ) index = 1 - array wave5 - wave5.append(CreateSmokeEvent(< -12, 1720, 1540 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.1,index++)) - wave5.append(CreateSmokeEvent(< -64, 964, 1540 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.3,index++)) - wave5.append(CreateSmokeEvent(< -2264, -2096, 928 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.3,index++)) - wave5.append(CreateSmokeEvent(< -3132, -1904, 928 >, 120, index++)) - wave5.append(CreateDroppodTickEvent(< 864.625000 , 693.750000 , 1379.910034 >,4,"hillRouteClose",index++)) - wave5.append(CreateWaitForTimeEvent(0.1,index++)) - wave5.append(CreateSmokeEvent(< -1548, -2240, 928 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.1,index++)) - wave5.append(CreateSmokeEvent(< -2596, 3224, 1104 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.2,index++)) - wave5.append(CreateSmokeEvent(< -3252, 3052, 1104 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.3,index++)) - wave5.append(CreateSmokeEvent(< -1728, 3136, 1104 >, 120, index++)) - wave5.append(CreateWaitForTimeEvent(0.4,index++)) - wave5.append(CreateDroppodTickEvent(< 884.625000 , 1721.750000 , 1377.410034 >,4,"hillRouteClose",index++)) - wave5.append(CreateWaitForTimeEvent(0.79992676,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1226.410034 , 1391.130005 , 1334.689941 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.9400635,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1258.060059 , 921.593994 , 1330.750000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateSuperSpectreEvent(< 1094.089966 , 1330.660034 , 1354.969971 >,< -0.000000 , 157.544006 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.7800293,index++)) - wave5.append(CreateSuperSpectreEvent(< 857.406006 , 739.843994 , 1373.030029 >,< -0.000000 , 151.962997 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(2.0700684,index++)) - wave5.append(CreateSuperSpectreEvent(< 1048.969971 , 1660.810059 , 1349.089966 >,< 0.000000 , -100.986000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.2099609,index++)) - wave5.append(CreateSuperSpectreEvent(< 2724.129883 , 2458.629883 , 946.155029 >,< -0.000000 , -127.245003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateSuperSpectreEvent(< 1092.119995 , 1331.380005 , 1355.650024 >,< 0.000000 , 157.500000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.1699219,index++)) - wave5.append(CreateSuperSpectreEvent(< 938.187988 , 707.406006 , 1362.939941 >,< -0.000000 , 153.720993 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(2.710083,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.1199951,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(2.2999268,index++)) - wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) - wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.8000488,index++)) - wave5.append(CreateSuperSpectreEvent(< 1511.339966 , -1445.229980 , 825.757996 >,< -0.000000 , 141.589996 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.099975586,index++)) - wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.57995605,index++)) - wave5.append(CreateSuperSpectreEvent(< 2086.750000 , -1459.000000 , 810.750000 >,< -0.000000 , 143.964996 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.6199951,index++)) - wave5.append(CreateIonTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.8800049,index++)) - wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3399658,index++)) - wave5.append(CreateLegionTitanEvent(< 3144.659912 , 2935.629883 , 917.218994 >,< 0.000000 , 179.341003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.92004395,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1045.339966 , -2843.340088 , 804.812988 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateIonTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.9499512,index++)) - wave5.append(CreateIonTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.17004395,index++)) - wave5.append(CreateSuperSpectreEvent(< 1548.780029 , -1475.209961 , 805.556030 >,< -0.000000 , 141.876999 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.5,index++)) - wave5.append(CreateSuperSpectreEvent(< 2087.750000 , -1461.540039 , 810.366028 >,< -0.000000 , 143.395004 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(3.9799805,index++)) - wave5.append(CreateScorchTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3399658,index++)) - wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.85998535,index++)) - wave5.append(CreateIonTitanEvent(< 1817.380005 , -3585.909912 , 813.937988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.9400635,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.1099854,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.9899902,index++)) - wave5.append(CreateScorchTitanEvent(< 1559.910034 , -2024.660034 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.8100586,index++)) - wave5.append(CreateScorchTitanEvent(< 2411.909912 , -1108.660034 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.289917,index++)) - wave5.append(CreateSuperSpectreEvent(< 1511.310059 , -1437.780029 , 826.656006 >,< -0.000000 , 142.382996 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.710083,index++)) - wave5.append(CreateSuperSpectreEvent(< 2129.800049 , -1492.459961 , 806.202026 >,< 0.000000 , 143.744995 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.5600586,index++)) - wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3199463,index++)) - wave5.append(CreateMonarchTitanEvent(< 1324.160034 , 4820.189941 , 937.531006 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateSuperSpectreEvent(< 1511.160034 , -1437.079956 , 809.958008 >,< -0.000000 , 142.475998 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.1899414,index++)) - wave5.append(CreateSuperSpectreEvent(< 2091.909912 , -1464.430054 , 809.992981 >,< -0.000000 , 143.503998 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.8800049,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1528.660034 , -1443.339966 , 816.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.1500244,index++)) - wave5.append(CreateDroppodStalkerEvent(< 1418.310059 , -2254.659912 , 810.031006 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.3499756,index++)) - wave5.append(CreateSuperSpectreEvent(< 1452.199951 , -1794.530029 , 804.614990 >,< -0.000000 , 112.485001 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.22998047,index++)) - wave5.append(CreateDroppodStalkerEvent(< 896.656006 , -1227.339966 , 964.437988 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.8699951,index++)) - wave5.append(CreateSuperSpectreEvent(< 2162.209961 , -1065.609985 , 806.807007 >,< -0.000000 , -174.283005 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.11999512,index++)) - wave5.append(CreateDroppodStalkerEvent(< 2457.310059 , -2563.659912 , 789.250000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateToneTitanEvent(< 2665.060059 , 4456.129883 , 960.687988 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.5999756,index++)) - wave5.append(CreateToneTitanEvent(< 3123.250000 , 4201.689941 , 954.281006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.60009766,index++)) - wave5.append(CreateCloakDroneEvent(< 2674.979980 , 4322.020020 , 1283.979980 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateToneTitanEvent(< 2475.810059 , -3544.189941 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) - wave5.append(CreateToneTitanEvent(< 2821.340088 , -2936.719971 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.70007324,index++)) - wave5.append(CreateCloakDroneEvent(< 2363.000000 , -3327.010010 , 1235.989990 >,< 0.000000 , 0.000000 , 0.000000 >,index++)) - wave5.append(CreateWaitForTimeEvent(6.0,index++)) - wave5.append(CreateScorchTitanEvent(< 1763.910034 , -1608.660034 , 810.218994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) - wave5.append(CreateScorchTitanEvent(< 2359.909912 , -1596.660034 , 802.718994 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.4000244,index++)) - wave5.append(CreateIonTitanEvent(< 1559.810059 , -2024.189941 , 803.031006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.6999512,index++)) - wave5.append(CreateIonTitanEvent(< 2411.810059 , -1108.189941 , 803.375000 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateToneSniperTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,index++)) - wave5.append(CreateWaitForTimeEvent(0.9000244,index++)) - wave5.append(CreateToneSniperTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,index++)) - wave5.append(CreateWaitForTimeEvent(1.0999756,index++)) - wave5.append(CreateArcTitanEvent(< 3867.219971 , 1445.689941 , 947.281006 >,< 0.000000 , 180.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateNukeTitanEvent(< 2475.909912 , -3544.659912 , 810.281006 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.2000732,index++)) - wave5.append(CreateNukeTitanEvent(< 2665.340088 , 4456.500000 , 960.656006 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.2999268,index++)) - wave5.append(CreateNukeTitanEvent(< 2821.659912 , -2937.090088 , 827.937988 >,< 0.000000 , 117.202003 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.8000488,index++)) - wave5.append(CreateNukeTitanEvent(< 3123.560059 , 4202.060059 , 954.343994 >,< 0.000000 , -141.108002 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.0999756,index++)) - wave5.append(CreateNukeTitanEvent(< 1817.469971 , -3586.379883 , 814.062988 >,< 0.000000 , 90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(0.6999512,index++)) - wave5.append(CreateNukeTitanEvent(< 1324.060059 , 4820.660156 , 937.562988 >,< 0.000000 , -90.000000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(5.0,index++)) - wave5.append(CreateWaitUntilAliveWeightedEvent(16,index++)) - wave5.append(CreateToneTitanEvent(< 4466.220215 , 1469.410034 , 947.281006 >,< 0.000000 , 169.541000 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) - wave5.append(CreateToneTitanEvent(< 4453.129883 , 964.750000 , 947.281006 >,< 0.000000 , -172.529007 , 0.000000 >,"",index++)) - wave5.append(CreateWaitForTimeEvent(1.3000488,index++)) - 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) + array< WaveEvent > wave5 + wave5.append( CreateSmokeEvent( < -12, 1720, 1540 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave5.append( CreateSmokeEvent( < -64, 964, 1540 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.3, index++ ) ) + wave5.append( CreateSmokeEvent( < -2264, -2096, 928 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.3, index++ ) ) + wave5.append( CreateSmokeEvent( < -3132, -1904, 928 >, 120, index++ ) ) + wave5.append( CreateDroppodTickEvent( < 864.625000, 693.750000, 1379.910034 >, 4, "hillRouteClose", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave5.append( CreateSmokeEvent( < -1548, -2240, 928 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.1, index++ ) ) + wave5.append( CreateSmokeEvent( < -2596, 3224, 1104 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.2, index++ ) ) + wave5.append( CreateSmokeEvent( < -3252, 3052, 1104 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.3, index++ ) ) + wave5.append( CreateSmokeEvent( < -1728, 3136, 1104 >, 120, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.4, index++ ) ) + wave5.append( CreateDroppodTickEvent( < 884.625000, 1721.750000, 1377.410034 >, 4, "hillRouteClose", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.79992676, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1226.410034, 1391.130005, 1334.689941 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.9400635, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1258.060059, 921.593994, 1330.750000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1094.089966, 1330.660034, 1354.969971 >, < -0.000000, 157.544006, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.7800293, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 857.406006, 739.843994, 1373.030029 >, < -0.000000, 151.962997, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 2.0700684, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1048.969971, 1660.810059, 1349.089966 >, < 0.000000, -100.986000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.2099609, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2724.129883, 2458.629883, 946.155029 >, < -0.000000, -127.245003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1092.119995, 1331.380005, 1355.650024 >, < 0.000000, 157.500000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.1699219, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 938.187988, 707.406006, 1362.939941 >, < -0.000000, 153.720993, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 2.710083, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1528.660034, -1443.339966, 816.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.1199951, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 2.2999268, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3000488, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.8000488, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1511.339966, -1445.229980, 825.757996 >, < -0.000000, 141.589996, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.099975586, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 1559.910034, -2024.660034, 803.031006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.57995605, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2086.750000, -1459.000000, 810.750000 >, < -0.000000, 143.964996, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.6199951, index++ ) ) + wave5.append( CreateIonTitanEvent( < 2665.060059, 4456.129883, 960.687988 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.8800049, index++ ) ) + wave5.append( CreateToneTitanEvent( < 3123.250000, 4201.689941, 954.281006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3399658, index++ ) ) + wave5.append( CreateLegionTitanEvent( < 3144.659912, 2935.629883, 917.218994 >, < 0.000000, 179.341003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.92004395, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1045.339966, -2843.340088, 804.812988 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateIonTitanEvent( < 4466.220215, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.9499512, index++ ) ) + wave5.append( CreateIonTitanEvent( < 4453.129883, 964.750000, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.17004395, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1548.780029, -1475.209961, 805.556030 >, < -0.000000, 141.876999, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.5, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2087.750000, -1461.540039, 810.366028 >, < -0.000000, 143.395004, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 3.9799805, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 2475.909912, -3544.659912, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3399658, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.85998535, index++ ) ) + wave5.append( CreateIonTitanEvent( < 1817.380005, -3585.909912, 813.937988 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.9400635, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1528.660034, -1443.339966, 816.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.1099854, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.9899902, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 1559.910034, -2024.660034, 803.031006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.8100586, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 2411.909912, -1108.660034, 803.375000 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.289917, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1511.310059, -1437.780029, 826.656006 >, < -0.000000, 142.382996, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.710083, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2129.800049, -1492.459961, 806.202026 >, < 0.000000, 143.744995, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2665.060059, 4456.129883, 960.687988 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.5600586, index++ ) ) + wave5.append( CreateToneTitanEvent( < 3123.250000, 4201.689941, 954.281006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3199463, index++ ) ) + wave5.append( CreateMonarchTitanEvent( < 1324.160034, 4820.189941, 937.531006 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1511.160034, -1437.079956, 809.958008 >, < -0.000000, 142.475998, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.1899414, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2091.909912, -1464.430054, 809.992981 >, < -0.000000, 143.503998, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.8800049, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1528.660034, -1443.339966, 816.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.1500244, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 1418.310059, -2254.659912, 810.031006 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.3499756, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 1452.199951, -1794.530029, 804.614990 >, < -0.000000, 112.485001, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.22998047, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 896.656006, -1227.339966, 964.437988 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.8699951, index++ ) ) + wave5.append( CreateSuperSpectreEvent( < 2162.209961, -1065.609985, 806.807007 >, < -0.000000, -174.283005, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.11999512, index++ ) ) + wave5.append( CreateDroppodStalkerEvent( < 2457.310059, -2563.659912, 789.250000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2665.060059, 4456.129883, 960.687988 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.5999756, index++ ) ) + wave5.append( CreateToneTitanEvent( < 3123.250000, 4201.689941, 954.281006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.60009766, index++ ) ) + wave5.append( CreateCloakDroneEvent( < 2674.979980, 4322.020020, 1283.979980 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2475.810059, -3544.189941, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.2999268, index++ ) ) + wave5.append( CreateToneTitanEvent( < 2821.340088, -2936.719971, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.70007324, index++ ) ) + wave5.append( CreateCloakDroneEvent( < 2363.000000, -3327.010010, 1235.989990 >, < 0.000000, 0.000000, 0.000000 >, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 6.0, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 1763.910034, -1608.660034, 810.218994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.2999268, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 2359.909912, -1596.660034, 802.718994 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.4000244, index++ ) ) + wave5.append( CreateIonTitanEvent( < 1559.810059, -2024.189941, 803.031006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.6999512, index++ ) ) + wave5.append( CreateIonTitanEvent( < 2411.810059, -1108.189941, 803.375000 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateToneSniperTitanEvent( < 4466.220215, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.9000244, index++ ) ) + wave5.append( CreateToneSniperTitanEvent( < 4453.129883, 964.750000, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.0999756, index++ ) ) + wave5.append( CreateArcTitanEvent( < 3867.219971, 1445.689941, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 2475.909912, -3544.659912, 810.281006 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.2000732, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 2665.340088, 4456.500000, 960.656006 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.2999268, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 2821.659912, -2937.090088, 827.937988 >, < 0.000000, 117.202003, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.8000488, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 3123.560059, 4202.060059, 954.343994 >, < 0.000000, -141.108002, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.0999756, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 1817.469971, -3586.379883, 814.062988 >, < 0.000000, 90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 0.6999512, index++ ) ) + wave5.append( CreateNukeTitanEvent( < 1324.060059, 4820.660156, 937.562988 >, < 0.000000, -90.000000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 5.0, index++ ) ) + wave5.append( CreateWaitUntilAliveWeightedEvent( 16, index++ ) ) + wave5.append( CreateToneTitanEvent( < 4466.220215, 1469.410034, 947.281006 >, < 0.000000, 169.541000, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3000488, index++ ) ) + wave5.append( CreateToneTitanEvent( < 4453.129883, 964.750000, 947.281006 >, < 0.000000, -172.529007, 0.000000 >, "", index++ ) ) + wave5.append( CreateWaitForTimeEvent( 1.3000488, index++ ) ) + wave5.append( CreateScorchTitanEvent( < 3867.129883, 1445.719971, 947.281006 >, < 0.000000, 180.000000, 0.000000 >, "", 0 ) ) + waveEvents.append( wave5 ) } - -/* -void function initFrontierDefenseData() -{ - shopPosition = - - - array wave0 - array wave1 - array wave2 - array wave3 - array wave4 - - - - - - - waveEvents.append(wave0) - waveEvents.append(wave1) - waveEvents.append(wave2) - waveEvents.append(wave3) - waveEvents.append(wave4) -}*/ From ad82fac5e307fc1b6c5c21222eb53ebc1d87910d Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 29 Jul 2022 19:28:37 +0100 Subject: [PATCH 77/99] Fix issue where cloak drones dont get removed from the UI (#462) --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 423e2ce62..639ab9802 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1229,7 +1229,7 @@ string function GetAiNetIdFromTargetName( string targetName ) case "drone": return "FD_AICount_Drone" case "cloakedDrone": - case "Cloaked Drone": + case "Cloak Drone": return "FD_AICount_Drone_Cloak" case "tick": return "FD_AICount_Ticks" From f1c0ec0d0adeac614efa6c5b982da9136eb910cd Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 29 Jul 2022 19:29:22 +0100 Subject: [PATCH 78/99] fix potential crash where player leaves while being wave mvp (#460) --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 639ab9802..c31bcac42 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -654,8 +654,6 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) 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 ) @@ -665,14 +663,18 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) } AddMoneyToPlayer( player, 100 ) 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( 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 ) From fef599e5ffeb6b80b824e7df8c80afc8c69c9604 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 29 Jul 2022 19:30:22 +0100 Subject: [PATCH 79/99] [FD] UI things + general cleanup (#458) * use team titan select menu * show and hide the earn meter * general cleanup and fixes --- .../vscripts/gamemodes/_gamemode_fd.nut | 53 ++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index c31bcac42..36ebeecf2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -46,6 +46,7 @@ struct { float harvesterDamageTaken table players entity harvester_info + bool playersHaveTitans = false }file void function GamemodeFD_Init() @@ -63,6 +64,7 @@ void function GamemodeFD_Init() Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) PlayerEarnMeter_SetEnabled( false ) SetShouldUsePickLoadoutScreen( true ) + TeamTitanSelectMenu_Init() // show the titan select menu in this mode //general Callbacks AddCallback_EntitiesDidLoad( LoadEntities ) @@ -80,7 +82,7 @@ void function GamemodeFD_Init() //Spawn Callbacks AddSpawnCallback( "npc_titan", HealthScaleByDifficulty ) AddSpawnCallback( "npc_super_spectre", HealthScaleByDifficulty ) - AddSpawnCallback( "player", FD_PlayerRespawnCallback ) + AddCallback_OnPlayerRespawned( FD_PlayerRespawnCallback ) AddSpawnCallback("npc_turret_sentry", AddTurretSentry ) //death Callbacks AddCallback_OnNPCKilled( OnNpcDeath ) @@ -108,8 +110,19 @@ void function FD_PlayerRespawnCallback( entity player ) { if( player in file.players ) file.players[player].lastRespawn = Time() + + if ( !file.playersHaveTitans ) + { + // why in the fuck do i need to WaitFrame() here, this sucks + thread PlayerEarnMeter_SetMode_Threaded( player, 0 ) + } +} - Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" ) +void function PlayerEarnMeter_SetMode_Threaded( entity player, int mode ) +{ + WaitFrame() + if ( IsValid( player ) ) + PlayerEarnMeter_SetMode( player, mode ) } void function FD_TeamReserveDepositOrWithdrawCallback( entity player, string action, int amount ) @@ -163,15 +176,25 @@ void function GamemodeFD_InitPlayer( entity player ) data.diedThisRound = false file.players[player] <- data thread SetTurretSettings_threaded( player ) - if( GetGlobalNetInt( "FD_currentWave" ) > 1 ) - PlayerEarnMeter_AddEarnedAndOwned( player, 1.0, 1.0 ) + // only start the highlight when we start playing, not during dropship + if ( GetGameState() >= eGameState.Playing ) + Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" ) - 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( file.playersHaveTitans ) // first wave is index 0 + { + PlayerEarnMeter_AddEarnedAndOwned( player, 1.0, 1.0 ) + } + // unfortunate that i cant seem to find a nice callback for them exiting that menu but thisll have to do + thread TryDisableTitanSelectionForPlayerAfterDelay( player, TEAM_TITAN_SELECT_DURATION_MIDGAME ) +} +void function TryDisableTitanSelectionForPlayerAfterDelay( entity player, float waitAmount ) +{ + wait waitAmount + if ( file.playersHaveTitans ) + DisableTitanSelectionForPlayer( player ) } + void function SetTurretSettings_threaded( entity player ) { //has to be delayed because PlayerConnect callbacks get called in wrong order WaitFrame() @@ -288,6 +311,10 @@ bool function useShieldBoost( entity player, array args ) void function startMainGameLoop() { + // only start the highlight when we start playing, not during dropship + foreach ( entity player in GetPlayerArray() ) + Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" ) + thread mainGameLoop() } @@ -307,17 +334,16 @@ void function mainGameLoop() showShop = true foreach( entity player in GetPlayerArray() ) { + PlayerEarnMeter_SetMode( player, 1 ) // show the earn meter PlayerEarnMeter_AddEarnedAndOwned( player, 1.0, 1.0 ) } + file.playersHaveTitans = true DisableTitanSelection() } - else if( i + 1 == waveEvents.len() ) - { - EnableTitanSelection() - } - } + // end of game + EnableTitanSelection() } @@ -649,6 +675,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) PlayFactionDialogueToPlayer( "fd_wavePayoutAddtnl", player ) AddPlayerScore( player, "FDTeamWave" ) AddMoneyToPlayer( player, GetCurrentPlaylistVarInt( "fd_money_per_round", 600 ) ) + // is this in the right place? do we want to be adding for each player? // 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" ) From 960e64fbecfbf62f32df0d4d69332edbd230f1de Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sat, 30 Jul 2022 22:32:21 +0100 Subject: [PATCH 80/99] [FD] AI proficiency (#463) * Set AI proficiency properly maybe * This might be wrong but whatever --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 1 + Northstar.CustomServers/mod/scripts/vscripts/mp/_ai_mp.gnut | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 36ebeecf2..f177f1ca5 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -64,6 +64,7 @@ void function GamemodeFD_Init() Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) PlayerEarnMeter_SetEnabled( false ) SetShouldUsePickLoadoutScreen( true ) + SetGetDifficultyFunc( FD_GetDifficultyLevel ) TeamTitanSelectMenu_Init() // show the titan select menu in this mode //general Callbacks diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_ai_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_ai_mp.gnut index 1102aae1c..ce9227a2c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_ai_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_ai_mp.gnut @@ -12,13 +12,13 @@ void function MpInitAILoadouts() void function SetProficiency( entity npc ) { - // unsure what the logic for deciding this should be so just going to default good - npc.kv.WeaponProficiency = eWeaponProficiency.VERYGOOD + // i think this is correct? iirc grunts and stuff in attrition are *really* bad so having poor as their proficiency makes sense + npc.kv.WeaponProficiency = GetDifficultyLevel() } void function SPMP_UpdateNPCProficiency( entity npc ) { - + SetProficiency( npc ) // this seems bad? dont see why they should be any different unless SP should use a different function } bool function IsAutoPopulateEnabled( var team = null ) From ff279c0a1e36308c199f13f1edd93775ed79225a Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Mon, 1 Aug 2022 02:48:34 +0800 Subject: [PATCH 81/99] [FD]Fix unlimited ammo setting (#459) * Fix unlimited ammo setting --- .../vscripts/gamemodes/_gamemode_fd.nut | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index f177f1ca5..674d08dfa 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -73,6 +73,7 @@ void function GamemodeFD_Init() AddCallback_GameStateEnter( eGameState.Playing, startMainGameLoop ) AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) + AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) //Damage Callbacks AddDamageByCallback( "player", FD_DamageByPlayerCallback) @@ -111,7 +112,10 @@ void function FD_PlayerRespawnCallback( entity player ) { if( player in file.players ) file.players[player].lastRespawn = Time() - + + if( GetCurrentPlaylistVarInt( "fd_at_unlimited_ammo", 1 ) ) + FD_GivePlayerInfiniteAntiTitanAmmo( player ) + if ( !file.playersHaveTitans ) { // why in the fuck do i need to WaitFrame() here, this sucks @@ -119,6 +123,7 @@ void function FD_PlayerRespawnCallback( entity player ) } } + void function PlayerEarnMeter_SetMode_Threaded( entity player, int mode ) { WaitFrame() @@ -126,6 +131,29 @@ void function PlayerEarnMeter_SetMode_Threaded( entity player, int mode ) PlayerEarnMeter_SetMode( player, mode ) } +void function FD_OnPlayerGetsNewPilotLoadout( entity player, PilotLoadoutDef loadout ) +{ + if( GetCurrentPlaylistVarInt( "fd_at_unlimited_ammo", 1 ) ) + FD_GivePlayerInfiniteAntiTitanAmmo( player ) +} + +void function FD_GivePlayerInfiniteAntiTitanAmmo( entity player ) +{ + array weapons = player.GetMainWeapons() + foreach ( entity weaponEnt in weapons ) + { + if ( weaponEnt.GetWeaponType() != WT_ANTITITAN ) + continue + + if( !weaponEnt.HasMod( "at_unlimited_ammo" ) ) + { + array mods = weaponEnt.GetMods() + mods.append( "at_unlimited_ammo" ) + weaponEnt.SetMods( mods ) + } + } +} + void function FD_TeamReserveDepositOrWithdrawCallback( entity player, string action, int amount ) { switch( action ) From 4f41ac6644253561c640c5b815f921b992a846f3 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 1 Aug 2022 04:39:30 +0200 Subject: [PATCH 82/99] Dropship spawn Broken on Homestead --- .../vscripts/gamemodes/_gamemode_fd.nut | 149 ++++++++++++++++++ .../mp/levels/mp_forwardbase_kodai_fd.nut | 2 + .../vscripts/mp/levels/mp_homestead_fd.nut | 2 + .../scripts/vscripts/mp/levels/mp_rise_fd.nut | 4 +- 4 files changed, 156 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index f177f1ca5..4e62314bc 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -7,6 +7,14 @@ global function DisableTitanSelection global function DisableTitanSelectionForPlayer global function EnableTitanSelection global function EnableTitanSelectionForPlayer +global function FD_DropshipSetAnimationOverride + +enum eDropshipState{ + Idle, + InProgress, + Returning + _count_ +} struct player_struct_fd{ bool diedThisRound @@ -30,6 +38,8 @@ struct player_struct_fd{ global HarvesterStruct& fd_harvester global vector shopPosition global vector shopAngles = < 0, 0, 0 > +global vector FD_spawnPosition +global vector FD_spawnAngles = < 0, 0, 0 > global table< string, array > routes global array routeNodes global array spawnedNPCs @@ -47,8 +57,45 @@ struct { table players entity harvester_info bool playersHaveTitans = false + + string animationOverride = "" + int dropshipState + int playersInShip + entity dropship + array playersInDropship }file + +const array DROPSHIP_IDLE_ANIMS_POV = [ + + "ptpov_ds_coop_side_intro_gen_idle_B", + "ptpov_ds_coop_side_intro_gen_idle_A", + "ptpov_ds_coop_side_intro_gen_idle_C", + "ptpov_ds_coop_side_intro_gen_idle_D" +] + +const array DROPSHIP_IDLE_ANIMS = [ + + "pt_ds_coop_side_intro_gen_idle_B", + "pt_ds_coop_side_intro_gen_idle_A", + "pt_ds_coop_side_intro_gen_idle_C", + "pt_ds_coop_side_intro_gen_idle_D" +] + +const array DROPSHIP_EXIT_ANIMS_POV = [ + "ptpov_ds_coop_side_intro_gen_exit_B", + "ptpov_ds_coop_side_intro_gen_exit_A", + "ptpov_ds_coop_side_intro_gen_exit_C", + "ptpov_ds_coop_side_intro_gen_exit_D" +] + +const array DROPSHIP_EXIT_ANIMS = [ + "pt_ds_coop_side_intro_gen_exit_B", + "pt_ds_coop_side_intro_gen_exit_A", + "pt_ds_coop_side_intro_gen_exit_C", + "pt_ds_coop_side_intro_gen_exit_D" +] + void function GamemodeFD_Init() { PrecacheModel( MODEL_ATTRITION_BANK ) @@ -117,6 +164,30 @@ void function FD_PlayerRespawnCallback( entity player ) // why in the fuck do i need to WaitFrame() here, this sucks thread PlayerEarnMeter_SetMode_Threaded( player, 0 ) } + + if( file.dropshipState == eDropshipState.Returning ) + return + if( GetGameState() != eGameState.Playing) + return + + if( player.IsTitan() ) + return + + player.SetInvulnerable() + if( file.dropshipState == eDropshipState.Idle ) + { + thread FD_DropshipSpawnDropship() + } + //Attach player + FirstPersonSequenceStruct idleSequence + idleSequence.firstPersonAnim = DROPSHIP_IDLE_ANIMS_POV[ file.playersInShip ] + idleSequence.thirdPersonAnim = DROPSHIP_IDLE_ANIMS[ file.playersInShip++ ] + idleSequence.attachment = "ORIGIN" + idleSequence.teleport = true + idleSequence.viewConeFunction = ViewConeFree + idleSequence.hideProxy = true + thread FirstPersonSequence( idleSequence, player, file.dropship ) + file.playersInDropship.append( player ) } void function PlayerEarnMeter_SetMode_Threaded( entity player, int mode ) @@ -1317,3 +1388,81 @@ void function DisableTitanSelectionForPlayer( entity player ) player.SetPersistentVar( "titanClassLockState[" + enumName + "]", TITAN_CLASS_LOCK_STATE_LOCKED ) } } + + + + +void function FD_DropshipSpawnDropship() +{ + file.playersInShip = 0 + file.dropshipState = eDropshipState.InProgress + file.dropship = CreateDropship( TEAM_MILITIA, FD_spawnPosition , FD_spawnAngles ) + + + file.dropship.SetModel( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) + file.dropship.SetValueForModelKey( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) + + DispatchSpawn( file.dropship ) + file.dropship.SetModel( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) + + thread PlayAnim(file.dropship, FD_DropshipGetAnimation()) + + array anims = GetRandomDropshipDropoffAnims() + + //thread WarpinEffect( $"models/vehicle/crow_dropship/crow_dropship.mdl", anims[0], file.dropship.GetOrigin(),f ile.dropship.GetAngles() ) //this does not work + file.dropship.WaitSignal( "deploy" ) + file.dropshipState = eDropshipState.Returning + foreach(int i,entity player in file.playersInDropship) + { + thread FD_DropshipDropPlayer( player, i ) + } + file.playersInDropship.clear() + + wait 8 + file.dropshipState = eDropshipState.Idle +} + +void function FD_DropshipDropPlayer(entity player,int playerDropshipIndex) +{ + player.EndSignal( "OnDestroy" ) + FirstPersonSequenceStruct jumpSequence + jumpSequence.firstPersonAnim = DROPSHIP_EXIT_ANIMS_POV[ playerDropshipIndex ] + jumpSequence.thirdPersonAnim = DROPSHIP_EXIT_ANIMS[ playerDropshipIndex ] + jumpSequence.attachment = "ORIGIN" + jumpSequence.blendTime = 0.0 + jumpSequence.viewConeFunction = ViewConeFree + + thread FirstPersonSequence( jumpSequence, player, file.dropship ) + WaittillAnimDone( player ) + player.ClearParent() + ClearPlayerAnimViewEntity( player ) + player.ClearInvulnerable() +} + +void function FD_DropshipSetAnimationOverride(string animation) +{ + file.animationOverride = animation +} + +string function FD_DropshipGetAnimation() +{ + if(file.animationOverride!="") + return file.animationOverride + + switch( GetMapName() ) + { + case "mp_homestead": + return "dropship_coop_respawn_homestead" + case "mp_lagoon": + return "dropship_coop_respawn_lagoon" + case "mp_overlook": + return "dropship_coop_respawn_overlook" + case "mp_outpost": + return "dropship_coop_respawn_outpost" + case "mp_wargames": + return "dropship_coop_respawn_wargames" + case "mp_digsite": + return "dropship_coop_respawn_digsite" + } + return "dropship_coop_respawn" +} \ 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 e7a042945..65278f6d6 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 @@ -4,6 +4,8 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { shopPosition = < -3862.13, 1267.69, 1060.06 > + FD_spawnPosition = < -838.6, 2629.63, 1592 > + FD_spawnAngles = < 0, 180, 0 > int index = 1 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 cd7d78950..ca1b9907f 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 @@ -3,6 +3,8 @@ void function initFrontierDefenseData() { shopPosition = < -800.156, -4250, -63 > shopAngles = < 9, 60, 0 > + FD_spawnPosition = < -579.003, -4134.65, -97.4739 > + FD_spawnAngles = < 0, 60, 0 > int index = 1 array wave1 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 c3fe53dbb..fb0452db5 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 @@ -3,8 +3,10 @@ global function initFrontierDefenseData void function initFrontierDefenseData() { - shopPosition = < -5165.42, -679.285, 384.031> //only aproximate position + shopPosition = < -5165.42, -679.285, 384.031 > //only aproximate position + FD_spawnPosition = < -5325.66, -1363.046, 384.031 > + FD_spawnAngles = < 0, 0, 0 > int index = 1 array wave1 From 4fc690438d1881da522d3375b36651c7946b23e4 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Mon, 1 Aug 2022 15:46:24 +0200 Subject: [PATCH 83/99] Fix Homestead Respawn crash position is still not correct but does not crash anymore --- .../mod/scripts/vscripts/mp/levels/mp_homestead_fd.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ca1b9907f..dce818cb4 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 @@ -3,7 +3,7 @@ void function initFrontierDefenseData() { shopPosition = < -800.156, -4250, -63 > shopAngles = < 9, 60, 0 > - FD_spawnPosition = < -579.003, -4134.65, -97.4739 > + FD_spawnPosition = < 576.47, -3946.24, -174.07> FD_spawnAngles = < 0, 60, 0 > int index = 1 From 0e379c6509ee269b8ab1952248ec6886b542482f Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Tue, 13 Sep 2022 23:29:01 +0800 Subject: [PATCH 84/99] [FD]Ronin Phase Shift fix (#473) * Ronin NoTarget Bug fix it'll case a Ronin Bug;Common in Frontier Defense Npc will ignore the player and other team player in the this titan Here's test log Normal: Start Phase Shift: ent.GetNoTarget() = false Start No target before: ent.GetNoTarget() = false Start No target after: ent.GetNoTarget() = true End Phase Shift: ent.GetNoTarget() = false Start Phase Shift: ent.GetNoTarget() = false Start No target before: ent.GetNoTarget() = false Start No target after: ent.GetNoTarget() = true End Phase Shift: ent.GetNoTarget() = false After trigger bug: Start Phase Shift: ent.GetNoTarget() = false Start No target before: ent.GetNoTarget() = false Start No target after: ent.GetNoTarget() = true Start Phase Shift: ent.GetNoTarget() = true Start No target before: ent.GetNoTarget() = true Start No target after: ent.GetNoTarget() = true End Phase Shift: ent.GetNoTarget() = false End Phase Shift: ent.GetNoTarget() = true * carry over the old state between phases * Update Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut thx Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Add convar "ns_use_phase_fix" make this toggleable through a convar, default to fixing ronin phase shift problem allow people to turn off the fix if they wanted Co-authored-by: ASpoonPlaysGames <66967891+ASpoonPlaysGames@users.noreply.github.com> --- Northstar.CustomServers/mod.json | 4 + .../vscripts/weapons/sh_phase_shift.gnut | 774 ++++++++++++++++++ 2 files changed, 778 insertions(+) create mode 100644 Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut diff --git a/Northstar.CustomServers/mod.json b/Northstar.CustomServers/mod.json index dba29bc5c..c4004b257 100644 --- a/Northstar.CustomServers/mod.json +++ b/Northstar.CustomServers/mod.json @@ -53,6 +53,10 @@ { "Name": "ns_allow_kill_commands", "DefaultValue": "0" + }, + { + "Name": "ns_use_phase_fix", + "DefaultValue": "1" } ], "Scripts": [ diff --git a/Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut b/Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut new file mode 100644 index 000000000..52d07f00f --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/weapons/sh_phase_shift.gnut @@ -0,0 +1,774 @@ +untyped +#if CLIENT +#endif + +global function MpAbilityShifter_Init +global function PhaseShift +global function CodeCallback_EnterPhaseShift +global function CodeCallback_ExitPhaseShift +global function CancelPhaseShift + +#if SERVER +global function PlayPhaseShiftDisappearFX +global function UntrackAllToneMarks +#endif + +const SHIFTER_OUTRO_TIME_BEFORE_END = 1.5 + +const SHIFTER_PRE_FX = $"P_warpjump_FP" + +const SHIFTER_APPEAR_FX = $"P_phase_shift_main" +const SHIFTER_APPEAR_FX_TITAN = $"P_phase_shift_main_XO" +const SHIFTER_DISAPPEAR_FX = $"P_phase_shift_main" +const SHIFTER_DISAPPEAR_FX_TITAN = $"P_phase_shift_main_XO" + +const SHIFTER_SCREEN_FX = $"P_phase_shift_screen" +const SHIFTER_PERSONAL_FX = $"P_phase_shift_player" +const SHIFTER_SCREEN_FX_START = $"P_phase_shift_screen_start" +const SHIFTER_COLORCORRECTION = "materials/correction/mp_ability_shifter.raw" + +const SHIFTER_PRE_SOUND_1P = "Pilot_PhaseShift_PreActivate_1P" +const SHIFTER_PRE_SOUND_3P = "Pilot_PhaseShift_PreActivate_3P" +global const SHIFTER_START_SOUND_1P = "Pilot_PhaseShift_Activate_1P" +global const SHIFTER_START_SOUND_3P = "Pilot_PhaseShift_Activate_3P" +const SHIFTER_LOOP_SOUND_1P = "Pilot_PhaseShift_Loop_1P" +const SHIFTER_LOOP_SOUND_3P = "Pilot_PhaseShift_Loop_3P" +const SHIFTER_PRE_END_SOUND_1P = "Pilot_PhaseShift_WarningToEnd_1P" +const SHIFTER_PRE_END_SOUND_3P = "Pilot_PhaseShift_WarningToEnd_3P" +global const SHIFTER_END_SOUND_1P = "Pilot_PhaseShift_End_1P" +global const SHIFTER_END_SOUND_3P = "Pilot_PhaseShift_End_3P" + +const SHIFTER_PRE_SOUND_1P_TITAN = "Pilot_PhaseShift_PreActivate_1P" +const SHIFTER_PRE_SOUND_3P_TITAN = "Pilot_PhaseShift_PreActivate_3P" +global const SHIFTER_START_SOUND_1P_TITAN = "titan_phasedash_activate_1p" +global const SHIFTER_START_SOUND_3P_TITAN = "titan_phasedash_activate_3p" +const SHIFTER_LOOP_SOUND_1P_TITAN = "titan_phasedash_loop_1p" +const SHIFTER_LOOP_SOUND_3P_TITAN = "titan_phasedash_loop_3p" +const SHIFTER_PRE_END_SOUND_1P_TITAN = "titan_phasedash_warningtoend_1p" +const SHIFTER_PRE_END_SOUND_3P_TITAN = "titan_phasedash_warningtoend_3p" +global const SHIFTER_END_SOUND_1P_TITAN = "titan_phasedash_end_1p" +global const SHIFTER_END_SOUND_3P_TITAN = "titan_phasedash_end_3p" + +const int TELEFRAG_DAMAGE = 5000; + +struct +{ +} file; + +void function CodeCallback_EnterPhaseShift( entity ent ) +{ + PhaseShift( ent, 0.0, 999.0 ) +} + +void function CodeCallback_ExitPhaseShift( entity ent ) +{ +#if SERVER + CancelPhaseShift( ent ) +#endif +} + +void function CancelPhaseShift( entity ent ) +{ + ent.PhaseShiftCancel() + +#if SERVER + ent.Signal( "ForceStopPhaseShift" ) + PlayPhaseShiftAppearFX( ent ) +#endif // +} + + +void function MpAbilityShifter_Init() +{ +#if CLIENT + //ColorCorrection_RegisterRemoteTurret( "materials/correction/remote_turret.raw" ) + + ColorCorrection_RegisterPhaseShift( SHIFTER_COLORCORRECTION ) + thread ClientPhaseShiftFirstPersonFXThread() + + thread ClientRemoteTurretFirstPersonFXThread() +#endif // #if CLIENT + + PrecacheParticleSystem( SHIFTER_PRE_FX ) + PrecacheParticleSystem( SHIFTER_APPEAR_FX ) + PrecacheParticleSystem( SHIFTER_APPEAR_FX_TITAN ) + PrecacheParticleSystem( SHIFTER_DISAPPEAR_FX ) + PrecacheParticleSystem( SHIFTER_DISAPPEAR_FX_TITAN ) + PrecacheParticleSystem( SHIFTER_PERSONAL_FX ) + PrecacheParticleSystem( SHIFTER_SCREEN_FX ) + PrecacheParticleSystem( SHIFTER_SCREEN_FX_START ) + + MpAbilityShifterWeapon_Init() + + RegisterSignal( "StartPhaseShift" ) + RegisterSignal( "StopPhaseShift" ) + RegisterSignal( "ForceStopPhaseShift" ) +} + +int function PhaseShift( entity ent, float warmupTime, float duration ) +{ + if ( !IsAlive( ent ) ) + return 0 + + if ( ent.IsPhaseShifted() ) + return 0 + + // PROTO: this should be better eventually + // this is to prevent weirdness if you're already in a context action + if ( ent.IsPlayer() ) + { + entity proxy = ent.GetFirstPersonProxy() + if ( ( ent.ContextAction_IsActive() || (proxy != null && proxy.Anim_IsActive()) ) + && !ent.IsZiplining() + && !ent.ContextAction_IsLeeching() + && ent.GetTitanSoulBeingRodeoed() == null ) + { + return 0 + } + + ent.PhaseShiftBegin( warmupTime, duration ) + + #if SERVER + thread ServerPhaseShiftPlayerThread( ent, warmupTime, duration ) + #else + thread ClientPhaseShiftWarmupThread( ent, warmupTime ) + #endif // #if SERVER + + return 1 + } + else + { + ent.PhaseShiftBegin( warmupTime, duration ) + + #if SERVER + thread ServerPhaseShiftPlayerThread( ent, warmupTime, duration ) + #endif // #if SERVER + + return 1 + } + + unreachable +} + +#if SERVER +void function ServerPhaseShiftPlayerThread( entity ent, float warmupTime, float shiftTime ) +{ + ent.EndSignal( "OnDeath" ) + ent.EndSignal( "ForceStopPhaseShift" ) + + // initialise the two ent.s variables if needed + if ( !( "oldPhaseStateLock" in ent.s ) || !( "oldPhaseState" in ent.s ) ) + { + ent.s.oldPhaseStateLock <- false + ent.s.oldPhaseState <- false + } + + bool keepAnimActive = false + + if ( ent.IsPlayer() ) + { + ent.EndSignal( "player_embarks_titan" ) + + Leech_Disallow( ent ) + // EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_PRE_SOUND_3P ) + + entity proxy = ent.GetFirstPersonProxy() + if ( proxy != null ) + proxy.SetForceVisibleInPhaseShift( true ) + + if ( Rodeo_IsAttached( ent ) ) + { + if ( ent.GetParent() != null && ent.GetParent().IsPhaseShifted() ) + keepAnimActive = true + else + ent.Signal( "RodeoOver" ) + } + + if ( ent.IsTitan() ) + { + UntrackAllToneMarks( ent ) + entity titanSoul = ent.GetTitanSoul() + if ( titanSoul != null ) + { + if ( titanSoul.soul.batteryContainer != null ) + { + titanSoul.soul.batteryContainer.SetForceVisibleInPhaseShift( true ) + } + } + } + + Battery_StopFXAndHideIconForPlayer( ent ) + } + else + { + if ( ent.IsTitan() ) + UntrackAllToneMarks( ent ) + ent.EnableNPCFlag( NPC_IGNORE_ALL ) + EmitSoundOnEntity( ent, SHIFTER_PRE_SOUND_3P ) + } + + // only change the oldPhaseState if it's not locked + if ( !ent.s.oldPhaseStateLock || !GetConVarBool("ns_use_phase_fix") ) + { + ent.s.oldPhaseStateLock <- true + ent.s.oldPhaseState <- ent.GetNoTarget() + } + + OnThreadEnd( + function() : ( ent ) + { + if ( IsValid( ent ) ) + { + ent.Signal( "StopPhaseShift" ) + ent.Solid() + ent.SetNoTarget( ent.s.oldPhaseState ) + // unlock the oldPhaseState + ent.s.oldPhaseStateLock <- false + + StopSoundOnEntity( ent, SHIFTER_PRE_SOUND_3P ) + StopSoundOnEntity( ent, SHIFTER_LOOP_SOUND_3P ) + StopSoundOnEntity( ent, SHIFTER_PRE_SOUND_3P_TITAN ) + StopSoundOnEntity( ent, SHIFTER_LOOP_SOUND_3P_TITAN ) + + ent.DisablePhaseShiftFlags() + + if ( ent.IsPlayer() ) + { + Leech_Allow( ent ) + UpdatePlayerHighlightsSettings( ent ) + + if ( GetSoulFromPlayer( ent ) != null ) + { + entity soul = GetSoulFromPlayer( ent ) + if ( soul.soul.batteryContainer != null ) + { + soul.soul.batteryContainer.SetForceVisibleInPhaseShift( false ) + } + } + + entity proxy = ent.GetFirstPersonProxy() + if ( proxy != null ) + proxy.SetForceVisibleInPhaseShift( false ) + + if ( PlayerHasBattery( ent ) ) + Battery_StartFX( GetBatteryOnBack( ent ) ) + } + else + { + ent.DisableNPCFlag( NPC_IGNORE_ALL ) + Highlight_ClearEnemyHighlight( ent ) + } + + entity teleFragTarget = ent.GetEntityAtPhaseShiftExitPosition(); + if ( IsValid( teleFragTarget ) ) + { + if ( !IsHumanSized( teleFragTarget ) ) + { + if ( ShouldEntitySelfKill( ent, teleFragTarget ) ) + { + ent.TakeDamage( ent.GetHealth() + 1, teleFragTarget, teleFragTarget, { damageSourceId = eDamageSourceId.phase_shift, scriptType = DF_GIB | DF_BYPASS_SHIELD | DF_SKIPS_DOOMED_STATE } ); + } + else + { + printt( "Pushed players apart" ) + PushPlayersApart( teleFragTarget, ent, 600.0 ) // this will work for NPCs too + } + } + else + { + teleFragTarget.TakeDamage( teleFragTarget.GetHealth() + 1, ent, ent, { damageSourceId = eDamageSourceId.phase_shift, scriptType = DF_GIB | DF_BYPASS_SHIELD | DF_SKIPS_DOOMED_STATE } ); + } + } + } + } + ) + + wait warmupTime + + //thread PROTO_CapVelocity( ent ) + + entity soul + if ( ent.IsTitan() ) + { + soul = ent.GetTitanSoul() + string titanType = GetSoulTitanSubClass( soul ) + entity rider = GetRodeoPilot( ent ) + if ( rider != null && Rodeo_IsAttached( rider ) ) + { + if ( !rider.IsPlayer() ) + rider.Signal( "RodeoOver" ) + else + PhaseShift( rider, 0, shiftTime ) + } + } + + entity fx = PlayPhaseShiftDisappearFX( ent ) + thread PhaseShiftDisappearEffectCleanup( ent, fx, shiftTime ) + + ent.Signal( "StartPhaseShift" ) + if ( !keepAnimActive ) + ent.Signal( "ScriptAnimStop" ) + ent.NotSolid() + ent.SetNoTarget( true ) + ent.EnablePhaseShiftFlags() + ent.Highlight_SetCurrentContext( -1 ) + + if ( ent.IsPlayer() ) + { + PlayerDropsScriptedItems( ent ) + if ( ent.IsTitan() ) + { + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_START_SOUND_3P_TITAN ) + EmitSoundOnEntityExceptToPlayerNotPredicted( ent, ent, SHIFTER_LOOP_SOUND_3P_TITAN ) + } + else + { + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_START_SOUND_3P ) + EmitSoundOnEntityExceptToPlayerNotPredicted( ent, ent, SHIFTER_LOOP_SOUND_3P ) + } + + foreach( statusEffect in ent.p.empStatusEffectsToClearForPhaseShift ) //Not great, done to avoid needing code work to get a separate empSlow/empSTurnEffects + { + StatusEffect_Stop( ent, statusEffect ) + } + + ent.p.empStatusEffectsToClearForPhaseShift.clear() + } + else + { + if ( ent.IsTitan() ) + { + EmitSoundOnEntity( ent, SHIFTER_START_SOUND_3P_TITAN ) + EmitSoundOnEntity( ent, SHIFTER_LOOP_SOUND_3P_TITAN ) + } + else + { + EmitSoundOnEntity( ent, SHIFTER_START_SOUND_3P ) + EmitSoundOnEntity( ent, SHIFTER_LOOP_SOUND_3P ) + } + } + + float FX_WARMUP_TIME = 0.3 + bool timeAdjusted = false + + if ( shiftTime > FX_WARMUP_TIME ) + { + shiftTime -= FX_WARMUP_TIME // need to play the fx a little earlier so the timing lines up + timeAdjusted = true + } + + if ( shiftTime >= SHIFTER_OUTRO_TIME_BEFORE_END ) + { + wait ( shiftTime - SHIFTER_OUTRO_TIME_BEFORE_END ) + + if ( ent.IsPlayer() ) + { + if ( ent.IsTitan() ) + { + EmitSoundOnEntityOnlyToPlayer( ent, ent, SHIFTER_PRE_END_SOUND_1P_TITAN ) + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_PRE_END_SOUND_3P_TITAN ) + } + else + { + EmitSoundOnEntityOnlyToPlayer( ent, ent, SHIFTER_PRE_END_SOUND_1P ) + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_PRE_END_SOUND_3P ) + } + + } + else + { + if ( ent.IsTitan() ) + EmitSoundOnEntity( ent, SHIFTER_PRE_END_SOUND_3P_TITAN ) + else + EmitSoundOnEntity( ent, SHIFTER_PRE_END_SOUND_3P ) + } + + wait SHIFTER_OUTRO_TIME_BEFORE_END + } + else + { + wait shiftTime + } + + PlayPhaseShiftAppearFX( ent ) + + if ( timeAdjusted ) + wait FX_WARMUP_TIME +} + +// ASSUMES THAT SECOND ENTITY IS NOT HUMAN SIZED +bool function ShouldEntitySelfKill( entity ent, entity largeTelefragTarget ) +{ + if ( IsHumanSized( ent ) ) + return true + + if ( IsSingleplayer() ) + return false + + return ( DistanceSqr( largeTelefragTarget.GetOrigin(), ent.GetOrigin() ) < 4096.0 ) +} + +void function PhaseShiftDisappearEffectCleanup( entity ent, entity fx, float duration ) +{ + fx.EndSignal( "OnDestroy" ) + ent.EndSignal( "ForceStopPhaseShift" ) + + OnThreadEnd( + function() : ( fx ) + { + if ( IsValid( fx ) ) + { + EffectStop( fx ) + } + } + ) + + float bufferTime = 1.4 + if ( ent.IsTitan() ) + bufferTime = 0.0 + + wait max( duration - bufferTime, 0.0 ) +} + +entity function PlayPhaseShiftAppearFX( entity ent ) +{ + asset effect = SHIFTER_APPEAR_FX + if ( !IsHumanSized( ent ) ) + effect = SHIFTER_APPEAR_FX_TITAN + + if ( ent.IsPlayer() ) + { + if ( ent.IsTitan() ) + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_END_SOUND_3P_TITAN ) + else + EmitSoundOnEntityExceptToPlayer( ent, ent, SHIFTER_END_SOUND_3P ) + + return PlayFXOnEntityForEveryoneExceptPlayer( effect, ent, ent ) + } + else + { + if ( ent.IsTitan() ) + EmitSoundOnEntity( ent, SHIFTER_END_SOUND_3P_TITAN ) + else + EmitSoundOnEntity( ent, SHIFTER_END_SOUND_3P ) + return PlayFXOnEntity( effect, ent ) + } +} + +entity function PlayPhaseShiftDisappearFX( entity ent ) +{ + asset effect = SHIFTER_DISAPPEAR_FX + if ( !IsHumanSized( ent ) ) + effect = SHIFTER_DISAPPEAR_FX_TITAN + + int fxid = GetParticleSystemIndex( effect ) + int attachId = ent.LookupAttachment( "ORIGIN" ) + + return StartParticleEffectOnEntity_ReturnEntity( ent, fxid, FX_PATTACH_POINT_FOLLOW, attachId ) +} + +array function GetAttachedEnts( entity ent ) +{ + array ents = [ ent ] + + if ( HasSoul( ent ) ) + { + entity soul = ent.GetTitanSoul() + if ( IsValid( soul.soul.batteryContainer ) ) + ents.append( soul.soul.batteryContainer ) + } + + entity weapon = ent.GetActiveWeapon() + if ( IsValid( weapon ) ) + ents.append( weapon ) + + return ents +} + +/* +void function PROTO_CapVelocity( player ) +{ + player.EndSignal( "OnDeath" ) + player.EndSignal( "StopPhaseShift" ) + + while( 1 ) + { + local newVel = player.GetVelocity() + local zVel = newVel.z + newVel = Vector( newVel.x, newVel.y, 0 ) + local speed = Length( newVel ) + newVel = Normalize( newVel ) + speed = min( speed, 400 ) + newVel = newVel * speed + player.SetVelocity( Vector(newVel.x,newVel.y,zVel) ) + WaitFrame() + } +} +*/ + +void function UntrackAllToneMarks( entity ent ) +{ + if ( IsSingleplayer() ) //JFS::Probably want to remove this for R3 + return + + array enemyTitans = GetTitanArrayOfEnemies( ent.GetTeam() ) + foreach( titan in enemyTitans ) + { + entity offhand = titan.GetOffhandWeapon( OFFHAND_RIGHT ) + if ( !IsValid( offhand ) ) + return + + if ( offhand.GetWeaponClassName() != "mp_titanweapon_tracker_rockets" ) + continue + + offhand.SmartAmmo_UntrackEntity( ent ) + } +} +#endif // #if SERVER + + +#if CLIENT +void function ClientPhaseShiftWarmupThread( entity player, float warmupTime ) +{ + player.EndSignal( "OnDeath" ) + + if ( player != GetLocalViewPlayer() ) + return + if ( InPrediction() && !IsFirstTimePredicted() ) + return + + if ( warmupTime <= 0 ) + return + + int index = GetParticleSystemIndex( SHIFTER_PRE_FX ) + int fxID = StartParticleEffectInWorldWithHandle( index, ZERO_VECTOR, ZERO_VECTOR ) + + OnThreadEnd( + function() : ( fxID ) + { + EffectStop( fxID, true, true ); + } + ) + + if ( player.IsTitan() ) + EmitSoundOnEntity( player, SHIFTER_PRE_SOUND_1P_TITAN ) + else + EmitSoundOnEntity( player, SHIFTER_PRE_SOUND_1P ) + + wait warmupTime +} + +void function ClientPhaseShiftFirstPersonFXThread() +{ + int effectSparkles; + int effectScreen; + bool effectsAreActive = false; + bool endSoundPlayed = false; + entity ourPlayer = null; + + while( true ) + { + if ( effectsAreActive ) + { + entity localViewPlayer = GetLocalViewPlayer(); + + bool needShutdown = false; + if ( !IsValid( ourPlayer ) || !IsAlive( ourPlayer ) ) + needShutdown = true; + else if ( ourPlayer != localViewPlayer ) + needShutdown = true; + else if ( !ourPlayer.IsPhaseShifted() ) + needShutdown = true; + + if ( needShutdown ) + { + if ( IsValid( ourPlayer ) && (ourPlayer == localViewPlayer) ) + { + // FX + { + int fxIndex = GetParticleSystemIndex( SHIFTER_SCREEN_FX_START ) + StartParticleEffectInWorldWithHandle( fxIndex, ZERO_VECTOR, ZERO_VECTOR ) + } + + // FX + { + int fxIndex = GetParticleSystemIndex( SHIFTER_APPEAR_FX ) + vector viewAngles = ourPlayer.EyeAngles() + vector viewForward = AnglesToForward( viewAngles ) + vector viewForward2d = Normalize( Vector( viewForward.x, viewForward.y, 0.0 ) ) + StartParticleEffectOnEntityWithPos( ourPlayer, fxIndex, FX_PATTACH_ABSORIGIN, -1, (viewForward2d * 30), ZERO_VECTOR ) + } + + if ( ourPlayer.IsTitan() ) + { + EmitSoundOnEntity( ourPlayer, SHIFTER_END_SOUND_1P_TITAN ) + } + else + { + EmitSoundOnEntity( ourPlayer, SHIFTER_END_SOUND_1P ) + } + StopSoundOnEntity( ourPlayer, SHIFTER_LOOP_SOUND_1P ) + StopSoundOnEntity( ourPlayer, SHIFTER_LOOP_SOUND_1P_TITAN ) + } + + ClientPhaseShift_SCRIPT_HACKS_OFF() + + EffectStop( effectSparkles, true, true ) + EffectStop( effectScreen, true, true ) + effectsAreActive = false; + ourPlayer = null; + endSoundPlayed = false; + } + else if ( IsValid( localViewPlayer ) && localViewPlayer.IsPhaseShifted() ) + { + if ( !endSoundPlayed && (localViewPlayer.PhaseShiftTimeRemaining() <= SHIFTER_OUTRO_TIME_BEFORE_END) ) + { + endSoundPlayed = true; + if ( localViewPlayer.IsTitan() ) + EmitSoundOnEntity( localViewPlayer, SHIFTER_PRE_END_SOUND_1P_TITAN ) + else + EmitSoundOnEntity( localViewPlayer, SHIFTER_PRE_END_SOUND_1P ) + } + } + + } + + if ( !effectsAreActive ) + { + entity localViewPlayer = GetLocalViewPlayer(); + + if ( IsValid( localViewPlayer ) && localViewPlayer.IsPhaseShifted() ) + { + // FX + { + int fxIndex = GetParticleSystemIndex( SHIFTER_PERSONAL_FX ) + int attachIdx = localViewPlayer.LookupAttachment( "CHESTFOCUS" ) + effectSparkles = StartParticleEffectOnEntity( localViewPlayer, fxIndex, FX_PATTACH_POINT_FOLLOW, attachIdx ) + } + + // FX + { + int fxIndex = GetParticleSystemIndex( SHIFTER_SCREEN_FX ) + effectScreen = StartParticleEffectInWorldWithHandle( fxIndex, ZERO_VECTOR, ZERO_VECTOR ) + } + + // FX + { + int fxIndex = GetParticleSystemIndex( SHIFTER_SCREEN_FX_START ) + StartParticleEffectInWorldWithHandle( fxIndex, ZERO_VECTOR, ZERO_VECTOR ) + } + + // FX + { + entity viewModelEntity = localViewPlayer.GetViewModelEntity() + entity firstPersonProxy = localViewPlayer.GetPredictedFirstPersonProxy() + + if ( IsValid( viewModelEntity ) ) + { + viewModelEntity.Highlight_HideInside( 0.0 ) + viewModelEntity.Highlight_HideOutline( 0.0 ) + } + + if ( IsValid( firstPersonProxy ) ) + { + firstPersonProxy.Highlight_HideInside( 0.0 ) + firstPersonProxy.Highlight_HideOutline( 0.0 ) + } + } + + ClientPhaseShift_SCRIPT_HACKS_ON() + + if ( localViewPlayer.IsTitan() ) + EmitSoundOnEntity( localViewPlayer, SHIFTER_START_SOUND_1P_TITAN ) + else + EmitSoundOnEntity( localViewPlayer, SHIFTER_START_SOUND_1P ) + + if ( localViewPlayer.IsTitan() ) + EmitSoundOnEntity( localViewPlayer, SHIFTER_LOOP_SOUND_1P_TITAN ) + else + EmitSoundOnEntity( localViewPlayer, SHIFTER_LOOP_SOUND_1P ) + + effectsAreActive = true; + ourPlayer = localViewPlayer; + } + } + + WaitFrame() + } +} + +void function ClientRemoteTurretFirstPersonFXThread() +{ + int effectSparkles; + int effectScreen; + bool effectsAreActive = false; + entity ourPlayer = null; + + const string TURRET_LOOP_SOUND = "Pilot_RemoteTurret_Loop_1P" + + while( true ) + { + if ( effectsAreActive ) + { + entity localViewPlayer = GetLocalViewPlayer(); + + bool needShutdown = false; + if ( !IsValid( ourPlayer ) || !IsAlive( ourPlayer ) ) + needShutdown = true; + else if ( ourPlayer != localViewPlayer ) + needShutdown = true; + else if ( ourPlayer.GetRemoteTurret() == null ) + needShutdown = true; + + if ( needShutdown ) + { + if ( IsValid( ourPlayer ) && (ourPlayer == localViewPlayer) ) + StopSoundOnEntity( ourPlayer, TURRET_LOOP_SOUND ) + + effectsAreActive = false; + ourPlayer = null; + } + } + + if ( !effectsAreActive ) + { + entity localViewPlayer = GetLocalViewPlayer(); + if ( IsValid( localViewPlayer ) && (localViewPlayer.GetRemoteTurret() != null) ) + { + EmitSoundOnEntity( localViewPlayer, TURRET_LOOP_SOUND ) + effectsAreActive = true; + ourPlayer = localViewPlayer; + } + } + + WaitFrame() + } +} + +void function ClientPhaseShift_SCRIPT_HACKS_ON() +{ + entity localViewPlayer = GetLocalViewPlayer(); + + localViewPlayer.Signal( "StartPhaseShift" ) + + if ( localViewPlayer == GetLocalClientPlayer() ) + { + //localViewPlayer.cv.PlayerPetTitanIcon.Hide() + //localViewPlayer.cv.PlayerPetTitanArrow.Hide() + //localViewPlayer.cv.PlayerPetTitanLabel.Hide() + } +} + +void function ClientPhaseShift_SCRIPT_HACKS_OFF() +{ + entity localViewPlayer = GetLocalViewPlayer(); + + if ( localViewPlayer == GetLocalClientPlayer() ) + UpdatePetTitanIcon( localViewPlayer ) + + //It would be great if we could automatically hide icons using SetEntityOverhead if that entity is phased out. + // if ( GameRules_GetGameMode() == SURVIVOR ) + // DisplayScrapCounter( GetLocalClientPlayer(), LIFE_ALIVE, LIFE_ALIVE ) +} + +#endif // #if CLIENT From e32bd27b12d198301e0221a1f4176c854487c6a9 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 18 Oct 2022 02:30:59 +0200 Subject: [PATCH 85/99] Fix respawn as titan --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 6a0fdbefc..b9bb34bdb 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -174,7 +174,7 @@ void function FD_PlayerRespawnCallback( entity player ) if( GetGameState() != eGameState.Playing) return - if( player.IsTitan() ) + if( player.GetPersistentVar( "spawnAsTitan" ) ) return player.SetInvulnerable() From 3c00b69762435ba3c753495b191c379508fd5003 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 20 Oct 2022 01:49:40 +0200 Subject: [PATCH 86/99] Add game end awards --- .../vscripts/gamemodes/_gamemode_fd.nut | 214 +++++++++++++++--- .../mod/scripts/vscripts/mp/_gamestate_mp.nut | 17 +- 2 files changed, 195 insertions(+), 36 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index b9bb34bdb..b768b984d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -20,19 +20,21 @@ struct player_struct_fd{ bool diedThisRound int scoreThisRound int totalMVPs - int mortarUnitsKilled + int mortarUnitsKilled int moneySpend int coresUsed - float longestTitanLife //not implemented yet - int turretsRepaired //not implemented yet + float longestTitanLife + int turretsRepaired int moneyShared float timeNearHarvester //dont know how to track - float longestLife + float longestLife int heals //dont know what to track - int titanKills + int titanKills float damageDealt int harvesterHeals float lastRespawn + int turretKills + float lastTitanDrop } global HarvesterStruct& fd_harvester @@ -121,6 +123,7 @@ void function GamemodeFD_Init() AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) + SetPostMatchCallback(gameWonMedals) //Damage Callbacks AddDamageByCallback( "player", FD_DamageByPlayerCallback) @@ -137,7 +140,7 @@ void function GamemodeFD_Init() AddCallback_OnNPCKilled( OnNpcDeath ) AddCallback_OnPlayerKilled( GamemodeFD_OnPlayerKilled ) AddDeathCallback( "npc_frag_drone", OnTickDeath ) // ticks dont come up in the other callback because of course they dont - + //Command Callbacks AddClientCommandCallback( "FD_ToggleReady", ClientCommandCallbackToggleReady ) AddClientCommandCallback( "FD_UseHarvesterShieldBoost", useShieldBoost ) @@ -150,7 +153,7 @@ void function GamemodeFD_Init() ScoreEvent_SetupEarnMeterValuesForMixedModes() } -void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) +void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) { file.players[player].moneySpend += data.cost } @@ -239,8 +242,15 @@ void function FD_TeamReserveDepositOrWithdrawCallback( entity player, string act } void function GamemodeFD_OnPlayerKilled( entity victim, entity attacker, var damageInfo ) { - file.players[victim].longestLife = Time() - file.players[victim].lastRespawn + //set longest Time alive for end awards + float timeAlive = Time() - file.players[victim].lastRespawn + if(timeAlive>file.players[victim].longestLife) + file.players[victim].longestLife = timeAlive + + //set died this round for round end money boni file.players[victim].diedThisRound = true + + //play voicelines for amount of players alive array militiaplayers = GetPlayerArrayOfTeam( TEAM_MILITIA ) int deaths = 0 foreach ( entity player in militiaplayers ) @@ -271,14 +281,14 @@ void function FD_UsedCoreCallback( entity titan, entity weapon ) } void function GamemodeFD_InitPlayer( entity player ) -{ +{ player_struct_fd data data.diedThisRound = false file.players[player] <- data thread SetTurretSettings_threaded( player ) // only start the highlight when we start playing, not during dropship if ( GetGameState() >= eGameState.Playing ) - Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" ) + Highlight_SetFriendlyHighlight( player, "sp_friendly_hero" ) if( file.playersHaveTitans ) // first wave is index 0 { @@ -308,15 +318,15 @@ void function OnTickDeath( entity victim, var damageInfo ) if ( findIndex != -1 ) { spawnedNPCs.remove( findIndex ) - + SetGlobalNetInt( "FD_AICount_Ticks", GetGlobalNetInt( "FD_AICount_Ticks" ) -1 ) - + SetGlobalNetInt( "FD_AICount_Current", GetGlobalNetInt( "FD_AICount_Current" ) -1 ) } } 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() ) @@ -331,13 +341,13 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) 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 ) @@ -388,7 +398,7 @@ void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) } } - + } void function RateSpawnpoints_FD( int _0, array _1, int _2, entity _3 ) @@ -568,7 +578,7 @@ void function SetEnemyAmountNetVars( int waveIndex ) break default: npcs[e.spawnEvent.spawnType] += e.spawnEvent.spawnAmount - + } total+= e.spawnEvent.spawnAmount } @@ -629,7 +639,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) CloseBoostStores() MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_StoreClosing ) } - + //SetGlobalNetTime("FD_nextWaveStartTime",Time()+10) wait 10 SetGlobalNetInt( "FD_waveState", WAVE_STATE_INCOMING ) @@ -641,7 +651,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) SetGlobalNetBool( "FD_waveActive", true ) MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_AnnounceWaveStart ) SetGlobalNetInt( "FD_waveState", WAVE_STATE_BREAK ) - + //main wave loop thread SetWaveStateReady() executeWave() @@ -714,7 +724,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) entity highestScore_player = GetPlayerArray()[0] foreach( entity player in GetPlayerArray() ) { - + if( !file.players[player].diedThisRound ) AddPlayerScore( player, "FDDidntDie" ) if( highestScore < file.players[player].scoreThisRound ) @@ -733,7 +743,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) - + SetRoundBased(false) SetWinner(TEAM_MILITIA) PlayFactionDialogueToTeam( "fd_matchVictory", TEAM_MILITIA ) @@ -841,10 +851,146 @@ void function SetWaveStateReady() void function gameWonMedals() { - table medals - //most mvps + array medalOwners = [ null, null, null, null, null, null, null, null, null, null, null, null, null, null ] + array medalValues = [ -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0 ] + + foreach(entity player in GetPlayerArray() ) + { + if( file.players[player].totalMVPs > medalValues[0]) + { + medalOwners[0] = player + medalValues[0] = float( file.players[player].totalMVPs ) + } + if( file.players[player].titanKills > medalValues[1]) + { + medalOwners[1] = player + medalValues[1] = float( file.players[player].titanKills ) + } + if( file.players[player].heals > medalValues[2]) + { + medalOwners[2] = player + medalValues[2] = float(file.players[player].heals) + } + if( file.players[player].turretKills > medalValues[3]) + { + medalOwners[3] = player + medalValues[3] = float( file.players[player].turretKills ) + } + if( file.players[player].longestTitanLife > medalValues[4]) + { + medalOwners[4] = player + medalValues[4] = file.players[player].longestTitanLife + } + if( file.players[player].coresUsed > medalValues[5]) + { + medalOwners[5] = player + medalValues[5] = float( file.players[player].coresUsed ) + } + if( file.players[player].turretsRepaired > medalValues[6]) + { + medalOwners[6] = player + medalValues[6] = float( file.players[player].turretsRepaired ) + } + if( file.players[player].moneyShared > medalValues[7]) + { + medalOwners[7] = player + medalValues[7] = float( file.players[player].moneyShared ) + } + if( file.players[player].harvesterHeals > medalValues[8]) + { + medalOwners[8] = player + medalValues[8] = float( file.players[player].harvesterHeals ) + } + if( file.players[player].moneySpend > medalValues[9]) + { + medalOwners[9] = player + medalValues[9] = float( file.players[player].moneySpend ) + } + if( file.players[player].mortarUnitsKilled > medalValues[10]) + { + medalOwners[10] = player + medalValues[10] = float( file.players[player].mortarUnitsKilled ) + } + if( file.players[player].timeNearHarvester > medalValues[11]) + { + medalOwners[11] = player + medalValues[11] = file.players[player].timeNearHarvester + } + if( file.players[player].damageDealt > medalValues[12]) + { + medalOwners[12] = player + medalValues[12] = file.players[player].damageDealt + } + if( file.players[player].longestLife > medalValues[13]) + { + medalOwners[13] = player + medalValues[13] = file.players[player].longestLife + } + } + table medalResults + table medalResultValues + array minimumRequirements = [ 2.0, 30.0, 5000.0, 10.0, 100.0, 1.0, 5.0, 100.0, 1.0, 2000.0, 1.0, 200.0, -1.0, 200.0 ] + foreach(int index,entity player in medalOwners) + { + if(player == null) + continue + if(player in medalResults) + continue + if( medalValues[index] > minimumRequirements[index] ) //might be >= + { + medalResults[player] <- index + medalResultValues[player] <- medalValues[index] + } + + } + foreach( entity player in GetPlayerArray() ) + { + if( !( player in medalResults ) ) + { + medalResults[player] <- 12 + medalResultValues[player] <- file.players[player].damageDealt + } + } + array mapIndexes = [ 12, 13, 10, 11, 4, 3, 5, 6, 0, 2, 1, 8, 7, 9 ] + foreach( entity player in GetPlayerArray() ) + { + foreach( entity medalPlayer, int medal in medalResults ) + { + Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", medalPlayer.GetEncodedEHandle(), mapIndexes[ medal ], medalResultValues[medalPlayer], 1 ) //TODO set correct suit + } + Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 10 )//TODO set correct endTime + } + foreach( int index, entity player in medalOwners ) + { + printt( player, index, medalValues[index] ) + } + wait 15 } +void function IncrementPlayerstat_TurretRevives( entity player ) +{ + file.players[player].turretsRepaired += 1 +} + +void function SpawnCallback_SafeTitanSpawnTime( entity ent ) +{ + if( ent.IsTitan() && IsValid( GetPetTitanOwner( ent ) ) ) + { + entity player = GetPetTitanOwner( ent ) + file.players[player].lastTitanDrop = Time() + } +} + +void function DeathCallback_CalculateTitanAliveTime( entity ent ) +{ + if( ent.IsTitan() && IsValid( GetPetTitanOwner( ent ) ) ) + { + entity player = GetPetTitanOwner( ent ) + float aliveTime = file.players[player].lastTitanDrop - Time() + if( aliveTime > file.players[player].longestTitanLife ) + file.players[player].longestTitanLife = aliveTime + } +} void function OnHarvesterDamaged( entity harvester, var damageInfo ) { @@ -1052,18 +1198,18 @@ void function initNetVars() else FD_SetNumAllowedRestarts( 2 ) } - + } -void function FD_DamageByPlayerCallback(entity victim,var damageInfo) +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 + 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 @@ -1090,13 +1236,13 @@ void function DamageScaleByDifficulty( entity ent, var damageInfo ) 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 ) ) ) - + } @@ -1112,12 +1258,12 @@ void function HealthScaleByDifficulty( entity ent ) 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() @@ -1312,7 +1458,7 @@ string function GetTargetNameForID( int typeId ) string function GetAiNetIdFromTargetName( string targetName ) { switch ( targetName ) - { + { case "titan": case "sniperTitan": case "npc_titan_ogre_meteor_boss_fd": @@ -1427,7 +1573,7 @@ void function FD_DropshipSpawnDropship() file.dropship = CreateDropship( TEAM_MILITIA, FD_spawnPosition , FD_spawnAngles ) - file.dropship.SetModel( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) + file.dropship.SetModel( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) file.dropship.SetValueForModelKey( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) DispatchSpawn( file.dropship ) @@ -1459,7 +1605,7 @@ void function FD_DropshipDropPlayer(entity player,int playerDropshipIndex) jumpSequence.attachment = "ORIGIN" jumpSequence.blendTime = 0.0 jumpSequence.viewConeFunction = ViewConeFree - + thread FirstPersonSequence( jumpSequence, player, file.dropship ) WaittillAnimDone( player ) player.ClearParent() diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut index 6cde46555..0732e131b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut @@ -24,6 +24,8 @@ global function ShouldRunEvac global function GiveTitanToPlayer global function GetTimeLimit_ForGameMode +global function SetCallback_RunPostmatch + struct { // used for togglable parts of gamestate bool usePickLoadoutScreen @@ -53,6 +55,7 @@ struct { float roundWinningKillReplayHealthFrac array roundEndCleanupCallbacks + void functionref() postMatchCallback } file void function PIN_GameStart() @@ -81,6 +84,8 @@ void function PIN_GameStart() AddDeathCallback( "npc_titan", OnTitanKilled ) RegisterSignal( "CleanUpEntitiesForRoundEnd" ) + + } void function SetGameState( int newState ) @@ -430,7 +435,7 @@ void function GameStateEnter_SwitchingSides_Threaded() entity replayAttacker = file.roundWinningKillReplayAttacker bool doReplay = Replay_IsEnabled() && IsRoundWinningKillReplayEnabled() && IsValid( replayAttacker ) && !IsRoundBased() // for roundbased modes, we've already done the replay - && Time() - file.roundWinningKillReplayTime <= SWITCHING_SIDES_DELAY + && Time() - file.roundWinningKillReplayTime <= SWITCHING_SIDES_DELAY float replayLength = SWITCHING_SIDES_DELAY_REPLAY // extra delay if no replay if ( doReplay ) @@ -524,9 +529,17 @@ void function GameStateEnter_Postmatch() thread GameStateEnter_Postmatch_Threaded() } +void function SetCallback_RunPostmatch(void functionref() callback) +{ + file.postMatchCallback = callback +} + void function GameStateEnter_Postmatch_Threaded() { - wait GAME_POSTMATCH_LENGTH + if( file.postMatchCallback == null) + wait GAME_POSTMATCH_LENGTH + else + waitthread file.postMatchCallback() GameRules_EndMatch() } From 4d48eb81ef99c54210a8914fadf3f58cd295fb59 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Thu, 20 Oct 2022 03:01:05 +0200 Subject: [PATCH 87/99] Fix calling wrong function --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index b768b984d..9ec2bbf2d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -123,7 +123,7 @@ void function GamemodeFD_Init() AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) - SetPostMatchCallback(gameWonMedals) + SetCallback_RunPostmatch(gameWonMedals) //Damage Callbacks AddDamageByCallback( "player", FD_DamageByPlayerCallback) From a15ff4c0ab513d478cdee2cdf3a1de661701e183 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sat, 22 Oct 2022 00:51:01 +0200 Subject: [PATCH 88/99] Rework game end awards --- .../vscripts/gamemodes/sh_arena_loadouts.gnut | 2 +- .../vscripts/gamemodes/_gamemode_fd.nut | 191 ++++++++---------- .../gamemodes/_gamemode_fd_events.nut | 15 +- 3 files changed, 98 insertions(+), 110 deletions(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_arena_loadouts.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_arena_loadouts.gnut index ae0fa7d68..d74a63ee1 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_arena_loadouts.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_arena_loadouts.gnut @@ -39,7 +39,7 @@ void function InitialiseArenaLoadouts() file.tier0Weapons.append( respawnData ) #if SERVER - SetBoostPurchaseCallback( GivePlayerArenaLoadoutItem ) + //SetBoostPurchaseCallback( GivePlayerArenaLoadoutItem ) #endif } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 9ec2bbf2d..a07ffcf46 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -16,9 +16,13 @@ enum eDropshipState{ _count_ } + + + struct player_struct_fd{ bool diedThisRound int scoreThisRound + /* int totalMVPs int mortarUnitsKilled int moneySpend @@ -32,8 +36,9 @@ struct player_struct_fd{ int titanKills float damageDealt int harvesterHeals - float lastRespawn int turretKills + */ + float lastRespawn float lastTitanDrop } @@ -56,7 +61,8 @@ struct { bool havesterWasDamaged bool harvesterShieldDown float harvesterDamageTaken - table players + table players + table > playerAwardStats entity harvester_info bool playersHaveTitans = false @@ -155,7 +161,7 @@ void function GamemodeFD_Init() void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) { - file.players[player].moneySpend += data.cost + file.playerAwardStats[player]["moneySpent"] += float( data.cost ) } void function FD_PlayerRespawnCallback( entity player ) @@ -233,10 +239,10 @@ void function FD_TeamReserveDepositOrWithdrawCallback( entity player, string act switch( action ) { case"deposit": - file.players[player].moneyShared += amount + file.playerAwardStats[player]["moneyShared"] += float( amount ) break case"withdraw": - file.players[player].moneyShared -= amount + file.playerAwardStats[player]["moneyShared"] -= float( amount ) break } } @@ -244,8 +250,8 @@ void function GamemodeFD_OnPlayerKilled( entity victim, entity attacker, var dam { //set longest Time alive for end awards float timeAlive = Time() - file.players[victim].lastRespawn - if(timeAlive>file.players[victim].longestLife) - file.players[victim].longestLife = timeAlive + if(timeAlive>file.playerAwardStats[victim]["longestLife"]) + file.playerAwardStats[victim]["longestLife"] = timeAlive //set died this round for round end money boni file.players[victim].diedThisRound = true @@ -277,7 +283,7 @@ void function FD_UsedCoreCallback( entity titan, entity weapon ) { return } - file.players[titan].coresUsed += 1 + file.playerAwardStats[titan]["coresUsed"] += 1 } void function GamemodeFD_InitPlayer( entity player ) @@ -285,6 +291,12 @@ void function GamemodeFD_InitPlayer( entity player ) player_struct_fd data data.diedThisRound = false file.players[player] <- data + table awardStats + foreach( string statRef in GetFDStatRefs() ) + { + awardStats[statRef] <- 0.0 + } + file.playerAwardStats[player] <- awardStats thread SetTurretSettings_threaded( player ) // only start the highlight when we start playing, not during dropship if ( GetGameState() >= eGameState.Playing ) @@ -328,11 +340,11 @@ void function OnTickDeath( entity victim, var damageInfo ) void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { if( victim.IsTitan() && attacker in file.players ) - file.players[attacker].titanKills++ + file.playerAwardStats[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++ + file.playerAwardStats[attacker]["mortarUnitsKilled"]++ int findIndex = spawnedNPCs.find( victim ) if ( findIndex != -1 ) { @@ -414,7 +426,7 @@ bool function useShieldBoost( entity player, array args ) 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 + file.playerAwardStats[player]["harvesterHeals"]++ } return true } @@ -734,13 +746,28 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) } } - file.players[highestScore_player].totalMVPs += 1 + file.playerAwardStats[highestScore_player]["mvp"]++ AddPlayerScore( highestScore_player, "FDWaveMVP" ) wait 1 foreach( entity player in GetPlayerArray() ) if( !file.havesterWasDamaged ) AddPlayerScore( player, "FDTeamFlawlessWave" ) + foreach(entity player in GetPlayerArray() ) + { + if( IsAlive( player ) ) + { + float timeAlive = Time() - file.players[player].lastRespawn + if(timeAlive>file.playerAwardStats[player]["longestLife"]) + file.playerAwardStats[player]["longestLife"] = timeAlive + } + if( IsValid( player.GetPetTitan ) ) + { + float timeAlive = Time() - file.players[player].lastTitanDrop + if(timeAlive>file.playerAwardStats[player]["longestTitanLife"]) + file.playerAwardStats[player]["longestTitanLife"] = timeAlive + } + } @@ -812,7 +839,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) highestScore_player = player } } - file.players[highestScore_player].totalMVPs += 1 + file.playerAwardStats[highestScore_player]["mvp"]++ AddPlayerScore( highestScore_player, "FDWaveMVP" ) AddMoneyToPlayer( highestScore_player, 100 ) highestScore_player.AddToPlayerGameStat( PGS_ASSAULT_SCORE, FD_SCORE_MVP ) @@ -851,125 +878,73 @@ void function SetWaveStateReady() void function gameWonMedals() { - array medalOwners = [ null, null, null, null, null, null, null, null, null, null, null, null, null, null ] - array medalValues = [ -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0 ] + table awardOwners + table awardValues foreach(entity player in GetPlayerArray() ) { - if( file.players[player].totalMVPs > medalValues[0]) - { - medalOwners[0] = player - medalValues[0] = float( file.players[player].totalMVPs ) - } - if( file.players[player].titanKills > medalValues[1]) - { - medalOwners[1] = player - medalValues[1] = float( file.players[player].titanKills ) - } - if( file.players[player].heals > medalValues[2]) - { - medalOwners[2] = player - medalValues[2] = float(file.players[player].heals) - } - if( file.players[player].turretKills > medalValues[3]) - { - medalOwners[3] = player - medalValues[3] = float( file.players[player].turretKills ) - } - if( file.players[player].longestTitanLife > medalValues[4]) - { - medalOwners[4] = player - medalValues[4] = file.players[player].longestTitanLife - } - if( file.players[player].coresUsed > medalValues[5]) - { - medalOwners[5] = player - medalValues[5] = float( file.players[player].coresUsed ) - } - if( file.players[player].turretsRepaired > medalValues[6]) - { - medalOwners[6] = player - medalValues[6] = float( file.players[player].turretsRepaired ) - } - if( file.players[player].moneyShared > medalValues[7]) - { - medalOwners[7] = player - medalValues[7] = float( file.players[player].moneyShared ) - } - if( file.players[player].harvesterHeals > medalValues[8]) - { - medalOwners[8] = player - medalValues[8] = float( file.players[player].harvesterHeals ) - } - if( file.players[player].moneySpend > medalValues[9]) - { - medalOwners[9] = player - medalValues[9] = float( file.players[player].moneySpend ) - } - if( file.players[player].mortarUnitsKilled > medalValues[10]) - { - medalOwners[10] = player - medalValues[10] = float( file.players[player].mortarUnitsKilled ) - } - if( file.players[player].timeNearHarvester > medalValues[11]) - { - medalOwners[11] = player - medalValues[11] = file.players[player].timeNearHarvester - } - if( file.players[player].damageDealt > medalValues[12]) - { - medalOwners[12] = player - medalValues[12] = file.players[player].damageDealt - } - if( file.players[player].longestLife > medalValues[13]) + foreach( string ref in GetFDStatRefs() ) { - medalOwners[13] = player - medalValues[13] = file.players[player].longestLife + if( !( ref in awardOwners ) ) + { + awardOwners[ref] <- player + awardValues[ref] <- file.playerAwardStats[player][ref] + } + else if( awardValues[ref] < file.playerAwardStats[player][ref] ) + { + awardOwners[ref] = player + awardValues[ref] = file.playerAwardStats[player][ref] + } } } - table medalResults - table medalResultValues - array minimumRequirements = [ 2.0, 30.0, 5000.0, 10.0, 100.0, 1.0, 5.0, 100.0, 1.0, 2000.0, 1.0, 200.0, -1.0, 200.0 ] - foreach(int index,entity player in medalOwners) + table awardResults + table awardResultValues + + foreach(string ref,entity player in awardOwners) { - if(player == null) - continue - if(player in medalResults) - continue - if( medalValues[index] > minimumRequirements[index] ) //might be >= + + if( awardValues[ref] > GetFDStatData( ref ).validityCheckValue ) //might be >= { - medalResults[player] <- index - medalResultValues[player] <- medalValues[index] + awardResults[player] <- ref + awardResultValues[player] <- awardValues[ref] } } foreach( entity player in GetPlayerArray() ) { - if( !( player in medalResults ) ) + if( !( player in awardResults ) ) { - medalResults[player] <- 12 - medalResultValues[player] <- file.players[player].damageDealt + awardResults[player] <- "damageDealt" + awardResultValues[player] <- file.playerAwardStats[player]["damageDealt"] } } - array mapIndexes = [ 12, 13, 10, 11, 4, 3, 5, 6, 0, 2, 1, 8, 7, 9 ] + foreach( entity player in GetPlayerArray() ) { - foreach( entity medalPlayer, int medal in medalResults ) + foreach( entity medalPlayer, string ref in awardResults ) + { + Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", medalPlayer.GetEncodedEHandle(), GetFDStatData( ref ).index , awardResultValues[medalPlayer], GetPersistentSpawnLoadoutIndex( medalPlayer, "titan" ) ) + } + Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 25 )//TODO set correct endTime + } + foreach( entity player, table< string, float > data in file.playerAwardStats) + { + printt("Stats for", player) + foreach( string ref, float val in data ) { - Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", medalPlayer.GetEncodedEHandle(), mapIndexes[ medal ], medalResultValues[medalPlayer], 1 ) //TODO set correct suit + printt(" ",ref,val) } - Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 10 )//TODO set correct endTime } - foreach( int index, entity player in medalOwners ) + foreach( string ref, entity player in awardOwners ) { - printt( player, index, medalValues[index] ) + printt( player, ref, awardValues[ref] ) } - wait 15 + wait 25 } void function IncrementPlayerstat_TurretRevives( entity player ) { - file.players[player].turretsRepaired += 1 + file.playerAwardStats[player]["turretsRepaired"]++ } void function SpawnCallback_SafeTitanSpawnTime( entity ent ) @@ -987,8 +962,8 @@ void function DeathCallback_CalculateTitanAliveTime( entity ent ) { entity player = GetPetTitanOwner( ent ) float aliveTime = file.players[player].lastTitanDrop - Time() - if( aliveTime > file.players[player].longestTitanLife ) - file.players[player].longestTitanLife = aliveTime + if( aliveTime > file.playerAwardStats[player]["longestTitanLife"] ) + file.playerAwardStats[player]["longestTitanLife"] = aliveTime } } @@ -1208,7 +1183,7 @@ void function FD_DamageByPlayerCallback( entity victim, var damageInfo ) if( !( player in file.players ) ) return float damage = DamageInfo_GetDamage( damageInfo ) - file.players[ player ].damageDealt += damage + file.playerAwardStats[player]["damageDealt"] += damage file.players[ player ].scoreThisRound += damage.tointeger() //TODO NOT HOW SCORE WORKS if( victim.IsTitan() ) { diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index d66061551..bf887ba8a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -26,6 +26,7 @@ global function CreateMonarchTitanEvent global function CreateWarningEvent global function executeWave global function restetWaveEvents +global function WinWave global struct SmokeEvent{ vector position @@ -1290,7 +1291,8 @@ void function waitUntilLessThanAmountAlive_expensive( int amount ) continue } } - + foreach( entity ent in GetEntArrayByClass_Expensive( "npc_drone" ) ) + ent.Die() int aliveTitans = npcs.len() - deduct while( aliveTitans > amount ) { @@ -1334,3 +1336,14 @@ void function AddMinimapForHumans( entity human ) human.Minimap_SetHeightTracking( true ) human.Minimap_SetCustomState( eMinimapObject_npc.AI_TDM_AI ) } + + + +void function WinWave() +{ + foreach( WaveEvent e in waveEvents[GetGlobalNetInt( "FD_currentWave" )] ) + { + e.timesExecuted = e.executeOnThisCall + } +} + From 3e83c53b44ea0cd04fa6cfcd645ca4569e19e808 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 23 Oct 2022 20:23:40 +0200 Subject: [PATCH 89/99] Set end game awards as epilogue --- .../vscripts/gamemodes/_gamemode_fd.nut | 24 +++++++++++++++---- .../mod/scripts/vscripts/mp/_gamestate_mp.nut | 17 ++----------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index a07ffcf46..4af82c8ba 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -129,7 +129,7 @@ void function GamemodeFD_Init() AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) - SetCallback_RunPostmatch(gameWonMedals) + ClassicMP_SetEpilogue(FD_SetupEpilogue) //Damage Callbacks AddDamageByCallback( "player", FD_DamageByPlayerCallback) @@ -876,13 +876,26 @@ void function SetWaveStateReady() SetGlobalNetInt( "FD_waveState", WAVE_STATE_IN_PROGRESS ) } -void function gameWonMedals() +void function FD_SetupEpilogue() +{ + AddCallback_GameStateEnter( eGameState.Epilogue, FD_Epilogue ) +} + +void function FD_Epilogue() +{ + thread FD_Epilogue_threaded() +} + +void function FD_Epilogue_threaded() { table awardOwners table awardValues - + wait 5 foreach(entity player in GetPlayerArray() ) { + player.FreezeControlsOnServer() + ScreenFadeToBlackForever( player, 6.0 ) + foreach( string ref in GetFDStatRefs() ) { if( !( ref in awardOwners ) ) @@ -927,6 +940,7 @@ void function gameWonMedals() } Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 25 )//TODO set correct endTime } + /* //debugging prints foreach( entity player, table< string, float > data in file.playerAwardStats) { printt("Stats for", player) @@ -939,7 +953,9 @@ void function gameWonMedals() { printt( player, ref, awardValues[ref] ) } - wait 25 + */ + wait 20 + SetGameState(eGameState.Postmatch) } void function IncrementPlayerstat_TurretRevives( entity player ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut index 0732e131b..6cde46555 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut @@ -24,8 +24,6 @@ global function ShouldRunEvac global function GiveTitanToPlayer global function GetTimeLimit_ForGameMode -global function SetCallback_RunPostmatch - struct { // used for togglable parts of gamestate bool usePickLoadoutScreen @@ -55,7 +53,6 @@ struct { float roundWinningKillReplayHealthFrac array roundEndCleanupCallbacks - void functionref() postMatchCallback } file void function PIN_GameStart() @@ -84,8 +81,6 @@ void function PIN_GameStart() AddDeathCallback( "npc_titan", OnTitanKilled ) RegisterSignal( "CleanUpEntitiesForRoundEnd" ) - - } void function SetGameState( int newState ) @@ -435,7 +430,7 @@ void function GameStateEnter_SwitchingSides_Threaded() entity replayAttacker = file.roundWinningKillReplayAttacker bool doReplay = Replay_IsEnabled() && IsRoundWinningKillReplayEnabled() && IsValid( replayAttacker ) && !IsRoundBased() // for roundbased modes, we've already done the replay - && Time() - file.roundWinningKillReplayTime <= SWITCHING_SIDES_DELAY + && Time() - file.roundWinningKillReplayTime <= SWITCHING_SIDES_DELAY float replayLength = SWITCHING_SIDES_DELAY_REPLAY // extra delay if no replay if ( doReplay ) @@ -529,17 +524,9 @@ void function GameStateEnter_Postmatch() thread GameStateEnter_Postmatch_Threaded() } -void function SetCallback_RunPostmatch(void functionref() callback) -{ - file.postMatchCallback = callback -} - void function GameStateEnter_Postmatch_Threaded() { - if( file.postMatchCallback == null) - wait GAME_POSTMATCH_LENGTH - else - waitthread file.postMatchCallback() + wait GAME_POSTMATCH_LENGTH GameRules_EndMatch() } From 95f09ef4ac2e9ab26ba55663ccc6366aee9febe0 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Sun, 13 Nov 2022 16:52:46 +0100 Subject: [PATCH 90/99] Prevent crash when playing with more than 4 players end game will now only show 4 awards even if more players are in the game --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 4af82c8ba..679cda7c3 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -934,8 +934,11 @@ void function FD_Epilogue_threaded() foreach( entity player in GetPlayerArray() ) { + int i = 0 foreach( entity medalPlayer, string ref in awardResults ) { + if(i++ >= 4) + break; Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", medalPlayer.GetEncodedEHandle(), GetFDStatData( ref ).index , awardResultValues[medalPlayer], GetPersistentSpawnLoadoutIndex( medalPlayer, "titan" ) ) } Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 25 )//TODO set correct endTime From 2073313713d6500c7925191420fec9d42efd0133 Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Wed, 14 Dec 2022 00:11:18 +0800 Subject: [PATCH 91/99] [FD]Set Persistent Var (#547) Set FD Persistent Vars for Endgame Medals --- .../vscripts/gamemodes/_gamemode_fd.nut | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 679cda7c3..3c6fa3a66 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -129,7 +129,7 @@ void function GamemodeFD_Init() AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) - ClassicMP_SetEpilogue(FD_SetupEpilogue) + ClassicMP_SetEpilogue( FD_SetupEpilogue ) //Damage Callbacks AddDamageByCallback( "player", FD_DamageByPlayerCallback) @@ -923,6 +923,12 @@ void function FD_Epilogue_threaded() } } + + int gameMode = PersistenceGetEnumIndexForItemName( "gamemodes", GAMETYPE ) + int map = PersistenceGetEnumIndexForItemName( "maps", GetMapName() ) + int myIndex + int numPlayers = GetPlayerArray().len() + foreach( entity player in GetPlayerArray() ) { if( !( player in awardResults ) ) @@ -935,13 +941,35 @@ void function FD_Epilogue_threaded() foreach( entity player in GetPlayerArray() ) { int i = 0 + myIndex = player.GetPlayerIndex() + + player.SetPersistentVar( "postGameDataFD.gameMode", gameMode ) + player.SetPersistentVar( "postGameDataFD.map", map ) + player.SetPersistentVar( "postGameDataFD.myIndex", myIndex ) + player.SetPersistentVar( "postGameDataFD.numPlayers", numPlayers ) + foreach( entity medalPlayer, string ref in awardResults ) { - if(i++ >= 4) + if( i == numPlayers ) break; - Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", medalPlayer.GetEncodedEHandle(), GetFDStatData( ref ).index , awardResultValues[medalPlayer], GetPersistentSpawnLoadoutIndex( medalPlayer, "titan" ) ) + + int targetIndex = medalPlayer.GetPlayerIndex() + string name = medalPlayer.GetPlayerName() + string xuid = medalPlayer.GetUID() + int awardId = GetFDStatData( ref ).index + float awardValue = awardResultValues[medalPlayer] + int suitIndex = GetPersistentSpawnLoadoutIndex( medalPlayer, "titan" ) + int playerEHandle = medalPlayer.GetEncodedEHandle() + + player.SetPersistentVar( "postGameDataFD.players[" + targetIndex + "].name", name ) + player.SetPersistentVar( "postGameDataFD.players[" + targetIndex + "].xuid", xuid ) + player.SetPersistentVar( "postGameDataFD.players[" + targetIndex + "].awardId", awardId ) + player.SetPersistentVar( "postGameDataFD.players[" + targetIndex + "].awardValue", awardValue ) + player.SetPersistentVar( "postGameDataFD.players[" + targetIndex + "].suitIndex", suitIndex ) + Remote_CallFunction_NonReplay( player, "ServerCallback_UpdateGameStats", playerEHandle, awardId, awardValue, suitIndex ) + i++ } - Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 25 )//TODO set correct endTime + Remote_CallFunction_NonReplay( player, "ServerCallback_ShowGameStats", Time() + 19 ) } /* //debugging prints foreach( entity player, table< string, float > data in file.playerAwardStats) From a7353815e4b1211a2b983e7000d6c6a2f34f1738 Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Thu, 15 Dec 2022 17:49:27 +0800 Subject: [PATCH 92/99] [FD]Player Data Collect (#465) * Player Data Collect Player Data Collect * Compare time Compare time * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Specification and support more callback Specification and support more callback * Add Battery Heal Callback Add Battery Heal Callback * Add Battery Heal Collect Add Battery Heal Collect * Add files via upload * Update _gamemode_fd.nut * Update mp_titanweapon_stun_laser.nut * Improve AddSmokeHealCallback Improve AddSmokeHealCallback * Add Smoke Heal Collect Add Smoke Heal Collect * Check the battery owner Check the battery owner * Update mp_titanability_smoke.nut * Delete mp_titanability_smoke.nut * Delete mp_titanweapon_stun_laser.nut * Adapt to new code 1.Adapt to new code:heals,timeNearHarvester,SetUsedCoreCallback 2.Add data collect:turretKills * Update _gamemode_fd.nut * Add score for heal teammate(test) Add score for heal teammate * Add Heal Score Add Heal Score * Update _gamemode_fd.nut * Update _rodeo_titan.gnut * Update _gamemode_fd.nut * Update _gamemode_fd.nut * Update _gamemode_fd.nut * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> * Update _gamemode_fd.nut Co-authored-by: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> --- .../vscripts/gamemodes/_gamemode_fd.nut | 123 +++++++++++++++++- .../scripts/vscripts/rodeo/_rodeo_titan.gnut | 17 ++- 2 files changed, 138 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 3c6fa3a66..1e282f960 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -40,6 +40,8 @@ struct player_struct_fd{ */ float lastRespawn float lastTitanDrop + float lastNearHarvester + bool leaveHarvester } global HarvesterStruct& fd_harvester @@ -157,6 +159,12 @@ void function GamemodeFD_Init() //earn meter ScoreEvent_SetupEarnMeterValuesForMixedModes() + + //Data Collection + AddStunLaserHealCallback( FD_StunLaserHealTeammate ) + AddBatteryHealCallback( FD_BatteryHealTeammate ) + AddSmokeHealCallback( FD_SmokeHealTeammate ) + SetUsedCoreCallback( FD_UsedCoreCallback ) } void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) @@ -290,6 +298,7 @@ void function GamemodeFD_InitPlayer( entity player ) { player_struct_fd data data.diedThisRound = false + data.leaveHarvester = true file.players[player] <- data table awardStats foreach( string statRef in GetFDStatRefs() ) @@ -339,6 +348,10 @@ void function OnTickDeath( entity victim, var damageInfo ) void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { + if( attacker.GetClassName() == "npc_turret_sentry" ) + { + file.playerAwardStats[attacker.GetBossPlayer()]["turretKills"]++ + } if( victim.IsTitan() && attacker in file.players ) file.playerAwardStats[attacker]["titanKills"]++ int victimTypeID = FD_GetAITypeID_ByString( victim.GetTargetName() ) @@ -876,6 +889,52 @@ void function SetWaveStateReady() SetGlobalNetInt( "FD_waveState", WAVE_STATE_IN_PROGRESS ) } +void function FD_StunLaserHealTeammate( entity player, entity target, int shieldRestoreAmount ) +{ + if( IsValid( player ) && player in file.players ){ + file.playerAwardStats[player]["heals"] += shieldRestoreAmount + player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) + file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 + } +} + +void function FD_SmokeHealTeammate( entity player, entity target, int shieldRestoreAmount ) +{ + if( IsValid( player ) && player in file.players ){ + file.playerAwardStats[player]["heals"] += shieldRestoreAmount + player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) + file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 + } +} + +void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRestoreAmount, int healthRestoreAmount ) +{ + entity BatteryParent = battery.GetParent() + entity TargetTitan + int currentHeal + int currentHealScore + + if( titan.IsPlayer() ) + TargetTitan = titan + else if( titan.GetBossPlayer() != null ) + TargetTitan = titan.GetBossPlayer() + else + return + + if( BatteryParent == TargetTitan ) + return + + if( IsValid( BatteryParent ) && BatteryParent in file.players ){ + currentHeal = shieldRestoreAmount + healthRestoreAmount + currentHealScore = currentHeal / 100 + file.playerAwardStats[BatteryParent]["heals"] += currentHeal + player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, currentHealScore ) + file.players[ BatteryParent ].scoreThisRound += currentHealScore + } +} + +void function gameWonMedals() + void function FD_SetupEpilogue() { AddCallback_GameStateEnter( eGameState.Epilogue, FD_Epilogue ) @@ -1310,6 +1369,68 @@ void function FD_createHarvester() fd_harvester.harvester.Minimap_SetZOrder( MINIMAP_Z_OBJECT ) fd_harvester.harvester.Minimap_SetCustomState( eMinimapObject_prop_script.FD_HARVESTER ) AddEntityCallback_OnDamaged( fd_harvester.harvester, OnHarvesterDamaged ) + thread CreateHarvesterHintTrigger( fd_harvester.harvester ) +} + +void function CreateHarvesterHintTrigger( entity harvester ) +{ + entity trig = CreateEntity( "trigger_cylinder" ) + trig.SetRadius( 1000 ) //Test setting + trig.SetAboveHeight( 2500 ) //Test setting + trig.SetBelowHeight( 2500 ) //Test setting + trig.SetOrigin( harvester.GetOrigin() ) + trig.kv.triggerFilterNpc = "none" + trig.kv.triggerFilterPlayer = "all" + + SetTeam( trig, harvester.GetTeam() ) + DispatchSpawn( trig ) + trig.SetEnterCallback( OnEnterNearHarvesterTrigger ) + trig.SetLeaveCallback( OnLeaveNearHarvesterTrigger ) + + harvester.EndSignal( "OnDestroy" ) + trig.EndSignal( "OnDestroy" ) + + OnThreadEnd( + function() : ( trig ) + { + if ( IsValid( trig ) ) + trig.Destroy() + } + ) + + WaitForever() +} + +void function OnEnterNearHarvesterTrigger( entity trig, entity activator ) +{ + if( !( activator in file.players ) ) + return + + if( GetGlobalNetInt( "FD_waveState" ) != WAVE_STATE_IN_PROGRESS ) + return + + if ( activator != null && activator.IsPlayer() && activator.GetTeam() == trig.GetTeam() && file.players[activator].leaveHarvester == true ) + { + file.players[activator].lastNearHarvester = Time() + file.players[activator].leaveHarvester = false + } +} + +void function OnLeaveNearHarvesterTrigger( entity trig, entity activator ) +{ + if( !( activator in file.players ) ) + return + + if( GetGlobalNetInt( "FD_waveState" ) != WAVE_STATE_IN_PROGRESS ) + return + + float CurrentTime = Time() - file.players[activator].lastNearHarvester + + if ( activator != null && activator.IsPlayer() && activator.GetTeam() == trig.GetTeam() && file.players[activator].leaveHarvester == false ) + { + file.playerAwardStats[activator]["timeNearHarvester"] += CurrentTime + file.players[activator].leaveHarvester = true + } } bool function isFinalWave() @@ -1661,4 +1782,4 @@ string function FD_DropshipGetAnimation() return "dropship_coop_respawn_digsite" } return "dropship_coop_respawn" -} \ No newline at end of file +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut b/Northstar.CustomServers/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut index 9f05a0cd3..0984eaa8d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut @@ -27,6 +27,7 @@ global function Rodeo_PilotPicksUpBattery_Silent global function AddOnRodeoStartedCallback global function AddOnRodeoEndedCallback +global function AddBatteryHealCallback global function PilotBattery_SetMaxCount global function ThrowRiderOff @@ -89,6 +90,7 @@ struct { array onRodeoEndedCallbacks array onRodeoStartedCallbacks + array batteryHealCallbacks table antiRodeoPlayerData @@ -532,6 +534,12 @@ void function AddOnRodeoEndedCallback( void functionref(entity,entity) callbackF file.onRodeoEndedCallbacks.append( callbackFunc ) } +void function AddBatteryHealCallback( void functionref(entity,entity,int,int) callbackFunc ) +{ + Assert (!( file.batteryHealCallbacks.contains( callbackFunc ) )) + file.batteryHealCallbacks.append( callbackFunc ) +} + function PlayerBeginsTitanRodeo( entity player, RodeoPackageStruct rodeoPackage, entity rodeoTitan ) { entity soul = rodeoTitan.GetTitanSoul() @@ -1766,6 +1774,8 @@ void function Rodeo_ApplyBatteryToTitan( entity battery, entity titan ) int addHealth = int( healingAmount * frac ) int totalHealth = minint( titan.GetMaxHealth(), titan.GetHealth() + addHealth ) + if( titan.GetHealth() + addHealth > titan.GetMaxHealth() ) + addHealth = titan.GetMaxHealth() - titan.GetHealth() if ( soul.IsDoomed() && batteryIsAmped ) { UndoomTitan( titan, 1 ) @@ -1776,6 +1786,11 @@ void function Rodeo_ApplyBatteryToTitan( entity battery, entity titan ) titan.SetHealth( totalHealth ) soul.SetShieldHealth( soul.GetShieldHealthMax() ) } + + foreach ( callbackFunc in file.batteryHealCallbacks ) + { + callbackFunc( battery, titan, shieldDifference, addHealth ) + } } if ( battery != null ) @@ -2453,4 +2468,4 @@ bool function ClientCommand_TryNukeGrenade( entity player, array args ) return true } -#endif \ No newline at end of file +#endif From fb44295254028d9396dd5bb84dc1bdc40bd57179 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Fri, 30 Dec 2022 18:19:48 +0000 Subject: [PATCH 93/99] [FD] Fix compile errors (#558) * mimic changes in CustomServers into Custom * fix compile errors due to int -> float stuff * remove unimplmented function causing compile error --- .../mod/scripts/vscripts/rodeo/_rodeo_titan.gnut | 8 ++++++++ .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 10 ++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut b/Northstar.Custom/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut index ad433ae2e..1056be8b2 100644 --- a/Northstar.Custom/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/rodeo/_rodeo_titan.gnut @@ -27,6 +27,7 @@ global function Rodeo_PilotPicksUpBattery_Silent global function AddOnRodeoStartedCallback global function AddOnRodeoEndedCallback +global function AddBatteryHealCallback global function PilotBattery_SetMaxCount global function ThrowRiderOff @@ -89,6 +90,7 @@ struct { array onRodeoEndedCallbacks array onRodeoStartedCallbacks + array batteryHealCallbacks table antiRodeoPlayerData @@ -534,6 +536,12 @@ void function AddOnRodeoEndedCallback( void functionref(entity,entity) callbackF file.onRodeoEndedCallbacks.append( callbackFunc ) } +void function AddBatteryHealCallback( void functionref(entity,entity,int,int) callbackFunc ) +{ + Assert (!( file.batteryHealCallbacks.contains( callbackFunc ) )) + file.batteryHealCallbacks.append( callbackFunc ) +} + function PlayerBeginsTitanRodeo( entity player, RodeoPackageStruct rodeoPackage, entity rodeoTitan ) { entity soul = rodeoTitan.GetTitanSoul() diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 1e282f960..b032d2570 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -892,7 +892,7 @@ void function SetWaveStateReady() void function FD_StunLaserHealTeammate( entity player, entity target, int shieldRestoreAmount ) { if( IsValid( player ) && player in file.players ){ - file.playerAwardStats[player]["heals"] += shieldRestoreAmount + file.playerAwardStats[player]["heals"] += float(shieldRestoreAmount) player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 } @@ -901,7 +901,7 @@ void function FD_StunLaserHealTeammate( entity player, entity target, int shield void function FD_SmokeHealTeammate( entity player, entity target, int shieldRestoreAmount ) { if( IsValid( player ) && player in file.players ){ - file.playerAwardStats[player]["heals"] += shieldRestoreAmount + file.playerAwardStats[player]["heals"] += float(shieldRestoreAmount) player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 } @@ -927,14 +927,12 @@ void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRe if( IsValid( BatteryParent ) && BatteryParent in file.players ){ currentHeal = shieldRestoreAmount + healthRestoreAmount currentHealScore = currentHeal / 100 - file.playerAwardStats[BatteryParent]["heals"] += currentHeal - player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, currentHealScore ) + file.playerAwardStats[BatteryParent]["heals"] += float(currentHeal) + BatteryParent.AddToPlayerGameStat( PGS_DEFENSE_SCORE, currentHealScore ) file.players[ BatteryParent ].scoreThisRound += currentHealScore } } -void function gameWonMedals() - void function FD_SetupEpilogue() { AddCallback_GameStateEnter( eGameState.Epilogue, FD_Epilogue ) From 560c96d223711ac4f8a1eab7eb2a94531761ef0a Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Mon, 2 Jan 2023 21:40:22 +0800 Subject: [PATCH 94/99] [FD]Bug fix and new feature (#556) * Correction of variable type Correction of variable type * weapon type check idk why Respawn use weapon.GetWeaponType(),it doesn't work for actually anti-titan weapon.(Because they didn't have this key value) * fix wrong reaper icon fix wrong reaper icon * Show store in the minimap during buy time Show store in the minimap during buy time * ping store test ping store test --- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 13 ++++++++----- .../vscripts/gamemodes/_gamemode_fd_events.nut | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index b032d2570..77275b9f0 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -230,7 +230,7 @@ void function FD_GivePlayerInfiniteAntiTitanAmmo( entity player ) array weapons = player.GetMainWeapons() foreach ( entity weaponEnt in weapons ) { - if ( weaponEnt.GetWeaponType() != WT_ANTITITAN ) + if ( weaponEnt.GetWeaponInfoFileKeyField( "menu_category" ) != "at" ) continue if( !weaponEnt.HasMod( "at_unlimited_ammo" ) ) @@ -652,6 +652,9 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) { SetGlobalNetInt( "FD_waveState", WAVE_STATE_BREAK ) OpenBoostStores() + entity parentCrate = GetBoostStores()[0].GetParent() + parentCrate.Minimap_AlwaysShow( TEAM_MILITIA, null ) + Minimap_PingForTeam( TEAM_MILITIA, shopPosition, 150, 5, TEAM_COLOR_YOU / 255.0, 5 ) foreach( entity player in GetPlayerArray() ) Remote_CallFunction_NonReplay( player, "ServerCallback_FD_NotifyStoreOpen" ) while( Time() < GetGlobalNetTime( "FD_nextWaveStartTime" ) ) @@ -660,7 +663,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) SetGlobalNetTime( "FD_nextWaveStartTime", Time() ) WaitFrame() } - + parentCrate.Minimap_Hide( TEAM_MILITIA, null ) CloseBoostStores() MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_StoreClosing ) } @@ -892,7 +895,7 @@ void function SetWaveStateReady() void function FD_StunLaserHealTeammate( entity player, entity target, int shieldRestoreAmount ) { if( IsValid( player ) && player in file.players ){ - file.playerAwardStats[player]["heals"] += float(shieldRestoreAmount) + file.playerAwardStats[player]["heals"] += float( shieldRestoreAmount ) player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 } @@ -901,7 +904,7 @@ void function FD_StunLaserHealTeammate( entity player, entity target, int shield void function FD_SmokeHealTeammate( entity player, entity target, int shieldRestoreAmount ) { if( IsValid( player ) && player in file.players ){ - file.playerAwardStats[player]["heals"] += float(shieldRestoreAmount) + file.playerAwardStats[player]["heals"] += float( shieldRestoreAmount ) player.AddToPlayerGameStat( PGS_DEFENSE_SCORE, shieldRestoreAmount / 100 ) file.players[ player ].scoreThisRound += shieldRestoreAmount / 100 } @@ -927,7 +930,7 @@ void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRe if( IsValid( BatteryParent ) && BatteryParent in file.players ){ currentHeal = shieldRestoreAmount + healthRestoreAmount currentHealScore = currentHeal / 100 - file.playerAwardStats[BatteryParent]["heals"] += float(currentHeal) + file.playerAwardStats[BatteryParent]["heals"] += float( currentHeal ) BatteryParent.AddToPlayerGameStat( PGS_DEFENSE_SCORE, currentHealScore ) file.players[ BatteryParent ].scoreThisRound += currentHealScore } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index bf887ba8a..16260fd53 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -729,13 +729,13 @@ void function waitUntilLessThanAmountAliveEventWeighted( SmokeEvent smokeEvent, void function spawnSuperSpectre( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { PingMinimap( spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0 ) + wait 4.7 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 ) @@ -747,13 +747,13 @@ void function spawnSuperSpectre( SmokeEvent smokeEvent, SpawnEvent spawnEvent, F void function spawnSuperSpectreWithMinion( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { PingMinimap( spawnEvent.origin.x, spawnEvent.origin.y, 4, 600, 150, 0 ) + wait 4.7 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 ) From cad416bc967bc4b902ff5808c0ae3281402d4895 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sun, 8 Jan 2023 02:03:01 +0000 Subject: [PATCH 95/99] [FD] Allow players to change loadouts between waves (#461) * Added condition for FD next wave loadout changes * custom function setting for loadout change requests --- .../mod/scripts/vscripts/_loadouts_mp.gnut | 10 +++++++++- .../mod/scripts/vscripts/gamemodes/_gamemode_fd.nut | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_loadouts_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_loadouts_mp.gnut index 3e8ac9ea1..3161237c8 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_loadouts_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_loadouts_mp.gnut @@ -3,6 +3,7 @@ global function SvLoadoutsMP_Init global function SetLoadoutGracePeriodEnabled global function SetWeaponDropsEnabled +global function SetAllowLoadoutChangeFunc global function AddCallback_OnTryGetTitanLoadout global function GetTitanLoadoutForPlayer @@ -22,6 +23,8 @@ struct { array< TryGetTitanLoadoutCallbackType > onTryGetTitanLoadoutCallbacks array dirtyLoadouts + + bool functionref( entity ) allowChangeLoadoutFunc = null } file void function SvLoadoutsMP_Init() @@ -60,6 +63,11 @@ void function SetLoadoutGracePeriodEnabled( bool enabled ) file.loadoutGracePeriodEnabled = enabled } +void function SetAllowLoadoutChangeFunc( bool functionref( entity ) func ) +{ + file.allowChangeLoadoutFunc = func +} + void function SetWeaponDropsEnabled( bool enabled ) { file.weaponDropsEnabled = enabled @@ -302,7 +310,7 @@ void function TryGivePilotLoadoutForGracePeriod( entity player ) else respawnTimeReal = expect float( player.s.respawnTime ) - if ( ( ( Time() - respawnTimeReal <= CLASS_CHANGE_GRACE_PERIOD || GetGameState() < eGameState.Playing ) && file.loadoutGracePeriodEnabled ) || player.p.usingLoadoutCrate ) + if ( ( ( Time() - respawnTimeReal <= CLASS_CHANGE_GRACE_PERIOD || GetGameState() < eGameState.Playing ) && file.loadoutGracePeriodEnabled ) || player.p.usingLoadoutCrate || ( file.allowChangeLoadoutFunc != null && file.allowChangeLoadoutFunc( player ) ) ) { if ( !Loadouts_CanGivePilotLoadout( player ) && player.GetParent() != null && ( HasCinematicFlag( player, CE_FLAG_INTRO ) || HasCinematicFlag( player, CE_FLAG_CLASSIC_MP_SPAWNING ) || HasCinematicFlag( player, CE_FLAG_WAVE_SPAWNING ) ) ) thread GiveLoadoutWhenIntroOver( player ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 77275b9f0..e8bc0966a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -121,6 +121,7 @@ void function GamemodeFD_Init() Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) PlayerEarnMeter_SetEnabled( false ) SetShouldUsePickLoadoutScreen( true ) + SetAllowLoadoutChangeFunc( FD_ShouldAllowChangeLoadout ) SetGetDifficultyFunc( FD_GetDifficultyLevel ) TeamTitanSelectMenu_Init() // show the titan select menu in this mode @@ -167,6 +168,12 @@ void function GamemodeFD_Init() SetUsedCoreCallback( FD_UsedCoreCallback ) } +// this might need updating when we do dropship things +bool function FD_ShouldAllowChangeLoadout( entity player ) +{ + return GetGlobalNetTime( "FD_nextWaveStartTime" ) > Time() +} + void function FD_BoostPurchaseCallback( entity player, BoostStoreData data ) { file.playerAwardStats[player]["moneySpent"] += float( data.cost ) From 7ba6b053f093554df663d05ce06b9655186d1e08 Mon Sep 17 00:00:00 2001 From: RoyalBlue1 Date: Tue, 17 Jan 2023 03:13:20 +0100 Subject: [PATCH 96/99] Fix missing struct values from merge --- Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut index 4e381031a..da4e50f5c 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_harvester.gnut @@ -9,7 +9,9 @@ global struct HarvesterStruct { entity rings float lastDamage bool shieldBoost - + bool harvesterShieldDown + float harvesterDamageTaken + bool havesterWasDamaged } HarvesterStruct function SpawnHarvester( vector origin, vector angles, int health, int shieldHealth, int team ) From e8a2e28b59c398821dc0ffb802ec26c385ed5172 Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Wed, 25 Jan 2023 01:57:38 +0800 Subject: [PATCH 97/99] [FD]New features and bug fix (#566) * Correction of variable type Correction of variable type * weapon type check idk why Respawn use weapon.GetWeaponType(),it doesn't work for actually anti-titan weapon.(Because they didn't have this key value) * fix wrong reaper icon fix wrong reaper icon * Show store in the minimap during buy time Show store in the minimap during buy time * ping store test ping store test * Add missing event and correct error event Add missing event and correct error event * Add turret repair tip Add turret repair tip * Add wave restart event Add wave restart event * fix bug return when titan can get heal without battery. Example:Vanguard * Track entity deployed by player 1.Track entity deployed by player 2.Destroy player deployed entity this round after wave lost 3.Don't destroy those entities not deployed in this round * use untyped use untyped * update for #565 update for #565 --- .../mod/scripts/vscripts/ai/_ai_turret.gnut | 9 ++- .../vscripts/gamemodes/_gamemode_fd.nut | 74 ++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut index 5961d8399..90f0b4b2b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut @@ -43,6 +43,13 @@ void function RevivableTurret_DamageCallback( entity turret, var damageInfo ) function RevivableTurret_UseFunction( player , turret ) { entity tur = expect entity( turret ) + entity ent = expect entity( player ) + entity owner = tur.GetBossPlayer() + if( ent != owner ) + { + int ownerEHandle = owner.GetEncodedEHandle() + MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_TurretRepair, null, ent, ownerEHandle ) + } thread RevivableTurret_Revive( tur ) return true } @@ -68,4 +75,4 @@ void function RevivableTurret_Kill( entity turret ) 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 e8bc0966a..2ea75d0ad 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -1,3 +1,5 @@ +untyped + global function GamemodeFD_Init global function RateSpawnpoints_FD global function startHarvester @@ -22,6 +24,8 @@ enum eDropshipState{ struct player_struct_fd{ bool diedThisRound int scoreThisRound + int moneyThisRound + array< entity > deployedEntityThisRound /* int totalMVPs int mortarUnitsKilled @@ -67,6 +71,7 @@ struct { table > playerAwardStats entity harvester_info bool playersHaveTitans = false + bool waveRestart = false string animationOverride = "" int dropshipState @@ -324,6 +329,18 @@ void function GamemodeFD_InitPlayer( entity player ) } // unfortunate that i cant seem to find a nice callback for them exiting that menu but thisll have to do thread TryDisableTitanSelectionForPlayerAfterDelay( player, TEAM_TITAN_SELECT_DURATION_MIDGAME ) + thread TrackDeployedArcTrapThisRound( player ) +} + +void function TrackDeployedArcTrapThisRound( entity player ) +{ + player.EndSignal( "OnDestroy" ) + while( IsValid( player ) ) + { + entity ArcTrap = expect entity ( player.WaitSignal( "DeployArcTrap" ).projectile ) + file.players[ player ].deployedEntityThisRound.append( ArcTrap ) + AddEntityDestroyedCallback( ArcTrap, FD_OnEntityDestroyed ) + } } void function TryDisableTitanSelectionForPlayerAfterDelay( entity player, float waitAmount ) @@ -444,7 +461,7 @@ bool function useShieldBoost( entity player, array args ) { fd_harvester.harvester.SetShieldHealth( fd_harvester.harvester.GetShieldHealthMax() ) SetGlobalNetTime( "FD_harvesterInvulTime", Time() + 5 ) - MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_PlayerHealedHarvester, null, player ) + MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_PlayerBoostedHarvesterShield, null, player ) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) file.playerAwardStats[player]["harvesterHeals"]++ } @@ -467,6 +484,19 @@ void function mainGameLoop() bool showShop = false for( int i = GetGlobalNetInt( "FD_currentWave" ); i < waveEvents.len(); i++ ) { + if( file.waveRestart ) + { + showShop = true + foreach( entity player in GetPlayerArray() ) + { + SetMoneyForPlayer( player, file.players[player].moneyThisRound ) + player.SetPlayerNetInt( "numHarvesterShieldBoost", 0 ) + player.SetPlayerNetInt( "numSuperRodeoGrenades", 0 ) + PlayerInventory_TakeAllInventoryItems( player ) + } + SetGlobalNetTime( "FD_nextWaveStartTime", Time() + 75 ) + } + if( !runWave( i, showShop ) ) break @@ -648,6 +678,8 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) { file.players[player].diedThisRound = false file.players[player].scoreThisRound = 0 + file.players[player].moneyThisRound = GetPlayerMoney( player ) + file.players[ player ].deployedEntityThisRound = [] } array enemys = getHighestEnemyAmountsForWave( waveIndex ) @@ -655,6 +687,11 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) { 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( file.waveRestart ) + { + file.waveRestart = false + MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_WaveRestart ) + } if( shouldDoBuyTime ) { SetGlobalNetInt( "FD_waveState", WAVE_STATE_BREAK ) @@ -731,6 +768,8 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) FD_DecrementRestarts() else SetRoundBased(false) + + file.waveRestart = true //wave restart point SetWinner( TEAM_IMC )//restart round spawnedNPCs = [] // reset npcs count restetWaveEvents() @@ -919,6 +958,9 @@ void function FD_SmokeHealTeammate( entity player, entity target, int shieldRest void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRestoreAmount, int healthRestoreAmount ) { + if( !IsValid( battery ) ) + return + entity BatteryParent = battery.GetParent() entity TargetTitan int currentHeal @@ -1159,9 +1201,23 @@ void function OnHarvesterDamaged( entity harvester, var damageInfo ) void function FD_NPCCleanup() { + foreach( entity player in GetPlayerArray() ) + { + foreach ( entity ent in file.players[ player ].deployedEntityThisRound ) + { + if ( IsValid( ent ) ) + ent.Destroy() + } + } foreach ( entity npc in GetEntArrayByClass_Expensive( "C_AI_BaseNPC" ) ) + { + entity BossPlayer = npc.GetBossPlayer() + if( IsValidPlayer( BossPlayer ) && !file.players[ BossPlayer ].deployedEntityThisRound.contains( npc ) ) + continue + if ( IsValid( npc ) ) npc.Destroy() + } } void function HarvesterThink() @@ -1516,7 +1572,10 @@ void function CheckLastPlayerReady() bool function ClientCommandCallbackToggleReady( entity player, array args ) { if( args[0] == "true" ) + { player.SetPlayerNetBool( "FD_readyForNextWave", true ) + MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_PlayerReady, null, player ) + } if( args[0] == "false" ) player.SetPlayerNetBool( "FD_readyForNextWave", false ) @@ -1672,6 +1731,19 @@ void function AddTurretSentry( entity turret ) turret.Minimap_AlwaysShow( TEAM_MILITIA, null ) turret.Minimap_SetHeightTracking( true ) turret.Minimap_SetCustomState( eMinimapObject_npc.FD_TURRET ) + entity player = turret.GetBossPlayer() + file.players[ player ].deployedEntityThisRound.append( turret ) + AddEntityDestroyedCallback( turret, FD_OnEntityDestroyed ) +} + +function FD_OnEntityDestroyed( ent ) +{ + expect entity( ent ) + + Assert( ent.IsValidInternal() ) + entity player = IsTurret( ent ) ? ent.GetBossPlayer() : ent.GetOwner() + if( file.players[ player ].deployedEntityThisRound.contains( ent ) ) + file.players[ player ].deployedEntityThisRound.fastremovebyvalue( ent ) } void function DisableTitanSelection() From c8e4d7e79d679747a5f4b3440a72049985d9e7ab Mon Sep 17 00:00:00 2001 From: zxcPandora <81985226+zxcPandora@users.noreply.github.com> Date: Tue, 7 Feb 2023 07:13:36 +0800 Subject: [PATCH 98/99] [FD]New features and fix bug (#548) * Allow player pick up turret Allow player pick up turret * Register Signal Register Signal * Update for match vanilla Update for match vanilla * Update _ai_turret.gnut * bug fix valid player check * player score event player score event * Valid player check Valid player check * Update _gamemode_fd.nut * Update _gamemode_fd.nut * valid check * sniper titan enemy check sniper titan enemy check * Do a crash protect when wait delay * change harvester check way to vanilla * remove temporary fix * clear invalid turret * check the player during the animation * protect dropship from enemy ai before all player dropped --- .../vscripts/ai/_ai_sniper_titans.gnut | 1 + .../mod/scripts/vscripts/ai/_ai_turret.gnut | 59 +++++- .../vscripts/ai/_ai_turret_sentry.gnut | 6 +- .../vscripts/gamemodes/_gamemode_fd.nut | 172 ++++++++++++++++-- .../gamemodes/_gamemode_fd_events.nut | 16 +- .../vscripts/gamemodes/_gamemode_fd_nav.nut | 10 +- 6 files changed, 232 insertions(+), 32 deletions(-) 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 c09154f4e..b1ff4fa29 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_sniper_titans.gnut @@ -179,6 +179,7 @@ function SniperTitanAttack( entity titan, entity target ) return } ) + titan.SetEnemy( target ) } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut index 90f0b4b2b..08d76f7de 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret.gnut @@ -3,12 +3,14 @@ global function AiTurret_Init global function GetMegaTurretLinkedToPanel global function MegaTurretUsabilityFunc global function SetUsePromptForPanel +global function IsTurretActive +global function TurretRefundThink global function RevivableTurret_DamageCallback global function RevivableTurret_Revive void function AiTurret_Init() { - + RegisterSignal( "TurretOffline" ) } entity function GetMegaTurretLinkedToPanel( entity panel ) @@ -26,13 +28,63 @@ void function SetUsePromptForPanel( var panel, var turret ) } +bool function IsTurretActive( entity turret ) +{ + // ----- Turret State ----- // + // TURRET_SEARCHING , TURRET_INACTIVE , TURRET_ACTIVE , TURRET_DEPLOYING , TURRET_RETIRING , TURRET_DEAD // + + bool turretsActive = turret.GetTurretState() == TURRET_DEPLOYING + turretsActive = turretsActive || turret.GetTurretState() == TURRET_SEARCHING + turretsActive = turretsActive || turret.GetTurretState() == TURRET_ACTIVE + return turretsActive +} + +void function TurretRefundThink( entity turret ) +{ + turret.EndSignal( "OnDestroy" ) + turret.EndSignal( "OnDeath" ) + turret.EndSignal( "CancelRefund" ) + turret.EndSignal( "TurretOffline" ) + + while( turret.e.burnReward == "" || !IsTurretActive( turret ) ){ + WaitFrame() + } + turret.SetUsable() + turret.SetUsableByGroup( "owner pilot" ) + turret.SetUsePrompts( "#REFUND_HOLD_USE", "#REFUND_PRESS_USE" ) + + entity player = expect entity( turret.WaitSignal( "OnPlayerUse" ).player ) + + if ( turret.e.burnReward == "" ) + return + + BurnMeter_GiveRewardDirect( player, turret.e.burnReward ) + entity weapon = player.GetOffhandWeapon( OFFHAND_INVENTORY ) + + // Defensive: meaning the boost didn't make it to the inventory for some reason + if ( weapon == null ) + return + + weapon.w.savedKillCount = int( turret.kv.killCount ) + turret.DisableTurret() + turret.Signal( "StopTurretLaser" ) + weapon.e.fd_roundDeployed = turret.e.fd_roundDeployed + + EmitSoundAtPosition( TEAM_UNASSIGNED, turret.GetOrigin(), "Emplacement_Move_Dissolve" ) + turret.Signal( "BoostRefunded" ) + turret.UnsetUsable() + turret.SetInvulnerable() + turret.Dissolve( ENTITY_DISSOLVE_CORE, Vector( 0, 0, 0 ), 100 ) +} + void function RevivableTurret_DamageCallback( entity turret, var damageInfo ) { if( turret.GetHealth() <= DamageInfo_GetDamage( damageInfo ) ) { + turret.Signal( "TurretOffline" ) turret.SetHealth( 1 ) turret.SetUsable() - turret.SetUsableByGroup( "pilot" ) + turret.SetUsableByGroup( "friendlies pilot" ) turret.SetUsePrompts( "#TURRET_WAKEUP_HOLD_USE", "#TURRET_WAKEUP_PRESS_USE" ) turret.useFunction = RevivableTurret_UseFunction thread RevivableTurret_Kill( turret ) @@ -48,6 +100,7 @@ function RevivableTurret_UseFunction( player , turret ) if( ent != owner ) { int ownerEHandle = owner.GetEncodedEHandle() + AddPlayerScore( ent, "FDRepairTurret" ) MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_TurretRepair, null, ent, ownerEHandle ) } thread RevivableTurret_Revive( tur ) @@ -57,6 +110,7 @@ function RevivableTurret_UseFunction( player , turret ) void function RevivableTurret_Revive( entity turret ) { + turret.UnsetUsable() turret.SetHealth( turret.GetMaxHealth() ) turret.ClearInvulnerable() turret.Anim_ScriptedPlay( "deploy" ) @@ -64,6 +118,7 @@ void function RevivableTurret_Revive( entity turret ) turret.EnableTurret() turret.DisableNPCFlag( NPC_IGNORE_ALL ) turret.SetNoTarget( false ) + thread TurretRefundThink( turret ) } void function RevivableTurret_Kill( entity turret ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret_sentry.gnut b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret_sentry.gnut index e34b30826..5d0cff0a2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret_sentry.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/ai/_ai_turret_sentry.gnut @@ -8,13 +8,14 @@ const SENTRY_TURRET_AIM_FX_BLUE = $"P_wpn_lasercannon_aim_short_blue" void function AiTurretSentry_Init() { PrecacheParticleSystem( DEAD_SENTRY_TURRET_FX ) - //PrecacheParticleSystem( SENTRY_TURRET_AIM_FX_RED ) - //PrecacheParticleSystem( SENTRY_TURRET_AIM_FX_BLUE ) + PrecacheParticleSystem( SENTRY_TURRET_AIM_FX_RED ) + PrecacheParticleSystem( SENTRY_TURRET_AIM_FX_BLUE ) //PrecacheParticleSystem( SENTRY_TURRET_AIM_FX2 ) AddSpawnCallback( "npc_turret_sentry", LightTurretSpawnFunction ) AddDeathCallback( "npc_turret_sentry", LightTurretDeathFX ) + RegisterSignal( "StopTurretLaser" ) //RegisterSignal( "TurretDisabled" ) //RegisterSignal( "HandleTargetDeath" ) //RegisterSignal( "OnPlayerDisconnectResetTurret" ) @@ -55,6 +56,7 @@ void function LightTurretSpawnFunction( entity turret ) void function SentryTurretAimLaser( entity turret ) { + EndSignal( turret, "StopTurretLaser" ) entity fx1 = PlayLoopFXOnEntity( SENTRY_TURRET_AIM_FX_RED, turret, "camera_glow", null, null, ENTITY_VISIBLE_TO_ENEMY ) entity fx2 = PlayLoopFXOnEntity( SENTRY_TURRET_AIM_FX_BLUE, turret, "camera_glow", null, null, ENTITY_VISIBLE_TO_FRIENDLY ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut index 2ea75d0ad..a730eb907 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut @@ -3,6 +3,7 @@ untyped global function GamemodeFD_Init global function RateSpawnpoints_FD global function startHarvester +global function IsHarvesterAlive global function GetTargetNameForID global function DisableTitanSelection @@ -136,6 +137,7 @@ void function GamemodeFD_Init() AddCallback_GameStateEnter( eGameState.Playing, startMainGameLoop ) AddCallback_OnRoundEndCleanup( FD_NPCCleanup ) AddCallback_OnClientConnected( GamemodeFD_InitPlayer ) + AddCallback_OnClientDisconnected( OnPlayerDisconnectedOrDestroyed ) AddCallback_OnPlayerGetsNewPilotLoadout( FD_OnPlayerGetsNewPilotLoadout ) ClassicMP_SetEpilogue( FD_SetupEpilogue ) @@ -171,6 +173,13 @@ void function GamemodeFD_Init() AddBatteryHealCallback( FD_BatteryHealTeammate ) AddSmokeHealCallback( FD_SmokeHealTeammate ) SetUsedCoreCallback( FD_UsedCoreCallback ) + + //todo:are pointValueOverride exist? + //Score Event + AddArcTrapTriggeredCallback( FD_OnArcTrapTriggered ) + AddArcWaveDamageCallback( FD_OnArcWaveDamage ) + AddOnTetherCallback( FD_OnTetherTrapTriggered ) + AddSonarStartCallback( FD_OnSonarStart ) } // this might need updating when we do dropship things @@ -335,6 +344,17 @@ void function GamemodeFD_InitPlayer( entity player ) void function TrackDeployedArcTrapThisRound( entity player ) { player.EndSignal( "OnDestroy" ) + + OnThreadEnd( + function() : ( player ) + { + if ( IsValid( player ) ) + OnPlayerDisconnectedOrDestroyed( player ) + else + ClearInValidTurret() + } + ) + while( IsValid( player ) ) { entity ArcTrap = expect entity ( player.WaitSignal( "DeployArcTrap" ).projectile ) @@ -345,6 +365,18 @@ void function TrackDeployedArcTrapThisRound( entity player ) void function TryDisableTitanSelectionForPlayerAfterDelay( entity player, float waitAmount ) { + player.EndSignal( "OnDestroy" )//Do a crash protect when wait delay + + OnThreadEnd( + function() : ( player ) + { + if( IsValid( player ) ) + { + DisableTitanSelectionForPlayer( player ) + } + } + ) + wait waitAmount if ( file.playersHaveTitans ) DisableTitanSelectionForPlayer( player ) @@ -372,9 +404,9 @@ void function OnTickDeath( entity victim, var damageInfo ) void function OnNpcDeath( entity victim, entity attacker, var damageInfo ) { - if( attacker.GetClassName() == "npc_turret_sentry" ) + if( attacker.GetClassName() == "npc_turret_sentry" && IsValidPlayer( attacker.GetBossPlayer() ) ) { - file.playerAwardStats[attacker.GetBossPlayer()]["turretKills"]++ + file.playerAwardStats[ attacker.GetBossPlayer() ]["turretKills"]++ } if( victim.IsTitan() && attacker in file.players ) file.playerAwardStats[attacker]["titanKills"]++ @@ -461,6 +493,7 @@ bool function useShieldBoost( entity player, array args ) { fd_harvester.harvester.SetShieldHealth( fd_harvester.harvester.GetShieldHealthMax() ) SetGlobalNetTime( "FD_harvesterInvulTime", Time() + 5 ) + AddPlayerScore( player, "FDShieldHarvester" ) MessageToTeam( TEAM_MILITIA,eEventNotifications.FD_PlayerBoostedHarvesterShield, null, player ) player.SetPlayerNetInt( "numHarvesterShieldBoost", player.GetPlayerNetInt( "numHarvesterShieldBoost" ) - 1 ) file.playerAwardStats[player]["harvesterHeals"]++ @@ -679,7 +712,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) file.players[player].diedThisRound = false file.players[player].scoreThisRound = 0 file.players[player].moneyThisRound = GetPlayerMoney( player ) - file.players[ player ].deployedEntityThisRound = [] + file.players[ player ].deployedEntityThisRound.clear() } array enemys = getHighestEnemyAmountsForWave( waveIndex ) @@ -728,7 +761,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) thread SetWaveStateReady() executeWave() SetGlobalNetInt( "FD_waveState", WAVE_STATE_COMPLETE ) - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) { float totalDamage = 0.0 array highestDamage = [ 0.0, 0.0, 0.0 ] @@ -785,7 +818,7 @@ bool function runWave( int waveIndex, bool shouldDoBuyTime ) SetGlobalNetBool( "FD_waveActive", false ) MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_AnnounceWaveEnd ) - if ( isFinalWave() && IsAlive( fd_harvester.harvester ) ) + if ( isFinalWave() && IsHarvesterAlive( fd_harvester.harvester ) ) { //Game won code MessageToTeam( TEAM_MILITIA, eEventNotifications.FD_AnnounceWaveEnd ) @@ -977,6 +1010,7 @@ void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRe return if( IsValid( BatteryParent ) && BatteryParent in file.players ){ + AddPlayerScore( BatteryParent, "FDTeamHeal" ) currentHeal = shieldRestoreAmount + healthRestoreAmount currentHealScore = currentHeal / 100 file.playerAwardStats[BatteryParent]["heals"] += float( currentHeal ) @@ -985,6 +1019,42 @@ void function FD_BatteryHealTeammate( entity battery, entity titan, int shieldRe } } +void function FD_OnArcTrapTriggered( entity victim, var damageInfo ) +{ + entity owner = DamageInfo_GetAttacker( damageInfo ) + + if( !IsValidPlayer( owner ) ) + return + + AddPlayerScore( owner, "FDArcTrapTriggered" ) +} + +void function FD_OnArcWaveDamage( entity ent, var damageInfo ) +{ + entity attacker = DamageInfo_GetAttacker( damageInfo ) + + if( !IsValidPlayer( attacker ) ) + return + + AddPlayerScore( attacker, "FDArcWave" ) +} + +void function FD_OnTetherTrapTriggered( entity owner, entity endEnt ) +{ + if( !IsValidPlayer( owner ) ) + return + + AddPlayerScore( owner, "FDTetherTriggered" ) +} + +void function FD_OnSonarStart( entity ent, vector position, int sonarTeam, entity sonarOwner ) +{ + if( !IsValidPlayer( sonarOwner ) ) + return + + AddPlayerScore( sonarOwner, "FDSonarPulse" )//should only triggered once during sonar time? +} + void function FD_SetupEpilogue() { AddCallback_GameStateEnter( eGameState.Epilogue, FD_Epilogue ) @@ -1049,6 +1119,9 @@ void function FD_Epilogue_threaded() foreach( entity player in GetPlayerArray() ) { + if( !IsValid( player ) ) + continue + int i = 0 myIndex = player.GetPlayerIndex() @@ -1059,10 +1132,16 @@ void function FD_Epilogue_threaded() foreach( entity medalPlayer, string ref in awardResults ) { + if( !IsValid( medalPlayer ) ) + continue + if( i == numPlayers ) - break; + break int targetIndex = medalPlayer.GetPlayerIndex() + if( targetIndex >= 4 ) + continue + string name = medalPlayer.GetPlayerName() string xuid = medalPlayer.GetUID() int awardId = GetFDStatData( ref ).index @@ -1184,7 +1263,9 @@ void function OnHarvesterDamaged( entity harvester, var damageInfo ) if( newHealth <= 0 ) { EmitSoundAtPosition( TEAM_UNASSIGNED, fd_harvester.harvester.GetOrigin(), "coop_generator_destroyed" ) - newHealth = 0 + newHealth = 1 + harvester.SetInvulnerable() + DamageInfo_SetDamage( damageInfo, 0.0 ) PlayFactionDialogueToTeam( "fd_baseDeath", TEAM_MILITIA ) fd_harvester.rings.Anim_Stop() } @@ -1218,6 +1299,8 @@ void function FD_NPCCleanup() if ( IsValid( npc ) ) npc.Destroy() } + if( IsValid( fd_harvester.harvester ) ) + fd_harvester.harvester.Destroy()//Destroy harvester after match over } void function HarvesterThink() @@ -1237,7 +1320,7 @@ void function HarvesterThink() bool isRegening = false // stops the regenning sound to keep stacking on top of each other - while ( IsAlive( harvester ) ) + while ( IsHarvesterAlive( harvester ) ) { float currentTime = Time() float deltaTime = currentTime -lastTime @@ -1317,7 +1400,7 @@ void function startHarvester() void function HarvesterAlarm() { - while( IsAlive( fd_harvester.harvester ) ) + while( IsHarvesterAlive( fd_harvester.harvester ) ) { if( fd_harvester.harvester.GetShieldHealth() == 0 ) { @@ -1436,6 +1519,18 @@ void function FD_createHarvester() thread CreateHarvesterHintTrigger( fd_harvester.harvester ) } +bool function IsHarvesterAlive( entity harvester ) +{ + if ( harvester == null ) + return false + if ( !harvester.IsValidInternal() ) + return false + if( !harvester.IsEntAlive() ) + return false + + return harvester.GetHealth() > 1 +} + void function CreateHarvesterHintTrigger( entity harvester ) { entity trig = CreateEntity( "trigger_cylinder" ) @@ -1734,6 +1829,7 @@ void function AddTurretSentry( entity turret ) entity player = turret.GetBossPlayer() file.players[ player ].deployedEntityThisRound.append( turret ) AddEntityDestroyedCallback( turret, FD_OnEntityDestroyed ) + thread TurretRefundThink( turret ) } function FD_OnEntityDestroyed( ent ) @@ -1742,10 +1838,41 @@ function FD_OnEntityDestroyed( ent ) Assert( ent.IsValidInternal() ) entity player = IsTurret( ent ) ? ent.GetBossPlayer() : ent.GetOwner() + + if( !IsValid( player ) ) + return + if( file.players[ player ].deployedEntityThisRound.contains( ent ) ) file.players[ player ].deployedEntityThisRound.fastremovebyvalue( ent ) } +void function OnPlayerDisconnectedOrDestroyed( entity player ) +{ + if( !IsValid( player ) ) + { + ClearInValidTurret() + return + } + + foreach ( entity npc in GetEntArrayByClass_Expensive( "C_AI_BaseNPC" ) ) + { + entity BossPlayer = npc.GetBossPlayer() + if ( IsValidPlayer( BossPlayer ) && IsValid( npc ) && player == BossPlayer ) + npc.Destroy() + } + file.players[ player ].deployedEntityThisRound.clear() +} + +void function ClearInValidTurret() +{ + foreach( entity turret in GetNPCArrayByClass( "npc_turret_sentry" ) ) + { + entity BossPlayer = turret.GetBossPlayer() + if ( !IsValidPlayer( BossPlayer ) && IsValid( turret ) ) + turret.Destroy() + } +} + void function DisableTitanSelection() { foreach ( entity player in GetPlayerArray() ) @@ -1764,7 +1891,11 @@ void function EnableTitanSelection() void function EnableTitanSelectionForPlayer( entity player ) { - int enumCount = PersistenceGetEnumCount( "titanClasses" ) + int enumCount = PersistenceGetEnumCount( "titanClasses" ) + + if( !IsValid( player ) ) + return + for ( int i = 0; i < enumCount; i++ ) { string enumName = PersistenceGetEnumItemNameForIndex( "titanClasses", i ) @@ -1776,7 +1907,11 @@ void function EnableTitanSelectionForPlayer( entity player ) void function DisableTitanSelectionForPlayer( entity player ) { - int enumCount = PersistenceGetEnumCount( "titanClasses" ) + int enumCount = PersistenceGetEnumCount( "titanClasses" ) + + if( !IsValid( player ) ) + return + for ( int i = 0; i < enumCount; i++ ) { string enumName = PersistenceGetEnumItemNameForIndex( "titanClasses", i ) @@ -1801,6 +1936,8 @@ void function FD_DropshipSpawnDropship() DispatchSpawn( file.dropship ) file.dropship.SetModel( $"models/vehicle/crow_dropship/crow_dropship_hero.mdl" ) + file.dropship.SetInvulnerable() + file.dropship.SetNoTarget( true ) thread PlayAnim(file.dropship, FD_DropshipGetAnimation()) @@ -1830,10 +1967,15 @@ void function FD_DropshipDropPlayer(entity player,int playerDropshipIndex) jumpSequence.viewConeFunction = ViewConeFree thread FirstPersonSequence( jumpSequence, player, file.dropship ) - WaittillAnimDone( player ) - player.ClearParent() - ClearPlayerAnimViewEntity( player ) - player.ClearInvulnerable() + + //check the player + if( IsValid( player ) ) + { + WaittillAnimDone( player ) + player.ClearParent() + ClearPlayerAnimViewEntity( player ) + player.ClearInvulnerable() + } } void function FD_DropshipSetAnimationOverride(string animation) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut index 16260fd53..e73b73c54 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_events.nut @@ -89,7 +89,7 @@ void function executeWave() { print( "executeWave Start" ) thread runEvents( 0 ) - while( IsAlive( fd_harvester.harvester ) && ( !allEventsExecuted( GetGlobalNetInt( "FD_currentWave" ) ) ) ) + while( IsHarvesterAlive( fd_harvester.harvester ) && ( !allEventsExecuted( GetGlobalNetInt( "FD_currentWave" ) ) ) ) WaitFrame() wait 5 //incase droppod is last event so all npc are spawned waitUntilLessThanAmountAlive( 0 ) @@ -122,7 +122,7 @@ void function runEvents( int firstExecuteIndex ) print( "not on this call" ) return } - if( !IsAlive(fd_harvester.harvester ) ) + if( !IsHarvesterAlive(fd_harvester.harvester ) ) { print( "harvesterDead" ) return @@ -654,7 +654,7 @@ void function spawnDrones( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowCon void function waitForDeathOfEntitys( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - while( IsAlive( fd_harvester.harvester ) ) + while( IsHarvesterAlive( fd_harvester.harvester ) ) { bool anyoneAlive = false foreach( string key in flowControlEvent.waitGlobalDataKey ) @@ -671,7 +671,7 @@ void function waitForDeathOfEntitys( SmokeEvent smokeEvent, SpawnEvent spawnEven void function waitForLessThanAliveTyped( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowControlEvent flowControlEvent, SoundEvent soundEvent ) { - while( IsAlive( fd_harvester.harvester ) ) + while( IsHarvesterAlive( fd_harvester.harvester ) ) { int amount foreach( entity npc in spawnedNPCs ) @@ -711,7 +711,7 @@ void function waitForTime( SmokeEvent smokeEvent, SpawnEvent spawnEvent, FlowCon float waitUntil = Time() + flowControlEvent.waitTime while( Time() < waitUntil ) { - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return WaitFrame() } @@ -1219,7 +1219,7 @@ void function waitUntilLessThanAmountAlive( int amount ) } aliveNPCs = spawnedNPCs.len() - deduct - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return } } @@ -1268,7 +1268,7 @@ void function waitUntilLessThanAmountAliveWeighted( int amount, int humanWeight else aliveNPCsWeighted += humanWeight } - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return } } @@ -1313,7 +1313,7 @@ void function waitUntilLessThanAmountAlive_expensive( int amount ) } } aliveTitans = GetNPCArray().len() - deduct - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return } } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut index cf7827f7c..1948ac6bb 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd_nav.nut @@ -30,7 +30,7 @@ void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0 int skippedNodes = 0 foreach(entity node in routeArray) { - if(!IsAlive(fd_harvester.harvester)) + if(!IsHarvesterAlive(fd_harvester.harvester)) return if(skippedNodes < nodesToSkip) { @@ -78,7 +78,7 @@ void function singleNav_thread( entity npc, string routeName, int nodesToSkip= 0 while ( targetNode != null ) { - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return npc.AssaultPoint( targetNode.GetOrigin() ) npc.AssaultSetGoalRadius( nextDistance ) @@ -104,7 +104,7 @@ void function SquadNav_Thread( array npcs, string routeName, int nodesTo int nodeIndex = 0 foreach(entity node in routeArray) { - if(!IsAlive(fd_harvester.harvester)) + if(!IsHarvesterAlive(fd_harvester.harvester)) return if(nodeIndex++ < nodesToSkip) continue @@ -144,7 +144,7 @@ void function SquadNav_Thread( array npcs, string routeName, int nodesTo while ( targetNode != null ) { - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return SquadAssaultOrigin( npcs, targetNode.GetOrigin(), nextDistance ) @@ -199,7 +199,7 @@ void function droneNav_thread( entity npc, string routeName,int nodesToSkip= 0,f while ( targetNode != null ) { - if( !IsAlive( fd_harvester.harvester ) ) + if( !IsHarvesterAlive( fd_harvester.harvester ) ) return npc.AssaultPoint( targetNode.GetOrigin() + <0, 0, 300> ) npc.AssaultSetGoalRadius( nextDistance ) From dd457ef265f440bbcb4ff6f07bfc76ea1661d40b Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Sun, 19 Feb 2023 16:05:36 +0000 Subject: [PATCH 99/99] [FD] Properly initialise mp_thaw.nut (#592) make map init function global --- .../mod/scripts/vscripts/mp/levels/mp_thaw.nut | 2 ++ 1 file changed, 2 insertions(+) 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 3441fc607..e6eb493d2 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/levels/mp_thaw.nut @@ -1,3 +1,5 @@ +global function CodeCallback_MapInit + void function CodeCallback_MapInit() { // Load Frontier Defense Data