From 3c0a1242b7a216ca82ad9b544403c590284b73da Mon Sep 17 00:00:00 2001 From: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com> Date: Mon, 17 Aug 2020 15:04:20 +0800 Subject: [PATCH] Implement MC version 1.16.2 basic support All packets ID update done Tested in 1.16.2 craftbukkit server --- .../Protocol/Handlers/Protocol18.cs | 17 +++- .../Handlers/Protocol18PacketTypes.cs | 86 ++++++++++++++++++- MinecraftClient/Protocol/ProtocolHandler.cs | 2 +- 3 files changed, 99 insertions(+), 6 deletions(-) diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 056f9c31..26268ca0 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -43,6 +43,7 @@ namespace MinecraftClient.Protocol.Handlers internal const int MC1152Version = 578; internal const int MC116Version = 735; internal const int MC1161Version = 736; + internal const int MC1162Version = 751; private int compression_treshold = 0; private bool autocomplete_received = false; @@ -233,6 +234,11 @@ namespace MinecraftClient.Protocol.Handlers handler.OnGameJoined(); int playerEntityID = dataTypes.ReadNextInt(packetData); handler.OnReceivePlayerEntityID(playerEntityID); + + // Is hardcore - Added in 1.16.2 + if (protocolversion >= MC1162Version) + dataTypes.ReadNextBool(packetData); + handler.OnGamemodeUpdate(Guid.Empty, dataTypes.ReadNextByte(packetData)); if (protocolversion >= MC116Version) @@ -247,8 +253,11 @@ namespace MinecraftClient.Protocol.Handlers //Current dimension - String identifier in 1.16, varInt below 1.16, byte below 1.9.1 if (protocolversion >= MC116Version) { + if (protocolversion >= MC1162Version) + dataTypes.ReadNextNbt(packetData); + else + dataTypes.ReadNextString(packetData); // TODO handle dimensions for 1.16+, needed for terrain handling - dataTypes.ReadNextString(packetData); this.currentDimension = 0; } else if (protocolversion >= MC191Version) @@ -263,7 +272,11 @@ namespace MinecraftClient.Protocol.Handlers if (protocolversion >= MC115Version) dataTypes.ReadNextLong(packetData); // Hashed world seed - 1.15 and above - dataTypes.ReadNextByte(packetData); // Max Players + + if (protocolversion >= MC1162Version) + dataTypes.ReadNextVarInt(packetData); // Max Players - 1.16.2 is VarInt + else + dataTypes.ReadNextByte(packetData); if (protocolversion < MC116Version) dataTypes.ReadNextString(packetData); // Level Type - 1.15 and below diff --git a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs index 3e3c4ca3..f1b9f75c 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs @@ -366,8 +366,10 @@ namespace MinecraftClient.Protocol.Handlers case 0x4D: return PacketIncomingType.UpdateScore; } - } else { - switch (packetID) // MC 1.16+ + } + else if (protocol <= Protocol18Handler.MC1161Version) + { + switch (packetID) // MC 1.16 and 1.16.1 { case 0x20: return PacketIncomingType.KeepAlive; case 0x25: return PacketIncomingType.JoinGame; @@ -413,6 +415,55 @@ namespace MinecraftClient.Protocol.Handlers case 0x4A: return PacketIncomingType.ScoreboardObjective; case 0x4D: return PacketIncomingType.UpdateScore; } + } + else + { + switch (packetID) // MC 1.16.2 + { + case 0x1F: return PacketIncomingType.KeepAlive; + case 0x24: return PacketIncomingType.JoinGame; + case 0x0E: return PacketIncomingType.ChatMessage; + case 0x39: return PacketIncomingType.Respawn; + case 0x35: return PacketIncomingType.PlayerPositionAndLook; + case 0x20: return PacketIncomingType.ChunkData; + case 0x3B: return PacketIncomingType.MultiBlockChange; + case 0x0B: return PacketIncomingType.BlockChange; + // MapChunkBulk does not exist since 1.9 + case 0x1C: return PacketIncomingType.UnloadChunk; + case 0x32: return PacketIncomingType.PlayerListUpdate; + case 0x0F: return PacketIncomingType.TabCompleteResult; + case 0x17: return PacketIncomingType.PluginMessage; + case 0x19: return PacketIncomingType.KickPacket; + // NetworkCompressionTreshold does not exist since 1.9 + case 0x38: return PacketIncomingType.ResourcePackSend; + case 0x12: return PacketIncomingType.CloseWindow; + case 0x2D: return PacketIncomingType.OpenWindow; + case 0x13: return PacketIncomingType.WindowItems; + case 0x11: return PacketIncomingType.WindowConfirmation; + case 0x15: return PacketIncomingType.SetSlot; + case 0x00: return PacketIncomingType.SpawnEntity; + case 0x02: return PacketIncomingType.SpawnLivingEntity; + case 0x04: return PacketIncomingType.SpawnPlayer; + case 0x36: return PacketIncomingType.DestroyEntities; + case 0x16: return PacketIncomingType.SetCooldown; + case 0x27: return PacketIncomingType.EntityPosition; + case 0x28: return PacketIncomingType.EntityPositionAndRotation; + case 0x58: return PacketIncomingType.EntityProperties; + case 0x56: return PacketIncomingType.EntityTeleport; + case 0x46: return PacketIncomingType.EntityVelocity; + case 0x47: return PacketIncomingType.EntityEquipment; + case 0x59: return PacketIncomingType.EntityEffect; + case 0x44: return PacketIncomingType.EntityMetadata; + case 0x4E: return PacketIncomingType.TimeUpdate; + case 0x49: return PacketIncomingType.UpdateHealth; + case 0x48: return PacketIncomingType.SetExperience; + case 0x3F: return PacketIncomingType.HeldItemChange; + case 0x1B: return PacketIncomingType.Explosion; + case 0x25: return PacketIncomingType.MapData; + case 0x4F: return PacketIncomingType.Title; + case 0x4A: return PacketIncomingType.ScoreboardObjective; + case 0x4D: return PacketIncomingType.UpdateScore; + } } return PacketIncomingType.UnknownPacket; @@ -606,7 +657,7 @@ namespace MinecraftClient.Protocol.Handlers case PacketOutgoingType.UpdateCommandBlock: return 0x24; } } - else + else if (protocol <= Protocol18Handler.MC1161Version) // MC 1.16 and 1.16.1 { switch (packet) { @@ -635,6 +686,35 @@ namespace MinecraftClient.Protocol.Handlers case PacketOutgoingType.UpdateCommandBlock: return 0x25; } } + else + { + switch (packet) + { + case PacketOutgoingType.KeepAlive: return 0x10; + case PacketOutgoingType.ResourcePackStatus: return 0x21; + case PacketOutgoingType.ChatMessage: return 0x03; + case PacketOutgoingType.ClientStatus: return 0x04; + case PacketOutgoingType.ClientSettings: return 0x05; + case PacketOutgoingType.PluginMessage: return 0x0B; + case PacketOutgoingType.TabComplete: return 0x06; + case PacketOutgoingType.EntityAction: return 0x1C; + case PacketOutgoingType.PlayerPosition: return 0x12; + case PacketOutgoingType.PlayerPositionAndLook: return 0x13; + case PacketOutgoingType.TeleportConfirm: return 0x00; + case PacketOutgoingType.HeldItemChange: return 0x25; + case PacketOutgoingType.InteractEntity: return 0x0E; + case PacketOutgoingType.UseItem: return 0x2F; + case PacketOutgoingType.ClickWindow: return 0x09; + case PacketOutgoingType.CloseWindow: return 0x0A; + case PacketOutgoingType.WindowConfirmation: return 0x07; + case PacketOutgoingType.PlayerBlockPlacement: return 0x2E; + case PacketOutgoingType.CreativeInventoryAction: return 0x28; + case PacketOutgoingType.Animation: return 0x2C; + case PacketOutgoingType.PlayerDigging: return 0x1B; + case PacketOutgoingType.UpdateSign: return 0x2B; + case PacketOutgoingType.UpdateCommandBlock: return 0x26; + } + } throw new System.ComponentModel.InvalidEnumArgumentException("Unknown PacketOutgoingType (protocol=" + protocol + ")", (int)packet, typeof(PacketOutgoingType)); } diff --git a/MinecraftClient/Protocol/ProtocolHandler.cs b/MinecraftClient/Protocol/ProtocolHandler.cs index fbe4f782..b4ffac8d 100644 --- a/MinecraftClient/Protocol/ProtocolHandler.cs +++ b/MinecraftClient/Protocol/ProtocolHandler.cs @@ -126,7 +126,7 @@ namespace MinecraftClient.Protocol int[] supportedVersions_Protocol16 = { 51, 60, 61, 72, 73, 74, 78 }; if (Array.IndexOf(supportedVersions_Protocol16, ProtocolVersion) > -1) return new Protocol16Handler(Client, ProtocolVersion, Handler); - int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736}; + int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751}; if (Array.IndexOf(supportedVersions_Protocol18, ProtocolVersion) > -1) return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo); throw new NotSupportedException("The protocol version no." + ProtocolVersion + " is not supported.");