aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut')
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut93
1 files changed, 93 insertions, 0 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut
new file mode 100644
index 00000000..03b9fcfc
--- /dev/null
+++ b/Northstar.CustomServers/mod/scripts/vscripts/_powerup.gnut
@@ -0,0 +1,93 @@
+untyped
+global function PowerUps_Init
+
+struct {
+ array<entity> powerupSpawns
+} file
+
+void function PowerUps_Init()
+{
+ SH_PowerUp_Init()
+
+ AddSpawnCallbackEditorClass( "script_ref", "script_power_up_other", AddPowerupSpawn )
+ AddCallback_OnTouchHealthKit( "item_powerup", OnPowerupCollected )
+ AddCallback_GameStateEnter( eGameState.Prematch, RespawnPowerups )
+}
+
+void function AddPowerupSpawn( entity spawnpoint )
+{
+ file.powerupSpawns.append( spawnpoint )
+}
+
+void function RespawnPowerups()
+{
+ foreach ( entity spawnpoint in file.powerupSpawns )
+ {
+ PowerUp powerupDef = GetPowerUpFromItemRef( expect string( spawnpoint.kv.powerUpType ) )
+ thread PowerupSpawnerThink( spawnpoint, powerupDef )
+ }
+}
+
+void function PowerupSpawnerThink( entity spawnpoint, PowerUp powerupDef )
+{
+ svGlobal.levelEnt.EndSignal( "CleanUpEntitiesForRoundEnd" )
+
+ entity base = CreatePropDynamic( powerupDef.baseModel, spawnpoint.GetOrigin(), spawnpoint.GetAngles(), 2 )
+ OnThreadEnd( function() : ( base )
+ {
+ base.Destroy()
+ })
+
+ while ( true )
+ {
+ if ( !powerupDef.spawnFunc() )
+ return
+
+ entity powerup = CreateEntity( "item_powerup" )
+
+ powerup.SetOrigin( base.GetOrigin() + powerupDef.modelOffset )
+ powerup.SetAngles( base.GetAngles() + powerupDef.modelAngles )
+ powerup.SetValueForModelKey( powerupDef.model )
+
+ DispatchSpawn( powerup )
+
+ // unless i'm doing something really dumb, this all has to be done after dispatchspawn to get the powerup to not have gravity
+ powerup.StopPhysics()
+ powerup.SetOrigin( base.GetOrigin() + powerupDef.modelOffset )
+ powerup.SetAngles( base.GetAngles() + powerupDef.modelAngles )
+
+ powerup.SetModel( powerupDef.model )
+ powerup.s.powerupRef <- powerupDef.itemRef
+
+ PickupGlow glow = CreatePickupGlow( powerup, powerupDef.glowColor.x.tointeger(), powerupDef.glowColor.y.tointeger(), powerupDef.glowColor.z.tointeger() )
+ glow.glowFX.SetOrigin( spawnpoint.GetOrigin() ) // want the glow to be parented to the powerup, but have the position of the spawnpoint
+
+ OnThreadEnd( function() : ( powerup )
+ {
+ if ( IsValid( powerup ) )
+ powerup.Destroy()
+ })
+
+ powerup.WaitSignal( "OnDestroy" )
+ wait powerupDef.respawnDelay
+ }
+}
+
+bool function OnPowerupCollected( entity player, entity healthpack )
+{
+ PowerUp powerup = GetPowerUpFromItemRef( expect string( healthpack.s.powerupRef ) )
+
+ if ( player.IsTitan() == powerup.titanPickup )
+ {
+ // hack because i couldn't figure out any other way to do this without modifying sh_powerup
+ // ensure we don't kill the powerup if it's a battery the player can't pickup
+ if ( ( powerup.index == ePowerUps.titanTimeReduction || powerup.index == ePowerUps.LTS_TitanTimeReduction ) && ( player.IsTitan() || PlayerHasMaxBatteryCount( player ) ) )
+ return false
+
+ // idk why the powerup.destroyFunc doesn't just return a bool? would mean they could just handle stuff like this in powerup code
+ powerup.destroyFunc( player )
+ return true // destroys the powerup
+ }
+
+ return false // keeps powerup alive
+} \ No newline at end of file