diff --git a/Content.Shared/Sound/SoundSpecifierTypeSerializer.cs b/Content.Shared/Sound/SoundSpecifierTypeSerializer.cs index 26596961c5..70d8956642 100644 --- a/Content.Shared/Sound/SoundSpecifierTypeSerializer.cs +++ b/Content.Shared/Sound/SoundSpecifierTypeSerializer.cs @@ -1,16 +1,26 @@ using System; +using Content.Shared.Audio; +using Robust.Shared.ContentPack; using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.Manager.Result; using Robust.Shared.Serialization.Markdown.Mapping; using Robust.Shared.Serialization.Markdown.Validation; +using Robust.Shared.Serialization.Markdown.Value; +using Robust.Shared.Serialization.TypeSerializers.Implementations; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Interfaces; +using Robust.Shared.Utility; namespace Content.Shared.Sound { [TypeSerializer] - public class SoundSpecifierTypeSerializer : ITypeReader + public class SoundSpecifierTypeSerializer : + ITypeReader, + ITypeReader { private Type GetType(MappingDataNode node) { @@ -33,6 +43,19 @@ namespace Content.Shared.Sound return serializationManager.Read(type, node, context, skipHook); } + public DeserializationResult Read(ISerializationManager serializationManager, ValueDataNode node, + IDependencyCollection dependencies, bool skipHook, ISerializationContext? context = null) + { + var value = node.Value; + if (dependencies.Resolve().HasIndex(value)) + return new DeserializedValue(new SoundCollectionSpecifier(value)); + + if (dependencies.Resolve().ContentFileExists(value)) + return new DeserializedValue(new SoundPathSpecifier(value)); + + throw new InvalidMappingException("SoundSpecifier is neither a resource path or sound collection identifier"); + } + public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node, IDependencyCollection dependencies, ISerializationContext? context = null) { @@ -44,5 +67,15 @@ namespace Content.Shared.Sound return serializationManager.ValidateNode(GetType(node), node, context); } + + public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node, + IDependencyCollection dependencies, ISerializationContext? context = null) + { + if (serializationManager.ValidateNode(node, context) is not ErrorNode + || serializationManager.ValidateNodeWith, ValueDataNode>(node, context) is not ErrorNode) + return new ValidatedValueNode(node); + + return new ErrorNode(node, "SoundSpecifier value is neither a valid resource path nor an existing sound collection identifier!"); + } } }