using System.Collections.Generic; namespace Syntriax.Engine.Core.Abstract; /// <summary> /// Represents an <see cref="IEntity"/> that can enter and exit a hierarchy within the <see cref="IGameManager"/> system. /// This interface allows for tracking the object's presence in the hierarchy and provides events /// for notifying when the see enters or exits the hierarchy. /// </summary> public interface IHierarchyObject : IEntity, INameable, IHasBehaviourController, IEnumerable<IHierarchyObject> { /// <summary> /// Event triggered when the <see cref="IHierarchyObject"/> enters the hierarchy. /// </summary> event OnEnteredHierarchyEventHandler? OnEnteredHierarchy; /// <summary> /// Event triggered when the <see cref="IHierarchyObject"/> exits the hierarchy. /// </summary> event OnExitedHierarchyEventHandler? OnExitedHierarchy; /// <summary> /// Event triggered when the <see cref="Parent"/> of the <see cref="IHierarchyObject"/> changes. The second parameter is the old <see cref="IHierarchyObject"/>. /// </summary> event OnParentChangedEventHandler? OnParentChanged; /// <summary> /// Event triggered when a new <see cref="IHierarchyObject"/> is added to the <see cref="Children"/>. /// </summary> event OnChildrenAddedEventHandler? OnChildrenAdded; /// <summary> /// Event triggered when an <see cref="IHierarchyObject"/> is removed from the <see cref="Children"/>. /// </summary> event OnChildrenRemovedEventHandler? OnChildrenRemoved; /// <summary> /// Gets the <see cref="IGameManager"/> this <see cref="IHierarchyObject"/> is connected to, if any. /// </summary> IGameManager GameManager { get; } /// <summary> /// Indicates whether the <see cref="IHierarchyObject"/> is currently in the hierarchy. /// </summary> bool IsInHierarchy { get; } /// <summary> /// The parent <see cref="IHierarchyObject"/> of the <see cref="IHierarchyObject"/>. /// </summary> IHierarchyObject? Parent { get; } /// <summary> /// The <see cref="IHierarchyObject"/>s that have this <see cref="IHierarchyObject"/> as their <see cref="Parent"/>. /// </summary> IReadOnlyList<IHierarchyObject> Children { get; } /// <summary> /// Internal method to handle entering the hierarchy. /// This should be called by the system to properly manage hierarchy states. /// </summary> /// <param name="gameManager">The <see cref="IGameManager"/> that is managing this hierarchy.</param> /// <returns> /// <see cref="true"/> if the <see cref="IHierarchyObject"/> successfully entered the hierarchy; /// <see cref="false"/> if it failed to do so. /// </returns> internal bool EnterHierarchy(IGameManager gameManager); /// <summary> /// Internal method to handle exiting the hierarchy. /// This should be called by the system to properly manage hierarchy states. /// </summary> /// <returns> /// <see cref="true"/> if the <see cref="IHierarchyObject"/> successfully exited the hierarchy; /// <see cref="false"/> if it failed to do so. /// </returns> internal bool ExitHierarchy(); /// <summary> /// Sets the parent <see cref="IHierarchyObject"/> of this <see cref="IHierarchyObject"/>. /// </summary> /// <param name="hierarchyObject">The parent <see cref="IHierarchyObject"/> to set.</param> void SetParent(IHierarchyObject? hierarchyObject); /// <summary> /// Adds a child <see cref="IHierarchyObject"/> to this <see cref="IHierarchyObject"/>. /// </summary> /// <param name="hierarchyObject">The child <see cref="IHierarchyObject"/> to add.</param> void AddChild(IHierarchyObject hierarchyObject); /// <summary> /// Removes a child <see cref="IHierarchyObject"/> from this <see cref="IHierarchyObject"/>. /// </summary> /// <param name="hierarchyObject">The child <see cref="IHierarchyObject"/> to remove.</param> void RemoveChild(IHierarchyObject hierarchyObject); /// <summary> /// EventHandler delegate for the event triggered when the <see cref="IHierarchyObject"/> enters the hierarchy of a <see cref="IGameManager">. /// </summary> /// <param name="sender">The <see cref="IHierarchyObject"/> that entered the hierarchy.</param> /// <param name="gameManager">The <see cref="IGameManager"/> that the <see cref="IHierarchyObject"/> has entered it's hierarchy.</param> delegate void OnEnteredHierarchyEventHandler(IHierarchyObject sender, IGameManager gameManager); /// <summary> /// EventHandler delegate for the event triggered when the <see cref="IHierarchyObject"/> exits the hierarchy of a <see cref="IGameManager">. /// </summary> /// <param name="sender">The <see cref="IHierarchyObject"/> that exited the hierarchy.</param> /// <param name="gameManager">The <see cref="IGameManager"/> that the <see cref="IHierarchyObject"/> has exited it's hierarchy.</param> delegate void OnExitedHierarchyEventHandler(IHierarchyObject sender, IGameManager gameManager); /// <summary> /// Delegate for the event triggered when the <see cref="IHierarchyObject"/>'s parent changes. /// </summary> /// <param name="sender">The <see cref="IHierarchyObject"/> that the parent has changed.</param> /// <param name="previousParent">The previous <see cref="IHierarchyObject"/> the sender was a child of.</param> /// <param name="newParent">The new and current <see cref="IHierarchyObject"/> the sender is a child of.</param> delegate void OnParentChangedEventHandler(IHierarchyObject sender, IHierarchyObject? previousParent, IHierarchyObject? newParent); /// <summary> /// Delegate for the event triggered when a new <see cref="IHierarchyObject"/> added as a child. /// </summary> /// <param name="sender">The parent <see cref="IHierarchyObject"/> this event is being called from.</param> /// <param name="childrenAdded">The <see cref="IHierarchyObject"/> that got removed as a children of the sender <see cref="IHierarchyObject"/>.</param> delegate void OnChildrenAddedEventHandler(IHierarchyObject sender, IHierarchyObject childrenAdded); /// <summary> /// Delegate for the event triggered when a new <see cref="IHierarchyObject"/> removed from being a child. /// </summary> /// <param name="sender">The parent <see cref="IHierarchyObject"/> this event is being called from.</param> /// <param name="childrenAdded">The <see cref="IHierarchyObject"/> that got removed as a children of the sender <see cref="IHierarchyObject"/>.</param> delegate void OnChildrenRemovedEventHandler(IHierarchyObject sender, IHierarchyObject childrenRemoved); }