Legacy:DelayedTeleporter/UT Code: Difference between revisions

From Unreal Wiki, The Unreal Engine Documentation Site
No edit summary
 
Fyfe (talk | contribs)
Accept() can be reduced to....
 
Line 1: Line 1:
{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] >> [[Legacy:NavigationPoint|NavigationPoint]] >> [[Legacy:Teleporter|Teleporter]] >> DelayedTeleporter (Code)}}
{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] >> [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] >> [[Legacy:Teleporter|Teleporter]] >> DelayedTeleporter (Code)}}


To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.
To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.
Line 162: Line 162:
Super.UnTouch(Other);
Super.UnTouch(Other);
}</uscript>
}</uscript>
----
'''Fyfe:''' <tt>Accept()</tt> can be reduced to:
<uscript>
simulated function bool Accept( Actor Incoming, Actor Source )
{
if ( bFixedExitRotation )
Source = None;
if ( Super.Accept( Incoming, Source ) )
{
LastIncoming = Incoming;
return true;
}
else
return false;
}
</uscript>

Latest revision as of 15:43, 25 November 2006

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