Skip to content

Commit 912da04

Browse files
authored
Run observers before hooks for on_replace and on_remove (bevyengine#16499)
# Objective - Fixes bevyengine#16498 ## Solution - Trivially swaps ordering of hooks and observers for all call sites where they are triggered for `on_replace` or `on_remove` ## Testing - Just CI --- ## Migration Guide The order of hooks and observers for `on_replace` and `on_remove` has been swapped. Observers are now run before hooks. This is a more natural ordering where the removal ordering is inverted compared to the insertion ordering.
1 parent 0070514 commit 912da04

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

crates/bevy_ecs/src/bundle.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,14 +902,14 @@ impl<'w> BundleInserter<'w> {
902902
let mut deferred_world = self.world.into_deferred();
903903

904904
if insert_mode == InsertMode::Replace {
905-
deferred_world.trigger_on_replace(archetype, entity, add_bundle.iter_existing());
906905
if archetype.has_replace_observer() {
907906
deferred_world.trigger_observers(
908907
ON_REPLACE,
909908
entity,
910909
add_bundle.iter_existing(),
911910
);
912911
}
912+
deferred_world.trigger_on_replace(archetype, entity, add_bundle.iter_existing());
913913
}
914914
}
915915

crates/bevy_ecs/src/world/entity_ref.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,14 +1863,14 @@ impl<'w> EntityWorldMut<'w> {
18631863

18641864
// SAFETY: All components in the archetype exist in world
18651865
unsafe {
1866-
deferred_world.trigger_on_replace(archetype, self.entity, archetype.components());
18671866
if archetype.has_replace_observer() {
18681867
deferred_world.trigger_observers(ON_REPLACE, self.entity, archetype.components());
18691868
}
1870-
deferred_world.trigger_on_remove(archetype, self.entity, archetype.components());
1869+
deferred_world.trigger_on_replace(archetype, self.entity, archetype.components());
18711870
if archetype.has_remove_observer() {
18721871
deferred_world.trigger_observers(ON_REMOVE, self.entity, archetype.components());
18731872
}
1873+
deferred_world.trigger_on_remove(archetype, self.entity, archetype.components());
18741874
}
18751875

18761876
for component_id in archetype.components() {
@@ -2118,18 +2118,18 @@ unsafe fn trigger_on_replace_and_on_remove_hooks_and_observers(
21182118
entity: Entity,
21192119
bundle_info: &BundleInfo,
21202120
) {
2121-
deferred_world.trigger_on_replace(archetype, entity, bundle_info.iter_explicit_components());
21222121
if archetype.has_replace_observer() {
21232122
deferred_world.trigger_observers(
21242123
ON_REPLACE,
21252124
entity,
21262125
bundle_info.iter_explicit_components(),
21272126
);
21282127
}
2129-
deferred_world.trigger_on_remove(archetype, entity, bundle_info.iter_explicit_components());
2128+
deferred_world.trigger_on_replace(archetype, entity, bundle_info.iter_explicit_components());
21302129
if archetype.has_remove_observer() {
21312130
deferred_world.trigger_observers(ON_REMOVE, entity, bundle_info.iter_explicit_components());
21322131
}
2132+
deferred_world.trigger_on_remove(archetype, entity, bundle_info.iter_explicit_components());
21332133
}
21342134

21352135
const QUERY_MISMATCH_ERROR: &str = "Query does not match the current entity";
@@ -4910,14 +4910,14 @@ mod tests {
49104910
"OrdB hook on_insert",
49114911
"OrdB observer on_insert",
49124912
"OrdB command on_add", // command added by OrdB hook on_add, needs to run before despawn command
4913-
"OrdA hook on_replace", // start of despawn
4914-
"OrdB hook on_replace",
4915-
"OrdA observer on_replace",
4913+
"OrdA observer on_replace", // start of despawn
49164914
"OrdB observer on_replace",
4917-
"OrdA hook on_remove",
4918-
"OrdB hook on_remove",
4915+
"OrdA hook on_replace",
4916+
"OrdB hook on_replace",
49194917
"OrdA observer on_remove",
49204918
"OrdB observer on_remove",
4919+
"OrdA hook on_remove",
4920+
"OrdB hook on_remove",
49214921
];
49224922
world.flush();
49234923
assert_eq!(world.resource_mut::<TestVec>().0.as_slice(), &expected[..]);

0 commit comments

Comments
 (0)