From 8ce5c40b287df73109e226efac12a3f00337c86c Mon Sep 17 00:00:00 2001 From: BruceChen Date: Wed, 7 Sep 2022 00:02:09 +0800 Subject: [PATCH] Another fix for #2159 --- MinecraftClient/Mapping/World.cs | 21 +++++++++++++---- .../Protocol/Handlers/Protocol18.cs | 23 +++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/MinecraftClient/Mapping/World.cs b/MinecraftClient/Mapping/World.cs index 63ecb0c4..eea24e59 100644 --- a/MinecraftClient/Mapping/World.cs +++ b/MinecraftClient/Mapping/World.cs @@ -21,9 +21,9 @@ namespace MinecraftClient.Mapping /// /// The dimension info of the world /// - private static Dimension curDimension = new Dimension(); + private static Dimension curDimension = new(); - private static Dictionary? dimensionList = null; + private static Dictionary dimensionList = new(); /// /// Chunk data parsing progress @@ -61,16 +61,29 @@ namespace MinecraftClient.Mapping /// Registry Codec nbt data public static void StoreDimensionList(Dictionary registryCodec) { - dimensionList = new(); var dimensionListNbt = (object[])(((Dictionary)registryCodec["minecraft:dimension_type"])["value"]); foreach (Dictionary dimensionNbt in dimensionListNbt) { string dimensionName = (string)dimensionNbt["name"]; Dictionary element = (Dictionary)dimensionNbt["element"]; + if (dimensionList.ContainsKey(dimensionName)) + dimensionList.Remove(dimensionName); dimensionList.Add(dimensionName, new Dimension(dimensionName, element)); } } + /// + /// Store one dimension - 1.16.2 to 1.18.2 + /// + /// Dimension name + /// Dimension Type nbt data + public static void StoreDimension(string dimensionName, Dictionary dimensionType) + { + if (dimensionList.ContainsKey(dimensionName)) + dimensionList.Remove(dimensionName); + dimensionList.Add(dimensionName, new Dimension(dimensionName, dimensionType)); + } + /// /// Set current dimension - 1.16 and above @@ -79,7 +92,7 @@ namespace MinecraftClient.Mapping /// The dimension type (NBT Tag Compound) public static void SetDimension(string name) { - curDimension = dimensionList![name]; // Should not fail + curDimension = dimensionList[name]; // Should not fail } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index d05cf455..f60b62f4 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -371,7 +371,8 @@ namespace MinecraftClient.Protocol.Handlers for (int i = 0; i < worldCount; i++) dataTypes.ReadNextString(packetData); // Dimension Names (World Names) - 1.16 and above var registryCodec = dataTypes.ReadNextNbt(packetData); // Registry Codec (Dimension Codec) - 1.16 and above - World.StoreDimensionList(registryCodec); + if (handler.GetTerrainEnabled()) + World.StoreDimensionList(registryCodec); } // Current dimension @@ -380,12 +381,13 @@ namespace MinecraftClient.Protocol.Handlers // String identifier: 1.16 and 1.16.1 // varInt: [1.9.1 to 1.15.2] // byte: below 1.9.1 + Dictionary? dimensionType = null; if (protocolVersion >= MC_1_16_Version) { if (protocolVersion >= MC_1_19_Version) dataTypes.ReadNextString(packetData); // Dimension Type: Identifier else if (protocolVersion >= MC_1_16_2_Version) - dataTypes.ReadNextNbt(packetData); // Dimension Type: NBT Tag Compound + dimensionType = dataTypes.ReadNextNbt(packetData); // Dimension Type: NBT Tag Compound else dataTypes.ReadNextString(packetData); this.currentDimension = 0; @@ -401,7 +403,12 @@ namespace MinecraftClient.Protocol.Handlers if (protocolVersion >= MC_1_16_Version) { string dimensionName = dataTypes.ReadNextString(packetData); // Dimension Name (World Name) - 1.16 and above - World.SetDimension(dimensionName); + if (handler.GetTerrainEnabled()) + { + if (protocolVersion >= MC_1_16_2_Version && protocolVersion < MC_1_19_Version) + World.StoreDimension(dimensionName, dimensionType!); + World.SetDimension(dimensionName); + } } if (protocolVersion >= MC_1_15_Version) @@ -594,12 +601,13 @@ namespace MinecraftClient.Protocol.Handlers } break; case PacketTypesIn.Respawn: + Dictionary? dimensionTypeRespawn = null; if (protocolVersion >= MC_1_16_Version) { if (protocolVersion >= MC_1_19_Version) dataTypes.ReadNextString(packetData); // Dimension Type: Identifier else if (protocolVersion >= MC_1_16_2_Version) - dataTypes.ReadNextNbt(packetData); // Dimension Type: NBT Tag Compound + dimensionTypeRespawn = dataTypes.ReadNextNbt(packetData); // Dimension Type: NBT Tag Compound else dataTypes.ReadNextString(packetData); this.currentDimension = 0; @@ -612,7 +620,12 @@ namespace MinecraftClient.Protocol.Handlers if (protocolVersion >= MC_1_16_Version) { string dimensionName = dataTypes.ReadNextString(packetData); // Dimension Name (World Name) - 1.16 and above - World.SetDimension(dimensionName); + if (handler.GetTerrainEnabled()) + { + if (protocolVersion >= MC_1_16_2_Version && protocolVersion < MC_1_19_Version) + World.StoreDimension(dimensionName, dimensionTypeRespawn!); + World.SetDimension(dimensionName); + } } if (protocolVersion < MC_1_14_Version)