]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Allow to put explosives with timer in cream pie (#13866)
authorSlava0135 <40753025+Slava0135@users.noreply.github.com>
Sun, 5 Feb 2023 20:07:51 +0000 (23:07 +0300)
committerGitHub <noreply@github.com>
Sun, 5 Feb 2023 20:07:51 +0000 (13:07 -0700)
Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs
Content.Shared/Nutrition/Components/CreamPieComponent.cs
Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml

index 0130fb853b4eda60280afc5a5301d995d941a211..d983b3e1471c9560e535e539c62ad02ef8290aa5 100644 (file)
@@ -1,14 +1,17 @@
 using Content.Server.Chemistry.EntitySystems;
+using Content.Server.Explosion.Components;
+using Content.Server.Explosion.EntitySystems;
 using Content.Server.Fluids.EntitySystems;
 using Content.Server.Nutrition.Components;
 using Content.Server.Popups;
-using Content.Shared.Audio;
+using Content.Shared.Containers.ItemSlots;
+using Content.Shared.Interaction;
 using Content.Shared.Nutrition.Components;
 using Content.Shared.Nutrition.EntitySystems;
-using Content.Shared.Popups;
 using Content.Shared.Rejuvenate;
 using Content.Shared.Throwing;
 using JetBrains.Annotations;
+using Robust.Server.GameObjects;
 using Robust.Shared.Audio;
 using Robust.Shared.Player;
 
@@ -17,32 +20,76 @@ namespace Content.Server.Nutrition.EntitySystems
     [UsedImplicitly]
     public sealed class CreamPieSystem : SharedCreamPieSystem
     {
-        [Dependency] private readonly SolutionContainerSystem _solutionsSystem = default!;
-        [Dependency] private readonly SpillableSystem _spillableSystem = default!;
+        [Dependency] private readonly SolutionContainerSystem _solutions = default!;
+        [Dependency] private readonly SpillableSystem _spillable = default!;
+        [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
+        [Dependency] private readonly TriggerSystem _trigger = default!;
+        [Dependency] private readonly SharedAudioSystem _audio = default!;
+        [Dependency] private readonly PopupSystem _popup = default!;
 
         public override void Initialize()
         {
             base.Initialize();
 
+            SubscribeLocalEvent<CreamPieComponent, InteractUsingEvent>(OnInteractUsing);
             SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate);
         }
 
         protected override void SplattedCreamPie(EntityUid uid, CreamPieComponent creamPie)
         {
-            SoundSystem.Play(creamPie.Sound.GetSound(), Filter.Pvs(creamPie.Owner), creamPie.Owner, AudioHelpers.WithVariation(0.125f));
+            _audio.Play(_audio.GetSound(creamPie.Sound), Filter.Pvs(uid), uid, false, new AudioParams().WithVariation(0.125f));
 
-            if (EntityManager.TryGetComponent<FoodComponent?>(creamPie.Owner, out var foodComp) && _solutionsSystem.TryGetSolution(creamPie.Owner, foodComp.SolutionName, out var solution))
+            if (EntityManager.TryGetComponent<FoodComponent?>(uid, out var foodComp))
             {
-                _spillableSystem.SpillAt(creamPie.Owner, solution, "PuddleSmear", false);
+                if (_solutions.TryGetSolution(uid, foodComp.SolutionName, out var solution))
+                {
+                    _spillable.SpillAt(uid, solution, "PuddleSmear", false);
+                }
+                if (!string.IsNullOrEmpty(foodComp.TrashPrototype))
+                {
+                    EntityManager.SpawnEntity(foodComp.TrashPrototype, Transform(uid).Coordinates);
+                }
             }
+            ActivatePayload(uid);
 
             EntityManager.QueueDeleteEntity(uid);
         }
 
+        private void OnInteractUsing(EntityUid uid, CreamPieComponent component, InteractUsingEvent args)
+        {
+            ActivatePayload(uid);
+        }
+
+        private void ActivatePayload(EntityUid uid)
+        {
+            if (_itemSlots.TryGetSlot(uid, CreamPieComponent.PayloadSlotName, out var itemSlot)) 
+            {
+                if (_itemSlots.TryEject(uid, itemSlot, user: null, out var item)) 
+                {
+                    if (TryComp<OnUseTimerTriggerComponent>(item.Value, out var timerTrigger))
+                    {
+                        _trigger.HandleTimerTrigger(
+                            item.Value,
+                            null,
+                            timerTrigger.Delay,
+                            timerTrigger.BeepInterval,
+                            timerTrigger.InitialBeepDelay,
+                            timerTrigger.BeepSound,
+                            timerTrigger.BeepParams);
+                    }
+                }
+            }
+        }
+
         protected override void CreamedEntity(EntityUid uid, CreamPiedComponent creamPied, ThrowHitByEvent args)
         {
-            creamPied.Owner.PopupMessage(Loc.GetString("cream-pied-component-on-hit-by-message",("thrower", args.Thrown)));
-            creamPied.Owner.PopupMessageOtherClients(Loc.GetString("cream-pied-component-on-hit-by-message-others", ("owner", creamPied.Owner),("thrower", args.Thrown)));
+            _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message",("thrower", args.Thrown)), uid, args.Target);
+            var otherPlayers = Filter.Empty().AddPlayersByPvs(uid);
+            if (TryComp<ActorComponent>(args.Target, out var actor)) 
+            {
+                otherPlayers.RemovePlayer(actor.PlayerSession);
+            }
+            _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message-others", ("owner", uid),("thrower", args.Thrown)), uid, otherPlayers, false);
         }
 
         private void OnRejuvenate(EntityUid uid, CreamPiedComponent component, RejuvenateEvent args)
index f38175df46fcacb53dd24b90813de150798f34f6..f209593964574c54bbaf13d5c07685a5553c53c9 100644 (file)
@@ -15,5 +15,7 @@ namespace Content.Shared.Nutrition.Components
 
         [ViewVariables]
         public bool Splatted { get; set; } = false;
+
+        public const string PayloadSlotName = "payloadSlot";
     }
 }
index 1e04cc812a750a42d2948e7fada981ae5fcc0c82..713fd6bb260f1df0e91d4e026f6453535e89a993 100644 (file)
     - state: tin
     - state: plain
   - type: CreamPie
+  - type: ContainerContainer
+    containers:
+      payloadSlot: !type:ContainerSlot
+  - type: ItemSlots
+    slots:
+      payloadSlot:
+        whitelist:
+          components:
+          - OnUseTimerTrigger
+        insertSound: 
+          path: /Audio/Weapons/Guns/Empty/empty.ogg
+        ejectSound: 
+          path: /Audio/Weapons/Guns/Empty/empty.ogg
 # Tastes like pie, cream, banana.
 
 - type: entity