diff --git a/packet_inspector/src/main.rs b/packet_inspector/src/main.rs index 711ceee..8475751 100644 --- a/packet_inspector/src/main.rs +++ b/packet_inspector/src/main.rs @@ -17,10 +17,10 @@ use valence::protocol::codec::Decoder; use valence::protocol::packets::c2s::handshake::{Handshake, HandshakeNextState}; use valence::protocol::packets::c2s::login::{EncryptionResponse, LoginStart}; use valence::protocol::packets::c2s::play::C2sPlayPacket; -use valence::protocol::packets::c2s::status::{QueryPing, QueryRequest}; +use valence::protocol::packets::c2s::status::{PingRequest, StatusRequest}; use valence::protocol::packets::s2c::login::{LoginSuccess, S2cLoginPacket}; use valence::protocol::packets::s2c::play::S2cPlayPacket; -use valence::protocol::packets::s2c::status::{QueryPong, QueryResponse}; +use valence::protocol::packets::s2c::status::{PingResponse, StatusResponse}; use valence::protocol::packets::{DecodePacket, EncodePacket, PacketName}; use valence::protocol::{Encode, VarInt}; @@ -132,14 +132,14 @@ async fn handle_connection(client: TcpStream, cli: Cli) -> anyhow::Result<()> { match handshake.next_state { HandshakeNextState::Status => { - cli.rw_packet::(&mut client_read, &mut server_write) + cli.rw_packet::(&mut client_read, &mut server_write) .await?; - cli.rw_packet::(&mut server_read, &mut client_write) + cli.rw_packet::(&mut server_read, &mut client_write) .await?; - cli.rw_packet::(&mut client_read, &mut server_write) + cli.rw_packet::(&mut client_read, &mut server_write) .await?; - cli.rw_packet::(&mut server_read, &mut client_write) + cli.rw_packet::(&mut server_read, &mut client_write) .await?; } HandshakeNextState::Login => { @@ -161,7 +161,7 @@ async fn handle_connection(client: TcpStream, cli: Cli) -> anyhow::Result<()> { s2c = passthrough(server_read.into_inner(), client_write) => s2c, }; } - S2cLoginPacket::LoginCompression(pkt) => { + S2cLoginPacket::SetCompression(pkt) => { let threshold = pkt.threshold.0 as u32; client_read.enable_compression(threshold); server_read.enable_compression(threshold); @@ -170,7 +170,7 @@ async fn handle_connection(client: TcpStream, cli: Cli) -> anyhow::Result<()> { .await?; } S2cLoginPacket::LoginSuccess(_) => {} - S2cLoginPacket::LoginDisconnect(_) => return Ok(()), + S2cLoginPacket::DisconnectLogin(_) => return Ok(()), S2cLoginPacket::LoginPluginRequest(_) => { bail!("got login plugin request. Don't know how to proceed.") } diff --git a/src/chunk.rs b/src/chunk.rs index 0b92ede..106c253 100644 --- a/src/chunk.rs +++ b/src/chunk.rs @@ -24,7 +24,7 @@ pub use crate::chunk_pos::ChunkPos; use crate::config::Config; use crate::dimension::DimensionId; use crate::protocol::packets::s2c::play::{ - BlockUpdate, ChunkData, ChunkDataHeightmaps, ChunkSectionUpdate, S2cPlayPacket, + BlockUpdate, ChunkDataAndUpdateLight, ChunkDataHeightmaps, S2cPlayPacket, UpdateSectionBlocks, }; use crate::protocol::{Encode, NbtBridge, VarInt, VarLong}; use crate::server::SharedServer; @@ -468,14 +468,14 @@ impl LoadedChunk { /// Gets the chunk data packet for this chunk with the given position. This /// does not include unapplied changes. - pub(crate) fn chunk_data_packet(&self, pos: ChunkPos) -> ChunkData { + pub(crate) fn chunk_data_packet(&self, pos: ChunkPos) -> ChunkDataAndUpdateLight { let mut blocks_and_biomes = Vec::new(); for sect in self.sections.iter() { blocks_and_biomes.extend_from_slice(§.compact_data); } - ChunkData { + ChunkDataAndUpdateLight { chunk_x: pos.x, chunk_z: pos.z, heightmaps: NbtBridge(ChunkDataHeightmaps { @@ -542,7 +542,7 @@ impl LoadedChunk { | (pos.z as i64 & 0x3fffff) << 20 | (sect_y as i64 + min_y.div_euclid(16) as i64) & 0xfffff; - push_packet(BlockChangePacket::Multi(ChunkSectionUpdate { + push_packet(BlockChangePacket::Multi(UpdateSectionBlocks { chunk_section_position, invert_trust_edges: false, blocks, @@ -655,7 +655,7 @@ impl Chunk for LoadedChunk { #[derive(Clone, Debug)] pub(crate) enum BlockChangePacket { Single(BlockUpdate), - Multi(ChunkSectionUpdate), + Multi(UpdateSectionBlocks), } impl From for S2cPlayPacket { diff --git a/src/client.rs b/src/client.rs index 635bc92..bdfbbff 100644 --- a/src/client.rs +++ b/src/client.rs @@ -19,22 +19,23 @@ use crate::config::Config; use crate::dimension::DimensionId; use crate::entity::data::Player; use crate::entity::{ - velocity_to_packet_units, Entities, EntityEvent, EntityId, EntityKind, StatusOrAnimation, + self, velocity_to_packet_units, Entities, EntityId, EntityKind, StatusOrAnimation, }; use crate::ident::Ident; use crate::player_list::{PlayerListId, PlayerLists}; use crate::player_textures::SignedPlayerTextures; use crate::protocol::packets::c2s::play::{self, C2sPlayPacket, InteractKind, PlayerCommandId}; -pub use crate::protocol::packets::s2c::play::TitleFade; +pub use crate::protocol::packets::s2c::play::SetTitleAnimationTimes; use crate::protocol::packets::s2c::play::{ - BiomeRegistry, ChatTypeRegistry, ChunkLoadDistance, ChunkRenderDistanceCenter, ClearTitles, - DimensionTypeRegistry, DimensionTypeRegistryEntry, Disconnect, EntitiesDestroy, - EntityAnimation, EntityAttributes, EntityAttributesProperty, EntityPosition, EntitySetHeadYaw, - EntityStatus, EntityTrackerUpdate, EntityVelocityUpdate, ExperienceBarUpdate, GameJoin, - GameMessage, GameStateChange, GameStateChangeReason, HealthUpdate, KeepAlive, MoveRelative, - OverlayMessage, PlaySoundId, PlayerActionResponse, PlayerPositionLook, PlayerPositionLookFlags, - PlayerRespawn, PlayerSpawnPosition, RegistryCodec, Rotate, RotateAndMoveRelative, - S2cPlayPacket, SoundCategory, UnloadChunk, UpdateSubtitle, UpdateTitle, + AcknowledgeBlockChange, BiomeRegistry, ChatTypeRegistry, ClearTitles, CustomSoundEffect, + DimensionTypeRegistry, DimensionTypeRegistryEntry, DisconnectPlay, EntityAnimationS2c, + EntityAttributesProperty, EntityEvent, GameEvent, GameStateChangeReason, KeepAliveS2c, + LoginPlay, PlayerPositionLookFlags, RegistryCodec, RemoveEntities, Respawn, S2cPlayPacket, + SetActionBarText, SetCenterChunk, SetDefaultSpawnPosition, SetEntityMetadata, + SetEntityVelocity, SetExperience, SetHeadRotation, SetHealth, SetRenderDistance, + SetSubtitleText, SetTitleText, SoundCategory, SynchronizePlayerPosition, SystemChatMessage, + TeleportEntity, UnloadChunk, UpdateAttributes, UpdateEntityPosition, + UpdateEntityPositionAndRotation, UpdateEntityRotation, }; use crate::protocol::{BoundedInt, ByteAngle, NbtBridge, RawBytes, VarInt}; use crate::server::{C2sPacketChannels, NewClientData, S2cPlayMessage, SharedServer}; @@ -229,7 +230,7 @@ pub struct Client { bits: ClientBits, /// The data for the client's own player entity. player_data: Player, - entity_events: Vec, + entity_events: Vec, } #[bitfield(u16)] @@ -468,7 +469,7 @@ impl Client { volume: f32, pitch: f32, ) { - self.send_packet(PlaySoundId { + self.send_packet(CustomSoundEffect { name, category, position: pos.iter().map(|x| *x as i32 * 8).collect(), @@ -488,15 +489,15 @@ impl Client { &mut self, title: impl Into, subtitle: impl Into, - animation: impl Into>, + animation: impl Into>, ) { let title = title.into(); let subtitle = subtitle.into(); - self.send_packet(UpdateTitle { text: title }); + self.send_packet(SetTitleText { text: title }); if !subtitle.is_empty() { - self.send_packet(UpdateSubtitle { + self.send_packet(SetSubtitleText { subtitle_text: subtitle, }); } @@ -550,7 +551,7 @@ impl Client { /// * `level` - Number above the XP bar. /// * `total_xp` - TODO. pub fn set_level(&mut self, bar: f32, level: i32, total_xp: i32) { - self.send_packet(ExperienceBarUpdate { + self.send_packet(SetExperience { bar, level: level.into(), total_xp: total_xp.into(), @@ -566,7 +567,7 @@ impl Client { /// * `food` - Integer in range `0..=20`. /// * `food_saturation` - Float in range `0.0..=5.0`. pub fn set_health_and_food(&mut self, health: f32, food: i32, food_saturation: f32) { - self.send_packet(HealthUpdate { + self.send_packet(SetHealth { health, food: food.into(), food_saturation, @@ -602,7 +603,7 @@ impl Client { } /// Pushes an entity event to the queue. - pub fn push_entity_event(&mut self, event: EntityEvent) { + pub fn push_entity_event(&mut self, event: entity::EntityEvent) { self.entity_events.push(event); } @@ -654,7 +655,7 @@ impl Client { let txt = reason.into(); log::info!("disconnecting client '{}': \"{txt}\"", self.username); - self.send_packet(Disconnect { reason: txt }); + self.send_packet(DisconnectPlay { reason: txt }); self.send = None; } @@ -696,7 +697,7 @@ impl Client { fn handle_serverbound_packet(&mut self, entities: &Entities, pkt: C2sPlayPacket) { match pkt { - C2sPlayPacket::TeleportConfirm(p) => { + C2sPlayPacket::ConfirmTeleport(p) => { if self.pending_teleports == 0 { log::warn!("unexpected teleport confirmation from {}", self.username()); self.disconnect_no_reason(); @@ -718,17 +719,17 @@ impl Client { self.disconnect_no_reason(); } } - C2sPlayPacket::QueryBlockNbt(_) => {} - C2sPlayPacket::UpdateDifficulty(_) => {} + C2sPlayPacket::QueryBlockEntityTag(_) => {} + C2sPlayPacket::ChangeDifficulty(_) => {} C2sPlayPacket::MessageAcknowledgment(_) => {} - C2sPlayPacket::CommandExecution(_) => {} + C2sPlayPacket::ChatCommand(_) => {} C2sPlayPacket::ChatMessage(p) => self.events.push_back(ClientEvent::ChatMessage { message: p.message.0, timestamp: Duration::from_millis(p.timestamp), }), - C2sPlayPacket::RequestChatPreview(_) => {} - C2sPlayPacket::ClientStatus(_) => {} - C2sPlayPacket::ClientSettings(p) => { + C2sPlayPacket::ChatPreviewC2s(_) => {} + C2sPlayPacket::ClientCommand(_) => {} + C2sPlayPacket::ClientInformation(p) => { self.events.push_back(ClientEvent::SettingsChanged { locale: p.locale.0, view_distance: p.view_distance.0, @@ -739,14 +740,14 @@ impl Client { allow_server_listings: p.allow_server_listings, }) } - C2sPlayPacket::RequestCommandCompletion(_) => {} + C2sPlayPacket::CommandSuggestionsRequest(_) => {} C2sPlayPacket::ClickContainerButton(_) => {} C2sPlayPacket::ClickContainer(_) => {} - C2sPlayPacket::CloseHandledScreen(_) => {} - C2sPlayPacket::CustomPayload(_) => {} - C2sPlayPacket::BookUpdate(_) => {} - C2sPlayPacket::QueryEntityNbt(_) => {} - C2sPlayPacket::PlayerInteractEntity(p) => { + C2sPlayPacket::CloseContainerC2s(_) => {} + C2sPlayPacket::PluginMessageC2s(_) => {} + C2sPlayPacket::EditBook(_) => {} + C2sPlayPacket::QueryEntityTag(_) => {} + C2sPlayPacket::Interact(p) => { if let Some(id) = entities.get_with_network_id(p.entity_id.0) { self.events.push_back(ClientEvent::InteractWithEntity { id, @@ -762,7 +763,7 @@ impl Client { } } C2sPlayPacket::JigsawGenerate(_) => {} - C2sPlayPacket::KeepAlive(p) => { + C2sPlayPacket::KeepAliveC2s(p) => { let last_keepalive_id = self.last_keepalive_id; if self.bits.got_keepalive() { log::warn!("unexpected keepalive from player {}", self.username()); @@ -779,8 +780,8 @@ impl Client { self.bits.set_got_keepalive(true); } } - C2sPlayPacket::UpdateDifficultyLock(_) => {} - C2sPlayPacket::MovePlayerPosition(p) => { + C2sPlayPacket::LockDifficulty(_) => {} + C2sPlayPacket::SetPlayerPosition(p) => { if self.pending_teleports == 0 { self.position = p.position; @@ -790,7 +791,7 @@ impl Client { }); } } - C2sPlayPacket::MovePlayerPositionAndRotation(p) => { + C2sPlayPacket::SetPlayerPositionAndRotation(p) => { if self.pending_teleports == 0 { self.position = p.position; self.yaw = p.yaw; @@ -804,7 +805,7 @@ impl Client { }); } } - C2sPlayPacket::MovePlayerRotation(p) => { + C2sPlayPacket::SetPlayerRotation(p) => { if self.pending_teleports == 0 { self.yaw = p.yaw; self.pitch = p.pitch; @@ -816,14 +817,14 @@ impl Client { }); } } - C2sPlayPacket::MovePlayerOnGround(p) => { + C2sPlayPacket::SetPlayerOnGround(p) => { if self.pending_teleports == 0 { self.events.push_back(ClientEvent::MoveOnGround { on_ground: p.on_ground, }); } } - C2sPlayPacket::MoveVehicle(p) => { + C2sPlayPacket::MoveVehicleC2s(p) => { if self.pending_teleports == 0 { self.position = p.position; self.yaw = p.yaw; @@ -836,15 +837,15 @@ impl Client { }); } } - C2sPlayPacket::BoatPaddleState(p) => { + C2sPlayPacket::PaddleBoat(p) => { self.events.push_back(ClientEvent::SteerBoat { left_paddle_turning: p.left_paddle_turning, right_paddle_turning: p.right_paddle_turning, }); } - C2sPlayPacket::PickFromInventory(_) => {} - C2sPlayPacket::CraftRequest(_) => {} - C2sPlayPacket::UpdatePlayerAbilities(_) => {} + C2sPlayPacket::PickItem(_) => {} + C2sPlayPacket::PlaceRecipe(_) => {} + C2sPlayPacket::PlayerAbilitiesC2s(_) => {} C2sPlayPacket::PlayerAction(p) => { if p.sequence.0 != 0 { self.dug_blocks.push(p.sequence.0); @@ -888,34 +889,32 @@ impl Client { }); } C2sPlayPacket::PlayerInput(_) => {} - C2sPlayPacket::PlayPong(_) => {} - C2sPlayPacket::RecipeBookChangeSettings(_) => {} - C2sPlayPacket::RecipeBookSeenRecipe(_) => {} + C2sPlayPacket::PongPlay(_) => {} + C2sPlayPacket::ChangeRecipeBookSettings(_) => {} + C2sPlayPacket::SetSeenRecipe(_) => {} C2sPlayPacket::RenameItem(_) => {} - C2sPlayPacket::ResourcePackStatus(_) => {} - C2sPlayPacket::AdvancementTab(_) => {} - C2sPlayPacket::SelectMerchantTrade(_) => {} - C2sPlayPacket::UpdateBeacon(_) => {} - C2sPlayPacket::UpdateSelectedSlot(_) => {} - C2sPlayPacket::UpdateCommandBlock(_) => {} - C2sPlayPacket::UpdateCommandBlockMinecart(_) => {} - C2sPlayPacket::UpdateCreativeModeSlot(_) => {} - C2sPlayPacket::UpdateJigsaw(_) => {} - C2sPlayPacket::UpdateStructureBlock(_) => {} + C2sPlayPacket::ResourcePackC2s(_) => {} + C2sPlayPacket::SeenAdvancements(_) => {} + C2sPlayPacket::SelectTrade(_) => {} + C2sPlayPacket::SetBeaconEffect(_) => {} + C2sPlayPacket::SetHeldItemS2c(_) => {} + C2sPlayPacket::ProgramCommandBlock(_) => {} + C2sPlayPacket::ProgramCommandBlockMinecart(_) => {} + C2sPlayPacket::SetCreativeModeSlot(_) => {} + C2sPlayPacket::ProgramJigsawBlock(_) => {} + C2sPlayPacket::ProgramStructureBlock(_) => {} C2sPlayPacket::UpdateSign(_) => {} - C2sPlayPacket::HandSwing(p) => self.events.push_back(ClientEvent::ArmSwing(p.hand)), - C2sPlayPacket::SpectatorTeleport(_) => {} - C2sPlayPacket::PlayerInteractBlock(p) => { - self.events.push_back(ClientEvent::InteractWithBlock { - hand: p.hand, - location: p.location, - face: p.face, - cursor_pos: p.cursor_pos, - head_inside_block: p.head_inside_block, - sequence: p.sequence, - }) - } - C2sPlayPacket::PlayerInteractItem(_) => {} + C2sPlayPacket::SwingArm(p) => self.events.push_back(ClientEvent::ArmSwing(p.hand)), + C2sPlayPacket::TeleportToEntity(_) => {} + C2sPlayPacket::UseItemOn(p) => self.events.push_back(ClientEvent::InteractWithBlock { + hand: p.hand, + location: p.location, + face: p.face, + cursor_pos: p.cursor_pos, + head_inside_block: p.head_inside_block, + sequence: p.sequence, + }), + C2sPlayPacket::UseItem(_) => {} } } @@ -965,7 +964,7 @@ impl Client { dimension_names.push(ident!("{LIBRARY_NAMESPACE}:dummy_dimension")); - self.send_packet(GameJoin { + self.send_packet(LoginPlay { entity_id: 0, // EntityId 0 is reserved for clients. is_hardcore: self.bits.hardcore(), gamemode: self.new_game_mode, @@ -1002,7 +1001,7 @@ impl Client { // Client bug workaround: send the client to a dummy dimension first. // TODO: is there actually a bug? - self.send_packet(PlayerRespawn { + self.send_packet(Respawn { dimension_type_name: ident!("{LIBRARY_NAMESPACE}:dimension_type_0"), dimension_name: ident!("{LIBRARY_NAMESPACE}:dummy_dimension"), hashed_seed: 0, @@ -1014,7 +1013,7 @@ impl Client { last_death_location: None, }); - self.send_packet(PlayerRespawn { + self.send_packet(Respawn { dimension_type_name: ident!( "{LIBRARY_NAMESPACE}:dimension_type_{}", world.meta.dimension().0 @@ -1040,7 +1039,7 @@ impl Client { // Update game mode if self.old_game_mode != self.new_game_mode { self.old_game_mode = self.new_game_mode; - self.send_packet(GameStateChange { + self.send_packet(GameEvent { reason: GameStateChangeReason::ChangeGameMode, value: self.new_game_mode as i32 as f32, }); @@ -1075,7 +1074,7 @@ impl Client { if self.bits.attack_speed_modified() { self.bits.set_attack_speed_modified(false); - self.send_packet(EntityAttributes { + self.send_packet(UpdateAttributes { entity_id: VarInt(0), properties: vec![EntityAttributesProperty { key: ident!("generic.attack_speed"), @@ -1088,7 +1087,7 @@ impl Client { if self.bits.movement_speed_modified() { self.bits.set_movement_speed_modified(false); - self.send_packet(EntityAttributes { + self.send_packet(UpdateAttributes { entity_id: VarInt(0), properties: vec![EntityAttributesProperty { key: ident!("generic.movement_speed"), @@ -1102,7 +1101,7 @@ impl Client { if self.bits.modified_spawn_position() { self.bits.set_modified_spawn_position(false); - self.send_packet(PlayerSpawnPosition { + self.send_packet(SetDefaultSpawnPosition { location: self.spawn_position, angle: self.spawn_position_yaw, }) @@ -1113,7 +1112,7 @@ impl Client { self.bits.set_view_distance_modified(false); if !self.created_this_tick() { - self.send_packet(ChunkLoadDistance { + self.send_packet(SetRenderDistance { view_distance: BoundedInt(VarInt(self.view_distance() as i32)), }); } @@ -1123,7 +1122,7 @@ impl Client { if current_tick % (shared.tick_rate() * 8) == 0 { if self.bits.got_keepalive() { let id = rand::random(); - self.send_packet(KeepAlive { id }); + self.send_packet(KeepAliveS2c { id }); self.last_keepalive_id = id; self.bits.set_got_keepalive(false); } else { @@ -1144,7 +1143,7 @@ impl Client { let new_section = self.position.map(|n| (n / 16.0).floor() as i32); if old_section != new_section { - self.send_packet(ChunkRenderDistanceCenter { + self.send_packet(SetCenterChunk { chunk_x: VarInt(new_section.x), chunk_z: VarInt(new_section.z), }) @@ -1195,7 +1194,7 @@ impl Client { for seq in self.dug_blocks.drain(..) { send_packet( &mut self.send, - PlayerActionResponse { + AcknowledgeBlockChange { sequence: VarInt(seq), }, ) @@ -1208,7 +1207,7 @@ impl Client { if self.bits.teleported_this_tick() { self.bits.set_teleported_this_tick(false); - self.send_packet(PlayerPositionLook { + self.send_packet(SynchronizePlayerPosition { position: self.position, yaw: self.yaw, pitch: self.pitch, @@ -1233,7 +1232,7 @@ impl Client { if self.bits.velocity_modified() { self.bits.set_velocity_modified(false); - self.send_packet(EntityVelocityUpdate { + self.send_packet(SetEntityVelocity { entity_id: VarInt(0), velocity: velocity_to_packet_units(self.velocity), }); @@ -1243,7 +1242,7 @@ impl Client { for msg in self.msgs_to_send.drain(..) { send_packet( &mut self.send, - GameMessage { + SystemChatMessage { chat: msg, kind: VarInt(0), }, @@ -1251,7 +1250,7 @@ impl Client { } if let Some(bar) = self.bar_to_send.take() { - send_packet(&mut self.send, OverlayMessage { text: bar }); + send_packet(&mut self.send, SetActionBarText { text: bar }); } let mut entities_to_unload = Vec::new(); @@ -1276,7 +1275,7 @@ impl Client { { send_packet( &mut self.send, - RotateAndMoveRelative { + UpdateEntityPositionAndRotation { entity_id: VarInt(id.to_network_id()), delta: (position_delta * 4096.0).as_(), yaw: ByteAngle::from_degrees(entity.yaw()), @@ -1288,7 +1287,7 @@ impl Client { if entity.position() != entity.old_position() && !needs_teleport { send_packet( &mut self.send, - MoveRelative { + UpdateEntityPosition { entity_id: VarInt(id.to_network_id()), delta: (position_delta * 4096.0).as_(), on_ground: entity.on_ground(), @@ -1299,7 +1298,7 @@ impl Client { if flags.yaw_or_pitch_modified() { send_packet( &mut self.send, - Rotate { + UpdateEntityRotation { entity_id: VarInt(id.to_network_id()), yaw: ByteAngle::from_degrees(entity.yaw()), pitch: ByteAngle::from_degrees(entity.pitch()), @@ -1312,7 +1311,7 @@ impl Client { if needs_teleport { send_packet( &mut self.send, - EntityPosition { + TeleportEntity { entity_id: VarInt(id.to_network_id()), position: entity.position(), yaw: ByteAngle::from_degrees(entity.yaw()), @@ -1325,7 +1324,7 @@ impl Client { if flags.velocity_modified() { send_packet( &mut self.send, - EntityVelocityUpdate { + SetEntityVelocity { entity_id: VarInt(id.to_network_id()), velocity: velocity_to_packet_units(entity.velocity()), }, @@ -1335,7 +1334,7 @@ impl Client { if flags.head_yaw_modified() { send_packet( &mut self.send, - EntitySetHeadYaw { + SetHeadRotation { entity_id: VarInt(id.to_network_id()), head_yaw: ByteAngle::from_degrees(entity.head_yaw()), }, @@ -1353,7 +1352,7 @@ impl Client { }); if !entities_to_unload.is_empty() { - self.send_packet(EntitiesDestroy { + self.send_packet(RemoveEntities { entities: entities_to_unload, }); } @@ -1365,7 +1364,7 @@ impl Client { if !data.is_empty() { data.push(0xff); - self.send_packet(EntityTrackerUpdate { + self.send_packet(SetEntityMetadata { entity_id: VarInt(0), metadata: RawBytes(data), }); @@ -1428,19 +1427,19 @@ fn send_packet(send_opt: &mut SendOpt, pkt: impl Into) { } } -fn send_entity_events(send_opt: &mut SendOpt, entity_id: i32, events: &[EntityEvent]) { +fn send_entity_events(send_opt: &mut SendOpt, entity_id: i32, events: &[entity::EntityEvent]) { for &event in events { match event.status_or_animation() { StatusOrAnimation::Status(code) => send_packet( send_opt, - EntityStatus { + EntityEvent { entity_id, entity_status: code, }, ), StatusOrAnimation::Animation(code) => send_packet( send_opt, - EntityAnimation { + EntityAnimationS2c { entity_id: VarInt(entity_id), animation: code, }, diff --git a/src/entity.rs b/src/entity.rs index f594694..4b65a2f 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -13,7 +13,7 @@ use vek::{Aabb, Vec3}; use crate::config::Config; use crate::protocol::packets::s2c::play::{ - EntitySpawn, EntityTrackerUpdate, ExperienceOrbSpawn, PlayerSpawn, S2cPlayPacket, + S2cPlayPacket, SetEntityMetadata, SpawnEntity, SpawnExperienceOrb, SpawnPlayer, }; use crate::protocol::{ByteAngle, RawBytes, VarInt}; use crate::slab_versioned::{Key, VersionedSlab}; @@ -571,10 +571,10 @@ impl Entity { pub(crate) fn initial_tracked_data_packet( &self, this_id: EntityId, - ) -> Option { + ) -> Option { self.variants .initial_tracked_data() - .map(|meta| EntityTrackerUpdate { + .map(|meta| SetEntityMetadata { entity_id: VarInt(this_id.to_network_id()), metadata: RawBytes(meta), }) @@ -587,10 +587,10 @@ impl Entity { pub(crate) fn updated_tracked_data_packet( &self, this_id: EntityId, - ) -> Option { + ) -> Option { self.variants .updated_tracked_data() - .map(|meta| EntityTrackerUpdate { + .map(|meta| SetEntityMetadata { entity_id: VarInt(this_id.to_network_id()), metadata: RawBytes(meta), }) @@ -600,20 +600,20 @@ impl Entity { match &self.variants { TrackedData::Marker(_) => None, TrackedData::ExperienceOrb(_) => { - Some(EntitySpawnPacket::ExperienceOrb(ExperienceOrbSpawn { + Some(EntitySpawnPacket::ExperienceOrb(SpawnExperienceOrb { entity_id: VarInt(this_id.to_network_id()), position: self.new_position, count: 0, // TODO })) } - TrackedData::Player(_) => Some(EntitySpawnPacket::Player(PlayerSpawn { + TrackedData::Player(_) => Some(EntitySpawnPacket::Player(SpawnPlayer { entity_id: VarInt(this_id.to_network_id()), player_uuid: self.uuid, position: self.new_position, yaw: ByteAngle::from_degrees(self.yaw), pitch: ByteAngle::from_degrees(self.pitch), })), - _ => Some(EntitySpawnPacket::Entity(EntitySpawn { + _ => Some(EntitySpawnPacket::Entity(SpawnEntity { entity_id: VarInt(this_id.to_network_id()), object_uuid: self.uuid, kind: VarInt(self.kind() as i32), @@ -634,9 +634,9 @@ pub(crate) fn velocity_to_packet_units(vel: Vec3) -> Vec3 { } pub(crate) enum EntitySpawnPacket { - Entity(EntitySpawn), - ExperienceOrb(ExperienceOrbSpawn), - Player(PlayerSpawn), + Entity(SpawnEntity), + ExperienceOrb(SpawnExperienceOrb), + Player(SpawnPlayer), } impl From for S2cPlayPacket { diff --git a/src/player_list.rs b/src/player_list.rs index 9abfe30..35f0069 100644 --- a/src/player_list.rs +++ b/src/player_list.rs @@ -10,7 +10,7 @@ use crate::client::GameMode; use crate::config::Config; use crate::player_textures::SignedPlayerTextures; use crate::protocol::packets::s2c::play::{ - PlayerListAddPlayer, PlayerListHeaderFooter, S2cPlayPacket, UpdatePlayerList, + PlayerInfo, PlayerListAddPlayer, S2cPlayPacket, SetTabListHeaderAndFooter, }; use crate::protocol::packets::Property; use crate::protocol::VarInt; @@ -258,12 +258,12 @@ impl PlayerList { .collect(); if !add_player.is_empty() { - push_packet(UpdatePlayerList::AddPlayer(add_player).into()); + push_packet(PlayerInfo::AddPlayer(add_player).into()); } if self.header != Text::default() || self.footer != Text::default() { push_packet( - PlayerListHeaderFooter { + SetTabListHeaderAndFooter { header: self.header.clone(), footer: self.footer.clone(), } @@ -274,9 +274,7 @@ impl PlayerList { pub(crate) fn update_packets(&self, mut push_packet: impl FnMut(S2cPlayPacket)) { if !self.removed.is_empty() { - push_packet( - UpdatePlayerList::RemovePlayer(self.removed.iter().cloned().collect()).into(), - ); + push_packet(PlayerInfo::RemovePlayer(self.removed.iter().cloned().collect()).into()); } let mut add_player = Vec::new(); @@ -322,24 +320,24 @@ impl PlayerList { } if !add_player.is_empty() { - push_packet(UpdatePlayerList::AddPlayer(add_player).into()); + push_packet(PlayerInfo::AddPlayer(add_player).into()); } if !game_mode.is_empty() { - push_packet(UpdatePlayerList::UpdateGameMode(game_mode).into()); + push_packet(PlayerInfo::UpdateGameMode(game_mode).into()); } if !ping.is_empty() { - push_packet(UpdatePlayerList::UpdateLatency(ping).into()); + push_packet(PlayerInfo::UpdateLatency(ping).into()); } if !display_name.is_empty() { - push_packet(UpdatePlayerList::UpdateDisplayName(display_name).into()); + push_packet(PlayerInfo::UpdateDisplayName(display_name).into()); } if self.modified_header_or_footer { push_packet( - PlayerListHeaderFooter { + SetTabListHeaderAndFooter { header: self.header.clone(), footer: self.footer.clone(), } @@ -349,7 +347,7 @@ impl PlayerList { } pub(crate) fn clear_packets(&self, mut push_packet: impl FnMut(S2cPlayPacket)) { - push_packet(UpdatePlayerList::RemovePlayer(self.entries.keys().cloned().collect()).into()); + push_packet(PlayerInfo::RemovePlayer(self.entries.keys().cloned().collect()).into()); } } diff --git a/src/protocol/packets/c2s.rs b/src/protocol/packets/c2s.rs index 31add7f..b8d2f66 100644 --- a/src/protocol/packets/c2s.rs +++ b/src/protocol/packets/c2s.rs @@ -32,19 +32,19 @@ pub mod status { use super::*; def_struct! { - QueryRequest {} + StatusRequest {} } def_struct! { - QueryPing { + PingRequest { payload: u64 } } def_packet_group! { C2sStatusPacket { - QueryRequest = 0, - QueryPing = 1, + StatusRequest = 0, + PingRequest = 1, } } } @@ -101,20 +101,20 @@ pub mod play { use super::*; def_struct! { - TeleportConfirm { + ConfirmTeleport { teleport_id: VarInt } } def_struct! { - QueryBlockNbt { + QueryBlockEntityTag { transaction_id: VarInt, location: BlockPos, } } def_enum! { - UpdateDifficulty: i8 { + ChangeDifficulty: i8 { Peaceful = 0, Easy = 1, Normal = 2, @@ -150,7 +150,7 @@ pub mod play { } def_struct! { - CommandExecution { + ChatCommand { command: BoundedString<0, 256>, timestamp: u64, salt: u64, @@ -172,14 +172,14 @@ pub mod play { } def_struct! { - RequestChatPreview { + ChatPreviewC2s { query: i32, // TODO: is this an i32 or a varint? message: BoundedString<0, 256>, } } def_enum! { - ClientStatus: VarInt { + ClientCommand: VarInt { /// Sent when ready to complete login and ready to respawn after death. PerformRespawn = 0, /// Sent when the statistics menu is opened. @@ -188,7 +188,7 @@ pub mod play { } def_struct! { - ClientSettings { + ClientInformation { /// e.g. en_US locale: BoundedString<0, 16>, /// Client-side render distance in chunks. @@ -234,7 +234,7 @@ pub mod play { } def_struct! { - RequestCommandCompletion { + CommandSuggestionsRequest { transaction_id: VarInt, /// Text behind the cursor without the '/'. text: BoundedString<0, 32500> @@ -271,20 +271,20 @@ pub mod play { } def_struct! { - CloseHandledScreen { + CloseContainerC2s { window_id: u8, } } def_struct! { - CustomPayload { + PluginMessageC2s { channel: Ident, data: RawBytes, } } def_struct! { - BookUpdate { + EditBook { slot: VarInt, entries: Vec, title: Option, @@ -292,14 +292,14 @@ pub mod play { } def_struct! { - QueryEntityNbt { + QueryEntityTag { transaction_id: VarInt, entity_id: VarInt, } } def_struct! { - PlayerInteractEntity { + Interact { entity_id: VarInt, kind: InteractKind, sneaking: bool, @@ -331,26 +331,26 @@ pub mod play { } def_struct! { - KeepAlive { + KeepAliveC2s { id: i64, } } def_struct! { - UpdateDifficultyLock { + LockDifficulty { locked: bool } } def_struct! { - MovePlayerPosition { + SetPlayerPosition { position: Vec3, on_ground: bool, } } def_struct! { - MovePlayerPositionAndRotation { + SetPlayerPositionAndRotation { // Absolute position position: Vec3, /// Absolute rotation on X axis in degrees. @@ -362,7 +362,7 @@ pub mod play { } def_struct! { - MovePlayerRotation { + SetPlayerRotation { /// Absolute rotation on X axis in degrees. yaw: f32, /// Absolute rotation on Y axis in degrees. @@ -372,13 +372,13 @@ pub mod play { } def_struct! { - MovePlayerOnGround { + SetPlayerOnGround { on_ground: bool } } def_struct! { - MoveVehicle { + MoveVehicleC2s { /// Absolute position position: Vec3, /// Degrees @@ -389,20 +389,20 @@ pub mod play { } def_struct! { - BoatPaddleState { + PaddleBoat { left_paddle_turning: bool, right_paddle_turning: bool, } } def_struct! { - PickFromInventory { + PickItem { slot_to_use: VarInt, } } def_struct! { - CraftRequest { + PlaceRecipe { window_id: i8, recipe: Ident, make_all: bool, @@ -410,7 +410,7 @@ pub mod play { } def_enum! { - UpdatePlayerAbilities: i8 { + PlayerAbilitiesC2s: i8 { NotFlying = 0, Flying = 0b10, } @@ -493,13 +493,13 @@ pub mod play { } def_struct! { - PlayPong { + PongPlay { id: i32, } } def_struct! { - RecipeBookChangeSettings { + ChangeRecipeBookSettings { book_id: RecipeBookId, book_open: bool, filter_active: bool, @@ -516,7 +516,7 @@ pub mod play { } def_struct! { - RecipeBookSeenRecipe { + SetSeenRecipe { recipe_id: Ident, } } @@ -528,7 +528,7 @@ pub mod play { } def_enum! { - ResourcePackStatus: VarInt { + ResourcePackC2s: VarInt { SuccessfullyLoaded = 0, Declined = 1, FailedDownload = 2, @@ -537,20 +537,20 @@ pub mod play { } def_enum! { - AdvancementTab: VarInt { + SeenAdvancements: VarInt { OpenedTab: Ident = 0, ClosedScreen = 1, } } def_struct! { - SelectMerchantTrade { + SelectTrade { selected_slot: VarInt, } } def_struct! { - UpdateBeacon { + SetBeaconEffect { // TODO: potion ids primary_effect: Option, secondary_effect: Option, @@ -558,13 +558,13 @@ pub mod play { } def_struct! { - UpdateSelectedSlot { + SetHeldItemS2c { slot: BoundedInt, } } def_struct! { - UpdateCommandBlock { + ProgramCommandBlock { location: BlockPos, command: String, mode: CommandBlockMode, @@ -589,7 +589,7 @@ pub mod play { } def_struct! { - UpdateCommandBlockMinecart { + ProgramCommandBlockMinecart { entity_id: VarInt, command: String, track_output: bool, @@ -597,14 +597,14 @@ pub mod play { } def_struct! { - UpdateCreativeModeSlot { + SetCreativeModeSlot { slot: i16, clicked_item: Slot, } } def_struct! { - UpdateJigsaw { + ProgramJigsawBlock { location: BlockPos, name: Ident, target: Ident, @@ -615,7 +615,7 @@ pub mod play { } def_struct! { - UpdateStructureBlock { + ProgramStructureBlock { location: BlockPos, action: StructureBlockAction, mode: StructureBlockMode, @@ -682,19 +682,19 @@ pub mod play { } def_struct! { - HandSwing { + SwingArm { hand: Hand, } } def_struct! { - SpectatorTeleport { + TeleportToEntity { target: Uuid, } } def_struct! { - PlayerInteractBlock { + UseItemOn { hand: Hand, location: BlockPos, face: BlockFace, @@ -705,7 +705,7 @@ pub mod play { } def_struct! { - PlayerInteractItem { + UseItem { hand: Hand, sequence: VarInt, } @@ -713,57 +713,57 @@ pub mod play { def_packet_group! { C2sPlayPacket { - TeleportConfirm = 0, - QueryBlockNbt = 1, - UpdateDifficulty = 2, + ConfirmTeleport = 0, + QueryBlockEntityTag = 1, + ChangeDifficulty = 2, MessageAcknowledgment = 3, - CommandExecution = 4, + ChatCommand = 4, ChatMessage = 5, - RequestChatPreview = 6, - ClientStatus = 7, - ClientSettings = 8, - RequestCommandCompletion = 9, + ChatPreviewC2s = 6, + ClientCommand = 7, + ClientInformation = 8, + CommandSuggestionsRequest = 9, ClickContainerButton = 10, ClickContainer = 11, - CloseHandledScreen = 12, - CustomPayload = 13, - BookUpdate = 14, - QueryEntityNbt = 15, - PlayerInteractEntity = 16, + CloseContainerC2s = 12, + PluginMessageC2s = 13, + EditBook = 14, + QueryEntityTag = 15, + Interact = 16, JigsawGenerate = 17, - KeepAlive = 18, - UpdateDifficultyLock = 19, - MovePlayerPosition = 20, - MovePlayerPositionAndRotation = 21, - MovePlayerRotation = 22, - MovePlayerOnGround = 23, - MoveVehicle = 24, - BoatPaddleState = 25, - PickFromInventory = 26, - CraftRequest = 27, - UpdatePlayerAbilities = 28, + KeepAliveC2s = 18, + LockDifficulty = 19, + SetPlayerPosition = 20, + SetPlayerPositionAndRotation = 21, + SetPlayerRotation = 22, + SetPlayerOnGround = 23, + MoveVehicleC2s = 24, + PaddleBoat = 25, + PickItem = 26, + PlaceRecipe = 27, + PlayerAbilitiesC2s = 28, PlayerAction = 29, PlayerCommand = 30, PlayerInput = 31, - PlayPong = 32, - RecipeBookChangeSettings = 33, - RecipeBookSeenRecipe = 34, + PongPlay = 32, + ChangeRecipeBookSettings = 33, + SetSeenRecipe = 34, RenameItem = 35, - ResourcePackStatus = 36, - AdvancementTab = 37, - SelectMerchantTrade = 38, - UpdateBeacon = 39, - UpdateSelectedSlot = 40, - UpdateCommandBlock = 41, - UpdateCommandBlockMinecart = 42, - UpdateCreativeModeSlot = 43, - UpdateJigsaw = 44, - UpdateStructureBlock = 45, + ResourcePackC2s = 36, + SeenAdvancements = 37, + SelectTrade = 38, + SetBeaconEffect = 39, + SetHeldItemS2c = 40, + ProgramCommandBlock = 41, + ProgramCommandBlockMinecart = 42, + SetCreativeModeSlot = 43, + ProgramJigsawBlock = 44, + ProgramStructureBlock = 45, UpdateSign = 46, - HandSwing = 47, - SpectatorTeleport = 48, - PlayerInteractBlock = 49, - PlayerInteractItem = 50, + SwingArm = 47, + TeleportToEntity = 48, + UseItemOn = 49, + UseItem = 50, } } } diff --git a/src/protocol/packets/s2c.rs b/src/protocol/packets/s2c.rs index 15a5294..fd4497d 100644 --- a/src/protocol/packets/s2c.rs +++ b/src/protocol/packets/s2c.rs @@ -6,13 +6,13 @@ pub mod status { use super::*; def_struct! { - QueryResponse { + StatusResponse { json_response: String } } def_struct! { - QueryPong { + PingResponse { /// Should be the same as the payload from ping. payload: u64 } @@ -20,8 +20,8 @@ pub mod status { def_packet_group! { S2cStatusPacket { - QueryResponse = 0, - QueryPong = 1, + StatusResponse = 0, + PingResponse = 1, } } } @@ -30,7 +30,7 @@ pub mod login { use super::*; def_struct! { - LoginDisconnect { + DisconnectLogin { reason: Text, } } @@ -54,7 +54,7 @@ pub mod login { } def_struct! { - LoginCompression { + SetCompression { threshold: VarInt } } @@ -69,10 +69,10 @@ pub mod login { def_packet_group! { S2cLoginPacket { - LoginDisconnect = 0, + DisconnectLogin = 0, EncryptionRequest = 1, LoginSuccess = 2, - LoginCompression = 3, + SetCompression = 3, LoginPluginRequest = 4, } } @@ -82,7 +82,7 @@ pub mod play { use super::*; def_struct! { - EntitySpawn { + SpawnEntity { entity_id: VarInt, object_uuid: Uuid, kind: VarInt, @@ -96,7 +96,7 @@ pub mod play { } def_struct! { - ExperienceOrbSpawn { + SpawnExperienceOrb { entity_id: VarInt, position: Vec3, count: i16, @@ -104,7 +104,7 @@ pub mod play { } def_struct! { - PlayerSpawn { + SpawnPlayer { entity_id: VarInt, player_uuid: Uuid, position: Vec3, @@ -114,20 +114,20 @@ pub mod play { } def_struct! { - EntityAnimation { + EntityAnimationS2c { entity_id: VarInt, animation: u8, } } def_struct! { - PlayerActionResponse { + AcknowledgeBlockChange { sequence: VarInt, } } def_struct! { - BlockBreakingProgress { + SetBlockDestroyStage { entity_id: VarInt, location: BlockPos, destroy_stage: BoundedInt, @@ -135,7 +135,7 @@ pub mod play { } def_struct! { - BlockEntityUpdate { + BlockEntityData { location: BlockPos, kind: VarInt, // TODO: use enum here data: Compound, @@ -143,7 +143,7 @@ pub mod play { } def_struct! { - BlockEvent { + BlockAction { location: BlockPos, action_id: u8, action_param: u8, @@ -276,7 +276,7 @@ pub mod play { } def_struct! { - PlaySoundId { + CustomSoundEffect { name: Ident, category: SoundCategory, position: Vec3, @@ -287,13 +287,13 @@ pub mod play { } def_struct! { - Disconnect { + DisconnectPlay { reason: Text, } } def_struct! { - EntityStatus { + EntityEvent { entity_id: i32, entity_status: u8, } @@ -307,7 +307,7 @@ pub mod play { } def_struct! { - GameStateChange { + GameEvent { reason: GameStateChangeReason, value: f32, } @@ -344,13 +344,13 @@ pub mod play { } def_struct! { - KeepAlive { + KeepAliveS2c { id: i64, } } def_struct! { - ChunkData { + ChunkDataAndUpdateLight { chunk_x: i32, chunk_z: i32, heightmaps: NbtBridge, @@ -382,7 +382,7 @@ pub mod play { } def_struct! { - GameJoin { + LoginPlay { /// Entity ID of the joining player entity_id: i32, is_hardcore: bool, @@ -574,7 +574,7 @@ pub mod play { } def_struct! { - MoveRelative { + UpdateEntityPosition { entity_id: VarInt, delta: Vec3, on_ground: bool, @@ -582,7 +582,7 @@ pub mod play { } def_struct! { - RotateAndMoveRelative { + UpdateEntityPositionAndRotation { entity_id: VarInt, delta: Vec3, yaw: ByteAngle, @@ -592,7 +592,7 @@ pub mod play { } def_struct! { - Rotate { + UpdateEntityRotation { entity_id: VarInt, yaw: ByteAngle, pitch: ByteAngle, @@ -609,7 +609,7 @@ pub mod play { } def_struct! { - ChatMessage { + PlayerChatMessage { // TODO: more 1.19 stuff. message: Text, /// Index into the chat type registry @@ -619,7 +619,7 @@ pub mod play { } def_enum! { - UpdatePlayerList: VarInt { + PlayerInfo: VarInt { AddPlayer: Vec = 0, UpdateGameMode: Vec<(Uuid, GameMode)> = 1, UpdateLatency: Vec<(Uuid, VarInt)> = 2, @@ -641,7 +641,7 @@ pub mod play { } def_struct! { - PlayerPositionLook { + SynchronizePlayerPosition { position: Vec3, yaw: f32, pitch: f32, @@ -662,13 +662,13 @@ pub mod play { } def_struct! { - EntitiesDestroy { + RemoveEntities { entities: Vec, } } def_struct! { - PlayerRespawn { + Respawn { dimension_type_name: Ident, dimension_name: Ident, hashed_seed: u64, @@ -682,14 +682,14 @@ pub mod play { } def_struct! { - EntitySetHeadYaw { + SetHeadRotation { entity_id: VarInt, head_yaw: ByteAngle, } } def_struct! { - ChunkSectionUpdate { + UpdateSectionBlocks { chunk_section_position: i64, invert_trust_edges: bool, blocks: Vec, @@ -697,53 +697,53 @@ pub mod play { } def_struct! { - OverlayMessage { + SetActionBarText { text: Text } } def_struct! { - UpdateSelectedSlot { + SetHeldItemS2c { slot: BoundedInt, } } def_struct! { - ChunkRenderDistanceCenter { + SetCenterChunk { chunk_x: VarInt, chunk_z: VarInt, } } def_struct! { - ChunkLoadDistance { + SetRenderDistance { view_distance: BoundedInt, } } def_struct! { - PlayerSpawnPosition { + SetDefaultSpawnPosition { location: BlockPos, angle: f32, } } def_struct! { - EntityTrackerUpdate { + SetEntityMetadata { entity_id: VarInt, metadata: RawBytes, } } def_struct! { - EntityVelocityUpdate { + SetEntityVelocity { entity_id: VarInt, velocity: Vec3, } } def_struct! { - ExperienceBarUpdate { + SetExperience { bar: f32, level: VarInt, total_xp: VarInt, @@ -751,7 +751,7 @@ pub mod play { } def_struct! { - HealthUpdate { + SetHealth { health: f32, food: VarInt, food_saturation: f32, @@ -759,13 +759,13 @@ pub mod play { } def_struct! { - UpdateSubtitle { + SetSubtitleText { subtitle_text: Text, } } def_struct! { - WorldTimeUpdate { + UpdateTime { /// The age of the world in 1/20ths of a second. world_age: i64, /// The current time of day in 1/20ths of a second. @@ -776,14 +776,14 @@ pub mod play { } def_struct! { - UpdateTitle { + SetTitleText { text: Text, } } def_struct! { #[derive(Copy, PartialEq, Eq)] - TitleFade { + SetTitleAnimationTimes { /// Ticks to spend fading in. fade_in: u32, /// Ticks to keep the title displayed. @@ -794,7 +794,7 @@ pub mod play { } def_struct! { - PlaySoundFromEntity { + EntitySoundEffect { id: VarInt, category: SoundCategory, entity_id: VarInt, @@ -804,7 +804,7 @@ pub mod play { } def_struct! { - PlaySound { + SoundEffect { id: VarInt, category: SoundCategory, position: Vec3, @@ -815,7 +815,7 @@ pub mod play { } def_struct! { - GameMessage { + SystemChatMessage { chat: Text, /// Index into the chat type registry. kind: VarInt, @@ -823,14 +823,14 @@ pub mod play { } def_struct! { - PlayerListHeaderFooter { + SetTabListHeaderAndFooter { header: Text, footer: Text, } } def_struct! { - EntityPosition { + TeleportEntity { entity_id: VarInt, position: Vec3, yaw: ByteAngle, @@ -840,7 +840,7 @@ pub mod play { } def_struct! { - EntityAttributes { + UpdateAttributes { entity_id: VarInt, properties: Vec, } @@ -864,14 +864,14 @@ pub mod play { def_packet_group! { S2cPlayPacket { - EntitySpawn = 0, - ExperienceOrbSpawn = 1, - PlayerSpawn = 2, - EntityAnimation = 3, - PlayerActionResponse = 5, - BlockBreakingProgress = 6, - BlockEntityUpdate = 7, - BlockEvent = 8, + SpawnEntity = 0, + SpawnExperienceOrb = 1, + SpawnPlayer = 2, + EntityAnimationS2c = 3, + AcknowledgeBlockChange = 5, + SetBlockDestroyStage = 6, + BlockEntityData = 7, + BlockAction = 8, BlockUpdate = 9, BossBar = 10, ClearTitles = 13, @@ -879,44 +879,44 @@ pub mod play { SetContainerProperty = 18, SetContainerSlot = 19, SetCooldown = 20, - PlaySoundId = 23, - Disconnect = 25, - EntityStatus = 26, + CustomSoundEffect = 23, + DisconnectPlay = 25, + EntityEvent = 26, UnloadChunk = 28, - GameStateChange = 29, - KeepAlive = 32, - ChunkData = 33, - GameJoin = 37, - MoveRelative = 40, - RotateAndMoveRelative = 41, - Rotate = 42, + GameEvent = 29, + KeepAliveS2c = 32, + ChunkDataAndUpdateLight = 33, + LoginPlay = 37, + UpdateEntityPosition = 40, + UpdateEntityPositionAndRotation = 41, + UpdateEntityRotation = 42, OpenScreen = 45, - ChatMessage = 51, - UpdatePlayerList = 55, - PlayerPositionLook = 57, - EntitiesDestroy = 59, - PlayerRespawn = 62, - EntitySetHeadYaw = 63, - ChunkSectionUpdate = 64, - OverlayMessage = 67, - UpdateSelectedSlot = 74, - ChunkRenderDistanceCenter = 75, - ChunkLoadDistance = 76, - PlayerSpawnPosition = 77, - EntityTrackerUpdate = 80, - EntityVelocityUpdate = 82, - ExperienceBarUpdate = 84, - HealthUpdate = 85, - UpdateSubtitle = 91, - WorldTimeUpdate = 92, - UpdateTitle = 93, - TitleFade = 94, - PlaySoundFromEntity = 95, - PlaySound = 96, - GameMessage = 98, - PlayerListHeaderFooter = 99, - EntityPosition = 102, - EntityAttributes = 104, + PlayerChatMessage = 51, + PlayerInfo = 55, + SynchronizePlayerPosition = 57, + RemoveEntities = 59, + Respawn = 62, + SetHeadRotation = 63, + UpdateSectionBlocks = 64, + SetActionBarText = 67, + SetHeldItemS2c = 74, + SetCenterChunk = 75, + SetRenderDistance = 76, + SetDefaultSpawnPosition = 77, + SetEntityMetadata = 80, + SetEntityVelocity = 82, + SetExperience = 84, + SetHealth = 85, + SetSubtitleText = 91, + UpdateTime = 92, + SetTitleText = 93, + SetTitleAnimationTimes = 94, + EntitySoundEffect = 95, + SoundEffect = 96, + SystemChatMessage = 98, + SetTabListHeaderAndFooter = 99, + TeleportEntity = 102, + UpdateAttributes = 104, } } } diff --git a/src/server.rs b/src/server.rs index af605b1..3bd0ac0 100644 --- a/src/server.rs +++ b/src/server.rs @@ -38,12 +38,12 @@ use crate::protocol::codec::{Decoder, Encoder}; use crate::protocol::packets::c2s::handshake::{Handshake, HandshakeNextState}; use crate::protocol::packets::c2s::login::{EncryptionResponse, LoginStart, VerifyTokenOrMsgSig}; use crate::protocol::packets::c2s::play::C2sPlayPacket; -use crate::protocol::packets::c2s::status::{QueryPing, QueryRequest}; +use crate::protocol::packets::c2s::status::{PingRequest, StatusRequest}; use crate::protocol::packets::s2c::login::{ - EncryptionRequest, LoginCompression, LoginDisconnect, LoginSuccess, + DisconnectLogin, EncryptionRequest, LoginSuccess, SetCompression, }; use crate::protocol::packets::s2c::play::S2cPlayPacket; -use crate::protocol::packets::s2c::status::{QueryPong, QueryResponse}; +use crate::protocol::packets::s2c::status::{PingResponse, StatusResponse}; use crate::protocol::packets::Property; use crate::protocol::{BoundedArray, BoundedString, VarInt}; use crate::util::valid_username; @@ -573,7 +573,7 @@ async fn handle_status( remote_addr: SocketAddr, handshake: Handshake, ) -> anyhow::Result<()> { - c.dec.read_packet::().await?; + c.dec.read_packet::().await?; match server .0 @@ -610,7 +610,7 @@ async fn handle_status( } c.enc - .write_packet(&QueryResponse { + .write_packet(&StatusResponse { json_response: json.to_string(), }) .await?; @@ -618,9 +618,9 @@ async fn handle_status( ServerListPing::Ignore => return Ok(()), } - let QueryPing { payload } = c.dec.read_packet().await?; + let PingRequest { payload } = c.dec.read_packet().await?; - c.enc.write_packet(&QueryPong { payload }).await?; + c.enc.write_packet(&PingResponse { payload }).await?; Ok(()) } @@ -739,7 +739,7 @@ async fn handle_login( let compression_threshold = 256; c.enc - .write_packet(&LoginCompression { + .write_packet(&SetCompression { threshold: VarInt(compression_threshold as i32), }) .await?; @@ -756,7 +756,7 @@ async fn handle_login( if let Err(reason) = server.0.cfg.login(server, &ncd).await { log::info!("Disconnect at login: \"{reason}\""); - c.enc.write_packet(&LoginDisconnect { reason }).await?; + c.enc.write_packet(&DisconnectLogin { reason }).await?; return Ok(None); }