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) {
self.ecs.lock().send_event(DisconnectEvent {
entity: self.entity,
reason: None,
});
}

View file

@ -33,6 +33,7 @@ impl Plugin for DisconnectPlugin {
#[derive(Event)]
pub struct DisconnectEvent {
pub entity: Entity,
pub reason: Option<String>,
}
/// 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 events: EventReader<DisconnectEvent>,
) {
for DisconnectEvent { entity } in events.read() {
for DisconnectEvent { entity, .. } in events.read() {
commands.entity(*entity).remove::<JoinedClientBundle>();
}
}
@ -64,7 +65,7 @@ fn disconnect_on_connection_dead(
) {
for (entity, &is_connection_alive) in &query {
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,
UpdatePlayerEvent,
},
PlayerInfo,
PlayerInfo, disconnect::DisconnectEvent,
};
// (for contributors):
@ -93,6 +93,8 @@ pub enum Event {
Death(Option<Arc<ClientboundPlayerCombatKillPacket>>),
/// A `KeepAlive` packet was sent by the server.
KeepAlive(u64),
/// The client disconnected from the server.
Disconnect(Option<String>),
}
/// A component that contains an event sender for events that are only
@ -117,6 +119,7 @@ impl Plugin for EventPlugin {
remove_player_listener,
keepalive_listener,
death_listener,
disconnect_listener,
),
)
.add_systems(
@ -229,3 +232,11 @@ fn keepalive_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<
.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);
disconnect_events.send(DisconnectEvent {
entity: player_entity,
reason: Some(p.reason.to_ansi()),
});
}
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);
disconnect_events.send(DisconnectEvent {
entity: player_entity,
reason: Some(p.reason.to_ansi()),
});
}
ClientboundGamePacket::UpdateRecipes(_p) => {