1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00

addd disconnect reason (#114)

This commit is contained in:
1zuna 2023-12-02 05:45:12 +01:00 committed by GitHub
parent d21e496bc3
commit fbee81e609
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 18 additions and 3 deletions

View file

@ -422,6 +422,7 @@ impl Client {
pub fn disconnect(&self) { pub fn disconnect(&self) {
self.ecs.lock().send_event(DisconnectEvent { self.ecs.lock().send_event(DisconnectEvent {
entity: self.entity, entity: self.entity,
reason: None,
}); });
} }

View file

@ -33,6 +33,7 @@ impl Plugin for DisconnectPlugin {
#[derive(Event)] #[derive(Event)]
pub struct DisconnectEvent { pub struct DisconnectEvent {
pub entity: Entity, pub entity: Entity,
pub reason: Option<String>,
} }
/// System that removes the [`JoinedClientBundle`] from the entity when it /// System that removes the [`JoinedClientBundle`] from the entity when it
@ -41,7 +42,7 @@ pub fn remove_components_from_disconnected_players(
mut commands: Commands, mut commands: Commands,
mut events: EventReader<DisconnectEvent>, mut events: EventReader<DisconnectEvent>,
) { ) {
for DisconnectEvent { entity } in events.read() { for DisconnectEvent { entity, .. } in events.read() {
commands.entity(*entity).remove::<JoinedClientBundle>(); commands.entity(*entity).remove::<JoinedClientBundle>();
} }
} }
@ -64,7 +65,7 @@ fn disconnect_on_connection_dead(
) { ) {
for (entity, &is_connection_alive) in &query { for (entity, &is_connection_alive) in &query {
if !*is_connection_alive { if !*is_connection_alive {
disconnect_events.send(DisconnectEvent { entity }); disconnect_events.send(DisconnectEvent { entity, reason: None });
} }
} }
} }

View file

@ -24,7 +24,7 @@ use crate::{
AddPlayerEvent, DeathEvent, KeepAliveEvent, PacketEvent, RemovePlayerEvent, AddPlayerEvent, DeathEvent, KeepAliveEvent, PacketEvent, RemovePlayerEvent,
UpdatePlayerEvent, UpdatePlayerEvent,
}, },
PlayerInfo, PlayerInfo, disconnect::DisconnectEvent,
}; };
// (for contributors): // (for contributors):
@ -93,6 +93,8 @@ pub enum Event {
Death(Option<Arc<ClientboundPlayerCombatKillPacket>>), Death(Option<Arc<ClientboundPlayerCombatKillPacket>>),
/// A `KeepAlive` packet was sent by the server. /// A `KeepAlive` packet was sent by the server.
KeepAlive(u64), KeepAlive(u64),
/// The client disconnected from the server.
Disconnect(Option<String>),
} }
/// A component that contains an event sender for events that are only /// A component that contains an event sender for events that are only
@ -117,6 +119,7 @@ impl Plugin for EventPlugin {
remove_player_listener, remove_player_listener,
keepalive_listener, keepalive_listener,
death_listener, death_listener,
disconnect_listener,
), ),
) )
.add_systems( .add_systems(
@ -229,3 +232,11 @@ fn keepalive_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<
.unwrap(); .unwrap();
} }
} }
fn disconnect_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<DisconnectEvent>) {
for event in events.read() {
if let Ok(local_player_events) = query.get(event.entity) {
let _ = local_player_events.send(Event::Disconnect(event.reason.clone()));
}
}
}

View file

@ -104,6 +104,7 @@ pub fn process_packet_events(ecs: &mut World) {
let mut disconnect_events = system_state.get_mut(ecs); let mut disconnect_events = system_state.get_mut(ecs);
disconnect_events.send(DisconnectEvent { disconnect_events.send(DisconnectEvent {
entity: player_entity, entity: player_entity,
reason: Some(p.reason.to_ansi()),
}); });
} }
ClientboundConfigurationPacket::FinishConfiguration(p) => { ClientboundConfigurationPacket::FinishConfiguration(p) => {

View file

@ -401,6 +401,7 @@ pub fn process_packet_events(ecs: &mut World) {
let mut disconnect_events = system_state.get_mut(ecs); let mut disconnect_events = system_state.get_mut(ecs);
disconnect_events.send(DisconnectEvent { disconnect_events.send(DisconnectEvent {
entity: player_entity, entity: player_entity,
reason: Some(p.reason.to_ansi()),
}); });
} }
ClientboundGamePacket::UpdateRecipes(_p) => { ClientboundGamePacket::UpdateRecipes(_p) => {