diff --git a/MinecraftClient/Mapping/EntityMetaDataType.cs b/MinecraftClient/Mapping/EntityMetaDataType.cs
index db24f77b..53afecfa 100644
--- a/MinecraftClient/Mapping/EntityMetaDataType.cs
+++ b/MinecraftClient/Mapping/EntityMetaDataType.cs
@@ -36,6 +36,10 @@ public enum EntityMetaDataType
Nbt,
Particle,
///
+ /// List of Particle (1.20.6+)
+ ///
+ Particles,
+ ///
/// VarInt x3
///
VillagerData,
@@ -48,6 +52,10 @@ public enum EntityMetaDataType
/// VarInt
///
CatVariant,
+ ///
+ /// VarInt (1.20.6+)
+ ///
+ WolfVariant,
FrogVariant,
///
/// String + Position
@@ -66,6 +74,10 @@ public enum EntityMetaDataType
///
SnifferState,
///
+ /// VarInt (1.20.6+)
+ ///
+ ArmadilloState,
+ ///
/// Float x3
///
Vector3,
diff --git a/MinecraftClient/Mapping/EntityMetadataPalette.cs b/MinecraftClient/Mapping/EntityMetadataPalette.cs
index db544f39..e7e5c978 100644
--- a/MinecraftClient/Mapping/EntityMetadataPalette.cs
+++ b/MinecraftClient/Mapping/EntityMetadataPalette.cs
@@ -22,7 +22,8 @@ public abstract class EntityMetadataPalette
<= Protocol18Handler.MC_1_12_2_Version => new EntityMetadataPalette1122(), // 1.9 - 1.12.2
<= Protocol18Handler.MC_1_19_2_Version => new EntityMetadataPalette1191(), // 1.13 - 1.19.2
<= Protocol18Handler.MC_1_19_3_Version => new EntityMetadataPalette1193(), // 1.19.3
- <= Protocol18Handler.MC_1_21_Version => new EntityMetadataPalette1194(), // 1.19.4 - 1.21 +
+ < Protocol18Handler.MC_1_20_6_Version => new EntityMetadataPalette1194(), // 1.19.4 - 1.20.4
+ <= Protocol18Handler.MC_1_21_Version => new EntityMetadataPalette1206(), // 1.20.6 - 1.21
_ => throw new NotImplementedException()
};
}
diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs
new file mode 100644
index 00000000..67b61cc3
--- /dev/null
+++ b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+
+namespace MinecraftClient.Mapping.EntityMetadataPalettes;
+
+///
+/// For 1.20.6+
+/// Added PARTICLES (id 18), WOLF_VARIANT (id 23), ARMADILLO_STATE (id 28)
+/// compared to 1.19.4 palette.
+///
+public class EntityMetadataPalette1206 : EntityMetadataPalette
+{
+ private readonly Dictionary entityMetadataMappings = new()
+ {
+ { 0, EntityMetaDataType.Byte },
+ { 1, EntityMetaDataType.VarInt },
+ { 2, EntityMetaDataType.VarLong },
+ { 3, EntityMetaDataType.Float },
+ { 4, EntityMetaDataType.String },
+ { 5, EntityMetaDataType.Chat },
+ { 6, EntityMetaDataType.OptionalChat },
+ { 7, EntityMetaDataType.Slot },
+ { 8, EntityMetaDataType.Boolean },
+ { 9, EntityMetaDataType.Rotation },
+ { 10, EntityMetaDataType.Position },
+ { 11, EntityMetaDataType.OptionalPosition },
+ { 12, EntityMetaDataType.Direction },
+ { 13, EntityMetaDataType.OptionalUuid },
+ { 14, EntityMetaDataType.BlockId },
+ { 15, EntityMetaDataType.OptionalBlockId },
+ { 16, EntityMetaDataType.Nbt },
+ { 17, EntityMetaDataType.Particle },
+ { 18, EntityMetaDataType.Particles },
+ { 19, EntityMetaDataType.VillagerData },
+ { 20, EntityMetaDataType.OptionalVarInt },
+ { 21, EntityMetaDataType.Pose },
+ { 22, EntityMetaDataType.CatVariant },
+ { 23, EntityMetaDataType.WolfVariant },
+ { 24, EntityMetaDataType.FrogVariant },
+ { 25, EntityMetaDataType.OptionalGlobalPosition },
+ { 26, EntityMetaDataType.PaintingVariant },
+ { 27, EntityMetaDataType.SnifferState },
+ { 28, EntityMetaDataType.ArmadilloState },
+ { 29, EntityMetaDataType.Vector3 },
+ { 30, EntityMetaDataType.Quaternion },
+ };
+
+ public override Dictionary GetEntityMetadataMappingsList()
+ {
+ return entityMetadataMappings;
+ }
+}
diff --git a/MinecraftClient/Protocol/Handlers/DataTypes.cs b/MinecraftClient/Protocol/Handlers/DataTypes.cs
index d36ab257..271d98f8 100644
--- a/MinecraftClient/Protocol/Handlers/DataTypes.cs
+++ b/MinecraftClient/Protocol/Handlers/DataTypes.cs
@@ -842,9 +842,13 @@ namespace MinecraftClient.Protocol.Handlers
value = ReadNextNbt(cache);
break;
case EntityMetaDataType.Particle: // Particle
- // Skip data only, not used
ReadParticleData(cache, itemPalette);
break;
+ case EntityMetaDataType.Particles: // List of Particle (1.20.6+)
+ int particleCount = ReadNextVarInt(cache);
+ for (int i = 0; i < particleCount; i++)
+ ReadParticleData(cache, itemPalette);
+ break;
case EntityMetaDataType.VillagerData: // Villager Data (3x VarInt)
value = new List
{
@@ -869,7 +873,10 @@ namespace MinecraftClient.Protocol.Handlers
case EntityMetaDataType.CatVariant: // Cat Variant
value = ReadNextVarInt(cache);
break;
- case EntityMetaDataType.FrogVariant: // Frog Varint
+ case EntityMetaDataType.WolfVariant: // Wolf Variant (1.20.6+)
+ value = ReadNextVarInt(cache);
+ break;
+ case EntityMetaDataType.FrogVariant: // Frog Variant
value = ReadNextVarInt(cache);
break;
case EntityMetaDataType.GlobalPosition: // GlobalPos
@@ -892,6 +899,9 @@ namespace MinecraftClient.Protocol.Handlers
case EntityMetaDataType.SnifferState: // Sniffer state
value = ReadNextVarInt(cache);
break;
+ case EntityMetaDataType.ArmadilloState: // Armadillo state (1.20.6+)
+ value = ReadNextVarInt(cache);
+ break;
case EntityMetaDataType.Vector3: // Vector 3f
value = new List
{