MappingManager.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.IO;
  2. using Content.Server.Administration.Managers;
  3. using Content.Shared.Administration;
  4. using Content.Shared.Mapping;
  5. using Robust.Server.GameObjects;
  6. using Robust.Server.Player;
  7. using Robust.Shared.EntitySerialization;
  8. using Robust.Shared.EntitySerialization.Systems;
  9. using Robust.Shared.Map;
  10. using Robust.Shared.Network;
  11. using Robust.Shared.Serialization;
  12. using Robust.Shared.Utility;
  13. using YamlDotNet.Core;
  14. using YamlDotNet.RepresentationModel;
  15. namespace Content.Server.Mapping;
  16. public sealed class MappingManager : IPostInjectInit
  17. {
  18. [Dependency] private readonly IAdminManager _admin = default!;
  19. [Dependency] private readonly ILogManager _log = default!;
  20. [Dependency] private readonly IMapManager _map = default!;
  21. [Dependency] private readonly IServerNetManager _net = default!;
  22. [Dependency] private readonly IPlayerManager _players = default!;
  23. [Dependency] private readonly IEntitySystemManager _systems = default!;
  24. [Dependency] private readonly IEntityManager _ent = default!;
  25. private ISawmill _sawmill = default!;
  26. private ZStdCompressionContext _zstd = default!;
  27. public void PostInject()
  28. {
  29. #if !FULL_RELEASE
  30. _net.RegisterNetMessage<MappingSaveMapMessage>(OnMappingSaveMap);
  31. _net.RegisterNetMessage<MappingSaveMapErrorMessage>();
  32. _net.RegisterNetMessage<MappingMapDataMessage>();
  33. _sawmill = _log.GetSawmill("mapping");
  34. _zstd = new ZStdCompressionContext();
  35. #endif
  36. }
  37. private void OnMappingSaveMap(MappingSaveMapMessage message)
  38. {
  39. #if !FULL_RELEASE
  40. try
  41. {
  42. if (!_players.TryGetSessionByChannel(message.MsgChannel, out var session) ||
  43. !_admin.IsAdmin(session, true) ||
  44. !_admin.HasAdminFlag(session, AdminFlags.Host) ||
  45. !_ent.TryGetComponent(session.AttachedEntity, out TransformComponent? xform) ||
  46. xform.MapUid is not {} mapUid)
  47. {
  48. return;
  49. }
  50. var sys = _systems.GetEntitySystem<MapLoaderSystem>();
  51. var data = sys.SerializeEntitiesRecursive([mapUid]).Node;
  52. var document = new YamlDocument(data.ToYaml());
  53. var stream = new YamlStream { document };
  54. var writer = new StringWriter();
  55. stream.Save(new YamlMappingFix(new Emitter(writer)), false);
  56. var msg = new MappingMapDataMessage()
  57. {
  58. Context = _zstd,
  59. Yml = writer.ToString()
  60. };
  61. _net.ServerSendMessage(msg, message.MsgChannel);
  62. }
  63. catch (Exception e)
  64. {
  65. _sawmill.Error($"Error saving map in mapping mode:\n{e}");
  66. var msg = new MappingSaveMapErrorMessage();
  67. _net.ServerSendMessage(msg, message.MsgChannel);
  68. }
  69. #endif
  70. }
  71. }