rott/kf_sources/Engine/Classes/LiftExit.uc
2026-07-14 20:27:09 +07:00

106 lines
2.9 KiB
Ucode

//=============================================================================
// LiftExit.
//=============================================================================
class LiftExit extends NavigationPoint
placeable
native;
#exec Texture Import File=Textures\Lift_exit.pcx Name=S_LiftExit Mips=Off MASKED=1
var() name LiftTag;
var Mover MyLift;
var() byte SuggestedKeyFrame; // mover keyframe associated with this exit - optional
var byte KeyFrame;
var(LiftJump) bool bLiftJumpExit;
var(LiftJump) bool bNoDoubleJump;
function PostBeginPlay()
{
Super.PostBeginPlay();
if ( bLiftJumpExit && (MyLift != None) )
{
if ( Level.Game.GameDifficulty < 4 )
ExtraCost = 10000000;
MyLift.bJumpLift = true;
}
}
function bool CanBeReachedFromLiftBy(Pawn Other)
{
local float RealJumpZ;
if ( bLiftJumpExit )
{
if ( (MyLift.Velocity.Z < 100) || (MyLift.KeyNum == 0) )
return false;
RealJumpZ = Other.JumpZ;
if ( !bNoDoubleJump )
Other.JumpZ = Other.JumpZ * 1.5;
Other.JumpZ += MyLift.Velocity.Z;
Other.bWantsToCrouch = false;
Other.Controller.MoveTarget = self;
Other.Controller.Destination = Location;
Other.bNoJumpAdjust = true;
Other.Velocity = SuggestFallVelocity(Location + vect(0,0,100), Other.Location, Other.JumpZ, Other.GroundSpeed);
Other.Acceleration = vect(0,0,0);
Other.SetPhysics(PHYS_Falling);
Other.Controller.SetFall();
Other.DestinationOffset = CollisionRadius;
Other.JumpZ = RealJumpZ;
if ( !bNoDoubleJump )
Other.Controller.SetDoubleJump();
return true;
}
return ( (Location.Z < Other.Location.Z + Other.CollisionHeight)
&& Other.LineOfSightTo(self) );
}
event bool SuggestMovePreparation(Pawn Other)
{
local Controller C;
if ( (MyLift == None) || (Other.Controller == None) )
return false;
if ( Other.Physics == PHYS_Flying )
{
if ( Other.AirSpeed > 0 )
Other.Controller.MoveTimer = 2+ VSize(Location - Other.Location)/Other.AirSpeed;
return false;
}
if ( (Other.Base == MyLift)
|| ((LiftCenter(Other.Anchor) != None) && (LiftCenter(Other.Anchor).MyLift == MyLift)
&& (Other.ReachedDestination(Other.Anchor))) )
{
// if pawn is on the lift, see if it can get off and go to this lift exit
if ( CanBeReachedFromLiftBy(Other) )
return false;
// make pawn wait on the lift
Other.DesiredRotation = rotator(Location - Other.Location);
Other.Controller.WaitForMover(MyLift);
return true;
}
else
{
for ( C=Level.ControllerList; C!=None; C=C.nextController )
if ( (C.Pawn != None) && (C.PendingMover == MyLift) && C.SameTeamAs(Other.Controller) && C.Pawn.ReachedDestination(self) )
{
Other.DesiredRotation = rotator(Location - Other.Location);
Other.Controller.WaitForMover(MyLift);
return true;
}
}
return false;
}
defaultproperties
{
Texture=S_LiftExit
SuggestedKeyFrame=255
bSpecialMove=true
bNeverUseStrafing=true
bForceNoStrafing=true
}