using System;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Network;
using Robust.Shared.IoC;
using Robust.Shared.Network.Messages;
namespace Robust.Client.GameObjects
{
public class ClientEntityNetworkManager : IEntityNetworkManager
{
#pragma warning disable 649
[Dependency] private readonly IClientNetManager _network;
[Dependency] private readonly IEntitySystemManager _entitySystemManager;
[Dependency] private readonly IEntityManager _entityManager;
#pragma warning restore 649
///
public void SetupNetworking()
{
_network.RegisterNetMessage(MsgEntity.NAME, HandleEntityNetworkMessage);
}
///
/// Sends a message to the relevant system(s) server side.
///
public void SendSystemNetworkMessage(EntitySystemMessage message)
{
var msg = _network.CreateNetMessage();
msg.Type = EntityMessageType.SystemMessage;
msg.SystemMessage = message;
_network.ClientSendMessage(msg);
}
public void SendSystemNetworkMessage(EntitySystemMessage message, INetChannel channel)
{
throw new NotSupportedException();
}
///
public void SendComponentNetworkMessage(INetChannel channel, IEntity entity, IComponent component, ComponentMessage message)
{
if (!component.NetID.HasValue)
throw new ArgumentException($"Component {component.Name} does not have a NetID.", nameof(component));
var msg = _network.CreateNetMessage();
msg.Type = EntityMessageType.ComponentMessage;
msg.EntityUid = entity.Uid;
msg.NetId = component.NetID.Value;
msg.ComponentMessage = message;
_network.ClientSendMessage(msg);
}
///
public void SendEntityNetworkMessage(IEntity entity, EntityEventArgs message)
{
var msg = _network.CreateNetMessage();
msg.Type = EntityMessageType.EntityMessage;
msg.EntityUid = entity.Uid;
msg.EntityMessage = message;
_network.ClientSendMessage(msg);
}
///
/// Converts a raw NetIncomingMessage to an IncomingEntityMessage object
///
/// raw network message
/// An IncomingEntityMessage object
private void HandleEntityNetworkMessage(MsgEntity message)
{
switch (message.Type)
{
case EntityMessageType.ComponentMessage:
_entityManager.HandleEntityNetworkMessage(message);
return;
case EntityMessageType.EntityMessage:
return;
case EntityMessageType.SystemMessage:
_entitySystemManager.HandleSystemMessage(message);
return;
}
}
}
}