diff options
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/mp')
3 files changed, 37 insertions, 14 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut index 6673d174..5a0ec989 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut @@ -163,9 +163,7 @@ void function CodeCallback_OnClientConnectionCompleted( entity player ) // Added via AddCallback_OnClientConnected foreach ( callbackFunc in svGlobal.onClientConnectedCallbacks ) - { callbackFunc( player ) - } if ( !Flag( "PlayerDidSpawn") ) __PlayerDidSpawn( player ) @@ -232,6 +230,7 @@ void function CodeCallback_OnPlayerRespawned( entity player ) void function CodeCallback_OnPlayerKilled( entity player, var damageInfo ) { PlayerOrNPCKilled( player, damageInfo ) + HandleDeathPackage( player, damageInfo ) thread PostDeathThread_MP( player, damageInfo ) } @@ -294,6 +293,12 @@ void function PostDeathThread_MP( entity player, var damageInfo ) // based on ga if ( shouldDoReplay ) thread TrackDestroyTimeForReplay( attacker, replayTracker ) + player.StartObserverMode( OBS_MODE_DEATHCAM ) + if ( ShouldSetObserverTarget( attacker ) ) + player.SetObserverTarget( attacker ) + else + player.SetObserverTarget( null ) + if ( !file.playerDeathsHidden ) Remote_CallFunction_NonReplay( player, "ServerCallback_YouDied", attacker.GetEncodedEHandle(), GetHealthFrac( attacker ), methodOfDeath ) @@ -310,7 +315,7 @@ void function PostDeathThread_MP( entity player, var damageInfo ) // based on ga } // quick note: in cases where player.Die() is called: e.g. for round ends, player == attacker - if ( shouldDoReplay && KillcamsEnabled() ) // hack: double check if killcams are enabled here in case gamestate has changed this + if ( shouldDoReplay && Replay_IsEnabled() && KillcamsEnabled() && IsValid( attacker ) ) // hack: double check if killcams are enabled and valid here in case gamestate has changed this { player.watchingKillreplayEndTime = Time() + replayLength float beforeTime = GetKillReplayBeforeTime( player, methodOfDeath ) @@ -357,13 +362,20 @@ void function PlayerWatchesKillReplayWrapper( entity player, entity attacker, fl { player.EndSignal( "RespawnMe" ) player.EndSignal( "OnRespawned" ) - player.EndSignal( "GameStateChanged" ) + + player.EndSignal( "OnDestroy" ) + attacker.EndSignal( "OnDestroy" ) + + svGlobal.levelEnt.EndSignal( "GameStateChanged" ) OnThreadEnd( function() : ( player ) { - player.ClearReplayDelay() - player.ClearViewEntity() - player.SetPredictionEnabled( true ) + if ( IsValid( player ) ) + { + player.ClearReplayDelay() + player.ClearViewEntity() + player.SetPredictionEnabled( true ) + } }) player.SetPredictionEnabled( false ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut index 46872692..58c8bb9b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut @@ -643,7 +643,7 @@ void function CleanUpEntitiesForRoundEnd() ClearTitanAvailable( player ) if ( IsAlive( player ) ) - player.Die() + player.Die( svGlobal.worldspawn, svGlobal.worldspawn, { damageSourceId = eDamageSourceId.round_end } ) if ( IsAlive( player.GetPetTitan() ) ) player.GetPetTitan().Destroy() @@ -655,6 +655,9 @@ void function CleanUpEntitiesForRoundEnd() foreach ( entity weapon in GetEntArrayByClass_Expensive( "weaponx" ) ) weapon.Destroy() + + foreach ( entity battery in GetEntArrayByClass_Expensive( "item_titan_battery" ) ) + battery.Destroy() // allow other scripts to clean stuff up too svGlobal.levelEnt.Signal( "CleanUpEntitiesForRoundEnd" ) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/spawn.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/spawn.nut index 70d1e527..94138561 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/spawn.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/spawn.nut @@ -7,6 +7,7 @@ global function SetRespawnsEnabled global function RespawnsEnabled global function SetSpawnpointGamemodeOverride global function GetSpawnpointGamemodeOverride +global function AddSpawnpointValidationRule global function CreateNoSpawnArea global function DeleteNoSpawnArea @@ -27,6 +28,7 @@ struct NoSpawnArea struct { bool respawnsEnabled = true string spawnpointGamemodeOverride + array< bool functionref( entity, int ) > customSpawnpointValidationRules table<string, NoSpawnArea> noSpawnAreas @@ -75,6 +77,11 @@ bool function RespawnsEnabled() return file.respawnsEnabled } +void function AddSpawnpointValidationRule( bool functionref( entity spawn, int team ) rule ) +{ + file.customSpawnpointValidationRules.append( rule ) +} + string function CreateNoSpawnArea( int blockSpecificTeam, int blockEnemiesOfTeam, vector position, float lifetime, float radius ) { NoSpawnArea noSpawnArea @@ -166,7 +173,7 @@ entity function FindSpawnPoint( entity player, bool isTitan, bool useStartSpawnp } entity spawnpoint = GetBestSpawnpoint( player, spawnpoints ) - + spawnpoint.s.lastUsedTime = Time() player.SetLastSpawnPoint( spawnpoint ) @@ -230,21 +237,22 @@ bool function IsSpawnpointValid( entity spawnpoint, int team ) else if ( GameModeRemove( spawnpoint ) ) return false } - - if ( Riff_FloorIsLava() && spawnpoint.GetOrigin().z < GetLethalFogTop() ) - return false int compareTeam = spawnpoint.GetTeam() if ( HasSwitchedSides() && ( compareTeam == TEAM_MILITIA || compareTeam == TEAM_IMC ) ) compareTeam = GetOtherTeam( compareTeam ) - + + foreach ( bool functionref( entity, int ) customValidationRule in file.customSpawnpointValidationRules ) + if ( !customValidationRule( spawnpoint, team ) ) + return false + if ( spawnpoint.GetTeam() > 0 && compareTeam != team && !IsFFAGame() ) return false if ( spawnpoint.IsOccupied() ) return false - if ( Time() - spawnpoint.s.lastUsedTime <= 1.0 ) + if ( Time() - spawnpoint.s.lastUsedTime <= 10.0 ) return false foreach ( k, NoSpawnArea noSpawnArea in file.noSpawnAreas ) |