Files
OldThink/Content.Server/_White/Cult/UI/CultTeleportSpellEui.cs

114 lines
3.5 KiB
C#
Raw Permalink Normal View History

2024-01-27 15:19:52 +03:00
using Content.Server.EUI;
using Content.Server.Popups;
using Content.Server._White.Cult.Runes.Comps;
2024-01-27 15:19:52 +03:00
using Content.Shared.Eui;
using Content.Shared.Popups;
using Content.Shared._White.Cult.UI;
2024-03-27 19:30:19 +07:00
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
2024-01-27 15:19:52 +03:00
using Robust.Shared.Timing;
namespace Content.Server._White.Cult.UI;
2024-01-27 15:19:52 +03:00
public sealed class CultTeleportSpellEui : BaseEui
2024-01-27 15:19:52 +03:00
{
[Dependency] private readonly EntityManager _entityManager = default!;
2024-03-27 19:30:19 +07:00
private readonly SharedTransformSystem _transformSystem;
private readonly PullingSystem _pulling;
private readonly PopupSystem _popupSystem;
2024-01-27 15:19:52 +03:00
2024-03-27 19:30:19 +07:00
private readonly EntityUid _performer;
private readonly EntityUid _target;
2024-01-27 15:19:52 +03:00
private bool _used;
public CultTeleportSpellEui(EntityUid performer, EntityUid target)
2024-01-27 15:19:52 +03:00
{
IoCManager.InjectDependencies(this);
_transformSystem = _entityManager.System<SharedTransformSystem>();
2024-03-27 19:30:19 +07:00
_pulling = _entityManager.System<PullingSystem>();
2024-01-27 15:19:52 +03:00
_popupSystem = _entityManager.System<PopupSystem>();
_performer = performer;
_target = target;
2024-03-27 19:30:19 +07:00
Timer.Spawn(TimeSpan.FromSeconds(10), Close);
2024-01-27 15:19:52 +03:00
}
public override EuiStateBase GetNewState()
{
2024-03-27 19:30:19 +07:00
var runesQuery = _entityManager.EntityQueryEnumerator<CultRuneTeleportComponent>();
var state = new CultTeleportSpellEuiState();
2024-01-27 15:19:52 +03:00
2024-03-27 19:30:19 +07:00
while (runesQuery.MoveNext(out var runeUid, out var rune))
2024-01-27 15:19:52 +03:00
{
2024-03-27 19:30:19 +07:00
state.Runes.Add((int) runeUid, rune.Label!);
2024-01-27 15:19:52 +03:00
}
return state;
}
public override void HandleMessage(EuiMessageBase msg)
{
base.HandleMessage(msg);
2024-03-27 19:30:19 +07:00
if (_used)
{
return;
}
2024-01-27 15:19:52 +03:00
if (msg is not TeleportSpellTargetRuneSelected cast)
{
return;
}
var performerPosition = _entityManager.GetComponent<TransformComponent>(_performer).Coordinates;
2024-03-27 19:30:19 +07:00
var targetPosition = _entityManager.GetComponent<TransformComponent>(_target).Coordinates;
2024-01-27 15:19:52 +03:00
performerPosition.TryDistance(_entityManager, targetPosition, out var distance);
2024-03-27 19:30:19 +07:00
if (distance > 1.5f)
2024-01-27 15:19:52 +03:00
{
_popupSystem.PopupEntity("Too far", _performer, PopupType.Medium);
return;
}
2024-03-27 19:30:19 +07:00
TransformComponent? runeTransform = null;
2024-01-27 15:19:52 +03:00
2024-03-27 19:30:19 +07:00
var teleportRuneQuery = _entityManager.EntityQueryEnumerator<CultRuneTeleportComponent, TransformComponent>();
while (teleportRuneQuery.MoveNext(out var runeUid, out _, out var transformComponent))
2024-01-27 15:19:52 +03:00
{
2024-03-27 19:30:19 +07:00
if (runeUid == new EntityUid(cast.RuneUid))
2024-01-27 15:19:52 +03:00
{
2024-03-27 19:30:19 +07:00
runeTransform = transformComponent;
2024-01-27 15:19:52 +03:00
}
}
if (runeTransform is null)
{
_popupSystem.PopupEntity("Rune is gone", _performer);
DoStateUpdate();
return;
}
_used = true;
// break pulls before portal enter so we dont break shit
2024-03-27 19:30:19 +07:00
if (_entityManager.TryGetComponent<PullableComponent>(_target, out var pullable) && pullable.BeingPulled)
{
2024-03-27 19:30:19 +07:00
_pulling.TryStopPull(_target, pullable);
}
2024-03-27 19:30:19 +07:00
if (_entityManager.TryGetComponent<PullerComponent>(_target, out var pulling)
&& pulling.Pulling != null
&& _entityManager.TryGetComponent<PullableComponent>(pulling.Pulling.Value, out var subjectPulling))
{
2024-03-27 19:30:19 +07:00
_pulling.TryStopPull(pulling.Pulling.Value, subjectPulling);
}
2024-01-27 15:19:52 +03:00
_transformSystem.SetCoordinates(_target, runeTransform.Coordinates);
Close();
}
}