diff options
author | BobTheBob <32057864+BobTheBob9@users.noreply.github.com> | 2021-08-31 23:14:58 +0100 |
---|---|---|
committer | BobTheBob <32057864+BobTheBob9@users.noreply.github.com> | 2021-08-31 23:14:58 +0100 |
commit | 9a96d0bff56f1969c68bb52a2f33296095bdc67d (patch) | |
tree | 4175928e488632705692e3cccafa1a38dd854615 /Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut | |
parent | 27bd240871b7c0f2f49fef137718b2e3c208e3b4 (diff) | |
download | NorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.tar.gz NorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.zip |
move to new mod format
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut')
-rw-r--r-- | Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut new file mode 100644 index 000000000..4532fb972 --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut @@ -0,0 +1,127 @@ +global function GamemodeSpeedball_Init + +struct { + entity flagBase + entity flag + entity flagCarrier +} file + +void function GamemodeSpeedball_Init() +{ + PrecacheModel( CTF_FLAG_MODEL ) + PrecacheModel( CTF_FLAG_BASE_MODEL ) + + // gamemode settings + SetRoundBased( true ) + SetRespawnsEnabled( false ) + SetShouldUseRoundWinningKillReplay( true ) + Riff_ForceTitanAvailability( eTitanAvailability.Never ) + Riff_ForceSetEliminationMode( eEliminationMode.Pilots ) + + AddSpawnCallbackEditorClass( "script_ref", "info_speedball_flag", CreateFlag ) + + AddCallback_GameStateEnter( eGameState.Playing, ResetFlag ) + AddCallback_OnTouchHealthKit( "item_flag", OnFlagCollected ) + AddCallback_OnPlayerKilled( OnPlayerKilled ) + SetTimeoutWinnerDecisionFunc( TimeoutCheckFlagHolder ) + + ClassicMP_SetCustomIntro( ClassicMP_DefaultNoIntro_Setup, ClassicMP_DefaultNoIntro_GetLength() ) +} + +void function CreateFlag( entity flagSpawn ) +{ + entity flagBase = CreatePropDynamic( CTF_FLAG_BASE_MODEL, flagSpawn.GetOrigin(), flagSpawn.GetAngles() ) + + entity flag = CreateEntity( "item_flag" ) + flag.SetValueForModelKey( CTF_FLAG_MODEL ) + flag.MarkAsNonMovingAttachment() + DispatchSpawn( flag ) + flag.SetModel( CTF_FLAG_MODEL ) + flag.SetOrigin( flagBase.GetOrigin() + < 0, 0, flagBase.GetBoundingMaxs().z + 1 > ) + flag.SetVelocity( < 0, 0, 1 > ) + + file.flag = flag + file.flagBase = flagBase +} + +bool function OnFlagCollected( entity player, entity flag ) +{ + if ( !IsAlive( player ) || flag.GetParent() != null || player.IsTitan() || player.IsPhaseShifted() ) + return false + + GiveFlag( player ) + return false // so flag ent doesn't despawn +} + +void function OnPlayerKilled( entity victim, entity attacker, var damageInfo ) +{ + if ( file.flagCarrier == victim ) + DropFlag() + + if ( victim.IsPlayer() && GetGameState() == eGameState.Playing ) + if ( GetPlayerArrayOfTeam_Alive( victim.GetTeam() ).len() == 1 ) + foreach ( entity player in GetPlayerArray() ) + Remote_CallFunction_NonReplay( player, "ServerCallback_SPEEDBALL_LastPlayer", player.GetTeam() != victim.GetTeam() ) +} + +void function GiveFlag( entity player ) +{ + file.flag.SetParent( player, "FLAG" ) + file.flagCarrier = player + SetGlobalNetEnt( "flagCarrier", player ) + thread DropFlagIfPhased( player ) + + EmitSoundOnEntityOnlyToPlayer( player, player, "UI_CTF_1P_GrabFlag" ) + foreach ( entity otherPlayer in GetPlayerArray() ) + { + MessageToPlayer( otherPlayer, eEventNotifications.SPEEDBALL_FlagPickedUp, player ) + + if ( otherPlayer.GetTeam() == player.GetTeam() ) + EmitSoundOnEntityToTeamExceptPlayer( file.flag, "UI_CTF_3P_TeamGrabFlag", player.GetTeam(), player ) + } +} + +void function DropFlagIfPhased( entity player ) +{ + player.EndSignal( "StartPhaseShift" ) + + OnThreadEnd( function() : ( player ) + { + if ( file.flag.GetParent() == player ) + DropFlag() + }) + + while( file.flag.GetParent() == player ) + WaitFrame() +} + +void function DropFlag() +{ + file.flag.ClearParent() + file.flag.SetAngles( < 0, 0, 0 > ) + SetGlobalNetEnt( "flagCarrier", file.flag ) + EmitSoundOnEntityOnlyToPlayer( file.flagCarrier, file.flagCarrier, "UI_CTF_1P_FlagDrop" ) + + foreach ( entity player in GetPlayerArray() ) + MessageToPlayer( player, eEventNotifications.SPEEDBALL_FlagDropped, file.flagCarrier ) + + file.flagCarrier = null +} + +void function ResetFlag() +{ + file.flag.ClearParent() + file.flag.SetAngles( < 0, 0, 0 > ) + file.flag.SetVelocity( < 0, 0, 1 > ) // hack: for some reason flag won't have gravity if i don't do this + file.flag.SetOrigin( file.flagBase.GetOrigin() + < 0, 0, file.flagBase.GetBoundingMaxs().z * 2 > ) + file.flagCarrier = null + SetGlobalNetEnt( "flagCarrier", file.flag ) +} + +int function TimeoutCheckFlagHolder() +{ + if ( file.flagCarrier == null ) + return TEAM_UNASSIGNED + + return file.flagCarrier.GetTeam() +}
\ No newline at end of file |