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