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];
			}
		}
	}
}