azalea_client/plugins/
tick_broadcast.rs

1use azalea_core::tick::GameTick;
2use bevy_app::prelude::*;
3use bevy_ecs::prelude::*;
4use derive_more::Deref;
5use tokio::sync::broadcast;
6
7/// A resource that contains a [`broadcast::Sender`] that will be sent every
8/// Minecraft tick.
9///
10/// This is useful for running code every schedule from async user code.
11///
12/// ```
13/// use azalea_client::tick_broadcast::TickBroadcast;
14/// # async fn example(client: azalea_client::Client) {
15/// let mut receiver = {
16///     let ecs = client.ecs.lock();
17///     let tick_broadcast = ecs.resource::<TickBroadcast>();
18///     tick_broadcast.subscribe()
19/// };
20/// while receiver.recv().await.is_ok() {
21///     // do something
22/// }
23/// # }
24/// ```
25#[derive(Resource, Deref)]
26pub struct TickBroadcast(broadcast::Sender<()>);
27/// A resource that contains a [`broadcast::Sender`] that will be sent every
28/// Azalea ECS Update.
29///
30/// Also see [`TickBroadcast`].
31#[derive(Resource, Deref)]
32pub struct UpdateBroadcast(broadcast::Sender<()>);
33
34pub fn send_tick_broadcast(tick_broadcast: ResMut<TickBroadcast>) {
35    let _ = tick_broadcast.0.send(());
36}
37pub fn send_update_broadcast(update_broadcast: ResMut<UpdateBroadcast>) {
38    let _ = update_broadcast.0.send(());
39}
40/// A plugin that makes the [`RanScheduleBroadcast`] resource available.
41pub struct TickBroadcastPlugin;
42impl Plugin for TickBroadcastPlugin {
43    fn build(&self, app: &mut App) {
44        app.insert_resource(TickBroadcast(broadcast::channel(1).0))
45            .insert_resource(UpdateBroadcast(broadcast::channel(1).0))
46            .add_systems(GameTick, send_tick_broadcast)
47            .add_systems(Update, send_update_broadcast);
48    }
49}