aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2025-03-25 04:06:47 +0000
committermat <git@matdoes.dev>2025-03-25 04:06:47 +0000
commit656162d2186444f70512af7012f87bfbf9da916a (patch)
treeba8e3f52e0f681a4cd2c46525c207f977a861251 /azalea-client/src
parent113222a3a25f0952958c0d0d19968090aa1f34d7 (diff)
downloadazalea-drasl-656162d2186444f70512af7012f87bfbf9da916a.tar.xz
make events channel in Client::start_client optional
Diffstat (limited to 'azalea-client/src')
-rw-r--r--azalea-client/src/client.rs37
-rw-r--r--azalea-client/src/test_simulation.rs4
2 files changed, 27 insertions, 14 deletions
diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs
index f18de86d..4b57c270 100644
--- a/azalea-client/src/client.rs
+++ b/azalea-client/src/client.rs
@@ -149,6 +149,7 @@ pub struct StartClientOpts<'a> {
pub resolved_address: &'a SocketAddr,
pub proxy: Option<Proxy>,
pub run_schedule_sender: mpsc::Sender<()>,
+ pub event_sender: Option<mpsc::UnboundedSender<Event>>,
}
impl<'a> StartClientOpts<'a> {
@@ -156,6 +157,7 @@ impl<'a> StartClientOpts<'a> {
account: &'a Account,
address: &'a ServerAddress,
resolved_address: &'a SocketAddr,
+ event_sender: Option<mpsc::UnboundedSender<Event>>,
) -> StartClientOpts<'a> {
// An event that causes the schedule to run. This is only used internally.
let (run_schedule_sender, run_schedule_receiver) = mpsc::channel(1);
@@ -172,6 +174,7 @@ impl<'a> StartClientOpts<'a> {
resolved_address,
proxy: None,
run_schedule_sender,
+ event_sender,
}
}
@@ -229,8 +232,16 @@ impl Client {
) -> Result<(Self, mpsc::UnboundedReceiver<Event>), JoinError> {
let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?;
let resolved_address = resolver::resolve_address(&address).await?;
+ let (tx, rx) = mpsc::unbounded_channel();
- Self::start_client(StartClientOpts::new(account, &address, &resolved_address)).await
+ let client = Self::start_client(StartClientOpts::new(
+ account,
+ &address,
+ &resolved_address,
+ Some(tx),
+ ))
+ .await?;
+ Ok((client, rx))
}
pub async fn join_with_proxy(
@@ -240,9 +251,13 @@ impl Client {
) -> Result<(Self, mpsc::UnboundedReceiver<Event>), JoinError> {
let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?;
let resolved_address = resolver::resolve_address(&address).await?;
+ let (tx, rx) = mpsc::unbounded_channel();
- Self::start_client(StartClientOpts::new(account, &address, &resolved_address).proxy(proxy))
- .await
+ let client = Self::start_client(
+ StartClientOpts::new(account, &address, &resolved_address, Some(tx)).proxy(proxy),
+ )
+ .await?;
+ Ok((client, rx))
}
/// Create a [`Client`] when you already have the ECS made with
@@ -255,8 +270,9 @@ impl Client {
resolved_address,
proxy,
run_schedule_sender,
+ event_sender,
}: StartClientOpts<'_>,
- ) -> Result<(Self, mpsc::UnboundedReceiver<Event>), JoinError> {
+ ) -> Result<Self, JoinError> {
// check if an entity with our uuid already exists in the ecs and if so then
// just use that
let entity = {
@@ -298,8 +314,6 @@ impl Client {
// we did the handshake, so now we're connected to the server
- let (tx, rx) = mpsc::unbounded_channel();
-
let mut ecs = ecs_lock.lock();
// we got the ConfigurationConnection, so the client is now connected :)
@@ -318,7 +332,8 @@ impl Client {
Arc::new(RwLock::new(instance)),
);
- ecs.entity_mut(entity).insert((
+ let mut entity = ecs.entity_mut(entity);
+ entity.insert((
// these stay when we switch to the game state
LocalPlayerBundle {
raw_connection: RawConnection::new(
@@ -327,7 +342,6 @@ impl Client {
read_conn,
write_conn,
),
- local_player_events: LocalPlayerEvents(tx),
game_profile: GameProfileComponent(game_profile),
client_information: crate::ClientInformation::default(),
instance_holder,
@@ -337,8 +351,12 @@ impl Client {
// this component is never removed
LocalEntity,
));
+ if let Some(event_sender) = event_sender {
+ // this is optional so we don't leak memory in case the user
+ entity.insert(LocalPlayerEvents(event_sender));
+ }
- Ok((client, rx))
+ Ok(client)
}
/// Do a handshake with the server and get to the game state from the
@@ -797,7 +815,6 @@ impl Client {
#[derive(Bundle)]
pub struct LocalPlayerBundle {
pub raw_connection: RawConnection,
- pub local_player_events: LocalPlayerEvents,
pub game_profile: GameProfileComponent,
pub client_information: ClientInformation,
pub instance_holder: InstanceHolder,
diff --git a/azalea-client/src/test_simulation.rs b/azalea-client/src/test_simulation.rs
index 0f34c14e..13d65bbb 100644
--- a/azalea-client/src/test_simulation.rs
+++ b/azalea-client/src/test_simulation.rs
@@ -30,7 +30,6 @@ use uuid::Uuid;
use crate::disconnect::DisconnectEvent;
use crate::{
ClientInformation, GameProfileComponent, InConfigState, InstanceHolder, LocalPlayerBundle,
- events::LocalPlayerEvents,
raw_connection::{RawConnection, RawConnectionReader, RawConnectionWriter},
};
@@ -191,14 +190,11 @@ fn create_local_player_bundle(
connection_protocol,
};
- let (local_player_events_sender, _local_player_events_receiver) = mpsc::unbounded_channel();
-
let instance = Instance::default();
let instance_holder = InstanceHolder::new(entity, Arc::new(RwLock::new(instance)));
let local_player_bundle = LocalPlayerBundle {
raw_connection,
- local_player_events: LocalPlayerEvents(local_player_events_sender),
game_profile: GameProfileComponent(GameProfile::new(Uuid::nil(), "azalea".to_owned())),
client_information: ClientInformation::default(),
instance_holder,