]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Handheld teleporter portals now must start on the same grid. (#28423)
authorMoony <moony@hellomouse.net>
Thu, 30 May 2024 20:45:16 +0000 (15:45 -0500)
committerGitHub <noreply@github.com>
Thu, 30 May 2024 20:45:16 +0000 (13:45 -0700)
Co-authored-by: moonheart08 <moonheart08@users.noreply.github.com>
Content.Server/Teleportation/HandTeleporterSystem.cs
Resources/Locale/en-US/teleportation/handheld-teleporter.ftl [new file with mode: 0644]

index 3d988b0916148516eef3c51d5af60123516c603e..d4c6753c4b523d3ab8b6cdd9ad837d2bcd99595b 100644 (file)
@@ -1,7 +1,9 @@
 using Content.Server.Administration.Logs;
+using Content.Server.Popups;
 using Content.Shared.DoAfter;
 using Content.Shared.Database;
 using Content.Shared.Interaction.Events;
+using Content.Shared.Popups;
 using Content.Shared.Teleportation.Components;
 using Content.Shared.Teleportation.Systems;
 using Robust.Server.Audio;
@@ -18,6 +20,7 @@ public sealed class HandTeleporterSystem : EntitySystem
     [Dependency] private readonly LinkedEntitySystem _link = default!;
     [Dependency] private readonly AudioSystem _audio = default!;
     [Dependency] private readonly SharedDoAfterSystem _doafter = default!;
+    [Dependency] private readonly PopupSystem _popup = default!;
 
     /// <inheritdoc/>
     public override void Initialize()
@@ -92,6 +95,16 @@ public sealed class HandTeleporterSystem : EntitySystem
         }
         else if (Deleted(component.SecondPortal))
         {
+            if (xform.ParentUid != xform.GridUid) // Still, don't portal.
+                return;
+
+            if (xform.ParentUid != Transform(component.FirstPortal!.Value).ParentUid)
+            {
+                // Whoops. Fizzle time. Crime time too because yippee I'm not refactoring this logic right now (I started to, I'm not going to.)
+                FizzlePortals(uid, component, user, true);
+                return;
+            }
+
             var timeout = EnsureComp<PortalTimeoutComponent>(user);
             timeout.EnteredPortal = null;
             component.SecondPortal = Spawn(component.SecondPortalPrototype, Transform(user).Coordinates);
@@ -101,22 +114,32 @@ public sealed class HandTeleporterSystem : EntitySystem
         }
         else
         {
-            // Logging
-            var portalStrings = "";
-            portalStrings += ToPrettyString(component.FirstPortal!.Value);
-            if (portalStrings != "")
-                portalStrings += " and ";
-            portalStrings += ToPrettyString(component.SecondPortal!.Value);
-            if (portalStrings != "")
-                _adminLogger.Add(LogType.EntityDelete, LogImpact.Low, $"{ToPrettyString(user):player} closed {portalStrings} with {ToPrettyString(uid)}");
-
-            // Clear both portals
-            QueueDel(component.FirstPortal!.Value);
-            QueueDel(component.SecondPortal!.Value);
-
-            component.FirstPortal = null;
-            component.SecondPortal = null;
-            _audio.PlayPvs(component.ClearPortalsSound, uid);
+            FizzlePortals(uid, component, user, false);
         }
     }
+
+    private void FizzlePortals(EntityUid uid, HandTeleporterComponent component, EntityUid user, bool instability)
+    {
+        // Logging
+        var portalStrings = "";
+        portalStrings += ToPrettyString(component.FirstPortal);
+        if (portalStrings != "")
+            portalStrings += " and ";
+        portalStrings += ToPrettyString(component.SecondPortal);
+        if (portalStrings != "")
+            _adminLogger.Add(LogType.EntityDelete, LogImpact.Low, $"{ToPrettyString(user):player} closed {portalStrings} with {ToPrettyString(uid)}");
+
+        // Clear both portals
+        if (!Deleted(component.FirstPortal))
+            QueueDel(component.FirstPortal.Value);
+        if (!Deleted(component.SecondPortal))
+            QueueDel(component.SecondPortal.Value);
+
+        component.FirstPortal = null;
+        component.SecondPortal = null;
+        _audio.PlayPvs(component.ClearPortalsSound, uid);
+
+        if (instability)
+            _popup.PopupEntity(Loc.GetString("handheld-teleporter-instability-fizzle"), uid, user, PopupType.MediumCaution);
+    }
 }
diff --git a/Resources/Locale/en-US/teleportation/handheld-teleporter.ftl b/Resources/Locale/en-US/teleportation/handheld-teleporter.ftl
new file mode 100644 (file)
index 0000000..28f526f
--- /dev/null
@@ -0,0 +1 @@
+handheld-teleporter-instability-fizzle = The portal fizzles as you try to place it, destroying both ends!