Mostly Harmless
Legacy:VitalOverdose/JumpingTeleporter
OverView
This custom xkicker actor will fire ( + HardAttach a nice trail effect) a Pawn and then depending if the Pawn went in the right direction, it will then capture and teleport (with optional sound/Emitter fx) him.
Usage
There is only 1 actor to this teleport system as any actor that has it collision switched off can be a TeleportExit as long as its 'TagName' matches the one specified by the mapper in the JumpingTeleporter properties. Path nodes are ideal for TeleportExits.
If you link more than one actor to the the JumpingTeleporter then one will be picked at random at the time of teleportation. This is so you can add a JumpingTeleporter to existing maps very quickly as most maps have pathnodes/ RoadPathNodes already set out in suitable places for most pawns to be teleported to.
Note
Remember you don't HAVE to use multiple spawn locations If you use 1 JumpingTeleporter and 1 spawn location it should be no more difficult to visualize than using a standard teleporter system.
The Script
//============================================================================= // Jumping Teleporter By vitaloverdose, Updated Nov 2007 // http://www.Vitaloverdose.com // This is part of the 'Vitals Pro Mapping Tools' Mod // Full class list http://wiki.beyondunreal.com/wiki/Vital's_Pro_Mapping_Tools //============================================================================= class JumpingTeleporter extends xkicker placeable; Var() Bool bPlaySpawnEffect; Var Bool bRescanTeleportExits; Var Bool bScanning; Var Bool bTracking; Var() Array < Class< Emitter > > TrailFxPool; Var() Array < Class< Emitter > > TeleportFxPool; Var() Array < Class< Emitter > > MaterialiseFxPool; Var Array < Actor > TeleportExits; Var() Name TeleportExitTag; // mapper can set the Tag name for tp points Var() Float TimerFrequency; Var() Float TelEntryScanRadius; Var() Vector TeleportEntryOffset; Var() Sound TeleportSound; Var() sound MaterialiseSound; Var Int RescanFrequency; Var Int TimeTillRescan; Function PostBeginPlay() { // Run the first Scan for TeleportExits ScanTeleportExit(); TeleportEntryOffset += Location; if ( RescanFrequency!= 0 ) // checks to see if the mapper wants Rescaning settimer(0.1,true); // if so then set the timer to repete TeleportExits.Insert( 0,1 ); // creates blanks space for first TeleportExits vector loction; super.PostBeginPlay(); // adds function related code form parent } Simulated function ScanTeleportExit() { Local Actor FoundTeleportExit; if ( TeleportExits.Length != 0 ) TeleportExits.Remove( 0,TeleportExits.Length ); foreach AllActors( Class'Actor' , TeleportExits[0], TeleportExitTag ) TeleportExits.Insert( 0,1 ); if ( RescanFrequency != 0) TimeTillRescan=RescanFrequency; } Function Touch(Actor Other) { local Emitter SpawnedTrail; if (((other.IsA('Pawn'))&&(!other.isa('Vehicle'))) && (TrailFxPool.length != 0)) { SpawnedTrail = Spawn( TrailFxPool[rand(TrailFxPool.length-1)+1] ,self ,,other.Location ,other.rotation ); if (SpawnedTrail!=None) { SpawnedTrail.SetBase(other); bScanning=true; } } Super.Touch(Other); } Function Timer() { local Emitter FoundEmitter; local Emitter SpawnedEmitter; if ( bTracking == true ) { foreach RadiusActors(class'Emitter',FoundEmitter,TelEntryScanRadius,TeleportEntryOffset) { if (FoundEmitter.Owner == self) { TeleportActor( Pawn(FoundEmitter.Base) ); FoundEmitter.destroyed(); if ( TeleportFxPool.length > 0 ) SpawnedEmitter=Spawn( TeleportFxPool[rand(TeleportFxPool.length-1)+1],self , ,Pawn(FoundEmitter.Base).Location); if ( TeleportSound != None ) Playsound( TeleportSound ); //some sound FX bTracking = false; // switches the flag for tacking off } } } if ( RescanFrequency != 0 ) { TimeTillRescan -= 0.1; if (TimeTillRescan < 0 ) { ScanTeleportExit(); TimeTillRescan = RescanFrequency; } } super.Timer(); } Simulated Function TeleportActor(Pawn TeleportExitActor) { local float ExtraHeight; local Int PickedNumb; local vector NewOffsetPosition; If ( BPlaySpawnEffect == true ) TeleportExitActor.PlayTelePortEffect( False,True ); // Spawns fx if needed PickedNumb = FindSafeSpawnLoc(ExtraHeight); NewOffsetPosition = TeleportExits[PickedNumb].Location; NewOffsetPosition.z += ExtraHeight; TeleportExitActor.SetLocation( NewOffsetPosition ); TeleportExitActor.SetRotation( TeleportExits[PickedNumb].Rotation ); TeleportExitActor.OldRotYaw = TeleportExitActor.Rotation.Yaw; If ( BPlaySpawnEffect == true ) TeleportExitActor.PlayTelePortEffect( False,True ); // Spawns fx if needed } // this function checks for Pawns being to close to the Spawn point // this way no one should get telefraged. Function Int FindSafeSpawnLoc(out float ExtraHeight) { Local Pawn FoundPawn; Local Int Counter; Local int PickedRNDNo; Local array<int> Templist; Templist.Length = TeleportExits.Length; while( FoundPawn == None ) { for ( Counter = 0 ; Counter < TeleportExits.Length ; Counter++ ) Templist[Counter]=Counter; for ( Counter=0 ; Counter < TeleportExits.Length ; Counter++ ) // pick Numbs @Random from list { // Numbs in sequential order PickedRNDNo = Rand(Templist.Length -1)+1; //RND No based on the Length of the list. foreach radiusActors( Class'Pawn' , FoundPawn , TelEntryScanRadius , TeleportExits[PickedRNDNo].Location + (Vect( 0,0,1) * ExtraHeight)) { if ( FoundPawn.bCollideActors == True ) PickedRNDNo = -10; TempList.remove( PickedRNDNo ,1 ); } } ExtraHeight += 90; } return PickedRNDNo; }