@@ -3,10 +3,11 @@ use crate::io::{ServerToListenerMessage, ServerToWorkerMessage};
33use crate :: prelude:: * ;
44use crate :: { add_player, initialhandler as ih, remove_player, Entity , State } ;
55use feather_core:: entitymeta:: { EntityMetadata , MetaEntry } ;
6- use feather_core:: network:: packet:: { implementation:: * , Packet } ;
6+ use feather_core:: network:: packet:: { implementation:: * , Packet , PacketType } ;
77use mio_extras:: channel:: { Receiver , Sender } ;
88
99//const MAX_KEEP_ALIVE_TIME: u64 = 30;
10+ //const HEAD_OFFSET: f64 = 1.62; // Offset from feet pos to head pos
1011
1112pub struct NetworkComponent {
1213 sender : Sender < ServerToWorkerMessage > ,
@@ -45,7 +46,7 @@ fn handle_connections(state: &mut State) {
4546 remove_player ( state, player) ;
4647 }
4748 } else {
48- // TODO
49+ handle_player_packet ( state , player , packet ) ;
4950 }
5051 }
5152 ServerToWorkerMessage :: NotifyDisconnect => {
@@ -61,6 +62,68 @@ fn handle_connections(state: &mut State) {
6162 }
6263}
6364
65+ fn handle_player_packet ( state : & mut State , player : Entity , packet : Box < Packet > ) {
66+ match packet. ty ( ) {
67+ PacketType :: PlayerPositionAndLookServerbound => handle_player_pos_and_look (
68+ state,
69+ player,
70+ cast_packet :: < PlayerPositionAndLookServerbound > ( & packet) ,
71+ ) ,
72+ PacketType :: PlayerPosition => {
73+ handle_player_pos ( state, player, cast_packet :: < PlayerPosition > ( & packet) )
74+ }
75+ PacketType :: PlayerLook => {
76+ handle_player_look ( state, player, cast_packet :: < PlayerLook > ( & packet) )
77+ }
78+ _ => ( ) , // TODO
79+ }
80+ }
81+
82+ // TODO proper validation of new position
83+
84+ fn handle_player_pos_and_look (
85+ state : & mut State ,
86+ player : Entity ,
87+ packet : & PlayerPositionAndLookServerbound ,
88+ ) {
89+ let ecomp = & state. entity_components [ player] ;
90+ let old_pos = ecomp. position ;
91+
92+ let new_pos = Position :: new ( packet. x , packet. feet_y , packet. z , packet. pitch , packet. yaw ) ;
93+
94+ broadcast_entity_movement ( state, player, old_pos, new_pos, true , true ) ;
95+
96+ state. entity_components [ player] . position = new_pos;
97+ }
98+
99+ fn handle_player_pos ( state : & mut State , player : Entity , packet : & PlayerPosition ) {
100+ let ecomp = & state. entity_components [ player] ;
101+ let old_pos = ecomp. position ;
102+
103+ let new_pos = Position :: new (
104+ packet. x ,
105+ packet. feet_y ,
106+ packet. z ,
107+ old_pos. pitch ,
108+ old_pos. yaw ,
109+ ) ;
110+
111+ broadcast_entity_movement ( state, player, old_pos, new_pos, true , false ) ;
112+
113+ state. entity_components [ player] . position = new_pos;
114+ }
115+
116+ fn handle_player_look ( state : & mut State , player : Entity , packet : & PlayerLook ) {
117+ let ecomp = & state. entity_components [ player] ;
118+ let old_pos = ecomp. position ;
119+
120+ let new_pos = Position :: new ( old_pos. x , old_pos. y , old_pos. z , packet. pitch , packet. yaw ) ;
121+
122+ broadcast_entity_movement ( state, player, old_pos, new_pos, false , true ) ;
123+
124+ state. entity_components [ player] . position = new_pos;
125+ }
126+
64127fn send_keep_alives ( state : & mut State ) {
65128 if state. tick_count % TPS != 0 {
66129 return ; // Only run once per second
@@ -205,7 +268,7 @@ pub fn get_player_initialization_packets(
205268/// that an entity has moved. This
206269/// entity can be a player.
207270///
208- /// The `has_moved` and `has_moved` indicate
271+ /// The `has_moved` and `has_moved` fields indicate
209272/// whether the entity has moved its position
210273/// or changed its pitch/yaw. These values
211274/// are used to determine which packet to send:
@@ -220,40 +283,41 @@ pub fn broadcast_entity_movement(
220283 state : & mut State ,
221284 entity : Entity ,
222285 old_pos : Position ,
286+ new_pos : Position ,
223287 has_moved : bool ,
224288 has_looked : bool ,
225289) {
290+ debug ! ( "Broadcasting new player position: {:?}" , new_pos) ;
226291 let ecomp = & state. entity_components [ entity] ;
227- let current_pos = ecomp. position ;
228292
229- let dist = current_pos . distance ( old_pos) . abs ( ) ;
293+ let dist = new_pos . distance ( old_pos) . abs ( ) ;
230294
231295 if dist <= 8.0 {
232296 if has_moved && has_looked {
233297 // Entity Look and Relative Move
234- let ( dx, dy, dz) = calculate_relative_move ( old_pos, current_pos ) ;
298+ let ( dx, dy, dz) = calculate_relative_move ( old_pos, new_pos ) ;
235299 let packet = EntityLookAndRelativeMove :: new (
236300 entity. index ( ) as i32 ,
237301 dx,
238302 dy,
239303 dz,
240- degrees_to_stops ( current_pos . yaw ) ,
241- degrees_to_stops ( current_pos . pitch ) ,
304+ degrees_to_stops ( new_pos . yaw ) ,
305+ degrees_to_stops ( new_pos . pitch ) ,
242306 ecomp. on_ground ,
243307 ) ;
244308 send_packet_to_all_players ( state, packet, entity) ;
245309 } else if has_moved {
246310 // Entity Relative Move
247- let ( dx, dy, dz) = calculate_relative_move ( old_pos, current_pos ) ;
311+ let ( dx, dy, dz) = calculate_relative_move ( old_pos, new_pos ) ;
248312 let packet =
249313 EntityRelativeMove :: new ( entity. index ( ) as i32 , dx, dy, dz, ecomp. on_ground ) ;
250314 send_packet_to_all_players ( state, packet, entity) ;
251315 } else if has_looked {
252316 // Entity Look
253317 let packet = EntityLook :: new (
254318 entity. index ( ) as i32 ,
255- degrees_to_stops ( current_pos . yaw ) ,
256- degrees_to_stops ( current_pos . pitch ) ,
319+ degrees_to_stops ( new_pos . yaw ) ,
320+ degrees_to_stops ( new_pos . pitch ) ,
257321 ecomp. on_ground ,
258322 ) ;
259323 send_packet_to_all_players ( state, packet, entity) ;
@@ -279,7 +343,7 @@ pub fn degrees_to_stops(degs: f32) -> u8 {
279343/// as used in the Entity Relative Move packets.
280344pub fn calculate_relative_move ( old : Position , current : Position ) -> ( i16 , i16 , i16 ) {
281345 let x = ( ( current. x * 32.0 - old. x * 32.0 ) * 128.0 ) as i16 ;
282- let y = ( ( current. y * 32.0 - old. x * 32.0 ) * 128.0 ) as i16 ;
346+ let y = ( ( current. y * 32.0 - old. y * 32.0 ) * 128.0 ) as i16 ;
283347 let z = ( ( current. z * 32.0 - old. z * 32.0 ) * 128.0 ) as i16 ;
284348 ( x, y, z)
285349}
0 commit comments