SpawnTableOnUseSystem.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Content.Server.Administration.Logs;
  2. using Content.Server.Storage.Components;
  3. using Content.Shared.Database;
  4. using Content.Shared.EntityTable;
  5. using Content.Shared.Hands.EntitySystems;
  6. using Content.Shared.Interaction.Events;
  7. namespace Content.Server.Storage.EntitySystems;
  8. public sealed class SpawnTableOnUseSystem : EntitySystem
  9. {
  10. [Dependency] private readonly EntityTableSystem _entityTable = default!;
  11. [Dependency] private readonly IAdminLogManager _adminLogger = default!;
  12. [Dependency] private readonly SharedHandsSystem _hands = default!;
  13. [Dependency] private readonly SharedTransformSystem _transform = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<SpawnTableOnUseComponent, UseInHandEvent>(OnUseInHand);
  18. }
  19. private void OnUseInHand(Entity<SpawnTableOnUseComponent> ent, ref UseInHandEvent args)
  20. {
  21. if (args.Handled)
  22. return;
  23. var coords = Transform(ent).Coordinates;
  24. var spawns = _entityTable.GetSpawns(ent.Comp.Table);
  25. // Don't delete the entity in the event bus, so we queue it for deletion.
  26. // We need the free hand for the new item, so we send it to nullspace.
  27. _transform.DetachEntity(ent, Transform(ent));
  28. QueueDel(ent);
  29. foreach (var id in spawns)
  30. {
  31. var spawned = Spawn(id, coords);
  32. _adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(args.User):user} used {ToPrettyString(ent):spawner} which spawned {ToPrettyString(spawned)}");
  33. _hands.PickupOrDrop(args.User, spawned);
  34. }
  35. args.Handled = true;
  36. }
  37. }