fix player spawn and send move packets
This commit is contained in:
parent
8b5084460e
commit
a746a0d9b4
109
src/play/mod.rs
109
src/play/mod.rs
@ -191,7 +191,16 @@ pub fn send_player(
|
|||||||
receiver: Arc<ClientContext>,
|
receiver: Arc<ClientContext>,
|
||||||
player: Arc<ClientContext>,
|
player: Arc<ClientContext>,
|
||||||
) -> Result<(), ServerError> {
|
) -> Result<(), ServerError> {
|
||||||
// Отправка пакета Login
|
let mut packet = Packet::empty(clientbound::play::PLAYER_INFO_UPDATE);
|
||||||
|
|
||||||
|
packet.write_byte(0x01)?; // only Add Player
|
||||||
|
packet.write_varint(1)?; // players list
|
||||||
|
packet.write_uuid(&player.entity_info().uuid)?; // player uuid
|
||||||
|
packet.write_string(&player.player_info().unwrap().name)?; // player name
|
||||||
|
packet.write_varint(0)?; // no properties
|
||||||
|
|
||||||
|
receiver.write_packet(&packet)?;
|
||||||
|
|
||||||
let mut packet = Packet::empty(clientbound::play::SPAWN_ENTITY);
|
let mut packet = Packet::empty(clientbound::play::SPAWN_ENTITY);
|
||||||
|
|
||||||
let (x, y, z) = player.entity_info().position();
|
let (x, y, z) = player.entity_info().position();
|
||||||
@ -204,15 +213,17 @@ pub fn send_player(
|
|||||||
packet.write_double(x)?;
|
packet.write_double(x)?;
|
||||||
packet.write_double(y)?;
|
packet.write_double(y)?;
|
||||||
packet.write_double(z)?;
|
packet.write_double(z)?;
|
||||||
packet.write_byte((pitch / 360.0 * 256.0) as u8)?;
|
packet.write_signed_byte((pitch / 360.0 * 256.0) as i8)?;
|
||||||
packet.write_byte((yaw / 360.0 * 256.0) as u8)?;
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?;
|
||||||
packet.write_byte((yaw / 360.0 * 256.0) as u8)?; // head yaw TODO: make player head yaw field
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?; // head yaw TODO: make player head yaw field
|
||||||
packet.write_varint(0)?;
|
packet.write_varint(0)?;
|
||||||
packet.write_short(vel_x as i16)?;
|
packet.write_short(vel_x as i16)?;
|
||||||
packet.write_short(vel_y as i16)?;
|
packet.write_short(vel_y as i16)?;
|
||||||
packet.write_short(vel_z as i16)?;
|
packet.write_short(vel_z as i16)?;
|
||||||
|
|
||||||
receiver.write_packet(&packet)
|
receiver.write_packet(&packet)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_offline_uuid(name: &str) -> Uuid {
|
pub fn get_offline_uuid(name: &str) -> Uuid {
|
||||||
@ -241,6 +252,8 @@ pub fn handle_play_state(
|
|||||||
get_offline_uuid(&client.player_info().unwrap().name), // TODO: authenticated uuid
|
get_offline_uuid(&client.player_info().unwrap().name), // TODO: authenticated uuid
|
||||||
));
|
));
|
||||||
|
|
||||||
|
client.entity_info().set_position((8.0, 0.0, 8.0)); // set 8 0 8 as position
|
||||||
|
|
||||||
thread::spawn({
|
thread::spawn({
|
||||||
let client = client.clone();
|
let client = client.clone();
|
||||||
|
|
||||||
@ -263,7 +276,29 @@ pub fn handle_play_state(
|
|||||||
|
|
||||||
// sync_player_pos(client.clone(), 8.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0)?;
|
// sync_player_pos(client.clone(), 8.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0)?;
|
||||||
|
|
||||||
|
send_system_message(
|
||||||
|
client.clone(),
|
||||||
|
TextComponent::rainbow(format!("Your Name: {}", client.player_info().unwrap().name)),
|
||||||
|
false,
|
||||||
|
)?;
|
||||||
|
send_system_message(
|
||||||
|
client.clone(),
|
||||||
|
TextComponent::rainbow(format!(
|
||||||
|
"Your Entity ID: {}",
|
||||||
|
client.entity_info().entity_id
|
||||||
|
)),
|
||||||
|
false,
|
||||||
|
)?;
|
||||||
|
send_system_message(
|
||||||
|
client.clone(),
|
||||||
|
TextComponent::rainbow(format!("Your UUID: {}", client.entity_info().uuid)),
|
||||||
|
false,
|
||||||
|
)?;
|
||||||
|
|
||||||
for player in client.server.players() {
|
for player in client.server.players() {
|
||||||
|
if client.addr == player.addr {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
send_player(client.clone(), player.clone())?;
|
send_player(client.clone(), player.clone())?;
|
||||||
send_player(player.clone(), client.clone())?;
|
send_player(player.clone(), client.clone())?;
|
||||||
}
|
}
|
||||||
@ -284,7 +319,23 @@ pub fn handle_play_state(
|
|||||||
let x = packet.read_double()?;
|
let x = packet.read_double()?;
|
||||||
let y = packet.read_double()?;
|
let y = packet.read_double()?;
|
||||||
let z = packet.read_double()?;
|
let z = packet.read_double()?;
|
||||||
let _ = packet.read_byte()?; // flags
|
let flags = packet.read_byte()?; // flags
|
||||||
|
|
||||||
|
let prev = client.entity_info().position();
|
||||||
|
|
||||||
|
for player in client.server.players() {
|
||||||
|
if client.addr == player.addr {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut packet = Packet::empty(clientbound::play::UPDATE_ENTITY_POSITION);
|
||||||
|
packet.write_varint(client.entity_info().entity_id)?;
|
||||||
|
packet.write_short((x * 4096.0 - prev.0 * 4096.0) as i16)?; // formula: currentX * 4096 - prevX * 4096
|
||||||
|
packet.write_short((y * 4096.0 - prev.1 * 4096.0) as i16)?;
|
||||||
|
packet.write_short((z * 4096.0 - prev.2 * 4096.0) as i16)?;
|
||||||
|
packet.write_boolean(flags & 0x01 != 0)?;
|
||||||
|
player.write_packet(&packet)?;
|
||||||
|
}
|
||||||
|
|
||||||
client.entity_info().set_position((x, y, z));
|
client.entity_info().set_position((x, y, z));
|
||||||
}
|
}
|
||||||
@ -294,7 +345,31 @@ pub fn handle_play_state(
|
|||||||
let z = packet.read_double()?;
|
let z = packet.read_double()?;
|
||||||
let yaw = packet.read_float()?;
|
let yaw = packet.read_float()?;
|
||||||
let pitch = packet.read_float()?;
|
let pitch = packet.read_float()?;
|
||||||
let _ = packet.read_byte()?; // flags
|
let flags = packet.read_byte()?; // flags
|
||||||
|
|
||||||
|
let prev = client.entity_info().position();
|
||||||
|
|
||||||
|
for player in client.server.players() {
|
||||||
|
if client.addr == player.addr {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut packet =
|
||||||
|
Packet::empty(clientbound::play::UPDATE_ENTITY_POSITION_AND_ROTATION);
|
||||||
|
packet.write_varint(client.entity_info().entity_id)?;
|
||||||
|
packet.write_short((x * 4096.0 - prev.0 * 4096.0) as i16)?; // formula: currentX * 4096 - prevX * 4096
|
||||||
|
packet.write_short((y * 4096.0 - prev.1 * 4096.0) as i16)?;
|
||||||
|
packet.write_short((z * 4096.0 - prev.2 * 4096.0) as i16)?;
|
||||||
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?;
|
||||||
|
packet.write_signed_byte((pitch / 360.0 * 256.0) as i8)?;
|
||||||
|
packet.write_boolean(flags & 0x01 != 0)?;
|
||||||
|
player.write_packet(&packet)?;
|
||||||
|
|
||||||
|
let mut packet = Packet::empty(clientbound::play::SET_HEAD_ROTATION);
|
||||||
|
packet.write_varint(client.entity_info().entity_id)?;
|
||||||
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?;
|
||||||
|
player.write_packet(&packet)?;
|
||||||
|
}
|
||||||
|
|
||||||
client.entity_info().set_position((x, y, z));
|
client.entity_info().set_position((x, y, z));
|
||||||
client.entity_info().set_rotation((yaw, pitch));
|
client.entity_info().set_rotation((yaw, pitch));
|
||||||
@ -302,7 +377,25 @@ pub fn handle_play_state(
|
|||||||
serverbound::play::SET_PLAYER_ROTATION => {
|
serverbound::play::SET_PLAYER_ROTATION => {
|
||||||
let yaw = packet.read_float()?;
|
let yaw = packet.read_float()?;
|
||||||
let pitch = packet.read_float()?;
|
let pitch = packet.read_float()?;
|
||||||
let _ = packet.read_byte()?; // flags
|
let flags = packet.read_byte()?; // flags
|
||||||
|
|
||||||
|
for player in client.server.players() {
|
||||||
|
if client.addr == player.addr {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut packet = Packet::empty(clientbound::play::UPDATE_ENTITY_ROTATION);
|
||||||
|
packet.write_varint(client.entity_info().entity_id)?;
|
||||||
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?;
|
||||||
|
packet.write_signed_byte((pitch / 360.0 * 256.0) as i8)?;
|
||||||
|
packet.write_boolean(flags & 0x01 != 0)?;
|
||||||
|
player.write_packet(&packet)?;
|
||||||
|
|
||||||
|
let mut packet = Packet::empty(clientbound::play::SET_HEAD_ROTATION);
|
||||||
|
packet.write_varint(client.entity_info().entity_id)?;
|
||||||
|
packet.write_signed_byte((yaw / 360.0 * 256.0) as i8)?;
|
||||||
|
player.write_packet(&packet)?;
|
||||||
|
}
|
||||||
|
|
||||||
client.entity_info().set_rotation((yaw, pitch));
|
client.entity_info().set_rotation((yaw, pitch));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user