Files
tbd-station-14/Content.Server/MachineLinking/SignalLinkerSystem.cs
2021-06-09 22:19:39 +02:00

93 lines
2.6 KiB
C#

using System.Collections.Generic;
using Content.Server.Interaction;
using Content.Server.MachineLinking.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.Input;
using Robust.Shared.Input.Binding;
using Robust.Shared.Map;
using Robust.Shared.Network;
using Robust.Shared.Players;
namespace Content.Server.MachineLinking
{
public class SignalLinkerSystem : EntitySystem
{
private readonly Dictionary<NetUserId, SignalTransmitterComponent?> _transmitters = new();
public bool SignalLinkerKeybind(NetUserId id, bool? enable)
{
enable ??= !_transmitters.ContainsKey(id);
if (enable.Value)
{
if (_transmitters.ContainsKey(id))
{
return true;
}
if (_transmitters.Count == 0)
{
CommandBinds.Builder
.BindBefore(EngineKeyFunctions.Use,
new PointerInputCmdHandler(HandleUse),
typeof(InteractionSystem))
.Register<SignalLinkerSystem>();
}
_transmitters.Add(id, null);
}
else
{
if (!_transmitters.ContainsKey(id))
{
return false;
}
_transmitters.Remove(id);
if (_transmitters.Count == 0)
{
CommandBinds.Unregister<SignalLinkerSystem>();
}
}
return enable.Value;
}
private bool HandleUse(ICommonSession? session, EntityCoordinates coords, EntityUid uid)
{
if (session?.AttachedEntity == null)
{
return false;
}
if (!_transmitters.TryGetValue(session.UserId, out var signalTransmitter))
{
return false;
}
if (!EntityManager.TryGetEntity(uid, out var entity))
{
return false;
}
if (entity.TryGetComponent<SignalReceiverComponent>(out var signalReceiver))
{
if (signalReceiver.Interact(session.AttachedEntity, signalTransmitter))
{
return true;
}
}
if (entity.TryGetComponent<SignalTransmitterComponent>(out var transmitter))
{
_transmitters[session.UserId] = transmitter.GetSignal(session.AttachedEntity);
return true;
}
return false;
}
}
}