using MoonTools.ECS; using Nerfed.Runtime.Components; namespace Nerfed.Runtime.Systems { public class ParentSystem : MoonTools.ECS.System { private readonly Filter parentsAddedFilter; private readonly Filter parentsRemovedFilter; private readonly Filter parentsFilter; public ParentSystem(World world) : base(world) { parentsAddedFilter = FilterBuilder.Include().Exclude().Build(); parentsRemovedFilter = FilterBuilder.Include().Exclude().Build(); parentsFilter = FilterBuilder.Include().Include().Build(); } public override void Update(TimeSpan delta) { // Update removed parents. foreach (Entity entity in parentsRemovedFilter.Entities) { // Do stuff here to update/remove child relations etc. PreviousParent previousParent = Get(entity); World.Unrelate(previousParent.parentEntity, entity); Remove(entity); } // Update added parents. foreach (Entity entity in parentsAddedFilter.Entities) { Parent parent = Get(entity); if (Has(parent.parentEntity) && Get(parent.parentEntity).parentEntity == entity) { Log.Warning($"Entity {entity} cannot be a parent of entity {parent.parentEntity}, because {parent.parentEntity} is the parent of {entity}"); Remove(entity); continue; } PreviousParent previousParent = new(parent.parentEntity); Set(entity, previousParent); World.Relate(parent.parentEntity, entity, new ChildRelation()); } // Update relations if the parent has changed. foreach (Entity entity in parentsFilter.Entities) { Parent parent = Get(entity); PreviousParent previousParent = Get(entity); if(parent.parentEntity != previousParent.parentEntity) { World.Unrelate(previousParent.parentEntity, entity); Set(entity, new PreviousParent(parent.parentEntity)); World.Relate(parent.parentEntity, entity, new ChildRelation()); } } } } }