//=============================================================================
// TriggerLight.
// A lightsource which can be triggered on or off.
//=============================================================================
class TriggerLight extends Light;
//-----------------------------------------------------------------------------
// Variables.
var bool bRepEnabled,bClientEnabled,bDisabled;
var() bool bInitiallyOn; // Whether it's initially on.
var() bool bDelayFullOn; // Delay then go full-on.
var() bool bNotOnOpenGL; // Should be disabled in OpenGL.
var() float ChangeTime; // Time light takes to change from on to off.
var() float RemainOnTime; // How long the TriggerPound effect lasts
var float InitialBrightness; // Initial brightness.
var float Alpha, Direction;
var actor SavedTrigger;
var float poundTime;
replication
{
// Variables the server should send to the client.
reliable if( Role==ROLE_Authority )
bRepEnabled;
}
//-----------------------------------------------------------------------------
// Engine functions.
simulated function PostNetBeginPlay()
{
if( Level.NetMode!=NM_DedicatedServer && bNotOnOpenGL && PlatformIsOpenGL() )
{
bDynamicLight = false;
bDisabled = true;
Disable('Tick');
return;
}
bNetNotify = true;
Disable('Tick');
bClientEnabled = bRepEnabled;
if( bRepEnabled )
{
Alpha = 1.0;
Direction = 1.0;
LightBrightness = InitialBrightness;
}
else
{
Alpha = 0.0;
Direction = -1.0;
LightBrightness = 0;
bDynamicLight = false;
}
}
// Called at start of gameplay.
simulated function BeginPlay()
{
ChangeTime = FMax(ChangeTime,0.01f); // Prevent division by zero error.
// Remember initial light type and set new one.
InitialBrightness = LightBrightness;
if( Level.NetMode!=NM_Client )
bRepEnabled = bInitiallyOn; // Setup initial replication.
}
// Called whenever time passes.
// if_RO_
simulated function Tick( float DeltaTime )
// else
//function Tick( float DeltaTime )
{
if( bDisabled )
return;
Alpha += Direction * DeltaTime / ChangeTime;
if( Alpha > 1.0 )
{
Alpha = 1.0;
Disable( 'Tick' );
if( SavedTrigger != None )
{
SavedTrigger.EndEvent();
SavedTrigger = None;
}
}
else if( Alpha < 0.0 )
{
Alpha = 0.0;
bDynamicLight = false;
Disable( 'Tick' );
if( SavedTrigger != None )
{
SavedTrigger.EndEvent();
SavedTrigger = None;
}
}
LightBrightness = Alpha * InitialBrightness;
}
function Timer()
{
if( SavedTrigger != None )
{
SavedTrigger.EndEvent();
SavedTrigger = None;
}
}
function Reset()
{
SetEnabled(bInitiallyOn);
SetTimer(0,false);
}
simulated function PostNetReceive()
{
if( bClientEnabled!=bRepEnabled )
{
bClientEnabled = bRepEnabled;
SetEnabled(bRepEnabled);
}
}
//-----------------------------------------------------------------------------
// Toggle.
simulated final function SetEnabled( bool bEnable )
{
if( bEnable==bRepEnabled && Level.NetMode!=NM_Client )
{
SetTimer(ChangeTime,false); // Send EndEvent anyway.
return;
}
// Setup replication.
bRepEnabled = bEnable;
NetUpdateTime = Level.TimeSeconds - 1.f;
if( !bDisabled )
{
if( bEnable )
{
bDynamicLight = true;
if( Level.NetMode==NM_DedicatedServer || !bDelayFullOn )
{
LightBrightness = InitialBrightness;
SetTimer(ChangeTime,false);
}
else
{
Direction = 1.0;
bDynamicLight = true;
Enable( 'Tick' );
}
}
else if( Level.NetMode==NM_DedicatedServer || !bDelayFullOn )
{
LightBrightness = 0;
bDynamicLight = false;
SetTimer(ChangeTime,false);
}
else
{
Direction = -1.0;
Enable( 'Tick' );
}
}
}
//-----------------------------------------------------------------------------
// Public states.
// Trigger turns the light on.
state() TriggerTurnsOn
{
function Trigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(true);
}
}
// Trigger turns the light off.
state() TriggerTurnsOff
{
function Trigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(false);
}
}
// Trigger toggles the light.
state() TriggerToggle
{
function Trigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(!bRepEnabled);
}
}
// Trigger controls the light.
state() TriggerControl
{
function Trigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(!bInitiallyOn);
}
function UnTrigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(bInitiallyOn);
}
}
state() TriggerPound
{
function Timer()
{
poundTime += ChangeTime;
SetEnabled(!bRepEnabled);
SetTimer(ChangeTime,false);
if( poundTime>=RemainOnTime )
SetTimer(0.f,false);
}
function Trigger( actor Other, pawn EventInstigator )
{
if( SavedTrigger!=None )
SavedTrigger.EndEvent();
SavedTrigger = Other;
SavedTrigger.BeginEvent();
SetEnabled(true);
poundTime = ChangeTime; // how much time will pass till reversal
SetTimer(ChangeTime,false); // wake up when it's time to reverse
}
}
defaultproperties
{
RemoteRole=ROLE_SimulatedProxy
bStatic=True
bMovable=True
bDynamicLight=True
bSkipActorPropertyReplication=true
NetUpdateFrequency=0.5
bAlwaysRelevant=true
bOnlyDirtyReplication=true
}