add info to entity coordinate logs (#19257)
This commit is contained in:
@@ -5,6 +5,7 @@ using Content.Server.Administration.Logs.Converters;
|
||||
using Content.Server.Database;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Server.Player;
|
||||
using Robust.Shared.Map;
|
||||
|
||||
namespace Content.Server.Administration.Logs;
|
||||
|
||||
@@ -46,6 +47,7 @@ public sealed partial class AdminLogManager
|
||||
value = value switch
|
||||
{
|
||||
IPlayerSession player => new SerializablePlayer(player),
|
||||
EntityCoordinates entityCoordinates => new SerializableEntityCoordinates(_entityManager, entityCoordinates),
|
||||
_ => value
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
using System.Text.Json;
|
||||
using Content.Server.Station.Components;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Map.Components;
|
||||
|
||||
namespace Content.Server.Administration.Logs.Converters;
|
||||
|
||||
[AdminLogConverter]
|
||||
public sealed class EntityCoordinatesConverter : AdminLogConverter<SerializableEntityCoordinates>
|
||||
{
|
||||
// System.Text.Json actually keeps hold of your JsonSerializerOption instances in a cache on .NET 7.
|
||||
// Use a weak reference to avoid holding server instances live too long in integration tests.
|
||||
private WeakReference<IEntityManager> _entityManager = default!;
|
||||
|
||||
public override void Init(IDependencyCollection dependencies)
|
||||
{
|
||||
_entityManager = new WeakReference<IEntityManager>(dependencies.Resolve<IEntityManager>());
|
||||
}
|
||||
|
||||
public void Write(Utf8JsonWriter writer, SerializableEntityCoordinates value, JsonSerializerOptions options, IEntityManager entities)
|
||||
{
|
||||
writer.WriteStartObject();
|
||||
WriteEntityInfo(writer, value.EntityUid, entities, "parent");
|
||||
writer.WriteNumber("x", value.X);
|
||||
writer.WriteNumber("y", value.Y);
|
||||
if (value.MapUid.HasValue)
|
||||
{
|
||||
WriteEntityInfo(writer, value.MapUid.Value, entities, "map");
|
||||
}
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
|
||||
private static void WriteEntityInfo(Utf8JsonWriter writer, EntityUid value, IEntityManager entities, string rootName)
|
||||
{
|
||||
writer.WriteStartObject(rootName);
|
||||
writer.WriteNumber("uid", value.GetHashCode());
|
||||
if (entities.TryGetComponent(value, out MetaDataComponent? metaData))
|
||||
{
|
||||
writer.WriteString("name", metaData.EntityName);
|
||||
}
|
||||
if (entities.TryGetComponent(value, out MapComponent? mapComponent))
|
||||
{
|
||||
writer.WriteNumber("mapId", mapComponent.MapId.GetHashCode());
|
||||
writer.WriteBoolean("mapPaused", mapComponent.MapPaused);
|
||||
}
|
||||
if (entities.TryGetComponent(value, out StationMemberComponent? stationMemberComponent))
|
||||
{
|
||||
WriteEntityInfo(writer, stationMemberComponent.Station, entities, "stationMember");
|
||||
}
|
||||
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, SerializableEntityCoordinates value, JsonSerializerOptions options)
|
||||
{
|
||||
if (!_entityManager.TryGetTarget(out var entityManager))
|
||||
throw new InvalidOperationException("EntityManager got garbage collected!");
|
||||
|
||||
Write(writer, value, options, entityManager);
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct SerializableEntityCoordinates
|
||||
{
|
||||
public readonly EntityUid EntityUid;
|
||||
public readonly float X;
|
||||
public readonly float Y;
|
||||
public readonly EntityUid? MapUid;
|
||||
|
||||
public SerializableEntityCoordinates(IEntityManager entityManager, EntityCoordinates coordinates)
|
||||
{
|
||||
EntityUid = coordinates.EntityId;
|
||||
X = coordinates.X;
|
||||
Y = coordinates.Y;
|
||||
MapUid = coordinates.GetMapUid(entityManager);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ public sealed class AdminTestArenaSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||
[Dependency] private readonly MapLoaderSystem _map = default!;
|
||||
[Dependency] private readonly MetaDataSystem _metaDataSystem = default!;
|
||||
|
||||
public const string ArenaMapPath = "/Maps/Test/admin_test_arena.yml";
|
||||
|
||||
@@ -35,8 +36,17 @@ public sealed class AdminTestArenaSystem : EntitySystem
|
||||
}
|
||||
|
||||
ArenaMap[admin.UserId] = _mapManager.GetMapEntityId(_mapManager.CreateMap());
|
||||
_metaDataSystem.SetEntityName(ArenaMap[admin.UserId], $"ATAM-{admin.Name}");
|
||||
var grids = _map.LoadMap(Comp<MapComponent>(ArenaMap[admin.UserId]).MapId, ArenaMapPath);
|
||||
ArenaGrid[admin.UserId] = grids.Count == 0 ? null : grids[0];
|
||||
if (grids.Count != 0)
|
||||
{
|
||||
_metaDataSystem.SetEntityName(grids[0], $"ATAG-{admin.Name}");
|
||||
ArenaGrid[admin.UserId] = grids[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
ArenaGrid[admin.UserId] = null;
|
||||
}
|
||||
|
||||
return (ArenaMap[admin.UserId], ArenaGrid[admin.UserId]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user