From 5895a4161fab5fe77d42726250f4988cf6f77de6 Mon Sep 17 00:00:00 2001 From: xPenguinx Date: Sat, 25 May 2019 17:45:59 -0400 Subject: [PATCH] Started to implement inventory handling --- MinecraftClient/McTcpClient.cs | 11 ++++++ MinecraftClient/MinecraftClient.csproj | 3 ++ .../Protocol/Handlers/PacketIncomingType.cs | 5 ++- .../Protocol/Handlers/Protocol18.cs | 35 +++++++++++++++++++ .../Handlers/Protocol18PacketTypes.cs | 18 ++++++++++ .../Protocol/IMinecraftComHandler.cs | 6 ++++ MinecraftClient/Protocol/Inventory.cs | 23 ++++++++++++ MinecraftClient/Protocol/InventoryType.cs | 21 +++++++++++ MinecraftClient/Protocol/Item.cs | 27 ++++++++++++++ 9 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 MinecraftClient/Protocol/Inventory.cs create mode 100644 MinecraftClient/Protocol/InventoryType.cs create mode 100644 MinecraftClient/Protocol/Item.cs diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs index e2fc4090..765ca3bf 100644 --- a/MinecraftClient/McTcpClient.cs +++ b/MinecraftClient/McTcpClient.cs @@ -47,6 +47,8 @@ namespace MinecraftClient private string username; private string uuid; private string sessionid; + private Inventory inventory; + public int GetServerPort() { return port; } public string GetServerHost() { return host; } @@ -589,6 +591,15 @@ namespace MinecraftClient } } + /// + /// When an inventory is opened + /// + /// Location to reach + public void onInventoryOpen(Inventory inventory) + { + //TODO: Handle Inventory + } + /// /// When connection has been lost /// diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index 97811e75..1cc4a813 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -251,6 +251,9 @@ + + + diff --git a/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs b/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs index 263d38a1..104e2664 100644 --- a/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs +++ b/MinecraftClient/Protocol/Handlers/PacketIncomingType.cs @@ -10,7 +10,7 @@ namespace MinecraftClient.Protocol.Handlers /// enum PacketIncomingType { - KeepAlive, + KeepAlive, JoinGame, ChatMessage, Respawn, @@ -26,6 +26,9 @@ namespace MinecraftClient.Protocol.Handlers KickPacket, NetworkCompressionTreshold, ResourcePackSend, + OpenWindow, + WindowItems, + SetSlot, UnknownPacket } } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index dc3dc0af..3130a6c8 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -464,6 +464,41 @@ namespace MinecraftClient.Protocol.Handlers if (protocolversion >= MC18Version && protocolversion < MC19Version) compression_treshold = dataTypes.ReadNextVarInt(packetData); break; + case PacketIncomingType.OpenWindow: + if (protocolversion < MC1141Version) + { + byte windowID = dataTypes.ReadNextByte(packetData); + string type = dataTypes.ReadNextString(packetData).Replace("minecraft:", "").ToUpper(); + InventoryType inventoryType = (InventoryType)Enum.Parse(typeof(InventoryType), type); + string title = dataTypes.ReadNextString(packetData); + byte slots = dataTypes.ReadNextByte(packetData); + Inventory inventory = new Inventory(windowID, inventoryType, title, slots); + + + handler.onInventoryOpen(inventory); + } + break; + case PacketIncomingType.WindowItems: + if (protocolversion < MC1141Version) + { + byte id = dataTypes.ReadNextByte(packetData); + short elements = dataTypes.ReadNextShort(packetData); + + for (int i = 0; i < elements; i++) + { + short itemID = dataTypes.ReadNextShort(packetData); + if (itemID == -1) continue; + byte itemCount = dataTypes.ReadNextByte(packetData); + short itemDamage = dataTypes.ReadNextShort(packetData); + Item item = new Item(itemID, itemCount, itemDamage, 0); + //TODO: Add to the dictionary for the inventory its in using the id + if (packetData.ToArray().Count() > 0) + { + dataTypes.ReadNextNbt(packetData); + } + } + } + break; case PacketIncomingType.ResourcePackSend: string url = dataTypes.ReadNextString(packetData); string hash = dataTypes.ReadNextString(packetData); diff --git a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs index c35feb20..5d0f893a 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18PacketTypes.cs @@ -38,6 +38,9 @@ namespace MinecraftClient.Protocol.Handlers case 0x40: return PacketIncomingType.KickPacket; case 0x46: return PacketIncomingType.NetworkCompressionTreshold; case 0x48: return PacketIncomingType.ResourcePackSend; + case 0x2D: return PacketIncomingType.OpenWindow; + case 0x30: return PacketIncomingType.WindowItems; + case 0x2F: return PacketIncomingType.SetSlot; default: return PacketIncomingType.UnknownPacket; } } @@ -59,6 +62,9 @@ namespace MinecraftClient.Protocol.Handlers case 0x0E: return PacketIncomingType.TabCompleteResult; case 0x18: return PacketIncomingType.PluginMessage; case 0x1A: return PacketIncomingType.KickPacket; + case 0x13: return PacketIncomingType.OpenWindow; + case 0x14: return PacketIncomingType.WindowItems; + case 0x16: return PacketIncomingType.SetSlot; //NetworkCompressionTreshold removed in 1.9 case 0x32: return PacketIncomingType.ResourcePackSend; default: return PacketIncomingType.UnknownPacket; @@ -81,7 +87,10 @@ namespace MinecraftClient.Protocol.Handlers case 0x0E: return PacketIncomingType.TabCompleteResult; case 0x18: return PacketIncomingType.PluginMessage; case 0x1A: return PacketIncomingType.KickPacket; + case 0x13: return PacketIncomingType.OpenWindow; case 0x33: return PacketIncomingType.ResourcePackSend; + case 0x14: return PacketIncomingType.WindowItems; + case 0x16: return PacketIncomingType.SetSlot; default: return PacketIncomingType.UnknownPacket; } } @@ -102,6 +111,9 @@ namespace MinecraftClient.Protocol.Handlers case 0x0E: return PacketIncomingType.TabCompleteResult; case 0x18: return PacketIncomingType.PluginMessage; case 0x1A: return PacketIncomingType.KickPacket; + case 0x13: return PacketIncomingType.OpenWindow; + case 0x14: return PacketIncomingType.WindowItems; + case 0x16: return PacketIncomingType.SetSlot; case 0x34: return PacketIncomingType.ResourcePackSend; default: return PacketIncomingType.UnknownPacket; } @@ -124,6 +136,9 @@ namespace MinecraftClient.Protocol.Handlers case 0x19: return PacketIncomingType.PluginMessage; case 0x1B: return PacketIncomingType.KickPacket; case 0x37: return PacketIncomingType.ResourcePackSend; + case 0x14: return PacketIncomingType.OpenWindow; + case 0x15: return PacketIncomingType.WindowItems; + case 0x17: return PacketIncomingType.SetSlot; default: return PacketIncomingType.UnknownPacket; } } @@ -145,6 +160,9 @@ namespace MinecraftClient.Protocol.Handlers case 0x18: return PacketIncomingType.PluginMessage; case 0x1A: return PacketIncomingType.KickPacket; case 0x39: return PacketIncomingType.ResourcePackSend; + case 0x2E: return PacketIncomingType.OpenWindow; + case 0x14: return PacketIncomingType.WindowItems; + case 0x16: return PacketIncomingType.SetSlot; default: return PacketIncomingType.UnknownPacket; } } diff --git a/MinecraftClient/Protocol/IMinecraftComHandler.cs b/MinecraftClient/Protocol/IMinecraftComHandler.cs index 0f336ab8..181f2be7 100644 --- a/MinecraftClient/Protocol/IMinecraftComHandler.cs +++ b/MinecraftClient/Protocol/IMinecraftComHandler.cs @@ -41,6 +41,12 @@ namespace MinecraftClient.Protocol /// TRUE if the text is JSON-Encoded void OnTextReceived(string text, bool isJson); + /// + /// This method is called when an inventory is opened + /// + /// Inventory that was opened + void onInventoryOpen(Inventory inventory); + /// /// Called when the player respawns, which happens on login, respawn and world change. /// diff --git a/MinecraftClient/Protocol/Inventory.cs b/MinecraftClient/Protocol/Inventory.cs new file mode 100644 index 00000000..eaadebe2 --- /dev/null +++ b/MinecraftClient/Protocol/Inventory.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace MinecraftClient.Protocol +{ + public class Inventory + { + public byte id { get; set; } + public InventoryType type { get; set; } + public string title { get; set; } + public byte slots { get; set; } + public Dictionary items { get; set; } + + public Inventory(byte id, InventoryType type, string title, byte slots) + { + this.id = id; + this.type = type; + this.title = title; + this.slots = slots; + } + + } +} diff --git a/MinecraftClient/Protocol/InventoryType.cs b/MinecraftClient/Protocol/InventoryType.cs new file mode 100644 index 00000000..100b27f6 --- /dev/null +++ b/MinecraftClient/Protocol/InventoryType.cs @@ -0,0 +1,21 @@ +using System; +namespace MinecraftClient.Protocol +{ + public enum InventoryType + { + CONTAINER, + CHEST, + CRAFTING_TABLE, + FURNACE, + DISPENSER, + ENCHANTING_TABLE, + BREWING_STAND, + VILLAGER, + BEACON, + ANVIL, + HOPPER, + DROPPER, + SHULKER_BOX, + ENTITYHORSE + } +} diff --git a/MinecraftClient/Protocol/Item.cs b/MinecraftClient/Protocol/Item.cs new file mode 100644 index 00000000..d0b9d677 --- /dev/null +++ b/MinecraftClient/Protocol/Item.cs @@ -0,0 +1,27 @@ +using System; +namespace MinecraftClient.Protocol +{ + public class Item + { + public int id; + public int count; + public int damage; + public byte nbtData; + + public Item(int id, int count) + { + this.id = id; + this.count = count; + this.damage = 0; + } + + public Item(int id, int damage, int count, byte nbtData) + { + this.id = id; + this.count = count; + this.damage = damage; + this.nbtData = nbtData; + } + + } +}