Amend Me
This commit is contained in:
@@ -5,16 +5,16 @@ namespace Syntriax.Engine.Core;
|
||||
|
||||
public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : class, IBehaviour
|
||||
{
|
||||
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<IActive, bool> cachedOnBehaviourStateChanged = 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<IActive, IActive.ActiveChangedArguments>.EventHandler cachedOnBehaviourStateChanged = null!;
|
||||
private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler cachedOnUniverseObjectRegistered = null!;
|
||||
private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler cachedOnUniverseObjectUnregistered = null!;
|
||||
|
||||
private readonly List<T> monitoringBehaviours = new(32);
|
||||
protected readonly List<T> activeBehaviours = new(32);
|
||||
@@ -22,56 +22,60 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
|
||||
|
||||
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;
|
||||
|
||||
monitoringBehaviours.Add(tBehaviour);
|
||||
monitoringActiveToBehaviour.Add(tBehaviour, tBehaviour);
|
||||
tBehaviour.OnActiveChanged.AddListener(cachedOnBehaviourStateChanged);
|
||||
OnBehaviourStateChanged(tBehaviour, !tBehaviour.IsActive);
|
||||
OnBehaviourStateChanged(tBehaviour, new(!tBehaviour.IsActive));
|
||||
}
|
||||
|
||||
private void OnBehaviourStateChanged(IActive sender, bool previousState)
|
||||
private void OnBehaviourStateChanged(IActive sender, IActive.ActiveChangedArguments arguments)
|
||||
{
|
||||
T behaviour = monitoringActiveToBehaviour[sender];
|
||||
if (sender.IsActive)
|
||||
{
|
||||
activeBehaviours.Add(behaviour);
|
||||
OnBehaviourAdd(behaviour);
|
||||
OnCollected?.Invoke(this, behaviour);
|
||||
OnCollected?.Invoke(this, new(behaviour));
|
||||
}
|
||||
else if (activeBehaviours.Remove(behaviour))
|
||||
{
|
||||
OnBehaviourRemove(behaviour);
|
||||
OnRemoved?.Invoke(this, behaviour);
|
||||
OnRemoved?.Invoke(this, new(behaviour));
|
||||
}
|
||||
}
|
||||
|
||||
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 (!monitoringBehaviours.Remove(tBehaviour) || !monitoringActiveToBehaviour.Remove(tBehaviour))
|
||||
@@ -81,7 +85,7 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
|
||||
if (activeBehaviours.Remove(tBehaviour))
|
||||
{
|
||||
OnBehaviourRemove(tBehaviour);
|
||||
OnRemoved?.Invoke(this, tBehaviour);
|
||||
OnRemoved?.Invoke(this, new(tBehaviour));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +95,7 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
|
||||
return false;
|
||||
|
||||
foreach (IUniverseObject universeObject in universe.UniverseObjects)
|
||||
OnUniverseObjectRegistered(universe, universeObject);
|
||||
OnUniverseObjectRegistered(universe, new(universeObject));
|
||||
|
||||
universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered);
|
||||
universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered);
|
||||
@@ -108,7 +112,7 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
|
||||
return false;
|
||||
|
||||
foreach (IUniverseObject universeObject in Universe.UniverseObjects)
|
||||
OnUniverseObjectUnregistered(Universe, universeObject);
|
||||
OnUniverseObjectUnregistered(Universe, new(universeObject));
|
||||
|
||||
Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered);
|
||||
Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered);
|
||||
|
||||
Reference in New Issue
Block a user