|
1 | 1 | use crate::{
|
2 | 2 | component::Component,
|
3 |
| - system::{Local, Query, ResMut, ResMutState, ResState, SystemParam}, |
| 3 | + system::{LocalState, Query, ResMut, ResMutState, ResState, SystemParam}, |
4 | 4 | };
|
5 | 5 | use bevy_utils::tracing::trace;
|
6 | 6 | use std::{
|
@@ -339,12 +339,22 @@ impl<'a, T: Component> EventWriter<'a, T> {
|
339 | 339 |
|
340 | 340 | /// Reads events of type `T` in order and tracks which events have already been read.
|
341 | 341 | pub struct EventReader<'a, T: Component> {
|
342 |
| - last_event_count: Local<'a, (usize, PhantomData<T>)>, |
| 342 | + last_event_count: EventCount<T>, |
343 | 343 | events: &'a Events<T>,
|
344 | 344 | }
|
345 | 345 |
|
| 346 | +/// Wrapper struct used by [EventReader] to count events |
| 347 | +pub struct EventCount<T>(usize, PhantomData<T>); |
| 348 | + |
| 349 | +// #[derive(Default)] doesn't handle PhantomData properly, so we're stuck with a manual impl |
| 350 | +impl<T> Default for EventCount<T> { |
| 351 | + fn default() -> Self { |
| 352 | + EventCount(0, PhantomData::default()) |
| 353 | + } |
| 354 | +} |
| 355 | + |
346 | 356 | impl<'a, T: Component> SystemParam for EventReader<'a, T> {
|
347 |
| - type Fetch = ResState<Events<T>>; |
| 357 | + type Fetch = (ResState<Events<T>>, LocalState<EventCount<T>>); |
348 | 358 | }
|
349 | 359 |
|
350 | 360 | impl<'a, T: Component> EventReader<'a, T> {
|
|
0 commit comments