From b0e168077f641a5800cd7325b69c80021607f39d Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 28 Dec 2014 19:40:32 -0700 Subject: [PATCH] Implement /give command --- .../Networking/Packets/SetSlotPacket.cs | 9 +++++ TrueCraft/MultiplayerServer.cs | 6 ++- TrueCraft/Program.cs | 37 +++++++++++++++++++ TrueCraft/RemoteClient.cs | 8 +++- 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs b/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs index 8c3ae4c..8192326 100644 --- a/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs +++ b/TrueCraft.Core/Networking/Packets/SetSlotPacket.cs @@ -10,6 +10,15 @@ namespace TrueCraft.Core.Networking.Packets { public byte ID { get { return 0x67; } } + public SetSlotPacket(sbyte windowID, short slotIndex, short itemID, sbyte count, short metadata) + { + WindowID = windowID; + SlotIndex = slotIndex; + ItemID = itemID; + Count = count; + Metadata = metadata; + } + public sbyte WindowID; public short SlotIndex; public short ItemID; diff --git a/TrueCraft/MultiplayerServer.cs b/TrueCraft/MultiplayerServer.cs index b16bbee..95327f5 100644 --- a/TrueCraft/MultiplayerServer.cs +++ b/TrueCraft/MultiplayerServer.cs @@ -149,7 +149,8 @@ namespace TrueCraft for (int i = 0; i < Clients.Count; i++) { var client = Clients[i] as RemoteClient; - while (client.PacketQueue.Count != 0) + var sendTimeout = DateTime.Now.AddMilliseconds(50); + while (client.PacketQueue.Count != 0 && DateTime.Now < sendTimeout) { IPacket packet; while (!client.PacketQueue.TryDequeue(out packet)) { } @@ -161,7 +162,8 @@ namespace TrueCraft break; } } - if (client.DataAvailable) + var receiveTimeout = DateTime.Now.AddMilliseconds(50); + while (client.DataAvailable && DateTime.Now < receiveTimeout) { var packet = PacketReader.ReadPacket(client.MinecraftStream); if (PacketHandlers[packet.ID] != null) diff --git a/TrueCraft/Program.cs b/TrueCraft/Program.cs index b929adc..944d201 100644 --- a/TrueCraft/Program.cs +++ b/TrueCraft/Program.cs @@ -5,6 +5,9 @@ using TrueCraft.Core.World; using TrueCraft.Core.TerrainGen; using TrueCraft.Core.Logging; using TrueCraft.API.Logging; +using TrueCraft.API.Server; +using TrueCraft.API; +using TrueCraft.Core.Windows; namespace TrueCraft { @@ -16,9 +19,43 @@ namespace TrueCraft var server = new MultiplayerServer(); server.AddWorld(new World("default", new FlatlandGenerator())); server.AddLogProvider(new ConsoleLogProvider(LogCategory.All)); + server.ChatMessageReceived += HandleChatMessageReceived; server.Start(new IPEndPoint(IPAddress.Any, 25565)); while (true) Thread.Sleep(1000); } + + static void HandleChatMessageReceived (object sender, ChatMessageEventArgs e) + { + // TODO: Make this more sophisticated + if (e.Message.StartsWith("/")) + { + e.PreventDefault = true; + var space = e.Message.IndexOf(' '); + if (space == -1) + space = e.Message.Length; + var command = e.Message.Substring(1, space - 1); + var parameters = e.Message.Substring(command.Length + 1).Trim().Split(' '); + switch (command) + { + case "ping": + e.Client.SendMessage(ChatColor.Blue + "Pong!"); + break; + case "give": + if (parameters.Length != 3) + break; + // TODO: Send items to the client mentioned in the command, not the client issuing the command + // TODO: Check to make sure an item with that ID actually exists + short id; + sbyte count; + if (short.TryParse(parameters[1], out id) && sbyte.TryParse(parameters[2], out count)) + { + var inventory = e.Client.Inventory as InventoryWindow; + inventory.PickUpStack(new ItemStack(id, count)); + } + break; + } + } + } } } \ No newline at end of file diff --git a/TrueCraft/RemoteClient.cs b/TrueCraft/RemoteClient.cs index 9729f29..6ffa0ef 100644 --- a/TrueCraft/RemoteClient.cs +++ b/TrueCraft/RemoteClient.cs @@ -27,7 +27,7 @@ namespace TrueCraft LoadedChunks = new List(); Server = server; Inventory = new InventoryWindow(); - InventoryWindow.Hotbar[0] = new ItemStack(1, 64); + InventoryWindow.WindowChange += HandleWindowChange; } public NetworkStream NetworkStream { get; set; } @@ -139,9 +139,13 @@ namespace TrueCraft LoadedChunks.Remove(position); } + void HandleWindowChange(object sender, WindowChangeEventArgs e) + { + QueuePacket(new SetSlotPacket(0, (short)e.SlotIndex, e.Value.Id, e.Value.Count, e.Value.Metadata)); + } + private static ChunkDataPacket CreatePacket(IChunk chunk) { - // TODO: Be smarter about this var X = chunk.Coordinates.X; var Z = chunk.Coordinates.Z;