use bevy::prelude::*; use bevy_replicon::prelude::{ClientId, ConnectedClient, SendMode, ToClients}; use shared::{ GameState, global_observer, protocol::{TbMapEntityId, messages::DespawnTbMapEntity}, }; pub fn plugin(app: &mut App) { app.register_type::(); app.init_resource::(); app.add_systems( OnEnter(GameState::MapLoading), |mut cache: ResMut| cache.0.clear(), ); global_observer!(app, add_despawned_entities_to_cache); global_observer!(app, send_new_client_despawned_cache); } fn add_despawned_entities_to_cache( trigger: On, id: Query<&TbMapEntityId>, mut cache: ResMut, ) { cache.0.push(id.get(trigger.event().entity).unwrap().id); } #[derive(Default, Resource, Reflect)] #[reflect(Resource)] pub struct DespawnedTbEntityCache(pub Vec); fn send_new_client_despawned_cache( on: On, cache: Res, mut send: MessageWriter>, ) { for &id in cache.0.iter() { send.write(ToClients { mode: SendMode::Direct(ClientId::Client(on.entity)), message: DespawnTbMapEntity(id), }); } }