SanderMertens / flecs

A fast entity component system (ECS) for C & C++

Home Page:https://www.flecs.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

observer loss event

Esp9527 opened this issue · comments

Describe the bug
Observer don't recv event
at release 3.2.10
To Reproduce
Steps to reproduce the behavior:
player send 1 evt
summon send 2 evt

`

#include <flecs.h>
#include <iostream>

struct Event {
    float t;
};

struct Object {
    int l;
};

struct Collect {
};


int main(int argc, char *argv[]) {
    flecs::world world;
    auto player = world.entity().set<Object>({}).add<Collect>();
    auto summon = world.entity().set<Object>({}).add<Collect>();

    world.observer<>()
            .event<Event>()
            .term<Object>()
            .term<Collect>()
            .each([&](flecs::entity e){
                std::cout << "handle1 recv:" << e.id() << std::endl;
                if(summon == e)
                    return;
                summon.world().event<Event>()
                        .id<Object>()
                        .entity(summon)
                        .ctx({})
                        .emit();
            });

    world.observer<>()
            .event<Event>()
            .term<Object>()
            .term<Collect>()
            .each([&](flecs::entity e){
                std::cout << "handle2 recv:" << e.id() << std::endl;
                if(summon == e)
                    return;
                summon.world().event<Event>()
                        .id<Object>()
                        .entity(summon)
                        .ctx({})
                        .emit();
            });

    world.defer_begin();
    player.world().event<Event>()
            .id<Object>()
            .entity(player)
            .ctx({})
            .emit();
    world.defer_end();

    return world.app().target_fps(60).run();
}

`

Expected behavior
player send 1 evt
summon send 2 evt
2 handle total need 3*2 evt but only 3 evt

console print
`

handle2 recv:549
handle2 recv:550
handle1 recv:550

`

Additional context

Code will go to here. // /* Already handled this event */

`

bool flecs_multi_observer_invoke(ecs_iter_t *it) {
    ecs_observer_t *o = it->ctx;
    ecs_world_t *world = it->real_world;

    if (o->last_event_id[0] == world->event_id) {
        /* Already handled this event */
        return false;
    }
   ....
}

`