448 lines
12 KiB
Ucode
448 lines
12 KiB
Ucode
|
//=============================================================================
|
||
|
// KFDebugCameraController
|
||
|
//=============================================================================
|
||
|
// Controller used when using the ToggleDebugCamera console command
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
|
||
|
class KFDebugCameraController extends DebugCameraController
|
||
|
config(Input)
|
||
|
native(Controller);
|
||
|
|
||
|
/** Debug scene related properties */
|
||
|
var bool bDebugSceneEnabled;
|
||
|
var KFSceneCaptureDebugCam DebugSceneCamera;
|
||
|
var bool bViewFromFocus;
|
||
|
var KFPawn_Monster SelectedKFPawn;
|
||
|
var bool bForceSprinting;
|
||
|
var float SelectedNPCMoveOffset;
|
||
|
var bool bMoveToActorOnly;
|
||
|
var AIDebugGoal DebugGoal;
|
||
|
var KFPawn_Monster DebugTarget;
|
||
|
|
||
|
native function PrimarySelect( vector HitLoc, vector HitNormal, TraceHitInfo HitInfo );
|
||
|
|
||
|
/**
|
||
|
* Called when an actor has been selected with the secondary key (e.g. right mouse button).
|
||
|
*
|
||
|
* @param HitLoc World-space position of the selection point.
|
||
|
* @param HitNormal World-space normal of the selection point.
|
||
|
* @param HitInfo Info struct for the selection point.
|
||
|
*/
|
||
|
native function SecondarySelect( vector HitLoc, vector HitNormal, TraceHitInfo HitInfo );
|
||
|
|
||
|
/**
|
||
|
* Called when the user pressed the unselect key, just before the selected actor is cleared.
|
||
|
*/
|
||
|
native function Unselect();
|
||
|
|
||
|
simulated event PostBeginPlay()
|
||
|
{
|
||
|
local HUD NewHUD;
|
||
|
|
||
|
NewHUD = Spawn( HUDClass, self);
|
||
|
|
||
|
if( OriginalControllerRef != none && OriginalControllerRef.myHUD.PostRenderedActors.Length > 0 )
|
||
|
{
|
||
|
NewHUD.PostRenderedActors = OriginalControllerRef.myHUD.PostRenderedActors;
|
||
|
NewHUD.bShowOverlays = true;
|
||
|
}
|
||
|
|
||
|
if( myHUD != none && myHUD.PostRenderedActors.Length > 0 )
|
||
|
{
|
||
|
NewHUD.PostRenderedActors = myHUD.PostRenderedActors;
|
||
|
NewHUD.bShowOverlays = true;
|
||
|
}
|
||
|
|
||
|
super(GamePlayerController).PostBeginPlay();
|
||
|
|
||
|
// if hud is existing, delete it and create new hud for debug camera
|
||
|
if ( NewHUD != None )
|
||
|
{
|
||
|
if( myHUD != none )
|
||
|
{
|
||
|
myHUD.Destroy();
|
||
|
}
|
||
|
myHUD = NewHuD;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function called on deactivation debug camera controller
|
||
|
*/
|
||
|
function OnDeactivate( PlayerController PC )
|
||
|
{
|
||
|
if( DrawFrustum != none )
|
||
|
{
|
||
|
DrawFrustum.SetHidden( true );
|
||
|
PC.PlayerCamera.DetachComponent( DrawFrustum );
|
||
|
}
|
||
|
PC.SetHidden( true );
|
||
|
PC.PlayerCamera.SetHidden( true );
|
||
|
}
|
||
|
|
||
|
function DisableDebugCamera()
|
||
|
{
|
||
|
if( OriginalControllerRef != none )
|
||
|
{
|
||
|
if( myHUD.PostRenderedActors.Length > 0 )
|
||
|
{
|
||
|
OriginalControllerRef.myHUD.PostRenderedActors = myHUD.PostRenderedActors;
|
||
|
}
|
||
|
|
||
|
Super.DisableDebugCamera();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Function called on activation debug camera controller
|
||
|
*/
|
||
|
function OnActivate( PlayerController PC )
|
||
|
{
|
||
|
//super.OnActivate( PC ); //?
|
||
|
bCollideWorld = false;
|
||
|
|
||
|
if ( KFDebugCameraHUD(myHUD) != None )
|
||
|
{
|
||
|
KFDebugCameraHUD(myHUD).bDrawDebugText = bDrawDebugText;
|
||
|
if( OriginalControllerRef.myHUD.PostRenderedActors.Length > 0 )
|
||
|
{
|
||
|
KFDebugCameraHUD(myHUD).PostRenderedactors = OriginalControllerRef.myHUD.PostRenderedActors;
|
||
|
KFDebugCameraHUD(myHUD).bShowOverlays = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PC.SetHidden(false);
|
||
|
PC.PlayerCamera.SetHidden(false);
|
||
|
}
|
||
|
|
||
|
function AddCheats(optional bool bForce)
|
||
|
{
|
||
|
// Assuming that this never gets called for NM_Client without bForce=true
|
||
|
if ( (CheatManager == None) && (WorldInfo.Game != None) && WorldInfo.Game.AllowCheats(self) || bForce)
|
||
|
{
|
||
|
CheatManager = new(Self) CheatClass;
|
||
|
CheatManager.InitCheatManager();
|
||
|
KFCheatManager(CheatManager).bDebugSceneEnabled = bDebugSceneEnabled;
|
||
|
KFCheatManager(CheatManager).DebugSceneCamera = DebugSceneCamera;
|
||
|
KFCheatManager(CheatManager).DebugTarget = DebugTarget;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function AICommand_Debug GetDebugCommand( KFPawn DebugPawn )
|
||
|
{
|
||
|
local AICommand_Debug DebugCommand;
|
||
|
local KFAIController KFAIC;
|
||
|
|
||
|
if( DebugPawn == none || DebugPawn.Controller == none|| DebugPawn.IsAliveAndWell() )
|
||
|
{
|
||
|
return none;
|
||
|
}
|
||
|
KFAIC = KFAIController( DebugPawn.Controller );
|
||
|
if( KFAIC != none && KFAIC.bHasDebugCommand )
|
||
|
{
|
||
|
DebugCommand = KFAIC.FindCommandOfClass( class'AICommand_Debug' );
|
||
|
if( DebugCommand != none )
|
||
|
{
|
||
|
return DebugCommand;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return none;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Attempts to match the name passed in to a SeqEvent_Console
|
||
|
* object and then activate it.
|
||
|
* Overridden to pass in the PlayerController's disembodied pawn while in debug mode
|
||
|
* since the DebugCameraController has no pawn to send to CheckActivate().
|
||
|
*
|
||
|
* @param eventName - name of the event to cause
|
||
|
*/
|
||
|
unreliable server function ServerCauseEvent(Name EventName)
|
||
|
{
|
||
|
local array<SequenceObject> AllConsoleEvents;
|
||
|
local SeqEvent_Console ConsoleEvt;
|
||
|
local Sequence GameSeq;
|
||
|
local int Idx;
|
||
|
local bool bFoundEvt;
|
||
|
local PlayerController PC;
|
||
|
local DebugCameraController DCC;
|
||
|
|
||
|
// Get the gameplay sequence.
|
||
|
GameSeq = WorldInfo.GetGameSequence();
|
||
|
if ( (GameSeq != None) && (EventName != '') )
|
||
|
{
|
||
|
// Find all SeqEvent_Console objects anywhere.
|
||
|
GameSeq.FindSeqObjectsByClass(class'SeqEvent_Console', TRUE, AllConsoleEvents);
|
||
|
|
||
|
// Iterate over them, seeing if the name is the one we typed in.
|
||
|
for( Idx=0; Idx < AllConsoleEvents.Length; Idx++ )
|
||
|
{
|
||
|
ConsoleEvt = SeqEvent_Console(AllConsoleEvents[Idx]);
|
||
|
if (ConsoleEvt != None &&
|
||
|
EventName == ConsoleEvt.ConsoleEventName)
|
||
|
{
|
||
|
bFoundEvt = TRUE;
|
||
|
foreach WorldInfo.AllControllers(class'PlayerController', PC)
|
||
|
{
|
||
|
if ( PC.bIsPlayer && PC.IsLocalPlayerController() )
|
||
|
{
|
||
|
DCC = DebugCameraController(PC);
|
||
|
if( DCC != none && DCC.OriginalControllerRef != none )
|
||
|
{
|
||
|
// activate the event
|
||
|
ConsoleEvt.CheckActivate( self, DCC.OriginalControllerRef.Pawn );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (!bFoundEvt)
|
||
|
{
|
||
|
ListConsoleEvents();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exec function AIMoveForward()
|
||
|
{
|
||
|
local AICommand_Debug DebugCommand;
|
||
|
|
||
|
if( SelectedKFPawn != none )
|
||
|
{
|
||
|
DebugCommand = GetDebugCommand( SelectedKFPawn );
|
||
|
if( DebugCommand != none )
|
||
|
{
|
||
|
DebugCommand.Debug_MoveForward();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
KFCheatManager( CheatManager ).AIMoveForward();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exec function AIShowSelectedInfo()
|
||
|
{
|
||
|
bShowSelectedInfo = !bShowSelectedInfo;
|
||
|
}
|
||
|
|
||
|
exec function ToggleDebugViewFocus()
|
||
|
{
|
||
|
KFDebugCameraHUD(myHUD).bFocusOnSelectedActor = !KFDebugCameraHUD(myHUD).bFocusOnSelectedActor;
|
||
|
KFDebugCameraHUD(myHUD).PlayerCamera = PlayerCamera;
|
||
|
}
|
||
|
|
||
|
exec function SetMoveOffset( optional float NewOffset=64.f )
|
||
|
{
|
||
|
ClientMessage( "MoveOffset of "$NewOffset$" units will be used for selected NPC" );
|
||
|
SelectedNPCMoveOffset = NewOffset;
|
||
|
}
|
||
|
|
||
|
exec function ToggleSelectedActorView()
|
||
|
{
|
||
|
bViewFromFocus = !bViewFromFocus;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* public function GetDebugSceneViewPoint()
|
||
|
* Used to get the orbit locations for the debug scene camera
|
||
|
* @param out_Location Location of current orbiting view point
|
||
|
* @param out_Rotation Rotation of current orbiting view point
|
||
|
*/
|
||
|
function GetDebugSceneViewPoint( out vector out_Location, out Rotator out_Rotation )
|
||
|
{
|
||
|
if( SelectedKFPawn != none )
|
||
|
{
|
||
|
out_Rotation = SelectedKFPawn.Rotation;
|
||
|
out_Rotation.Pitch -= 3000;
|
||
|
out_Rotation.Yaw = ( WorldInfo.TimeSeconds * 65536 ) / 10;
|
||
|
out_Location = ( SelectedKFPawn.Location + vect(0,0,72) ) - 220 * vector( out_Rotation );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** If PlayerCamera.bUseClientSideCameraUpdates is set, client will replicate camera positions to the server. */
|
||
|
// @TODO - combine pitch/yaw into one int, maybe also send location compressed
|
||
|
unreliable server function ServerUpdateCamera(vector CamLoc, int CamPitchAndYaw)
|
||
|
{
|
||
|
local TPOV NewPOV;
|
||
|
|
||
|
if( bViewFromFocus && SelectedActor != none )
|
||
|
{
|
||
|
GetDebugSceneViewPoint( NewPOV.Location, NewPOV.Rotation );
|
||
|
PlayerCamera.FillCameraCache(NewPOV);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
super.ServerUpdateCamera( CamLoc, CamPitchAndYaw );
|
||
|
}
|
||
|
// NewPOV.Location = CamLoc;
|
||
|
|
||
|
// NewPOV.Rotation.Yaw = (CamPitchAndYaw >> 16) & 65535;
|
||
|
// NewPOV.Rotation.Pitch = CamPitchAndYaw & 65535;
|
||
|
}
|
||
|
|
||
|
simulated event GetPlayerViewPoint( out vector out_Location, out Rotator out_Rotation )
|
||
|
{
|
||
|
local Actor TheViewTarget;
|
||
|
|
||
|
// sometimes the PlayerCamera can be none and we probably do not want this
|
||
|
// so we will check to see if we have a CameraClass. Having a CameraClass is
|
||
|
// saying: we want a camera so make certain one exists by spawning one
|
||
|
if( PlayerCamera == None )
|
||
|
{
|
||
|
if( CameraClass != None )
|
||
|
{
|
||
|
// Associate Camera with PlayerController
|
||
|
PlayerCamera = Spawn(CameraClass, Self);
|
||
|
if( PlayerCamera != None )
|
||
|
{
|
||
|
PlayerCamera.InitializeFor( Self );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`log("Couldn't Spawn Camera Actor for Player!!");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if( bViewFromFocus && SelectedActor != none )
|
||
|
{
|
||
|
GetDebugSceneViewPoint( out_Location, out_Rotation );
|
||
|
// PlayerCamera.FillCameraCache(NewPOV);
|
||
|
}
|
||
|
else
|
||
|
if( PlayerCamera != None )
|
||
|
{
|
||
|
PlayerCamera.GetCameraViewPoint(out_Location, out_Rotation);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TheViewTarget = GetViewTarget();
|
||
|
|
||
|
if( TheViewTarget != None )
|
||
|
{
|
||
|
out_Location = TheViewTarget.Location;
|
||
|
out_Rotation = TheViewTarget.Rotation;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
super.GetPlayerViewPoint(out_Location, out_Rotation);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function bool NativeInputKey( int ControllerId, name Key, EInputEvent Event, float AmountDepressed = 1.f, bool bGamepad = FALSE )
|
||
|
{
|
||
|
local vector CamLoc, ZeroVec;
|
||
|
local rotator CamRot;
|
||
|
local TraceHitInfo HitInfo;
|
||
|
local Actor HitActor;
|
||
|
local vector HitLoc, HitNormal;
|
||
|
local bool bIsSprinting;
|
||
|
|
||
|
CamLoc = PlayerCamera.CameraCache.POV.Location;
|
||
|
CamRot = PlayerCamera.CameraCache.POV.Rotation;
|
||
|
|
||
|
if ( Key == PrimaryKey )
|
||
|
{
|
||
|
HitActor = Trace(HitLoc, HitNormal, vector(camRot) * 5000 * 20 + CamLoc, CamLoc, true, ZeroVec, HitInfo);
|
||
|
if( HitActor != None && KFPawn_Monster(HitActor) != none )
|
||
|
{
|
||
|
// if( SelectedKFPawn != none )
|
||
|
// {
|
||
|
// myHuD.PostRenderedActors.RemoveItem(SelectedKFPawn.MyKFAIC);
|
||
|
// }
|
||
|
SelectedActor = HitActor;
|
||
|
SelectedKFPawn = KFPawn_Monster(HitActor);
|
||
|
PrimarySelect( HitLoc, HitNormal, HitInfo );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
else if( Key == 'P' && Event == IE_Pressed && SelectedActor != none )
|
||
|
{
|
||
|
SelectedKFPawn.bIsSprinting = !SelectedKFPawn.bIsSprinting;
|
||
|
bIsSprinting = SelectedKFPawn.bIsSprinting;
|
||
|
if( bIsSprinting )
|
||
|
{
|
||
|
ClientMessage( SelectedKFPawn$": Sprinting turned on" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ClientMessage( SelectedKFPawn$" : Sprinting turned off" );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
if( Key == 'L' && Event == IE_Pressed && SelectedActor != none )
|
||
|
{
|
||
|
ToggleSelectedActorView();
|
||
|
return true;
|
||
|
}
|
||
|
if( Key == 'T' && Event == IE_Pressed && SelectedActor != none )
|
||
|
{
|
||
|
SelectedKFPawn.LookAtPawn(GetALocalPlayerController().Pawn);
|
||
|
return true;
|
||
|
}
|
||
|
if( Key == 'Z' && Event == IE_Pressed )
|
||
|
{
|
||
|
KFCheatManager(CheatManager).TeleportPawnToCamera();
|
||
|
return true;
|
||
|
}
|
||
|
if( Key == 'H' && Event == IE_Pressed )
|
||
|
{
|
||
|
KFDebugCameraHUD( myHUD ).ToggleHelpDisplay();
|
||
|
return true;
|
||
|
}
|
||
|
if( Key == 'R' && Event == IE_Pressed && SelectedActor != none )
|
||
|
{
|
||
|
HitActor = Trace(HitLoc, HitNormal, vector(camRot) * 5000 * 20 + CamLoc, CamLoc, true, ZeroVec, HitInfo);
|
||
|
SelectedKFPawn.MyKFAIC.Focus = none;
|
||
|
SelectedKFPawn.MyKFAIC.SetFocalPoint( HitLoc + HitNormal * 4.f );
|
||
|
return true;
|
||
|
}
|
||
|
if ( Key == SecondaryKey && Event == IE_Pressed && SelectedActor != none )
|
||
|
{
|
||
|
HitActor = Trace(HitLoc, HitNormal, vector(camRot) * 5000 * 20 + CamLoc, CamLoc, false, ZeroVec, HitInfo);
|
||
|
if( HitActor == none || HitActor.bWorldGeometry )
|
||
|
{
|
||
|
HitLoc += HitNormal * 4.0;
|
||
|
SelectedKFPawn.MyKFAIC.StopAllLatentMovement();
|
||
|
SelectedKFPawn.ZeroMovementVariables();
|
||
|
if( bMoveToActorOnly )
|
||
|
{
|
||
|
ClientMessage( "Attempting move to goal "$DebugGoal$". You can set bMoveToActorOnly to use move to location method instead." );
|
||
|
|
||
|
if( DebugGoal == none )
|
||
|
{
|
||
|
DebugGoal = Spawn(class'AIDebugGoal', self,, HitLoc );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DebugGoal.SetLocation( HitLoc );
|
||
|
}
|
||
|
// SelectedKFPawn.MyKFAIC.SetMoveGoal( DebugGoal,, false, SelectedNPCMoveOffset, false, true, true );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ClientMessage( "Attempting move to location "$HitLoc$". You can set bMoveToActorOnly to true to use move to goal actor method instead." );
|
||
|
//SelectedKFPawn.MyKFAIC.SetMovePoint( HitLoc,, false, SelectedNPCMoveOffset, false, false, true );
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
DefaultProperties
|
||
|
{
|
||
|
HUDClass=class'KFDebugCameraHUD'
|
||
|
CheatClass=class'KFGame.KFCheatManager'
|
||
|
InputClass=class'KFGame.KFDebugCameraInput'
|
||
|
bMoveToActorOnly=true
|
||
|
}
|