]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix invalid followers being saved in maps (#16146)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Sat, 6 May 2023 23:38:56 +0000 (11:38 +1200)
committerGitHub <noreply@github.com>
Sat, 6 May 2023 23:38:56 +0000 (09:38 +1000)
Content.Server/Maps/MapMigrationSystem.cs
Content.Shared/Follower/FollowerSystem.cs

index ce11f15fdb482e400d4d6861028a17a5afac37cf..f0c19e1414e682bd1ab3b6eb2ce43363f4e10d9b 100644 (file)
@@ -4,6 +4,7 @@ using System.Linq;
 using Robust.Server.GameObjects;
 using Robust.Server.Maps;
 using Robust.Shared.ContentPack;
+using Robust.Shared.Map.Events;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization.Markdown;
 using Robust.Shared.Serialization.Markdown.Mapping;
index 9547cca0ce86c3a3591df3a16123b2abf15a46a3..b7dbb28cf9b7cf8036df4d6cefa7bd81b2581d24 100644 (file)
@@ -5,6 +5,7 @@ using Content.Shared.Movement.Events;
 using Content.Shared.Movement.Systems;
 using Content.Shared.Verbs;
 using Robust.Shared.Map;
+using Robust.Shared.Map.Events;
 using Robust.Shared.Utility;
 
 namespace Content.Shared.Follower;
@@ -20,6 +21,25 @@ public sealed class FollowerSystem : EntitySystem
         SubscribeLocalEvent<GetVerbsEvent<AlternativeVerb>>(OnGetAlternativeVerbs);
         SubscribeLocalEvent<FollowerComponent, MoveInputEvent>(OnFollowerMove);
         SubscribeLocalEvent<FollowedComponent, EntityTerminatingEvent>(OnFollowedTerminating);
+        SubscribeLocalEvent<BeforeSaveEvent>(OnBeforeSave);
+    }
+
+    private void OnBeforeSave(BeforeSaveEvent ev)
+    {
+        // Some followers will not be map savable. This ensures that maps don't get saved with empty/invalid
+        // followers, but just stopping any following on the map being saved.
+
+        var query = AllEntityQuery<FollowerComponent, TransformComponent, MetaDataComponent>();
+        while (query.MoveNext(out var uid, out var follower, out var xform, out var meta))
+        {
+            if (meta.EntityPrototype == null || meta.EntityPrototype.MapSavable)
+                continue;
+
+            if (xform.MapUid != ev.Map)
+                continue;
+
+            StopFollowingEntity(uid, follower.Following);
+        }
     }
 
     private void OnGetAlternativeVerbs(GetVerbsEvent<AlternativeVerb> ev)