i don’t recommend you save any vector locations, just save the number of the last entrance the player walked through. Mobs and NPCs shouldn’t save health or location, just a single boolean representing alive or dead. when the game loads, if they are alive, give them full health. their locations can be generated with random logic and the player wont know the difference.
if you used Zelda like chests, you could just store a boolean representing whether its opened or not, but if each chest has multiple items, and the player can choose to take some of those items, you will need to keep track of alot more data. to optimize things, you could place some limitations on container rules, like only allowing the player to remove items, and not allowing them to put items in, and limiting the containers to a maximum of 8 items. this would allow you to store each removed item as a bit, making each chest a single byte. when the chest spawns into the world, it can check these bits to decide which items to remove from its defaults.
when storing items in your player’s inventory, you should only store the ItemID integer, and for randomized loot, you should store the random seed integer, instead of storing all of its base stats. if you want to store things with stats that can be leveled up, they will take up a lot more data. stacked items can be just an ItemID integer and Amount byte. never store names of things, unless the player can design those names in game, and if they can name their avatar, put a tight limit on character count. for all other names, they can be looked up using the ItemID.
i recommend storing all of this data in a single struct called Data, inside an actor called Inventory, which you can spawn from you player controller on begin play, and load its data from your SaveGame file. this Data struct can contain arrays of other structs, or arrays of simple data types. for example: the chest format i described above, could be an array of bytes. when you enter a new area, your inventory can get all actors of Chest, for each Chest, get the ChestID, and use that as an index to Get a byte from the array, then do some math to break the byte into bits, and starting at the end of the list, remove the items at each index corresponding to the bits that are true. enemy spawns work the same way.