mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 14:31:30 +11:00
Migrating the packets to wiki.vg (#62)
Addresses #56. Migrating all the packet names to wiki.vg's instead of fabric's.
This commit is contained in:
parent
0a75f103aa
commit
419d317736
|
@ -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::<QueryRequest>(&mut client_read, &mut server_write)
|
||||
cli.rw_packet::<StatusRequest>(&mut client_read, &mut server_write)
|
||||
.await?;
|
||||
cli.rw_packet::<QueryResponse>(&mut server_read, &mut client_write)
|
||||
cli.rw_packet::<StatusResponse>(&mut server_read, &mut client_write)
|
||||
.await?;
|
||||
|
||||
cli.rw_packet::<QueryPing>(&mut client_read, &mut server_write)
|
||||
cli.rw_packet::<PingRequest>(&mut client_read, &mut server_write)
|
||||
.await?;
|
||||
cli.rw_packet::<QueryPong>(&mut server_read, &mut client_write)
|
||||
cli.rw_packet::<PingResponse>(&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.")
|
||||
}
|
||||
|
|
10
src/chunk.rs
10
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<C: Config> LoadedChunk<C> {
|
|||
|
||||
/// 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<C: Config> LoadedChunk<C> {
|
|||
| (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<C: Config> Chunk for LoadedChunk<C> {
|
|||
#[derive(Clone, Debug)]
|
||||
pub(crate) enum BlockChangePacket {
|
||||
Single(BlockUpdate),
|
||||
Multi(ChunkSectionUpdate),
|
||||
Multi(UpdateSectionBlocks),
|
||||
}
|
||||
|
||||
impl From<BlockChangePacket> for S2cPlayPacket {
|
||||
|
|
189
src/client.rs
189
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<C: Config> {
|
|||
bits: ClientBits,
|
||||
/// The data for the client's own player entity.
|
||||
player_data: Player,
|
||||
entity_events: Vec<EntityEvent>,
|
||||
entity_events: Vec<entity::EntityEvent>,
|
||||
}
|
||||
|
||||
#[bitfield(u16)]
|
||||
|
@ -468,7 +469,7 @@ impl<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
&mut self,
|
||||
title: impl Into<Text>,
|
||||
subtitle: impl Into<Text>,
|
||||
animation: impl Into<Option<TitleFade>>,
|
||||
animation: impl Into<Option<SetTitleAnimationTimes>>,
|
||||
) {
|
||||
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<C: Config> Client<C> {
|
|||
/// * `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<C: Config> Client<C> {
|
|||
/// * `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<C: Config> Client<C> {
|
|||
}
|
||||
|
||||
/// 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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
|
||||
fn handle_serverbound_packet(&mut self, entities: &Entities<C>, 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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
}
|
||||
}
|
||||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
});
|
||||
}
|
||||
}
|
||||
C2sPlayPacket::MovePlayerPositionAndRotation(p) => {
|
||||
C2sPlayPacket::SetPlayerPositionAndRotation(p) => {
|
||||
if self.pending_teleports == 0 {
|
||||
self.position = p.position;
|
||||
self.yaw = p.yaw;
|
||||
|
@ -804,7 +805,7 @@ impl<C: Config> Client<C> {
|
|||
});
|
||||
}
|
||||
}
|
||||
C2sPlayPacket::MovePlayerRotation(p) => {
|
||||
C2sPlayPacket::SetPlayerRotation(p) => {
|
||||
if self.pending_teleports == 0 {
|
||||
self.yaw = p.yaw;
|
||||
self.pitch = p.pitch;
|
||||
|
@ -816,14 +817,14 @@ impl<C: Config> Client<C> {
|
|||
});
|
||||
}
|
||||
}
|
||||
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<C: Config> Client<C> {
|
|||
});
|
||||
}
|
||||
}
|
||||
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<C: Config> Client<C> {
|
|||
});
|
||||
}
|
||||
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<C: Config> Client<C> {
|
|||
|
||||
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<C: Config> Client<C> {
|
|||
|
||||
// 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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
// 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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
for seq in self.dug_blocks.drain(..) {
|
||||
send_packet(
|
||||
&mut self.send,
|
||||
PlayerActionResponse {
|
||||
AcknowledgeBlockChange {
|
||||
sequence: VarInt(seq),
|
||||
},
|
||||
)
|
||||
|
@ -1208,7 +1207,7 @@ impl<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
}
|
||||
|
||||
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<C: Config> Client<C> {
|
|||
{
|
||||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
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<C: Config> Client<C> {
|
|||
});
|
||||
|
||||
if !entities_to_unload.is_empty() {
|
||||
self.send_packet(EntitiesDestroy {
|
||||
self.send_packet(RemoveEntities {
|
||||
entities: entities_to_unload,
|
||||
});
|
||||
}
|
||||
|
@ -1365,7 +1364,7 @@ impl<C: Config> Client<C> {
|
|||
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<S2cPlayMessage>) {
|
|||
}
|
||||
}
|
||||
|
||||
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,
|
||||
},
|
||||
|
|
|
@ -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<C: Config> Entity<C> {
|
|||
pub(crate) fn initial_tracked_data_packet(
|
||||
&self,
|
||||
this_id: EntityId,
|
||||
) -> Option<EntityTrackerUpdate> {
|
||||
) -> Option<SetEntityMetadata> {
|
||||
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<C: Config> Entity<C> {
|
|||
pub(crate) fn updated_tracked_data_packet(
|
||||
&self,
|
||||
this_id: EntityId,
|
||||
) -> Option<EntityTrackerUpdate> {
|
||||
) -> Option<SetEntityMetadata> {
|
||||
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<C: Config> Entity<C> {
|
|||
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<f32>) -> Vec3<i16> {
|
|||
}
|
||||
|
||||
pub(crate) enum EntitySpawnPacket {
|
||||
Entity(EntitySpawn),
|
||||
ExperienceOrb(ExperienceOrbSpawn),
|
||||
Player(PlayerSpawn),
|
||||
Entity(SpawnEntity),
|
||||
ExperienceOrb(SpawnExperienceOrb),
|
||||
Player(SpawnPlayer),
|
||||
}
|
||||
|
||||
impl From<EntitySpawnPacket> for S2cPlayPacket {
|
||||
|
|
|
@ -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<C: Config> PlayerList<C> {
|
|||
.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<C: Config> PlayerList<C> {
|
|||
|
||||
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<C: Config> PlayerList<C> {
|
|||
}
|
||||
|
||||
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<C: Config> PlayerList<C> {
|
|||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<String>,
|
||||
title: Option<String>,
|
||||
|
@ -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<f64>,
|
||||
on_ground: bool,
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
MovePlayerPositionAndRotation {
|
||||
SetPlayerPositionAndRotation {
|
||||
// Absolute position
|
||||
position: Vec3<f64>,
|
||||
/// 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<f64>,
|
||||
/// 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<VarInt>,
|
||||
secondary_effect: Option<VarInt>,
|
||||
|
@ -558,13 +558,13 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
UpdateSelectedSlot {
|
||||
SetHeldItemS2c {
|
||||
slot: BoundedInt<i16, 0, 8>,
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<f64>,
|
||||
count: i16,
|
||||
|
@ -104,7 +104,7 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
PlayerSpawn {
|
||||
SpawnPlayer {
|
||||
entity_id: VarInt,
|
||||
player_uuid: Uuid,
|
||||
position: Vec3<f64>,
|
||||
|
@ -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<u8, 0, 10>,
|
||||
|
@ -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<i32>,
|
||||
|
@ -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<ChunkDataHeightmaps>,
|
||||
|
@ -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<i16>,
|
||||
on_ground: bool,
|
||||
|
@ -582,7 +582,7 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
RotateAndMoveRelative {
|
||||
UpdateEntityPositionAndRotation {
|
||||
entity_id: VarInt,
|
||||
delta: Vec3<i16>,
|
||||
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<PlayerListAddPlayer> = 0,
|
||||
UpdateGameMode: Vec<(Uuid, GameMode)> = 1,
|
||||
UpdateLatency: Vec<(Uuid, VarInt)> = 2,
|
||||
|
@ -641,7 +641,7 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
PlayerPositionLook {
|
||||
SynchronizePlayerPosition {
|
||||
position: Vec3<f64>,
|
||||
yaw: f32,
|
||||
pitch: f32,
|
||||
|
@ -662,13 +662,13 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
EntitiesDestroy {
|
||||
RemoveEntities {
|
||||
entities: Vec<VarInt>,
|
||||
}
|
||||
}
|
||||
|
||||
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<VarLong>,
|
||||
|
@ -697,53 +697,53 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
OverlayMessage {
|
||||
SetActionBarText {
|
||||
text: Text
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
UpdateSelectedSlot {
|
||||
SetHeldItemS2c {
|
||||
slot: BoundedInt<u8, 0, 9>,
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
ChunkRenderDistanceCenter {
|
||||
SetCenterChunk {
|
||||
chunk_x: VarInt,
|
||||
chunk_z: VarInt,
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
ChunkLoadDistance {
|
||||
SetRenderDistance {
|
||||
view_distance: BoundedInt<VarInt, 2, 32>,
|
||||
}
|
||||
}
|
||||
|
||||
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<i16>,
|
||||
}
|
||||
}
|
||||
|
||||
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<i32>,
|
||||
|
@ -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<f64>,
|
||||
yaw: ByteAngle,
|
||||
|
@ -840,7 +840,7 @@ pub mod play {
|
|||
}
|
||||
|
||||
def_struct! {
|
||||
EntityAttributes {
|
||||
UpdateAttributes {
|
||||
entity_id: VarInt,
|
||||
properties: Vec<EntityAttributesProperty>,
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<C: Config>(
|
|||
remote_addr: SocketAddr,
|
||||
handshake: Handshake,
|
||||
) -> anyhow::Result<()> {
|
||||
c.dec.read_packet::<QueryRequest>().await?;
|
||||
c.dec.read_packet::<StatusRequest>().await?;
|
||||
|
||||
match server
|
||||
.0
|
||||
|
@ -610,7 +610,7 @@ async fn handle_status<C: Config>(
|
|||
}
|
||||
|
||||
c.enc
|
||||
.write_packet(&QueryResponse {
|
||||
.write_packet(&StatusResponse {
|
||||
json_response: json.to_string(),
|
||||
})
|
||||
.await?;
|
||||
|
@ -618,9 +618,9 @@ async fn handle_status<C: Config>(
|
|||
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<C: Config>(
|
|||
|
||||
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<C: Config>(
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue