Download

[PLUGIN] Savior 3

Sub-Levels are streamed into the main level.
Their actors are saved as usual.

The plug-in does not stream levels that were present on save, if you have unloaded levels on save load you have to either load them before calling “Load World” or you after loaded a streamed level you can:

New Slot Instance >> Load Level

In that order you can load data for levels separately.

Hey @BrUnO_XaVIeR , thanks for you awesome forum engagement. I do have a question regarding your versioning support. When loading older .SAV files, what hooks do developers have to handle that situation i.e. writing upgrade code so we can take the old save data and populate new version variables.

We can use redirectors to map values of properties that don’t exist anymore to another property of same type, or just redirect in case the property name have changed.


But for latest Unreal Engine releases, there’s a problem in this since they changed UProperty types to FProperty.

I am working to fix it:


In terms of binary file compatibility, the system is built to not crash when you change the binary size of a class so old save files will always be supported even if the sizeOf(class) have changed.

Changing UProperty types to FProperty for the Versioning mechanism is complete and released to Marketplace as a new plug-in update.

So mapping new properties to dead variables in save files is now working as intended.

Hey @BrUnO_XaVIeR,

We are trying to better understand the inner workings of saving/load a Record for a specific Actor/Component/UObject based on a GUID Key.

  1. If we are trying to check if a Record/Key exists, does your plugin need to load the file in the memory and then do the lookup or it can do a search that savefile before it is loaded in the memory?
  2. If I am saving just one actor at a time, would it mean that the plugin will save just that Actor Record/Key and value one at a time to a save game file, leaving the other data about the game intact in that file/slot or it will just replace everything just with the RecordData of the actor I just serialized? and if the key already exists in that save game file, it would mean that the the “value” mapped to that key will be overwritten?
  3. In order to support cloud-saving functionality (i.e. EOS), what would be the things we need to refactor, implement on top of your plugin as It doesn’t really seem to support that out of the box?

Greetings,
Cosmin

1: Yes, data must be loaded into memory.

2: No, actors will be saved to the in-memory slot until it’s written to a file. You can append to existing data if you load a slot from file before saving any new records to it, or old data will be erased.

3: That would be another API to
upload/download the *.sav files.

I’ve got Savior plugin already working on Unreal 5.
All existing save files from live/published UE4 projects using Savior will be compatible with Unreal 5, when projects migrate to UE5:


Hello @BrUnO_XaVIeR, this plugin looks amazing. I was considering implementing it into my project and had some questions.
1: How well does this interact with non-Unreal-engine systems, such as a dialogue system from a plugin, and a stat system from a component?
2: If a game is saved halfway through an animation, will the load resume the animation exactly where it was saved?
3: Are A.I’s current behavior trees states saved and restored?
4: How confident are you that this plugin would perform well in a very heavy open world game utilizing world composition, with hundreds of NPC’s, actors and more.
5: We were also wondering if you knew anything about how stuff is restored in World Composition projects, as there doesn’t seem to be much documentation or any games that have faced this issue, but we wanted to know if A.I’s behavior trees states are restored while in a level segment that is unloaded
6: I know it’s VERY early to ask, but are there plans to be able to save and restore Unreal Engine 5’s new Chaos Destruction physics objects after they had been broken?

@Twitch-Variann I will not comment on all the items you list because I am not working on them to be automatically saved neither I know if there’s any readblocks to implement them or not, and, for Unreal 4 the v3.5.0 of this plugin is pretty much the final version.

It’s possible to manually setup properties to do all the things you are asking (just create some custom variable in a blueprint and mark it ‘Save Game’ flag), but I might add automatic processors for them in the future, for example I have in my todo auto records of Blackboard data, but it’s a maybe.

Save system does not control the state of animations (they are multi threaded).
What the plugin does is save/load variables that you create on your animation blueprints and mark them ‘Save Game’ flag (and has a Serializable Interface).
Depending on how you setup your State Machine conditional transitions, the results are the same as if the current state was loaded from disk.


I’m sure World Composition will be deprecated.
For now I am working on runtime save/load support for Unreal 5 World Data Layers:

World Partition - Data Layers | Unreal Engine Documentation

SAV_WorldLayers

Thank you for the reply. When you say v3.5.0 is the final version for UE4, will you be updating the one on the marketplace to UE5, or will a new plugin that we’d have to buy be made?

I will replace the version on Marketplace with new version for Unreal 5.
I do not practice those scummy software sellers practices :slight_smile:


There will be changes to accommodate UE5 features, but I will also keep a “frozen” v3.5 for UE5 in case any project need the plugin to be just the way it is for right now UE4 (no code changes).

1 Like

Sigh… I been trying to get this working all night I feel like I wasted 80$. I’m working with 4.26 and the only thing I manage to get this plugin to save in my player character and variables within that specific character BP. I have a custom Inventory component attached to my character and I cant get nothing inside that to save and I don’t know why the documentation provided doesn’t have anything in the way of showing how to save custom components with structs. Its quite frustrating. I mean would it be that hard to put together a 10 or 15 minute tutorial video to show people how to implement this into existing projects? For 80$ all you get is a couple of outdated pictures and this forum post that is a MILE long so now here I am digging through this trying to see if anyone else had a similar problem/solution.

You can give unique values to your components SGUID, and owner Actor’s SGUID in editor then use these nodes to save and load them:

Save Actor Hierarchy:
([SAVIOR] Save Actor Hierarchy)

Load Actor Hierarchy With GUID:
([SAVIOR] Load Actor Hierarchy by GUID)


If you don’t setup SGUID property correctly the Plugin will just ignore them.

I set up Guid in my components but custom components don’t have a constructionscript so I don’t know where to resolve its name to guid.

You can assign value to GUIDs manually in editor.
You don’t have to use constructors, that’s just a helper node to generate a guid.

How do you do that? I understand the GUID is a struct but I don’t see it anywhere so I cant add values to it. unless its a C++ file which I was hoping to avoid because I’m mainly using blueprints. I’m just building my own save system at this point. I wish I could request a refund I thought this would be an easy system to incorporate base on the reviews for this plug in but it seems like it wont work for my project. I suggest you take a look at the Pushable Actor project in the marketplace and see how they did their documentation. It has video overviews migration instructions and really good support. Maybe try and replicate that so that someone who isnt super proficient in C++ will know how to use this plugin.

I didn’t say anything about C++.
You can create a “Guid” struct on any Actor or Component blueprint, then from its value drop down you can click “generate” button and a guid value will be created as default value. The Guid just have to be named “SGUID”.

Guids are default Unreal Engine feature, it’s very basic thing to add to any blueprint like a float, boolean, vector, etc.