| Home Page | Recent Changes | Preferences

DelayedTeleporter/UT Code

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;
}

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Image Uploads

Random Page

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In