[Plugin Discussion] Rama Save System Plugin Thread

Dear Lovely Ones,

This is a forum thread where my save system plugin can be discussed, I am creating this thread at the request of a plugin user so that everyone who is using my marketplace Save System Plugin can talk together!

Rama Save Project Examples For 5.3
(RamaSaveSystem Plugin Required)

:heart:

Rama

2 Likes

Hi! First of all, thanks Rama for this thread :yellow_heart:, my current concern is about the world partition’s compatibility and it’d awesome if we can get to a solution :grin:

I’ve searched a little bit in the engine’s source code about World Partition and streaming but didn’t find much about world partition notifies when a cell is loaded, didn’t find any delegate or event about it, but there’s a lot there and I’m sure I missed a lot of things. I did find tho that the world partition have a subsystem which have a function that’s even callable in blueprints to know about the streaming state:


Thinking about alternative solutions, a co-worker gave me an idea, that is to spawn an empty actor in each cell with that cell’s ID associated, and when the actor is loaded or unloaded it will send the notifications with the info about what cell has been loaded/unloaded, I don’t know if this can serve in any way as an alternative solution but was worth telling it so it can maybe give any idea or something :sweat_smile:

I’ll keep looking and keep you guys noticed if I find anything! :yellow_heart: :yellow_heart:

2 Likes

Hi there @Daboiowich Lovely to hear from you!

Thank you for pointing me in the right direction to try and support UE5 World Partitioning!

I have to get thru some workload until after the 8th or so, but after that I will start to research this!

If anyone has any more info on this subject of knowing when World Partitions load and unload, please let us know!

And please tell your co-worker that idea of a load/unload actor notify system using Begn and Endplay is a

:heart: GREAT idea! :heart:

:heart:

Rama

2 Likes

Hello
hw are you? I hope this finds you well.
I would like to ask about if this save system save graphic sittings from a widget, meaning when the player click a save button on a widget to save the graphics/ controller /audio settings.

Hello, RAMA.
May I ask how to use Rama Save System save the pictures in the game? Thank you. :heart:

There’s a bunch of tutorials on youtube, just look up “save user settings ue5” or something like that.

This is a separate thing than Rama’s system and something you should do in a separate file, IMO.

What sort of pictures are you trying to save?

Hey, thanks for making this thread!

I’ve so far come to the same understanding as Daboiowich. I don’t think there’s any built in way to know when a specific cell is loaded or unloaded, and I’m trying to figure out how the engine does it. From what I gather, when a cell is unloaded any objects within it’s bounds are serialized and stored, then loaded up again when the cell is reloaded. Sorta like how your save system works with chunk loading, but far less refined and with virtually no dev options. I think we’d need to actually alter the engine code so then when this process begins, the function that runs it first sends out a message (like to the Rama system) that a cell is starting to unload, and for each object being unloaded, send that information to the Rama system. Sort of like a screenshot of all the objects and what their data is before the cell finishes unloading.

This is just off the top of my head and I am still learning a lot of the more detailed c/c++ stuff (I’m kind of a newb to c/c++). But I’m thinking, sorta like how an API works? If that makes any sense. UE engine tells Rama system “I am unloading, here’s the data of the things I am unloading” and then Rama system stores that. Then when cell is loading, give the UID or whatever is associated with that cell to the Rama system, have it pull up the data only when the cell is finished loading, and for each object assign it’s data again (locations and various variables).

All of that aside, I think for this to work smoothly and properly with the Rama system, we’d probably need a full or at least heavily partial override of the partition system itself. A daunting task probably, but I think the safest.

I will post more here as I figure out what I can!

1 Like

Hi, There might be some issues with the save plugin in latest 5.1 update. The Plugin crashes the engine when you provide a global save object in the save slot.

Can you please look into this and let me know why this might happen?

Hi Rama and other folks,

I’m trying to upgrade to UE 5.x and so necessarily also to Rama Save 2.x, but the latest version seems to be refusing to load saves created with the previous version of the plugin. Has anyone created a conversion tool or other workaround for this yet? My game’s community would probably give up entirely if I didn’t support their old saves. :slight_smile:

Thanks!
Robert

More information: the 4.27 saves are saved with Rama 2.0. I was confused because the log messages said they were saved with file format 0.000000. It looks like RamaSaveSystem is able to parse the file but something else is causing it to barf, like a missing class? Is there a way I can convert Rama files to/from JSON or something? Is there a way to get the plugin to provide more information in the log (why it returned a null object)?

Can you make a repro project in 5.1 that demos the issue so I can see your exact setup? You can them send to my pm in forums or to my email associated with my marketplace account.

Thanks!

(I know, I know, you’re thinking “Rama its so simple just try it yourself!” but if I have a repro project, I can fix the repro project and make it work and we are then talkn’ 'bout the same thing exactly, like a common language, the language of… Repro.

:tulip: Repro-Lingo :rose:

(Also known as :comet: :comet: :comet: #RLang :comet: :comet: :comet: )

:heart:

Rama


Epic changed the ZLIB File header from UE4s to UE5s, so compressed saves are not compatible.

I didn’t change other code though, so you could try uncompressed save files from 4 → 5 !

I love the idea of an independent file format, but then I would have to do my own compression.

Oodle comes to mind, for future use, not likely to change from 5 → 6

:zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap:
(UE6 = Higher Dimensional Unreal Engine, You Live Inside the Engine)
:zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap: :zap:

:star2: (You Have Become One With the Unreal Engine) :unicorn:

(Which means you can manifest Trees at will, :palm_tree: in Public places)

:heart:

Rama

Thanks for your additional info / research sharings!

Are you actively still working on this topic @RianeN ?

Are you moving to 5.2 any time soon or staying on 5.1?

I wonder if 5.2 will give us the hooks we need to World Partition system!

:heart::heart::heart: And Lovely to Hear From You @RianeN As Always! :heart::heart::heart:

:heart:

Rama

1 Like

Thank you, that’s actually a very helpful answer. :slight_smile:

For a possible alternate file format, I’d like to recommend sqlite. It doesn’t compress by default, but it’s fairly efficient, it’s multi-platform, there are ample tools for it, it’s faster than a JSON or XML file and it makes reading or writing on a per-object level relatively easy. I believe Chrome and Firefox both use it to persist cookies and such.

This isn’t a request, just an idea. I’d be plenty happy with JSON, YAML, XML or anything else I could read and write. As long as writing can be done in a separate thread, it doesn’t even have to be fast. Just suspend the engine to copy all the data, then resume the engine and write the data out separately.

Anyway, thanks again!
Robert

For those of you looking for info about WP… in 5.1, in the WP HLODUtility cpp. Cells, should have a bounds that can be checked when a cell is loaded and unloaded, it also has a Hash Key as well, so either of them should work…

I will test when I get a few, and report back, unless someone beats me to it.

I believe I’ve fixed all the issues with reading v4.x files. Here’s a patch, including a document explaining the changes and how we worked around them.

I plan to re-factor the change to eliminate duplicate code, and I suspect there are more changes that are needed and I just haven’t triggered their bugs yet. Feedback welcome. There’s a link to our Discord server in the doc in the patch.

1 Like

If your using source you can update the LevelStreaming.cpp to report the level/cell being loaded/unloaded it still works for world partition as it did with with world comp but this isn’t a fix as Rama needs a way to read this data without custom engine edits.

1 Like

How to save refrenced UObject? when i try to do this , i got “This type of UObject Ptr cannot be saved/loaded directly. Save individual variable values and recreate in Actor Fully Loaded Event <3 Rama”, this means i need to store all variable on the OwnerActor?

Greetings!
In my project I make spaceships block by block and store connections between blocks as references to connected blocks.

Will I be able to store actor with all of the references it holds on another actors? Any will I be able to load this actor and referenced actors just as they were?

Update :slight_smile:
I bought your plugin. For some reason it saves arrays of referenced objects even if I didnt add them as variables to save… But Plugin can not save variable with single object reference :slight_smile:
Its a strange situation :slight_smile:

1 Like

I want to save the player’s last screen so that when the player reviews the record, they can see the last gameplay situation.

You can’t save widgets like that. What you’d have to do is store those variables, like in a struct, and save them in a savegame file.

2 Likes