From 7624b892920a337d7a02704fab3a1a6bc7a4f757 Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 26 Jan 2019 13:39:25 -0800 Subject: [PATCH] Add 1.13.2+ protocol parsing Particle packet variant. Fixes #104 Pre-1.13.2 particle packet: https://wiki.vg/index.php?title=Protocol&oldid=14204#Particle_2 1.13.2 and later: https://wiki.vg/Protocol#Particle_2 + https://wiki.vg/Protocol#Particle Split into Particle_Data (1.13.2+) and Particle_VarIntArray (pre-1.13.2) Fixes crash when landing when dropping from creative flight, among other crashes when a particle packet is sent. --- src/protocol/packet.rs | 24 +++++++++++++++++++++--- src/protocol/versions/v15w39c.rs | 2 +- src/protocol/versions/v18w50a.rs | 2 +- src/protocol/versions/v19w02a.rs | 2 +- src/protocol/versions/v1_10_2.rs | 2 +- src/protocol/versions/v1_11_2.rs | 2 +- src/protocol/versions/v1_12_2.rs | 2 +- src/protocol/versions/v1_13_2.rs | 2 +- src/protocol/versions/v1_8_9.rs | 2 +- src/protocol/versions/v1_9.rs | 2 +- src/protocol/versions/v1_9_2.rs | 2 +- 11 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/protocol/packet.rs b/src/protocol/packet.rs index 2e5576b..90dc89f 100644 --- a/src/protocol/packet.rs +++ b/src/protocol/packet.rs @@ -1010,7 +1010,7 @@ state_packets!( } /// Particle spawns particles at the target location with the various /// modifiers. - packet Particle { + packet Particle_Data { field particle_id: i32 =, field long_distance: bool =, field x: f32 =, @@ -1021,8 +1021,26 @@ state_packets!( field offset_z: f32 =, field speed: f32 =, field count: i32 =, - field data1: VarInt = when(|p: &Particle| p.particle_id == 36 || p.particle_id == 37 || p.particle_id == 38 || p.particle_id == 46), - field data2: VarInt = when(|p: &Particle| p.particle_id == 36), + field block_state: VarInt = when(|p: &Particle_Data| p.particle_id == 3 || p.particle_id == 20), + field red: f32 = when(|p: &Particle_Data| p.particle_id == 11), + field green: f32 = when(|p: &Particle_Data| p.particle_id == 11), + field blue: f32 = when(|p: &Particle_Data| p.particle_id == 11), + field scale: f32 = when(|p: &Particle_Data| p.particle_id == 11), + field item: Option = when(|p: &Particle_Data| p.particle_id == 27), + } + packet Particle_VarIntArray { + field particle_id: i32 =, + field long_distance: bool =, + field x: f32 =, + field y: f32 =, + field z: f32 =, + field offset_x: f32 =, + field offset_y: f32 =, + field offset_z: f32 =, + field speed: f32 =, + field count: i32 =, + field data1: VarInt = when(|p: &Particle_VarIntArray| p.particle_id == 36 || p.particle_id == 37 || p.particle_id == 38 || p.particle_id == 46), + field data2: VarInt = when(|p: &Particle_VarIntArray| p.particle_id == 36), } packet Particle_Named { field particle_id: String =, diff --git a/src/protocol/versions/v15w39c.rs b/src/protocol/versions/v15w39c.rs index edf5c71..f78c0bd 100644 --- a/src/protocol/versions/v15w39c.rs +++ b/src/protocol/versions/v15w39c.rs @@ -71,7 +71,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_VarInt 0x20 => ChunkData_NoEntities 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => NamedSoundEffect_u8_NoCategory 0x24 => JoinGame_i8 0x25 => Maps diff --git a/src/protocol/versions/v18w50a.rs b/src/protocol/versions/v18w50a.rs index 836353e..93e4628 100644 --- a/src/protocol/versions/v18w50a.rs +++ b/src/protocol/versions/v18w50a.rs @@ -89,7 +89,7 @@ protocol_packet_ids!( 0x21 => KeepAliveClientbound_i64 0x22 => ChunkData_HeightMap 0x23 => Effect - 0x24 => Particle + 0x24 => Particle_VarIntArray 0x25 => JoinGame_i32 0x26 => Maps 0x27 => Entity diff --git a/src/protocol/versions/v19w02a.rs b/src/protocol/versions/v19w02a.rs index edbce6a..e8259c2 100644 --- a/src/protocol/versions/v19w02a.rs +++ b/src/protocol/versions/v19w02a.rs @@ -89,7 +89,7 @@ protocol_packet_ids!( 0x21 => KeepAliveClientbound_i64 0x22 => ChunkData_HeightMap 0x23 => Effect - 0x24 => Particle + 0x24 => Particle_Data 0x25 => JoinGame_i32 0x26 => Maps 0x27 => Entity diff --git a/src/protocol/versions/v1_10_2.rs b/src/protocol/versions/v1_10_2.rs index e5dc3fd..85dc83a 100644 --- a/src/protocol/versions/v1_10_2.rs +++ b/src/protocol/versions/v1_10_2.rs @@ -74,7 +74,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_VarInt 0x20 => ChunkData 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => JoinGame_i32 0x24 => Maps 0x25 => EntityMove_i16 diff --git a/src/protocol/versions/v1_11_2.rs b/src/protocol/versions/v1_11_2.rs index 1f09b13..3db3c06 100644 --- a/src/protocol/versions/v1_11_2.rs +++ b/src/protocol/versions/v1_11_2.rs @@ -74,7 +74,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_VarInt 0x20 => ChunkData 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => JoinGame_i32 0x24 => Maps 0x25 => EntityMove_i16 diff --git a/src/protocol/versions/v1_12_2.rs b/src/protocol/versions/v1_12_2.rs index 7dc1454..ebd23a0 100644 --- a/src/protocol/versions/v1_12_2.rs +++ b/src/protocol/versions/v1_12_2.rs @@ -77,7 +77,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_i64 0x20 => ChunkData 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => JoinGame_i32 0x24 => Maps 0x25 => Entity diff --git a/src/protocol/versions/v1_13_2.rs b/src/protocol/versions/v1_13_2.rs index 3f3c9da..659ed85 100644 --- a/src/protocol/versions/v1_13_2.rs +++ b/src/protocol/versions/v1_13_2.rs @@ -89,7 +89,7 @@ protocol_packet_ids!( 0x21 => KeepAliveClientbound_i64 0x22 => ChunkData 0x23 => Effect - 0x24 => Particle + 0x24 => Particle_Data 0x25 => JoinGame_i32 0x26 => Maps 0x27 => Entity diff --git a/src/protocol/versions/v1_8_9.rs b/src/protocol/versions/v1_8_9.rs index b8e531e..6dc9682 100644 --- a/src/protocol/versions/v1_8_9.rs +++ b/src/protocol/versions/v1_8_9.rs @@ -78,7 +78,7 @@ protocol_packet_ids!( 0x27 => Explosion 0x28 => Effect 0x29 => NamedSoundEffect_u8_NoCategory - 0x2a => Particle + 0x2a => Particle_VarIntArray 0x2b => ChangeGameState 0x2c => SpawnGlobalEntity_i32 0x2d => WindowOpen diff --git a/src/protocol/versions/v1_9.rs b/src/protocol/versions/v1_9.rs index 2b598b3..9ce2b03 100644 --- a/src/protocol/versions/v1_9.rs +++ b/src/protocol/versions/v1_9.rs @@ -74,7 +74,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_VarInt 0x20 => ChunkData_NoEntities 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => JoinGame_i8 0x24 => Maps 0x25 => EntityMove_i16 diff --git a/src/protocol/versions/v1_9_2.rs b/src/protocol/versions/v1_9_2.rs index 6fc799d..4aec3d0 100644 --- a/src/protocol/versions/v1_9_2.rs +++ b/src/protocol/versions/v1_9_2.rs @@ -74,7 +74,7 @@ protocol_packet_ids!( 0x1f => KeepAliveClientbound_VarInt 0x20 => ChunkData_NoEntities 0x21 => Effect - 0x22 => Particle + 0x22 => Particle_VarIntArray 0x23 => JoinGame_i32 0x24 => Maps 0x25 => EntityMove_i16