The build was a custom interior in its own resource. It loaded, it looked correct, and you could walk around it. Then players started dropping at character select — not all of them, not instantly, but reliably, around twenty seconds after joining.
Every instinct says this is a problem with the interior. It is not. The most useful early observation was one that seemed to rule the interior out: the crash fires regardless of where the player is. We moved the spawn 2.7 km away and the crash arrived on schedule.
That single fact eliminates almost everything people normally suspect. It is not a draw-distance problem, not a texture budget problem, not a collision problem and not a LOD problem, because none of those can fire for a player who cannot see the building.
Reading the crash properly
Server console will not help you here — the server is fine. The crash is on the client, and the client writes a log:
# filenames are UTC — not your local time.
# read the LAST frames before DumpServer starts:
[ cfx] Crash: GTA5.exe+93419F
[ cfx] Crash signature: high-sad-wolfram
[ cfx] Initializing DumpServerTwo practical notes, because both have cost us time. The log filenames are in UTC, so the file you want is often not the one that looks newest relative to your clock. And what matters is the last frames before DumpServer — that is where the crash actually fired. We once spent an afternoon on a misread here, convinced the crash happened on approach to the building, because we read the wrong end of the file.
The week, in order
Each of these was a reasonable hypothesis. Each produced a result that looked like progress. That is what made it expensive.
Blame the exporter
Blame the archetype
Bisect the interior
Blame the names
Read a working interior instead
The rule
Every streamed map resource that places archetypes from its own .ytyp must ship a _manifest.ymf. For an MLO, data_file 'DLC_ITYP_REQUEST' in your fxmanifest.lua is not sufficient on its own.
The manifest is what tells the engine which archetype definitions a given map file depends on, so it can resolve them in the right order. Without it, the interior proxy is registered at join — which is why the player’s position is irrelevant — against a type dictionary the engine was never instructed to load first. It is a load-ordering failure wearing the costume of a graphics bug.
This also explains, in retrospect, why the whole first week was wasted. Encoding, layout, geometry and naming were all irrelevant, so every experiment in those categories “failed to reproduce a fix” identically. We were bisecting along an axis the bug did not lie on.
What is actually in a manifest
It is a small binary metadata file with three sections that matter:
imapDependencies_2— for each map file, which type dictionaries it needs. This is the one that stops the crash.itypDependencies_2— for each type dictionary, which other ones its entities draw on. A full commercial interior we examined declares thirty-one vanilla prop dictionaries here.Interiors— the registry of MLO archetype names in the resource. A plain shell with no MLO leaves this empty; an interior must appear in it.
For a sense of scale: a large commercial tower we studied ships a manifest with roughly 110 map-dependency entries, because it re-declares the wiring for every vanilla map file its edit touches — not merely its own. It also splits the work across two manifests, one for the building and one for the interiors. That is the standard the finished thing is held to.
Getting one
This is the awkward part, and it is worth saying plainly rather than pretending the tooling is better than it is: the common map-editing library can read these files but cannot write them. There is no save path.
The practical route is to take a manifest from a resource that works, and patch the identifiers inside it to yours. The identifiers are stored as hashes in big-endian order, which is the detail that catches people out — the bytes look wrong if you assume the opposite order and you will conclude the file is corrupt when it is fine. Patch, then dump the result and read it back before you trust it.
How to tell if this is your crash
- Players crash a short, fairly consistent interval after joining, rather than at a place.
- Moving the spawn far away from the new resource changes nothing.
- Removing the resource entirely fixes it, which makes the resource look guilty of something it is not doing.
- Re-exporting, renaming and simplifying the interior all have no effect whatsoever.
- The resource contains a
.ytypof its own and no_manifest.ymf.
If the first four are true, stop testing the interior. The problem is not in the geometry; it is in what the engine was told about the geometry, and no amount of rebuilding the model will change what it was told.
