Skip to content

Commit 1fcd956

Browse files
committed
Fix bug where events where not being dropped
1 parent b592a72 commit 1fcd956

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

crates/bevy_app/src/app.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{First, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition};
1+
use crate::{First, FixedPostUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition};
22
pub use bevy_derive::AppLabel;
33
use bevy_ecs::{
44
prelude::*,
@@ -507,6 +507,8 @@ impl App {
507507
bevy_ecs::event::event_update_system::<T>
508508
.run_if(bevy_ecs::event::event_update_condition::<T>),
509509
);
510+
self.init_resource::<bevy_ecs::event::EventUpdateSignal<T>>()
511+
.add_systems(FixedPostUpdate, bevy_ecs::event::event_queue_update_system::<T>);
510512
}
511513
self
512514
}

crates/bevy_ecs/src/event.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub struct EventId<E: Event> {
3333
}
3434

3535
impl<E: Event> Copy for EventId<E> {}
36+
3637
impl<E: Event> Clone for EventId<E> {
3738
fn clone(&self) -> Self {
3839
*self
@@ -747,26 +748,43 @@ impl<'a, E: Event> ExactSizeIterator for EventIteratorWithId<'a, E> {
747748
}
748749
}
749750

751+
#[doc(hidden)]
752+
#[derive(Resource)]
753+
pub struct EventUpdateSignal<T: Event> {
754+
signal: bool,
755+
_marker: PhantomData<fn() -> T>,
756+
}
757+
758+
impl<T: Event> Default for EventUpdateSignal<T> {
759+
fn default() -> Self {
760+
Self {
761+
signal: false,
762+
_marker: PhantomData,
763+
}
764+
}
765+
}
766+
750767
#[doc(hidden)]
751768
#[derive(Resource, Default)]
752-
pub struct EventUpdateSignal(bool);
769+
pub struct EventUpdateShouldWaitForFixedUpdate;
753770

754771
/// A system that queues a call to [`Events::update`].
755-
pub fn event_queue_update_system(signal: Option<ResMut<EventUpdateSignal>>) {
772+
pub fn event_queue_update_system<T: Event>(signal: Option<ResMut<EventUpdateSignal<T>>>) {
756773
if let Some(mut s) = signal {
757-
s.0 = true;
774+
s.signal = true;
758775
}
759776
}
760777

761778
/// A system that calls [`Events::update`].
762779
pub fn event_update_system<T: Event>(
763-
signal: Option<ResMut<EventUpdateSignal>>,
780+
should_wait: Option<Res<EventUpdateShouldWaitForFixedUpdate>>,
781+
mut should_update: ResMut<EventUpdateSignal<T>>,
764782
mut events: ResMut<Events<T>>,
765783
) {
766-
if let Some(mut s) = signal {
784+
if should_wait.is_some() {
767785
// If we haven't got a signal to update the events, but we *could* get such a signal
768786
// return early and update the events later.
769-
if !std::mem::replace(&mut s.0, false) {
787+
if !std::mem::replace(&mut should_update.signal, false) {
770788
return;
771789
}
772790
}

crates/bevy_time/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub mod prelude {
2525
}
2626

2727
use bevy_app::{prelude::*, RunFixedMainLoop};
28-
use bevy_ecs::event::{event_queue_update_system, EventUpdateSignal};
28+
use bevy_ecs::event::{EventUpdateShouldWaitForFixedUpdate};
2929
use bevy_ecs::prelude::*;
3030
use bevy_utils::{tracing::warn, Duration, Instant};
3131
pub use crossbeam_channel::TrySendError;
@@ -60,8 +60,7 @@ impl Plugin for TimePlugin {
6060
.add_systems(RunFixedMainLoop, run_fixed_main_schedule);
6161

6262
// ensure the events are not dropped until `FixedMain` systems can observe them
63-
app.init_resource::<EventUpdateSignal>()
64-
.add_systems(FixedPostUpdate, event_queue_update_system);
63+
app.init_resource::<EventUpdateShouldWaitForFixedUpdate>();
6564

6665
#[cfg(feature = "bevy_ci_testing")]
6766
if let Some(ci_testing_config) = app

0 commit comments

Comments
 (0)