aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut
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/mp/_loadout_crate.nut
parentc2d438568df6d98cf731807e30eaa7da31e5ea52 (diff)
downloadNorthstarMods-207facbc402f5639cbcd31f079214351ef605cf2.tar.gz
NorthstarMods-207facbc402f5639cbcd31f079214351ef605cf2.zip
initial commit after moving to new repo
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut')
-rw-r--r--Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut183
1 files changed, 183 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut b/Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut
new file mode 100644
index 000000000..d987c774c
--- /dev/null
+++ b/Northstar.CustomServers/scripts/vscripts/mp/_loadout_crate.nut
@@ -0,0 +1,183 @@
+untyped
+
+global function LoadoutCrate_Init
+
+const LOADOUT_CRATE_MODEL = $"models/containers/pelican_case_ammobox.mdl"
+global function AddLoadoutCrate
+global function DestroyAllLoadoutCrates
+
+function LoadoutCrate_Init()
+{
+ level.loadoutCrateManagedEntArrayID <- CreateScriptManagedEntArray()
+ PrecacheModel( LOADOUT_CRATE_MODEL )
+
+ AddSpawnCallback( "prop_dynamic", LoadoutCreatePrePlaced )
+}
+
+function AddLoadoutCrate( team, vector origin, vector angles, bool showOnMinimap = true, entity crate = null )
+{
+ expect int( team )
+
+ local crateCount = GetScriptManagedEntArray( level.loadoutCrateManagedEntArrayID ).len()
+ Assert( crateCount < MAX_LOADOUT_CRATE_COUNT, "Can't have more than " + MAX_LOADOUT_CRATE_COUNT + " Loadout Crates" )
+
+ angles += Vector( 0, -90, 0 )
+
+ if ( !IsValid( crate ) )
+ {
+ crate = CreatePropScript( LOADOUT_CRATE_MODEL, origin, angles, 6 )
+ SetTargetName( crate, "loadoutCrate" )
+ }
+
+ SetTeam( crate, team )
+ crate.SetUsable()
+ if ( team == TEAM_MILITIA || team == TEAM_IMC )
+ crate.SetUsableByGroup( "friendlies pilot" )
+ else
+ crate.SetUsableByGroup( "pilot" )
+
+ crate.SetUsePrompts( "#LOADOUT_CRATE_HOLD_USE", "#LOADOUT_CRATE_PRESS_USE" )
+ crate.SetForceVisibleInPhaseShift( true )
+
+ if ( showOnMinimap )
+ {
+ #if R1_VGUI_MINIMAP
+ crate.Minimap_SetDefaultMaterial( $"vgui/hud/coop/coop_ammo_locker_icon" )
+ #endif
+ crate.Minimap_SetObjectScale( MINIMAP_LOADOUT_CRATE_SCALE )
+ crate.Minimap_SetAlignUpright( true )
+ crate.Minimap_AlwaysShow( TEAM_IMC, null )
+ crate.Minimap_AlwaysShow( TEAM_MILITIA, null )
+ crate.Minimap_SetHeightTracking( true )
+ crate.Minimap_SetZOrder( MINIMAP_Z_OBJECT )
+ crate.Minimap_SetCustomState( eMinimapObject_prop_script.FD_LOADOUT_CHEST )
+ }
+
+ AddToScriptManagedEntArray( level.loadoutCrateManagedEntArrayID, crate )
+
+ //thread LoadoutCrateMarkerThink( "LoadoutCrateMarker" + string( crateCount ), crate )
+ thread LoadoutCrateThink( crate )
+ thread LoadoutCrateRestockAmmoThink( crate )
+
+ Highlight_SetNeutralHighlight( crate, "interact_object_los" )
+}
+
+void function LoadoutCreatePrePlaced( entity ent )
+{
+ if ( ent.GetTargetName().find( "loot_crate" ) == 0 )
+ {
+ ent.Destroy()
+ return
+ }
+
+ if ( ent.GetTargetName().find( "loadout_crate" ) != 0 )
+ return
+
+ if ( IsSingleplayer() )
+ return
+
+ vector angles = ent.GetAngles() + Vector( 0, 90, 0 )
+ AddLoadoutCrate( TEAM_BOTH, ent.GetOrigin(), angles, false, ent )
+}
+
+function LoadoutCrateMarkerThink( marker, crate )
+{
+ crate.EndSignal( "OnDestroy" )
+ crate.EndSignal( "OnDeath" )
+
+ OnThreadEnd(
+ function() : ( marker )
+ {
+ ClearMarker( marker )
+ }
+ )
+
+ while ( 1 )
+ {
+ if ( GetGameState() <= eGameState.Prematch )
+ ClearMarker( marker )
+ else
+ SetMarker( marker, crate )
+
+ svGlobal.levelEnt.WaitSignal( "GameStateChanged" )
+ }
+}
+
+function LoadoutCrateThink( crate )
+{
+ crate.EndSignal( "OnDestroy" )
+ while ( true )
+ {
+ var player = crate.WaitSignal( "OnPlayerUse" ).player
+
+ if ( player.IsPlayer() )
+ {
+ thread UsingLoadoutCrate( crate, player )
+ wait 1 // debounce on using the crate to minimize the risk of using it twice before the menu opens.
+ }
+ }
+}
+
+function LoadoutCrateRestockAmmoThink( crate )
+{
+ crate.EndSignal( "OnDestroy" )
+ local distSqr
+ local crateOrigin = crate.GetOrigin()
+ local triggerDistSqr = 96 * 96
+ local resetDistSqr = 384 * 384
+
+ while ( true )
+ {
+ wait 1 // check every second
+ array<entity> playerArray = GetPlayerArray_Alive()
+ foreach( player in playerArray )
+ {
+ if ( player.IsTitan() )
+ continue
+
+ if ( player.ContextAction_IsBusy() )
+ continue
+
+ distSqr = DistanceSqr( crateOrigin, player.GetOrigin() )
+ if ( distSqr <= triggerDistSqr && player.s.restockAmmoTime < Time() )
+ {
+ if ( TraceLineSimple( player.EyePosition(), crate.GetOrigin() + Vector( 0.0, 0.0, 24.0 ), crate ) == 1.0 )
+ {
+ player.s.restockAmmoCrate = crate
+ player.s.restockAmmoTime = Time() + 10 // debounce time before you can get new ammo again if you stay next to the crate.
+ //MessageToPlayer( player, eEventNotifications.CoopAmmoRefilled, null, null )
+ RestockPlayerAmmo( player )
+ }
+ }
+
+ if ( distSqr > resetDistSqr && player.s.restockAmmoTime > 0 && player.s.restockAmmoCrate == crate )
+ {
+ player.s.restockAmmoCrate = null
+ player.s.restockAmmoTime = 0
+ }
+ }
+ }
+}
+
+function UsingLoadoutCrate( crate, player )
+{
+ expect entity( player )
+
+ player.p.usingLoadoutCrate = true
+ player.s.usedLoadoutCrate = true
+ EmitSoundOnEntityOnlyToPlayer( player, player, "Coop_AmmoBox_Open" )
+ Remote_CallFunction_UI( player, "ServerCallback_OpenPilotLoadoutMenu" )
+}
+
+// should be called if we enter an epilogue ... maybe?
+function DestroyAllLoadoutCrates()
+{
+ local crateArray = GetScriptManagedEntArray( level.loadoutCrateManagedEntArrayID )
+ foreach( crate in crateArray )
+ crate.Destroy()
+
+ //dissolve didn't work
+ //Dissolve( ENTITY_DISSOLVE_CHAR, Vector( 0, 0, 0 ), 0 )
+ //ENTITY_DISSOLVE_CORE
+ //ENTITY_DISSOLVE_NORMAL
+} \ No newline at end of file