Development Merge 2025.10.18 #4
							
								
								
									
										6
									
								
								Engine.Core/Systems/Abstract/IEnterUniverse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Engine.Core/Systems/Abstract/IEnterUniverse.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
namespace Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
public interface IEnterUniverse : IBehaviour
 | 
			
		||||
{
 | 
			
		||||
    void EnterUniverse(IUniverse universe);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								Engine.Core/Systems/Abstract/IExitUniverse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Engine.Core/Systems/Abstract/IExitUniverse.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
namespace Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
public interface IExitUniverse : IBehaviour
 | 
			
		||||
{
 | 
			
		||||
    void ExitUniverse(IUniverse universe);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										71
									
								
								Engine.Core/Systems/UniverseEntranceManager.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								Engine.Core/Systems/UniverseEntranceManager.cs
									
									
									
									
									
										Normal file
									
								
							@@ -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<IBehaviour> SortByAscendingPriority() => Comparer<IBehaviour>.Create((x, y) => x.Priority.CompareTo(y.Priority));
 | 
			
		||||
 | 
			
		||||
    private readonly ActiveBehaviourCollectorSorted<IEnterUniverse> enterUniverses = new() { SortBy = SortByAscendingPriority() };
 | 
			
		||||
    private readonly ActiveBehaviourCollectorSorted<IExitUniverse> exitUniverses = new() { SortBy = SortByAscendingPriority() };
 | 
			
		||||
 | 
			
		||||
    private readonly List<IEnterUniverse> toCallEnterUniverses = new(32);
 | 
			
		||||
    private readonly List<IExitUniverse> 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<IEnterUniverse> sender, IBehaviourCollector<IEnterUniverse>.BehaviourCollectedArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        toCallEnterUniverses.Add(args.BehaviourCollected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void OnExitUniverseCollected(IBehaviourCollector<IExitUniverse> sender, IBehaviourCollector<IExitUniverse>.BehaviourCollectedArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        toCallExitUniverses.Add(args.BehaviourCollected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public UniverseEntranceManager()
 | 
			
		||||
    {
 | 
			
		||||
        enterUniverses.OnCollected.AddListener(OnEnterUniverseCollected);
 | 
			
		||||
        exitUniverses.OnCollected.AddListener(OnExitUniverseCollected);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user