aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-06-22 14:30:49 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-06-22 14:30:49 +0100
commit207facbc402f5639cbcd31f079214351ef605cf2 (patch)
tree4710b2a88dd64f3dfea1609d31a5de9141640951 /Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut
parentc2d438568df6d98cf731807e30eaa7da31e5ea52 (diff)
downloadNorthstarMods-207facbc402f5639cbcd31f079214351ef605cf2.tar.gz
NorthstarMods-207facbc402f5639cbcd31f079214351ef605cf2.zip
initial commit after moving to new repo
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut')
-rw-r--r--Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut131
1 files changed, 131 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut b/Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut
new file mode 100644
index 000000000..214aff96e
--- /dev/null
+++ b/Northstar.CustomServers/scripts/vscripts/ai/_ai_spectre.gnut
@@ -0,0 +1,131 @@
+global function AiSpectre_Init
+global function NPCCarriesBattery
+
+void function AiSpectre_Init()
+{
+ //AddDamageCallback( "npc_spectre", SpectreOnDamaged )
+ AddDeathCallback( "npc_spectre", SpectreOnDeath )
+ //AddSpawnCallback( "npc_spectre", SpectreOnSpawned )
+
+ #if !SPECTRE_CHATTER_MP_ENABLED
+ AddCallback_OnPlayerKilled( SpectreChatter_OnPlayerKilled )
+ AddCallback_OnNPCKilled( SpectreChatter_OnNPCKilled )
+ #endif
+}
+
+void function SpectreOnSpawned( entity npc )
+{
+
+}
+
+void function SpectreOnDeath( entity npc, var damageInfo )
+{
+ if ( !IsValidHeadShot( damageInfo, npc ) )
+ return
+
+ // Set these so cl_player knows to kill the eye glow and play the right SFX
+ DamageInfo_AddCustomDamageType( damageInfo, DF_HEADSHOT )
+ DamageInfo_AddCustomDamageType( damageInfo, DF_KILLSHOT )
+// EmitSoundOnEntityExceptToPlayer( npc, attacker, "SuicideSpectre.BulletImpact_HeadShot_3P_vs_3P" )
+
+ int bodyGroupIndex = npc.FindBodyGroup( "removableHead" )
+ int stateIndex = 1 // 0 = show, 1 = hide
+ npc.SetBodygroup( bodyGroupIndex, stateIndex )
+
+ DamageInfo_SetDamage( damageInfo, npc.GetMaxHealth() )
+
+}
+
+// All damage to spectres comes here for modification and then either branches out to other npc types (Suicide, etc) for custom stuff or it just continues like normal.
+void function SpectreOnDamaged( entity npc, var damageInfo )
+{
+
+}
+
+void function SpectreChatter_OnPlayerKilled( entity playerKilled, entity attacker, var damageInfo )
+{
+ if ( !IsSpectre( attacker ) )
+ return
+
+ if ( playerKilled.IsTitan() )
+ thread PlaySpectreChatterAfterDelay( attacker, "spectre_gs_gruntkillstitan_02_1" )
+ else
+ thread PlaySpectreChatterAfterDelay( attacker, "spectre_gs_killenemypilot_01_1" )
+
+}
+
+void function SpectreChatter_OnNPCKilled( entity npcKilled, entity attacker, var damageInfo )
+{
+ if ( IsSpectre( npcKilled ) )
+ {
+ string deadGuySquadName = expect string( npcKilled.kv.squadname )
+ if ( deadGuySquadName == "" )
+ return
+
+ array<entity> squad = GetNPCArrayBySquad( deadGuySquadName )
+
+ entity speakingSquadMate = null
+
+ foreach( squadMate in squad )
+ {
+ if ( IsSpectre( squadMate ) )
+ {
+ speakingSquadMate = squadMate
+ break
+ }
+ }
+ if ( speakingSquadMate == null )
+ return
+
+ if ( squad.len() == 1 )
+ thread PlaySpectreChatterAfterDelay( speakingSquadMate, "spectre_gs_squaddeplete_01_1" )
+ else if ( squad.len() > 0 )
+ thread PlaySpectreChatterAfterDelay( speakingSquadMate, "spectre_gs_allygrundown_05_1" )
+ }
+ else
+ {
+ if ( !IsSpectre( attacker ) )
+ return
+
+ if ( npcKilled.IsTitan() )
+ thread PlaySpectreChatterAfterDelay( attacker, "spectre_gs_gruntkillstitan_02_1" )
+ }
+}
+
+void function PlaySpectreChatterAfterDelay( entity spectre, string chatterLine, float delay = 0.3 )
+{
+ wait delay
+
+ if ( !IsAlive( spectre ) ) //Really this is just an optimization thing, if the spectre is dead no point in running the same check for every player nearby in ShouldPlaySpectreChatterMPLine
+ return
+
+ PlaySpectreChatterToAll( chatterLine, spectre )
+}
+
+void function NPCCarriesBattery( entity npc )
+{
+ entity battery = Rodeo_CreateBatteryPack()
+ battery.SetParent( npc, "BATTERY_ATTACH" )
+ battery.MarkAsNonMovingAttachment()
+ thread SpectreBatteryThink( npc, battery )
+}
+
+void function SpectreBatteryThink( entity npc, entity battery )
+{
+ battery.EndSignal( "OnDestroy" )
+ npc.EndSignal( "OnDestroy" )
+
+ OnThreadEnd(
+ function() : ( battery )
+ {
+ if ( IsValid( battery ) )
+ {
+ battery.ClearParent()
+ battery.SetAngles( < 0,0,0 > )
+ battery.SetVelocity( < 0,0,200 > )
+ }
+ }
+ )
+
+ npc.WaitSignal( "OnDeath" )
+} \ No newline at end of file