DFX5xxx — Generation and asset writing
Every DFX5xxx diagnostic, with its severity, verbatim message, cause and fix.
DFX5xxx --- Generation and asset writing
The block between the generated markers is written by
.skill/gen-diagnostics.ps1. Everything below a marker is written by hand and survives a regeneration.
DFX5001
Severity error
Message
Stack '%s' has no Niagara script usage mapping.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:1355
Cause. A stack kind with no Niagara script usage behind it. Every kind the parser can produce
maps today — the six fixed stacks, OnEvent and Stage — so reaching this means a new stack kind
was added to the enum without extending ScriptUsageForStack.
Fix. Use one of the mapped stacks; if you are adding a kind, extend the adapter's mapping pair
(ScriptUsageForStack, StackForScriptName) together.
DFX5002
Severity warning
Message
This system declares no emitters, so it will produce nothing.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2479
Cause. A system with no emitters compiles and produces nothing.
Fix. Add an Emitter block.
DFX5003
Severity info
Message
'%s' is not declared in this source, so its existing modules are left as-is: %sRaised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4064
Cause. Declaring a stack means taking it over; a stack this source never mentions keeps whatever it had. CreateNiagaraSystem puts a SystemState in SystemUpdate, and clearing it wholesale would make every .dfs without an explicit SystemUpdate produce a system that never runs. Informational so the difference is visible rather than silent.
Fix. Nothing, usually. To take the stack over, declare it -- an empty SystemUpdate = { } clears it.
DFX5004
Severity info
Message
No Material was set, so the engine default was applied: %s. Write 'Material = \"...\";' to choose your own.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4323
Cause. A renderer with no Material gets the engine default, which is why an untextured effect still draws.
Fix. Write Material = "..."; to choose your own.
DFX5015
Severity error
Message
Emitter '%s' has no record in the last build's plan.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4106
Cause. Not written yet.
Fix. Not written yet.
DFX5020
Severity error
Message
The last build of this stack recorded %d module node(s) for %d module(s), so its nodes cannot be addressed.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2919
Cause. Not written yet.
Fix. Not written yet.
DFX5027
Severity error
Message
Could not read native parent defaults: %s.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2255, Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2334
Cause. An explicit default changes a native parent's parameter type, or Niagara could not apply the emitter's declared or inherited defaults.
Fix. Preserve the inherited parameter type and correct the value, binding or graph condition identified by the accompanying adapter error before rebuilding.
DFX5030
Severity error
Message
SavePackage failed for '%s'.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1436
Cause. Writing the package failed -- read-only file, source control lock, or a path the process cannot write.
Fix. Check the file's permissions and check it out if it is under source control.
DFX5031
Severity error
Message
Emitter '%s' declares more than one OnEvent block. Only one event handler per emitter is representable; split the extra handlers into their own emitters.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2404
Cause. An emitter block declares two or more OnEvent blocks.
DreamFX reaches event stacks through the external edit API's ordinary stack rails, and those rails can only address an event script whose usage id is the zero guid — which means exactly one addressable handler per emitter. A second handler would exist on the asset but be invisible to every read and write that follows, so the generator refuses it up front instead of building something it could never round-trip.
Fix. Keep one OnEvent block per emitter. If one emitter genuinely needs to react to two event streams, split it into two emitters, one handler each — the stacks stay identical and both spawn against the same source events.
DFX5032
Severity error
Message
Emitter '%s' declares two Stage blocks named '%s'. Stages are identified by name; rename one.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2382
Cause. One emitter declares two Stage blocks with the same name. The write side
creates-or-reuses a stage by its name (the engine UI's own identity for stages), so both blocks
would land on one stage and it would silently hold whichever stack was written last. The same code
carries adapter-reported stage failures at build time — a slice that was never closed, a stage on
the asset whose class is not the engine's generic stage.
Fix. Rename one of the blocks. Stages within one emitter are identified by name, so each needs its own.
DFX5033
Severity error
Message
Emitter '%s' declares Stage blocks but simulates on the CPU. Simulation stages are a GPU feature: set `SimTarget = GPU` in the emitter's Settings.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4495
Cause. An emitter declares Stage blocks while simulating on the CPU. Simulation stages are a
GPU-compute feature; a CPU emitter cannot run one, and Niagara's own complaint arrives later as a
compile error naming no source line. The check reads the live emitter rather than this file's
Settings, because a from emitter can be GPU without the .dfs saying so.
Fix. Set SimTarget = GPU in the emitter's Settings block (with a FixedBounds, which GPU
emitters cannot compute for themselves), or delete the Stage blocks.
DFX5034
Severity error
Message
Emitter '%s' uses 'as %s' on two module calls. Node names are unique per emitter; rename one.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2459
Cause. Two module calls in one emitter carry the same as <name> suffix. The suffix names the
function call NODE, Output.<node>.<value> links resolve by that name, and node names are unique
per emitter graph — two claimants would leave every such link resolving to whichever node the
traversal happens to meet first.
Fix. Rename one. The decompiler only emits as with the original asset's node names, which
are unique by construction, so this fires on hand-edited sources.
DFX5035
Severity error
Message
'%s' is still open in the Niagara script editor. The rebuild was cancelled to protect its editable copy. Close the editor, then rebuild again.Raised by Source/DreamFXEditor/Private/UI/DreamFXEditorGeneration.cpp:46
Cause. The target Niagara script editor could not close, for example because its close confirmation was cancelled. Its editable copy could overwrite the generated graph if rebuilding continued.
Fix. Resolve the editor's pending changes and close it, then rebuild. Editors that close successfully are reopened after generation completes.
DFX5036
Severity warning
Message
OnEvent source '%s' is an id no emitter in this system answers to, so this handler never fires. Point it at the emitter that raises the event, or delete the handler.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4404
Cause. An OnEvent header's Source is an id no emitter in this system answers to, written the
way the decompiler writes one it cannot resolve: `<unresolved GUID>`. Two things produce it. A
handler carried into a copied system keeps the id it had in the system it came from — nothing remaps
it on copy, so several systems end up sharing one stale id. Or the source emitter was deleted and the
handler stayed behind.
The handler is written back with that id, so the round trip is faithful, but it can never fire: the
runtime builds its event-handler lookup from the id's string form and then finds the event set by
name (NiagaraEmitterInstanceImpl.cpp:418-419, the lookup at :1307), and no emitter answers to
a guid. The asset is in exactly the same state — this is a fact about the asset, not about the text.
Fix. Decide which emitter in the system was meant to raise Event and name it in Source.
The source may appear before or after the receiver in the document: handlers are added after all
emitters exist. If nothing raises that event any more, delete the handler and
the modules its stack carried — that drops facts from the asset, so the build safety gate has to be
told (-Force) and its report lists what went. Rebuild afterwards: the warning stays until Source
names a live emitter.
DFX5093
Severity error
Message
'MaterialParam' is reserved syntax and is not implemented in v1 (plan section 7).Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:1777
Cause. MaterialParam is reserved syntax (L8) with no implementation in v1.
Fix. Not available. Set material parameters on the material instance instead.
DFX5097
Severity error
Message
Only System documents can be generated right now; this file declares a %s.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:5192
Cause. Only .dfs and .dfm produce assets. A .dfe is merged into its host by copy (R3) and has nothing of its own to generate.
Fix. Reference the .dfe from a .dfs with from.
DFX5098
Severity error
Message
Data interface parameter '%s' takes its configuration as a quoted JSON object, the form the decompiler writes.Raised by Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2037
Cause. A DI<T> user parameter's configuration is a quoted JSON object — the same verbatim form a module's data interface input takes, and the form the exporter writes. Anything else here is a value the applier cannot read. The code also reports under DFX5098 when the configuration was well-formed but the engine refused to apply it, which usually means a property name in the blob no longer exists on that interface class.
Fix. Write the configuration as a quoted JSON object, or leave the parameter bare — a declaration with no value is a slot to fill at runtime, which is legitimate and silent. dfx decompile on a system that already has the interface configured the way you want prints the exact blob.
Changed 2026-08-12. This used to be a warning meaning "declared only, v1 does not apply defaults" (plan 3.5). Configuration is now applied. That scope cut was costing real behaviour: the collision sources and property readers on
NS_Spawn_Ninja_Rootare all user data interfaces, and every mirror default-constructed them — the effect rendered and interacted with nothing.
DFX5100
Severity error
Message
'%s' is a %s with no generated asset at '%s', and %sRaised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:834
Cause. No previously generated asset was found, and this build has no graph backend to make one. That is rarer than it used to be: an engine that does not export the five declarations still gets the reflection backend, so reaching this means its startup self-check failed and the message names which check it was. See dfm.md for the three outcomes.
Fix. Read the named check --- it says which engine shape the backend expected and did not find, which is the actual thing to fix or report. Meanwhile, build the module on an engine where a backend does run and commit the asset; any engine loads, references and cooks it normally. Or sidestep the module entirely with an inline hlsl { } expression or an existing dynamic input asset.
DFX5101
Severity error
Message
(built at runtime)Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:716
Cause. The Root="..." on a .dfm does not name a mounted content root.
Fix. Root is Game, empty, or Plugin.<PluginName>.
DFX5102
Severity info
Message
Input '%s' is marked [StaticSwitch]. Tier-one generation (plan 3.3) lowers the whole Body to a single custom HLSL node, which has no branch for a switch to select, so it is written as an ordinary input instead. The body reads it the same way; only the compile-time folding is lost.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1068
Cause. Tier-one generation (plan 3.3) puts the whole body in one custom HLSL node, which has no branch for a switch to select, so a [StaticSwitch] input becomes an ordinary one. Said out loud because silently downgrading a declared compile-time switch to a runtime value is the kind of difference that surfaces later as a performance question nobody can source.
Fix. Nothing -- the body reads it the same way. Only the compile-time folding is lost.
DFX5103
Severity error
Message
Package '%s' exists on disk but could not be loaded.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:746
Cause. The package exists on disk but would not load. Usually a partially written file or one held by another process.
Fix. Check the file. If the editor has it open, close the asset and rebuild.
DFX5104
Severity error
Message
Package '%s' exists but holds no Niagara script named '%s'. Refusing to overwrite it.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:755
Cause. The target package exists and holds something other than the expected script. DreamFX refuses to overwrite it rather than replacing an unrelated asset.
Fix. Change Name="...", or delete the asset if it really is stale.
DFX5105
Severity error
Message
Could not create package '%s'.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1117
Cause. The package could not be created -- usually an unmounted root or an invalid name.
Fix. Check Root and Name.
DFX5106
Severity error
Message
Could not wire the module graph. The Niagara schema rejected a parameter map connection.Raised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1216, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1241, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1250, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1264, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1341, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1350, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1367, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1379, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1387
Cause. The Niagara schema rejected a connection while building the module graph. A type mismatch between an input's declared type and the pin it feeds is the usual cause.
Fix. Check the input's type. If it is a type Niagara has no pin for, the module cannot take it.
DFX5107
Severity error
Message
'%s' no longer matches the module asset at '%s', and this build cannot regenerate it. Rebuild it where a graph backend runs and commit the updated asset; %sRaised by Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:851
Cause. The .dfm source no longer matches its committed asset, and this build has no graph backend to regenerate it. Distinct from DFX5100 because the remedy differs: there is an asset, it is simply out of date.
Fix. Rebuild the module where a backend runs and commit the updated asset. The trailing half of the message names the check that failed, which is what to fix if you expected this engine to be able to generate.
DFX5099
Historical diagnostic. This informational code is no longer emitted by the current source tree. The section is retained for older diagnostic links, outside the generated active-code list.
The earlier message was:
[Group] and [SortPriority] are kept in source only: the external edit API's user variable struct has no metadata fields to write them to.That limitation has been removed. Group and SortPriority now reach the asset through the
system's user parameter hierarchy, UNiagaraSystemEditorData::UserParameterHierarchy. Rebuilding
applies the source's grouping and order; manual editor arrangements do not survive a rebuild.
See user parameters in the system reference for the current behavior.
DFX5015
This compatibility heading preserves links from an earlier documentation snapshot. DFX5015 is
now part of the published incremental-build diagnostics: an emitter has no record in the last
build's plan. See the current DFX5015 reference for its cause and remedy.
DFX5020
This compatibility heading preserves links from an earlier documentation snapshot. DFX5020 is
now part of the published incremental-build diagnostics: the stored module-node count does not
match the stack's module count, so its nodes cannot be addressed. See the current
DFX5020 reference for its cause and remedy.