Sorry about that. Here is my full code for that function.
void SavePropertyUtilities::StoreContainerProperty(FProperty* Property, const UObject* RootObject, uint32 PrefixID,
const void* ContainerPtr, bool bIsArrayElement, int Depth, TSharedPtr<FSaveClassDef> ClassDef,
TArray<uint32>& PropertyOffsets, FSaveClassMetaData& Meta, FMemoryWriter& Out)
{
bool bUpdateOK;
if (IsPropertyNativelySupported(Property))
{
const void* DataPtr = Property->ContainerPtrToValuePtr<void>(ContainerPtr);
if (const auto SProp = CastField<FStructProperty>(Property))
{
if (IsBuiltInStructProperty(SProp))
{
bUpdateOK =
TryWriteBuiltinStructPropertyData<FVector>(SProp, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWriteBuiltinStructPropertyData<FRotator>(SProp, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWriteBuiltinStructPropertyData<FTransform>(SProp, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWriteBuiltinStructPropertyData<FGuid>(SProp, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out);
}
else
{
UE_LOG(LogSaveSystem, Verbose, TEXT("%s:"), *GetLogPrefix(Property, Depth));
bUpdateOK = true;
}
}
else
{
bUpdateOK =
TryWritePropertyData<FBoolProperty, bool>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FByteProperty, uint8>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FUInt16Property, uint16>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FUInt32Property, uint32>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FUInt64Property, uint64>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FInt8Property, int8>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FInt16Property, int16>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FIntProperty, int>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FInt64Property, int64>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FFloatProperty, float>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FDoubleProperty, double>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FStrProperty, FString>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FNameProperty, FName>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWritePropertyData<FTextProperty, FText>(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWriteEnumPropertyData(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out) ||
TryWriteUObjectPropertyData(Property, PrefixID, DataPtr, bIsArrayElement, Depth, ClassDef, PropertyOffsets, Meta, Out);
}
}
else
{
RegisterProperty(Property, PrefixID, ClassDef, PropertyOffsets, Meta, Out);
FBinaryArchiveFormatter Fmt(Out);
FStructuredArchive Ar(Fmt);
const auto RootSlot = Ar.Open();
Property->SerializeBinProperty(RootSlot, const_cast<void*>(ContainerPtr));
Ar.Close();
bUpdateOK = true;
}
if (!bUpdateOK)
{
UE_LOG(LogSaveSystem, Error, TEXT("Unable to update from property %s, unsupported type."), *Property->GetName());
}
}