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) {