Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Ross L 2015-05-08 19:52:05 -04:00
commit e11ce99dd8
15 changed files with 292 additions and 150 deletions

View File

@ -11,7 +11,7 @@ namespace TrueCraft.API.Server
string Name { get; }
string Description { get; }
string[] Aliases { get; }
void Handle(IRemoteClient Client, string Alias, string[] Arguments);
void Help(IRemoteClient Client, string Alias, string[] Arguments);
void Handle(IRemoteClient client, string alias, string[] arguments);
void Help(IRemoteClient client, string alias, string[] arguments);
}
}

View File

@ -73,5 +73,10 @@ namespace TrueCraft.Core.Logic.Blocks
{
return new Tuple<int, int>(3, 4);
}
protected override ItemStack[] GetDrop(BlockDescriptor descriptor)
{
return new[] { new ItemStack(SnowballItem.ItemID) };
}
}
}

View File

@ -45,7 +45,7 @@ namespace TrueCraft.Core.World
}
set
{
// TODO
BaseTime = DateTime.Now.AddSeconds(-value/20);
}
}

View File

@ -15,8 +15,8 @@ namespace TrueCraft.Commands
public virtual string[] Aliases { get { return new string[0]; } }
public virtual void Handle(IRemoteClient Client, string Alias, string[] Arguments) { Help(Client, Alias, Arguments); }
public virtual void Handle(IRemoteClient Client, string alias, string[] arguments) { Help(Client, alias, arguments); }
public virtual void Help(IRemoteClient Client, string Alias, string[] Arguments) { Client.SendMessage("Command \"" + Alias + "\" is not functional!"); }
public virtual void Help(IRemoteClient client, string alias, string[] arguments) { client.SendMessage("Command \"" + alias + "\" is not functional!"); }
}
}

View File

@ -21,6 +21,7 @@ namespace TrueCraft.Commands
{
Commands.Add(new PingCommand());
Commands.Add(new GiveCommand());
Commands.Add(new GiveMeCommand());
Commands.Add(new HelpCommand());
Commands.Add(new ResendInvCommand());
Commands.Add(new PositionCommand());

View File

@ -1,10 +1,4 @@
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.API.Networking;
using TrueCraft.Core.Networking.Packets;
namespace TrueCraft.Commands
@ -26,19 +20,19 @@ namespace TrueCraft.Commands
get { return new string[0]; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (Arguments.Length != 0)
if (arguments.Length != 0)
{
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
return;
}
Client.SendMessage(Client.Entity.Position.ToString());
client.SendMessage(client.Entity.Position.ToString());
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("/pos: Shows your position.");
client.SendMessage("/pos: Shows your position.");
}
}
@ -59,55 +53,22 @@ namespace TrueCraft.Commands
get { return new string[0]; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (Arguments.Length != 0)
if (arguments.Length != 0)
{
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
return;
}
Client.EnableLogging = !Client.EnableLogging;
client.EnableLogging = !client.EnableLogging;
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("/pos: Toggles client logging.");
client.SendMessage("/pos: Toggles client logging.");
}
}
public class TimeCommand : Command
{
public override string Name
{
get { return "time"; }
}
public override string Description
{
get { return "Shows the current time."; }
}
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.SendMessage(Client.World.Time.ToString());
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
{
Client.SendMessage("/time: Shows the current time.");
}
}
public class ResendInvCommand : Command
{
public override string Name
@ -125,19 +86,19 @@ namespace TrueCraft.Commands
get { return new string[0]; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (Arguments.Length != 1)
if (arguments.Length != 0)
{
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
return;
}
Client.QueuePacket(new WindowItemsPacket(0, Client.Inventory.GetSlots()));
client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots()));
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("/reinv: Resends your inventory.");
client.SendMessage("/reinv: Resends your inventory.");
}
}
}

View File

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrueCraft.Core.Windows;
using TrueCraft.API;
using TrueCraft.API.Networking;
@ -25,39 +23,79 @@ namespace TrueCraft.Commands
get { return new string[1]{ "i" }; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (Arguments.Length != 4)
if (arguments.Length < 2)
{
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
return;
}
string username = arguments[0],
itemid = arguments[1],
amount = "1";
if(arguments.Length >= 3)
amount = arguments[2];
var receiver = Client.Server.Clients.SingleOrDefault(c => c.Username == Arguments[1]);
short id;
sbyte count;
if (short.TryParse(Arguments[2], out id) && sbyte.TryParse(Arguments[3], out count))
var receivingPlayer = GetPlayerByName(client, username);
if (receivingPlayer == null)
{
if (receiver == null)
{
Client.SendMessage("No client with the username \"" + Arguments[1] + "\" was found.");
return;
}
client.SendMessage("No client with the username \"" + username + "\" was found.");
return;
}
if (Client.Server.ItemRepository.GetItemProvider(id) == null)
{
Client.SendMessage("Invalid item id \"" + id + "\".");
return;
}
var inventory = receiver.Inventory as InventoryWindow;
inventory.PickUpStack(new ItemStack(id, count));
if (!GiveItem(receivingPlayer, itemid, amount, client))
{
Help(client, alias, arguments);
}
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
protected static IRemoteClient GetPlayerByName(IRemoteClient client, string username)
{
Client.SendMessage("Correct usage is /" + Alias + " <User> <Item ID> <Amount>");
var receivingPlayer =
client.Server.Clients.FirstOrDefault(
c => String.Equals(c.Username, username, StringComparison.CurrentCultureIgnoreCase));
return receivingPlayer;
}
protected static bool GiveItem(IRemoteClient receivingPlayer, string itemid, string amount, IRemoteClient client)
{
short id;
int count;
if (!short.TryParse(itemid, out id) || !Int32.TryParse(amount, out count)) return false;
if (client.Server.ItemRepository.GetItemProvider(id) == null)
{
client.SendMessage("Invalid item id \"" + id + "\".");
return true;
}
string username = receivingPlayer.Username;
var inventory = receivingPlayer.Inventory as InventoryWindow;
if (inventory == null) return false;
while (count > 0)
{
sbyte amountToGive;
if (count >= 64)
amountToGive = 64;
else
amountToGive = (sbyte) count;
count -= amountToGive;
inventory.PickUpStack(new ItemStack(id, amountToGive));
}
return true;
}
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
client.SendMessage("Correct usage is /" + alias + " <User> <Item ID> [Amount]");
}
}
}

View File

@ -0,0 +1,49 @@
using TrueCraft.API.Networking;
namespace TrueCraft.Commands
{
public class GiveMeCommand : GiveCommand
{
public override string Name
{
get { return "giveme"; }
}
public override string[] Aliases
{
get { return new string[0]; }
}
public override string Description
{
get { return "Give yourself an amount of items."; }
}
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (arguments.Length < 1)
{
Help(client, alias, arguments);
return;
}
string itemid = arguments[0],
amount = "1";
if (arguments.Length >= 2)
amount = arguments[1];
var receivingPlayer = client;
if (!GiveItem(receivingPlayer, itemid, amount, client))
{
Help(client, alias, arguments);
}
}
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
client.SendMessage("Correct usage is /" + alias + " <Item ID> [Amount]");
}
}
}

View File

@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrueCraft.API.Networking;
using TrueCraft.API.Server;
@ -19,63 +16,64 @@ namespace TrueCraft.Commands
get { return "Command help menu."; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
if (Arguments.Length < 1)
if (arguments.Length < 1)
{
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
return;
}
string Identifier = Arguments[0];
ICommand Found = null;
if ((Found = Program.CommandManager.FindByName(Identifier)) != null)
var identifier = arguments.Length >= 1 ? arguments[0] : "0";
ICommand found;
if ((found = Program.CommandManager.FindByName(identifier)) != null)
{
Found.Handle(Client, Identifier, new string[0]);
found.Handle(client, identifier, new string[0]);
return;
}
else if ((Found = Program.CommandManager.FindByAlias(Identifier)) != null)
else if ((found = Program.CommandManager.FindByAlias(identifier)) != null)
{
Found.Help(Client, Identifier, new string[0]);
found.Help(client, identifier, new string[0]);
return;
}
int PageNumber = 0;
if (int.TryParse(Identifier, out PageNumber))
int pageNumber;
if (int.TryParse(identifier, out pageNumber))
{
HelpPage(Client, PageNumber);
HelpPage(client, pageNumber);
return;
}
Help(Client, Alias, Arguments);
Help(client, alias, arguments);
}
public void HelpPage(IRemoteClient Client, int Page)
public void HelpPage(IRemoteClient client, int page)
{
int PerPage = 5;
int Pages = (int)Math.Floor((double)(Program.CommandManager.Commands.Count / PerPage));
if ((Program.CommandManager.Commands.Count % PerPage) > 0)
Pages++;
const int perPage = 5;
int numPages = (int)Math.Floor(((double)Program.CommandManager.Commands.Count / perPage));
if ((Program.CommandManager.Commands.Count % perPage) > 0)
numPages++;
if (Page < 1 || Page > Pages)
Page = 1;
if (page < 1 || page > numPages)
page = 1;
int StartingIndex = (Page - 1) * PerPage;
Client.SendMessage("--Help Page " + Page + " of " + Pages + "--");
for (int i = 0; i < PerPage; i++)
int startingIndex = (page - 1) * perPage;
client.SendMessage("--Help page " + page + " of " + numPages + "--");
for (int i = 0; i < perPage; i++)
{
int Index = StartingIndex + i;
if (Index > Program.CommandManager.Commands.Count - 1)
int index = startingIndex + i;
if (index > Program.CommandManager.Commands.Count - 1)
{
break;
}
ICommand C = Program.CommandManager.Commands[Index];
Client.SendMessage("/" + C.Name + " - " + C.Description);
var command = Program.CommandManager.Commands[index];
client.SendMessage("/" + command.Name + " - " + command.Description);
}
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("Correct usage is /" + Alias + " <page#/command> [command arguments]");
client.SendMessage("Correct usage is /" + alias + " <page#/command> [command arguments]");
}
}
}

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrueCraft.API.Networking;
using TrueCraft.API.Networking;
namespace TrueCraft.Commands
{
@ -18,14 +14,14 @@ namespace TrueCraft.Commands
get { return "Ping pong"; }
}
public override void Handle(IRemoteClient Client, string Alias, string[] Arguments)
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("Pong!");
client.SendMessage("Pong!");
}
public override void Help(IRemoteClient Client, string Alias, string[] Arguments)
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
Client.SendMessage("Correct usage is /" + Alias);
client.SendMessage("Correct usage is /" + alias);
}
}
}

View File

@ -0,0 +1,60 @@
using System;
using System.Linq;
using TrueCraft.API.Networking;
using TrueCraft.Core.Networking.Packets;
namespace TrueCraft.Commands
{
public class TimeCommand : Command
{
public override string Name
{
get { return "time"; }
}
public override string Description
{
get { return "Shows the current time."; }
}
public override string[] Aliases
{
get { return new string[0]; }
}
public override void Handle(IRemoteClient client, string alias, string[] arguments)
{
switch (arguments.Length)
{
case 0:
client.SendMessage(client.World.Time.ToString());
break;
case 2:
if (!arguments[0].Equals("set"))
Help(client, alias, arguments);
int newTime;
if(!Int32.TryParse(arguments[1], out newTime))
Help(client, alias, arguments);
client.World.Time = newTime;
client.SendMessage(string.Format("Setting time to {0}", arguments[1]));
foreach (var remoteClient in client.Server.Clients.Where(c => c.World.Equals(client.World)))
remoteClient.QueuePacket(new TimeUpdatePacket(newTime));
break;
default:
Help(client, alias, arguments);
break;
}
}
public override void Help(IRemoteClient client, string alias, string[] arguments)
{
client.SendMessage("/time: Shows the current time.");
}
}
}

View File

@ -1,6 +1,9 @@
using System;
using System.ComponentModel;
using TrueCraft.API;
using YamlDotNet.Core;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NodeDeserializers;
namespace TrueCraft
{
@ -27,6 +30,7 @@ namespace TrueCraft
Debug = new DebugConfiguration();
ServerPort = 25565;
ServerAddress = "0.0.0.0";
WorldSaveInterval = 30;
}
[YamlMember(Alias="motd")]
@ -36,9 +40,13 @@ namespace TrueCraft
public int ServerPort {get; set; }
[YamlMember(Alias="serverAddress")]
public string ServerAddress{get; set; }
[YamlMember(Alias="debug")]
public string ServerAddress { get; set; }
[YamlMember(Alias = "debug")]
public DebugConfiguration Debug { get; set; }
[YamlMember(Alias = "worldSaveInterval")]
public int WorldSaveInterval { get; set; }
}
}

View File

@ -46,8 +46,6 @@ namespace TrueCraft.Handlers
var server = (MultiplayerServer)_server;
var args = new ChatMessageEventArgs(_client, packet.Message);
server.OnChatMessageReceived(args);
if (!args.PreventDefault)
server.SendMessage("<{0}> {1}", _client.Username, packet.Message);
}
internal static void HandleDisconnect(IPacket _packet, IRemoteClient _client, IMultiplayerServer server)

View File

@ -9,7 +9,6 @@ using System.IO;
using TrueCraft.Commands;
using TrueCraft.API.World;
using System;
using TrueCraft.Core;
using TrueCraft.API;
using YamlDotNet.Serialization;
@ -60,7 +59,7 @@ namespace TrueCraft
}
catch
{
world = new World("default", 1922464833, new StandardGenerator());
world = new World("default", new StandardGenerator());
world.BlockRepository = Server.BlockRepository;
world.Save("world");
Server.AddWorld(world);
@ -104,7 +103,7 @@ namespace TrueCraft
Console.CancelKeyPress += HandleCancelKeyPress;
while (true)
{
Thread.Sleep(1000 * 30); // TODO: Allow users to customize world save interval
Thread.Sleep(1000 * Configuration.WorldSaveInterval);
foreach (var w in Server.Worlds)
{
w.Save();
@ -119,14 +118,43 @@ namespace TrueCraft
static void HandleChatMessageReceived(object sender, ChatMessageEventArgs e)
{
if (e.Message.StartsWith("/"))
{
e.PreventDefault = true;
var messageArray = e.Message.TrimStart('/')
.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
CommandManager.HandleCommand(e.Client, messageArray[0], messageArray);
return;
}
var message = e.Message;
if (!message.StartsWith("/") || message.StartsWith("//"))
SendChatMessage(e.Client.Username, message);
else
e.PreventDefault = ProcessChatCommand(e);
}
private static void SendChatMessage(string username, string message)
{
if (message.StartsWith("//"))
message = message.Substring(1);
Server.SendMessage("<{0}> {1}", username, message);
}
/// <summary>
/// Parse sent message as chat command
/// </summary>
/// <param name="e"></param>
/// <returns>true if the command was successfully executed</returns>
private static bool ProcessChatCommand(ChatMessageEventArgs e)
{
var commandWithoutSlash = e.Message.TrimStart('/');
var messageArray = commandWithoutSlash
.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (messageArray.Length <= 0) return false; // command not found
var alias = messageArray[0];
var trimmedMessageArray = new string[messageArray.Length - 1];
if (trimmedMessageArray.Length != 0)
Array.Copy(messageArray, 1, trimmedMessageArray, 0, messageArray.Length - 1);
CommandManager.HandleCommand(e.Client, alias, trimmedMessageArray);
return true;
}
}
}
}

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -41,8 +41,10 @@
<Compile Include="Commands\Command.cs" />
<Compile Include="Commands\CommandManager.cs" />
<Compile Include="Commands\GiveCommand.cs" />
<Compile Include="Commands\GiveMeCommand.cs" />
<Compile Include="Commands\HelpCommand.cs" />
<Compile Include="Commands\PingCommand.cs" />
<Compile Include="Commands\TimeCommand.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="MultiplayerServer.cs" />
@ -77,9 +79,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Folder Include="Exceptions\" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>