Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Daniel Vidmar 2015-01-26 06:21:21 -05:00
commit 64c9cd30db
7 changed files with 142 additions and 7 deletions

View File

@ -30,17 +30,23 @@ namespace TrueCraft.Core.Networking.Packets
WindowID = stream.ReadInt8(); WindowID = stream.ReadInt8();
SlotIndex = stream.ReadInt16(); SlotIndex = stream.ReadInt16();
ItemID = stream.ReadInt16(); ItemID = stream.ReadInt16();
if (ItemID != -1)
{
Count = stream.ReadInt8(); Count = stream.ReadInt8();
Metadata = stream.ReadInt16(); Metadata = stream.ReadInt16();
} }
}
public void WritePacket(IMinecraftStream stream) public void WritePacket(IMinecraftStream stream)
{ {
stream.WriteInt8(WindowID); stream.WriteInt8(WindowID);
stream.WriteInt16(SlotIndex); stream.WriteInt16(SlotIndex);
stream.WriteInt16(ItemID); stream.WriteInt16(ItemID);
if (ItemID != -1)
{
stream.WriteInt8(Count); stream.WriteInt8(Count);
stream.WriteInt16(Metadata); stream.WriteInt16(Metadata);
} }
} }
} }
}

View File

@ -22,6 +22,7 @@ namespace TrueCraft.Commands
Commands.Add(new PingCommand()); Commands.Add(new PingCommand());
Commands.Add(new GiveCommand()); Commands.Add(new GiveCommand());
Commands.Add(new HelpCommand()); Commands.Add(new HelpCommand());
Commands.Add(new ResendInvCommand());
} }
/// <summary> /// <summary>

View File

@ -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.");
}
}
}

View File

@ -62,7 +62,7 @@ namespace TrueCraft.Handlers
{ {
if (use) if (use)
{ {
// Temporary // Temporary: just place the damn thing
position += MathHelper.BlockFaceToCoordinates(packet.Face); position += MathHelper.BlockFaceToCoordinates(packet.Face);
client.World.SetBlockID(position, (byte)slot.Id); client.World.SetBlockID(position, (byte)slot.Id);
client.World.SetMetadata(position, (byte)slot.Metadata); 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) public static void HandleChangeHeldItem(IPacket _packet, IRemoteClient _client, IMultiplayerServer server)
{ {
var packet = (ChangeHeldItemPacket)_packet; var packet = (ChangeHeldItemPacket)_packet;

View File

@ -23,6 +23,7 @@ namespace TrueCraft.Handlers
server.RegisterPacketHandler(new PlayerDiggingPacket().ID, InteractionHandlers.HandlePlayerDiggingPacket); server.RegisterPacketHandler(new PlayerDiggingPacket().ID, InteractionHandlers.HandlePlayerDiggingPacket);
server.RegisterPacketHandler(new PlayerBlockPlacementPacket().ID, InteractionHandlers.HandlePlayerBlockPlacementPacket); server.RegisterPacketHandler(new PlayerBlockPlacementPacket().ID, InteractionHandlers.HandlePlayerBlockPlacementPacket);
server.RegisterPacketHandler(new ChangeHeldItemPacket().ID, InteractionHandlers.HandleChangeHeldItem); server.RegisterPacketHandler(new ChangeHeldItemPacket().ID, InteractionHandlers.HandleChangeHeldItem);
server.RegisterPacketHandler(new ClickWindowPacket().ID, InteractionHandlers.HandleClickWindowPacket);
} }
internal static void HandleKeepAlive(IPacket _packet, IRemoteClient _client, IMultiplayerServer server) internal static void HandleKeepAlive(IPacket _packet, IRemoteClient _client, IMultiplayerServer server)

View File

@ -31,6 +31,8 @@ namespace TrueCraft
Inventory = new InventoryWindow(); Inventory = new InventoryWindow();
InventoryWindow.WindowChange += HandleWindowChange; InventoryWindow.WindowChange += HandleWindowChange;
SelectedSlot = InventoryWindow.HotbarIndex; SelectedSlot = InventoryWindow.HotbarIndex;
CurrentWindow = InventoryWindow;
ItemStaging = ItemStack.EmptyStack;
} }
public NetworkStream NetworkStream { get; set; } public NetworkStream NetworkStream { get; set; }
@ -43,6 +45,8 @@ namespace TrueCraft
public IEntity Entity { get; internal set; } public IEntity Entity { get; internal set; }
public IWindow Inventory { get; private set; } public IWindow Inventory { get; private set; }
public short SelectedSlot { get; internal set; } public short SelectedSlot { get; internal set; }
public ItemStack ItemStaging { get; set; }
public IWindow CurrentWindow { get; set; }
public ItemStack SelectedItem public ItemStack SelectedItem
{ {
@ -86,7 +90,6 @@ namespace TrueCraft
if (ChunkRadius < 16) // TODO: Allow customization of this number if (ChunkRadius < 16) // TODO: Allow customization of this number
{ {
ChunkRadius++; ChunkRadius++;
Console.WriteLine("Expanding chunk radius to {0}", ChunkRadius);
UpdateChunks(); UpdateChunks();
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), ExpandChunkRadius); server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), ExpandChunkRadius);
} }

View File

@ -56,6 +56,7 @@
<Compile Include="Entities\ObjectEntity.cs" /> <Compile Include="Entities\ObjectEntity.cs" />
<Compile Include="Entities\PlayerEntity.cs" /> <Compile Include="Entities\PlayerEntity.cs" />
<Compile Include="Handlers\InteractionHandlers.cs" /> <Compile Include="Handlers\InteractionHandlers.cs" />
<Compile Include="Commands\DebugCommands.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>