Weapons/Components/WeaponComponent.cs
/// <summary>
/// Base weapon component. Attach alongside other weapon components on a weapon GameObject.
/// </summary>
[Title( "Weapon" ), Icon( "track_changes" )]
public abstract partial class WeaponComponent : Component
{
	protected Weapon Weapon => Components.Get<Weapon>( FindMode.EverythingInSelfAndAncestors );
	protected PlayerPawn Player => Weapon?.Player;

	public bool IsActive { get; protected set; }
	public TimeSince TimeSinceActivated { get; set; }

	public virtual string Name => GetType().Name;
	protected virtual bool EnableActivateEvents => true;

	public T GetComponent<T>() where T : WeaponComponent
		=> Components.Get<T>( FindMode.EverythingInSelfAndDescendants );

	public void RunGameEvent( string eventName )
		=> Player?.RunGameEvent( eventName );

	protected virtual void OnStart( PlayerPawn player )
	{
		TimeSinceActivated = 10;
		if ( EnableActivateEvents )
			RunGameEvent( $"{Name}.start" );
	}

	protected virtual bool CanStart( PlayerPawn player ) => true;

	public virtual void Simulate()
	{
		var player = Player;
		var before = IsActive;

		if ( !IsActive && CanStart( player ) )
		{
			OnStart( player );
			IsActive = true;
		}
		else if ( before && !CanStart( player ) )
		{
			IsActive = false;
			OnStop( player );
		}
	}

	protected virtual void OnStop( PlayerPawn player )
	{
		if ( EnableActivateEvents )
			RunGameEvent( $"{Name}.stop" );
	}

	protected virtual void OnDeactivate() { }

	public virtual void FrameSimulate() { }

	public virtual void OnGameEvent( string eventName ) { }

	public virtual void BuildInput() { }
}