aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut')
-rw-r--r--Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut141
1 files changed, 141 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut b/Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut
new file mode 100644
index 000000000..fc8b7d1ee
--- /dev/null
+++ b/Northstar.CustomServers/scripts/vscripts/ai/_ai_marvins.gnut
@@ -0,0 +1,141 @@
+untyped
+
+global function AiMarvins_Init
+
+
+function AiMarvins_Init()
+{
+ FlagInit( "Disable_Marvins" )
+ FlagSet( "Disable_Marvins" )
+
+ level.livingMarvins <- {}
+ AddSpawnCallback( "npc_marvin", LivingMarvinSpawned )
+
+ AddCallback_EntitiesDidLoad( EntitiesDidLoad )
+}
+
+void function EntitiesDidLoad()
+{
+ if ( IsAutoPopulateEnabled() == false )
+ return
+
+ FlagEnd( "disable_npcs" )
+
+ array<entity> marvin_spawners = GetEntArrayByClass_Expensive( "info_spawnpoint_marvin" )
+
+ if ( !marvin_spawners.len() )
+ return
+
+ for ( ;; )
+ {
+ wait 3
+
+ if ( !Flag( "Disable_Marvins" ) )
+ {
+ if ( TotalLivingMarvins() < 5 )
+ {
+ SpawnRandomMarvin( marvin_spawners )
+ }
+ }
+ }
+}
+
+void function LivingMarvinSpawned( entity self )
+{
+ level.livingMarvins[ self ] <- self
+}
+
+function TotalLivingMarvins()
+{
+ local count = 0
+ foreach ( entity marvin in clone level.livingMarvins )
+ {
+ if ( IsAlive( marvin ) )
+ {
+ count++
+ continue
+ }
+
+ // cleanup dead marvins
+ delete level.livingMarvins[ marvin ]
+ }
+ return count
+}
+
+entity function SpawnRandomMarvin( array<entity> marvin_spawners )
+{
+ marvin_spawners.randomize()
+ entity spawnpoint = marvin_spawners[0] // if no valid spawn is found use this one
+ for ( int i = 0; i < marvin_spawners.len(); i++ )
+ {
+ if ( IsMarvinSpawnpointValid( marvin_spawners[ i ] ) )
+ {
+ spawnpoint = marvin_spawners[ i ]
+ break
+ }
+ }
+
+ entity marvin = SpawnAmbientMarvin( spawnpoint )
+ return marvin
+}
+
+bool function IsMarvinSpawnpointValid( entity spawnpoint )
+{
+ // ensure spawnpoint is not occupied (i.e. would spawn inside another player or object )
+ if ( spawnpoint.IsOccupied() )
+ return false
+
+ bool visible = spawnpoint.IsVisibleToEnemies( TEAM_IMC ) || spawnpoint.IsVisibleToEnemies( TEAM_MILITIA )
+ if ( visible )
+ return false
+
+ return true
+}
+
+entity function SpawnAmbientMarvin( entity spawnpoint )
+{
+ entity npc_marvin = CreateEntity( "npc_marvin" )
+ SetTargetName( npc_marvin, UniqueString( "mp_random_marvin") )
+ npc_marvin.SetOrigin( spawnpoint.GetOrigin() )
+ npc_marvin.SetAngles( spawnpoint.GetAngles() )
+ //npc_marvin.kv.rendercolor = "255 255 255"
+ npc_marvin.kv.health = -1
+ npc_marvin.kv.max_health = -1
+ npc_marvin.kv.spawnflags = 516 // Fall to ground, Fade Corpse
+ //npc_marvin.kv.FieldOfView = 0.5
+ //npc_marvin.kv.FieldOfViewAlert = 0.2
+ npc_marvin.kv.AccuracyMultiplier = 1.0
+ npc_marvin.kv.physdamagescale = 1.0
+ npc_marvin.kv.WeaponProficiency = eWeaponProficiency.GOOD
+
+ Marvin_SetModels( npc_marvin, spawnpoint )
+
+ DispatchSpawn( npc_marvin )
+
+ SetTeam( npc_marvin, TEAM_UNASSIGNED )
+
+ return npc_marvin
+}
+
+function Marvin_SetModels( entity npc_marvin, entity spawnpoint )
+{
+ //default
+ npc_marvin.s.bodytype <- MARVIN_TYPE_WORKER
+
+ // set body and head based on KVP
+ if ( spawnpoint.HasKey( "bodytype" ) )
+ {
+ local bodytype = spawnpoint.GetValueForKey( "bodytype" ).tointeger()
+
+ Assert( bodytype >= MARVIN_TYPE_SHOOTER && bodytype <= MARVIN_TYPE_FIREFIGHTER, "Specified invalid body type index " + bodytype + " for info_spawnpoint_marvin " + spawnpoint + ", Use values from 0-2 instead." )
+
+ npc_marvin.s.bodytype = bodytype
+ }
+
+
+ if ( spawnpoint.HasKey( "headtype" ) )
+ {
+ local headtype = spawnpoint.GetValueForKey( "headtype" )
+ npc_marvin.kv.body = headtype
+ }
+}