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 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;
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user