I myself haven’t checked out the source code for Lethal Company, but if you want to delve into exactly how the procedural generation was done for it, I would highly recommend checking it out. It’s from Unity so it’s written in C#, but if you’re struggling to understand it, I’m sure GPT could give you a hand. This seems like a good guide on how to get it up and running: https://www.reddit.com/r/lethalcompany_mods/comments/18refsw/tutorial_creating_lethal_company_mods_with_c/
Now, on how I personally would approach this problem using only blueprints…
The biggest limitation you’re going to run into with blueprints is the speed of the code. All of the procedural generation needs to be done at runtime on level load, and using blueprints will mean that your level will be very slow to load. This means that you need to make sure this system is as optimized as possible.
Exterior Terrain
If your objects are sinking into the terrain, is it because your pivot points are in an unideal location? Remember that it will snap to the pivot point. To keep objects from clipping with each other, you would have to run a collision test and delete overlapping actors.
Another method that you could use due to its cheapness and guarantee of good results is to specify a bunch of predetermined spawning locations. The way that I usually do this- I use a series of billboards and move them around the world to the places I want things to have the option of spawning. Then in my code, I randomly decide what will spawn and where. This always guarantees good looking results and can give a massive variety of configurations. Since it’s more of a pseudo-random, it’s super cheap to implement.
Facility Interiors
Yeah, I think you’re on the right path here with the door sockets. I’ve used this method before and it works really well. Make sure all your door frames are the exact same so they are always guaranteed to line up correctly. If you’re encountering collision issues, then it sounds like you need to adjust the location of your sockets- usually the very rim of the doorframe will work.
Seed System
You really just need a single integer that all of your blueprints can read. Then, in each blueprint you just need this code:
(This code also shows an example of using your stream for a random int. Normally you’d save your stream out to a variable for use later.)
The hard part here, since you’re only using blueprints, is going to be decoupling all of the information. If you have a manager blueprint that holds the integer, and every blueprint reads from this, then all of these blueprints will reference each other and be loaded at once. Sadly, I don’t really think there’s much of a way around this without Cpp. And I suppose anyways that all of this stuff needs to be loaded at once.
From my understanding, and this is about the limit of my expertise, the best solutions here are to either use a manager blueprint that holds your seed and reference this singular blueprint in every blueprint that needs this seed, or to use a data asset to hold this information.
This method mentioned here looks really promising. Keeping the seed attached to the game instance should make it easily accessible everywhere.