Implement /give command

This commit is contained in:
Drew DeVault 2014-12-28 19:40:32 -07:00
parent c623bb68a5
commit b0e168077f
4 changed files with 56 additions and 4 deletions

View File

@ -10,6 +10,15 @@ namespace TrueCraft.Core.Networking.Packets
{ {
public byte ID { get { return 0x67; } } 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 sbyte WindowID;
public short SlotIndex; public short SlotIndex;
public short ItemID; public short ItemID;

View File

@ -149,7 +149,8 @@ namespace TrueCraft
for (int i = 0; i < Clients.Count; i++) for (int i = 0; i < Clients.Count; i++)
{ {
var client = Clients[i] as RemoteClient; 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; IPacket packet;
while (!client.PacketQueue.TryDequeue(out packet)) { } while (!client.PacketQueue.TryDequeue(out packet)) { }
@ -161,7 +162,8 @@ namespace TrueCraft
break; break;
} }
} }
if (client.DataAvailable) var receiveTimeout = DateTime.Now.AddMilliseconds(50);
while (client.DataAvailable && DateTime.Now < receiveTimeout)
{ {
var packet = PacketReader.ReadPacket(client.MinecraftStream); var packet = PacketReader.ReadPacket(client.MinecraftStream);
if (PacketHandlers[packet.ID] != null) if (PacketHandlers[packet.ID] != null)

View File

@ -5,6 +5,9 @@ using TrueCraft.Core.World;
using TrueCraft.Core.TerrainGen; using TrueCraft.Core.TerrainGen;
using TrueCraft.Core.Logging; using TrueCraft.Core.Logging;
using TrueCraft.API.Logging; using TrueCraft.API.Logging;
using TrueCraft.API.Server;
using TrueCraft.API;
using TrueCraft.Core.Windows;
namespace TrueCraft namespace TrueCraft
{ {
@ -16,9 +19,43 @@ namespace TrueCraft
var server = new MultiplayerServer(); var server = new MultiplayerServer();
server.AddWorld(new World("default", new FlatlandGenerator())); server.AddWorld(new World("default", new FlatlandGenerator()));
server.AddLogProvider(new ConsoleLogProvider(LogCategory.All)); server.AddLogProvider(new ConsoleLogProvider(LogCategory.All));
server.ChatMessageReceived += HandleChatMessageReceived;
server.Start(new IPEndPoint(IPAddress.Any, 25565)); server.Start(new IPEndPoint(IPAddress.Any, 25565));
while (true) while (true)
Thread.Sleep(1000); 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;
}
}
}
} }
} }

View File

@ -27,7 +27,7 @@ namespace TrueCraft
LoadedChunks = new List<Coordinates2D>(); LoadedChunks = new List<Coordinates2D>();
Server = server; Server = server;
Inventory = new InventoryWindow(); Inventory = new InventoryWindow();
InventoryWindow.Hotbar[0] = new ItemStack(1, 64); InventoryWindow.WindowChange += HandleWindowChange;
} }
public NetworkStream NetworkStream { get; set; } public NetworkStream NetworkStream { get; set; }
@ -139,9 +139,13 @@ namespace TrueCraft
LoadedChunks.Remove(position); 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) private static ChunkDataPacket CreatePacket(IChunk chunk)
{ {
// TODO: Be smarter about this
var X = chunk.Coordinates.X; var X = chunk.Coordinates.X;
var Z = chunk.Coordinates.Z; var Z = chunk.Coordinates.Z;