using Sandbox;
using System;
using System.Collections.Generic;
namespace MurderGame;
///
/// Component designed for movement, only 1 per pawn.
///
public class BaseControllerComponent : EntityComponent, ISingletonComponent
{
public virtual void Simulate( IClient cl )
{
}
public virtual void FrameSimulate( IClient cl )
{
}
public virtual void BuildInput()
{
}
public Vector3 WishVelocity { get; set; }
internal HashSet Events = new( StringComparer.OrdinalIgnoreCase );
internal HashSet Tags;
///
/// Call OnEvent for each event
///
public virtual void RunEvents( BaseControllerComponent additionalController )
{
if ( Events == null ) return;
foreach ( var e in Events )
{
OnEvent( e );
additionalController?.OnEvent( e );
}
}
///
/// An event has been triggered - maybe handle it
///
public virtual void OnEvent( string name )
{
}
///
/// Returns true if we have this event
///
public bool HasEvent( string eventName )
{
if ( Events == null ) return false;
return Events.Contains( eventName );
}
///
///
public bool HasTag( string tagName )
{
if ( Tags == null ) return false;
return Tags.Contains( tagName );
}
///
/// Allows the controller to pass events to other systems
/// while staying abstracted.
/// For example, it could pass a "jump" event, which could then
/// be picked up by the playeranimator to trigger a jump animation,
/// and picked up by the player to play a jump sound.
///
public void AddEvent( string eventName )
{
// TODO - shall we allow passing data with the event?
if ( Events == null ) Events = new HashSet();
if ( Events.Contains( eventName ) )
return;
Events.Add( eventName );
}
///
///
public void SetTag( string tagName )
{
// TODO - shall we allow passing data with the event?
Tags ??= new HashSet();
if ( Tags.Contains( tagName ) )
return;
Tags.Add( tagName );
}
}