1
0
KF2-Dev-Scripts/KFGameContent/Classes/KFPlayerZedSuicideCamera.uc
2020-12-13 18:01:13 +03:00

137 lines
4.4 KiB
Ucode

//=============================================================================
// KFPlayerZedSuicideCamera
//=============================================================================
// Camera class for player zed suicide attacks (crawler, husk)
//=============================================================================
// Killing Floor 2
// Copyright (C) 2016 Tripwire Interactive LLC
// Matt "Squirrlz" Farber
//=============================================================================
class KFPlayerZedSuicideCamera extends GameFixedCamera;
/** Initial camera location for a smooth transition */
var vector InitialCameraLocation;
/** Location offset from focal point base */
var vector CameraOffset;
/** Speed to interpolate from the initial location to the desired location */
var float CameraInterpSpeed;
/** Our desired location */
var vector DesiredLocation;
/** Our desired rotation */
var rotator DesiredRotation;
/** Angle to pitch the camera at */
var int CameraPitchAngle;
/** Multiplier used to control how fast the camera pans */
var float CameraPanSpeed;
/** Interpolated camera yaw */
var int CameraPanYaw;
/** Desired FOV for the camera */
var float CameraFOV;
/** Speed to reach the desired FOV */
var float CameraFOVInterpSpeed;
/** Our interpolated FOV value */
var float InterpolatedFOV;
/** How much to offset the camera by if a trace hits the ceiling */
var float CameraCollisionZOffset;
/** Called when the camera becomes active */
function OnBecomeActive( GameCameraBase OldCamera )
{
super.OnBecomeActive( OldCamera );
}
/** Sets our initial values. Needs to be done immediately upon switch, because UpdateCamera() is a frame behind */
function InitSuicideCam( vector PawnLocation )
{
CameraOffset = default.CameraOffset;
InitialCameraLocation = PlayerCamera.CameraCache.POV.Location;
DesiredRotation = rotator( InitialCameraLocation - PawnLocation );
DesiredRotation.Pitch = CameraPitchAngle;
CameraPanYaw = PlayerCamera.CameraCache.POV.Rotation.Yaw;
// Set our initial camera targets
PlayerCamera.PCOwner.SetLocation( InitialCameraLocation );
PlayerCamera.PCOwner.SetViewTarget( PlayerCamera.PCOwner );
InterpolatedFOV = PlayerCamera.CameraCache.POV.FOV;
UpdateCameraFocalPoint();
}
/** Gets a new focal point for the camera */
function UpdateCameraFocalPoint()
{
local Actor TraceActor;
local vector HitLocation, HitNormal;
// Make sure the camera is in a valid location
TraceActor = PlayerCamera.PCOwner.Pawn != none ? PlayerCamera.PCOwner.Pawn : PlayerCamera.PCOwner;
TraceActor.Trace( HitLocation, HitNormal, InitialCameraLocation + (vect(0,0,1) * (default.CameraOffset.Z + CameraCollisionZOffset)), InitialCameraLocation, false, vect(5,5,5),, TraceActor.TRACEFLAG_Bullet );
// Offset it if we would have been inside geometry
if( !IsZero(HitLocation) )
{
CameraOffset.Z = VSize( HitLocation - InitialCameraLocation ) - CameraCollisionZOffset;
}
else
{
CameraOffset = default.CameraOffset;
}
DesiredLocation = InitialCameraLocation + CameraOffset;
}
/** Expected to fill in OutVT with new camera pos/loc/fov. */
simulated function UpdateCamera( Pawn P, GamePlayerCamera CameraActor, float DeltaTime, out TViewTarget OutVT )
{
super(GameCameraBase).UpdateCamera( P, CameraActor, DeltaTime, OutVT );
if( DesiredLocation == vect(0,0,0) || InitialCameraLocation == vect(0,0,0) )
{
return;
}
// Cameraanims, fades, etc
PlayerCamera.ApplyCameraModifiers( DeltaTime, OutVT.POV );
// Set view location and rotation
OutVT.POV.Location = VInterpTo( OutVT.POV.Location, DesiredLocation, DeltaTime, CameraInterpSpeed );
OutVT.POV.Rotation = RInterpTo( OutVT.POV.Rotation, DesiredRotation, DeltaTime, CameraInterpSpeed );
CameraPanYaw = ( CameraPanYaw + (CameraPanSpeed * DeltaTime) ) & 65535;
OutVT.POV.Rotation.Yaw = CameraPanYaw;
OutVT.POV.Rotation.Roll = 0;
// Set FOV
InterpolatedFOV = FInterpTo( InterpolatedFOV, CameraFOV, DeltaTime, CameraFOVInterpSpeed );
OutVT.POV.FOV = InterpolatedFOV;
}
/** Called when the camera becomes inactive */
function OnBecomeInActive( GameCameraBase NewCamera )
{
super.OnBecomeInactive( NewCamera );
InitialCameraLocation = vect(0,0,0);
DesiredLocation = vect(0,0,0);
}
defaultproperties
{
CameraOffset=(X=0,Y=0,Z=300.f)
CameraInterpSpeed=2.f
CameraPanSpeed=1024.f
CameraPitchAngle=-12000
CameraFOV=160.f
CameraFOVInterpSpeed=1.f
CameraCollisionZOffset=40.f
}