Add event handler for chat messages
This commit is contained in:
parent
152c268fbd
commit
c623bb68a5
22
TrueCraft.API/Server/ChatMessageEventArgs.cs
Normal file
22
TrueCraft.API/Server/ChatMessageEventArgs.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using TrueCraft.API.Networking;
|
||||||
|
|
||||||
|
namespace TrueCraft.API.Server
|
||||||
|
{
|
||||||
|
public class ChatMessageEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public ChatMessageEventArgs(IRemoteClient client, string message)
|
||||||
|
{
|
||||||
|
Client = client;
|
||||||
|
Message = message;
|
||||||
|
PreventDefault = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IRemoteClient Client { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// If set to true, the server won't send the default message back to the client.
|
||||||
|
/// </summary>
|
||||||
|
public bool PreventDefault { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,8 @@ namespace TrueCraft.API.Server
|
|||||||
|
|
||||||
public interface IMultiplayerServer
|
public interface IMultiplayerServer
|
||||||
{
|
{
|
||||||
|
event EventHandler<ChatMessageEventArgs> ChatMessageReceived;
|
||||||
|
|
||||||
IPacketReader PacketReader { get; }
|
IPacketReader PacketReader { get; }
|
||||||
IList<IRemoteClient> Clients { get; }
|
IList<IRemoteClient> Clients { get; }
|
||||||
IList<IWorld> Worlds { get; }
|
IList<IWorld> Worlds { get; }
|
||||||
@ -26,5 +28,6 @@ namespace TrueCraft.API.Server
|
|||||||
void AddLogProvider(ILogProvider provider);
|
void AddLogProvider(ILogProvider provider);
|
||||||
void Log(LogCategory category, string text, params object[] parameters);
|
void Log(LogCategory category, string text, params object[] parameters);
|
||||||
IEntityManager GetEntityManagerForWorld(IWorld world);
|
IEntityManager GetEntityManagerForWorld(IWorld world);
|
||||||
|
void SendMessage(string message, params object[] parameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -72,6 +72,7 @@
|
|||||||
<Compile Include="Logic\IBlockProvider.cs" />
|
<Compile Include="Logic\IBlockProvider.cs" />
|
||||||
<Compile Include="Logic\IItemProvider.cs" />
|
<Compile Include="Logic\IItemProvider.cs" />
|
||||||
<Compile Include="ChatColor.cs" />
|
<Compile Include="ChatColor.cs" />
|
||||||
|
<Compile Include="Server\ChatMessageEventArgs.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -30,19 +30,19 @@ namespace TrueCraft.Handlers
|
|||||||
client.QueuePacket(new DisconnectPacket("Server has no worlds configured."));
|
client.QueuePacket(new DisconnectPacket("Server has no worlds configured."));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
server.Log(LogCategory.Notice, "{0} joined the server.", client.Username); // TODO: Mention the same thing in chat
|
|
||||||
client.LoggedIn = true;
|
client.LoggedIn = true;
|
||||||
client.Entity = new PlayerEntity(client.Username);
|
client.Entity = new PlayerEntity(client.Username);
|
||||||
client.World = server.Worlds[0];
|
client.World = server.Worlds[0];
|
||||||
server.GetEntityManagerForWorld(client.World).SpawnEntity(client.Entity);
|
server.GetEntityManagerForWorld(client.World).SpawnEntity(client.Entity);
|
||||||
client.QueuePacket(new LoginResponsePacket(0, 0, Dimension.Overworld));
|
client.QueuePacket(new LoginResponsePacket(0, 0, Dimension.Overworld));
|
||||||
client.ChunkRadius = 2;
|
client.ChunkRadius = 3;
|
||||||
client.UpdateChunks();
|
client.UpdateChunks();
|
||||||
client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots()));
|
client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots()));
|
||||||
client.QueuePacket(new SpawnPositionPacket(0, 16, 0));
|
client.QueuePacket(new SpawnPositionPacket(0, 16, 0));
|
||||||
client.QueuePacket(new SetPlayerPositionPacket(0, 16, 17, 0, 0, 0, true));
|
client.QueuePacket(new SetPlayerPositionPacket(0, 16, 17, 0, 0, 0, true));
|
||||||
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(10), client.SendKeepAlive);
|
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(10), client.SendKeepAlive);
|
||||||
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), client.ExpandChunkRadius);
|
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), client.ExpandChunkRadius);
|
||||||
|
server.SendMessage(ChatColor.Yellow + "{0} joined the server.", client.Username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ using TrueCraft.API;
|
|||||||
using TrueCraft.API.Server;
|
using TrueCraft.API.Server;
|
||||||
using TrueCraft.Core.Networking.Packets;
|
using TrueCraft.Core.Networking.Packets;
|
||||||
using TrueCraft.API.Networking;
|
using TrueCraft.API.Networking;
|
||||||
|
using TrueCraft.API.Logging;
|
||||||
|
|
||||||
namespace TrueCraft.Handlers
|
namespace TrueCraft.Handlers
|
||||||
{
|
{
|
||||||
@ -27,15 +28,16 @@ namespace TrueCraft.Handlers
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void HandleChatMessage(IPacket _packet, IRemoteClient _client, IMultiplayerServer server)
|
internal static void HandleChatMessage(IPacket _packet, IRemoteClient _client, IMultiplayerServer _server)
|
||||||
{
|
{
|
||||||
// TODO: Abstract this to support things like commands
|
// TODO: Abstract this to support things like commands
|
||||||
// TODO: Sanitize messages
|
// TODO: Sanitize messages
|
||||||
var packet = (ChatMessagePacket)_packet;
|
var packet = (ChatMessagePacket)_packet;
|
||||||
foreach (var client in server.Clients)
|
var server = (MultiplayerServer)_server;
|
||||||
{
|
var args = new ChatMessageEventArgs(_client, packet.Message);
|
||||||
client.SendMessage(ChatColor.Yellow + string.Format("<{0}> {1}", _client.Username, packet.Message));
|
server.OnChatMessageReceived(args);
|
||||||
}
|
if (!args.PreventDefault)
|
||||||
|
server.SendMessage("<{0}> {1}", _client.Username, packet.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,11 +9,14 @@ using System.Collections.Generic;
|
|||||||
using TrueCraft.API.World;
|
using TrueCraft.API.World;
|
||||||
using TrueCraft.API.Logging;
|
using TrueCraft.API.Logging;
|
||||||
using TrueCraft.Core.Networking.Packets;
|
using TrueCraft.Core.Networking.Packets;
|
||||||
|
using TrueCraft.API;
|
||||||
|
|
||||||
namespace TrueCraft
|
namespace TrueCraft
|
||||||
{
|
{
|
||||||
public class MultiplayerServer : IMultiplayerServer
|
public class MultiplayerServer : IMultiplayerServer
|
||||||
{
|
{
|
||||||
|
public event EventHandler<ChatMessageEventArgs> ChatMessageReceived;
|
||||||
|
|
||||||
public IPacketReader PacketReader { get; private set; }
|
public IPacketReader PacketReader { get; private set; }
|
||||||
public IList<IRemoteClient> Clients { get; private set; }
|
public IList<IRemoteClient> Clients { get; private set; }
|
||||||
public IList<IWorld> Worlds { get; private set; }
|
public IList<IWorld> Worlds { get; private set; }
|
||||||
@ -104,6 +107,22 @@ namespace TrueCraft
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendMessage(string message, params object[] parameters)
|
||||||
|
{
|
||||||
|
var compiled = string.Format(message, parameters);
|
||||||
|
foreach (var client in Clients)
|
||||||
|
{
|
||||||
|
client.SendMessage(compiled);
|
||||||
|
Log(LogCategory.Notice, compiled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected internal void OnChatMessageReceived(ChatMessageEventArgs e)
|
||||||
|
{
|
||||||
|
if (ChatMessageReceived != null)
|
||||||
|
ChatMessageReceived(this, e);
|
||||||
|
}
|
||||||
|
|
||||||
private void DisconnectClient(IRemoteClient _client)
|
private void DisconnectClient(IRemoteClient _client)
|
||||||
{
|
{
|
||||||
var client = (RemoteClient)_client;
|
var client = (RemoteClient)_client;
|
||||||
@ -130,7 +149,7 @@ 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;
|
||||||
if (client.PacketQueue.Count != 0)
|
while (client.PacketQueue.Count != 0)
|
||||||
{
|
{
|
||||||
IPacket packet;
|
IPacket packet;
|
||||||
while (!client.PacketQueue.TryDequeue(out packet)) { }
|
while (!client.PacketQueue.TryDequeue(out packet)) { }
|
||||||
@ -139,6 +158,7 @@ namespace TrueCraft
|
|||||||
{
|
{
|
||||||
DisconnectClient(client);
|
DisconnectClient(client);
|
||||||
i--;
|
i--;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (client.DataAvailable)
|
if (client.DataAvailable)
|
||||||
|
Reference in New Issue
Block a user