@@ -12,58 +12,62 @@ pub fn connection_killer(
1212 & StreamWriter ,
1313 & PlayerIdentity ,
1414 & mut DisconnectHandle ,
15- ) > , // Mutable query
15+ ) > ,
1616 mut cmd : Commands ,
1717 state : Res < GlobalStateResource > ,
1818) {
1919 while let Some ( ( disconnecting_entity, reason) ) = state. 0 . players . disconnection_queue . pop ( ) {
20- let entity_result = query. get ( disconnecting_entity) ;
21- match entity_result {
22- Ok ( disconnecting_player) => {
23- for ( entity, conn, player_identity, mut disconnect_handle) in query. iter_mut ( ) {
24- if disconnecting_entity == entity {
25- info ! (
26- "Player {} ({}) disconnected: {}" ,
27- player_identity. username,
28- player_identity. uuid,
29- reason. as_deref( ) . unwrap_or( "No reason" )
20+ let disconnecting_player_identity = query
21+ . get ( disconnecting_entity)
22+ . ok ( )
23+ . map ( |( _, _, identity, _) | identity. clone ( ) ) ;
24+
25+ if disconnecting_player_identity. is_none ( ) {
26+ warn ! ( "Player's entity has already been removed" ) ;
27+ continue ;
28+ }
29+
30+ let disconnecting_player_identity = disconnecting_player_identity. unwrap ( ) ;
31+
32+ for ( entity, conn, player_identity, mut disconnect_handle) in query. iter_mut ( ) {
33+ if disconnecting_entity == entity {
34+ info ! (
35+ "Player {} ({}) disconnected: {}" ,
36+ player_identity. username,
37+ player_identity. uuid,
38+ reason. as_deref( ) . unwrap_or( "No reason" )
39+ ) ;
40+ if conn. running . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
41+ trace ! (
42+ "Sending disconnect packet to player {}" ,
43+ player_identity. username
44+ ) ;
45+ if let Err ( e) = conn. send_packet_ref (
46+ & ferrumc_net:: packets:: outgoing:: disconnect:: DisconnectPacket {
47+ reason : TextComponent :: from (
48+ reason. as_deref ( ) . unwrap_or ( "Disconnected" ) ,
49+ ) ,
50+ } ,
51+ ) {
52+ warn ! (
53+ "Failed to send disconnect packet to player {}: {:?}" ,
54+ player_identity. username, e
3055 ) ;
31- if conn. running . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
32- trace ! (
33- "Sending disconnect packet to player {}" ,
34- player_identity. username
35- ) ;
36- if let Err ( e) = conn. send_packet_ref (
37- & ferrumc_net:: packets:: outgoing:: disconnect:: DisconnectPacket {
38- reason : TextComponent :: from (
39- reason. as_deref ( ) . unwrap_or ( "Disconnected" ) ,
40- ) ,
41- } ,
42- ) {
43- warn ! (
44- "Failed to send disconnect packet to player {}: {:?}" ,
45- player_identity. username, e
46- ) ;
47- }
48- if let Some ( sender) = disconnect_handle. sender . take ( ) {
49- if let Err ( _) = sender. send ( ( ) ) {
50- trace ! ( "Failed to send disconnect signal (receiver already dropped)" ) ;
51- }
52- }
53- } else {
54- trace ! (
55- "Connection for player {} is not running, skipping disconnect packet" ,
56- player_identity. username
57- ) ;
56+ }
57+ if let Some ( sender) = disconnect_handle. sender . take ( ) {
58+ if sender. send ( ( ) ) . is_err ( ) {
59+ trace ! ( "Failed to send disconnect signal (receiver already dropped)" ) ;
5860 }
59- } else {
60- system_messages:: player_leave:: handle ( disconnecting_player. 2 , entity) ;
6161 }
62- cmd. entity ( entity) . despawn ( ) ;
62+ } else {
63+ trace ! (
64+ "Connection for player {} is not running, skipping disconnect packet" ,
65+ player_identity. username
66+ ) ;
6367 }
64- }
65- Err ( e ) => {
66- warn ! ( "Player's entity has already been removed: {}" , e ) ;
68+ cmd . entity ( entity ) . despawn ( ) ;
69+ } else {
70+ system_messages :: player_leave :: handle ( & disconnecting_player_identity , entity ) ;
6771 }
6872 }
6973 }
0 commit comments