aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
commit9a96d0bff56f1969c68bb52a2f33296095bdc67d (patch)
tree4175928e488632705692e3cccafa1a38dd854615 /Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut
parent27bd240871b7c0f2f49fef137718b2e3c208e3b4 (diff)
downloadNorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.tar.gz
NorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.zip
move to new mod format
Diffstat (limited to 'Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut')
-rw-r--r--Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut195
1 files changed, 195 insertions, 0 deletions
diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut
new file mode 100644
index 000000000..b59cd2dd4
--- /dev/null
+++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fastball.gnut
@@ -0,0 +1,195 @@
+untyped
+global function GamemodeFastball_Init
+
+struct {
+ // first panel is a, second is b, third is c
+ array<Point> panelSpawns
+} file
+
+void function GamemodeFastball_Init()
+{
+ // used for intro
+ PrecacheModel( $"models/titans/buddy/titan_buddy.mdl" )
+ PrecacheParticleSystem( $"P_BT_eye_SM" )
+
+ // used for respawn
+ PrecacheParticleSystem( $"P_pod_screen_lasers_OUT" )
+
+ SetShouldUseRoundWinningKillReplay( true )
+ SetRoundBased( true )
+ SetRespawnsEnabled( false )
+ Riff_ForceSetEliminationMode( eEliminationMode.Pilots )
+
+ // implementing intro in a different file because it'll likely be big
+ ClassicMP_SetCustomIntro( GamemodeFastballIntroSetup, 14.5 ) // bit of a guess number
+ AddCallback_EntitiesDidLoad( SpawnPanelsForLevel )
+ AddCallback_GameStateEnter( eGameState.Prematch, ResetPanels )
+ SetTimeoutWinnerDecisionFunc( FastballDecideWinner )
+
+ AddCallback_OnClientConnected( FastballInitPlayer )
+ AddCallback_OnPlayerKilled( FastballOnPlayerKilled ) // move this to a system in _gamestate soon!!
+
+ // setup spawns
+ // first is a, second is b, third is c
+
+ FastballAddBuddySpawnForLevel( "mp_angel_city", TEAM_IMC, < 2281.39, -3333.06, 200.031 >, < 0, 91.23, 0 > )
+ FastballAddBuddySpawnForLevel( "mp_angel_city", TEAM_MILITIA, < -4139.57, 4684.4, 41.0313 >, <0, -14.326, 0 > )
+ FastballAddPanelSpawnsForLevel( "mp_angel_city", [
+ < 2055.94, 2040.03, 128.031 >, < 0, -180, 0 >,
+ < -274.757, 2255.22, 400.031 >, < 0, -176.251, 0 >,
+ < -3208.28, 2741.17, 128.031 >, < 0, -0.0821686, 0 >
+ ])
+
+ FastballAddBuddySpawnForLevel( "mp_thaw", TEAM_MILITIA, < 2049.29, -4085.22, -274.839 >, < 0, 89.2991, 0 > )
+ FastballAddBuddySpawnForLevel( "mp_thaw", TEAM_IMC, < 834.484, 2664.28, -380.515 >, < 0.532141, -90.875, -0.542593 > )
+ FastballAddPanelSpawnsForLevel( "mp_thaw", [
+ < -1026.71, -1691.93, -319.969 >, < 0, 90, 0 >,
+ < 1836.07, -538.823, -64.1245 >, < 0, -135, 0 >,
+ < 2840.15, 1321.17, -63.9688 >, < 0, 0, 0 >
+ ])
+
+ FastballAddBuddySpawnForLevel( "mp_wargames", TEAM_MILITIA, < -4848.87, 682.17, -127.969 >, < 0, 0, 0 > )
+ FastballAddBuddySpawnForLevel( "mp_wargames", TEAM_IMC, < 2960.78, 1229.36, -127.969 >, < 7.89891e-005, 146.505, 1.38387e-005 > )
+ FastballAddPanelSpawnsForLevel( "mp_wargames", [
+ < -691.961, 1888.56, 112.031 >, < 0, 90, 0 >,
+ < -1072.03, -508.229, -127.969 >, < 0, 180, 0 >,
+ < -24.291, -1403.69, -119.969 >, < 0, -90, 0 >
+ ])
+
+ FastballAddBuddySpawnForLevel( "mp_eden", TEAM_MILITIA, < -2404.4, 1738.07, 167.767 >, <0, -40.0894, 0> )
+ FastballAddBuddySpawnForLevel( "mp_eden", TEAM_IMC, < 5248.01, 414.698, 77.1051 >, < 0, 180, 0 > )
+ FastballAddPanelSpawnsForLevel( "mp_eden", [
+ < 704.333, 1530.18, 144.031 >, < 0, 90, 0 >,
+ < -108.43, 272.638, 72.0313 >, < 0, -90, 0 >,
+ <1044.25, -1145.68, 68.0313>, < 0, 180, 0 >
+ ])
+
+ FastballAddBuddySpawnForLevel( "mp_black_water_canal", TEAM_MILITIA, < 1222.88, -5050.63, -187.763 >, < 0, 45, 0 > )
+ FastballAddBuddySpawnForLevel( "mp_black_water_canal", TEAM_IMC, < -235.375, 4736.75, -255.969 >, < 0, -90, 0 > )
+ FastballAddPanelSpawnsForLevel( "mp_black_water_canal", [
+ < 1566.13, -731.539, -63.9688 >, < 0, -90, 0 >,
+ < 502.603, 1102.92, 260.031 >, < 0, 152.328, 0 >,
+ < 2337.37, 2099.91, -26.9688 >, < 0, 0, 0 >
+ ])
+
+ FastballAddBuddySpawnForLevel( "mp_grave", TEAM_MILITIA, < 11026.8, -5163.18, 1885.64 >, < 0, 155.05, 0 > )
+ FastballAddBuddySpawnForLevel( "mp_grave", TEAM_IMC, < -1952, -3120, 1993.33 >, < 0, 0, 0 > )
+ FastballAddPanelSpawnsForLevel( "mp_grave", [
+ < 5204.54, -2726.54, 2376.03 >, < 0, -90, 0 >,
+ < 6001.58, -4126.61, 2252.03 >, < 0, -135, 0 >,
+ < 3595.96, -4568.04, 2376.03 >, < 0, -135, 0 >
+ ])
+}
+
+void function SpawnPanelsForLevel()
+{
+ int panelId
+ foreach ( Point panelSpawn in file.panelSpawns )
+ {
+ entity panel = CreatePanel( panelSpawn.origin, panelSpawn.angles )
+ panel.s.panelId <- panelId++
+ }
+}
+
+void function ResetPanels()
+{
+ foreach ( entity panel in GetAllControlPanels() )
+ SetTeam( panel, TEAM_UNASSIGNED )
+}
+
+void function FastballInitPlayer( entity player )
+{
+ foreach ( entity panel in GetAllControlPanels() )
+ Remote_CallFunction_NonReplay( player, "ServerCallback_FastballUpdatePanelRui", panel.GetEncodedEHandle(), panel.s.panelId )
+}
+
+void function FastballAddPanelSpawnsForLevel( string level, array<vector> positionsAndOrigins )
+{
+ if ( GetMapName() != level )
+ return
+
+ for ( int i = 0; i < positionsAndOrigins.len(); i += 2 )
+ {
+ Point spawnPoint
+ spawnPoint.origin = positionsAndOrigins[ i ]
+ spawnPoint.angles = positionsAndOrigins[ i + 1 ]
+
+ file.panelSpawns.append( spawnPoint )
+ }
+}
+
+entity function CreatePanel( vector origin, vector angles )
+{
+ entity panel = CreateEntity( "prop_control_panel" )
+ panel.SetValueForModelKey( $"models/communication/terminal_usable_imc_01.mdl" )
+ panel.SetOrigin( origin )
+ panel.SetAngles( angles )
+ panel.kv.solid = SOLID_VPHYSICS
+ DispatchSpawn( panel )
+
+ panel.SetModel( $"models/communication/terminal_usable_imc_01.mdl" )
+ panel.s.onPlayerFinishesUsing_func = FastballOnPanelHacked
+
+ Highlight_SetNeutralHighlight( panel, "sp_enemy_pilot" )
+
+ return panel
+}
+
+// control panel code isn't very statically typed, pain
+function FastballOnPanelHacked( panel, player, success )
+{
+ expect entity( panel )
+ expect entity( player )
+ expect bool( success )
+
+ if ( !success )
+ return
+
+ print( panel + " was hacked by " + player )
+ PanelFlipsToPlayerTeamAndUsableByEnemies( panel, player )
+ player.SetPlayerGameStat( PGS_ASSAULT_SCORE, player.GetPlayerGameStat( PGS_ASSAULT_SCORE ) + 1 )
+
+ foreach ( entity otherPlayer in GetPlayerArray() )
+ Remote_CallFunction_NonReplay( otherPlayer, "ServerCallback_FastballPanelHacked", panel.GetEncodedEHandle(), panel.s.panelId, player.GetEncodedEHandle() )
+
+ // respawn dead players
+ foreach ( entity deadPlayer in GetPlayerArrayOfTeam( player.GetTeam() ) )
+ {
+ if ( !IsAlive( deadPlayer ) )
+ {
+ deadPlayer.SetOrigin( player.GetOrigin() )
+ deadPlayer.RespawnPlayer( null )
+ Remote_CallFunction_NonReplay( deadPlayer, "ServerCallback_FastballRespawnPlayer" )
+ }
+ }
+}
+
+void function FastballOnPlayerKilled( entity victim, entity attacker, var damageInfo )
+{
+ if ( !victim.IsPlayer() || GetGameState() != eGameState.Playing )
+ return
+
+ if ( GetPlayerArrayOfTeam_Alive( victim.GetTeam() ).len() == 0 )
+ SetWinner( GetOtherTeam( victim.GetTeam() ) )
+}
+
+int function FastballDecideWinner()
+{
+ int militiaPanels
+ int imcPanels
+
+ foreach ( entity panel in GetAllControlPanels() )
+ {
+ if ( panel.GetTeam() == TEAM_MILITIA )
+ militiaPanels++
+ else if ( panel.GetTeam() == TEAM_IMC )
+ imcPanels++
+ }
+
+ if ( militiaPanels > imcPanels )
+ return TEAM_MILITIA
+ else if ( imcPanels > militiaPanels )
+ return TEAM_IMC
+
+ return TEAM_UNASSIGNED
+} \ No newline at end of file