From 772b0e4218dd97d479e36c1a52f03cc02a29960d Mon Sep 17 00:00:00 2001
From: GrooveypenguinX <79855395+GrooveypenguinX@users.noreply.github.com>
Date: Sun, 1 Jun 2025 09:05:30 -0400
Subject: [PATCH] Fixed overrideproperties not applying in customitemservice
Swapped out the old method with new logic that sets the properties using reflection, and can also handle fields.
---
.../Services/Mod/CustomItemService.cs | 50 ++++++++++++++++---
1 file changed, 43 insertions(+), 7 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs b/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
index 9e8ecf31..2b94f952 100644
--- a/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/Mod/CustomItemService.cs
@@ -135,20 +135,56 @@ public class CustomItemService(
///
/// Iterates through supplied properties and updates the cloned items properties with them
- /// Complex objects cannot have overrides, they must be fully hydrated with values if they are to be used
///
/// New properties to apply
/// Item to update
protected void UpdateBaseItemPropertiesWithOverrides(Props? overrideProperties, TemplateItem itemClone)
{
- if (overrideProperties is null)
- {
- return;
- }
+ if (overrideProperties is null || itemClone?.Properties is null) return;
- foreach (var propKey in overrideProperties.GetAllPropsAsDict())
+ var target = itemClone.Properties;
+ var targetType = target.GetType();
+
+ foreach (var member in overrideProperties.GetType().GetMembers())
{
- itemClone.Properties.GetAllPropsAsDict()[propKey.Key] = overrideProperties.GetAllPropsAsDict()[propKey.Key];
+ var value = member.MemberType switch
+ {
+ MemberTypes.Property => ((PropertyInfo)member).GetValue(overrideProperties),
+ MemberTypes.Field => ((FieldInfo)member).GetValue(overrideProperties),
+ _ => null
+ };
+
+ if (value is null)
+ {
+ continue;
+ }
+
+ var targetMember = targetType.GetMember(member.Name).FirstOrDefault();
+ if (targetMember is null)
+ {
+ continue;
+ }
+
+ switch (targetMember.MemberType)
+ {
+ case MemberTypes.Property:
+ var prop = (PropertyInfo)targetMember;
+ if (prop.CanWrite)
+ {
+ prop.SetValue(target, value);
+ }
+
+ break;
+
+ case MemberTypes.Field:
+ var field = (FieldInfo)targetMember;
+ if (!field.IsInitOnly)
+ {
+ field.SetValue(target, value);
+ }
+
+ break;
+ }
}
}