NPCBlackboardSerializer.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Robust.Shared.Reflection;
  2. using Robust.Shared.Serialization;
  3. using Robust.Shared.Serialization.Manager;
  4. using Robust.Shared.Serialization.Markdown;
  5. using Robust.Shared.Serialization.Markdown.Mapping;
  6. using Robust.Shared.Serialization.Markdown.Validation;
  7. using Robust.Shared.Serialization.TypeSerializers.Interfaces;
  8. using Robust.Shared.Utility;
  9. namespace Content.Server.NPC;
  10. public sealed class NPCBlackboardSerializer : ITypeReader<NPCBlackboard, MappingDataNode>, ITypeCopier<NPCBlackboard>
  11. {
  12. public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node,
  13. IDependencyCollection dependencies, ISerializationContext? context = null)
  14. {
  15. var validated = new List<ValidationNode>();
  16. if (node.Count <= 0)
  17. return new ValidatedSequenceNode(validated);
  18. var reflection = dependencies.Resolve<IReflectionManager>();
  19. foreach (var data in node)
  20. {
  21. var key = data.Key.ToYamlNode().AsString();
  22. if (data.Value.Tag == null)
  23. {
  24. validated.Add(new ErrorNode(data.Key, $"Unable to validate {key}'s type"));
  25. continue;
  26. }
  27. var typeString = data.Value.Tag[6..];
  28. if (!reflection.TryLooseGetType(typeString, out var type))
  29. {
  30. validated.Add(new ErrorNode(data.Key, $"Unable to find type for {typeString}"));
  31. continue;
  32. }
  33. var validatedNode = serializationManager.ValidateNode(type, data.Value, context);
  34. validated.Add(validatedNode);
  35. }
  36. return new ValidatedSequenceNode(validated);
  37. }
  38. public NPCBlackboard Read(ISerializationManager serializationManager, MappingDataNode node,
  39. IDependencyCollection dependencies,
  40. SerializationHookContext hookCtx, ISerializationContext? context = null,
  41. ISerializationManager.InstantiationDelegate<NPCBlackboard>? instanceProvider = null)
  42. {
  43. var value = instanceProvider != null ? instanceProvider() : new NPCBlackboard();
  44. if (node.Count <= 0)
  45. return value;
  46. var reflection = dependencies.Resolve<IReflectionManager>();
  47. foreach (var data in node)
  48. {
  49. var key = data.Key.ToYamlNode().AsString();
  50. if (data.Value.Tag == null)
  51. throw new NullReferenceException($"Found null tag for {key}");
  52. var typeString = data.Value.Tag[6..];
  53. if (!reflection.TryLooseGetType(typeString, out var type))
  54. throw new NullReferenceException($"Found null type for {key}");
  55. var bbData = serializationManager.Read(type, data.Value, hookCtx, context);
  56. if (bbData == null)
  57. throw new NullReferenceException($"Found null data for {key}, expected {type}");
  58. value.SetValue(key, bbData);
  59. }
  60. return value;
  61. }
  62. public void CopyTo(
  63. ISerializationManager serializationManager,
  64. NPCBlackboard source,
  65. ref NPCBlackboard target,
  66. IDependencyCollection dependencies,
  67. SerializationHookContext hookCtx,
  68. ISerializationContext? context = null)
  69. {
  70. target.Clear();
  71. using var enumerator = source.GetEnumerator();
  72. while (enumerator.MoveNext())
  73. {
  74. var current = enumerator.Current;
  75. target.SetValue(current.Key, current.Value);
  76. }
  77. }
  78. }