bevyengine / bevyengine/bevy

API to use EntityEvents with EntityComponentsTrigger

Open
#21,865 1 comment 0 reactions 0 assignees View on GitHub
A-ECS C-Feature S-Nominated-To-Close X-Contentious
Dominant language
Rust
Stars
48.2k
Forks
4.8k
Avg merge
3d 22h
Merged PRs (30d)
161

Description

I'd like to improve API for EntityEvents with EntityCompontsTrigger

## What problem does this solve or what need does it fill?

Currently it's possible to create an observer like that for `Add` and a few other bevy entity events

```rust
fn on_add(
add: On
) {
// ...
}
```

But it's not possible to do that for custom EntityEvent easily. To achieve the same result for custom entity events, we currently have to make additional query call.

```rust
fn on_my_event(
my_event: On,
query: Query<&MyMarker>,
) {
if query.contains(my_event.entity) {
// ...
}
}

```

or make a workaround with custom commands extension that we call instead of regular `trigger()`

```rust
#[derive(EntityEvent)]
#[entity_event(trigger = EntityComponentsTrigger<'a>)]
pub struct MyEvent {
event: E,
}

pub(crate) trait TriggerMyEvent {
fn trigger_my_event(&mut self, event: MyEvent);
}

impl<'w, 's> TriggerMyEvent for Commands<'w, 's> {
fn trigger_my_event(&mut self, event: MyEvent) {
self.queue(move |world: &mut World| {
let Ok(iter) = world.inspect_entity(event.event_target())
else {
return
};

let ids = iter.map(|c| c.id()).collect::>();

world.trigger_with(event, EntityComponentsTrigger {
components: &ids,
});
});
}
}

```

## What solution would you like?

TL;DR;

I'd like `EntityEvents` with explicit `#[entity_event(trigger = EntityComponentsTrigger<'a>)]` to automatically add a full list of components to the trigger.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.