diff --git a/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs b/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs index 8192326..c32b60b 100644 --- a/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs +++ b/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs @@ -30,8 +30,11 @@ namespace TrueCraft.Core.Networking.Packets WindowID = stream.ReadInt8(); SlotIndex = stream.ReadInt16(); ItemID = stream.ReadInt16(); - Count = stream.ReadInt8(); - Metadata = stream.ReadInt16(); + if (ItemID != -1) + { + Count = stream.ReadInt8(); + Metadata = stream.ReadInt16(); + } } public void WritePacket(IMinecraftStream stream) @@ -39,8 +42,11 @@ namespace TrueCraft.Core.Networking.Packets stream.WriteInt8(WindowID); stream.WriteInt16(SlotIndex); stream.WriteInt16(ItemID); - stream.WriteInt8(Count); - stream.WriteInt16(Metadata); + if (ItemID != -1) + { + stream.WriteInt8(Count); + stream.WriteInt16(Metadata); + } } } } \ No newline at end of file diff --git a/TrueCraft/Commands/CommandManager.cs b/TrueCraft/Commands/CommandManager.cs index 55e3128..3754c6f 100644 --- a/TrueCraft/Commands/CommandManager.cs +++ b/TrueCraft/Commands/CommandManager.cs @@ -22,6 +22,7 @@ namespace TrueCraft.Commands Commands.Add(new PingCommand()); Commands.Add(new GiveCommand()); Commands.Add(new HelpCommand()); + Commands.Add(new ResendInvCommand()); } /// diff --git a/TrueCraft/Commands/DebugCommands.cs b/TrueCraft/Commands/DebugCommands.cs new file mode 100644 index 0000000..473c5de --- /dev/null +++ b/TrueCraft/Commands/DebugCommands.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using TrueCraft.Core.Windows; +using TrueCraft.API; +using TrueCraft.API.Networking; +using TrueCraft.Core.Networking.Packets; + +namespace TrueCraft.Commands +{ + public class ResendInvCommand : Command + { + public override string Name + { + get { return "reinv"; } + } + + public override string Description + { + get { return "Resends your inventory to the selected client."; } + } + + public override string[] Aliases + { + get { return new string[0]; } + } + + public override void Handle(IRemoteClient Client, string Alias, string[] Arguments) + { + if (Arguments.Length != 0) + { + Help(Client, Alias, Arguments); + return; + } + Client.QueuePacket(new WindowItemsPacket(0, Client.Inventory.GetSlots())); + } + + public override void Help(IRemoteClient Client, string Alias, string[] Arguments) + { + Client.SendMessage("/reinv: Resends your inventory."); + } + } +} \ No newline at end of file diff --git a/TrueCraft/Handlers/InteractionHandlers.cs b/TrueCraft/Handlers/InteractionHandlers.cs index 5e733a1..f212ef7 100644 --- a/TrueCraft/Handlers/InteractionHandlers.cs +++ b/TrueCraft/Handlers/InteractionHandlers.cs @@ -62,7 +62,7 @@ namespace TrueCraft.Handlers { if (use) { - // Temporary + // Temporary: just place the damn thing position += MathHelper.BlockFaceToCoordinates(packet.Face); client.World.SetBlockID(position, (byte)slot.Id); client.World.SetMetadata(position, (byte)slot.Metadata); @@ -81,6 +81,85 @@ namespace TrueCraft.Handlers } } + public static void HandleClickWindowPacket(IPacket _packet, IRemoteClient _client, IMultiplayerServer server) + { + var packet = (ClickWindowPacket)_packet; + var client = (RemoteClient)_client; + var window = client.CurrentWindow; + if (packet.SlotIndex >= window.Length || packet.SlotIndex < 0) + return; + ItemStack existing = window[packet.SlotIndex]; + ItemStack held = client.ItemStaging; + if (client.ItemStaging.Empty) // Picking up something + { + if (packet.Shift) + { + window.MoveToAlternateArea(packet.SlotIndex); + } + else + { + if (packet.RightClick) + { + sbyte mod = (sbyte)(existing.Count % 2); + existing.Count /= 2; + held = existing; + held.Count += mod; + client.ItemStaging = held; + window[packet.SlotIndex] = existing; + } + else + { + client.ItemStaging = window[packet.SlotIndex]; + window[packet.SlotIndex] = ItemStack.EmptyStack; + } + } + } + else // Setting something down + { + if (existing.Empty) // Replace empty slot + { + if (packet.RightClick) + { + var newItem = (ItemStack)client.ItemStaging.Clone(); + newItem.Count = 1; + held.Count--; + window[packet.SlotIndex] = newItem; + client.ItemStaging = held; + } + else + { + window[packet.SlotIndex] = client.ItemStaging; + client.ItemStaging = ItemStack.EmptyStack; + } + } + else + { + if (existing.CanMerge(client.ItemStaging)) // Merge items + { + // TODO: Consider the maximum stack size + if (packet.RightClick) + { + existing.Count++; + held.Count--; + window[packet.SlotIndex] = existing; + client.ItemStaging = held; + } + else + { + existing.Count += client.ItemStaging.Count; + window[packet.SlotIndex] = existing; + client.ItemStaging = ItemStack.EmptyStack; + } + } + else // Swap items + { + window[packet.SlotIndex] = client.ItemStaging; + client.ItemStaging = existing; + } + } + } + } + public static void HandleChangeHeldItem(IPacket _packet, IRemoteClient _client, IMultiplayerServer server) { var packet = (ChangeHeldItemPacket)_packet; diff --git a/TrueCraft/Handlers/PacketHandlers.cs b/TrueCraft/Handlers/PacketHandlers.cs index 7e783df..617458a 100644 --- a/TrueCraft/Handlers/PacketHandlers.cs +++ b/TrueCraft/Handlers/PacketHandlers.cs @@ -23,6 +23,7 @@ namespace TrueCraft.Handlers server.RegisterPacketHandler(new PlayerDiggingPacket().ID, InteractionHandlers.HandlePlayerDiggingPacket); server.RegisterPacketHandler(new PlayerBlockPlacementPacket().ID, InteractionHandlers.HandlePlayerBlockPlacementPacket); server.RegisterPacketHandler(new ChangeHeldItemPacket().ID, InteractionHandlers.HandleChangeHeldItem); + server.RegisterPacketHandler(new ClickWindowPacket().ID, InteractionHandlers.HandleClickWindowPacket); } internal static void HandleKeepAlive(IPacket _packet, IRemoteClient _client, IMultiplayerServer server) diff --git a/TrueCraft/RemoteClient.cs b/TrueCraft/RemoteClient.cs index adc98dc..72ca13d 100644 --- a/TrueCraft/RemoteClient.cs +++ b/TrueCraft/RemoteClient.cs @@ -31,6 +31,8 @@ namespace TrueCraft Inventory = new InventoryWindow(); InventoryWindow.WindowChange += HandleWindowChange; SelectedSlot = InventoryWindow.HotbarIndex; + CurrentWindow = InventoryWindow; + ItemStaging = ItemStack.EmptyStack; } public NetworkStream NetworkStream { get; set; } @@ -43,6 +45,8 @@ namespace TrueCraft public IEntity Entity { get; internal set; } public IWindow Inventory { get; private set; } public short SelectedSlot { get; internal set; } + public ItemStack ItemStaging { get; set; } + public IWindow CurrentWindow { get; set; } public ItemStack SelectedItem { @@ -86,7 +90,6 @@ namespace TrueCraft if (ChunkRadius < 16) // TODO: Allow customization of this number { ChunkRadius++; - Console.WriteLine("Expanding chunk radius to {0}", ChunkRadius); UpdateChunks(); server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), ExpandChunkRadius); } diff --git a/TrueCraft/TrueCraft.csproj b/TrueCraft/TrueCraft.csproj index 581d6fc..25bfd9f 100644 --- a/TrueCraft/TrueCraft.csproj +++ b/TrueCraft/TrueCraft.csproj @@ -56,6 +56,7 @@ + @@ -73,4 +74,4 @@ - \ No newline at end of file +