diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index 86682d0d..5e8061de 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -207,6 +207,7 @@ + diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs index 5094883d..7e43614f 100644 --- a/MinecraftClient/Program.cs +++ b/MinecraftClient/Program.cs @@ -32,7 +32,7 @@ namespace MinecraftClient public const string Version = MCHighestVersion; public const string MCLowestVersion = "1.4.6"; - public const string MCHighestVersion = "1.16.5"; + public const string MCHighestVersion = "1.17"; public static readonly string BuildInfo = null; private static Thread offlinePrompt = null; diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs new file mode 100644 index 00000000..c14e86b8 --- /dev/null +++ b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs @@ -0,0 +1,176 @@ +using System.Collections.Generic; + +namespace MinecraftClient.Protocol.Handlers.PacketPalettes +{ + public class PacketPalette117 : PacketTypePalette + { + private Dictionary typeIn = new Dictionary() + { + { 0x00, PacketTypesIn.SpawnEntity }, + { 0x01, PacketTypesIn.SpawnExperienceOrb }, + { 0x02, PacketTypesIn.SpawnLivingEntity }, + { 0x03, PacketTypesIn.SpawnPainting }, + { 0x04, PacketTypesIn.SpawnPlayer }, + { 0x05, PacketTypesIn.SkulkVibrationSignal }, + { 0x06, PacketTypesIn.EntityAnimation }, + { 0x07, PacketTypesIn.Statistics }, + { 0x08, PacketTypesIn.AcknowledgePlayerDigging }, + { 0x09, PacketTypesIn.BlockBreakAnimation }, + { 0x0A, PacketTypesIn.BlockEntityData }, + { 0x0B, PacketTypesIn.BlockAction }, + { 0x0C, PacketTypesIn.BlockChange }, + { 0x0D, PacketTypesIn.BossBar }, + { 0x0E, PacketTypesIn.ServerDifficulty }, + { 0x0F, PacketTypesIn.ChatMessage }, + { 0x10, PacketTypesIn.ClearTiles }, + { 0x11, PacketTypesIn.TabComplete }, + { 0x12, PacketTypesIn.DeclareCommands }, + { 0x13, PacketTypesIn.CloseWindow }, + { 0x14, PacketTypesIn.WindowItems }, + { 0x15, PacketTypesIn.WindowProperty }, + { 0x16, PacketTypesIn.SetSlot }, + { 0x17, PacketTypesIn.SetCooldown }, + { 0x18, PacketTypesIn.PluginMessage }, + { 0x19, PacketTypesIn.NamedSoundEffect }, + { 0x1A, PacketTypesIn.Disconnect }, + { 0x1B, PacketTypesIn.EntityStatus }, + { 0x1C, PacketTypesIn.Explosion }, + { 0x1D, PacketTypesIn.UnloadChunk }, + { 0x1E, PacketTypesIn.ChangeGameState }, + { 0x1F, PacketTypesIn.OpenHorseWindow }, + { 0x20, PacketTypesIn.InitializeWorldBorder }, + { 0x21, PacketTypesIn.KeepAlive }, + { 0x22, PacketTypesIn.ChunkData }, + { 0x23, PacketTypesIn.Effect }, + { 0x24, PacketTypesIn.Particle }, + { 0x25, PacketTypesIn.UpdateLight }, + { 0x26, PacketTypesIn.JoinGame }, + { 0x27, PacketTypesIn.MapData }, + { 0x28, PacketTypesIn.TradeList }, + { 0x29, PacketTypesIn.EntityPosition }, + { 0x2A, PacketTypesIn.EntityPositionAndRotation }, + { 0x2B, PacketTypesIn.EntityRotation }, + { 0x2C, PacketTypesIn.VehicleMove }, + { 0x2D, PacketTypesIn.OpenBook }, + { 0x2E, PacketTypesIn.OpenWindow }, + { 0x2F, PacketTypesIn.OpenSignEditor }, + { 0x30, PacketTypesIn.Ping }, + { 0x31, PacketTypesIn.CraftRecipeResponse }, + { 0x32, PacketTypesIn.PlayerAbilities }, + { 0x33, PacketTypesIn.EndCombatEvent }, + { 0x34, PacketTypesIn.EnterCombatEvent }, + { 0x35, PacketTypesIn.DeathCombatEvent }, + { 0x36, PacketTypesIn.PlayerInfo }, + { 0x37, PacketTypesIn.FacePlayer }, + { 0x38, PacketTypesIn.PlayerPositionAndLook }, + { 0x39, PacketTypesIn.UnlockRecipes }, + { 0x3A, PacketTypesIn.DestroyEntity }, + { 0x3B, PacketTypesIn.RemoveEntityEffect }, + { 0x3C, PacketTypesIn.ResourcePackSend }, + { 0x3D, PacketTypesIn.Respawn }, + { 0x3E, PacketTypesIn.EntityHeadLook }, + { 0x3F, PacketTypesIn.MultiBlockChange }, + { 0x40, PacketTypesIn.SelectAdvancementTab }, + { 0x41, PacketTypesIn.ActionBar }, + { 0x42, PacketTypesIn.WorldBorderCenter }, + { 0x43, PacketTypesIn.WorldBorderLerpSize }, + { 0x44, PacketTypesIn.WorldBorderSize }, + { 0x45, PacketTypesIn.WorldBorderWarningDelay }, + { 0x46, PacketTypesIn.WorldBorderWarningReach }, + { 0x47, PacketTypesIn.Camera }, + { 0x48, PacketTypesIn.HeldItemChange }, + { 0x49, PacketTypesIn.UpdateViewPosition }, + { 0x4A, PacketTypesIn.UpdateViewDistance }, + { 0x4B, PacketTypesIn.SpawnPosition }, + { 0x4C, PacketTypesIn.DisplayScoreboard }, + { 0x4D, PacketTypesIn.EntityMetadata }, + { 0x4E, PacketTypesIn.AttachEntity }, + { 0x4F, PacketTypesIn.EntityVelocity }, + { 0x50, PacketTypesIn.EntityEquipment }, + { 0x51, PacketTypesIn.SetExperience }, + { 0x52, PacketTypesIn.UpdateHealth }, + { 0x53, PacketTypesIn.ScoreboardObjective }, + { 0x54, PacketTypesIn.SetPassengers }, + { 0x55, PacketTypesIn.Teams }, + { 0x56, PacketTypesIn.UpdateScore }, + { 0x57, PacketTypesIn.SetTitleSubTitle }, + { 0x58, PacketTypesIn.TimeUpdate }, + { 0x59, PacketTypesIn.SetTitleText }, + { 0x5A, PacketTypesIn.SetTitleTime }, + { 0x5B, PacketTypesIn.EntitySoundEffect }, + { 0x5C, PacketTypesIn.SoundEffect }, + { 0x5D, PacketTypesIn.StopSound }, + { 0x5E, PacketTypesIn.PlayerListHeaderAndFooter }, + { 0x5F, PacketTypesIn.NBTQueryResponse }, + { 0x60, PacketTypesIn.CollectItem }, + { 0x61, PacketTypesIn.EntityTeleport }, + { 0x62, PacketTypesIn.Advancements }, + { 0x63, PacketTypesIn.EntityProperties }, + { 0x64, PacketTypesIn.EntityEffect }, + { 0x65, PacketTypesIn.DeclareRecipes }, + { 0x66, PacketTypesIn.Tags }, + }; + + private Dictionary typeOut = new Dictionary() + { + { 0x00, PacketTypesOut.TeleportConfirm }, + { 0x01, PacketTypesOut.QueryBlockNBT }, + { 0x02, PacketTypesOut.SetDifficulty }, + { 0x03, PacketTypesOut.ChatMessage }, + { 0x04, PacketTypesOut.ClientStatus }, + { 0x05, PacketTypesOut.ClientSettings }, + { 0x06, PacketTypesOut.TabComplete }, + { 0x07, PacketTypesOut.ClickWindowButton }, + { 0x08, PacketTypesOut.ClickWindow }, + { 0x09, PacketTypesOut.CloseWindow }, + { 0x0A, PacketTypesOut.PluginMessage }, + { 0x0B, PacketTypesOut.EditBook }, + { 0x0C, PacketTypesOut.EntityNBTRequest }, + { 0x0D, PacketTypesOut.InteractEntity }, + { 0x0E, PacketTypesOut.GenerateStructure }, + { 0x0F, PacketTypesOut.KeepAlive }, + { 0x10, PacketTypesOut.LockDifficulty }, + { 0x11, PacketTypesOut.PlayerPosition }, + { 0x12, PacketTypesOut.PlayerPositionAndRotation }, + { 0x13, PacketTypesOut.PlayerRotation }, + { 0x14, PacketTypesOut.PlayerMovement }, + { 0x15, PacketTypesOut.VehicleMove }, + { 0x16, PacketTypesOut.SteerBoat }, + { 0x17, PacketTypesOut.PickItem }, + { 0x18, PacketTypesOut.CraftRecipeRequest }, + { 0x19, PacketTypesOut.PlayerAbilities }, + { 0x1A, PacketTypesOut.PlayerDigging }, + { 0x1B, PacketTypesOut.EntityAction }, + { 0x1C, PacketTypesOut.SteerVehicle }, + { 0x1D, PacketTypesOut.Pong }, + { 0x1E, PacketTypesOut.SetDisplayedRecipe }, + { 0x1F, PacketTypesOut.SetRecipeBookState }, + { 0x20, PacketTypesOut.NameItem }, + { 0x21, PacketTypesOut.ResourcePackStatus }, + { 0x22, PacketTypesOut.AdvancementTab }, + { 0x23, PacketTypesOut.SelectTrade }, + { 0x24, PacketTypesOut.SetBeaconEffect }, + { 0x25, PacketTypesOut.HeldItemChange }, + { 0x26, PacketTypesOut.UpdateCommandBlock }, + { 0x27, PacketTypesOut.UpdateCommandBlockMinecart }, + { 0x28, PacketTypesOut.CreativeInventoryAction }, + { 0x29, PacketTypesOut.UpdateJigsawBlock }, + { 0x2A, PacketTypesOut.UpdateStructureBlock }, + { 0x2B, PacketTypesOut.UpdateSign }, + { 0x2C, PacketTypesOut.Animation }, + { 0x2D, PacketTypesOut.Spectate }, + { 0x2E, PacketTypesOut.PlayerBlockPlacement }, + { 0x2F, PacketTypesOut.UseItem }, + }; + + protected override Dictionary GetListIn() + { + return typeIn; + } + + protected override Dictionary GetListOut() + { + return typeOut; + } + } +} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs b/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs index 0cb6c884..bb8dca3c 100644 --- a/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs +++ b/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs @@ -51,7 +51,7 @@ namespace MinecraftClient.Protocol.Handlers public PacketTypePalette GetTypeHandler(int protocol) { PacketTypePalette p; - if (protocol > Protocol18Handler.MC1165Version) + if (protocol > Protocol18Handler.MC117Version) throw new NotImplementedException(Translations.Get("exception.palette.packet")); if (protocol <= Protocol18Handler.MC18Version) p = new PacketPalette17(); @@ -69,7 +69,10 @@ namespace MinecraftClient.Protocol.Handlers p = new PacketPalette115(); else if (protocol <= Protocol18Handler.MC1161Version) p = new PacketPalette116(); - else p = new PacketPalette1162(); + else if (protocol <= Protocol18Handler.MC1165Version) + p = new PacketPalette1162(); + else + p = new PacketPalette117(); p.SetForgeEnabled(this.forgeEnabled); return p; diff --git a/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs b/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs index d20ee268..c0d4d3a5 100644 --- a/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs +++ b/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs @@ -102,7 +102,24 @@ namespace MinecraftClient.Protocol.Handlers EntityProperties, EntityEffect, DeclareRecipes, + SetTitleTime, + SetTitleText, + SetTitleSubTitle, + WorldBorderWarningReach, + WorldBorderWarningDelay, + WorldBorderSize, + WorldBorderLerpSize, + WorldBorderCenter, + ActionBar, Tags, + DestroyEntity, // For 1.17+ + DeathCombatEvent, + EnterCombatEvent, + EndCombatEvent, + Ping, + InitializeWorldBorder, + SkulkVibrationSignal, + ClearTiles, UseBed, // For 1.13.2 or below MapChunkBulk, // For 1.8 or below SetCompression, // For 1.8 or below diff --git a/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs b/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs index ee241e94..61450e6e 100644 --- a/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs +++ b/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs @@ -56,6 +56,7 @@ namespace MinecraftClient.Protocol.Handlers Spectate, PlayerBlockPlacement, UseItem, + Pong, PrepareCraftingGrid, // For 1.12 - 1.12.1 only EnchantItem, // For 1.13.2 or below GenerateStructure, // Added in 1.16 diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index a543a8f1..8d462441 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -50,6 +50,7 @@ namespace MinecraftClient.Protocol.Handlers internal const int MC1162Version = 751; internal const int MC1163Version = 753; internal const int MC1165Version = 754; + internal const int MC117Version = 755; private int compression_treshold = 0; private bool autocomplete_received = false; @@ -299,6 +300,7 @@ namespace MinecraftClient.Protocol.Handlers else dataTypes.ReadNextString(packetData); // TODO handle dimensions for 1.16+, needed for terrain handling + // TODO this data give min and max y which will be needed for chunk collumn handling this.currentDimension = 0; } else if (protocolversion >= MC191Version) @@ -405,8 +407,10 @@ namespace MinecraftClient.Protocol.Handlers // Teleport confirm packet SendPacket(PacketTypesOut.TeleportConfirm, dataTypes.GetVarInt(teleportID)); } + + if (protocolversion >= MC117Version) dataTypes.ReadNextBool(packetData); break; - case PacketTypesIn.ChunkData: + case PacketTypesIn.ChunkData: //TODO implement for 1.17, bit mask is not limited to 0-15 anymore if (handler.GetTerrainEnabled()) { int chunkX = dataTypes.ReadNextInt(packetData); @@ -458,12 +462,16 @@ namespace MinecraftClient.Protocol.Handlers case PacketTypesIn.MapData: int mapid = dataTypes.ReadNextVarInt(packetData); byte scale = dataTypes.ReadNextByte(packetData); - bool trackingposition = dataTypes.ReadNextBool(packetData); + bool trackingposition = protocolversion >= MC117Version ? false : dataTypes.ReadNextBool(packetData); bool locked = false; if (protocolversion >= MC114Version) { locked = dataTypes.ReadNextBool(packetData); } + if (protocolversion >= MC117Version) + { + trackingposition = dataTypes.ReadNextBool(packetData); + } int iconcount = dataTypes.ReadNextVarInt(packetData); handler.OnMapData(mapid, scale, trackingposition, locked, iconcount); break; @@ -841,6 +849,8 @@ namespace MinecraftClient.Protocol.Handlers case PacketTypesIn.ResourcePackSend: string url = dataTypes.ReadNextString(packetData); string hash = dataTypes.ReadNextString(packetData); + bool forced = dataTypes.ReadNextBool(packetData); + String forcedMessage = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); // Some server plugins may send invalid resource packs to probe the client and we need to ignore them (issue #1056) if (hash.Length != 40) break; @@ -935,6 +945,12 @@ namespace MinecraftClient.Protocol.Handlers handler.OnDestroyEntities(EntitiesList); } break; + case PacketTypesIn.DestroyEntity: + if (handler.GetEntityHandlingEnabled()) + { + handler.OnDestroyEntities(new [] { dataTypes.ReadNextVarInt(packetData) }); + } + break; case PacketTypesIn.EntityPosition: if (handler.GetEntityHandlingEnabled()) { @@ -969,7 +985,7 @@ namespace MinecraftClient.Protocol.Handlers if (handler.GetEntityHandlingEnabled()) { int EntityID = dataTypes.ReadNextVarInt(packetData); - int NumberOfProperties = dataTypes.ReadNextInt(packetData); + int NumberOfProperties = protocolversion >= MC117Version ? dataTypes.ReadNextVarInt(packetData) : dataTypes.ReadNextInt(packetData); Dictionary keys = new Dictionary(); for (int i = 0; i < NumberOfProperties; i++) { @@ -1056,7 +1072,9 @@ namespace MinecraftClient.Protocol.Handlers case PacketTypesIn.Explosion: Location explosionLocation = new Location(dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData)); float explosionStrength = dataTypes.ReadNextFloat(packetData); - int explosionBlockCount = dataTypes.ReadNextInt(packetData); + int explosionBlockCount = protocolversion >= MC117Version + ? dataTypes.ReadNextVarInt(packetData) + : dataTypes.ReadNextInt(packetData); // Ignoring additional fields (records, pushback) handler.OnExplosion(explosionLocation, explosionStrength, explosionBlockCount); break; @@ -1565,6 +1583,8 @@ namespace MinecraftClient.Protocol.Handlers else fields.Add(skinParts); if (protocolversion >= MC19Version) fields.AddRange(dataTypes.GetVarInt(mainHand)); + if (protocolversion >= MC117Version) + fields.Add(1); SendPacket(PacketTypesOut.ClientSettings, fields); } catch (SocketException) { } @@ -1850,14 +1870,11 @@ namespace MinecraftClient.Protocol.Handlers packet.Add((byte)windowId); packet.AddRange(dataTypes.GetShort((short)slotId)); packet.Add(button); - packet.AddRange(dataTypes.GetShort(actionNumber)); - + if (protocolversion < MC117Version) packet.AddRange(dataTypes.GetShort(actionNumber)); if (protocolversion >= MC19Version) packet.AddRange(dataTypes.GetVarInt(mode)); else packet.Add(mode); - packet.AddRange(dataTypes.GetItemSlot(item, itemPalette)); - SendPacket(PacketTypesOut.ClickWindow, packet); return true; } diff --git a/MinecraftClient/Protocol/ProtocolHandler.cs b/MinecraftClient/Protocol/ProtocolHandler.cs index 424b5a49..45d13d1a 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, 751, 753, 754 }; + 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, 753, 754, 755 }; if (Array.IndexOf(supportedVersions_Protocol18, ProtocolVersion) > -1) return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo); throw new NotSupportedException(Translations.Get("exception.version_unsupport", ProtocolVersion)); @@ -245,6 +245,8 @@ namespace MinecraftClient.Protocol case "1.16.4": case "1.16.5": return 754; + case "1.17": + return 755; default: return 0; }