diff --git a/Libraries/SPTarkov.Common/Extensions/ObjectExtensions.cs b/Libraries/SPTarkov.Common/Extensions/ObjectExtensions.cs index d7d94de9..d7277ba6 100644 --- a/Libraries/SPTarkov.Common/Extensions/ObjectExtensions.cs +++ b/Libraries/SPTarkov.Common/Extensions/ObjectExtensions.cs @@ -121,4 +121,48 @@ public static class ObjectExtensions var json = element.GetRawText(); return JsonSerializer.Deserialize(json); } + + public static object AddAllToExtensionData(this object obj, Dictionary extensionData) + { + foreach (var keyValuePair in extensionData) + { + obj.AddToExtensionData(keyValuePair.Key, keyValuePair.Value); + } + + return obj; + } + + public static object AddToExtensionData(this object obj, string key, object value) + { + obj.GetExtensionData().Add(key, value); + return obj; + } + + public static object RemoveFromExtensionData(this object obj, string key) + { + obj.GetExtensionData().Remove(key); + return obj; + } + + public static object RemoveAllFromExtensionData(this object obj) + { + obj.GetExtensionData().Clear(); + return obj; + } + + public static Dictionary GetExtensionData(this object obj) + { + if (!obj.TryGetExtensionData(out var extensionData)) + { + throw new Exception($"Attempted to get from extension data for type {obj.GetType().FullName}, but the type doesnt contain ExtensionData or it is null"); + } + return extensionData!; + } + + public static bool TryGetExtensionData(this object obj, out Dictionary? extensionData) + { + extensionData = obj.GetType().GetProperty("ExtensionData", BindingFlags.Instance | BindingFlags.Public)?.GetValue(obj) as + Dictionary; + return extensionData is not null; + } } diff --git a/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs index 3e08e808..694988fb 100644 --- a/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs +++ b/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs @@ -330,7 +330,7 @@ public static class ItemExtensions /// Converted SptLootItem public static SptLootItem ToLootItem(this Item item) { - return new SptLootItem + var lootItem = new SptLootItem { ComposedKey = null, Id = item.Id, @@ -339,9 +339,13 @@ public static class ItemExtensions ParentId = item.ParentId, SlotId = item.SlotId, Location = item.Location, - Desc = item.Desc, - // TODO: re-enable ExtensionData = item.ExtensionData, + Desc = item.Desc }; + if (item.TryGetExtensionData(out var extensionData)) + { + lootItem.AddAllToExtensionData(extensionData!); + } + return lootItem; } public static ItemLocation? GetParsedLocation(this Item item) diff --git a/Libraries/SPTarkov.Server.Core/SPTarkov.Server.Core.csproj b/Libraries/SPTarkov.Server.Core/SPTarkov.Server.Core.csproj index e3961be2..04760822 100644 --- a/Libraries/SPTarkov.Server.Core/SPTarkov.Server.Core.csproj +++ b/Libraries/SPTarkov.Server.Core/SPTarkov.Server.Core.csproj @@ -43,10 +43,11 @@