mirror of https://github.com/zyllian/classics.git synced 2025-05-10 19:46:38 -07:00

support ExtEntityTeleport, resolves #53

This commit is contained in:
Zoey 2024-04-29 11:27:01 -07:00
parent dc88eb6b9a
commit 56c758f79c
No known key found for this signature in database
GPG key ID: 8611B896D1AAFAF2
3 changed files with 70 additions and 4 deletions

View file

@ -1,7 +1,10 @@
use half::f16; use half::f16;
use crate::{ use crate::{
packet::{server::ServerPacket, ExtBitmask, STRING_LENGTH}, packet::{
server::{ServerPacket, TeleportBehavior},
ExtBitmask, STRING_LENGTH,
},
player::PlayerType, player::PlayerType,
server::{ server::{
config::{ConfigCoordinatesWithOrientation, ServerProtectionMode}, config::{ConfigCoordinatesWithOrientation, ServerProtectionMode},
@ -595,21 +598,41 @@ impl<'m> Command<'m> {
}; };
if let Some(player) = data.players.iter_mut().find(|p| p.username == username) { if let Some(player) = data.players.iter_mut().find(|p| p.username == username) {
let yaw = yaw.unwrap_or(player.yaw);
let pitch = pitch.unwrap_or(player.pitch);
player.x = x; player.x = x;
player.y = y; player.y = y;
player.z = z; player.z = z;
player.yaw = yaw;
player.pitch = pitch;
let packet = ServerPacket::SetPositionOrientation { let packet = ServerPacket::SetPositionOrientation {
player_id: player.id, player_id: player.id,
x, x,
y, y,
z, z,
yaw: yaw.unwrap_or(player.yaw), yaw,
pitch: pitch.unwrap_or(player.pitch), pitch,
};
let ext_packet = ServerPacket::ExtEntityTeleport {
entity_id: player.id,
teleport_behavior: TeleportBehavior::UsePosition
| TeleportBehavior::UseOrientation
| TeleportBehavior::ModeInterpolated,
x,
y,
z,
yaw,
pitch,
}; };
let id = player.id; let id = player.id;
for player in &mut data.players { for player in &mut data.players {
let mut packet = packet.clone(); let mut packet =
if player.extensions.contains(ExtBitmask::ExtEntityTeleport) {
ext_packet.clone()
} else {
packet.clone()
};
if player.id == id { if player.id == id {
packet.set_player_id(-1); packet.set_player_id(-1);
player.packets_to_send.push(ServerPacket::Message { player.packets_to_send.push(ServerPacket::Message {

View file

@ -208,6 +208,9 @@ impl ExtBitmask {
Self::InventoryOrder => { Self::InventoryOrder => {
ExtInfo::new("InventoryOrder".to_string(), 1, Self::InventoryOrder) ExtInfo::new("InventoryOrder".to_string(), 1, Self::InventoryOrder)
} }
Self::ExtEntityTeleport => {
ExtInfo::new("ExtEntityTeleport".to_string(), 1, Self::ExtEntityTeleport)
}
_ => return None, _ => return None,
}) })
} }

View file

@ -111,6 +111,15 @@ pub enum ServerPacket {
EnvWeatherType { weather_type: WeatherType }, EnvWeatherType { weather_type: WeatherType },
/// packet to set a block's position in the client's inventory /// packet to set a block's position in the client's inventory
SetInventoryOrder { order: u8, block: u8 }, SetInventoryOrder { order: u8, block: u8 },
ExtEntityTeleport {
entity_id: i8,
teleport_behavior: TeleportBehavior,
x: f16,
y: f16,
z: f16,
yaw: u8,
pitch: u8,
},
} }
impl ServerPacket { impl ServerPacket {
@ -139,6 +148,7 @@ impl ServerPacket {
Self::HoldThis { .. } => 0x14, Self::HoldThis { .. } => 0x14,
Self::EnvWeatherType { .. } => 0x1f, Self::EnvWeatherType { .. } => 0x1f,
Self::SetInventoryOrder { .. } => 0x2c, Self::SetInventoryOrder { .. } => 0x2c,
Self::ExtEntityTeleport { .. } => 0x36,
} }
} }
@ -262,6 +272,22 @@ impl ServerPacket {
} => writer.write_u8(*block).write_bool(*prevent_change), } => writer.write_u8(*block).write_bool(*prevent_change),
Self::EnvWeatherType { weather_type } => writer.write_u8(weather_type.into()), Self::EnvWeatherType { weather_type } => writer.write_u8(weather_type.into()),
Self::SetInventoryOrder { order, block } => writer.write_u8(*order).write_u8(*block), Self::SetInventoryOrder { order, block } => writer.write_u8(*order).write_u8(*block),
Self::ExtEntityTeleport {
entity_id,
teleport_behavior,
x,
y,
z,
yaw,
pitch,
} => writer
.write_i8(*entity_id)
.write_u8(teleport_behavior.bits())
.write_f16(*x)
.write_f16(*y)
.write_f16(*z)
.write_u8(*yaw)
.write_u8(*pitch),
} }
} }
@ -275,6 +301,7 @@ impl ServerPacket {
Self::UpdateOrientation { player_id, .. } => *player_id, Self::UpdateOrientation { player_id, .. } => *player_id,
Self::DespawnPlayer { player_id, .. } => *player_id, Self::DespawnPlayer { player_id, .. } => *player_id,
Self::Message { player_id, .. } => *player_id, Self::Message { player_id, .. } => *player_id,
Self::ExtEntityTeleport { entity_id, .. } => *entity_id,
_ => return None, _ => return None,
}) })
} }
@ -289,6 +316,7 @@ impl ServerPacket {
Self::UpdateOrientation { player_id, .. } => *player_id = new_player_id, Self::UpdateOrientation { player_id, .. } => *player_id = new_player_id,
Self::DespawnPlayer { player_id, .. } => *player_id = new_player_id, Self::DespawnPlayer { player_id, .. } => *player_id = new_player_id,
Self::Message { player_id, .. } => *player_id = new_player_id, Self::Message { player_id, .. } => *player_id = new_player_id,
Self::ExtEntityTeleport { entity_id, .. } => *entity_id = new_player_id,
_ => {} _ => {}
} }
} }
@ -301,3 +329,15 @@ impl ServerPacket {
) )
} }
} }
/// bitmask for ExtEntityTeleport's teleport behavior
#[bitmask_enum::bitmask(u8)]
pub enum TeleportBehavior {
UsePosition = 0b00000001,
ModeInstant = 0,
ModeInterpolated = 0b00000010,
ModeRelativeInterpolated = 0b00000100,
ModeRelativeSeamless = 0b00000110,
UseOrientation = 0b00010000,
InterpolateOrientation = 0b00100000,
}