InnateToolSystem.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System.Linq;
  2. using Content.Shared.Body.Part;
  3. using Content.Shared.Destructible;
  4. using Content.Shared.Hands;
  5. using Content.Shared.Hands.Components;
  6. using Content.Shared.Hands.EntitySystems;
  7. using Content.Shared.Interaction.Components;
  8. using Content.Shared.Storage;
  9. using Content.Shared.Tag;
  10. using Robust.Shared.Network;
  11. using Robust.Shared.Random;
  12. namespace Content.Server.Tools.Innate;
  13. /// <summary>
  14. /// Spawns a list unremovable tools in hands if possible. Used for drones,
  15. /// borgs, or maybe even stuff like changeling armblades!
  16. /// </summary>
  17. public sealed class InnateToolSystem : EntitySystem
  18. {
  19. [Dependency] private readonly IRobustRandom _robustRandom = default!;
  20. [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
  21. [Dependency] private readonly TagSystem _tagSystem = default!;
  22. public override void Initialize()
  23. {
  24. base.Initialize();
  25. SubscribeLocalEvent<InnateToolComponent, MapInitEvent>(OnMapInit);
  26. SubscribeLocalEvent<InnateToolComponent, HandCountChangedEvent>(OnHandCountChanged);
  27. SubscribeLocalEvent<InnateToolComponent, ComponentShutdown>(OnShutdown);
  28. SubscribeLocalEvent<InnateToolComponent, DestructionEventArgs>(OnDestroyed);
  29. }
  30. private void OnMapInit(EntityUid uid, InnateToolComponent component, MapInitEvent args)
  31. {
  32. if (component.Tools.Count == 0)
  33. return;
  34. component.ToSpawn = EntitySpawnCollection.GetSpawns(component.Tools, _robustRandom);
  35. }
  36. private void OnHandCountChanged(EntityUid uid, InnateToolComponent component, HandCountChangedEvent args)
  37. {
  38. if (component.ToSpawn.Count == 0)
  39. return;
  40. var spawnCoord = Transform(uid).Coordinates;
  41. var toSpawn = component.ToSpawn.First();
  42. var item = Spawn(toSpawn, spawnCoord);
  43. AddComp<UnremoveableComponent>(item);
  44. if (!_sharedHandsSystem.TryPickupAnyHand(uid, item, checkActionBlocker: false))
  45. {
  46. QueueDel(item);
  47. component.ToSpawn.Clear();
  48. }
  49. component.ToSpawn.Remove(toSpawn);
  50. component.ToolUids.Add(item);
  51. }
  52. private void OnShutdown(EntityUid uid, InnateToolComponent component, ComponentShutdown args)
  53. {
  54. foreach (var tool in component.ToolUids)
  55. {
  56. RemComp<UnremoveableComponent>(tool);
  57. }
  58. }
  59. private void OnDestroyed(EntityUid uid, InnateToolComponent component, DestructionEventArgs args)
  60. {
  61. Cleanup(uid, component);
  62. }
  63. public void Cleanup(EntityUid uid, InnateToolComponent component)
  64. {
  65. foreach (var tool in component.ToolUids)
  66. {
  67. if (_tagSystem.HasTag(tool, "InnateDontDelete"))
  68. {
  69. RemComp<UnremoveableComponent>(tool);
  70. }
  71. else
  72. {
  73. Del(tool);
  74. }
  75. if (TryComp<HandsComponent>(uid, out var hands))
  76. {
  77. foreach (var hand in hands.Hands)
  78. {
  79. _sharedHandsSystem.TryDrop(uid, hand.Value, checkActionBlocker: false, handsComp: hands);
  80. }
  81. }
  82. }
  83. component.ToolUids.Clear();
  84. }
  85. }