1
0

SharedDevourSystem.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Content.Shared.Actions;
  2. using Content.Shared.Devour.Components;
  3. using Content.Shared.DoAfter;
  4. using Content.Shared.Mobs;
  5. using Content.Shared.Mobs.Components;
  6. using Content.Shared.Popups;
  7. using Content.Shared.Whitelist;
  8. using Robust.Shared.Audio;
  9. using Robust.Shared.Audio.Systems;
  10. using Robust.Shared.Containers;
  11. using Robust.Shared.Serialization;
  12. namespace Content.Shared.Devour;
  13. public abstract class SharedDevourSystem : EntitySystem
  14. {
  15. [Dependency] protected readonly SharedAudioSystem _audioSystem = default!;
  16. [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
  17. [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
  18. [Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
  19. [Dependency] protected readonly SharedContainerSystem ContainerSystem = default!;
  20. [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
  21. public override void Initialize()
  22. {
  23. base.Initialize();
  24. SubscribeLocalEvent<DevourerComponent, MapInitEvent>(OnInit);
  25. SubscribeLocalEvent<DevourerComponent, DevourActionEvent>(OnDevourAction);
  26. }
  27. protected void OnInit(EntityUid uid, DevourerComponent component, MapInitEvent args)
  28. {
  29. //Devourer doesn't actually chew, since he sends targets right into his stomach.
  30. //I did it mom, I added ERP content into upstream. Legally!
  31. component.Stomach = ContainerSystem.EnsureContainer<Container>(uid, "stomach");
  32. //_actionsSystem.AddAction(uid, ref component.DevourActionEntity, component.DevourAction);
  33. }
  34. /// <summary>
  35. /// The devour action
  36. /// </summary>
  37. protected void OnDevourAction(EntityUid uid, DevourerComponent component, DevourActionEvent args)
  38. {
  39. if (args.Handled || _whitelistSystem.IsWhitelistFailOrNull(component.Whitelist, args.Target))
  40. return;
  41. args.Handled = true;
  42. var target = args.Target;
  43. // Structure and mob devours handled differently.
  44. if (TryComp(target, out MobStateComponent? targetState))
  45. {
  46. switch (targetState.CurrentState)
  47. {
  48. case MobState.Critical:
  49. case MobState.Dead:
  50. _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.DevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid)
  51. {
  52. BreakOnMove = true,
  53. });
  54. break;
  55. default:
  56. _popupSystem.PopupClient(Loc.GetString("devour-action-popup-message-fail-target-alive"), uid, uid);
  57. break;
  58. }
  59. return;
  60. }
  61. _popupSystem.PopupClient(Loc.GetString("devour-action-popup-message-structure"), uid, uid);
  62. if (component.SoundStructureDevour != null)
  63. _audioSystem.PlayPredicted(component.SoundStructureDevour, uid, uid, component.SoundStructureDevour.Params);
  64. _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.StructureDevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid)
  65. {
  66. BreakOnMove = true,
  67. });
  68. }
  69. }
  70. public sealed partial class DevourActionEvent : EntityTargetActionEvent { }
  71. [Serializable, NetSerializable]
  72. public sealed partial class DevourDoAfterEvent : SimpleDoAfterEvent { }
  73. [Serializable, NetSerializable]
  74. public enum FoodPreference : byte
  75. {
  76. Humanoid = 0,
  77. All = 1
  78. }