EntityCoordinatesConverter.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Text.Json;
  2. using Content.Shared.Station.Components;
  3. using Robust.Shared.Map;
  4. using Robust.Shared.Map.Components;
  5. namespace Content.Server.Administration.Logs.Converters;
  6. [AdminLogConverter]
  7. public sealed class EntityCoordinatesConverter : AdminLogConverter<SerializableEntityCoordinates>
  8. {
  9. // System.Text.Json actually keeps hold of your JsonSerializerOption instances in a cache on .NET 7.
  10. // Use a weak reference to avoid holding server instances live too long in integration tests.
  11. private WeakReference<IEntityManager> _entityManager = default!;
  12. public override void Init(IDependencyCollection dependencies)
  13. {
  14. _entityManager = new WeakReference<IEntityManager>(dependencies.Resolve<IEntityManager>());
  15. }
  16. public void Write(Utf8JsonWriter writer, SerializableEntityCoordinates value, JsonSerializerOptions options, IEntityManager entities)
  17. {
  18. writer.WriteStartObject();
  19. WriteEntityInfo(writer, value.EntityUid, entities, "parent");
  20. writer.WriteNumber("x", value.X);
  21. writer.WriteNumber("y", value.Y);
  22. if (value.MapUid.HasValue)
  23. {
  24. WriteEntityInfo(writer, value.MapUid.Value, entities, "map");
  25. }
  26. writer.WriteEndObject();
  27. }
  28. private static void WriteEntityInfo(Utf8JsonWriter writer, EntityUid value, IEntityManager entities, string rootName)
  29. {
  30. writer.WriteStartObject(rootName);
  31. writer.WriteNumber("uid", value.GetHashCode());
  32. if (entities.TryGetComponent(value, out MetaDataComponent? metaData))
  33. {
  34. writer.WriteString("name", metaData.EntityName);
  35. }
  36. if (entities.TryGetComponent(value, out MapComponent? mapComponent))
  37. {
  38. writer.WriteNumber("mapId", mapComponent.MapId.GetHashCode());
  39. writer.WriteBoolean("mapPaused", mapComponent.MapPaused);
  40. }
  41. if (entities.TryGetComponent(value, out StationMemberComponent? stationMemberComponent))
  42. {
  43. WriteEntityInfo(writer, stationMemberComponent.Station, entities, "stationMember");
  44. }
  45. writer.WriteEndObject();
  46. }
  47. public override void Write(Utf8JsonWriter writer, SerializableEntityCoordinates value, JsonSerializerOptions options)
  48. {
  49. if (!_entityManager.TryGetTarget(out var entityManager))
  50. throw new InvalidOperationException("EntityManager got garbage collected!");
  51. Write(writer, value, options, entityManager);
  52. }
  53. }
  54. public readonly struct SerializableEntityCoordinates
  55. {
  56. public readonly EntityUid EntityUid;
  57. public readonly float X;
  58. public readonly float Y;
  59. public readonly EntityUid? MapUid;
  60. public SerializableEntityCoordinates(IEntityManager entityManager, EntityCoordinates coordinates)
  61. {
  62. EntityUid = coordinates.EntityId;
  63. X = coordinates.X;
  64. Y = coordinates.Y;
  65. MapUid = coordinates.GetMapUid(entityManager);
  66. }
  67. }