Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/GenericPrefabFile.cs
Markus Isberg 7547a9b78a Build 0.18.0.0
2022-05-13 00:55:52 +09:00

79 lines
2.5 KiB
C#

using System.Linq;
using System.Xml.Linq;
namespace Barotrauma
{
abstract class GenericPrefabFile<T> : ContentFile where T : Prefab
{
protected GenericPrefabFile(ContentPackage contentPackage, ContentPath path) : base(contentPackage, path) { }
protected abstract bool MatchesSingular(Identifier identifier);
protected abstract bool MatchesPlural(Identifier identifier);
protected abstract PrefabCollection<T> Prefabs { get; }
protected abstract T CreatePrefab(ContentXElement element);
private void LoadFromXElement(ContentXElement parentElement, bool overriding)
{
Identifier elemName = parentElement.NameAsIdentifier();
var childElements = parentElement.Elements()
#if DEBUG
.OrderBy(e => Rand.Int(int.MaxValue, Rand.RandSync.Unsynced)).ToArray()
#endif
;
if (parentElement.IsOverride())
{
foreach (var element in childElements)
{
LoadFromXElement(element, true);
}
}
else if (elemName == "clear")
{
Prefabs.AddOverrideFile(this);
}
else if (MatchesSingular(elemName))
{
T prefab = CreatePrefab(parentElement);
try
{
Prefabs.Add(prefab, overriding);
}
catch
{
prefab.Dispose(); //clean up before rethrowing, since some prefab types might lock resources
throw;
}
}
else if (MatchesPlural(elemName))
{
foreach (var element in childElements)
{
LoadFromXElement(element, overriding);
}
}
else
{
DebugConsole.ThrowError($"GenericPrefabFile: Invalid {GetType().Name} element: {parentElement.Name} in {Path}");
}
}
public override sealed void LoadFile()
{
XDocument doc = XMLExtensions.TryLoadXml(Path);
if (doc == null) { return; }
var rootElement = doc.Root.FromPackage(ContentPackage);
LoadFromXElement(rootElement, false);
}
public override sealed void UnloadFile()
{
Prefabs.RemoveByFile(this);
}
public sealed override void Sort()
{
Prefabs.SortAll();
}
}
}