The three virtues of a programmer: Laziness, Impatience, and Hubris. – Larry Wall
Legacy:Respawn Delay Mutator
From Unreal Wiki, The Unreal Engine Documentation Site
By UT2004Addict
http://www.arclength.net/ut2004
Also look for me on the official Atari forums.
http://www.ataricommunity.com/forums/member.php?s=&action=getinfo&userid=225286
Anyway, I comment my scripts fairly well, you should get a good idea how this works:
//----------------------------------------------------------- // Respawn Delay coding by UT2004Addict // All rights reserved // 2007 // http://www.ataricommunity.com/forums/member.php?s=&action=getinfo&userid=225286 //----------------------------------------------------------- class RespawnDelayGameRules extends GameRules; var float RespawnDelay; function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation) { local RespawnDelayActor RDA; local Controller C; if (Killed.Controller != none) C = Killed.Controller; else if (Killed.Owner.IsA('Controller')) C = Controller(Killed.Owner); else if ( Killed.Owner.IsA('Pawn') && Pawn(Killed.Owner).Controller != none ) C = Pawn(Killed.Owner).Controller; if ( C != none && !C.bVehicleTransition ) { RDA = spawn(class'RespawnDelayActor', C); if (RDA != none) { RDA.RespawnDelay = RespawnDelay; RDA.CheckController = C; RDA.CheckPawn = Killed; } } if ( (NextGameRules != None) && NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation) ) { return true; } return false; } defaultproperties { RespawnDelay=10.0 }
//----------------------------------------------------------- // Respawn Delay coding by UT2004Addict // All rights reserved // 2007 // http://www.ataricommunity.com/forums/member.php?s=&action=getinfo&userid=225286 //----------------------------------------------------------- class RespawnDelayActor extends Actor; var int TickChecks; var bool bActivated; var float RespawnDelay; var Controller CheckController, TargetController; var Pawn CheckPawn, TargetPawn; var float OldControllerFrequency, OldPawnFrequency; simulated function PostBeginPlay() { super.PostBeginPlay(); Enable('Timer'); Enable('Tick'); } simulated function Tick(float DeltaTime) { // Just in case something else is going on, // don't check more than a few times if (!bActivated) TickChecks--; if (TickChecks <= 0) { EndDelay(); return; } super.Tick(DeltaTime); if ( !bActivated && ( CheckPawn == none || CheckPawn.Health <= 0 ) ) { StartDelay(CheckController); if (CheckPawn != none) SetTargetPawn(CheckPawn); } } simulated function StartDelay(Controller C) { if (C == none) { Destroy(); return; } bActivated = true; TargetController = C; if ( TargetController.Pawn != none && TargetController.Pawn.Health > 0 ) SetTargetPawn(TargetController.Pawn); TargetController.bVehicleTransition = true; // to keep Bots from doing Restart() TargetController.Unpossess(); TargetController.bStasis = true; TargetController.NetUpdateTime = Level.TimeSeconds; OldControllerFrequency = TargetController.NetUpdateFrequency; TargetController.NetUpdateFrequency = RespawnDelay; SetTimer(RespawnDelay, false); } simulated function SetTargetPawn(Pawn P) { if (P == none) return; TargetPawn = P; TargetPawn.NetUpdateTime = Level.TimeSeconds; OldPawnFrequency = TargetPawn.NetUpdateFrequency; TargetPawn.NetUpdateFrequency = RespawnDelay; } simulated function Timer() { EndDelay(); } simulated function EndDelay() { // End our delay if (TargetController != none) { TargetController.bStasis = false; if ( TargetPawn != none && TargetPawn.Health > 0 ) { TargetController.Possess(TargetPawn); if (TargetController.IsA('PlayerController')) { PlayerController(TargetController).ClientSetViewTarget(TargetPawn); } TargetPawn.NetUpdateTime = Level.TimeSeconds; TargetPawn.NetUpdateFrequency = OldPawnFrequency; } else { // Copied from Controller PawnDied TargetController.Pawn = None; TargetController.PendingMover = None; if ( TargetController.bIsPlayer ) { if ( !TargetController.IsInState('GameEnded') && !TargetController.IsInState('RoundEnded') ) TargetController.GotoState('Dead'); // can respawn } else TargetController.Destroy(); } TargetController.bVehicleTransition = false; TargetController.NetUpdateTime = Level.TimeSeconds; TargetController.NetUpdateFrequency = OldControllerFrequency; } // Clear out everything TargetController = none; SetTimer(0.0, false); Destroy(); } defaultproperties { RespawnDelay=10.0 TickChecks=5 bActivated = false; LifeSpan=0.0 bHidden=true }
//----------------------------------------------------------- // Respawn Delay coding by UT2004Addict // All rights reserved // 2007 // http://www.ataricommunity.com/forums/member.php?s=&action=getinfo&userid=225286 //----------------------------------------------------------- class MutRespawnDelay extends Mutator; var config float RespawnDelay; static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.RulesGroup, "RespawnDelay", "Respawn Delay Duration:", 0, 1, "Text", "10.0;1.0:20.0"); return; } function PostBeginPlay() { local GameRules G; Super.PostBeginPlay(); G = spawn(class'RespawnDelayGameRules'); if (G != none) { RespawnDelayGameRules(G).RespawnDelay = RespawnDelay; } if ( Level.Game.GameRulesModifiers == None ) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); } defaultproperties { RespawnDelay=10.0 IconMaterialName="MutatorArt.nosym" GroupName="RespawnDelay01" FriendlyName="Respawn Delay" Description="Delay before players can respawn." }