188 lines
5.4 KiB
Ucode
188 lines
5.4 KiB
Ucode
//=============================================================================
|
|
// KFWeldableActor
|
|
//=============================================================================
|
|
// Base class or any placeable actor that can be welded.
|
|
//=============================================================================
|
|
// Killing Floor 2
|
|
// Copyright (C) 2018 Tripwire Interactive LLC
|
|
//=============================================================================
|
|
class KFWeldableActor extends Actor
|
|
abstract
|
|
implements(Interface_NavigationHandle)
|
|
native
|
|
nativeReplication;
|
|
|
|
/** Basic template for Particle Systems that contain relative offsets. */
|
|
struct native FXTemplate
|
|
{
|
|
/** Particle system template to spawn */
|
|
var() ParticleSystem ParticleTemplate;
|
|
/** Offset from base location that particle system should spawn from. */
|
|
var() vector RelativeOffset;
|
|
/** Offset from base rotation that particle system should spawn from. */
|
|
var() rotator RelativeRotation;
|
|
};
|
|
|
|
/*********************************************************************************************
|
|
* @name Weld Health
|
|
********************************************************************************************* */
|
|
|
|
// WeldIntegrity, RepairProgress, and DemoWeld are now replicated through this KFWeldableComponent
|
|
var repnotify transient KFWeldableComponent WeldableComponent;
|
|
|
|
var MaterialInstanceConstant IntegrityMIC;
|
|
|
|
/** Whether or not to start welded */
|
|
var() bool bStartWelded;
|
|
/** Amount of damage a welded door can take */
|
|
var() int MaxWeldIntegrity;
|
|
/** Current integrity of a welded door */
|
|
var transient int WeldIntegrity;
|
|
|
|
/** The minimum weld scalar a door can have so a weld will always be visible */
|
|
var const float MinWeldScalar;
|
|
|
|
/** Last time door weld integrity increased */
|
|
var transient float LastWeldTime;
|
|
/** Last time door weld integrity decreased */
|
|
var transient float LastUnweldTime;
|
|
|
|
/** Pawn currently welding */
|
|
var transient KFPawn WelderPawn;
|
|
|
|
/** True if the door has health less than 0 and is off its hinges */
|
|
var repnotify transient bool bIsDestroyed;
|
|
|
|
/** Amount of "explosive" weld needed */
|
|
var int DemoWeldRequired;
|
|
/** Current amount of "explosive" weld */
|
|
var transient int DemoWeld;
|
|
|
|
/*********************************************************************************************
|
|
* @name Repair
|
|
********************************************************************************************* */
|
|
|
|
/** Percent of repair complete from 0-255 */
|
|
var byte RepairProgress;
|
|
|
|
/** When set to TRUE, notifies clients that door needs to be repaired */
|
|
var repnotify transient bool bWasRepaired;
|
|
|
|
/** Particle effect spawned when a door has been fully repaired */
|
|
var() FXTemplate RepairFXTemplate;
|
|
|
|
/** Repair sound event */
|
|
var() AkEvent RepairSound;
|
|
|
|
/*********************************************************************************************
|
|
* @name UI
|
|
********************************************************************************************* */
|
|
|
|
/** UI icon used for welder */
|
|
var protected Texture2D WelderIcon;
|
|
|
|
/** Offset from door location (bottom) to closer to eye level for UI, FX, sounds, etc */
|
|
var transient vector WeldUILocation;
|
|
|
|
/** Localized strings */
|
|
var localized string WeldIntegrityString;
|
|
var localized string RepairProgressString;
|
|
|
|
replication
|
|
{
|
|
if ( bNetDirty )
|
|
bIsDestroyed, bWasRepaired, WeldableComponent;
|
|
}
|
|
|
|
simulated event ReplicatedEvent(name VarName)
|
|
{
|
|
if (VarName == nameof(bIsDestroyed))
|
|
{
|
|
if (bIsDestroyed)
|
|
{
|
|
PlayDestroyed();
|
|
}
|
|
}
|
|
else if (VarName == nameOf(bWasRepaired))
|
|
{
|
|
if (bWasRepaired)
|
|
{
|
|
CompleteRepair();
|
|
}
|
|
}
|
|
else if (VarName == nameof(WeldableComponent))
|
|
{
|
|
InitializeWeldableComponent();
|
|
}
|
|
else
|
|
{
|
|
super.ReplicatedEvent(VarName);
|
|
}
|
|
}
|
|
|
|
cpptext
|
|
{
|
|
INT* GetOptimizedRepList(BYTE* InDefault, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map, UActorChannel* Channel);
|
|
|
|
/** IMPLEMENT Interface_NavigationHandle */
|
|
virtual UBOOL CanCoverSlip(ACoverLink* Link, INT SlotIdx);
|
|
virtual void SetupPathfindingParams( FNavMeshPathParams& out_ParamCache );
|
|
virtual void InitForPathfinding() {}
|
|
virtual INT ExtraEdgeCostToAddWhenActive(FNavMeshEdgeBase* Edge) { return 0; }
|
|
virtual FVector GetEdgeZAdjust(FNavMeshEdgeBase* Edge);
|
|
}
|
|
|
|
simulated event PostBeginPlay()
|
|
{
|
|
super.PostBeginPlay();
|
|
|
|
WeldUILocation = Location + (vect(0, 0, 1) * 164.f);
|
|
|
|
if (Role == ROLE_Authority)
|
|
{
|
|
WeldableComponent = Spawn(class'KFWeldableComponent', self);
|
|
InitializeWeldableComponent();
|
|
}
|
|
}
|
|
|
|
simulated function InitializeWeldableComponent();
|
|
function FastenWeld(int Amount, optional KFPawn Welder);
|
|
|
|
simulated function UpdateWeldIntegrity(int Amount)
|
|
{
|
|
WeldIntegrity = Clamp(WeldIntegrity + Amount, 0, MaxWeldIntegrity);
|
|
UpdateIntegrityMIC();
|
|
}
|
|
|
|
function Repair(float Amount, optional KFPawn Welder);
|
|
simulated function CompleteRepair();
|
|
simulated function UpdateIntegrityMIC();
|
|
simulated function PlayDestroyed();
|
|
|
|
function bool BeingWelded()
|
|
{
|
|
return (LastWeldTime > LastUnweldTime) && (`TimeSince(LastWeldTime) < 0.75f);
|
|
}
|
|
|
|
function bool BeingUnwelded()
|
|
{
|
|
return (LastUnweldTime > LastWeldTime) && (`TimeSince(LastUnweldTime) < 0.75f);
|
|
}
|
|
|
|
function bool CanExplosiveWeld()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
function AddExplosiveWeld(int Amount, KFPlayerController PC)
|
|
{
|
|
DemoWeld = Min(DemoWeld + Amount, DemoWeldRequired);
|
|
}
|
|
|
|
event NotifyPathChanged();
|
|
|
|
defaultproperties
|
|
{
|
|
|
|
}
|