diff --git a/MinecraftClient/Protocol/Handlers/DataTypes.cs b/MinecraftClient/Protocol/Handlers/DataTypes.cs
index b5bea717..a3e95cb4 100644
--- a/MinecraftClient/Protocol/Handlers/DataTypes.cs
+++ b/MinecraftClient/Protocol/Handlers/DataTypes.cs
@@ -1396,12 +1396,14 @@ namespace MinecraftClient.Protocol.Handlers
/// The item that was read or NULL for an empty slot
public VillagerTrade ReadNextTrade(Queue cache, ItemPalette itemPalette)
{
- Item inputItem1 = ReadNextItemSlot(cache, itemPalette)!;
+ Item inputItem1 = ReadNextTradeCost(cache, itemPalette)!;
Item outputItem = ReadNextItemSlot(cache, itemPalette)!;
Item? inputItem2 = null;
- if (protocolversion >= Protocol18Handler.MC_1_19_3_Version)
+ if (protocolversion >= Protocol18Handler.MC_1_20_6_Version)
+ inputItem2 = ReadNextOptionalTradeCost(cache, itemPalette);
+ else if (protocolversion >= Protocol18Handler.MC_1_19_3_Version)
inputItem2 = ReadNextItemSlot(cache, itemPalette);
else
{
@@ -1420,6 +1422,40 @@ namespace MinecraftClient.Protocol.Handlers
maximumNumberOfTradeUses, xp, specialPrice, priceMultiplier, demand);
}
+ private Item? ReadNextTradeCost(Queue cache, ItemPalette itemPalette)
+ {
+ if (protocolversion < Protocol18Handler.MC_1_20_6_Version)
+ return ReadNextItemSlot(cache, itemPalette);
+
+ var itemId = ReadNextVarInt(cache);
+ var itemCount = ReadNextVarInt(cache);
+ var item = new Item(itemPalette.FromId(itemId), itemCount, null);
+ var componentCount = ReadNextVarInt(cache);
+
+ if (componentCount > 0)
+ {
+ var structuredComponentHandler = new StructuredComponentsHandler(protocolversion, this, itemPalette);
+ var components = new List(componentCount);
+ for (var i = 0; i < componentCount; i++)
+ {
+ var componentTypeId = ReadNextVarInt(cache);
+ components.Add(structuredComponentHandler.Parse(componentTypeId, cache));
+ }
+
+ item.Components = components;
+ }
+
+ return item;
+ }
+
+ private Item? ReadNextOptionalTradeCost(Queue cache, ItemPalette itemPalette)
+ {
+ if (!ReadNextBool(cache))
+ return null;
+
+ return ReadNextTradeCost(cache, itemPalette);
+ }
+
public string ReadNextChat(Queue cache)
{
if (protocolversion >= Protocol18Handler.MC_1_20_4_Version)
diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs
index c9b093de..3e6dccc9 100644
--- a/MinecraftClient/Protocol/Handlers/Protocol18.cs
+++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs
@@ -2104,12 +2104,9 @@ namespace MinecraftClient.Protocol.Handlers
break;
case PacketTypesIn.ChangeGameState:
- if (protocolVersion >= MC_1_15_2_Version)
- {
- var reason = dataTypes.ReadNextByte(packetData);
- var state = dataTypes.ReadNextFloat(packetData);
- handler.OnGameEvent(reason, state);
- }
+ var reason = dataTypes.ReadNextByte(packetData);
+ var state = dataTypes.ReadNextFloat(packetData);
+ handler.OnGameEvent(reason, state);
break;
case PacketTypesIn.PlayerInfo:
@@ -2338,6 +2335,11 @@ namespace MinecraftClient.Protocol.Handlers
}
break;
+ case PacketTypesIn.PlayerListHeaderAndFooter:
+ handler.OnTabListHeaderAndFooter(
+ dataTypes.ReadNextChat(packetData),
+ dataTypes.ReadNextChat(packetData));
+ break;
case PacketTypesIn.TabComplete:
var oldTransactionId = autocomplete_transaction_id;
if (protocolVersion >= MC_1_13_Version)
@@ -2605,7 +2607,9 @@ namespace MinecraftClient.Protocol.Handlers
if (Enum.IsDefined(typeof(Effects), effectId))
{
var effect = (Effects)effectId;
- var amplifier = dataTypes.ReadNextByte(packetData);
+ var amplifier = protocolVersion >= MC_1_20_6_Version
+ ? dataTypes.ReadNextVarInt(packetData)
+ : dataTypes.ReadNextByte(packetData);
var duration = dataTypes.ReadNextVarInt(packetData);
var flags = dataTypes.ReadNextByte(packetData);
var hasFactorData = false;
@@ -3088,7 +3092,10 @@ namespace MinecraftClient.Protocol.Handlers
}
case PacketTypesIn.HeldItemChange:
case PacketTypesIn.SetHeldSlot:
- handler.OnHeldItemChange(dataTypes.ReadNextByte(packetData)); // Slot
+ var heldSlot = protocolVersion >= MC_1_21_4_Version
+ ? dataTypes.ReadNextVarInt(packetData)
+ : dataTypes.ReadNextByte(packetData);
+ handler.OnHeldItemChange((byte)heldSlot);
break;
case PacketTypesIn.ScoreboardObjective:
var objectiveName = dataTypes.ReadNextString(packetData);
@@ -6082,11 +6089,18 @@ namespace MinecraftClient.Protocol.Handlers
{
try
{
- var packet = new List
+ List packet = new();
+ if (protocolVersion >= MC_1_20_6_Version)
{
- (byte)windowId,
- (byte)buttonId
- };
+ packet.AddRange(DataTypes.GetVarInt(windowId));
+ packet.AddRange(DataTypes.GetVarInt(buttonId));
+ }
+ else
+ {
+ packet.Add((byte)windowId);
+ packet.Add((byte)buttonId);
+ }
+
SendPacket(PacketTypesOut.ClickWindowButton, packet);
return true;
}