Cooked projects
Common mistakes on cooked projects: searching for Blueprints and getting a small, confident answer, and edits that stop the editor because the asset's editor data was stripped. Each entry says what you see, why, and what to do.
What cooked content is and what MifBridge can do with it is on cooked-projects. This page covers the traps.
A cooked asset keeps what runs and loses what is edited
A cooked asset loads and behaves correctly at runtime. Its editor-only data was stripped. Anything on the editor side that reaches for that data finds nothing, and how it fails depends on how defensively that part of the engine was written. Several of these stop the editor instead of returning an error, so ask "does this asset have editor data?" before the operation, not after.
| Asset | What is gone | How a write or copy fails |
|---|---|---|
| User-defined struct | The editor data the struct tools need | Fatal: the engine cast-checks it and stops the editor |
| Material | The expression graph | Honest: list_material_expressions answers numExpressions: 0, cooked: true |
| Niagara system | The editor data that copying re-runs | Duplicating raises an access violation inside the engine, with no MifBridge frame on the stack |
| Static mesh, duplication | The mesh description a rebuild needs | Fatal assertion inside the engine's mesh build |
| Static mesh, simple collision | The mesh description every shape generator fits against | Access violation: the engine reads the mesh description with no null check |
What you see: the editor closes and the log's last frames are engine code, not MifBridge.
What to do instead:
- Read through reflection.
get_propertyandlist_object_propertieswalk cooked assets, including deep paths. A cooked Niagara system's exposed parameters yield names and types, and a cooked static mesh's bounds, LOD count and materials all read. - Use the tables that survive the cook. Cached material parameters survive, which is why
list_material_parametersworks on shipped materials where the expression listing cannot. - Call the runtime surface.
add_function_callreaches Blueprint-callable functions. remove_collisionon a cooked static mesh is fine. It only touches existing collision primitives, never the mesh description.
MifBridge refuses the dangerous cases before they run: struct edits on a cooked struct, duplicate_asset on a cooked Niagara system or static mesh, and add_simplified_collision on any static mesh with no mesh description. If you get one of those refusals, it replaced a crash.
Other writes that cost the editor
- A cooked landscape. Its heightmap and paint layer textures lose their source data. The landscape endpoints (
export_landscape_heightmap,sample_landscape,sculpt_landscape,paint_landscapeand the other landscape writers) refuse such a landscape before changing anything, naming the component. Usediagnose_landscapeandtrace_groundto read it. - A cooked texture. There is no source image, and the engine's exporter stops the editor on one.
export_assetrefuses it, answeringcookedandhasSourceImage: false, and namesrender_thumbnail, which renders it from its platform data.
find_assets {class:"Blueprint"} finds almost nothing
What you see: a search for Blueprints returns a small number with ok:true, and nothing suggests the answer is wrong.
Why: cooking registers a Blueprint under its generated class (BlueprintGeneratedClass, WidgetBlueprintGeneratedClass, AnimBlueprintGeneratedClass), not as a Blueprint. On a cooked game's Blueprint folder:
| Query | Count |
|---|---|
class:"Blueprint" |
26 |
class:"BlueprintGeneratedClass" |
915 |
Under 3 percent, delivered with confidence. bRecursiveClasses does not rescue it: a Blueprint and its generated class are different hierarchies, not parent and child, so recursion never crosses.
It is worse than a plain miss, because the few that do come back are mostly assets the bridge made itself in the session. Anything newly authored is uncooked. A small answer made largely of your own scratch assets looks like a real, small result set.
What the bridge does about it: find_assets re-runs the count with the generated-class spelling and reports generatedClassCount and cookedClassNote, only when the other spelling is genuinely bigger. The re-count applies your nameContains, pathPrefix and origin filters. An uncooked project gets no note.
Do instead:
- Search both spellings:
class:"BlueprintGeneratedClass"as well asclass:"Blueprint", and for widgets and animation Blueprints their own generated-class names. - For discovery, use
list_blueprints. Every row carriescooked: true|false, andcookedCounttotals them. It deduplicates by package, because an uncooked Blueprint is registered under both spellings. On one cooked game it returned 3227 Blueprints where a query ofBlueprintalone had shown 1818. - Never write "this project has no X" from a zero. A
0from aBlueprintquery on cooked content is not evidence. Ask the generated-class spelling, or follow the parent classes.
A cooked Blueprint has no graphs
list_graphs, list_nodes and find_nodes cannot read a cooked Blueprint's graphs, because the editor-only Blueprint object is gone. They say so, rather than answering "not found" or an empty list.
What you can do:
list_componentsreads the component tree.describe_packagelists the objects in the package and whether it is cooked.create_editable_childmints an editable copy, but needs an engine function that exists only in the engine build MifBridge was developed against. On a stock engine it refuses with a named reason. See cooked-projects.
Two copies with the same node GUIDs
Some modded or cooked assets load as two copies whose nodes share identical GUIDs. A lookup by nodeGuid alone may land in the wrong copy. Pass graphId alongside the GUID. get_node accepts graphId for exactly this.
Where to go next
- cooked-projects for what works on cooked content
- mistakes-losing-work for saves and deletes
- mistakes-materials and mistakes-niagara for those asset types