From 9a96d0bff56f1969c68bb52a2f33296095bdc67d Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Tue, 31 Aug 2021 23:14:58 +0100 Subject: move to new mod format --- .../vscripts/gamemodes/_gamemode_speedball.nut | 127 +++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut (limited to 'Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut') 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 -- cgit v1.2.3