The three virtues of a programmer: Laziness, Impatience, and Hubris. – Larry Wall

Legacy:DelayedTeleporter/UT Code

From Unreal Wiki, The Unreal Engine Documentation Site

Jump to: navigation, search
UT :: Actor (UT) >> NavigationPoint (UT) >> Teleporter >> DelayedTeleporter (Code)

To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See Create A Subclass and Embedding Code for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.

class DelayedTeleporter extends Teleporter;
/******************************************************************************
* DelayedTeleporter by Wormbo                                                 *
*                                                                             *
* TeleporterEnterDelay specifies, how long the teleporter is disabled after   *
* someone entered it.                                                         *
* bFixedExitRotation specifies, that the player's rotation after exiting this *
* teleporter should be set to the teleporter's rotation.                      *
*                                                                             *
* To make the delay work, set bStatic=False and bNoDelete=True in defaults.   *
******************************************************************************/
 
var(Teleporter) float TeleportEnterDelay;
var(Teleporter) bool bFixedExitRotation;
var float Delay;
var Actor LastIncoming;
 
replication
{
        reliable if ( Role == ROLE_Authority )
                Delay;
}
 
simulated function Tick(float DeltaTime)
{
        local int i;
 
        if ( Delay > 0 ) {
                Delay -= DeltaTime;
                if ( Delay <= 0 ) //teleport any pawns already in my radius
                        for (i = 0; i < 4; i++)
                                if ( Touching[i] != None )
                                        Touch(Touching[i]);
        }
}
 
simulated function bool Accept(actor Incoming, Actor Source)
{
        local rotator newRot, oldRot;
        local pawn P;
 
        // Move the actor here.
        Disable('Touch');
        //log("Move Actor here "$tag);
        newRot = Incoming.Rotation;
        if ( bChangesYaw ) {
                oldRot = Incoming.Rotation;
                newRot.Yaw = Rotation.Yaw;
                if ( !bFixedExitRotation && Source != None )
                        newRot.Yaw += (32768 + Incoming.Rotation.Yaw - Source.Rotation.Yaw);
        }
 
        if ( Pawn(Incoming) != None ) {
                //tell enemies about teleport
                if ( Role == ROLE_Authority ) {
                        P = Level.PawnList;
                        While ( P != None ) {
                                if ( P.Enemy == Incoming )
                                        P.LastSeenPos = Incoming.Location; 
                                P = P.nextPawn;
                        }
                }
                Pawn(Incoming).SetLocation(Location);
                if ( Role == ROLE_Authority || Level.TimeSeconds - LastFired > 0.5 ) {
                        Pawn(Incoming).SetRotation(newRot);
                        Pawn(Incoming).ViewRotation = newRot;
                        LastFired = Level.TimeSeconds;
                }
                Pawn(Incoming).MoveTimer = -1.0;
                Pawn(Incoming).MoveTarget = self;
                PlayTeleportEffect( Incoming, false);
        }
        else {
                if ( !Incoming.SetLocation(Location) ) {
                        Enable('Touch');
                        return false;
                }
                if ( bChangesYaw )
                        Incoming.SetRotation(newRot);
        }
 
        Enable('Touch');
 
        if ( bChangesVelocity )
                Incoming.Velocity = TargetVelocity;
        else {
                if ( bChangesYaw ) {
                        if ( Incoming.Physics == PHYS_Walking )
                                OldRot.Pitch = 0;
                        // adjust the actor's velocity
                        Incoming.Velocity = Incoming.Velocity << OldRot;
                        Incoming.Velocity = Incoming.Velocity >> NewRot;
                        Incoming.Acceleration = Incoming.Acceleration << OldRot;
                        Incoming.Acceleration = Incoming.Acceleration >> NewRot;
                } 
                if ( bReversesX )
                        Incoming.Velocity.X *= -1.0;
                if ( bReversesY )
                        Incoming.Velocity.Y *= -1.0;
                if ( bReversesZ )
                        Incoming.Velocity.Z *= -1.0;
        } 
 
        LastIncoming = Incoming;
 
        return true;
}
 
// Teleporter was touched by an actor.
simulated function Touch(actor Other)
{
        local Teleporter Dest;
        local int i;
        local Actor A;
 
        if ( !bEnabled || Delay > 0 || Other == LastIncoming )
                return;
 
        if ( Other.bCanTeleport && Other.PreTeleport(Self) == false ) {
                if ( InStr(URL, "/") >= 0 || InStr(URL, "#") >= 0 ) {
                        // Teleport to a level on the net.
                        if ( Role == ROLE_Authority && PlayerPawn(Other) != None )
                                Level.Game.SendPlayer(PlayerPawn(Other), URL);
                }
                else {
                        // Teleport to a random teleporter in this local level, if more than one pick random.
                        foreach AllActors(class 'Teleporter', Dest)
                                if ( string(Dest.Tag) ~= URL && Dest != Self )
                                        i++;
                        i = rand(i);
                        foreach AllActors(class 'Teleporter', Dest)
                                if ( string(Dest.Tag) ~= URL && Dest != Self && i-- == 0 )
                                        break;
 
                        if ( Dest != None ) {
                                // Teleport the actor into the other teleporter.
                                if ( Other.IsA('Pawn') )
                                        PlayTeleportEffect(Pawn(Other), false);
 
                                if ( Dest.Accept(Other, Self) )
                                        Delay = TeleportEnterDelay;
 
                                if ( Event != '' && Other.IsA('Pawn') )
                                        foreach AllActors(class 'Actor', A, Event)
                                                A.Trigger(Other, Other.Instigator);
                        }
                        else if ( Role == ROLE_Authority )
                                Pawn(Other).ClientMessage("Teleport destination for "$self$" not found!");
                }
        }
}
 
simulated function UnTouch(actor Other)
{
        if ( Other == LastIncoming )
                LastIncoming = None;
 
        Super.UnTouch(Other);
}

Fyfe: Accept() can be reduced to:

simulated function bool Accept( Actor Incoming, Actor Source )
{
        if ( bFixedExitRotation )
                Source = None;
 
        if ( Super.Accept( Incoming, Source ) )
        {
                LastIncoming = Incoming;
                return true;
        }
        else
                return false;
}
Personal tools