Implement /give command
This commit is contained in:
parent
c623bb68a5
commit
b0e168077f
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -27,7 +27,7 @@ namespace TrueCraft
|
||||
LoadedChunks = new List<Coordinates2D>();
|
||||
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;
|
||||
|
||||
|
Reference in New Issue
Block a user