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 [`UpdateBroadcast`] and [`TickBroadcast`] resources
41/// available.
42pub struct TickBroadcastPlugin;
43impl Plugin for TickBroadcastPlugin {
44 fn build(&self, app: &mut App) {
45 app.insert_resource(TickBroadcast(broadcast::channel(1).0))
46 .insert_resource(UpdateBroadcast(broadcast::channel(1).0))
47 .add_systems(GameTick, send_tick_broadcast)
48 .add_systems(Update, send_update_broadcast);
49 }
50}