CreamPieSystem.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Content.Server.Explosion.EntitySystems;
  2. using Content.Server.Fluids.EntitySystems;
  3. using Content.Server.Nutrition.Components;
  4. using Content.Server.Popups;
  5. using Content.Shared.Containers.ItemSlots;
  6. using Content.Shared.Explosion.Components;
  7. using Content.Shared.IdentityManagement;
  8. using Content.Shared.Nutrition;
  9. using Content.Shared.Nutrition.Components;
  10. using Content.Shared.Nutrition.EntitySystems;
  11. using Content.Shared.Rejuvenate;
  12. using Content.Shared.Throwing;
  13. using Content.Shared.Chemistry.EntitySystems;
  14. using JetBrains.Annotations;
  15. using Robust.Shared.Audio;
  16. using Robust.Shared.Audio.Systems;
  17. using Robust.Shared.Player;
  18. namespace Content.Server.Nutrition.EntitySystems
  19. {
  20. [UsedImplicitly]
  21. public sealed class CreamPieSystem : SharedCreamPieSystem
  22. {
  23. [Dependency] private readonly SharedSolutionContainerSystem _solutions = default!;
  24. [Dependency] private readonly PuddleSystem _puddle = default!;
  25. [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
  26. [Dependency] private readonly TriggerSystem _trigger = default!;
  27. [Dependency] private readonly SharedAudioSystem _audio = default!;
  28. [Dependency] private readonly PopupSystem _popup = default!;
  29. public override void Initialize()
  30. {
  31. base.Initialize();
  32. // activate BEFORE entity is deleted and trash is spawned
  33. SubscribeLocalEvent<CreamPieComponent, ConsumeDoAfterEvent>(OnConsume, before: [typeof(FoodSystem)]);
  34. SubscribeLocalEvent<CreamPieComponent, SliceFoodEvent>(OnSlice);
  35. SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate);
  36. }
  37. protected override void SplattedCreamPie(EntityUid uid, CreamPieComponent creamPie)
  38. {
  39. // The entity is deleted, so play the sound at its position rather than parenting
  40. var coordinates = Transform(uid).Coordinates;
  41. _audio.PlayPvs(_audio.ResolveSound(creamPie.Sound), coordinates, AudioParams.Default.WithVariation(0.125f));
  42. if (EntityManager.TryGetComponent(uid, out FoodComponent? foodComp))
  43. {
  44. if (_solutions.TryGetSolution(uid, foodComp.Solution, out _, out var solution))
  45. {
  46. _puddle.TrySpillAt(uid, solution, out _, false);
  47. }
  48. foreach (var trash in foodComp.Trash)
  49. {
  50. EntityManager.SpawnEntity(trash, Transform(uid).Coordinates);
  51. }
  52. }
  53. ActivatePayload(uid);
  54. EntityManager.QueueDeleteEntity(uid);
  55. }
  56. private void OnConsume(Entity<CreamPieComponent> entity, ref ConsumeDoAfterEvent args)
  57. {
  58. ActivatePayload(entity);
  59. }
  60. private void OnSlice(Entity<CreamPieComponent> entity, ref SliceFoodEvent args)
  61. {
  62. ActivatePayload(entity);
  63. }
  64. private void ActivatePayload(EntityUid uid)
  65. {
  66. if (_itemSlots.TryGetSlot(uid, CreamPieComponent.PayloadSlotName, out var itemSlot))
  67. {
  68. if (_itemSlots.TryEject(uid, itemSlot, user: null, out var item))
  69. {
  70. if (TryComp<OnUseTimerTriggerComponent>(item.Value, out var timerTrigger))
  71. {
  72. _trigger.HandleTimerTrigger(
  73. item.Value,
  74. null,
  75. timerTrigger.Delay,
  76. timerTrigger.BeepInterval,
  77. timerTrigger.InitialBeepDelay,
  78. timerTrigger.BeepSound);
  79. }
  80. }
  81. }
  82. }
  83. protected override void CreamedEntity(EntityUid uid, CreamPiedComponent creamPied, ThrowHitByEvent args)
  84. {
  85. _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message", ("thrower", args.Thrown)), uid, args.Target);
  86. var otherPlayers = Filter.Empty().AddPlayersByPvs(uid);
  87. if (TryComp<ActorComponent>(args.Target, out var actor))
  88. {
  89. otherPlayers.RemovePlayer(actor.PlayerSession);
  90. }
  91. _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message-others", ("owner", Identity.Name(uid, EntityManager)), ("thrower", args.Thrown)), uid, otherPlayers, false);
  92. }
  93. private void OnRejuvenate(Entity<CreamPiedComponent> entity, ref RejuvenateEvent args)
  94. {
  95. SetCreamPied(entity, entity.Comp, false);
  96. }
  97. }
  98. }