@@ -13,10 +13,11 @@ use crate::io::{
1313 WorkerToServerMessage ,
1414} ;
1515use crate :: packet_buffer:: PacketBuffers ;
16+ use feather_core:: entity:: BaseEntityData ;
1617use feather_core:: network:: codec:: MinecraftCodec ;
1718use feather_core:: network:: packet:: PacketDirection ;
1819use feather_core:: player_data:: PlayerData ;
19- use feather_core:: Packet ;
20+ use feather_core:: { Packet , Position , Vec3d } ;
2021use fecs:: Entity ;
2122use futures:: channel:: mpsc;
2223use futures:: future:: Either ;
@@ -33,6 +34,7 @@ use uuid::Uuid;
3334
3435struct Worker {
3536 framed : Framed < TcpStream , MinecraftCodec > ,
37+ config : Arc < Config > ,
3638 ip : SocketAddr ,
3739 /// The listener's sender to send the initial `NewClient` message
3840 /// to the server. Also used to request an entity for the player.
@@ -93,6 +95,7 @@ pub async fn run_worker(
9395 tx,
9496 initial_handler,
9597 entity,
98+ config,
9699 } ;
97100
98101 let msg = match run_worker_impl ( & mut worker) . await {
@@ -188,13 +191,15 @@ async fn handle_ih_actions(worker: &mut Worker) -> anyhow::Result<()> {
188191 Action :: Disconnect => anyhow:: bail!( "initial handler requested disconnect" ) ,
189192 Action :: SetStage ( stage) => worker. framed . codec_mut ( ) . set_stage ( stage) ,
190193 Action :: JoinGame ( info) => {
194+ let data = load_player_data ( & worker. config , info. uuid ) . await ?;
195+ let position = data. entity . read_position ( ) ?;
191196 let info = NewClientInfo {
192197 ip : worker. ip ,
193198 username : info. username . unwrap_or_else ( || String :: from ( "undefined" ) ) ,
194199 profile : info. props ,
195200 uuid : info. uuid ,
196- data : Default :: default ( ) , // TODO
197- position : position ! ( 0.0 , 70.0 , 0.0 ) , // TODO
201+ data,
202+ position,
198203 sender : worker. server_tx . clone ( ) ,
199204 receiver : worker. server_rx . clone ( ) ,
200205 entity : worker. entity ,
@@ -213,7 +218,29 @@ async fn handle_ih_actions(worker: &mut Worker) -> anyhow::Result<()> {
213218 Ok ( ( ) )
214219}
215220
216- #[ allow( dead_code) ] // TODO
217- async fn load_player_data ( config : & Config , uuid : Uuid ) -> Result < PlayerData , nbt:: Error > {
218- feather_core:: player_data:: load_player_data ( Path :: new ( & config. world . name ) , uuid) . await
221+ const DEFAULT_POSITION : Position = position ! ( 0.0 , 70.0 , 0.0 ) ; // TODO: better calculation
222+
223+ async fn load_player_data ( config : & Config , uuid : Uuid ) -> Result < PlayerData , anyhow:: Error > {
224+ log:: debug!( "Loading player data for UUID {}" , uuid) ;
225+ match feather_core:: player_data:: load_player_data ( Path :: new ( & config. world . name ) , uuid) . await {
226+ Ok ( data) => Ok ( data) ,
227+ Err ( e) => {
228+ log:: debug!(
229+ "Failed to load player data for {} ({}); creating default data" ,
230+ uuid,
231+ e,
232+ ) ;
233+
234+ let data = PlayerData {
235+ entity : BaseEntityData :: new ( DEFAULT_POSITION , Vec3d :: broadcast ( 0.0 ) ) ,
236+ gamemode : config. server . default_gamemode . id ( ) as i32 ,
237+ inventory : vec ! [ ] ,
238+ } ;
239+
240+ feather_core:: player_data:: save_player_data ( Path :: new ( & config. world . name ) , uuid, & data)
241+ . await ?;
242+
243+ Ok ( data)
244+ }
245+ }
219246}
0 commit comments