DreamFXLang
Plugin referenceDiagnostics

DFX5xxx --- Generation and asset writing

DFX5xxx --- Generation and asset writing

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: %s

Raised 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_Root are 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 %s

Raised 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; %s

Raised 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.

On this page