1+ use crate :: systems:: system_messages;
12use bevy_ecs:: prelude:: { Commands , Entity , Query , Res } ;
23use ferrumc_core:: identity:: player_identity:: PlayerIdentity ;
34use ferrumc_net:: connection:: StreamWriter ;
@@ -11,40 +12,48 @@ pub fn connection_killer(
1112 state : Res < GlobalStateResource > ,
1213) {
1314 while let Some ( ( disconnecting_entity, reason) ) = state. 0 . players . disconnection_queue . pop ( ) {
14- for ( entity, conn, player_identity) in query. iter ( ) {
15- if disconnecting_entity == entity {
16- info ! (
17- "Player {} ({}) disconnected: {}" ,
18- player_identity. username,
19- player_identity. uuid,
20- reason. as_deref( ) . unwrap_or( "No reason" )
21- ) ;
22- if conn. running . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
23- trace ! (
24- "Sending disconnect packet to player {}" ,
25- player_identity. username
26- ) ;
27- if let Err ( e) = conn. send_packet_ref (
28- & ferrumc_net:: packets:: outgoing:: disconnect:: DisconnectPacket {
29- reason : TextComponent :: from (
30- reason. as_deref ( ) . unwrap_or ( "Disconnected" ) ,
31- ) ,
32- } ,
33- ) {
34- warn ! (
35- "Failed to send disconnect packet to player {}: {:?}" ,
36- player_identity. username, e
15+ let entity_result = query. get ( disconnecting_entity) ;
16+ match entity_result {
17+ Ok ( disconnecting_player) => {
18+ for ( entity, conn, player_identity) in query. iter ( ) {
19+ if disconnecting_entity == entity {
20+ info ! (
21+ "Player {} ({}) disconnected: {}" ,
22+ player_identity. username,
23+ player_identity. uuid,
24+ reason. as_deref( ) . unwrap_or( "No reason" )
3725 ) ;
38- }
39- } else {
40- trace ! (
26+ if conn. running . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
27+ trace ! (
28+ "Sending disconnect packet to player {}" ,
29+ player_identity. username
30+ ) ;
31+ if let Err ( e) = conn. send_packet_ref (
32+ & ferrumc_net:: packets:: outgoing:: disconnect:: DisconnectPacket {
33+ reason : TextComponent :: from (
34+ reason. as_deref ( ) . unwrap_or ( "Disconnected" ) ,
35+ ) ,
36+ } ,
37+ ) {
38+ warn ! (
39+ "Failed to send disconnect packet to player {}: {:?}" ,
40+ player_identity. username, e
41+ ) ;
42+ }
43+ } else {
44+ trace ! (
4145 "Connection for player {} is not running, skipping disconnect packet" ,
4246 player_identity. username
4347 ) ;
48+ }
49+ } else {
50+ system_messages:: player_leave:: handle ( disconnecting_player. 2 , entity) ;
51+ }
52+ cmd. entity ( entity) . despawn ( ) ;
4453 }
45- cmd . entity ( entity ) . despawn ( ) ;
46- } else {
47- // Broadcast the disconnection to other players
54+ }
55+ Err ( e ) => {
56+ warn ! ( "Player's entity has already been removed: {}" , e ) ;
4857 }
4958 }
5059 }
0 commit comments