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;
+ }
+
+ }
+}