Files
RobustToolbox/SS14.Server/GameObjects/ServerEntityNetworkManager.cs
2018-11-12 23:26:46 +01:00

110 lines
3.5 KiB
C#

using System;
using SS14.Shared.GameObjects;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.IoC;
using SS14.Shared.Network.Messages;
namespace SS14.Server.GameObjects
{
public class ServerEntityNetworkManager : IEntityNetworkManager
{
[Dependency]
private readonly IServerNetManager _mNetManager;
[Dependency]
private readonly IEntitySystemManager _entitySystemManager;
#region IEntityNetworkManager Members
/// <inheritdoc />
public void SendEntityNetworkMessage(IEntity entity, EntityEventArgs message)
{
throw new NotImplementedException();
}
public void SendComponentNetworkMessage(IEntity entity, IComponent component, ComponentMessage message)
{
throw new NotImplementedException();
}
#endregion IEntityNetworkManager Members
#region Sending
/// <inheritdoc />
public void SendDirectedComponentNetworkMessage(INetChannel channel, IEntity entity, IComponent component, ComponentMessage message)
{
if (_mNetManager.IsClient)
return;
if (!component.NetID.HasValue)
throw new ArgumentException($"Component {component.Name} does not have a NetID.", nameof(component));
var msg = _mNetManager.CreateNetMessage<MsgEntity>();
msg.Type = EntityMessageType.ComponentMessage;
msg.EntityUid = entity.Uid;
msg.NetId = component.NetID.Value;
msg.ComponentMessage = message;
//Send the message
if (channel == null)
{
_mNetManager.ServerSendToAll(msg);
}
else
{
_mNetManager.ServerSendMessage(msg, channel);
}
}
/// <summary>
/// Sends a message to the relevant system(s) on all clients.
/// </summary>
public void SendSystemNetworkMessage(EntitySystemMessage message)
{
var newMsg = _mNetManager.CreateNetMessage<MsgEntity>();
newMsg.Type = EntityMessageType.SystemMessage;
newMsg.SystemMessage = message;
_mNetManager.ServerSendToAll(newMsg);
}
/// <summary>
/// Sends a message to the relevant system(s) on the target client.
/// </summary>
public void SendSystemNetworkMessage(EntitySystemMessage message, INetChannel targetConnection)
{
var newMsg = _mNetManager.CreateNetMessage<MsgEntity>();
newMsg.Type = EntityMessageType.SystemMessage;
newMsg.SystemMessage = message;
_mNetManager.ServerSendMessage(newMsg, targetConnection);
}
#endregion Sending
/// <summary>
/// Handles an incoming entity message
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public IncomingEntityMessage HandleEntityNetworkMessage(MsgEntity message)
{
switch (message.Type)
{
case EntityMessageType.ComponentMessage:
return new IncomingEntityMessage(message);
case EntityMessageType.EntityMessage:
// TODO: Handle this.
break;
case EntityMessageType.SystemMessage:
_entitySystemManager.HandleSystemMessage(message);
break;
}
return null;
}
}
}