Download

[PLUGIN] Savior 3

WHAT is Savior 3:

This is a major update for the “Auto-Save Game” system I’ve been maintaining up on Unreal Marketplace for last couple years.

Focused on performance and data reach, I’ve totally scrapped original code and wrote this version from scratch, implementing a fully custom serialization engine that made possible for me to achieve the goal of moving away from the built-in ‘FArchive’ system and it’s ’ << ’ operator constraints. The reasons why I moved away from the internal FArchive operator are many, so I won’t go too much into details about this… Instead, let me throw at screen the new ‘features’ for you:

  • Savior 3 is tens of times faster than Savior 1.x releases.

  • Multi-Threaded Save & Load capabilities, no freezes or hiccups.

  • Save all data from outside your Game’s main thread, even Actor References.

  • Save any class. Any UObject is now supported, not just Actors or Components.

  • Versioning. Your Game will be capable of loading from old ‘*.SAV’ files after patches.

  • Encryption. All data goes through a lightweight, fast, multi-platform compatible encryption pass.

  • Optimized: Savior 3 is designed to predict and avoid crashes at all costs, no matter how complex Levels are.

  • Optimized: NO Components needed to be attached anywhere thus no memory eaten for the sake of storing data.

  • Optimized: NO destructive workflow. Existing Actors aren’t destroyed/replaced, keeping references alive and safe.

  • Optimized: NO containers created when saving game data thus no big chunks of memory garbage generated.

  • Optimized: Savior 3 Slots are UObjects, not Actor nor Component, avoiding large resource allocations.

  • Automatic Level Transitions on Load from Slot.

  • Threaded Save & Load the whole Game World or individual Actors.

  • Threaded Save & Load Game Mode in real-time, independent of Level.

  • Threaded Save & Load Streamed Levels without pausing the Gameplay.

  • Threaded Save & Load all Properties marked ‘Save Game’, no C++ required.

  • Threaded Save & Load any Dynamically-Created Classes of Actors and Components spawned in Runtime.

  • Threaded Save & Load Actor’s Scale, Location and Rotation, Linear and Angular Velocity automatically.

  • Threaded Save & Load Actor’s Visibility state, Collectibles’ or Particle Systems’ state automatically.

  • Optional Built-in HUD Class with auto generated Load-Screens with Blur, Splash-Screens or Videos.

  • Optional Built-in Progress Bar System with auto generated UI Elements for your Loadscreens.

  • Optional Built-in Slot Widgets with auto generated UI Slot Elements for your HUD Menus.

  • Optional Built-in support for Slot UI Thumbnails and UI/UX Decorators.

An intuitive Slot System for Save & Load:

Threaded World Save & Load for Performance Boost:

Built-In Load Screens System:

[API REFERENCE]

Full List of Savior’s Blueprint Functions (Savior 3)

How to Setup a Slot:

As always, create a Slot Asset on Asset Browser;
Opening the Asset you can quickly adjust default Properties such as Default Player Name, Levels Thumbnails, etc:

How to Save & Load from any Slot Asset:

All you have to do is right click any graph on any of your Blueprints and search from one of main nodes in “Savior 3” section.
These main Save/Load functions automatically creates a runtime instance of a Slot object for you… So you don’t have to instantiate anything, just reference the Slot Asset and let the node work:

From any UMG Widget you simply setup your “On Button Clicked” events to call one of these “Savior 2” functions.
It’s THAT simple, everything in scope marked ‘SaveGame’ tag will save or load:

How to Setup Pickups to Auto-Destroy on Load:

Any Actor you wish to remember it was destroyed and should not respawn on Level load, you have to add a “Destroyed” Boolean Property to it. And mark it ‘Save Game’ tag as well:

The Property must be a Boolean named “Destroyed”, case sensitive.
The Property must be marked ‘Save Game’ tag.

Then in your Blueprint Graph, create a new Function calling it whatever you’d like, this Function will be a substitute of “Destroy Actor” node for the Game.
Inside this Graph Function set the value of “Destroyed” to true, but don’t destroy this Actor before you save the Game, maybe hide it instead:

Having that Boolean “Destroyed” Property set to TRUE will tell the Plugin that this Actor must destroy itself once the Level was loaded, making it be gone the next time a Player visits that Level…

To do that, when you want a Pickup to be destroyed, simply call your newly created Function that hides the Actor and sets “Destroyed” to True instead of destroying the Actor with a Destroy node:

Once the Game is saved, the Plugin will Destroy the Actor after it’s “Destroyed” Property has been recorded, so the Actor won’t be left there consuming memory.

How to Setup Procedural Actors Spawned at Runtime to Auto Save & Load:

An Actor, or Component, you are spawning at Runtime will be saved as usual.
However loading them back is a complex task because we cannot control whatever ID the internal engine will assign to a runtime spawned Object.
Often the new Object’s ID will be random internal pointer that used to reference another object; to overcome this obstacle to Save & Load “Procedural Actor” properly, your Procedural Class is required to implement three things:

  • Implement the “SAVIOR_Procedural” Function Interface.
  • Include a “Guid” Property to its Variables List, named “SGUID”.
  • In its Construction Script, call a special node called “Create Once: SGUID”.

Those three simple steps above will guarantee your Procedural Class will be loaded correctly from Slot’s Data without mismatching Data with another instance of your Class also spawned in Runtime, turning them into Absolutely Identifiable Procedural Objects. So…

IMPORTANT:

First, within desired Procedural Actor’s Blueprint, we have to implement our “Procedural” Function Interface:

Once we have that Blueprint Interface in place, we now have to make sure the Class will process the Data when it is received from Savior’s multi-threaded serializer. The “Load Actor” node (would be “Load Component” for a Procedural Component) will run the ‘Code Reflection’ system to restore Property Values:

Once that is done, we now have to create a “Guid” Property for the Procedural Class and name it “SGUID”:

The Property must be a Guid Struct named “SGUID”. Savior will ‘read’ the Property and expects it to be this type, otherwise it will be ignored.
The Property must be marked ‘Save Game’ tag to be visible to the Auto-Save System.

That been done, only step left now is making sure SGUID’s value is persistent and unique.
That would be a headache for you to do, so instead of trying to control its behavior, there’s a node that can do that for you within a Construction Script…

Add the “Create Once: SGUID” node to your Construction Script Graph and assign its output value to the “SGUID” Property:

Do NOT use a default “New Guid” node! The Guids created by that aren’t persistent, it would break our logic.

And it’s done, your ‘Procedural Class’ is ready to be freely spawned in Runtime and be automatically respawned with it’s correct Property’s values restored once the Game is reloaded from a Slot.

How to Use Tags as Command Parsers for Save/Load Functions in C++ Domain:

You can customize Serialization of certain characteristics of your Class with Savior without typing code; using simple “Tag” commands.

With a few String Tags you can configure your Class to opt-out of specific data that would otherwise be serialized in “Save World/Level” functions:

Just apply the Tag you see fit your Design to your “Actor Tags” or “Component Tags” list, like the example below:

FAQs

How, why my Actor isn’t saving?

Chances are you did not setup a SGUID Property properly.

Save World or Game Mode returns Failed result, why?

Check thread state with Get Thread Safety node. If you have another save process running, you have to wait until previous process is complete to start a new one.

I still can’t save anything?!

Make sure you are creating an instance with New Slot Instance node. Don’t try to save data directly into your Slot Class.

Savior 3 update:

[Improvement]:

  • Savior 3 is nearly 30% faster on heavy data loading. :heavy_check_mark:
  • Restores Relative Transform attachments on respawn. :heavy_check_mark:
  • Load World: added “Reset Level on Load” option. :heavy_check_mark:
  • Load Level: added “Stream Level on Load” option. :heavy_check_mark:
  • Mitigating ‘Child Actor’ transform conflicts on load. :heavy_check_mark:
  • Added support for Class Reference properties. :heavy_check_mark:
  • Added support for Int64 properties. :heavy_check_mark:

[New Built-in Systems]:

  • Save/load Skeletal/Mesh Reference (root component mesh). :heavy_check_mark:
  • Save/load Animation Blueprints’ properties (Variables). :heavy_check_mark:
  • Save/load Movable Lights’ native properties. :heavy_check_mark:
  • Save/load Dynamic Materials’ properties. :heavy_check_mark:

[New Nodes]:

  • [SAVIOR] Open Level (+HUD). :heavy_check_mark:
  • [SAVIOR] Open Level (+HUD) +Callbacks]. :heavy_check_mark:
  • [SAVIOR] Load Object : (Slot Data). :heavy_check_mark:
  • [SAVIOR] Load Component : (Slot Data). :heavy_check_mark:
  • [SAVIOR] Load Actor : (Slot Data). :heavy_check_mark:

Open Level (+HUD) nodes:

These nodes can execute an action to open a persistent level while triggering a Savior Slot’s loading screen.
It doesn’t perform any data load from any slot, just opens a regular persistent map.

Load Object nodes:

The Load xxx (Data) internally were called StaticLoadxXx functions…
This have changed, you will have to replace them to new ones now they have been renamed in C++.

Animation Blueprint Variables:

I have added support for directly saving and loading properties of Anim Instance Blueprints that are marked ‘Save Game’ on spawned Characters;
Removing the need to pass data through Characters to their AnimBP after a slot was loaded.
Your Animation Blueprint must implement the ‘Savior Serializable’ interface for this to work.



Skeletal Meshes, Static Meshes, and Dynamic Material Instances:

A bundle of new algorithms that allows us to save and runtime load skeletals or meshes of root components;
As well as restoring dynamic material instances’ parameters, such as scalar params, vector params, and texture object params.
This was the hardest one to add since it touches stuff from a bunch of different threads, including the rendering thread.

Movable Light Sources:

And finally, native C++ properties of movable light sources can be saved and restored without requiring ‘Save Game’ flags.
Only ‘Movable’ light sources are supported.

Some notes to keep in mind with Savior v3:

  • Savior 3 can save and restore scalar public parameters, vector parameters, and public texture parameters of dynamic material instances on Actors’ meshes.

  • So “Save Actor” function automatically saves Dynamic Material Instances for Actor that implements the ‘Serializable’ interface.

  • And “Save World” function makes use of the Save Actor node, so the same rule from above applies when using this function.

  • Dynamic Material Instances does not require ‘Save Game’ check box on properties.

  • Check Epic’s documentation on dynamic material instances.

  • To save an Animation Instance, the Anim BP class must implement the ‘Serializable’ interface.

  • When serializing Animations, it’s not desirable to add a SGUID to Animation Instance if owning Actor already has a valid SGUID (it’s just not necessary).

  • Animation Properties to be saved require to be marked with the ‘Save Game’ check box, just like properties of regular Blueprints.

  • Light Component properties are only saved/loaded if the light source transform is set to ‘Movable’, dynamic lights.

  • None of Savior 3 features work for the ‘Minimal’ data set, only slots using ‘Complex’ data format (‘Compression’ setting on Slot class) support these new features.

. [HR][/HR][DEMO PROJECTS]:

Demo Project 4.18 don’t work with this error:

Complete list of error:

/Game/Savior2/Demo/HUD_Demo : Can’t find file for asset. /Script/Savior2
Failed to load /Script/Savior2.SaviorRecord Referenced by Data
/Game/Savior2/Demo/WB_Demo-Player : Can’t find file for asset. /Script/Savior2
Failed to load /Script/Savior2.SlotMetaData Referenced by MetaData
Failed to load /Script/Savior2.SlotMetaData Referenced by K2Node_Event_MetaData
Failed to load /Script/Savior2.SaviorRecord Referenced by K2Node_Event_Data2
Failed to load /Script/Savior2.SaviorRecord Referenced by K2Node_Event_Data
Failed to load /Script/Savior2.ESaviorResult Referenced by CallFunc_StaticLoadActor_Result
Failed to load /Script/Savior2.SAVIOR_Procedural Referenced by BP_Demo-Character
Failed to load /Script/Savior2.SAVIOR_Serializable Referenced by BP_Demo-Character
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_DynamicCast_0
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallFunction_135
Failed to load /Script/Savior2.SAVIOR_Procedural Referenced by K2Node_Event_6
Failed to load /Script/Savior2.SaviorRecord Referenced by K2Node_Event_6
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_36
Failed to load /Script/Savior2.Default__Savior2 Referenced by K2Node_CallFunction_36
Failed to load /Script/Savior2.SaviorRecord Referenced by K2Node_CallFunction_36
Failed to load /Script/Savior2.ESaviorResult Referenced by K2Node_CallFunction_36
Failed to load /Script/Savior2.SAVIOR_Serializable Referenced by K2Node_Event_7
Failed to load /Script/Savior2.SlotMetaData Referenced by K2Node_Event_7
Failed to load /Script/Savior2.SlotMetaData Referenced by K2Node_BreakStruct_0
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_20
Failed to load /Script/Savior2.Default__Savior2 Referenced by K2Node_CallFunction_20
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallFunction_35
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_CallFunction_35
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_DynamicCast_3
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallFunction_8
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_CallFunction_8
/Game/Savior2/Demo/WB_Slot-Picker : Can’t find file for asset. /Script/Savior2
/Game/Savior2/Demo/WB_Slot-Button : Can’t find file for asset. /Script/Savior2
/Game/Savior2/Demo/WB_Slot-Profile : Can’t find file for asset. /Script/Savior2
Failed to load /Script/Savior2.Savior2 Referenced by WB_Slot-Profile
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_FunctionEntry_38
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_0
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_3
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_4
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_1
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_CallFunction_1
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_0
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_1
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_2
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_3
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_4
Failed to load /Script/Savior2.SlotMeta Referenced by K2Node_VariableGet_5
Failed to load /Script/Savior2.ESlotPickerMode Referenced by Mode
Failed to load /Script/Savior2.ESaviorResult Referenced by CallFunc_LoadSlotMetaData_Result
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate2
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate3
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate4
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate5
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate6
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate7
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate8
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate9
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate10
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate11
Failed to load /Script/Savior2.Result__DelegateSignature Referenced by K2Node_CreateDelegate_OutputDelegate12
Failed to load /Script/Savior2.Savior2 Referenced by WB_Slot-Button
Failed to load /Script/Savior2.ESlotPickerMode Referenced by WB_Slot-Button
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_VariableGet_0
Failed to load /Script/Savior2.SAVIOR_SaveGameWorld Referenced by K2Node_AsyncAction_0
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_0
Failed to load /Script/Savior2.SAVIOR_LoadGameWorld Referenced by K2Node_AsyncAction_1
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_1
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_SwitchEnum_1
Failed to load /Script/Savior2.SAVIOR_SaveGameMode Referenced by K2Node_AsyncAction_2
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_2
Failed to load /Script/Savior2.SAVIOR_SaveGameInstance Referenced by K2Node_AsyncAction_3
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_3
Failed to load /Script/Savior2.SAVIOR_LoadGameMode Referenced by K2Node_AsyncAction_4
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_4
Failed to load /Script/Savior2.SAVIOR_LoadGameInstance Referenced by K2Node_AsyncAction_5
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_AsyncAction_5
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallFunction_71
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_VariableGet_15
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_VariableGet_136
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_FunctionEntry_0
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_FunctionEntry_0
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_VariableSet_0
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_5
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_2
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_3
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_VariableSet_1
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_Knot_0
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_Knot_5
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_32
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_33
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_VariableSet_111
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_9
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_10
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_11
/Game/Savior2/SAVE_Slot_1 : Can’t find file for asset. /Script/Savior2
/Game/Savior2/SAVE_Slot_2 : Can’t find file for asset. /Script/Savior2
/Game/Savior2/SAVE_Slot_3 : Can’t find file for asset. /Script/Savior2
/Game/Savior2/SAVE_Slot_4 : Can’t find file for asset. /Script/Savior2
/Game/Savior2/SAVE_Slot_5 : Can’t find file for asset. /Script/Savior2
/Game/Savior2/Demo/BP_Demo-Character : Can’t find file for asset. /Script/Savior2
/Game/Savior2/Demo/SV2_Demo-Level : Can’t find file for asset. /Script/Savior2
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by Default__GM_Demo_C
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by HUD_Demo
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallParentFunction_0
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_CallParentFunction_1
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_CallParentFunction_1
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_Event_10
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_Event_15
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_Event_57
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_Event_65
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_Event_65
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_VariableGet_2
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_VariableGet_9
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_VariableGet_253
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by K2Node_VariableSet_31
Failed to load /Script/Savior2.HUD_SaviorUI Referenced by PackageMetaData
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_71
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_CallFunction_71
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_122
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_15
Failed to load /Game/Savior2/SAVE_Slot_5.SAVE_Slot_5 Referenced by K2Node_CallFunction_15
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_24
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_26
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_32
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_40
Failed to load /Game/Savior2/SAVE_Slot_1.SAVE_Slot_1 Referenced by K2Node_CallFunction_40
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_41
Failed to load /Game/Savior2/SAVE_Slot_2.SAVE_Slot_2 Referenced by K2Node_CallFunction_41
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_42
Failed to load /Game/Savior2/SAVE_Slot_3.SAVE_Slot_3 Referenced by K2Node_CallFunction_42
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_43
Failed to load /Game/Savior2/SAVE_Slot_4.SAVE_Slot_4 Referenced by K2Node_CallFunction_43
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_CallFunction_45
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_FunctionEntry_22
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_6
Failed to load /Script/Savior2.Savior2 Referenced by K2Node_Knot_7
Failed to load /Script/Savior2.ESlotPickerMode Referenced by K2Node_SwitchEnum_0
Failed to load /Script/Savior2.SlotPickerWidget Referenced by K2Node_VariableGet_0
Failed to load /Script/Savior2.SlotPickerWidget Referenced by K2Node_VariableGet_27
Failed to load /Script/Savior2.SlotPickerWidget Referenced by PackageMetaData
Failed to load /Script/Savior2.SlotPickerWidget Referenced by WB_Slot-Picker
CreateExport: Failed to load Outer for resource ‘UberGraphFrame’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘DefaultSceneRoot’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘ExecuteUbergraph_HUD_Demo’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘EntryPoint’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo
CreateExport: Failed to load Outer for resource ‘ShowSlotPickerHUD’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘PickerMode’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ShowSlotPickerHUD
CreateExport: Failed to load Outer for resource ‘UnderlyingType’: EnumProperty /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ShowSlotPickerHUD.PickerMode
CreateExport: Failed to load Outer for resource ‘HideSlotPickerHUD’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘OnFinishedLoadScreen’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘OnBeganLoadScreen’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘ReceiveBeginPlay’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘UserConstructionScript’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘SetPlayerName’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘Name’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:SetPlayerName
CreateExport: Failed to load Outer for resource ‘CallFunc_IsValid_ReturnValue’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:SetPlayerName
CreateExport: Failed to load Outer for resource ‘K2Node_Event_PickerMode’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo
CreateExport: Failed to load Outer for resource ‘UnderlyingType’: EnumProperty /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo.K2Node_Event_PickerMode
CreateExport: Failed to load Outer for resource ‘CallFunc_Create_ReturnValue’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo
CreateExport: Failed to load Outer for resource ‘CallFunc_GetOwningPlayerController_ReturnValue’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo
CreateExport: Failed to load Outer for resource ‘CallFunc_GetOwningPlayerController_ReturnValue2’: Function /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:ExecuteUbergraph_HUD_Demo
CreateExport: Failed to load Outer for resource ‘Player Profile’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘DefaultSceneRoot_GEN_VARIABLE’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘SimpleConstructionScript_0’: BlueprintGeneratedClass /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C
CreateExport: Failed to load Outer for resource ‘SCS_Node_0’: SimpleConstructionScript /Game/Savior2/Demo/HUD_Demo.HUD_Demo_C:SimpleConstructionScript_0
CreateExport: Failed to load Outer for resource ‘UberGraphFrame’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘Mode’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘ExecuteUbergraph_WB_Slot-Picker’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘EntryPoint’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:ExecuteUbergraph_WB_Slot-Picker
CreateExport: Failed to load Outer for resource ‘Construct’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘CreateSlot’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘Savior’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘CallFunc_HasChild_ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘CallFunc_IsValid_ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘GetPickerModeText’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:GetPickerModeText
CreateExport: Failed to load Outer for resource ‘K2Node_SwitchEnum_CmpSuccess’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:GetPickerModeText
CreateExport: Failed to load Outer for resource ‘ID’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘CallFunc_AddChild_ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘CallFunc_Create_ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘CallFunc_GetOwningPlayer_ReturnValue’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:CreateSlot
CreateExport: Failed to load Outer for resource ‘ScrollBox’: WidgetBlueprintGeneratedClass /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C
CreateExport: Failed to load Outer for resource ‘ModeText’: Function /Game/Savior2/Demo/WB_Slot-Picker.WB_Slot-Picker_C:GetPickerModeText

It’s a demo project.
The plugin is obviously NOT included.

Please remove second post or wrap it in a /code tag.
It pollutes the forums and makes the page hard to read.

hey there [USER=“434”]BrUnO XaVIeR[/USER] , we’re just creating a SaveState/LoadState function on our game. Maybe we will be better off focusing on other things and getting your plugin, because frankly with all the projects i have to code right now and managing our artists and assets, time is really falling short on my behalf, and i have to start thinking that, even if i want to code everything by myself, i have other critical areas that i need to attend.

Will give it a try once it’s on the marketplace, will mostly use it for generating checkpoints in stages, i assume that’s supported.

Good job as always, always pleased to see your content. Experienced programmers are a joy to find.

Thank you, this is already on Marketplace; but I can mail you a precompiled version if your team have to try it out first.

I don’t have files here, but if you pm me an email I forward to you when I’m back home.

Have a compiled version .EXE to test???

No, thanks for removing the logs (too long post).

​​​​​Pm me an email and when I’m home I can send you a pre-compiled plugin for you to test and see if it fits your project (source code won’t be included).

Remember to note me which Unreal Engine version you use.

My UE is 4.19.2. What you email to request pre-compiled version to test???

My public email is bruno_xavier_(at)msn.com

I reply as soon I can.
I might not send it today because crunch time, but when I’m home I compile it and send file to you.

Hi Bruno;
I’m in the process of migrating to 4.19 so I’d like to use Savior2. How do we set up loading progress bar and such? If they are auto-generated, how can I adjust its style?

Plugin includes a custom HUD Class.
Reparent your HUD to this class and Loading Screen + Progress Bar will be auto generated.

You can customize visuals and widgets in default settings of a Savior 2 Slot object.
The shape of progress bar itself can’t be customized however, unless you know C++ Slate programming, because it is a Unreal Engine’s built-in object.
You customize its color, transparency, font type, etc.

In demo project you can see how splash screen is used and how media asset for a video-based loading screen is imported.
Video only work on packaged game and the media asset must point to a mpeg file within the game project folder.


Edit:
​​​​​​
If you need completely custom progress bar style, from the instanced Slot you can call “Get Save Progress” and “Get Load Progress” functions and feed your widget with the return value / 100.