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

350 lines
9.1 KiB
Ucode

//=============================================================================
// KFTrigger_PowerUp
//=============================================================================
// Trigger used to activate a power up
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFTrigger_PowerUp extends Trigger_PawnsOnly
config(Game)
implements(KFInterface_Usable);
/** True when the powerup is activated */
var repnotify bool bPowerUpActivated;
/** True when the trigger is reactivated */
var repnotify bool bTriggerReactivated;
/** Can the trigger be activated to gain a power up */
var bool bCanBeActivated;
/** Use on all clients to spawn particles when the status changes */
var bool bCurrentActiveStatus;
/** Amount of time until the trigger can be reactivated */
var() float ReactivationTime;
/** Objective index for the event this is tied to */
var() int ObjectiveIndex;
/** Index of the event this is tied to */
var() int EventIndex;
/** Actor reference showing status */
var() InterpActor MeshActor;
/** Material index to change in the static mesh */
var() int MaterialIndex;
/** Material color parameter to change in the static mesh */
var() name MaterialParameterName;
/** Initial color for the actor reference */
var() LinearColor InitialColor;
/** Actvated color for the actor reference */
var() LinearColor ActivatedColor;
/** Delay for changing the material in the reactivation */
var() float ReactivationMaterialChangeDelay;
/** Sound to play upon activation */
var() AkEvent ActivationPowerUpSoundEvent;
/** Sound to play upon reactivation */
var() AkEvent ReactivationSoundEvent;
/** Particle effect to play upon activation */
var() ParticleSystem ActivationEffectTemplate;
/** Particle effect to play upon reactivation */
var() ParticleSystem ReactivationEffectTemplate;
/** Particle effect of the trigger that will be activated during the idle state */
var() Emitter IdleActiveParticleEffect;
/** Particle effect of the trigger that will be activated during the inactive state */
var() Emitter IdleInactiveParticleEffect;
enum EPowerUp_Type
{
EPowerUp_HellishRage,
};
var() EPowerUp_Type PowerUpOnActivation;
var() bool GivePowerUpToAllPlayers;
replication
{
if (bNetDirty)
bPowerUpActivated;
if(!bNetInitial && bNetDirty)
bTriggerReactivated;
}
simulated event ReplicatedEvent(name VarName)
{
if (VarName == 'bPowerUpActivated')
{
UpdateStatus();
}
else if (VarName == 'bTriggerReactivated')
{
ReactivateTrigger();
}
else
{
super.ReplicatedEvent(VarName);
}
}
simulated function PostBeginPlay()
{
super.PostBeginPlay();
if (WorldInfo.NetMode != NM_DedicatedServer)
{
if (MaterialIndex < MeshActor.StaticMeshComponent.Materials.Length)
{
MeshActor.StaticMeshComponent.CreateAndSetMaterialInstanceConstant(MaterialIndex);
}
if( IdleInactiveParticleEffect != None )
{
IdleInactiveParticleEffect.ParticleSystemComponent.SetActive(false);
}
UpdateStatus();
}
}
simulated function UpdateStatus()
{
local LinearColor ParamColor;
if ( WorldInfo.NetMode == NM_DedicatedServer )
{
return;
}
ParamColor = bPowerUpActivated ? ActivatedColor : InitialColor;
if(ReactivationMaterialChangeDelay > 0 && ParamColor == InitialColor)
{
SetTimer(ReactivationMaterialChangeDelay, false, nameof(ApplyInitialMaterial));
}
else if (MaterialInstance(MeshActor.StaticMeshComponent.GetMaterial(MaterialIndex)) != none)
{
MaterialInstance(MeshActor.StaticMeshComponent.GetMaterial(MaterialIndex)).SetVectorParameterValue(MaterialParameterName, ParamColor);
}
if( bCurrentActiveStatus != bPowerUpActivated )
{
bCurrentActiveStatus = bPowerUpActivated;
if( bCurrentActiveStatus && ActivationEffectTemplate != None )
{
WorldInfo.MyEmitterPool.SpawnEmitter(ActivationEffectTemplate, Location);
}
else if ( !bCurrentActiveStatus && ReactivationEffectTemplate != None )
{
WorldInfo.MyEmitterPool.SpawnEmitter(ReactivationEffectTemplate, Location);
}
if( IdleActiveParticleEffect != None )
{
IdleActiveParticleEffect.ParticleSystemComponent.SetActive(!bCurrentActiveStatus);
}
if( IdleInactiveParticleEffect != None )
{
IdleInactiveParticleEffect.ParticleSystemComponent.SetActive(bCurrentActiveStatus);
}
}
}
simulated function ApplyInitialMaterial()
{
MaterialInstance(MeshActor.StaticMeshComponent.GetMaterial(MaterialIndex)).SetVectorParameterValue(MaterialParameterName, InitialColor);
}
/** KFInterface_Usable */
simulated function bool GetIsUsable(Pawn User)
{
return bCanBeActivated && !KFGameReplicationInfo(KFGameInfo(WorldInfo.Game).GameReplicationInfo).bTraderIsOpen;
}
/** KFInterface_Usable */
simulated function int GetInteractionIndex(Pawn User)
{
return IMT_UsePowerUp;
}
/** HUD */
event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal)
{
super.Touch(Other, OtherComp, HitLocation, HitNormal);
class'KFPlayerController'.static.UpdateInteractionMessages(Other);
}
/** HUD */
event UnTouch(Actor Other)
{
super.UnTouch(Other);
class'KFPlayerController'.static.UpdateInteractionMessages(Other);
}
/** Handles trigger interaction */
function bool UsedBy(Pawn User)
{
if (bCanBeActivated)
{
//Set reactivation timer to prevent button spam
bCanBeActivated = false;
bPowerUpActivated = true;
UpdateStatus();
ActivatePowerUp(User);
SetTimer(ReactivationTime, false, 'ReactivateTrigger');
if(ActivationPowerUpSoundEvent != none)
{
PlaySoundBase(ActivationPowerUpSoundEvent, false, WorldInfo.NetMode == NM_DedicatedServer);
}
//Activate objective completion for turning on generator
TriggerObjectiveCompletion();
}
return true;
}
/** Handles trigger reactivation */
function ReactivateTrigger()
{
bPowerUpActivated = false;
bCanBeActivated = true;
UpdateStatus();
bTriggerReactivated = true;
bForceNetUpdate = true;
//Notify Kismet that the power up has been reactivated
NotifyTriggerReactivated();
if(ReactivationSoundEvent != none && WorldInfo.NetMode != NM_Client)
{
PlaySoundBase(ReactivationSoundEvent, false, WorldInfo.NetMode == NM_DedicatedServer);
}
}
function TriggerObjectiveCompletion()
{
local KFPlayercontroller KFPC;
local bool bIsObjectiveDataValid;
bIsObjectiveDataValid = ObjectiveIndex >= 0 && ObjectiveIndex < 5 && EventIndex > SEI_None && EventIndex < SEI_MAX;
foreach WorldInfo.AllControllers(class'KFPlayerController', KFPC)
{
KFPC.ClientOnTriggerUsed(class'KFTrigger_PowerUp');
if(bIsObjectiveDataValid)
{
KFPC.ClientOnTryCompleteObjective(ObjectiveIndex, EventIndex);
}
}
}
/** Handle activation of the power up */
function ActivatePowerUp(Pawn user)
{
local KFPlayerController KFPC;
//Notify Kismet that the power up has been activated
NotifyPowerUpActivated();
if(!GivePowerUpToAllPlayers)
{
if( user != none )
{
KFPC = KFPlayerController(user.Controller);
if( KFPC != none )
{
switch( PowerUpOnActivation )
{
case EPowerUp_HellishRage:
KFPC.ReceiveLocalizedMessage( class'KFLocalMessage_Game', GMT_PowerUpHellishRageActivated );
KFPC.ReceivePowerUp(class'KFPowerUp_HellishRage');
break;
}
}
}
}
else
{
foreach WorldInfo.AllControllers(class'KFPlayerController', KFPC)
{
switch( PowerUpOnActivation )
{
case EPowerUp_HellishRage:
KFPC.ReceiveLocalizedMessage( class'KFLocalMessage_Game', GMT_PowerUpHellishRageActivated );
KFPC.ReceivePowerUp(class'KFPowerUp_HellishRage');
break;
}
}
}
}
function NotifyPowerUpActivated()
{
local KFSeqEvent_PowerUpActivated PowerUpEvent;
local int i;
//Notify Kismet that the power up has been activated
for (i = 0; i < GeneratedEvents.Length; i++)
{
PowerUpEvent = KFSeqEvent_PowerUpActivated(GeneratedEvents[i]);
if (PowerUpEvent != none)
{
PowerUpEvent.ActivatePowerUp(self, self);
}
}
}
function NotifyTriggerReactivated()
{
local KFSeqEvent_PowerUpActivated PowerUpEvent;
local int i;
//Notify Kismet that the power up has been activated
for (i = 0; i < GeneratedEvents.Length; i++)
{
PowerUpEvent = KFSeqEvent_PowerUpActivated(GeneratedEvents[i]);
if (PowerUpEvent != none)
{
PowerUpEvent.ReactivateTrigger(self, self);
}
}
}
defaultproperties
{
SupportedEvents.Empty
SupportedEvents.Add(class'KFSeqEvent_PowerUpActivated')
RemoteRole=ROLE_SimulatedProxy
NetPriority=+00002.500000
bAlwaysRelevant=true
bCanBeActivated=true
ReactivationTime=20.0f
ReactivationMaterialChangeDelay=0.7f
EventIndex=-1
ObjectiveIndex=-1
}