From 45099165d990a5adc860eacc9050ce3dd3e20da0 Mon Sep 17 00:00:00 2001 From: iceiix <43691553+iceiix@users.noreply.github.com> Date: Sun, 11 Aug 2019 17:26:20 -0700 Subject: [PATCH] 1.14.4 protocol support (498) (#207) * Add protocol 498 for 1.14.4 * Add 0x5c AcknowledgePlayerDigging packet, https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14870#Acknowledge_Player_Digging * Add new demand field in protocol::Trade https://wiki.vg/index.php?title=Pre-release_protocol&type=revision&diff=14862&oldid=14856 MC-151282 - Villager trade GUI does not show the correct price on servers if trade demand is high --- README.md | 1 + src/protocol/mod.rs | 2 +- src/protocol/packet.rs | 10 ++ src/protocol/versions.rs | 3 + src/protocol/versions/v1_14_4.rs | 180 +++++++++++++++++++++++++++++++ 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 src/protocol/versions/v1_14_4.rs diff --git a/README.md b/README.md index 3f4ed0c..ff97f99 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Join with your favorite IRC client or [Matrix](https://matrix.to/#/#_espernet_#s | Game version | Protocol version | Supported? | | ------ | --- | --- | +| 1.14.4 | 498 | ✓ | | 1.14.3 | 490 | ✓ | | 1.14.2 | 485 | ✓ | | 1.14.1 | 480 | ✓ | diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 9eae973..a879066 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -42,7 +42,7 @@ use std::time::{Instant, Duration}; use crate::shared::Position; use log::debug; -pub const SUPPORTED_PROTOCOLS: [i32; 16] = [490, 485, 480, 477, 452, 451, 404, 340, 316, 315, 210, 109, 107, 74, 47, 5]; +pub const SUPPORTED_PROTOCOLS: [i32; 17] = [498, 490, 485, 480, 477, 452, 451, 404, 340, 316, 315, 210, 109, 107, 74, 47, 5]; // TODO: switch to using thread_local storage?, see https://doc.rust-lang.org/std/macro.thread_local.html pub static mut CURRENT_PROTOCOL_VERSION: i32 = SUPPORTED_PROTOCOLS[0]; diff --git a/src/protocol/packet.rs b/src/protocol/packet.rs index e3c8fb4..93fc393 100644 --- a/src/protocol/packet.rs +++ b/src/protocol/packet.rs @@ -1752,6 +1752,12 @@ state_packets!( field fluid_tags: LenPrefixed =, field entity_tags: LenPrefixed =, } + packet AcknowledgePlayerDigging { + field location: Position =, + field block: VarInt =, + field status: VarInt =, + field successful: bool =, + } packet UpdateLight { field chunk_x: VarInt =, field chunk_z: VarInt =, @@ -2625,10 +2631,13 @@ pub struct Trade { pub xp: i32, pub special_price: i32, pub price_multiplier: f32, + pub demand: Option, } impl Serializable for Trade { fn read_from(buf: &mut R) -> Result { + let protocol_version = unsafe { super::CURRENT_PROTOCOL_VERSION }; + Ok(Trade { input_item_1: Serializable::read_from(buf)?, output_item: Serializable::read_from(buf)?, @@ -2640,6 +2649,7 @@ impl Serializable for Trade { xp: Serializable::read_from(buf)?, special_price: Serializable::read_from(buf)?, price_multiplier: Serializable::read_from(buf)?, + demand: if protocol_version >= 498 { Some(Serializable::read_from(buf)?) } else { None }, }) } diff --git a/src/protocol/versions.rs b/src/protocol/versions.rs index b61b7bf..9912bb1 100644 --- a/src/protocol/versions.rs +++ b/src/protocol/versions.rs @@ -1,5 +1,6 @@ use super::*; +mod v1_14_4; mod v1_14_3; mod v1_14_2; mod v1_14_1; @@ -22,6 +23,7 @@ mod v1_7_10; pub fn protocol_name_to_protocol_version(s: String) -> i32 { match s.as_ref() { "" => SUPPORTED_PROTOCOLS[0], + "1.14.4" => 498, "1.14.3" => 490, "1.14.2" => 485, "1.14.1" => 480, @@ -50,6 +52,7 @@ pub fn protocol_name_to_protocol_version(s: String) -> i32 { pub fn translate_internal_packet_id_for_version(version: i32, state: State, dir: Direction, id: i32, to_internal: bool) -> i32 { match version { + 498 => v1_14_4::translate_internal_packet_id(state, dir, id, to_internal), 490 => v1_14_3::translate_internal_packet_id(state, dir, id, to_internal), 485 => v1_14_2::translate_internal_packet_id(state, dir, id, to_internal), 480 => v1_14_1::translate_internal_packet_id(state, dir, id, to_internal), diff --git a/src/protocol/versions/v1_14_4.rs b/src/protocol/versions/v1_14_4.rs new file mode 100644 index 0000000..8e7e35b --- /dev/null +++ b/src/protocol/versions/v1_14_4.rs @@ -0,0 +1,180 @@ +protocol_packet_ids!( + handshake Handshaking { + serverbound Serverbound { + 0x00 => Handshake + } + clientbound Clientbound { + } + } + play Play { + serverbound Serverbound { + 0x00 => TeleportConfirm + 0x01 => QueryBlockNBT + 0x02 => SetDifficulty + 0x03 => ChatMessage + 0x04 => ClientStatus + 0x05 => ClientSettings + 0x06 => TabComplete + 0x07 => ConfirmTransactionServerbound + 0x08 => ClickWindowButton + 0x09 => ClickWindow + 0x0a => CloseWindow + 0x0b => PluginMessageServerbound + 0x0c => EditBook + 0x0d => QueryEntityNBT + 0x0e => UseEntity + 0x0f => KeepAliveServerbound_i64 + 0x10 => LockDifficulty + 0x11 => PlayerPosition + 0x12 => PlayerPositionLook + 0x13 => PlayerLook + 0x14 => Player + 0x15 => VehicleMove + 0x16 => SteerBoat + 0x17 => PickItem + 0x18 => CraftRecipeRequest + 0x19 => ClientAbilities + 0x1a => PlayerDigging + 0x1b => PlayerAction + 0x1c => SteerVehicle + 0x1d => CraftingBookData + 0x1e => NameItem + 0x1f => ResourcePackStatus + 0x20 => AdvancementTab + 0x21 => SelectTrade + 0x22 => SetBeaconEffect + 0x23 => HeldItemChange + 0x24 => UpdateCommandBlock + 0x25 => UpdateCommandBlockMinecart + 0x26 => CreativeInventoryAction + 0x27 => UpdateJigsawBlock + 0x28 => UpdateStructureBlock + 0x29 => SetSign + 0x2a => ArmSwing + 0x2b => SpectateTeleport + 0x2c => PlayerBlockPlacement_f32 + 0x2d => UseItem + } + clientbound Clientbound { + 0x00 => SpawnObject + 0x01 => SpawnExperienceOrb + 0x02 => SpawnGlobalEntity + 0x03 => SpawnMob + 0x04 => SpawnPainting + 0x05 => SpawnPlayer_f64 + 0x06 => Animation + 0x07 => Statistics + 0x08 => BlockBreakAnimation + 0x09 => UpdateBlockEntity + 0x0a => BlockAction + 0x0b => BlockChange_VarInt + 0x0c => BossBar + 0x0d => ServerDifficulty_Locked + 0x0e => ServerMessage + 0x0f => MultiBlockChange_VarInt + 0x10 => TabCompleteReply + 0x11 => DeclareCommands + 0x12 => ConfirmTransaction + 0x13 => WindowClose + 0x14 => WindowItems + 0x15 => WindowProperty + 0x16 => WindowSetSlot + 0x17 => SetCooldown + 0x18 => PluginMessageClientbound + 0x19 => NamedSoundEffect + 0x1a => Disconnect + 0x1b => EntityAction + 0x1c => Explosion + 0x1d => ChunkUnload + 0x1e => ChangeGameState + 0x1f => WindowOpenHorse + 0x20 => KeepAliveClientbound_i64 + 0x21 => ChunkData_HeightMap + 0x22 => Effect + 0x23 => Particle_Data + 0x24 => UpdateLight + 0x25 => JoinGame_i32_ViewDistance + 0x26 => Maps + 0x27 => TradeList_WithRestock + 0x28 => EntityMove_i16 + 0x29 => EntityLookAndMove_i16 + 0x2a => EntityLook_VarInt + 0x2b => Entity + 0x2c => VehicleTeleport + 0x2d => OpenBook + 0x2e => WindowOpen_VarInt + 0x2f => SignEditorOpen + 0x30 => CraftRecipeResponse + 0x31 => PlayerAbilities + 0x32 => CombatEvent + 0x33 => PlayerInfo + 0x34 => FacePlayer + 0x35 => TeleportPlayer_WithConfirm + 0x36 => UnlockRecipes_WithSmelting + 0x37 => EntityDestroy + 0x38 => EntityRemoveEffect + 0x39 => ResourcePackSend + 0x3a => Respawn + 0x3b => EntityHeadLook + 0x3c => SelectAdvancementTab + 0x3d => WorldBorder + 0x3e => Camera + 0x3f => SetCurrentHotbarSlot + 0x40 => UpdateViewPosition + 0x41 => UpdateViewDistance + 0x42 => ScoreboardDisplay + 0x43 => EntityMetadata + 0x44 => EntityAttach + 0x45 => EntityVelocity + 0x46 => EntityEquipment + 0x47 => SetExperience + 0x48 => UpdateHealth + 0x49 => ScoreboardObjective + 0x4a => SetPassengers + 0x4b => Teams + 0x4c => UpdateScore + 0x4d => SpawnPosition + 0x4e => TimeUpdate + 0x4f => Title + 0x50 => EntitySoundEffect + 0x51 => SoundEffect + 0x52 => StopSound + 0x53 => PlayerListHeaderFooter + 0x54 => NBTQueryResponse + 0x55 => CollectItem + 0x56 => EntityTeleport_f64 + 0x57 => Advancements + 0x58 => EntityProperties + 0x59 => EntityEffect + 0x5a => DeclareRecipes + 0x5b => TagsWithEntities + 0x5c => AcknowledgePlayerDigging + } + } + login Login { + serverbound Serverbound { + 0x00 => LoginStart + 0x01 => EncryptionResponse + 0x02 => LoginPluginResponse + } + clientbound Clientbound { + 0x00 => LoginDisconnect + 0x01 => EncryptionRequest + 0x02 => LoginSuccess + 0x03 => SetInitialCompression + 0x04 => LoginPluginRequest + } + } + status Status { + serverbound Serverbound { + 0x00 => StatusRequest + 0x01 => StatusPing + } + clientbound Clientbound { + 0x00 => StatusResponse + 0x01 => StatusPong + } + } +); + +