From a9820dfd79bf24a0a6fcb2345aad6c79a21585a5 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 15 Apr 2025 22:04:43 -0430 Subject: make goto async and clean up some examples --- azalea-client/src/plugins/mod.rs | 1 + azalea-client/src/plugins/tick_broadcast.rs | 45 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 azalea-client/src/plugins/tick_broadcast.rs (limited to 'azalea-client/src/plugins') diff --git a/azalea-client/src/plugins/mod.rs b/azalea-client/src/plugins/mod.rs index b5005b22..3b047ccb 100644 --- a/azalea-client/src/plugins/mod.rs +++ b/azalea-client/src/plugins/mod.rs @@ -12,4 +12,5 @@ pub mod packet; pub mod pong; pub mod respawn; pub mod task_pool; +pub mod tick_broadcast; pub mod tick_end; diff --git a/azalea-client/src/plugins/tick_broadcast.rs b/azalea-client/src/plugins/tick_broadcast.rs new file mode 100644 index 00000000..161413d8 --- /dev/null +++ b/azalea-client/src/plugins/tick_broadcast.rs @@ -0,0 +1,45 @@ +use azalea_core::tick::GameTick; +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::Deref; +use tokio::sync::broadcast; + +/// A resource that contains a [`broadcast::Sender`] that will be sent every +/// Minecraft tick. +/// +/// This is useful for running code every schedule from async user code. +/// +/// ``` +/// use azalea_client::TickBroadcast; +/// # async fn example(client: azalea_client::Client) { +/// let mut receiver = { +/// let ecs = client.ecs.lock(); +/// let tick_broadcast = ecs.resource::(); +/// tick_broadcast.subscribe() +/// }; +/// while receiver.recv().await.is_ok() { +/// // do something +/// } +/// # } +/// ``` +#[derive(Resource, Deref)] +pub struct TickBroadcast(broadcast::Sender<()>); +#[derive(Resource, Deref)] +pub struct UpdateBroadcast(broadcast::Sender<()>); + +pub fn send_tick_broadcast(tick_broadcast: ResMut) { + let _ = tick_broadcast.0.send(()); +} +pub fn send_update_broadcast(update_broadcast: ResMut) { + let _ = update_broadcast.0.send(()); +} +/// A plugin that makes the [`RanScheduleBroadcast`] resource available. +pub struct TickBroadcastPlugin; +impl Plugin for TickBroadcastPlugin { + fn build(&self, app: &mut App) { + app.insert_resource(TickBroadcast(broadcast::channel(1).0)) + .insert_resource(UpdateBroadcast(broadcast::channel(1).0)) + .add_systems(GameTick, send_tick_broadcast) + .add_systems(Update, send_update_broadcast); + } +} -- cgit v1.2.3