ReactionMixerSystem.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.Chemistry.Reaction;
  3. using Content.Shared.DoAfter;
  4. using Content.Shared.IdentityManagement;
  5. using Content.Shared.Interaction;
  6. using Content.Shared.Nutrition.EntitySystems;
  7. using Content.Shared.Chemistry.EntitySystems;
  8. using Content.Server.Popups;
  9. namespace Content.Server.Chemistry.EntitySystems;
  10. public sealed partial class ReactionMixerSystem : EntitySystem
  11. {
  12. [Dependency] private readonly PopupSystem _popup = default!;
  13. [Dependency] private readonly SharedSolutionContainerSystem _solutionContainers = default!;
  14. [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
  15. public override void Initialize()
  16. {
  17. base.Initialize();
  18. SubscribeLocalEvent<ReactionMixerComponent, AfterInteractEvent>(OnAfterInteract);
  19. SubscribeLocalEvent<ReactionMixerComponent, ShakeEvent>(OnShake);
  20. SubscribeLocalEvent<ReactionMixerComponent, ReactionMixDoAfterEvent>(OnDoAfter);
  21. }
  22. private void OnAfterInteract(Entity<ReactionMixerComponent> entity, ref AfterInteractEvent args)
  23. {
  24. if (!args.Target.HasValue || !args.CanReach || !entity.Comp.MixOnInteract)
  25. return;
  26. if (!MixAttempt(entity, args.Target.Value, out var solution))
  27. return;
  28. var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.TimeToMix, new ReactionMixDoAfterEvent(), entity, args.Target.Value, entity);
  29. _doAfterSystem.TryStartDoAfter(doAfterArgs);
  30. }
  31. private void OnDoAfter(Entity<ReactionMixerComponent> entity, ref ReactionMixDoAfterEvent args)
  32. {
  33. //Do again to get the solution again
  34. if (!MixAttempt(entity, args.Target!.Value, out var solution))
  35. return;
  36. _popup.PopupEntity(Loc.GetString(entity.Comp.MixMessage, ("mixed", Identity.Entity(args.Target!.Value, EntityManager)), ("mixer", Identity.Entity(entity.Owner, EntityManager))), args.User, args.User);
  37. _solutionContainers.UpdateChemicals(solution!.Value, true, entity.Comp);
  38. var afterMixingEvent = new AfterMixingEvent(entity, args.Target!.Value);
  39. RaiseLocalEvent(entity, afterMixingEvent);
  40. }
  41. private void OnShake(Entity<ReactionMixerComponent> entity, ref ShakeEvent args)
  42. {
  43. if (!MixAttempt(entity, entity, out var solution))
  44. return;
  45. _solutionContainers.UpdateChemicals(solution!.Value, true, entity.Comp);
  46. var afterMixingEvent = new AfterMixingEvent(entity, entity);
  47. RaiseLocalEvent(entity, afterMixingEvent);
  48. }
  49. private bool MixAttempt(EntityUid ent, EntityUid target, out Entity<SolutionComponent>? solution)
  50. {
  51. solution = null;
  52. var mixAttemptEvent = new MixingAttemptEvent(ent);
  53. RaiseLocalEvent(ent, ref mixAttemptEvent);
  54. if (mixAttemptEvent.Cancelled)
  55. {
  56. return false;
  57. }
  58. if (!_solutionContainers.TryGetMixableSolution(target, out solution, out _))
  59. return false;
  60. return true;
  61. }
  62. }