Code/Entity/EntityComponent.cs
using System;
using Sandbox;

namespace MANIFOLD.BHLib {
    /// <summary>
    /// A component used by an entity.
    /// </summary>
    public abstract class EntityComponent : Component {
        [Property]
        public GameObject Owner { get; set; }
        [Property]
        public ITarget Target { get; set; }
        
        protected override void OnFixedUpdate() {
            SimulateFrame(Time.Delta);
        }

        /// <summary>
        /// Simulate a single frame.
        /// </summary>
        public virtual void SimulateFrame(float deltaTime) {
            
        }

        /// <summary>
        /// Simulate the full behavior in one call. Typically used in previews.
        /// </summary>
        public virtual void Simulate(float time) {
            SimulateFrame(time);
        }
        
        protected virtual bool CheckForTarget(SceneTraceResult result) {
            if (!result.Hit) return false;
            if (result.GameObject == Target.GameObject) return true;
            if (result.GameObject.GetComponentInParent<ITarget>() == Target) return true;
            return false;
        }
    }
}