public ComponentNotificationsBuilder <TScope> AddReplacedNotifications <TComponent>()
        {
            // @formatter:off
            Parent
            .Components <TScope>()
            .Add <ComponentReplacedListeners <TScope, TComponent> >()
            .End()
            .Messages()
            .Add <ComponentReplaced <TScope, TComponent> >()
            .End()
            .Systems()
            .Setup((contexts, bus) => {
                var unused = new ComponentReplacedMessageProducer <TScope, TComponent>(contexts, bus);
            })
            .Update((contexts, bus) => {
                foreach (var message in bus.All <ComponentReplaced <TScope, TComponent> >())
                {
                    var entity = message.Entity;

                    if (!entity.Has <ComponentReplacedListeners <TScope, TComponent> >())
                    {
                        continue;
                    }

                    var listeners = entity.Get <ComponentReplacedListeners <TScope, TComponent> >().Listeners;

                    foreach (var listener in listeners)
                    {
                        listener.OnComponentReplaced(entity, message.OldComponent);
                    }
                }
            })
            .Cleanup((contexts, bus) =>
            {
                var context = contexts.Get <Game>();

                foreach (var entity in context.AllWith <Destroyed, ComponentReplacedListeners <TScope, TComponent> >())
                {
                    var list = entity.Get <ComponentReplacedListeners <TScope, TComponent> >().Listeners;

                    ListPool <IComponentReplacedListener <TScope, TComponent> > .Instance.Return(list);
                }
            })
            .End();
            // @formatter:on
            return(this);
        }
Пример #2
0
        public GlobalComponentNotificationsBuilder <TScope> AddReplacedNotifications <TComponent>()
        {
            // @formatter:off
            Parent
            .Components <Singletons>()
            .Add <ComponentReplacedListeners <TScope, TComponent> >()
            .End()
            .Messages()
            .Add <ComponentReplaced <TScope, TComponent> >()
            .End()
            .Systems()
            .Setup((contexts, bus) => {
                var unused = new ComponentReplacedMessageProducer <TScope, TComponent>(contexts, bus);

                contexts.Singleton().Add(new ComponentReplacedListeners <TScope, TComponent>(new List <IComponentReplacedListener <TScope, TComponent> >()));
            })
            .Update((contexts, bus) => {
                var listeners = contexts.Singleton().Get <ComponentReplacedListeners <TScope, TComponent> >().Listeners;

                if (listeners.Count == 0)
                {
                    return;
                }

                foreach (var message in bus.All <ComponentReplaced <TScope, TComponent> >())
                {
                    foreach (var listener in listeners)
                    {
                        listener.OnComponentReplaced(message.Entity, message.OldComponent);
                    }
                }
            })
            .End();
            // @formatter:on
            return(this);
        }