diff options
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/_powerup.gnut')
-rw-r--r-- | Northstar.CustomServers/scripts/vscripts/_powerup.gnut | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/_powerup.gnut b/Northstar.CustomServers/scripts/vscripts/_powerup.gnut new file mode 100644 index 00000000..40984d0d --- /dev/null +++ b/Northstar.CustomServers/scripts/vscripts/_powerup.gnut @@ -0,0 +1,102 @@ +untyped +global function PowerUps_Init + +void function PowerUps_Init() +{ + SH_PowerUp_Init() + + AddCallback_EntitiesDidLoad( EntitesDidLoad ) +} + +void function EntitesDidLoad() +{ + array<entity> scriptRefs = GetEntArrayByClass_Expensive( "script_ref" ) + foreach ( entity ref in scriptRefs ) + if ( ref.HasKey( "powerUpType" ) ) + { + PowerUp powerup = GetPowerUpFromItemRef( expect string( ref.kv.powerUpType ) ) + + // CreatePickup is defined in mp/_pickups.gnut + // mp/_pickups.gnut is a sp-only script + // it's literally in the mp folder + // respawn PLEASE + //CreatePickup( ref, powerup.model, bool function( entity player ) { powerup.destroyFunc( player ); return true } ) + + if ( powerup.spawnFunc() ) + { + CreatePropDynamic( powerup.baseModel, ref.GetOrigin(), ref.GetAngles(), 2 ) + thread PowerUpThink( ref, powerup ) + } + } + + AddCallback_OnTouchHealthKit( "item_powerup", OnPowerUpCollected ) +} + +entity function CreatePowerUp( entity spawnpoint, PowerUp powerup ) +{ + entity powerupEnt = CreateEntity( "item_powerup" ) + + powerupEnt.SetValueForModelKey( powerup.model ) + powerupEnt.kv.fadedist = 10000 + powerupEnt.kv.gravity = 0.000001 // really hacky, but gravity 0.0 is considered the same as 1.0, and i'm not sure how to enable/disable gravity on entities in script + + DispatchSpawn( powerupEnt ) + + powerupEnt.SetModel( powerup.model ) + powerupEnt.SetOrigin( spawnpoint.GetOrigin() + powerup.modelOffset ) + powerupEnt.SetAngles( spawnpoint.GetAngles() + powerup.modelAngles ) + + powerupEnt.s.powerUpType <- powerup.itemRef + + return powerupEnt +} + +void function PowerUpThink( entity spawnpoint, PowerUp powerup ) +{ + svGlobal.levelEnt.EndSignal( "RoundEnd" ) // should reset on round end + + entity powerupEnt + + while ( true ) + { + powerupEnt = CreatePowerUp( spawnpoint, powerup ) + + OnThreadEnd( function() : ( powerupEnt, spawnpoint, powerup ) + { + // should be called on round end + print( "resetting powerup..." ) + if ( IsValid( powerupEnt ) ) + powerupEnt.Destroy() + + // recursively spawn new powerup + thread PowerUpThink( spawnpoint, powerup ) + } + ) + + // handle the glow here so we can destroy it + PickupGlow glow = CreatePickupGlow( powerupEnt, powerup.glowColor.x.tointeger(), powerup.glowColor.y.tointeger(), powerup.glowColor.z.tointeger() ) + glow.glowFX.SetOrigin( spawnpoint.GetOrigin() ) // want the glow to be parented to the powerup, but have the position of the spawnpoint + + powerupEnt.WaitSignal( "OnDestroy" ) + + wait powerup.respawnDelay + } +} + +bool function OnPowerUpCollected( entity player, entity healthpack ) +{ + PowerUp powerup = GetPowerUpFromItemRef( expect string( healthpack.s.powerUpType ) ) + + 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 ) && PlayerHasBattery( player ) ) + return false + + powerup.destroyFunc( player ) + return true // destroys the powerup + } + + return false // keeps powerup alive +}
\ No newline at end of file |