From 21cd24e056c934e5c5575733343489b57d536c68 Mon Sep 17 00:00:00 2001 From: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:22:50 +0800 Subject: [PATCH] Implement 1.8 Entity MetaData --- MinecraftClient/Mapping/EntityMetaDataType.cs | 3 ++ .../Mapping/EntityMetadataPalette.cs | 4 +- .../EntityMetadataPalette18.cs | 24 ++++++++++ .../EntityMetadataPalette19.cs | 31 ------------- .../Protocol/Handlers/DataTypes.cs | 45 ++++++++++++++++--- 5 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs delete mode 100644 MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette19.cs diff --git a/MinecraftClient/Mapping/EntityMetaDataType.cs b/MinecraftClient/Mapping/EntityMetaDataType.cs index e435c40d..db24f77b 100644 --- a/MinecraftClient/Mapping/EntityMetaDataType.cs +++ b/MinecraftClient/Mapping/EntityMetaDataType.cs @@ -3,6 +3,9 @@ namespace MinecraftClient.Mapping; public enum EntityMetaDataType { Byte, + Short, // 1.8 only + Int, // 1.8 only + Vector3Int, // 1.8 only (not used by the game) VarInt, VarLong, Float, diff --git a/MinecraftClient/Mapping/EntityMetadataPalette.cs b/MinecraftClient/Mapping/EntityMetadataPalette.cs index bcb0b52a..9759921f 100644 --- a/MinecraftClient/Mapping/EntityMetadataPalette.cs +++ b/MinecraftClient/Mapping/EntityMetadataPalette.cs @@ -16,8 +16,8 @@ public abstract class EntityMetadataPalette public static EntityMetadataPalette GetPalette(int protocolVersion) { - if (protocolVersion < Protocol18Handler.MC_1_9_Version) - throw new NotImplementedException(); + if (protocolVersion <= Protocol18Handler.MC_1_8_Version) + return new EntityMetadataPalette18(); // 1.8 else if (protocolVersion <= Protocol18Handler.MC_1_12_2_Version) return new EntityMetadataPalette1122(); // 1.9 - 1.12.2 else if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version) diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs new file mode 100644 index 00000000..c862092c --- /dev/null +++ b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace MinecraftClient.Mapping.EntityMetadataPalettes; + +public class EntityMetadataPalette18 : EntityMetadataPalette +{ + // 1.8 : https://wiki.vg/index.php?title=Entity_metadata&oldid=6220 + private readonly Dictionary entityMetadataMappings = new() + { + { 0, EntityMetaDataType.Byte }, + { 1, EntityMetaDataType.Short }, + { 2, EntityMetaDataType.Int }, + { 3, EntityMetaDataType.Float }, + { 4, EntityMetaDataType.String }, + { 5, EntityMetaDataType.Slot }, + { 6, EntityMetaDataType.Vector3Int }, + { 7, EntityMetaDataType.Rotation } + }; + + public override Dictionary GetEntityMetadataMappingsList() + { + return entityMetadataMappings; + } +} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette19.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette19.cs deleted file mode 100644 index 39cd4963..00000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette19.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -// TODO: Use this for 1.8 -public class EntityMetadataPalette19 : EntityMetadataPalette -{ - // 1.8 : https://wiki.vg/index.php?title=Entity_metadata&oldid=6220 (Requires a different algorithm) - // 1.9 : https://wiki.vg/index.php?title=Entity_metadata&oldid=7416 - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.Float }, - { 3, EntityMetaDataType.String }, - { 4, EntityMetaDataType.Chat }, - { 5, EntityMetaDataType.Slot }, - { 6, EntityMetaDataType.Boolean }, - { 7, EntityMetaDataType.Vector3 }, - { 8, EntityMetaDataType.Position }, - { 9, EntityMetaDataType.OptionalPosition }, - { 10, EntityMetaDataType.Direction }, - { 11, EntityMetaDataType.OptionalUuid }, - { 12, EntityMetaDataType.OptionalBlockId } - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/DataTypes.cs b/MinecraftClient/Protocol/Handlers/DataTypes.cs index 1300b1eb..4f188192 100644 --- a/MinecraftClient/Protocol/Handlers/DataTypes.cs +++ b/MinecraftClient/Protocol/Handlers/DataTypes.cs @@ -599,18 +599,31 @@ namespace MinecraftClient.Protocol.Handlers } } - //TODO: Refactor this to use new Entity Metadata Palettes + /// + /// Read a Entity MetaData and remove it from the cache + /// + /// + /// + /// + /// + /// + /// public Dictionary ReadNextMetadata(Queue cache, ItemPalette itemPalette, EntityMetadataPalette metadataPalette) { - if (protocolversion <= Protocol18Handler.MC_1_8_Version) - throw new NotImplementedException(); // Require sepcial implementation - Dictionary data = new(); byte key = ReadNextByte(cache); + byte terminteValue = protocolversion <= Protocol18Handler.MC_1_8_Version + ? (byte)0x7f // 1.8 (https://wiki.vg/index.php?title=Entity_metadata&oldid=6220#Entity_Metadata_Format) + : (byte)0xff; // 1.9+ - while (key != 0xff) + while (key != terminteValue) { - int typeId = ReadNextVarInt(cache); + if (protocolversion <= Protocol18Handler.MC_1_8_Version) + key = (byte)(key & 0x1f); + + int typeId = protocolversion <= Protocol18Handler.MC_1_8_Version + ? key >> 5 // 1.8 + : ReadNextVarInt(cache); // 1.9+ EntityMetaDataType type; try { @@ -626,6 +639,20 @@ namespace MinecraftClient.Protocol.Handlers switch (type) { + case EntityMetaDataType.Short: // 1.8 only + value = ReadNextShort(cache); + break; + case EntityMetaDataType.Int: // 1.8 only + value = ReadNextInt(cache); + break; + case EntityMetaDataType.Vector3Int: // 1.8 only + value = new List() + { + ReadNextInt(cache), + ReadNextInt(cache), + ReadNextInt(cache), + }; + break; case EntityMetaDataType.Byte: // byte value = ReadNextByte(cache); break; @@ -760,7 +787,11 @@ namespace MinecraftClient.Protocol.Handlers return data; } - // Currently not handled. Reading data only + /// + /// Currently not handled. Reading data only + /// + /// + /// protected void ReadParticleData(Queue cache, ItemPalette itemPalette) { if (protocolversion < Protocol18Handler.MC_1_13_Version)