From f6e52abcc1535be49315cffe05e69473d6f09ec5 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 2 Aug 2025 23:24:59 +0300 Subject: [PATCH] feat: testing universe entrance manager --- .../Systems/Abstract/IEnterUniverse.cs | 6 ++ Engine.Core/Systems/Abstract/IExitUniverse.cs | 6 ++ .../Systems/UniverseEntranceManager.cs | 71 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 Engine.Core/Systems/Abstract/IEnterUniverse.cs create mode 100644 Engine.Core/Systems/Abstract/IExitUniverse.cs create mode 100644 Engine.Core/Systems/UniverseEntranceManager.cs diff --git a/Engine.Core/Systems/Abstract/IEnterUniverse.cs b/Engine.Core/Systems/Abstract/IEnterUniverse.cs new file mode 100644 index 0000000..f7d67a1 --- /dev/null +++ b/Engine.Core/Systems/Abstract/IEnterUniverse.cs @@ -0,0 +1,6 @@ +namespace Syntriax.Engine.Core; + +public interface IEnterUniverse : IBehaviour +{ + void EnterUniverse(IUniverse universe); +} diff --git a/Engine.Core/Systems/Abstract/IExitUniverse.cs b/Engine.Core/Systems/Abstract/IExitUniverse.cs new file mode 100644 index 0000000..b8c3db1 --- /dev/null +++ b/Engine.Core/Systems/Abstract/IExitUniverse.cs @@ -0,0 +1,6 @@ +namespace Syntriax.Engine.Core; + +public interface IExitUniverse : IBehaviour +{ + void ExitUniverse(IUniverse universe); +} diff --git a/Engine.Core/Systems/UniverseEntranceManager.cs b/Engine.Core/Systems/UniverseEntranceManager.cs new file mode 100644 index 0000000..6df3d96 --- /dev/null +++ b/Engine.Core/Systems/UniverseEntranceManager.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; + +namespace Syntriax.Engine.Core; + +public class UniverseEntranceManager : Behaviour +{ + // We use Ascending order because we are using reverse for loop to call them + private static Comparer SortByAscendingPriority() => Comparer.Create((x, y) => x.Priority.CompareTo(y.Priority)); + + private readonly ActiveBehaviourCollectorSorted enterUniverses = new() { SortBy = SortByAscendingPriority() }; + private readonly ActiveBehaviourCollectorSorted exitUniverses = new() { SortBy = SortByAscendingPriority() }; + + private readonly List toCallEnterUniverses = new(32); + private readonly List toCallExitUniverses = new(32); + + protected override void OnEnteredUniverse(IUniverse universe) + { + enterUniverses.Assign(universe); + + foreach (IUniverseObject universeObject in Universe.UniverseObjects) + OnUniverseObjectRegistered(Universe, new(universeObject)); + + universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered); + universe.OnUniverseObjectUnRegistered.AddListener(OnUniverseObjectUnRegistered); + } + + protected override void OnExitedUniverse(IUniverse universe) + { + enterUniverses.Unassign(); + + foreach (IUniverseObject universeObject in Universe.UniverseObjects) + OnUniverseObjectUnRegistered(Universe, new(universeObject)); + + universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered); + universe.OnUniverseObjectUnRegistered.RemoveListener(OnUniverseObjectUnRegistered); + } + + private void OnUniverseObjectUnRegistered(IUniverse sender, IUniverse.UniverseObjectUnRegisteredArguments args) + { + for (int i = toCallExitUniverses.Count - 1; i >= 0; i--) + { + toCallExitUniverses[i].ExitUniverse(Universe); + toCallExitUniverses.RemoveAt(i); + } + } + + private void OnUniverseObjectRegistered(IUniverse sender, IUniverse.UniverseObjectRegisteredArguments args) + { + for (int i = toCallEnterUniverses.Count - 1; i >= 0; i--) + { + toCallEnterUniverses[i].EnterUniverse(Universe); + toCallEnterUniverses.RemoveAt(i); + } + } + + private void OnEnterUniverseCollected(IBehaviourCollector sender, IBehaviourCollector.BehaviourCollectedArguments args) + { + toCallEnterUniverses.Add(args.BehaviourCollected); + } + + private void OnExitUniverseCollected(IBehaviourCollector sender, IBehaviourCollector.BehaviourCollectedArguments args) + { + toCallExitUniverses.Add(args.BehaviourCollected); + } + + public UniverseEntranceManager() + { + enterUniverses.OnCollected.AddListener(OnEnterUniverseCollected); + exitUniverses.OnCollected.AddListener(OnExitUniverseCollected); + } +}