]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add explosive banana peel 2 (#14491)
authorSlava0135 <40753025+Slava0135@users.noreply.github.com>
Thu, 23 Mar 2023 15:54:14 +0000 (18:54 +0300)
committerGitHub <noreply@github.com>
Thu, 23 Mar 2023 15:54:14 +0000 (11:54 -0400)
Content.Server/Explosion/Components/TriggerOnSlipComponent.cs [new file with mode: 0644]
Content.Server/Explosion/EntitySystems/TriggerSystem.cs
Content.Shared/Slippery/SlipperySystem.cs
Resources/Locale/en-US/store/uplink-catalog.ftl
Resources/Prototypes/Catalog/uplink_catalog.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml
Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json
Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/primed.png [new file with mode: 0644]

diff --git a/Content.Server/Explosion/Components/TriggerOnSlipComponent.cs b/Content.Server/Explosion/Components/TriggerOnSlipComponent.cs
new file mode 100644 (file)
index 0000000..da9d302
--- /dev/null
@@ -0,0 +1,6 @@
+namespace Content.Server.Explosion.Components;
+
+[RegisterComponent]
+public sealed class TriggerOnSlipComponent : Component
+{
+}
index 965f1b6dc15f90978395e1e6a292ecad9ea3401e..10539dd86023ff91aa7faa9c2126ca5dcfcc5394 100644 (file)
@@ -9,6 +9,7 @@ using Content.Shared.Database;
 using Content.Shared.Implants.Components;
 using Content.Shared.Interaction;
 using Content.Shared.Payload.Components;
+using Content.Shared.Slippery;
 using Content.Shared.StepTrigger.Systems;
 using Content.Shared.Trigger;
 using JetBrains.Annotations;
@@ -61,6 +62,7 @@ namespace Content.Server.Explosion.EntitySystems
             SubscribeLocalEvent<TriggerOnActivateComponent, ActivateInWorldEvent>(OnActivate);
             SubscribeLocalEvent<TriggerImplantActionComponent, ActivateImplantEvent>(OnImplantTrigger);
             SubscribeLocalEvent<TriggerOnStepTriggerComponent, StepTriggeredEvent>(OnStepTriggered);
+            SubscribeLocalEvent<TriggerOnSlipComponent, SlipEvent>(OnSlipTriggered);
 
             SubscribeLocalEvent<DeleteOnTriggerComponent, TriggerEvent>(HandleDeleteTrigger);
             SubscribeLocalEvent<ExplodeOnTriggerComponent, TriggerEvent>(HandleExplodeTrigger);
@@ -122,6 +124,11 @@ namespace Content.Server.Explosion.EntitySystems
             Trigger(uid, args.Tripper);
         }
 
+        private void OnSlipTriggered(EntityUid uid, TriggerOnSlipComponent component, ref SlipEvent args)
+        {
+            Trigger(uid, args.Slipped);
+        }
+
         public bool Trigger(EntityUid trigger, EntityUid? user = null)
         {
             var triggerEvent = new TriggerEvent(trigger, user);
index 276f79729930fd7962fe189a732d1642d18c8d77..df636a38bd6b2c37895d13081f094ef49584cb40 100644 (file)
@@ -11,110 +11,115 @@ using Robust.Shared.GameStates;
 using Robust.Shared.Physics.Components;
 using Robust.Shared.Physics.Systems;
 
-namespace Content.Shared.Slippery
+namespace Content.Shared.Slippery;
+
+[UsedImplicitly]
+public sealed class SlipperySystem : EntitySystem
 {
-    [UsedImplicitly]
-    public sealed class SlipperySystem : EntitySystem
+    [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
+    [Dependency] private readonly SharedAudioSystem _audio = default!;
+    [Dependency] private readonly SharedStunSystem _stun = default!;
+    [Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
+    [Dependency] private readonly SharedContainerSystem _container = default!;
+    [Dependency] private readonly SharedPhysicsSystem _physics = default!;
+
+    public override void Initialize()
     {
-        [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
-        [Dependency] private readonly SharedAudioSystem _audio = default!;
-        [Dependency] private readonly SharedStunSystem _stunSystem = default!;
-        [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
-        [Dependency] private readonly SharedContainerSystem _container = default!;
-        [Dependency] private readonly SharedPhysicsSystem _physics = default!;
-
-        public override void Initialize()
-        {
-            base.Initialize();
-
-            SubscribeLocalEvent<SlipperyComponent, StepTriggerAttemptEvent>(HandleAttemptCollide);
-            SubscribeLocalEvent<SlipperyComponent, StepTriggeredEvent>(HandleStepTrigger);
-            SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt);
-            // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
-            SubscribeLocalEvent<NoSlipComponent, InventoryRelayedEvent<SlipAttemptEvent>>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args));
-            SubscribeLocalEvent<SlipperyComponent, ComponentGetState>(OnSlipperyGetState);
-            SubscribeLocalEvent<SlipperyComponent, ComponentHandleState>(OnSlipperyHandleState);
-        }
-
-        private void OnSlipperyHandleState(EntityUid uid, SlipperyComponent component, ref ComponentHandleState args)
-        {
-            if (args.Current is not SlipperyComponentState state) return;
+        base.Initialize();
+
+        SubscribeLocalEvent<SlipperyComponent, StepTriggerAttemptEvent>(HandleAttemptCollide);
+        SubscribeLocalEvent<SlipperyComponent, StepTriggeredEvent>(HandleStepTrigger);
+        SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt);
+        // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
+        SubscribeLocalEvent<NoSlipComponent, InventoryRelayedEvent<SlipAttemptEvent>>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args));
+        SubscribeLocalEvent<SlipperyComponent, ComponentGetState>(OnSlipperyGetState);
+        SubscribeLocalEvent<SlipperyComponent, ComponentHandleState>(OnSlipperyHandleState);
+    }
 
-            component.ParalyzeTime = state.ParalyzeTime;
-            component.LaunchForwardsMultiplier = state.LaunchForwardsMultiplier;
-            component.SlipSound = new SoundPathSpecifier(state.SlipSound);
-        }
+    private void OnSlipperyHandleState(EntityUid uid, SlipperyComponent component, ref ComponentHandleState args)
+    {
+        if (args.Current is not SlipperyComponentState state) return;
 
-        private void OnSlipperyGetState(EntityUid uid, SlipperyComponent component, ref ComponentGetState args)
-        {
-            args.State = new SlipperyComponentState(component.ParalyzeTime, component.LaunchForwardsMultiplier, _audio.GetSound(component.SlipSound));
-        }
+        component.ParalyzeTime = state.ParalyzeTime;
+        component.LaunchForwardsMultiplier = state.LaunchForwardsMultiplier;
+        component.SlipSound = new SoundPathSpecifier(state.SlipSound);
+    }
 
-        private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args)
-        {
-            TrySlip(component, args.Tripper);
-        }
+    private void OnSlipperyGetState(EntityUid uid, SlipperyComponent component, ref ComponentGetState args)
+    {
+        args.State = new SlipperyComponentState(component.ParalyzeTime, component.LaunchForwardsMultiplier, _audio.GetSound(component.SlipSound));
+    }
 
-        private void HandleAttemptCollide(
-            EntityUid uid,
-            SlipperyComponent component,
-            ref StepTriggerAttemptEvent args)
-        {
-            args.Continue |= CanSlip(uid, args.Tripper);
-        }
+    private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args)
+    {
+        TrySlip(uid, component, args.Tripper);
+    }
 
-        private static void OnNoSlipAttempt(EntityUid uid, NoSlipComponent component, SlipAttemptEvent args)
-        {
-            args.Cancel();
-        }
+    private void HandleAttemptCollide(
+        EntityUid uid,
+        SlipperyComponent component,
+        ref StepTriggerAttemptEvent args)
+    {
+        args.Continue |= CanSlip(uid, args.Tripper);
+    }
 
-        private bool CanSlip(EntityUid uid, EntityUid toSlip)
-        {
-            return !_container.IsEntityInContainer(uid)
-                   && _statusEffectsSystem.CanApplyEffect(toSlip, "Stun"); //Should be KnockedDown instead?
-        }
+    private static void OnNoSlipAttempt(EntityUid uid, NoSlipComponent component, SlipAttemptEvent args)
+    {
+        args.Cancel();
+    }
 
-        private void TrySlip(SlipperyComponent component, EntityUid other)
-        {
-            if (HasComp<KnockedDownComponent>(other))
-                return;
+    private bool CanSlip(EntityUid uid, EntityUid toSlip)
+    {
+        return !_container.IsEntityInContainer(uid)
+                && _statusEffects.CanApplyEffect(toSlip, "Stun"); //Should be KnockedDown instead?
+    }
 
-            var ev = new SlipAttemptEvent();
-            RaiseLocalEvent(other, ev, false);
-            if (ev.Cancelled)
-                return;
+    private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other)
+    {
+        if (HasComp<KnockedDownComponent>(other))
+            return;
 
-            if (TryComp(other, out PhysicsComponent? physics))
-                _physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics);
+        var attemptEv = new SlipAttemptEvent();
+        RaiseLocalEvent(other, attemptEv);
+        if (attemptEv.Cancelled)
+            return;
 
-            var playSound = !_statusEffectsSystem.HasStatusEffect(other, "KnockedDown");
+        var ev = new SlipEvent(other);
+        RaiseLocalEvent(uid, ref ev);
 
-            _stunSystem.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true);
+        if (TryComp(other, out PhysicsComponent? physics))
+            _physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics);
 
-            // Preventing from playing the slip sound when you are already knocked down.
-            if (playSound)
-            {
-                _audio.PlayPredicted(component.SlipSound, other, other);
-            }
+        var playSound = !_statusEffects.HasStatusEffect(other, "KnockedDown");
 
-            _adminLogger.Add(LogType.Slip, LogImpact.Low,
-                $"{ToPrettyString(other):mob} slipped on collision with {ToPrettyString(component.Owner):entity}");
-        }
+        _stun.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true);
 
-        public void CopyConstruct(EntityUid destUid, SlipperyComponent srcSlip)
+        // Preventing from playing the slip sound when you are already knocked down.
+        if (playSound)
         {
-            var destEvaporation = EntityManager.EnsureComponent<SlipperyComponent>(destUid);
-            destEvaporation.SlipSound = srcSlip.SlipSound;
-            destEvaporation.ParalyzeTime = srcSlip.ParalyzeTime;
-            destEvaporation.LaunchForwardsMultiplier = srcSlip.LaunchForwardsMultiplier;
+            _audio.PlayPredicted(component.SlipSound, other, other);
         }
+
+        _adminLogger.Add(LogType.Slip, LogImpact.Low,
+            $"{ToPrettyString(other):mob} slipped on collision with {ToPrettyString(uid):entity}");
     }
 
-    /// <summary>
-    ///     Raised on an entity to determine if it can slip or not.
-    /// </summary>
-    public sealed class SlipAttemptEvent : CancellableEntityEventArgs, IInventoryRelayEvent
+    public void CopyConstruct(EntityUid destUid, SlipperyComponent srcSlip)
     {
-        public SlotFlags TargetSlots { get; } = SlotFlags.FEET;
+        var destEvaporation = EntityManager.EnsureComponent<SlipperyComponent>(destUid);
+        destEvaporation.SlipSound = srcSlip.SlipSound;
+        destEvaporation.ParalyzeTime = srcSlip.ParalyzeTime;
+        destEvaporation.LaunchForwardsMultiplier = srcSlip.LaunchForwardsMultiplier;
     }
 }
+
+/// <summary>
+///     Raised on an entity to determine if it can slip or not.
+/// </summary>
+public sealed class SlipAttemptEvent : CancellableEntityEventArgs, IInventoryRelayEvent
+{
+    public SlotFlags TargetSlots { get; } = SlotFlags.FEET;
+}
+
+[ByRefEvent]
+public readonly record struct SlipEvent(EntityUid Slipped);
index 55cb414003e2869f2e10445ec0e08980b6ae6683..88e130bc19802ab5a2f50fe8df7a89588bf880e7 100644 (file)
@@ -151,6 +151,9 @@ uplink-necronomicon-desc = An unholy book capable of summoning a demonic familia
 uplink-revolver-cap-gun-fake-name = Fake Cap Gun
 uplink-revolver-cap-gun-fake-desc = Fool your enemy! It can use both cap and magnum bullets. Comes loaded with magnum bullets.
 
+uplink-banana-peel-explosive-name = Explosive Banana Peel
+uplink-banana-peel-explosive-desc = They will burst into laughter when they slip on it!
+
 # Armor
 uplink-chameleon-name = Chameleon Kit
 uplink-chameleon-desc = A backpack full of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more!
index fb638897b771c6c476cf2ee47a2938aed8ee0059..8d432087c7fecc397044298934f8b64e798821dc 100644 (file)
     - Mime
     - Clown
 
+- type: listing
+  id: uplinkBananaPeelExplosive
+  name: uplink-banana-peel-explosive-name
+  description: uplink-banana-peel-explosive-desc
+  productEntity: TrashBananaPeelExplosive
+  cost:
+    Telecrystal: 2
+  categories:
+  - UplinkJob
+  conditions:
+  - !type:BuyerJobCondition
+    whitelist:
+    - Clown
+
 # Armor
 
 - type: listing
index baa1350196dec08de91b1c47cfcc35203054f27c..631e9aba59c2f9812986d701f6e3d420582ca0e7 100644 (file)
   - type: Recyclable
   - type: SpaceGarbage
 
+- type: entity
+  name: banana peel
+  suffix: Explosive
+  parent: TrashBananaPeel
+  id: TrashBananaPeelExplosive
+  components:
+    - type: Sprite
+      sprite: Objects/Specific/Hydroponics/banana.rsi
+      state: primed
+    - type: TriggerOnSlip
+    - type: ExplodeOnTrigger
+    - type: Explosive
+      explosionType: Default
+      maxIntensity: 2
+      totalIntensity: 10
+      canCreateVacuum: false
+    - type: DeleteOnTrigger
+    - type: AnimationPlayer
+
 - type: entity
   name: carrot
   parent: FoodProduceBase
index f981b7e426072f75ab57cc91681cf365dc978363..88c277fde7d4c7e842efc603a7a313f85e807465 100644 (file)
     },
     {
       "name": "stage-6"
+    },
+    {
+      "name": "primed",
+      "delays": [
+        [
+          4.9,
+          0.1
+        ]
+      ]
     }
   ]
 }
diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/primed.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/primed.png
new file mode 100644 (file)
index 0000000..93c3e38
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/primed.png differ