165 lines
3.9 KiB
Ucode
165 lines
3.9 KiB
Ucode
//=============================================================================
|
|
// KFDoorTrigger
|
|
//=============================================================================
|
|
// Simple trigger used for doors to bypass kismet
|
|
//=============================================================================
|
|
// Killing Floor 2
|
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
|
// - Andrew "Strago" Ladenberger
|
|
//=============================================================================
|
|
class KFDoorTrigger extends KFTrigger_ChokePoint
|
|
placeable
|
|
native
|
|
implements(KFInterface_Usable);
|
|
|
|
/** reference to actor to play open/close animations */
|
|
var() KFDoorActor DoorActor;
|
|
|
|
cpptext
|
|
{
|
|
#if WITH_EDITOR
|
|
virtual void CheckForErrors(); // Skip 'Trigger is not referenced' warning
|
|
#endif
|
|
}
|
|
|
|
simulated event PostBeginPlay()
|
|
{
|
|
/** Set our door actors trigger reference to be us */
|
|
if( DoorActor != none )
|
|
{
|
|
DoorActor.DoorTrigger = self;
|
|
}
|
|
}
|
|
|
|
simulated event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal)
|
|
{
|
|
local KFPawn_Scripted ScriptedPawn;
|
|
|
|
Super.Touch(Other, OtherComp, HitLocation, HitNormal);
|
|
if( Role == ROLE_Authority )
|
|
{
|
|
class'KFPlayerController'.static.UpdateInteractionMessages( Other );
|
|
|
|
// touched a scripted pawn
|
|
ScriptedPawn = KFPawn_Scripted(Other);
|
|
if (ScriptedPawn != none && DoorActor != none)
|
|
{
|
|
// disable closing the door while the scripted pawn is moving through
|
|
DoorActor.bCanCloseDoor = false;
|
|
|
|
// if the door is closed, tell the scripted pawn to wait until the door is opened
|
|
if (!DoorActor.bIsDoorOpen && !DoorActor.bIsDestroyed)
|
|
{
|
|
ScriptedPawn.StartDoorWait(DoorActor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated event UnTouch(Actor Other)
|
|
{
|
|
local KFPawn_Scripted ScriptedPawn;
|
|
|
|
super.UnTouch( Other );
|
|
if( Role == ROLE_Authority )
|
|
{
|
|
class'KFPlayerController'.static.UpdateInteractionMessages( Other );
|
|
|
|
// stopped touched a scripted pawn
|
|
ScriptedPawn = KFPawn_Scripted(Other);
|
|
if (ScriptedPawn != none && DoorActor != none)
|
|
{
|
|
// tell the door that it can be closed again
|
|
DoorActor.bCanCloseDoor = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/** Update interaction message (toggle between use and repair) */
|
|
function OnDestroyOrReset()
|
|
{
|
|
local KFPawn_Human P;
|
|
|
|
foreach TouchingActors(class'KFPawn_Human', P)
|
|
{
|
|
class'KFPlayerController'.static.UpdateInteractionMessages( P );
|
|
}
|
|
}
|
|
|
|
simulated function bool GetIsUsable( Pawn User )
|
|
{
|
|
local bool bCanRepairDoors;
|
|
local KFPawn KFP;
|
|
|
|
KFP = KFPawn( User );
|
|
bCanRepairDoors = ( KFP != none && KFP.GetPerk() != none && KFP.GetPerk().CanRepairDoors() );
|
|
if ( DoorActor != None && (bCanRepairDoors || !DoorActor.bIsDestroyed) )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function int GetInteractionIndex( Pawn User )
|
|
{
|
|
if ( DoorActor.bIsDestroyed )
|
|
{
|
|
return IMT_RepairDoor;
|
|
}
|
|
else if( DoorActor.WeldIntegrity > 0 )
|
|
{
|
|
if( User.Weapon != none && User.Weapon.Class.Name == 'KFWeap_Welder' )
|
|
{
|
|
return INDEX_NONE;
|
|
}
|
|
|
|
return IMT_UseDoorWelded;
|
|
|
|
}
|
|
else
|
|
{
|
|
return IMT_UseDoor;
|
|
}
|
|
}
|
|
|
|
function bool UsedBy(Pawn User)
|
|
{
|
|
if ( GetIsUsable( User ) )
|
|
{
|
|
DoorActor.UseDoor(User);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
simulated function bool CanRestoreChokeCollision(KFPawn_Monster KFPM)
|
|
{
|
|
// If the door is closed, restore our collision
|
|
if( !DoorActor.IsCompletelyOpen() )
|
|
{
|
|
return true;
|
|
}
|
|
return super.CanRestoreChokeCollision(KFPM);
|
|
}
|
|
|
|
simulated function bool CanReduceTeammateCollision()
|
|
{
|
|
return bReduceTeammateCollision && DoorActor.IsCompletelyOpen();
|
|
}
|
|
|
|
simulated function bool PartialReduceTeammateCollision()
|
|
{
|
|
return bReduceTeammateCollision && DoorActor.WeldIntegrity > 0 && DoorActor.Health > 0;
|
|
}
|
|
|
|
DefaultProperties
|
|
{
|
|
Begin Object NAME=CollisionCylinder LegacyClassName=Trigger_TriggerCylinderComponent_Class
|
|
CollisionRadius=+00200.000000
|
|
CollisionHeight=+00100.000000
|
|
End Object
|
|
|
|
bProjTarget=false
|
|
}
|