]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Guardian bugfixes (#21467)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Tue, 7 Nov 2023 03:16:32 +0000 (14:16 +1100)
committerGitHub <noreply@github.com>
Tue, 7 Nov 2023 03:16:32 +0000 (22:16 -0500)
Content.Server/Guardian/GuardianComponent.cs
Content.Server/Guardian/GuardianHostComponent.cs
Content.Server/Guardian/GuardianSystem.cs

index dcb9a8c05400ecbde66a9d279fae6f8b73074b2b..a54d03375679efd4d29c0e6e4564da7d537845f9 100644 (file)
@@ -9,24 +9,26 @@ namespace Content.Server.Guardian
         /// <summary>
         /// The guardian host entity
         /// </summary>
-        public EntityUid Host;
+        [DataField]
+        public EntityUid? Host;
 
         /// <summary>
         /// Percentage of damage reflected from the guardian to the host
         /// </summary>
-        [DataField("damageShare")]
+        [DataField]
         public float DamageShare { get; set; } = 0.65f;
 
         /// <summary>
         /// Maximum distance the guardian can travel before it's forced to recall, use YAML to set
         /// </summary>
-        [DataField("distanceAllowed")]
+        [DataField]
         public float DistanceAllowed { get; set; } = 5f;
 
         /// <summary>
         /// If the guardian is currently manifested
         /// </summary>
-        public bool GuardianLoose = false;
+        [DataField]
+        public bool GuardianLoose;
 
     }
 }
index 6a747ae86a4cf28c5eec5e2ffc1bb7a2085355a5..e9d0e4affd21c063b681e7de26d9e07fd05b353f 100644 (file)
@@ -1,6 +1,5 @@
 using Robust.Shared.Containers;
 using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
 namespace Content.Server.Guardian
 {
@@ -16,6 +15,7 @@ namespace Content.Server.Guardian
         /// <remarks>
         /// Can be null if the component is added at any time.
         /// </remarks>
+        [DataField]
         public EntityUid? HostedGuardian;
 
         /// <summary>
@@ -23,9 +23,9 @@ namespace Content.Server.Guardian
         /// </summary>
         [ViewVariables] public ContainerSlot GuardianContainer = default!;
 
-        [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
-        public string Action = "ActionToggleGuardian";
+        [DataField]
+        public EntProtoId Action = "ActionToggleGuardian";
 
-        [DataField("actionEntity")] public EntityUid? ActionEntity;
+        [DataField] public EntityUid? ActionEntity;
     }
 }
index b6121a7fbda42c95c4b5a85856c1a1da0a2fe13f..2847b45ba17bd887825ced17866e1a5665ebd6d6 100644 (file)
@@ -41,10 +41,11 @@ namespace Content.Server.Guardian
             SubscribeLocalEvent<GuardianCreatorComponent, ExaminedEvent>(OnCreatorExamine);
             SubscribeLocalEvent<GuardianCreatorComponent, GuardianCreatorDoAfterEvent>(OnDoAfter);
 
+            SubscribeLocalEvent<GuardianComponent, ComponentShutdown>(OnGuardianShutdown);
             SubscribeLocalEvent<GuardianComponent, MoveEvent>(OnGuardianMove);
             SubscribeLocalEvent<GuardianComponent, DamageChangedEvent>(OnGuardianDamaged);
-            SubscribeLocalEvent<GuardianComponent, PlayerAttachedEvent>(OnGuardianPlayer);
-            SubscribeLocalEvent<GuardianComponent, PlayerDetachedEvent>(OnGuardianUnplayer);
+            SubscribeLocalEvent<GuardianComponent, PlayerAttachedEvent>(OnGuardianPlayerAttached);
+            SubscribeLocalEvent<GuardianComponent, PlayerDetachedEvent>(OnGuardianPlayerDetached);
 
             SubscribeLocalEvent<GuardianHostComponent, ComponentInit>(OnHostInit);
             SubscribeLocalEvent<GuardianHostComponent, MoveEvent>(OnHostMove);
@@ -56,6 +57,21 @@ namespace Content.Server.Guardian
             SubscribeLocalEvent<GuardianComponent, AttackAttemptEvent>(OnGuardianAttackAttempt);
         }
 
+        private void OnGuardianShutdown(EntityUid uid, GuardianComponent component, ComponentShutdown args)
+        {
+            var host = component.Host;
+            component.Host = null;
+
+            if (!TryComp(host, out GuardianHostComponent? hostComponent))
+                return;
+
+            hostComponent.GuardianContainer.Remove(uid);
+            hostComponent.HostedGuardian = null;
+            Dirty(host.Value, hostComponent);
+            QueueDel(hostComponent.ActionEntity);
+            hostComponent.ActionEntity = null;
+        }
+
         private void OnPerformAction(EntityUid uid, GuardianHostComponent component, GuardianToggleActionEvent args)
         {
             if (args.Handled)
@@ -67,24 +83,29 @@ namespace Content.Server.Guardian
             args.Handled = true;
         }
 
-        private void OnGuardianUnplayer(EntityUid uid, GuardianComponent component, PlayerDetachedEvent args)
+        private void OnGuardianPlayerDetached(EntityUid uid, GuardianComponent component, PlayerDetachedEvent args)
         {
             var host = component.Host;
-
-            if (!TryComp<GuardianHostComponent>(host, out var hostComponent) || LifeStage(host) >= EntityLifeStage.MapInitialized)
+            if (!TryComp<GuardianHostComponent>(host, out var hostComponent) || TerminatingOrDeleted(host.Value))
+            {
+                QueueDel(uid);
                 return;
+            }
 
-            RetractGuardian(host, hostComponent, uid, component);
+            RetractGuardian(host.Value, hostComponent, uid, component);
         }
 
-        private void OnGuardianPlayer(EntityUid uid, GuardianComponent component, PlayerAttachedEvent args)
+        private void OnGuardianPlayerAttached(EntityUid uid, GuardianComponent component, PlayerAttachedEvent args)
         {
             var host = component.Host;
 
             if (!HasComp<GuardianHostComponent>(host))
+            {
+                QueueDel(uid);
                 return;
+            }
 
-            _popupSystem.PopupEntity(Loc.GetString("guardian-available"), host, host);
+            _popupSystem.PopupEntity(Loc.GetString("guardian-available"), host.Value, host.Value);
         }
 
         private void OnHostInit(EntityUid uid, GuardianHostComponent component, ComponentInit args)
@@ -95,14 +116,16 @@ namespace Content.Server.Guardian
 
         private void OnHostShutdown(EntityUid uid, GuardianHostComponent component, ComponentShutdown args)
         {
-            if (component.HostedGuardian == null)
+            if (component.HostedGuardian is not {} guardian)
                 return;
 
-            if (HasComp<HandsComponent>(component.HostedGuardian.Value))
+            // Ensure held items are dropped before deleting guardian.
+            if (HasComp<HandsComponent>(guardian))
                 _bodySystem.GibBody(component.HostedGuardian.Value);
 
-            EntityManager.QueueDeleteEntity(component.HostedGuardian.Value);
-            _actionSystem.RemoveAction(uid, component.ActionEntity);
+            QueueDel(guardian);
+            QueueDel(component.ActionEntity);
+            component.ActionEntity = null;
         }
 
         private void OnGuardianAttackAttempt(EntityUid uid, GuardianComponent component, AttackAttemptEvent args)
@@ -117,7 +140,7 @@ namespace Content.Server.Guardian
 
         public void ToggleGuardian(EntityUid user, GuardianHostComponent hostComponent)
         {
-            if (hostComponent.HostedGuardian == null || !TryComp<GuardianComponent>(hostComponent.HostedGuardian, out var guardianComponent))
+            if (!TryComp<GuardianComponent>(hostComponent.HostedGuardian, out var guardianComponent))
                 return;
 
             if (guardianComponent.GuardianLoose)
@@ -134,7 +157,7 @@ namespace Content.Server.Guardian
             if (args.Handled)
                 return;
 
-            //args.Handled = true;
+            args.Handled = true;
             UseCreator(args.User, args.User, uid, component);
         }
 
@@ -143,7 +166,7 @@ namespace Content.Server.Guardian
             if (args.Handled || args.Target == null || !args.CanReach)
                 return;
 
-            //args.Handled = true;
+            args.Handled = true;
             UseCreator(args.User, args.Target.Value, uid, component);
         }
         private void UseCreator(EntityUid user, EntityUid target, EntityUid injector, GuardianCreatorComponent component)
@@ -194,6 +217,7 @@ namespace Content.Server.Guardian
             if (TryComp<GuardianComponent>(guardian, out var guardianComp))
             {
                 guardianComp.Host = args.Args.Target.Value;
+                // TODO this should be a data field, not a hardcoded path
                 _audio.Play("/Audio/Effects/guardian_inject.ogg", Filter.Pvs(args.Args.Target.Value), args.Args.Target.Value, true);
                 _popupSystem.PopupEntity(Loc.GetString("guardian-created"), args.Args.Target.Value, args.Args.Target.Value);
                 // Exhaust the activator
@@ -201,8 +225,8 @@ namespace Content.Server.Guardian
             }
             else
             {
-                Logger.ErrorS("guardian", $"Tried to spawn a guardian that doesn't have {nameof(GuardianComponent)}");
-                EntityManager.QueueDeleteEntity(guardian);
+                Log.Error($"Tried to spawn a guardian that doesn't have {nameof(GuardianComponent)}");
+                QueueDel(guardian);
             }
 
             args.Handled = true;
@@ -219,13 +243,14 @@ namespace Content.Server.Guardian
             if (args.NewMobState == MobState.Critical)
             {
                 _popupSystem.PopupEntity(Loc.GetString("guardian-host-critical-warn"), component.HostedGuardian.Value, component.HostedGuardian.Value);
+                // TODO this should be a data field, not a hardcoded path
                 _audio.Play("/Audio/Effects/guardian_warn.ogg", Filter.Pvs(component.HostedGuardian.Value), component.HostedGuardian.Value, true);
             }
             else if (args.NewMobState == MobState.Dead)
             {
                 //TODO: Replace WithVariation with datafield
                 _audio.Play("/Audio/Voice/Human/malescream_guardian.ogg", Filter.Pvs(uid), uid, true, AudioHelpers.WithVariation(0.20f));
-                EntityManager.RemoveComponent<GuardianHostComponent>(uid);
+                RemComp<GuardianHostComponent>(uid);
             }
         }
 
@@ -234,11 +259,11 @@ namespace Content.Server.Guardian
         /// </summary>
         private void OnGuardianDamaged(EntityUid uid, GuardianComponent component, DamageChangedEvent args)
         {
-            if (args.DamageDelta == null)
+            if (args.DamageDelta == null || component.Host == null || component.DamageShare > 0)
                 return;
 
             _damageSystem.TryChangeDamage(component.Host, args.DamageDelta * component.DamageShare, origin: args.Origin);
-            _popupSystem.PopupEntity(Loc.GetString("guardian-entity-taking-damage"), component.Host, component.Host);
+            _popupSystem.PopupEntity(Loc.GetString("guardian-entity-taking-damage"), component.Host.Value, component.Host.Value);
 
         }
 
@@ -256,8 +281,7 @@ namespace Content.Server.Guardian
         /// </summary>
         private void OnHostMove(EntityUid uid, GuardianHostComponent component, ref MoveEvent args)
         {
-            if (component.HostedGuardian == null ||
-                !TryComp(component.HostedGuardian, out GuardianComponent? guardianComponent) ||
+            if (!TryComp(component.HostedGuardian, out GuardianComponent? guardianComponent) ||
                 !guardianComponent.GuardianLoose)
             {
                 return;
@@ -271,10 +295,10 @@ namespace Content.Server.Guardian
         /// </summary>
         private void OnGuardianMove(EntityUid uid, GuardianComponent component, ref MoveEvent args)
         {
-            if (!component.GuardianLoose)
+            if (!component.GuardianLoose || component.Host == null)
                 return;
 
-            CheckGuardianMove(component.Host, uid, guardianComponent: component);
+            CheckGuardianMove(component.Host.Value, uid, guardianComponent: component);
         }
 
         /// <summary>
@@ -288,6 +312,9 @@ namespace Content.Server.Guardian
             TransformComponent? hostXform = null,
             TransformComponent? guardianXform = null)
         {
+            if (TerminatingOrDeleted(guardianUid) || TerminatingOrDeleted(hostUid))
+                return;
+
             if (!Resolve(hostUid, ref hostComponent, ref hostXform) ||
                 !Resolve(guardianUid, ref guardianComponent, ref guardianXform))
             {