This commit is contained in:
2025-05-30 16:05:49 +03:00
committed by Syntriax
parent 846aa75dd5
commit b5140a94de
57 changed files with 437 additions and 462 deletions

View File

@@ -5,60 +5,64 @@ namespace Syntriax.Engine.Core;
public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
{
public Event<IBehaviourCollector<T>, T> OnCollected { get; private set; } = new();
public Event<IBehaviourCollector<T>, T> OnRemoved { get; private set; } = new();
public Event<IHasUniverse> OnUniverseAssigned { get; private set; } = new();
public Event<IAssignable>? OnUnassigned { get; private set; } = new();
public Event<IBehaviourCollector<T>, IBehaviourCollector<T>.BehaviourCollectedArguments> OnCollected { get; init; } = new();
public Event<IBehaviourCollector<T>, IBehaviourCollector<T>.BehaviourRemovedArguments> OnRemoved { get; init; } = new();
public Event<IHasUniverse> OnUniverseAssigned { get; init; } = new();
public Event<IAssignable>? OnUnassigned { get; init; } = new();
private readonly Action<IBehaviourController, IBehaviour> cachedOnBehaviourAdded = null!;
private readonly Action<IBehaviourController, IBehaviour> cachedOnBehaviourRemoved = null!;
private readonly Action<IUniverse, IUniverseObject> cachedOnUniverseObjectRegistered = null!;
private readonly Action<IUniverse, IUniverseObject> cachedOnUniverseObjectUnregistered = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAdded = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemoved = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler cachedOnUniverseObjectRegistered = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler cachedOnUniverseObjectUnregistered = null!;
protected readonly List<T> behaviours = new(32);
public IUniverse Universe { get; private set; } = null!;
private void OnUniverseObjectRegistered(IUniverse manager, IUniverseObject universeObject)
private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments arguments)
{
IUniverseObject universeObject = arguments.UniverseObjectRegistered;
universeObject.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourAdded(universeObject.BehaviourController, universeObject.BehaviourController[i]);
OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
}
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverseObject universeObject)
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments arguments)
{
IUniverseObject universeObject = arguments.UniverseObjectUnregistered;
universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourRemoved(universeObject.BehaviourController, universeObject.BehaviourController[i]);
OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
}
protected virtual void OnBehaviourAdd(IBehaviour behaviour) { }
private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour)
private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments arguments)
{
if (behaviour is not T tBehaviour)
if (arguments.BehaviourAdded is not T tBehaviour)
return;
behaviours.Add(tBehaviour);
OnBehaviourAdd(behaviour);
OnCollected?.Invoke(this, tBehaviour);
OnBehaviourAdd(arguments.BehaviourAdded);
OnCollected?.Invoke(this, new(tBehaviour));
}
protected virtual void OnBehaviourRemove(IBehaviour behaviour) { }
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour)
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments arguments)
{
if (behaviour is not T tBehaviour)
if (arguments.BehaviourRemoved is not T tBehaviour)
return;
if (!behaviours.Remove(tBehaviour))
return;
OnBehaviourRemove(behaviour);
OnRemoved?.Invoke(this, tBehaviour);
OnBehaviourRemove(arguments.BehaviourRemoved);
OnRemoved?.Invoke(this, new(tBehaviour));
}
protected virtual void OnAssign(IUniverse universe) { }
@@ -68,7 +72,7 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
return false;
foreach (IUniverseObject universeObject in universe.UniverseObjects)
OnUniverseObjectRegistered(universe, universeObject);
OnUniverseObjectRegistered(universe, new(universeObject));
universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered);
universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered);
@@ -86,7 +90,7 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
return false;
foreach (IUniverseObject universeObject in Universe.UniverseObjects)
OnUniverseObjectUnregistered(Universe, universeObject);
OnUniverseObjectUnregistered(Universe, new(universeObject));
Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered);
Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered);