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

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
}