/** * Saves and loads a savegame file * * @param Parameters - Unused for this test * @return TRUE if the test was successful, FALSE otherwise */ bool FSaveGameTest::RunTest(const FString& Parameters) { // automation save name const TCHAR* SaveName = TEXT("AutomationSaveTest"); uint32 SavedData = 99; // the blob we are going to write out TArray<uint8> Blob; FMemoryWriter WriteAr(Blob); WriteAr << SavedData; // get the platform's save system ISaveGameSystem* Save = IPlatformFeaturesModule::Get().GetSaveGameSystem(); // write it out if (Save->SaveGame(false, SaveName, 0, Blob) == false) { return false; } // make sure it was written if (Save->DoesSaveGameExist(SaveName, 0) == false) { return false; } // read it back in Blob.Empty(); if (Save->LoadGame(false, SaveName, 0, Blob) == false) { return false; } // make sure it's the same data FMemoryReader ReadAr(Blob); uint32 LoadedData; ReadAr << LoadedData; // try to delete it (not all platforms can) if (Save->DeleteGame(false, SaveName, 0)) { // make sure it's no longer there if (Save->DoesSaveGameExist(SaveName, 0) == true) { return false; } } return LoadedData == SavedData; }
bool CloudySaveManagerImpl::Cloudy_SaveGameToSlot(USaveGame* SaveGameObject, const FString& SlotName, const int32 UserIndex, const int32 PCID) { bool bSuccess = false; // Appends the player controller ID to the save file, // so that the split screen players do not overwrite 1 save file. FString NewSlotName = SlotName + "-" + FString::FromInt(PCID); ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem(); // If we have a system and an object to save and a save name... if (SaveSystem && (SaveGameObject != NULL) && (NewSlotName.Len() > 0)) { TArray<uint8> ObjectBytes; FMemoryWriter MemoryWriter(ObjectBytes, true); // write file type tag. identifies this file type and indicates it's using proper versioning // since older UE4 versions did not version this data. int32 FileTypeTag = UE4_SAVEGAME_FILE_TYPE_TAG; MemoryWriter << FileTypeTag; // Write version for this file format int32 SavegameFileVersion = UE4_SAVEGAME_FILE_VERSION; MemoryWriter << SavegameFileVersion; // Write out engine and UE4 version information MemoryWriter << GPackageFileUE4Version; FEngineVersion SavedEngineVersion = GEngineVersion; MemoryWriter << SavedEngineVersion; // Write the class name so we know what class to load to FString SaveGameClassName = SaveGameObject->GetClass()->GetName(); MemoryWriter << SaveGameClassName; // Then save the object state, replacing object refs and names with strings FObjectAndNameAsStringProxyArchive Ar(MemoryWriter, false); SaveGameObject->Serialize(Ar); // Stuff that data into the save system with the desired file name SaveSystem->SaveGame(false, *NewSlotName, UserIndex, ObjectBytes); bSuccess = ICloudyWebAPI::Get().UploadFile(NewSlotName, PCID); } return bSuccess; }