aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut')
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut845
1 files changed, 106 insertions, 739 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
index 7ace0591..f26cdf6e 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_fd.nut
@@ -1,79 +1,34 @@
global function GamemodeFD_Init
global function RateSpawnpoints_FD
global function startHarvester
-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 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 function GetTargetNameForID
-global struct SoundEvent{
- string soundEventName
-}
-global struct WaveEvent{
- void functionref(SmokeEvent,SpawnEvent,WaitEvent,SoundEvent) eventFunction
- bool shouldThread
- SmokeEvent smokeEvent
- SpawnEvent spawnEvent
- WaitEvent waitEvent
- SoundEvent soundEvent
-}
struct player_struct_fd{
bool diedThisRound
- float scoreThisRound
+ int scoreThisRound
int totalMVPs
- int mortarUnitsKilled //not implemented yet
+ int mortarUnitsKilled
int moneySpend
int coresUsed
float longestTitanLife //not implemented yet
int turretsRepaired //not implemented yet
int moneyShared
float timeNearHarvester //dont know how to track
- float longestLife //not implemented yet
+ float longestLife
int heals //dont know what to track
- int titanKills //not implemented yet
+ int titanKills
float damageDealt
int harvesterHeals
+ float lastRespawn
}
global HarvesterStruct& fd_harvester
global vector shopPosition
-global array<array<WaveEvent> > waveEvents
global table<string,array<vector> > routes
-
+global array<entity> routeNodes
+global array<entity> spawnedNPCs
@@ -81,12 +36,10 @@ global table<string,array<vector> > routes
struct {
array<entity> aiSpawnpoints
array<entity> smokePoints
- array<entity> routeNodes
array<float> harvesterDamageSource
bool havesterWasDamaged
bool harvesterShieldDown
float harvesterDamageTaken
- array<entity> spawnedNPCs
table<entity,player_struct_fd> 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<entity> 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<int, bool> alreadyAssisted
foreach( DamageHistoryStruct attackerInfo in victim.e.recentDamageHistory )
{
@@ -315,33 +282,7 @@ void function mainGameLoop()
}
-array<entity> function getRoute(string routeName)
-{
- array<entity> ret
- array<entity> 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<int> 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<string,entity> 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<entity> routeArray = getRoute(routeName)
- WaitFrame()//so other code setting up what happens on signals is run before this
- if(routeArray.len()==0)
- {
-
- npc.Signal("OnFailedToPath")
- return
- }
- int 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<entity> 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<entity> routeArray = getRoute(routeName)
- WaitFrame()//so other code setting up what happens on signals is run before this
- if(routeArray.len()==0)
- return
-
- int nodeIndex = 0
- foreach(entity node in routeArray)
- {
- if(!IsAlive(fd_harvester.harvester))
- return
- if(nodeIndex++ < 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()<waitUntil)
- {
- if(!IsAlive(fd_harvester.harvester))
- break
- WaitFrame()
+string function GetAiNetIdFromTargetName(string targetName)
+{
+ switch ( targetName )
+ {
+ case "titan":
+ case "sniperTitan":
+ case "npc_titan_ogre_meteor_boss_fd":
+ case "npc_titan_ogre_meteor":
+ case "npc_titan_ogre_minigun_boss_fd":
+ case "npc_titan_ogre_minigun":
+ case "npc_titan_atlas_stickybomb_boss_fd":
+ case "npc_titan_atlas_stickybomb":
+ case "npc_titan_atlas_tracker_boss_fd":
+ case "npc_titan_atlas_tracker":
+ case "npc_titan_stryder_leadwall_boss_fd":
+ case "npc_titan_stryder_leadwall":
+ case "npc_titan_stryder_sniper_boss_fd":
+ case "npc_titan_stryder_sniper":
+ case "npc_titan_sniper":
+ case "npc_titan_sniper_tone":
+ case "npc_titan_atlas_vanguard_boss_fd":
+ case "npc_titan_atlas_vanguard":
+ return "FD_AICount_Titan"
+ case "empTitan":
+ case "npc_titan_arc":
+ return "FD_AICount_Titan_Arc"
+ case "mortarTitan":
+ case "npc_titan_mortar":
+ return "FD_AICount_Titan_Mortar"
+ case "nukeTitan":
+ case "npc_titan_nuke":
+ return "FD_AICount_Titan_Nuke"
+ case "npc_soldier":
+ case "grunt":
+ return "FD_AICount_Grunt"
+ case "spectre":
+ return "FD_AICount_Spectre"
+ case "mortar_spectre":
+ return "FD_AICount_Spectre_Mortar"
+ case "npc_stalker":
+ case "stalker":
+ return "FD_AICount_Stalker"
+ case "npc_super_spectre":
+ case "reaper":
+ return "FD_AICount_Reaper"
+ case "npc_drone":
+ case "drone":
+ return "FD_AICount_Drone"
+ case "cloakedDrone":
+ return "FD_AICount_Drone_Cloak"
+ case "tick":
+ return "FD_AICount_Ticks"
}
+ printt("unknown target name ",targetName)
+ return ""
}
-void function waitUntilLessThanAmountAliveEvent(SmokeEvent smokeEvent,SpawnEvent spawnEvent,WaitEvent waitEvent,SoundEvent soundEvent)
-{
- 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_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))
-
-}
-
-void function spawnDroppodGrunts(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<entity> 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<entity> 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<entity> 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<entity> 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<entity> 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)
{