aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut')
-rw-r--r--Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut343
1 files changed, 343 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut b/Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut
new file mode 100644
index 00000000..db616173
--- /dev/null
+++ b/Northstar.CustomServers/scripts/vscripts/_dogfighter.gnut
@@ -0,0 +1,343 @@
+untyped
+
+global function Dogfighter_Init
+
+global function CreateDogFighterAttack
+global function LaunchRandomDogFighterAttacks
+global function CreateDogFighter
+global function CreateDogFighterAssist
+global function GetGunshipModel
+const TURRET_WEAPON_BULLETS = "mp_weapon_yh803_bullet"
+
+function Dogfighter_Init()
+{
+
+ AddDeathCallback( "npc_dropship", OnDogFighterDeath )
+
+ RegisterSignal( "new_attack_thread" )
+ RegisterSignal( "GunshipForceLeave" )
+}
+
+function LaunchRandomDogFighterAttacks( int team )
+{
+ svGlobal.levelEnt.Signal( "new_attack_thread" )
+ svGlobal.levelEnt.EndSignal( "new_attack_thread" )
+
+ for ( ;; )
+ {
+ thread CreateDogFighterAttack( team )
+ wait RandomFloatRange( 3, 9 )
+ }
+}
+
+function CreateDogFighterAttack( int team )
+{
+ FlightPath flightPath = GetAnalysisForModel( GetFlightPathModel( "fp_straton_model" ), STRATON_ATTACK_FULL )
+
+ CallinData drop
+ InitCallinData( drop )
+ SetCallinStyle( drop, eDropStyle.RANDOM_FROM_YAW )
+ SetCallinYaw( drop, RandomFloat( 360 ) )
+
+
+ SpawnPointFP spawnPoint = GetSpawnPointForStyle( flightPath, drop )
+ if ( !spawnPoint.valid )
+ return
+
+ entity ship = CreateDogFighter( Vector(0,0,0), Vector(0,0,0), team )
+
+ int hornet_health = 2000
+ ship.SetHealth( hornet_health )
+ ship.SetMaxHealth( hornet_health )
+
+ ship.EndSignal( "OnDeath" )
+
+ //AddBulletTurrets( ship, team )
+
+ waitthread PlayAnimTeleport( ship, "st_AngelCity_IMC_Win_ComeIn", spawnPoint.origin, spawnPoint.angles )
+
+ thread PlayAnim( ship, "st_AngelCity_IMC_Win_Idle", spawnPoint.origin, spawnPoint.angles )
+ waitthread DogFighterWaitsUntilLeave( ship )
+
+ waitthread PlayAnim( ship, "st_AngelCity_IMC_Win_Leave", spawnPoint.origin, spawnPoint.angles, 0.5 )
+
+ ship.Kill_Deprecated_UseDestroyInstead()
+}
+
+
+function DogFighterWaitsUntilLeave( ship, idleMin = 10, idleMax = 15 )
+{
+ local duration = ship.GetSequenceDuration( "st_AngelCity_IMC_Win_Idle" )
+
+ // make it play full increments of the idle anim
+ local maxHealth = ship.GetMaxHealth().tofloat()
+ local idleTime = RandomFloatRange( idleMin, idleMax )
+ local reps = ( duration / idleTime ).tointeger()
+ local totalTime = reps * duration
+ local endTime = Time() + totalTime
+
+ for ( ;; )
+ {
+ if ( ship.GetHealth().tofloat() / maxHealth < 0.2 )
+ return
+ if ( Time() >= endTime )
+ return
+ wait 0.1
+ }
+}
+
+entity function CreateDogFighter( vector origin, vector angles, int team )
+{
+ entity hornet
+ if ( GetBugReproNum() == 81765 )
+ {
+ hornet = CreateEntity( "npc_dropship" )
+ }
+ else
+ {
+ // HACK: using a prop script for now since NPC dropships are still buggy
+ // Jiesang told me to do it!
+ hornet = CreatePropScript( GetGunshipModel( team ), origin, angles, 8 )
+ hornet.EnableAttackableByAI( 50, 0, AI_AP_FLAG_NONE )
+ SetTeam( hornet, team )
+ hornet.SetOrigin( origin )
+ hornet.SetAngles( angles )
+ }
+
+ hornet.s.dogfighter <- true
+ hornet.kv.teamnumber = team
+
+ local title
+ switch ( team )
+ {
+ case TEAM_MILITIA:
+ hornet.SetModel( GetFlightPathModel( "fp_hornet_model" ) )
+ title = "Militia Hornet"
+ break
+
+ case TEAM_IMC:
+ hornet.SetModel( GetFlightPathModel( "fp_straton_model" ) )
+ title = "IMC Phantom"
+ break
+ }
+
+ hornet.SetTitle( title )
+
+ hornet.SetOrigin( origin )
+ hornet.SetAngles( angles )
+ // DispatchSpawn( hornet )
+
+ //hornet.EnableRenderAlways()
+ //hornet.SetAimAssistAllowed( false )
+
+ return hornet
+}
+
+void function OnDogFighterDeath( entity ent, var damageInfo )
+{
+ if ( !IsValid( ent ) )
+ return
+
+ if ( !( "dogfighter" in ent.s ) )
+ return
+
+ if ( ent.GetHealth() <= 0 )
+ FighterExplodes( ent )
+}
+
+
+
+
+function AddRocketTurrets( entity ship, int team, int prof = eWeaponProficiency.VERYGOOD )
+{
+ entity turret = AddTurret( ship, team, "mp_weapon_yh803", "l_exhaust_front_1" )
+ turret.kv.WeaponProficiency = prof
+ turret.NotSolid()
+ turret.Show()
+ entity weapon = turret.GetActiveWeapon()
+ weapon.Show()
+
+ turret = AddTurret( ship, team, "mp_weapon_yh803", "r_exhaust_front_1" )
+ turret.kv.WeaponProficiency = prof
+ turret.NotSolid()
+ turret.Show()
+ weapon = turret.GetActiveWeapon()
+ weapon.Show()
+}
+
+void function AddBulletTurrets( entity ship, int team, int prof = eWeaponProficiency.VERYGOOD )
+{
+ entity turret = AddTurret( ship, team, TURRET_WEAPON_BULLETS, "l_exhaust_front_1" )
+ turret.kv.WeaponProficiency = prof
+ turret.NotSolid()
+ turret = AddTurret( ship, team, TURRET_WEAPON_BULLETS, "r_exhaust_front_1" )
+ turret.kv.WeaponProficiency = prof
+ turret.NotSolid()
+}
+
+asset function GetGunshipModel( int team )
+{
+ switch ( team )
+ {
+ case TEAM_MILITIA:
+ return GetFlightPathModel( "fp_hornet_model" )
+
+ case TEAM_IMC:
+ return GetFlightPathModel( "fp_straton_model" )
+ }
+
+ unreachable
+}
+
+void function CreateDogFighterAssist( int team, vector origin, vector angles, float duration = 10.0, entity ship = null, float dropHeight = 1500 )
+{
+ angles += <0,90,0>
+
+ angles = < 0, angles.y%360, 0 >
+
+ // DebugDrawSphere( origin, 256, 255, 0, 0, true, 10.0 )
+
+ // warp in effect before
+ Point start = GetWarpinPosition( GetFighterModelForTeam( team ), "st_AngelCity_IMC_Win_ComeIn_fast", origin, angles )
+
+ if ( !IsValid( ship ) )
+ {
+ ship = CreateDogFighter( start.origin, start.angles, team )
+ }
+ else
+ {
+ ship.SetOrigin( start.origin )
+ ship.SetAngles( start.angles )
+ }
+
+ waitthread __WarpInEffectShared( start.origin, start.angles, "", 0.0 )
+
+
+ ship.SetHealth( 10000 )
+ ship.SetMaxHealth( 10000 )
+ ship.EndSignal( "OnDeath" )
+
+ #if R1_VGUI_MINIMAP
+ ship.Minimap_SetDefaultMaterial( GetMinimapMaterial( "VIP_friendly" ) )
+ ship.Minimap_SetFriendlyMaterial( GetMinimapMaterial( "VIP_friendly" ) )
+ ship.Minimap_SetEnemyMaterial( GetMinimapMaterial( "VIP_enemy" ) )
+ ship.Minimap_SetBossPlayerMaterial( GetMinimapMaterial( "VIP_friendly" ) )
+ #endif
+ ship.Minimap_SetObjectScale( 0.11 )
+ ship.Minimap_SetZOrder( MINIMAP_Z_NPC )
+
+ entity mover = CreateScriptMover( origin, angles )
+
+ OnThreadEnd(
+ function () : ( ship, mover )
+ {
+ if ( IsValid( mover ) )
+ mover.Destroy()
+ if ( IsValid( ship ) )
+ ship.Destroy()
+ }
+ )
+
+ float SHIP_SIZE = 530
+ vector SHIP_MIN = Vector( -SHIP_SIZE/2, -SHIP_SIZE/2, -250 )
+ vector SHIP_MAX = Vector( SHIP_SIZE/2, SHIP_SIZE/2, 100 )
+
+ entity turret
+
+ turret = CreateEntity( "npc_turret_sentry" )
+ SetSpawnOption_AISettings( turret, "npc_turret_sentry_rockets_dropship" )
+ SetSpawnOption_Weapon( turret, "mp_turretweapon_blaster" )
+ SetSpawnOption_Alert( turret )
+ SetTeam( turret, team )
+ DispatchSpawn( turret )
+ turret.SetInvulnerable()
+ turret.SetParent( ship, "r_turret_attach", false, 0.0 )
+ turret.SetTitle( ship.GetTitle() )
+ NPC_NoTarget( turret )
+
+ turret = CreateEntity( "npc_turret_sentry" )
+ SetSpawnOption_AISettings( turret, "npc_turret_sentry_rockets_dropship" )
+ SetSpawnOption_Weapon( turret, "mp_turretweapon_blaster" )
+ SetSpawnOption_Alert( turret )
+ SetTeam( turret, team )
+ DispatchSpawn( turret )
+ turret.SetInvulnerable()
+ turret.SetParent( ship, "l_turret_attach", false, 0.0 )
+ turret.SetTitle( ship.GetTitle() )
+ NPC_NoTarget( turret )
+
+ // DrawArrow( origin, angles, 10, 50 )
+
+ waitthread PlayAnimTeleport( ship, "st_AngelCity_IMC_Win_ComeIn_fast", origin, angles )
+
+ // -------------------------------------------------
+ // now we want to drop the ship close to the ground
+ // -------------------------------------------------
+
+ vector shipOrigin = ship.GetOrigin()
+ vector newOrigin = shipOrigin
+
+ if ( dropHeight > 0 )
+ {
+ // TRACE to find the floor
+ float traceFrac = TraceLineSimple( shipOrigin, shipOrigin - Vector(0,0,dropHeight), ship )
+ vector floorPos = shipOrigin - Vector(0,0,dropHeight * traceFrac)
+ floorPos += Vector( 0,0,400 ) //we don't want the ship to land!
+
+ // TRACE to see if anything is in the way
+ float result = TraceHullSimple( shipOrigin, floorPos, SHIP_MIN, SHIP_MAX, ship )
+ vector offset = ( shipOrigin - floorPos ) * result
+
+ // This is where we will move the spawnpoint
+ newOrigin = origin - offset
+ }
+
+ // float duration = ship.GetSequenceDuration( "st_AngelCity_IMC_Win_Idle" )
+
+ ship.SetParent( mover, "REF" )
+ ship.Anim_EnableUseAnimatedRefAttachmentInsteadOfRootMotion()
+
+ // Ship comes in...
+ thread PlayAnim( ship, "st_AngelCity_IMC_Win_Idle", mover, "REF" )
+
+ // Ship goes down...
+ float dropDuration = 5.0
+ if ( dropHeight > 0 )
+ {
+ mover.NonPhysicsMoveTo( newOrigin, dropDuration, dropDuration*0.4, dropDuration*0.4 )
+ wait dropDuration
+ }
+
+ // Ship hangs out for a while...
+ waitthread GunshipWaitLeave( ship, duration )
+
+ // Ship raises before it leaves...
+ if ( dropHeight > 0 )
+ {
+ mover.NonPhysicsMoveTo( origin, dropDuration, dropDuration*0.4, dropDuration*0.4 )
+ wait dropDuration
+ }
+ ship.ClearParent()
+
+ // Ship leaves...
+ waitthread PlayAnim( ship, "st_AngelCity_IMC_Win_Leave", origin, angles, 0.5 )
+}
+
+void function GunshipWaitLeave( entity ship, float duration )
+{
+ ship.EndSignal( "GunshipForceLeave" )
+ wait duration
+}
+
+asset function GetFighterModelForTeam( int team )
+{
+ switch ( team )
+ {
+ case TEAM_MILITIA:
+ return GetFlightPathModel( "fp_hornet_model" )
+
+ case TEAM_IMC:
+ return GetFlightPathModel( "fp_straton_model" )
+ }
+ unreachable
+} \ No newline at end of file