private static VLTBaseType CloneObjectWithReflection(VLTBaseType originalValue, VLTBaseType newValue, VltClass vltClass, VltClassField vltClassField, VltCollection vltCollection) { PropertyInfo[] properties = originalValue.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.SetMethod?.IsPublic ?? false) .ToArray(); foreach (var propertyInfo in properties) { if (propertyInfo.PropertyType.IsSubclassOf(typeof(VLTBaseType))) { propertyInfo.SetValue(newValue, CloneObjectWithReflection( propertyInfo.GetValue(originalValue) as VLTBaseType, Activator.CreateInstance(propertyInfo.PropertyType, vltClass, vltClassField, vltCollection) as VLTBaseType, vltClass, vltClassField, vltCollection)); } else if (propertyInfo.PropertyType == typeof(string)) { propertyInfo.SetValue(newValue, new string(propertyInfo.GetValue(originalValue) as string)); } else if (propertyInfo.PropertyType.IsPrimitive || propertyInfo.PropertyType.IsEnum) { propertyInfo.SetValue(newValue, propertyInfo.GetValue(originalValue)); } else if (propertyInfo.PropertyType.IsArray && propertyInfo.GetValue(originalValue) != null) { propertyInfo.SetValue(newValue, ((Array)propertyInfo.GetValue(originalValue)).Clone()); } } return(newValue); }
public EffectLinkageRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public JittererParams(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public RoadblockElement(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public SirenSequence(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public GMapRegionInfo(VltClass @class, VltClassField field) : base(@class, field) { }
public CopCountRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public ControllerDataRecord(VltClass @class, VltClassField field) : base(@class, field) { }
public FXROADNOISE_TRANSITION(VltClass @class, VltClassField field) : base(@class, field) { }
public FECarPartInfo(VltClass @class, VltClassField field) : base(@class, field) { }
public ControllerDataRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public FECarPartInfo(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public FEMsgToSoundTrigger(VltClass @class, VltClassField field) : base(@class, field) { }
public FEMsgToSoundTrigger(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public BlackBoardSlot(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public FXROADNOISE_TRANSITION(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public BlackBoardSlot(VltClass @class, VltClassField field) : base(@class, field) { }
public TireTimeEffectRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public GMapRegionInfo(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public TireTimeEffectRecord(VltClass @class, VltClassField field) : base(@class, field) { }
public CopCountRecord(VltClass @class, VltClassField field) : base(@class, field) { }
public RefSpec(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection) { }
public RoadblockElement(VltClass @class, VltClassField field) : base(@class, field) { }
public RefSpec(VltClass @class, VltClassField field) : base(@class, field) { }
public SirenSequence(VltClass @class, VltClassField field) : base(@class, field) { }
public ClassRefSpec_fe_flashers(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection, "fe_flashers") { }
public EffectLinkageRecord(VltClass @class, VltClassField field) : base(@class, field) { }
public ClassRefSpec_fe_flashers(VltClass @class, VltClassField field) : base(@class, field, "fe_flashers") { }
public JittererParams(VltClass @class, VltClassField field) : base(@class, field) { }
public static VLTBaseType CloneValue(Database database, VLTBaseType originalValue, VltClass vltClass, VltClassField vltClassField, VltCollection vltCollection) { var newValue = (originalValue is VLTArrayType) ? TypeRegistry.CreateInstance(database.Options.GameId, vltClass, vltClassField, vltCollection) : TypeRegistry.ConstructInstance(TypeRegistry.ResolveType(database.Options.GameId, vltClassField.TypeName), vltClass, vltClassField, vltCollection); if (originalValue is VLTArrayType array) { var newArray = (VLTArrayType)newValue; newArray.Capacity = array.Capacity; newArray.ItemAlignment = vltClassField.Alignment; newArray.FieldSize = vltClassField.Size; newArray.Items = array.Items.Select(i => CloneValue(database, i, vltClass, vltClassField, vltCollection)).ToList(); return(newArray); } switch (originalValue) { case PrimitiveTypeBase primitiveTypeBase: var convertible = primitiveTypeBase.GetValue(); if (convertible != null) { ((PrimitiveTypeBase)newValue).SetValue(convertible); } return(newValue); default: return(CloneObjectWithReflection(originalValue, newValue, vltClass, vltClassField, vltCollection)); } }