Пару изменений (#468)
* fix: Двери больше нельзя моментально открыть голыми руками * add: Несколько целевой пинпоинтер для оперативников синдиката * add: Боеголовка синдиката
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
using Content.Shared._White.Pinpointer;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Pinpointer;
|
||||
|
||||
namespace Content.Server.Pinpointer;
|
||||
|
||||
public sealed partial class PinpointerSystem
|
||||
{
|
||||
public void InitializeMultiplePinpointer()
|
||||
{
|
||||
SubscribeLocalEvent<MultiplePinpointerComponent, ComponentStartup>(OnMultiplePinpointerStartup);
|
||||
SubscribeLocalEvent<MultiplePinpointerComponent, ActivateInWorldEvent>(OnMultiplePinpointerActivated);
|
||||
SubscribeLocalEvent<MultiplePinpointerComponent, AfterAutoHandleStateEvent>(OnMultiplePinpointerHandleState);
|
||||
}
|
||||
|
||||
private void OnMultiplePinpointerHandleState(EntityUid uid, MultiplePinpointerComponent component, ref AfterAutoHandleStateEvent args)
|
||||
{
|
||||
SetMultiplePinpointer(uid, component);
|
||||
}
|
||||
|
||||
private void OnMultiplePinpointerStartup(EntityUid uid, MultiplePinpointerComponent multiple, ComponentStartup args)
|
||||
{
|
||||
var pinpointer = EntityManager.EnsureComponent<PinpointerComponent>(uid);
|
||||
|
||||
SetMultiplePinpointer(uid, multiple, pinpointer);
|
||||
}
|
||||
|
||||
private void OnMultiplePinpointerActivated(EntityUid uid, MultiplePinpointerComponent multiple, ActivateInWorldEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = CycleMultiplePinpointer(uid, multiple, args.User);
|
||||
}
|
||||
|
||||
private bool CycleMultiplePinpointer(EntityUid uid, MultiplePinpointerComponent? multiple = null, EntityUid? user = null)
|
||||
{
|
||||
if (!Resolve(uid, ref multiple))
|
||||
return false;
|
||||
|
||||
if (multiple.Modes.Length == 0)
|
||||
return false;
|
||||
|
||||
multiple.CurrentEntry = (uint)((multiple.CurrentEntry + 1) % multiple.Modes.Length);
|
||||
SetMultiplePinpointer(uid, multiple, user: user);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void SetMultiplePinpointer(EntityUid uid,
|
||||
MultiplePinpointerComponent? multiple = null,
|
||||
PinpointerComponent? pin = null,
|
||||
EntityUid? user = null)
|
||||
{
|
||||
if (!Resolve(uid, ref multiple, ref pin))
|
||||
return;
|
||||
|
||||
if (multiple.Modes.Length <= multiple.CurrentEntry)
|
||||
return;
|
||||
|
||||
var current = multiple.Modes[multiple.CurrentEntry];
|
||||
SetDistance(uid, Distance.Unknown, pin);
|
||||
if (current == "Off")
|
||||
{
|
||||
SetActive(uid, true, pin);
|
||||
pin.Component = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetActive(uid, false, pin);
|
||||
pin.Component = current;
|
||||
}
|
||||
LocateTarget(uid, pin);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user