Unreal-AutoSave/Source/AutoSave/Private/Blueprint/AutoSaveBlueprintLibrary.cpp

76 lines
2.6 KiB
C++

#include "Blueprint/AutoSaveBlueprintLibrary.h"
#include "Kismet/GameplayStatics.h"
bool UAutoSaveBlueprintLibrary::AddSaveStructRef(UObject * WorldContextObject, const FString & Filename, UScriptStruct * ScriptStruct, FSaveStructLoadDynamicDelegate LoadCallback)
{
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject);
if (!GameInstance) return false;
UAutoSaveSubsystem* AutoSaveSubsystem = GameInstance->GetSubsystem<UAutoSaveSubsystem>();
if (!AutoSaveSubsystem) return false;
return AutoSaveSubsystem->AddSaveStructRef(Filename, ScriptStruct, LoadCallback) != nullptr;
}
void UAutoSaveBlueprintLibrary::RemoveSaveStructRef(UObject * WorldContextObject, const FString & Filename)
{
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject);
if (!GameInstance) return;
UAutoSaveSubsystem* AutoSaveSubsystem = GameInstance->GetSubsystem<UAutoSaveSubsystem>();
if (!AutoSaveSubsystem) return;
AutoSaveSubsystem->RemoveSaveStructRef(Filename);
}
bool UAutoSaveBlueprintLibrary::Generic_TryGetSaveStruct(UObject * WorldContextObject, const FString & Filename, UScriptStruct * ScriptStruct, void * Value)
{
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject);
if (!GameInstance) return false;
UAutoSaveSubsystem* AutoSaveSubsystem = GameInstance->GetSubsystem<UAutoSaveSubsystem>();
if (!AutoSaveSubsystem) return false;
if (!AutoSaveSubsystem->StructInfos.Contains(Filename)) return false;
FSaveStructInfo* Info = AutoSaveSubsystem->StructInfos[Filename].Get();
if (Info->State == ESaveStructState::Preload || Info->State == ESaveStructState::Loading) return false;
if (Info->Struct != ScriptStruct) return false;
ScriptStruct->CopyScriptStruct(Value, Info->Data.GetData());
return true;
}
bool UAutoSaveBlueprintLibrary::Generic_TrySetSaveStruct(UObject * WorldContextObject, const FString & Filename, UScriptStruct * ScriptStruct, void * Value)
{
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject);
if (!GameInstance) return false;
UAutoSaveSubsystem* AutoSaveSubsystem = GameInstance->GetSubsystem<UAutoSaveSubsystem>();
if (!AutoSaveSubsystem) return false;
if (!AutoSaveSubsystem->StructInfos.Contains(Filename)) return false;
FSaveStructInfo* Info = AutoSaveSubsystem->StructInfos[Filename].Get();
if (Info->State == ESaveStructState::Preload || Info->State == ESaveStructState::Loading) return false;
if (Info->Struct != ScriptStruct) return false;
ScriptStruct->CopyScriptStruct(Info->Data.GetData(), Value);
return true;
}