150 lines
4.5 KiB
Ucode
150 lines
4.5 KiB
Ucode
//=============================================================================
|
|
// KFBossCamera
|
|
//=============================================================================
|
|
// Camera for third person
|
|
//=============================================================================
|
|
// Killing Floor 2
|
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
|
//=============================================================================
|
|
|
|
class KFBossCamera extends GameCameraBase;
|
|
|
|
struct CameraOffsets
|
|
{
|
|
var vector ViewOffset;
|
|
var vector RotOffset;
|
|
var int CameraDistance;
|
|
};
|
|
|
|
var CameraOffsets BaseOffsets;
|
|
var CameraOffsets BackupOffsets;
|
|
var CameraOffsets DeadOffsets;
|
|
|
|
var PointLightComponent PointLightTemplate;
|
|
var transient PointLightComponent PointLight;
|
|
|
|
var KFInterface_MonsterBoss ViewedBoss;
|
|
|
|
/** Called when the camera becomes inactive */
|
|
function OnBecomeActive( GameCameraBase NewCamera )
|
|
{
|
|
if ( PointLight == None && PointLightTemplate != None )
|
|
{
|
|
PointLight = new(self) Class'PointLightComponent' (PointLightTemplate);
|
|
PointLight.SetEnabled(true);
|
|
}
|
|
}
|
|
|
|
/** Called when the camera becomes inactive */
|
|
function OnBecomeInActive( GameCameraBase NewCamera )
|
|
{
|
|
if( PlayerCamera != none && PlayerCamera.PCOwner != none && PlayerCamera.PCOwner.Pawn != none )
|
|
{
|
|
PlayerCamera.PCOwner.SetViewTarget(PlayerCamera.PCOwner.Pawn);
|
|
}
|
|
|
|
if ( PointLight != None )
|
|
{
|
|
if( ViewedBoss != none )
|
|
{
|
|
ViewedBoss.GetMonsterPawn().DetachComponent(PointLight);
|
|
}
|
|
PointLight.SetEnabled(false);
|
|
PointLight = none;
|
|
}
|
|
|
|
ViewedBoss = none;
|
|
}
|
|
|
|
/**
|
|
* Player Update Camera code
|
|
*/
|
|
function UpdateCamera(Pawn P, GamePlayerCamera CameraActor, float DeltaTime, out TViewTarget OutVT)
|
|
{
|
|
local vector Loc, X,Y,Z;
|
|
local rotator Rot;
|
|
local CameraOffsets FinalOffsets;
|
|
|
|
if (ViewedBoss == none)
|
|
{
|
|
ViewedBoss = KFInterface_MonsterBoss(P);
|
|
}
|
|
|
|
if( P != none && PointLight != none && !PointLight.bAttached )
|
|
{
|
|
if(ViewedBoss != none )
|
|
{
|
|
ViewedBoss.GetMonsterPawn().AttachComponent(PointLight);
|
|
}
|
|
PointLight.SetTranslation( Loc - OutVT.Target.Location );
|
|
}
|
|
|
|
if(ViewedBoss != none && ViewedBoss.UseAnimatedBossCamera() && ViewedBoss.GetBossCameraSocket() != '' )
|
|
{
|
|
ViewedBoss.GetMonsterPawn().Mesh.GetSocketWorldLocationAndRotation( ViewedBoss.GetBossCameraSocket(), Loc, Rot );
|
|
GetAxes( Rot, X,Y,Z );
|
|
Loc += X * ViewedBoss.GetBossCameraOffset().X + Y * ViewedBoss.GetBossCameraOffset().Y + Z * ViewedBoss.GetBossCameraOffset().Z;
|
|
OutVT.POV.Location = Loc;
|
|
OutVT.POV.Rotation = Rot;
|
|
|
|
// Apply our animated camera
|
|
PlayerCamera.ApplyCameraModifiers( DeltaTime, OutVT.POV );
|
|
}
|
|
else
|
|
{
|
|
FinalOffsets = ( P != none && P.IsAliveAndWell() ) ? BaseOffsets : DeadOffsets;
|
|
if( !GetOffsets(OutVT.Target, CameraActor, FinalOffsets, Loc, Rot) )
|
|
{
|
|
GetOffsets(OutVT.Target, CameraActor, BackupOffsets, Loc, Rot);
|
|
}
|
|
|
|
OutVT.POV.Location = Loc;
|
|
OutVT.POV.Rotation = Rot;
|
|
}
|
|
}
|
|
|
|
/** Get the necessary offsets for the different possible camera types, return whether there is an actor in the way of our desired location */
|
|
function bool GetOffsets( Actor Target, GamePlayerCamera CameraActor, out CameraOffsets InOffsets, out vector InLoc, out rotator InRot)
|
|
{
|
|
local vector Pos, HitLocation, HitNormal;
|
|
local Actor HitActor;
|
|
|
|
InLoc = Target.Location;
|
|
InRot = Target.Rotation;
|
|
|
|
InRot.Yaw += InOffsets.RotOffset.X;
|
|
InRot.Pitch += InOffsets.RotOffset.Y;
|
|
|
|
InLoc += InOffsets.ViewOffset >> InRot;
|
|
Pos = InLoc - Vector(InRot) * InOffsets.CameraDistance;
|
|
|
|
// Try using the backup offsets if we the camera is in a wall
|
|
HitActor = CameraActor.Trace(HitLocation, HitNormal, Pos, InLoc, FALSE, vect(12,12,12));
|
|
|
|
InLoc = (HitActor == None) ? Pos : HitLocation;
|
|
|
|
return (HitActor == None);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
BaseOffsets=(ViewOffset=(X=0,Y=85,Z=90), RotOffset=(X=38000,Y=1200,Z=0), CameraDistance=250)
|
|
DeadOffsets=(ViewOffset=(X=0,Y=0,Z=-50), RotOffset=(X=38000,Y=-1500,Z=0), CameraDistance=200)
|
|
BackupOffsets=(ViewOffset=(X=0,Y=0,Z=65), RotOffset=(X=32768,Y=0,Z=0), CameraDistance=300)
|
|
|
|
Begin Object Class=PointLightComponent Name=PointLightTemplate_0
|
|
LightColor=(R=255,G=255,B=255,A=255)
|
|
Brightness=1.f
|
|
Radius=250.f
|
|
FalloffExponent=10.f
|
|
CastShadows=true
|
|
CastStaticShadows=true
|
|
CastDynamicShadows=true
|
|
bCastPerObjectShadows=false
|
|
bEnabled=FALSE
|
|
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
|
|
End Object
|
|
PointLightTemplate=PointLightTemplate_0
|
|
}
|
|
|