Allow to put explosives with timer in cream pie (#13866)

This commit is contained in:
Slava0135
2023-02-05 23:07:51 +03:00
committed by GitHub
parent 11dbc2eabc
commit 11aece8519
3 changed files with 71 additions and 9 deletions

View 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)

View File

@@ -15,5 +15,7 @@ namespace Content.Shared.Nutrition.Components
[ViewVariables]
public bool Splatted { get; set; } = false;
public const string PayloadSlotName = "payloadSlot";
}
}

View File

@@ -141,6 +141,19 @@
- 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