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

96 lines
2.4 KiB
Ucode

//=============================================================================
// JumpDest.
// specifies positions that can be reached with greater than normal jump
// forced paths will check for greater than normal jump capability
// NOTE these have NO relation to JumpPads
//=============================================================================
class JumpDest extends NavigationPoint
native;
cpptext
{
virtual void SetupForcedPath(APawn* Scout, UReachSpec* Path);
void ClearPaths();
UBOOL ReviewPath(APawn* Scout);
}
var bool bOptionalJumpDest;
var() bool bForceDoubleJump; // hack for map fixing
var int NumUpstreamPaths;
var ReachSpec UpstreamPaths[8];
var vector NeededJump[8];
var float CalculatedGravityZ[8];
//#ifdef _KF_
var(KF) bool bIgnoreZDiff; // Force the jump regardless of height distance from jump start location
var(KF) int SpecialCostOverride; // Override the result of SpecialCost
var(KF) float XYVelocityScale;
//#endif
function int GetPathIndex(ReachSpec Path)
{
local int i;
if ( Path == None )
return 0;
for ( i=0; i<4; i++ )
if ( UpstreamPaths[i] == Path )
return i;
return 0;
}
event int SpecialCost(Pawn Other, ReachSpec Path)
{
local int Num;
if ( Other.Physics == PHYS_Flying )
return 100;
if ( Vehicle(Other) != None )
return 10000000;
Num = GetPathIndex(Path);
if ( Abs(Other.JumpZ/Other.PhysicsVolume.Gravity.Z) >= Abs(NeededJump[Num].Z/CalculatedGravityZ[Num]) )
return 100;
return 10000000;
}
function DoJump(Pawn Other)
{
Other.bWantsToCrouch = false;
Other.Controller.MoveTarget = self;
Other.Controller.Destination = Location;
Other.bNoJumpAdjust = true;
if ( bForceDoubleJump )
Other.Velocity = Other.Controller.EAdjustJump(0,Other.Default.GroundSpeed);
else
Other.Velocity = Other.Controller.EAdjustJump(0,Other.GroundSpeed);
Other.Acceleration = vect(0,0,0);
Other.SetPhysics(PHYS_Falling);
Other.Controller.SetFall();
Other.DestinationOffset = CollisionRadius;
}
event bool SuggestMovePreparation(Pawn Other)
{
local int Num;
if ( Other.Controller == None )
return false;
Num = GetPathIndex(Other.Controller.CurrentPath);
if ( Abs(Other.JumpZ/Other.PhysicsVolume.Gravity.Z) < Abs(NeededJump[Num].Z/CalculatedGravityZ[Num]) )
return false;
DoJump(Other);
return false;
}
defaultproperties
{
//#ifdef _KF_
SpecialCostOverride=-1
XYVelocityScale=1.f
//#endif
bSpecialForced=true
}