diff --git a/TrueCraft.Client/Handlers/ChunkHandler.cs b/TrueCraft.Client/Handlers/ChunkHandlers.cs
similarity index 99%
rename from TrueCraft.Client/Handlers/ChunkHandler.cs
rename to TrueCraft.Client/Handlers/ChunkHandlers.cs
index 3e495bb..16dd9cd 100644
--- a/TrueCraft.Client/Handlers/ChunkHandler.cs
+++ b/TrueCraft.Client/Handlers/ChunkHandlers.cs
@@ -9,7 +9,7 @@ using TrueCraft.API.World;
namespace TrueCraft.Client.Handlers
{
- internal static class ChunkHandler
+ internal static class ChunkHandlers
{
public static void HandleBlockChange(IPacket _packet, MultiplayerClient client)
{
diff --git a/TrueCraft.Client/Handlers/InventoryHandlers.cs b/TrueCraft.Client/Handlers/InventoryHandlers.cs
new file mode 100644
index 0000000..d425c0a
--- /dev/null
+++ b/TrueCraft.Client/Handlers/InventoryHandlers.cs
@@ -0,0 +1,41 @@
+using System;
+using TrueCraft.API.Networking;
+using TrueCraft.Core.Networking.Packets;
+using TrueCraft.API.Windows;
+using TrueCraft.API;
+
+namespace TrueCraft.Client.Handlers
+{
+ internal static class InventoryHandlers
+ {
+ public static void HandleWindowItems(IPacket _packet, MultiplayerClient client)
+ {
+ var packet = (WindowItemsPacket)_packet;
+ if (packet.WindowID == 0)
+ client.Inventory.SetSlots(packet.Items);
+ else
+ {
+ // TODO
+ }
+ }
+
+ public static void HandleSetSlot(IPacket _packet, MultiplayerClient client)
+ {
+ var packet = (SetSlotPacket)_packet;
+ IWindow window = null;
+ if (packet.WindowID == 0)
+ window = client.Inventory;
+ else
+ {
+ // TODO
+ }
+ if (window != null)
+ {
+ if (packet.SlotIndex >= 0 && packet.SlotIndex < window.Length)
+ {
+ window[packet.SlotIndex] = new ItemStack(packet.ItemID, packet.Count, packet.Metadata);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/TrueCraft.Client/Handlers/PacketHandlers.cs b/TrueCraft.Client/Handlers/PacketHandlers.cs
index 2c4f4cc..3715c9d 100644
--- a/TrueCraft.Client/Handlers/PacketHandlers.cs
+++ b/TrueCraft.Client/Handlers/PacketHandlers.cs
@@ -17,9 +17,12 @@ namespace TrueCraft.Client.Handlers
client.RegisterPacketHandler(new SetPlayerPositionPacket().ID, HandlePositionAndLook);
client.RegisterPacketHandler(new LoginResponsePacket().ID, HandleLoginResponse);
- client.RegisterPacketHandler(new ChunkPreamblePacket().ID, ChunkHandler.HandleChunkPreamble);
- client.RegisterPacketHandler(new ChunkDataPacket().ID, ChunkHandler.HandleChunkData);
- client.RegisterPacketHandler(new BlockChangePacket().ID, ChunkHandler.HandleBlockChange);
+ client.RegisterPacketHandler(new ChunkPreamblePacket().ID, ChunkHandlers.HandleChunkPreamble);
+ client.RegisterPacketHandler(new ChunkDataPacket().ID, ChunkHandlers.HandleChunkData);
+ client.RegisterPacketHandler(new BlockChangePacket().ID, ChunkHandlers.HandleBlockChange);
+
+ client.RegisterPacketHandler(new WindowItemsPacket().ID, InventoryHandlers.HandleWindowItems);
+ client.RegisterPacketHandler(new SetSlotPacket().ID, InventoryHandlers.HandleSetSlot);
}
public static void HandleChatMessage(IPacket _packet, MultiplayerClient client)
diff --git a/TrueCraft.Client/Modules/DebugInfoModule.cs b/TrueCraft.Client/Modules/DebugInfoModule.cs
index 0e31407..a7e0135 100644
--- a/TrueCraft.Client/Modules/DebugInfoModule.cs
+++ b/TrueCraft.Client/Modules/DebugInfoModule.cs
@@ -5,6 +5,7 @@ using TrueCraft.Client.Input;
using TrueCraft.Client.Rendering;
using TrueCraft.API;
using System;
+using System.Text;
namespace TrueCraft.Client.Modules
{
@@ -83,7 +84,7 @@ namespace TrueCraft.Client.Modules
Font.DrawText(SpriteBatch, xOrigin, yOrigin + (yOffset * 1),
string.Format("Standing at <{0:N2}, {1:N2}, {2:N2}>",
- Game.Client.Position.X, Game.Client.Position.Y, Game.Client.Position.Z));
+ Game.Client.Position.X, Game.Client.Position.Y, Game.Client.Position.Z));
Font.DrawText(SpriteBatch, xOrigin, yOrigin + (yOffset * 2),
string.Format(ChatColor.Gray + "Looking at {0} ({1})", Game.HighlightedBlock,
@@ -92,6 +93,18 @@ namespace TrueCraft.Client.Modules
Font.DrawText(SpriteBatch, xOrigin, yOrigin + (yOffset * 3),
string.Format(ChatColor.Gray + "{0} pending chunks", Game.ChunkModule.ChunkRenderer.PendingChunks));
+ var sb = new StringBuilder(ChatColor.DarkGray + "inv: ");
+ for (int i = 0; i < Game.Client.Inventory.Hotbar.Length; i++)
+ {
+ var provider = Game.ItemRepository.GetItemProvider(Game.Client.Inventory.Hotbar[i].ID);
+ if (provider != null)
+ sb.Append(provider.DisplayName + " ");
+ else
+ sb.Append("[empty]");
+ }
+
+ Font.DrawText(SpriteBatch, xOrigin, yOrigin + (yOffset * 4), sb.ToString());
+
SpriteBatch.End();
}
diff --git a/TrueCraft.Client/MultiplayerClient.cs b/TrueCraft.Client/MultiplayerClient.cs
index c784a1a..f9c55b7 100644
--- a/TrueCraft.Client/MultiplayerClient.cs
+++ b/TrueCraft.Client/MultiplayerClient.cs
@@ -16,6 +16,7 @@ using System.IO;
using TrueCraft.Core;
using TrueCraft.API.Physics;
using TrueCraft.Core.Physics;
+using TrueCraft.Core.Windows;
namespace TrueCraft.Client
{
@@ -36,6 +37,7 @@ namespace TrueCraft.Client
public PhysicsEngine Physics { get; set; }
public bool LoggedIn { get; internal set; }
public int EntityID { get; internal set; }
+ public InventoryWindow Inventory { get; set; }
public bool Connected
{
@@ -66,6 +68,7 @@ namespace TrueCraft.Client
PacketHandlers = new PacketHandler[0x100];
Handlers.PacketHandlers.RegisterHandlers(this);
World = new ReadOnlyWorld();
+ Inventory = new InventoryWindow(null);
var repo = new BlockRepository();
repo.DiscoverBlockProviders();
World.World.BlockRepository = repo;
diff --git a/TrueCraft.Client/TrueCraft.Client.csproj b/TrueCraft.Client/TrueCraft.Client.csproj
index 07db99a..0f35ffb 100644
--- a/TrueCraft.Client/TrueCraft.Client.csproj
+++ b/TrueCraft.Client/TrueCraft.Client.csproj
@@ -101,7 +101,6 @@
-
@@ -135,6 +134,8 @@
+
+
diff --git a/TrueCraft.Core/Windows/CraftingWindowArea.cs b/TrueCraft.Core/Windows/CraftingWindowArea.cs
index 54fdd1e..0e70067 100644
--- a/TrueCraft.Core/Windows/CraftingWindowArea.cs
+++ b/TrueCraft.Core/Windows/CraftingWindowArea.cs
@@ -18,6 +18,8 @@ namespace TrueCraft.Core.Windows
private void HandleWindowChange(object sender, WindowChangeEventArgs e)
{
+ if (Repository == null)
+ return;
var current = Repository.GetRecipe(Bench);
if (e.SlotIndex == CraftingOutput)
{