1+ use ferrumc_config:: statics:: { get_global_config, get_whitelist} ;
2+ use ferrumc_core:: chunks:: chunk_receiver:: ChunkReceiver ;
13use ferrumc_core:: identity:: player_identity:: PlayerIdentity ;
24use ferrumc_core:: transform:: grounded:: OnGround ;
35use ferrumc_core:: transform:: position:: Position ;
@@ -15,6 +17,7 @@ use ferrumc_net::packets::outgoing::client_bound_known_packs::ClientBoundKnownPa
1517use ferrumc_net:: packets:: outgoing:: finish_configuration:: FinishConfigurationPacket ;
1618use ferrumc_net:: packets:: outgoing:: game_event:: GameEventPacket ;
1719use ferrumc_net:: packets:: outgoing:: keep_alive:: OutgoingKeepAlivePacket ;
20+ use ferrumc_net:: packets:: outgoing:: login_disconnect:: LoginDisconnectPacket ;
1821use ferrumc_net:: packets:: outgoing:: login_play:: LoginPlayPacket ;
1922use ferrumc_net:: packets:: outgoing:: login_success:: LoginSuccessPacket ;
2023use ferrumc_net:: packets:: outgoing:: registry_data:: get_registry_packets;
@@ -31,23 +34,47 @@ async fn handle_login_start(
3134 login_start_event : LoginStartEvent ,
3235 state : GlobalState ,
3336) -> Result < LoginStartEvent , NetError > {
34- debug ! ( "Handling login start event" ) ;
35-
3637 let uuid = login_start_event. login_start_packet . uuid ;
3738 let username = login_start_event. login_start_packet . username . as_str ( ) ;
38- debug ! ( "Received login start from user with username {}" , username) ;
39+ let player_identity = PlayerIdentity :: new ( username. to_string ( ) , uuid) ;
40+ debug ! ( "Handling login start event for user: {username}, uuid: {uuid}" ) ;
3941
4042 // Add the player identity component to the ECS for the entity.
41- state. universe . add_component :: < PlayerIdentity > (
42- login_start_event. conn_id ,
43- PlayerIdentity :: new ( username. to_string ( ) , uuid) ,
44- ) ?;
43+ state
44+ . universe
45+ . add_component :: < PlayerIdentity > (
46+ login_start_event. conn_id ,
47+ PlayerIdentity :: new ( username. to_string ( ) , uuid) ,
48+ ) ?
49+ . add_component :: < ChunkReceiver > ( login_start_event. conn_id , ChunkReceiver :: default ( ) ) ?;
4550
4651 //Send a Login Success Response to further the login sequence
4752 let mut writer = state
4853 . universe
4954 . get_mut :: < StreamWriter > ( login_start_event. conn_id ) ?;
5055
56+ if get_global_config ( ) . whitelist {
57+ let whitelist = get_whitelist ( ) ;
58+
59+ if whitelist. get ( & uuid) . is_none ( ) {
60+ writer
61+ . send_packet (
62+ & LoginDisconnectPacket :: new (
63+ "{\" translate\" :\" multiplayer.disconnect.not_whitelisted\" }" ,
64+ ) ,
65+ & NetEncodeOpts :: WithLength ,
66+ )
67+ . await ?;
68+ return Ok ( login_start_event) ;
69+ }
70+ }
71+
72+ // Add the player identity component to the ECS for the entity.
73+ state
74+ . universe
75+ . add_component :: < PlayerIdentity > ( login_start_event. conn_id , player_identity) ?;
76+
77+ //Send a Login Success Response to further the login sequence
5178 writer
5279 . send_packet (
5380 & LoginSuccessPacket :: new ( uuid, username) ,
@@ -168,6 +195,12 @@ async fn handle_ack_finish_configuration(
168195 & NetEncodeOpts :: WithLength ,
169196 )
170197 . await ?;
198+
199+ let pos = state. universe . get_mut :: < Position > ( conn_id) ?;
200+ let mut chunk_recv = state. universe . get_mut :: < ChunkReceiver > ( conn_id) ?;
201+ chunk_recv. last_chunk = Some ( ( pos. x as i32 , pos. z as i32 , String :: from ( "overworld" ) ) ) ;
202+ chunk_recv. calculate_chunks ( ) . await ;
203+
171204 send_keep_alive ( conn_id, state, & mut writer) . await ?;
172205
173206 Ok ( ack_finish_configuration_event)
0 commit comments