144 lines
3.7 KiB
Ucode
144 lines
3.7 KiB
Ucode
/**
|
|
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
|
*/
|
|
//=============================
|
|
// UDKJumppad - bounces players/bots up
|
|
//
|
|
//=============================
|
|
class UDKJumpPad extends NavigationPoint
|
|
native
|
|
hidecategories(VehicleUsage);
|
|
|
|
/** Pre-calculated initial jumping velocity to reach JumpTarget */
|
|
var vector JumpVelocity;
|
|
|
|
/** Target of jumppad - jumppad bounces you to this */
|
|
var() PathNode JumpTarget;
|
|
|
|
/** Sound that plays when jumppad is triggered */
|
|
var() SoundCue JumpSound;
|
|
|
|
/** How long the jump should take. Altering this value changes the JumpVelocity. */
|
|
var() float JumpTime;
|
|
|
|
/** How much air control the player should have while in the air off this pad. Less air control (even 0.0) is desireable for tight landings, since players will often accidentally air control themselves away from the target destination. */
|
|
var() float JumpAirControl;
|
|
|
|
/** Ambient sound associated with this jumppad. */
|
|
var AudioComponent JumpAmbientSound;
|
|
|
|
cpptext
|
|
{
|
|
#if WITH_EDITOR
|
|
virtual void addReachSpecs(AScout *Scout, UBOOL bOnlyChanged=0);
|
|
#endif
|
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
|
|
virtual void PostEditMove(UBOOL bFinished);
|
|
UBOOL CalculateJumpVelocity(AScout *Scout);
|
|
}
|
|
|
|
/**
|
|
* Touch called during move - Set PendingTouch so PostTouch() will be called after physics completes
|
|
*/
|
|
event Touch( Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal )
|
|
{
|
|
if ( (UDKPawn(Other) == None) || (Other.Physics == PHYS_None) )
|
|
return;
|
|
|
|
PendingTouch = Other.PendingTouch;
|
|
Other.PendingTouch = self;
|
|
}
|
|
|
|
/**
|
|
* Update velocity after movement has completed, so it doesn't get stomped by physics update in progress.
|
|
*/
|
|
event PostTouch(Actor Other)
|
|
{
|
|
local UDKPawn P;
|
|
|
|
P = UDKPawn(Other);
|
|
if (P == None || P.Physics == PHYS_None || P.DrivenVehicle != None)
|
|
{
|
|
return;
|
|
}
|
|
if ( P.bNotifyStopFalling )
|
|
{
|
|
P.StoppedFalling();
|
|
}
|
|
|
|
// adjust facing direction and movetarget of bots
|
|
if ( UDKBot(P.Controller) != None )
|
|
{
|
|
if ( Other.GetGravityZ() > WorldInfo.DefaultGravityZ )
|
|
UDKBot(P.Controller).Focus = UDKBot(P.Controller).FaceActor(2);
|
|
else
|
|
P.Controller.Focus = JumpTarget;
|
|
P.Controller.Movetarget = JumpTarget;
|
|
if ( P.Physics != PHYS_Flying )
|
|
P.Controller.MoveTimer = 2.0;
|
|
P.DestinationOffset = 50;
|
|
}
|
|
if ( P.Physics == PHYS_Walking )
|
|
{
|
|
P.SetPhysics(PHYS_Falling);
|
|
P.bReadyToDoubleJump = true;
|
|
}
|
|
P.Velocity = JumpVelocity;
|
|
|
|
// adjust jumpvelocity if gravity is altered
|
|
if ( (WorldInfo.WorldGravityZ != WorldInfo.DefaultGravityZ) && (Other.GetGravityZ() == WorldInfo.WorldGravityZ) )
|
|
{
|
|
P.Velocity *= sqrt(Other.GetGravityZ()/WorldInfo.DefaultGravityZ);
|
|
}
|
|
|
|
P.AirControl = JumpAirControl;
|
|
P.Acceleration = vect(0,0,0);
|
|
if ( JumpSound != None )
|
|
P.PlaySound(JumpSound);
|
|
}
|
|
|
|
/**
|
|
* Hint for bots which want to use this jumppad
|
|
*/
|
|
event bool SuggestMovePreparation(Pawn Other)
|
|
{
|
|
local Vehicle V;
|
|
|
|
// can't use jumppad while in a vehicle
|
|
V = Vehicle(Other);
|
|
if (V != None)
|
|
{
|
|
V.DriverLeave(false);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
bDestinationOnly=true
|
|
bCollideActors=true
|
|
JumpTime=2.0
|
|
JumpAirControl=0.05
|
|
bHidden=false
|
|
bBlockedForVehicles=true
|
|
bMovable=false
|
|
bNoDelete=true
|
|
bStatic=false
|
|
bSpecialMove=true
|
|
Components.Remove(Sprite)
|
|
Components.Remove(Sprite2)
|
|
GoodSprite=None
|
|
BadSprite=None
|
|
|
|
Begin Object Name=CollisionCylinder
|
|
CollideActors=true
|
|
End Object
|
|
|
|
Begin Object Class=DynamicLightEnvironmentComponent Name=JumpPadLightEnvironment
|
|
bDynamic=FALSE
|
|
bCastShadows=FALSE
|
|
End Object
|
|
Components.Add(JumpPadLightEnvironment)
|
|
}
|