RehydratableSystem.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Content.Shared.Administration.Logs;
  2. using Content.Shared.Chemistry.Components;
  3. using Content.Shared.Database;
  4. using Content.Shared.FixedPoint;
  5. using Content.Shared.Popups;
  6. using Robust.Shared.Network;
  7. using Robust.Shared.Random;
  8. namespace Content.Shared.Chemistry.EntitySystems;
  9. public sealed class RehydratableSystem : EntitySystem
  10. {
  11. [Dependency] private readonly INetManager _net = default!;
  12. [Dependency] private readonly IRobustRandom _random = default!;
  13. [Dependency] private readonly SharedPopupSystem _popup = default!;
  14. [Dependency] private readonly SharedSolutionContainerSystem _solutions = default!;
  15. [Dependency] private readonly SharedTransformSystem _xform = default!;
  16. [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<RehydratableComponent, SolutionContainerChangedEvent>(OnSolutionChange);
  21. }
  22. private void OnSolutionChange(Entity<RehydratableComponent> ent, ref SolutionContainerChangedEvent args)
  23. {
  24. var quantity = _solutions.GetTotalPrototypeQuantity(ent, ent.Comp.CatalystPrototype);
  25. _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(ent.Owner)} was hydrated, now contains a solution of: {SharedSolutionContainerSystem.ToPrettyString(args.Solution)}.");
  26. if (quantity != FixedPoint2.Zero && quantity >= ent.Comp.CatalystMinimum)
  27. {
  28. Expand(ent);
  29. }
  30. }
  31. // Try not to make this public if you can help it.
  32. private void Expand(Entity<RehydratableComponent> ent)
  33. {
  34. if (_net.IsClient)
  35. return;
  36. var (uid, comp) = ent;
  37. var randomMob = _random.Pick(comp.PossibleSpawns);
  38. var target = Spawn(randomMob, Transform(uid).Coordinates);
  39. _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(ent.Owner)} has been hydrated correctly and spawned: {ToPrettyString(target)}.");
  40. _popup.PopupEntity(Loc.GetString("rehydratable-component-expands-message", ("owner", uid)), target);
  41. _xform.AttachToGridOrMap(target);
  42. var ev = new GotRehydratedEvent(target);
  43. RaiseLocalEvent(uid, ref ev);
  44. // prevent double hydration while queued
  45. RemComp<RehydratableComponent>(uid);
  46. QueueDel(uid);
  47. }
  48. }