observer loss event
Esp9527 opened this issue · comments
Esp9527 commented
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;
}
....
}
`