rott/kf_sources/FoundryObj/Classes/AnimatedDecoration.uc
2026-07-14 20:27:09 +07:00

152 lines
2.8 KiB
Ucode

class AnimatedDecoration extends Decoration;
#exec OBJ LOAD FILE=Foundry_anim.ukx
var() bool bActive;
var bool bLoop;
var() float ActivationDelay;
var() bool bRandomActivationDelay;
var bool bPendingState; // bActive value, which will be set on timer
var() const name Animation;
var() const bool bHiddenWhenInactive;
var(Sound) const bool bAmbientSoundOnlyWhenActive;
replication
{
reliable if( bNetInitial && Role == Role_Authority )
Animation, bHiddenWhenInactive, bAmbientSoundOnlyWhenActive;
reliable if( (bNetInitial || bNetDirty) && Role == Role_Authority )
bActive, bLoop;
}
function PostBeginPlay()
{
if ( bActive ) {
bActive = false;
DelayedActivation(true);
}
else
SetActive(false);
}
function DelayedActivation(bool bActivate)
{
bPendingState = bActivate;
if ( ActivationDelay > 0 ) {
if ( bRandomActivationDelay )
SetTimer(fmax(ActivationDelay*frand(), 0.01), false);
else
SetTimer(ActivationDelay*frand(), false);
}
else
SetActive(bActivate);
}
simulated function Timer()
{
SetActive(bPendingState);
}
simulated function PostNetReceive()
{
SetActive(bActive);
}
simulated function SetActive(bool value)
{
if ( bActive != value ) {
bActive = value;
if ( Role == ROLE_Authority )
NetUpdateTime = Level.TimeSeconds - 1;
}
if ( Level.NetMode != NM_DedicatedServer ) {
if ( bActive ) {
if ( bLoop )
LoopAnim(Animation);
else {
PlayAnim(Animation);
// set inactive when animation ends
bPendingState = false;
SetTimer(GetAnimDuration(Animation), false);
}
if ( bAmbientSoundOnlyWhenActive )
AmbientSound = default.AmbientSound;
}
else {
StopAnimating();
if ( bAmbientSoundOnlyWhenActive )
AmbientSound = none;
}
if ( bHiddenWhenInactive )
bHidden = !bActive;
}
}
state() TriggerTurnsOn
{
function BeginState()
{
bLoop = true;
}
function Trigger( actor Other, pawn EventInstigator )
{
Instigator = EventInstigator;
DelayedActivation(true);
}
}
state() TriggerPlayOnce extends TriggerTurnsOn
{
function BeginState()
{
bLoop = false;
}
}
state() TriggerTurnsOff
{
function Trigger( actor Other, pawn EventInstigator )
{
Instigator = EventInstigator;
SetActive(false);
}
}
state() TriggerToggle
{
function BeginState()
{
bLoop = true;
}
function Trigger( actor Other, pawn EventInstigator )
{
Instigator = EventInstigator;
if ( bActive )
SetActive(false);
else
DelayedActivation(true);
}
}
defaultproperties
{
bLoop=True
bStatic=False
bStasis=False
bAlwaysRelevant=True
RemoteRole=ROLE_SimulatedProxy
Mesh=SkeletalMesh'Foundry_anim.Steamengine_Wheel'
bNetNotify=True
}