sorta implement EmoteFix (closes #21), FullCP436 (closes #34), and HeldBlock (closes #20)

This commit is contained in:
Zoey 2024-04-24 19:35:46 -07:00
parent bfb9d62f96
commit 614db37e38
No known key found for this signature in database
GPG key ID: 8611B896D1AAFAF2
4 changed files with 21 additions and 4 deletions

View file

@ -85,6 +85,11 @@ impl PacketWriter {
self.write_u8(b as u8) self.write_u8(b as u8)
} }
/// writes a bool to the packet
fn write_bool(self, b: bool) -> Self {
self.write_u8(if b { 1 } else { 0 })
}
/// writes a u16 to the packet /// writes a u16 to the packet
fn write_u16(self, sh: u16) -> Self { fn write_u16(self, sh: u16) -> Self {
let mut s = self; let mut s = self;
@ -191,6 +196,11 @@ impl ExtBitmask {
fn info(self) -> Option<ExtInfo> { fn info(self) -> Option<ExtInfo> {
// TODO: add entries as extensions are supported // TODO: add entries as extensions are supported
Some(match self { Some(match self {
// this isn't actually used by the server at all, but it technically sort of implements it
Self::HeldBlock => ExtInfo::new("HeldBlock".to_string(), 1, Self::HeldBlock),
Self::EmoteFix => ExtInfo::new("EmoteFix".to_string(), 1, Self::EmoteFix),
// TODO: render CP437 properly in server output
Self::FullCP437 => ExtInfo::new("FullCP437".to_string(), 1, Self::FullCP437),
Self::EnvWeatherType => { Self::EnvWeatherType => {
ExtInfo::new("EnvWeatherType".to_string(), 1, Self::EnvWeatherType) ExtInfo::new("EnvWeatherType".to_string(), 1, Self::EnvWeatherType)
} }

View file

@ -27,8 +27,8 @@ pub enum ClientPacket {
}, },
/// sent to update the player's current position and orientation with the server /// sent to update the player's current position and orientation with the server
PositionOrientation { PositionOrientation {
/// should always be 0xff (-1), referring to the player who sent it /// if the HeldBlock extension is supported, this should contain the block the player is currently holding
_player_id: i8, _player_id_or_held_block: i8,
x: f16, x: f16,
y: f16, y: f16,
z: f16, z: f16,
@ -78,7 +78,7 @@ impl ClientPacket {
block_type: buf.try_get_u8().ok()?, block_type: buf.try_get_u8().ok()?,
}, },
0x08 => Self::PositionOrientation { 0x08 => Self::PositionOrientation {
_player_id: buf.try_get_i8().ok()?, _player_id_or_held_block: buf.try_get_i8().ok()?,
x: buf.try_get_f16().ok()?, x: buf.try_get_f16().ok()?,
y: buf.try_get_f16().ok()?, y: buf.try_get_f16().ok()?,
z: buf.try_get_f16().ok()?, z: buf.try_get_f16().ok()?,

View file

@ -99,6 +99,8 @@ pub enum ServerPacket {
ExtInfo {}, ExtInfo {},
/// packet to send info about an extension on the server /// packet to send info about an extension on the server
ExtEntry { ext_name: String, version: i32 }, ExtEntry { ext_name: String, version: i32 },
/// packet to set a player's currently held block
HoldThis { block: u8, prevent_change: bool },
/// informs the client that it should update the current weather /// informs the client that it should update the current weather
EnvWeatherType { weather_type: WeatherType }, EnvWeatherType { weather_type: WeatherType },
} }
@ -125,6 +127,7 @@ impl ServerPacket {
Self::ExtInfo {} => 0x10, Self::ExtInfo {} => 0x10,
Self::ExtEntry { .. } => 0x11, Self::ExtEntry { .. } => 0x11,
Self::HoldThis { .. } => 0x14,
Self::EnvWeatherType { .. } => 0x1f, Self::EnvWeatherType { .. } => 0x1f,
} }
} }
@ -242,6 +245,10 @@ impl ServerPacket {
Self::ExtEntry { ext_name, version } => { Self::ExtEntry { ext_name, version } => {
writer.write_string(ext_name).write_i32(*version) writer.write_string(ext_name).write_i32(*version)
} }
Self::HoldThis {
block,
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()),
} }
} }

View file

@ -328,7 +328,7 @@ async fn handle_stream_inner(
} }
} }
ClientPacket::PositionOrientation { ClientPacket::PositionOrientation {
_player_id: _, _player_id_or_held_block: _,
x, x,
y, y,
z, z,