Level/GeneratorComponent.cs
using Sandbox;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
public sealed class GeneratorComponent : BaseInteract
{
[Property, Group("Lights")] public List<Light> Lights { get; set; } = new();
[Property, Group( "Lights" )] public List<Light> EmergencyLights { get; set; } = new();
[Property, Group( "Lights" )] public GameObject OffLight { get; set; }
[Property, Group( "Lights" )] public GameObject OnLight { get; set; }
[Property, Group( "State" )] public bool IsOn { get; set; } = false;
[Property, Group( "State" )] public bool CanTurnOff { get; set; } = false;
[Property, Group( "State" )] public Curve Curve { get; set; } = new Curve( new Curve.Frame( 1.0f, 1.0f ), new Curve.Frame( 1.0f, 1.0f ) );
[Property,Group("Sound")] public SoundEvent SoundOn { get; set; }
[Property,Group("Sound")] public SoundEvent PowerUpSound { get; set; }
[Property,Group("Sound")] public GameObject PowerUpPosition { get; set; }
[Property,Group("Sound")] public SoundEvent SoundOff { get; set; }
[Property,Group("Sound")] public SoundEvent PowerDownSound { get; set; }
[Property,Group("Sound")] public GameObject PowerDownPosition { get; set; }
[Property, Group( "Button" )] public Material OverrideOnMaterial { get; set; }
[Property, Group( "Button" )] public Material OverrideOffMaterial { get; set; }
[Property, Group( "Signs" )] public List<GameObject> Signs { get; set; } = new();
public ModelRenderer ButtonModel { get; set; }
List<Color> LightsColorList { get; set; } = new();
List<Color> EmergencyLightsColorList { get; set; } = new();
TimeSince TimeSinceLastUse { get; set; } = 0;
protected override void OnEnabled()
{
base.OnEnabled();
if ( OverrideOnMaterial != null && IsOn )
{
ButtonModel = Components.Get<ModelRenderer>( FindMode.EnabledInSelf );
ButtonModel.MaterialOverride = OverrideOnMaterial;
}
else if ( OverrideOffMaterial != null && !IsOn )
{
ButtonModel = Components.Get<ModelRenderer>( FindMode.EnabledInSelf );
ButtonModel.MaterialOverride = OverrideOffMaterial;
Log.Info( "OverrideOffMaterial" );
}
if ( OnLight.IsValid() && OffLight.IsValid() )
{
if ( IsOn )
{
OnLight.Enabled = true;
OffLight.Enabled = false;
}
else
{
OnLight.Enabled = false;
OffLight.Enabled = true;
}
}
foreach ( var sign in Signs )
{
var model = sign.Components.Get<ModelRenderer>( FindMode.EverythingInSelf );
if ( IsOn )
{
model.MaterialGroup = "default";
}
else
{
model.MaterialGroup = "on";
}
}
}
protected override void OnStart()
{
base.OnStart();
foreach ( var light in Lights )
{
light.Enabled = IsOn;
LightsColorList.Add( light.LightColor );
if( !IsOn )
{
light.LightColor = Color.Black;
}
}
foreach ( var light in EmergencyLights )
{
light.Enabled = !IsOn;
EmergencyLightsColorList.Add( light.LightColor );
}
}
public override void OnUse( GameObject player )
{
base.OnUse( player );
TurnOn();
}
public void TurnOn()
{
if ( IsOn && !CanTurnOff ) return;
if ( IsOn )
{
if ( SoundOn != null )
Sound.Play( SoundOn, Transform.Position );
if ( PowerUpSound != null )
Sound.Play( PowerUpSound, PowerDownPosition?.Transform.Position ?? Transform.Position );
if ( OverrideOffMaterial != null )
{
ButtonModel = Components.Get<ModelRenderer>( FindMode.EnabledInSelf );
ButtonModel.MaterialOverride = OverrideOffMaterial;
}
if(OnLight.IsValid() && OffLight.IsValid())
{
OnLight.Enabled = false;
OffLight.Enabled = true;
}
foreach ( var sign in Signs )
{
var model = sign.Components.Get<ModelRenderer>( FindMode.EverythingInSelf );
model.MaterialGroup = "on";
}
}
else
{
if ( SoundOff != null )
Sound.Play( SoundOff, Transform.Position );
if ( PowerDownSound != null )
Sound.Play( PowerDownSound, PowerDownPosition?.Transform.Position ?? Transform.Position );
if ( OverrideOnMaterial != null )
{
ButtonModel = Components.Get<ModelRenderer>( FindMode.EnabledInSelf );
ButtonModel.MaterialOverride = OverrideOnMaterial;
}
if(OnLight.IsValid() && OffLight.IsValid())
{
OnLight.Enabled = true;
OffLight.Enabled = false;
}
foreach ( var sign in Signs )
{
var model = sign.Components.Get<ModelRenderer>( FindMode.EverythingInSelf );
model.MaterialGroup = "default";
}
}
IsOn = !IsOn;
foreach ( var light in Lights )
{
light.Enabled = IsOn;
}
foreach ( var light in EmergencyLights )
{
light.Enabled = !IsOn;
}
}
protected override void OnUpdate()
{
base.OnUpdate();
if ( IsOn )
{
for ( int i = 0; i < Lights.Count; i++ )
{
Lights[i].LightColor = Color.Lerp( Color.Black, LightsColorList[i], Curve.EvaluateDelta( TimeSinceLastUse * 0.1f ) );
}
}
else
{
for ( int i = 0; i < EmergencyLights.Count; i++ )
{
EmergencyLights[i].LightColor = EmergencyLightsColorList[i];
}
}
}
}