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

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
{
}