WorldBuilder/Weather/Lightning.cs
using System;
using Sandbox.Audio;
namespace Clover.WorldBuilder.Weather;
[Category( "Clover/Weather" )]
public class Lightning : WeatherBase
{
[Property] public Light LightningLight { get; set; }
[Property] public SoundEvent LightningSound { get; set; }
private bool _lightningEnabled;
private int _lightningLevel;
private TimeUntil _nextLightning;
// in meters
private float _lightningDistance;
private bool _lightningActive;
protected override void OnAwake()
{
LightningLight.Enabled = false;
}
public override void SetEnabled( bool state, bool smooth = false )
{
base.SetEnabled( state, smooth );
_lightningEnabled = state;
if ( !_lightningActive && state )
{
RandomizeLightning();
}
else if ( !state )
{
LightningLight.Enabled = false;
_lightningActive = false;
}
}
public override void SetLevel( int level, bool smooth = false )
{
base.SetLevel( level, smooth );
_lightningLevel = level;
if ( !_lightningActive ) RandomizeLightning();
}
private async void RandomizeLightning()
{
// _nextLightning = Random.Shared.Float( 10, 20 );
// _lightningDistance = Random.Shared.Float( 1000, 15000 );
if ( !Scene.IsValid() || !_lightningEnabled )
{
Log.Info( "Lightning disabled" );
return;
}
_lightningActive = true;
Log.Info( "Randomizing lightning" );
/*Task.DelayRealtimeSeconds( Random.Shared.Float( 10, 20 ) ).ContinueWith( _ =>
{
Log.Info( "Lightning!" );
LightningLight.Enabled = true;
Task.DelayRealtimeSeconds( 0.1f ).ContinueWith( __ =>
{
Log.Info( "Resetting lightning" );
LightningLight.Enabled = false;
RandomizeLightning();
} );
Task.DelayRealtimeSeconds( Random.Shared.Float( 0.5f, 5f ) ).ContinueWith( __ =>
{
Log.Info( "Playing sound" );
Sound.Play( LightningSound );
} );
} );*/
var nextFlash = Random.Shared.Float( 60, 120 );
nextFlash /= _lightningLevel;
await Task.DelaySeconds( nextFlash );
if ( !NodeManager.WeatherManager.IsInside )
{
Log.Info( "Lightning!" );
LightningLight.Enabled = true;
await Task.DelaySeconds( 0.1f );
Log.Info( "Flash done" );
LightningLight.Enabled = false;
}
await Task.DelaySeconds( Random.Shared.Float( 0.5f, 5f ) );
Log.Info( "Playing thunder" );
var s = Sound.Play( LightningSound );
s.TargetMixer = NodeManager.WeatherManager.IsInside
? Mixer.FindMixerByName( "WeatherInside" )
: Mixer.FindMixerByName( "WeatherOutside" );
RandomizeLightning();
}
/*protected override void OnFixedUpdate()
{
if ( !_lightningEnabled ) return;
if ( _nextLightning )
{
LightningLight.Enabled = _nextLightning.Relative - _nextLightning.Passed < 0.1f; // short flash
if ( _nextLightning.Passed + 1f > _nextLightning.Relative )
{
RandomizeLightning();
}
}
}*/
}