Skip to content

Commit d25a087

Browse files
committed
Players can now see each other move
1 parent 25d98ab commit d25a087

3 files changed

Lines changed: 92 additions & 13 deletions

File tree

core/src/network/packet/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,21 @@ lazy_static! {
457457
PacketType::JoinGame,
458458
);
459459

460+
m.insert(
461+
PacketId(0x28, PacketDirection::Clientbound, PacketStage::Play),
462+
PacketType::EntityRelativeMove,
463+
);
464+
465+
m.insert(
466+
PacketId(0x29, PacketDirection::Clientbound, PacketStage::Play),
467+
PacketType::EntityLookAndRelativeMove,
468+
);
469+
470+
m.insert(
471+
PacketId(0x2A, PacketDirection::Clientbound, PacketStage::Play),
472+
PacketType::EntityLook,
473+
);
474+
460475
m.insert(
461476
PacketId(0x30, PacketDirection::Clientbound, PacketStage::Play),
462477
PacketType::PlayerInfo,

server/config/feather.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ nerf_spawner_mobs = false
2929
pvp_style = "classic"
3030

3131
[log]
32-
level = "trace"
32+
level = "debug"

server/src/network.rs

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ use crate::io::{ServerToListenerMessage, ServerToWorkerMessage};
33
use crate::prelude::*;
44
use crate::{add_player, initialhandler as ih, remove_player, Entity, State};
55
use feather_core::entitymeta::{EntityMetadata, MetaEntry};
6-
use feather_core::network::packet::{implementation::*, Packet};
6+
use feather_core::network::packet::{implementation::*, Packet, PacketType};
77
use 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

1112
pub 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+
64127
fn 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.
280344
pub 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

Comments
 (0)