]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
add ghostnado button to warp menu (#27556)
authordeltanedas <39013340+deltanedas@users.noreply.github.com>
Wed, 1 May 2024 13:59:35 +0000 (13:59 +0000)
committerGitHub <noreply@github.com>
Wed, 1 May 2024 13:59:35 +0000 (06:59 -0700)
* add ghostnado button to warp menu

* translator ops

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Content.Client/UserInterface/Systems/Ghost/Controls/GhostTargetWindow.xaml
Content.Client/UserInterface/Systems/Ghost/Controls/GhostTargetWindow.xaml.cs
Content.Client/UserInterface/Systems/Ghost/GhostUIController.cs
Content.Server/Ghost/GhostSystem.cs
Content.Shared/Follower/FollowerSystem.cs
Content.Shared/Ghost/SharedGhostSystem.cs
Resources/Locale/en-US/ghost/ghost-gui.ftl

index 86fd09b2c80747ca4ddef74b93218ef5e97a267e..32cab732d142eb9cbb604cb6c67e1ca9feff9799 100644 (file)
@@ -1,5 +1,6 @@
 <DefaultWindow xmlns="https://spacestation14.io" Title="{Loc 'ghost-target-window-title'}" MinSize="450 450" SetSize="450 450">
     <BoxContainer Orientation="Vertical" HorizontalExpand="True" SizeFlagsStretchRatio="0.4">
+        <Button Name="GhostnadoButton" Text="{Loc 'ghost-target-window-warp-to-most-followed'}" HorizontalAlignment="Center" Margin="0 4" />
         <LineEdit Name="SearchBar" PlaceHolder="Search" HorizontalExpand="True" Margin="0 4" />
         <ScrollContainer VerticalExpand="True" HorizontalExpand="True" HScrollEnabled="False">
             <BoxContainer Name="ButtonContainer" Orientation="Vertical" VerticalExpand="True" SeparationOverride="5">
index 3c17697c250c3798b4a9bbbf050494b2e4f885a1..9a20226fdf429258867c259d65346fc445cbbd87 100644 (file)
@@ -15,11 +15,14 @@ namespace Content.Client.UserInterface.Systems.Ghost.Controls
         private string _searchText = string.Empty;
 
         public event Action<NetEntity>? WarpClicked;
+        public event Action? OnGhostnadoClicked;
 
         public GhostTargetWindow()
         {
             RobustXamlLoader.Load(this);
             SearchBar.OnTextChanged += OnSearchTextChanged;
+
+            GhostnadoButton.OnPressed += _ => OnGhostnadoClicked?.Invoke();
         }
 
         public void UpdateWarps(IEnumerable<GhostWarp> warps)
index 12d6c659530ba5d200006c525e0881f231b572e9..53779ea41c19affb2ea13198febba5830187e5ec 100644 (file)
@@ -111,6 +111,12 @@ public sealed class GhostUIController : UIController, IOnSystemChanged<GhostSyst
         _net.SendSystemNetworkMessage(msg);
     }
 
+    private void OnGhostnadoClicked()
+    {
+        var msg = new GhostnadoRequestEvent();
+        _net.SendSystemNetworkMessage(msg);
+    }
+
     public void LoadGui()
     {
         if (Gui == null)
@@ -120,6 +126,7 @@ public sealed class GhostUIController : UIController, IOnSystemChanged<GhostSyst
         Gui.ReturnToBodyPressed += ReturnToBody;
         Gui.GhostRolesPressed += GhostRolesPressed;
         Gui.TargetWindow.WarpClicked += OnWarpClicked;
+        Gui.TargetWindow.OnGhostnadoClicked += OnGhostnadoClicked;
 
         UpdateGui();
     }
index c0e753c4c5550b6dc362f55f48e60b3945ae5041..0be93d2054c870b37ae1b9592e71bcfbee8ba8e8 100644 (file)
@@ -43,10 +43,16 @@ namespace Content.Server.Ghost
         [Dependency] private readonly TransformSystem _transformSystem = default!;
         [Dependency] private readonly VisibilitySystem _visibilitySystem = default!;
 
+        private EntityQuery<GhostComponent> _ghostQuery;
+        private EntityQuery<PhysicsComponent> _physicsQuery;
+
         public override void Initialize()
         {
             base.Initialize();
 
+            _ghostQuery = GetEntityQuery<GhostComponent>();
+            _physicsQuery = GetEntityQuery<PhysicsComponent>();
+
             SubscribeLocalEvent<GhostComponent, ComponentStartup>(OnGhostStartup);
             SubscribeLocalEvent<GhostComponent, MapInitEvent>(OnMapInit);
             SubscribeLocalEvent<GhostComponent, ComponentShutdown>(OnGhostShutdown);
@@ -62,6 +68,7 @@ namespace Content.Server.Ghost
             SubscribeNetworkEvent<GhostWarpsRequestEvent>(OnGhostWarpsRequest);
             SubscribeNetworkEvent<GhostReturnToBodyRequest>(OnGhostReturnToBodyRequest);
             SubscribeNetworkEvent<GhostWarpToTargetRequestEvent>(OnGhostWarpToTargetRequest);
+            SubscribeNetworkEvent<GhostnadoRequestEvent>(OnGhostnadoRequest);
 
             SubscribeLocalEvent<GhostComponent, BooActionEvent>(OnActionPerform);
             SubscribeLocalEvent<GhostComponent, ToggleGhostHearingActionEvent>(OnGhostHearingAction);
@@ -241,7 +248,7 @@ namespace Content.Server.Ghost
         private void OnGhostReturnToBodyRequest(GhostReturnToBodyRequest msg, EntitySessionEventArgs args)
         {
             if (args.SenderSession.AttachedEntity is not {Valid: true} attached
-                || !TryComp(attached, out GhostComponent? ghost)
+                || !_ghostQuery.TryComp(attached, out var ghost)
                 || !ghost.CanReturnToBody
                 || !TryComp(attached, out ActorComponent? actor))
             {
@@ -257,7 +264,7 @@ namespace Content.Server.Ghost
         private void OnGhostWarpsRequest(GhostWarpsRequestEvent msg, EntitySessionEventArgs args)
         {
             if (args.SenderSession.AttachedEntity is not {Valid: true} entity
-                || !HasComp<GhostComponent>(entity))
+                || !_ghostQuery.HasComp(entity))
             {
                 Log.Warning($"User {args.SenderSession.Name} sent a {nameof(GhostWarpsRequestEvent)} without being a ghost.");
                 return;
@@ -270,7 +277,7 @@ namespace Content.Server.Ghost
         private void OnGhostWarpToTargetRequest(GhostWarpToTargetRequestEvent msg, EntitySessionEventArgs args)
         {
             if (args.SenderSession.AttachedEntity is not {Valid: true} attached
-                || !TryComp(attached, out GhostComponent? _))
+                || !_ghostQuery.HasComp(attached))
             {
                 Log.Warning($"User {args.SenderSession.Name} tried to warp to {msg.Target} without being a ghost.");
                 return;
@@ -284,17 +291,37 @@ namespace Content.Server.Ghost
                 return;
             }
 
+            WarpTo(attached, target);
+        }
+
+        private void OnGhostnadoRequest(GhostnadoRequestEvent msg, EntitySessionEventArgs args)
+        {
+            if (args.SenderSession.AttachedEntity is not {} uid
+                || !_ghostQuery.HasComp(uid))
+            {
+                Log.Warning($"User {args.SenderSession.Name} tried to ghostnado without being a ghost.");
+                return;
+            }
+
+            if (_followerSystem.GetMostFollowed() is not {} target)
+                return;
+
+            WarpTo(uid, target);
+        }
+
+        private void WarpTo(EntityUid uid, EntityUid target)
+        {
             if ((TryComp(target, out WarpPointComponent? warp) && warp.Follow) || HasComp<MobStateComponent>(target))
             {
-                _followerSystem.StartFollowingEntity(attached, target);
+                _followerSystem.StartFollowingEntity(uid, target);
                 return;
             }
 
-            var xform = Transform(attached);
-            _transformSystem.SetCoordinates(attached, xform, Transform(target).Coordinates);
-            _transformSystem.AttachToGridOrMap(attached, xform);
-            if (TryComp(attached, out PhysicsComponent? physics))
-                _physics.SetLinearVelocity(attached, Vector2.Zero, body: physics);
+            var xform = Transform(uid);
+            _transformSystem.SetCoordinates(uid, xform, Transform(target).Coordinates);
+            _transformSystem.AttachToGridOrMap(uid, xform);
+            if (_physicsQuery.TryComp(uid, out var physics))
+                _physics.SetLinearVelocity(uid, Vector2.Zero, body: physics);
         }
 
         private IEnumerable<GhostWarp> GetLocationWarps()
index fc7cccf9bd6ade208709867daa49886826208410..6c02b130762fc4ed82e0e9675afa56cb3b3d0cda 100644 (file)
@@ -247,6 +247,27 @@ public sealed class FollowerSystem : EntitySystem
             StopFollowingEntity(player, uid, followed);
         }
     }
+
+    /// <summary>
+    /// Get the most followed entity.
+    /// </summary>
+    public EntityUid? GetMostFollowed()
+    {
+        EntityUid? picked = null;
+        int most = 0;
+        var query = EntityQueryEnumerator<FollowedComponent>();
+        while (query.MoveNext(out var uid, out var comp))
+        {
+            var count = comp.Following.Count;
+            if (count > most)
+            {
+                picked = uid;
+                most = count;
+            }
+        }
+
+        return picked;
+    }
 }
 
 public abstract class FollowEvent : EntityEventArgs
index c1c2c3c71e898b3877aed5707a67f68abd50848f..ad8b86f7ddab0b1fd29633d308d617ff5ee18002 100644 (file)
@@ -125,6 +125,12 @@ namespace Content.Shared.Ghost
         }
     }
 
+    /// <summary>
+    /// A client to server request for their ghost to be warped to the most followed entity.
+    /// </summary>
+    [Serializable, NetSerializable]
+    public sealed class GhostnadoRequestEvent : EntityEventArgs;
+
     /// <summary>
     /// A client to server request for their ghost to return to body
     /// </summary>
index 909513e96caab27cd4c036c6abc2fdb9cbd78ae9..40cd06743ebbb48b4ef67266175dda3102284931 100644 (file)
@@ -10,6 +10,7 @@ ghost-gui-toggle-hearing-popup-off = You can now only hear radio and nearby mess
 
 ghost-target-window-title = Ghost Warp
 ghost-target-window-current-button = Warp: {$name}
+ghost-target-window-warp-to-most-followed = Warp to Most Followed
 
 ghost-roles-window-title = Ghost Roles
 ghost-roles-window-request-role-button = Request