From 599227aef2ac1e5a0e2ff2331dea93405fa1a865 Mon Sep 17 00:00:00 2001 From: iceiix <43691553+iceiix@users.noreply.github.com> Date: Mon, 13 May 2019 16:44:31 -0700 Subject: [PATCH] 1.14.1 protocol support (480) (#151) * Copy v1_14_1 from v1_14 * Add protocol 1.14.1 (480) * Update readme * 0x08 serverbound is now ClickWindowButton https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14764#Click_Window_Button --- README.md | 6 +- src/protocol/mod.rs | 2 +- src/protocol/packet.rs | 5 + src/protocol/versions.rs | 3 + src/protocol/versions/v1_14.rs | 3 +- src/protocol/versions/v1_14_1.rs | 179 +++++++++++++++++++++++++++++++ 6 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 src/protocol/versions/v1_14_1.rs diff --git a/README.md b/README.md index de56e7b..3e675c1 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ Join with your favorite IRC client or [Matrix](https://matrix.to/#/#_espernet_#s | Game version | Protocol version | Supported? | | ------ | --- | --- | +| 1.14.1 | 480 | ✓ | +| 1.14.1 | 477 | ✓ | | 1.14 | 477 | ✓ | | 19w02a | 452 | ✓ | | 18w50a | 451 | ✓ | @@ -35,13 +37,15 @@ Join with your favorite IRC client or [Matrix](https://matrix.to/#/#_espernet_#s | 1.9 | 107 | ✓ | | 15w39c | 74 | ✓ | | 1.8.9 | 47 | ✓ | -| 1.7.10 + Forge | 5 | ✓ | +| 1.7.10 | 5 | ✓ | Stevenarella is designed to support multiple protocol versions, so that client development is not in lock-step with the server version. The level of support varies, but the goal is to support major versions from 1.7.10 up to the current latest major version. Occasionally, snapshots are also supported. +Forge servers are currently supported on 1.7.10 - 1.12.2. + Support for older protocols will _not_ be dropped as newer protocols are added. ## Credits diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 3f1ee80..fa500b8 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -39,7 +39,7 @@ use flate2::Compression; use std::time::{Instant, Duration}; use crate::shared::Position; -pub const SUPPORTED_PROTOCOLS: [i32; 13] = [477, 452, 451, 404, 340, 316, 315, 210, 109, 107, 74, 47, 5]; +pub const SUPPORTED_PROTOCOLS: [i32; 14] = [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 6fb57e9..6087ed6 100644 --- a/src/protocol/packet.rs +++ b/src/protocol/packet.rs @@ -131,6 +131,11 @@ state_packets!( field id: u8 =, field enchantment: u8 =, } + /// ClickWindowButton is used for clicking an enchantment, lectern, stonecutter, or loom. + packet ClickWindowButton { + field id: u8 =, + field button: u8 =, + } /// ClickWindow is sent when the client clicks in a window. packet ClickWindow { field id: u8 =, diff --git a/src/protocol/versions.rs b/src/protocol/versions.rs index 2131f21..554ce88 100644 --- a/src/protocol/versions.rs +++ b/src/protocol/versions.rs @@ -1,5 +1,6 @@ use crate::protocol::*; +mod v1_14_1; mod v1_14; mod v19w02a; mod v18w50a; @@ -19,6 +20,7 @@ mod v1_7_10; pub fn protocol_name_to_protocol_version(s: String) -> i32 { match s.as_ref() { "" => SUPPORTED_PROTOCOLS[0], + "1.14.1" => 480, "1.14" => 477, "19w02a" => 452, "18w50a" => 451, @@ -44,6 +46,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 { + 480 => v1_14_1::translate_internal_packet_id(state, dir, id, to_internal), 477 => v1_14::translate_internal_packet_id(state, dir, id, to_internal), 452 => v19w02a::translate_internal_packet_id(state, dir, id, to_internal), 451 => v18w50a::translate_internal_packet_id(state, dir, id, to_internal), diff --git a/src/protocol/versions/v1_14.rs b/src/protocol/versions/v1_14.rs index 7949206..d30f36a 100644 --- a/src/protocol/versions/v1_14.rs +++ b/src/protocol/versions/v1_14.rs @@ -16,8 +16,7 @@ protocol_packet_ids!( 0x05 => ClientSettings 0x06 => TabComplete 0x07 => ConfirmTransactionServerbound - //0x08 => EnchantItem - //0x08 => ClickWindowButton + 0x08 => ClickWindowButton 0x09 => ClickWindow 0x0a => CloseWindow 0x0b => PluginMessageServerbound diff --git a/src/protocol/versions/v1_14_1.rs b/src/protocol/versions/v1_14_1.rs new file mode 100644 index 0000000..d30f36a --- /dev/null +++ b/src/protocol/versions/v1_14_1.rs @@ -0,0 +1,179 @@ +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 + 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 + } + } + 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 + } + } +); + +