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; + } } }