DFX3xxx — Declarations and document structure
Every DFX3xxx diagnostic, with its severity, verbatim message, cause and fix.
31 codes in this family (31 error). The message is the format string as the compiler holds it: %s, %d and %c are substituted at runtime.
DFX3000
errorraised byGeneration/DreamFXGenerator.cpp:1696Generation/DreamFXGenerator.cpp:1707
(built at runtime)
Cause. The Root="..." does not name a mounted content root, or Name="..." has no asset name after its last slash.
Fix. Root is Game, empty, or Plugin.<PluginName>. Name is a path ending in the asset's name, e.g. Systems/NS_Spark.
DFX3001
errorraised byGeneration/DreamFXGenerator.cpp:1257
(built at runtime)
Cause. The module name resolved to nothing on the search paths. Distinct from DFX3003, which means the module exists but has no such input -- a typo in a path and a typo in an argument would otherwise read the same.
Fix. Add the folder to Settings.ModulePaths, or write the full asset path. dfx list prints every module on the current paths.
DFX3002
errorraised byGeneration/DreamFXGenerator.cpp:1298Generation/DreamFXGenerator.cpp:1351
Could not read the input schema of module '%s': %s
Cause. The module was found but its input signature could not be read. The schema is probed by adding the module to a transient system, so this usually means the module cannot live in the stack it was written in.
Fix. Check the stack. dfx schema <Module> -Stack <Stack> reproduces the probe.
DFX3003
errorraised byGeneration/DreamFXGenerator.cpp:1415
Module '%s' has no input named '%s'.%s Available inputs: %s
Cause. The module has no input by that name. Niagara input names contain spaces (Loop Duration); DreamFX normalises both sides, so LoopDuration matches, but a misspelling does not.
Fix. Use one of the names listed. A near-miss is suggested. dfx schema <Module> prints the full signature, including inputs hidden behind a static switch.
DFX3004
errorraised byGeneration/DreamFXGenerator.cpp:1478
Unknown renderer type '%s'. Expected one of SpriteRenderer, MeshRenderer, RibbonRenderer, LightRenderer, DecalRenderer, ComponentRenderer, VolumeRenderer, or any UNiagaraRendererProperties subclass.
Cause. Renderer types are a closed set.
Fix. Use one of the listed types. Renderer properties are schema-driven and open (L8); only the type keyword is fixed.
DFX3005
errorraised byGeneration/DreamFXGenerator.cpp:1848
Emitter '%s' is declared more than once. Emitter names are stable keys and must be unique.
Cause. Two emitters share a name. The name is the stable key the regeneration contract matches handles by (plan 4.5), so a duplicate is data loss, not a naming nit.
Fix. Rename one. To rename an emitter that already exists in an asset, use dfx rename first so the handle and its rapid-iteration parameters survive (R4).
DFX3006
errorraised byGeneration/DreamFXGenerator.cpp:923
'%s' is neither an allowed inline function (%s) nor a dynamic input: %s
Cause. A call in a value position matched neither the L6 builtin whitelist nor any dynamic input asset.
Fix. Use one of the builtins listed, reference a real dynamic input, or write the maths in an hlsl { } block. Widening the whitelist is a design decision (L6), not a config change.
DFX3007
errorraised byGeneration/DreamFXGenerator.cpp:965
Could not read the input schema of dynamic input '%s': %s
Cause. The dynamic input asset was found but its signature could not be read.
Fix. dfx schema <Name> reproduces the read against the same asset.
DFX3008
errorraised byGeneration/DreamFXGenerator.cpp:1017
Dynamic input '%s' has no input named '%s'. Available inputs: %s
Cause. The dynamic input has no input by that name -- DFX3003 one level down a chain.
Fix. Use one of the names listed.
DFX3009
errorraised byGeneration/DreamFXGenerator.cpp:1280Generation/DreamFXGenerator.cpp:948
Dynamic input '%s' is pinned to version %s, which its asset does not offer. Available version(s): %s.
Cause. An R7 @version pin disagrees with the module asset's exposed version, or pins an asset that never opted into versioning. The pin records which version the source was written against; DreamFX cannot build against any other one, because the external edit API has no way to select a version.
Fix. Retest against the exposed version and update the pin, restore the version on the asset, or drop the @ if the module is unversioned.
DFX3010
errorraised byGeneration/DreamFXGenerator.cpp:1792Generation/DreamFXGenerator.cpp:306Generation/DreamFXGenerator.cpp:893
Property '%s': %s
Cause. A Properties entry is malformed -- see the inner message.
Fix. Fix the declaration. Types are listed in DFX4021's message.
DFX3020
errorraised byGeneration/DreamFXGenerator.cpp:563
Unknown %s setting '%s'. Available settings: %s
Cause. A settings key that does not exist. An unchecked misspelling would do nothing at all, and the effect would simply be wrong with no sign why.
Fix. Use one of the names listed -- they are read from the live asset, so they are the real ones.
DFX3021
errorraised byGeneration/DreamFXGenerator.cpp:1739
User parameter '%s' is declared more than once.
Cause. Two user parameters share a name; a blueprint SetNiagaraVariable would reach whichever won.
Fix. Rename one.
DFX3030
errorraised byLint/DreamFXLint.cpp:178
A Module or DynamicInput must declare Settings.Usage -- it decides which stacks the module can be placed in.
Cause. Usage decides which stacks a module may be placed in. Without it the module exists and is unreachable from every stack.
Fix. Add Usage = ParticleUpdate; (or another stack). An array selects several: Usage = [ParticleSpawn, ParticleUpdate];
DFX3031
errorraised byLint/DreamFXLint.cpp:186
A DynamicInput must declare Settings.Output -- its return type cannot be inferred from the body.
Cause. A dynamic input's return type cannot be inferred from its body.
Fix. Add Output = float; (or the type it returns).
DFX3032
errorraised byLint/DreamFXLint.cpp:192
A DynamicInput's Usage must be DynamicInput, not '%s'.
Cause. A DynamicInput document declaring a stack usage makes two statements about what it is that disagree.
Fix. Write Usage = DynamicInput;, or change the document kind to Module.
DFX3033
errorraised byLint/DreamFXLint.cpp:203
Input '%s' is declared more than once.
Cause. Two inputs share a name and would collide on the same Module. parameter.
Fix. Rename one.
DFX3034
errorraised byLint/DreamFXLint.cpp:218
Input '%s' is marked [StaticSwitch] but is a %s. A static switch must be a bool, an int or an enum.
Cause. R5: a static switch is resolved at compile time, so it has to be something a switch can branch on.
Fix. Make it bool, int, or an enum -- or drop the [StaticSwitch].
DFX3035
errorraised byLint/DreamFXLint.cpp:224
Input '%s' is a [StaticSwitch], so its default must be a compile-time constant.
Cause. R5 from the other side: a switch resolved at compile time cannot take a runtime value.
Fix. Give it a literal default.
DFX3036
errorraised byLint/DreamFXLint.cpp:233
The Body block is empty.
Cause. An empty body generates a module that occupies a stack slot and does nothing.
Fix. Write the body, or delete the file.
DFX3037
errorraised byGeneration/DreamFXModuleGenerator.cpp:1014
(built at runtime)
Cause. A dynamic input's body is not a single expression. The Niagara translator wraps it as Output = (Type)( <body> );, so statements before the return produce invalid HLSL rather than an error naming the real problem.
Fix. Fold it into one expression, or write it as a Module -- a module's body is emitted verbatim and can hold as many statements as it likes.
DFX3038
errorraised byGeneration/DreamFXModuleGenerator.cpp:896
'%s' is not a stack a module can be placed in. Use one of: %s.
Cause. Usage names one of the six stacks (L1) and nothing else.
Fix. Use one of the names listed.
DFX3039
errorraised byGeneration/DreamFXModuleGenerator.cpp:937
A DynamicInput cannot return a data interface; its Output must be a value type.
Cause. A dynamic input feeds a value into an input slot; a data interface is not a value.
Fix. Return a value type. Data interfaces are declared in Properties and fed at runtime (plan 3.5).
DFX3040
errorraised byGeneration/DreamFXGenerator.cpp:1868
(built at runtime)
Cause. The from path did not resolve to a .dfe on disk.
Fix. Paths resolve relative to the referencing file first, then against every DFX root. The extension is optional.
DFX3041
errorraised byGeneration/DreamFXGenerator.cpp:1881
'%s' could not be parsed; see the errors above.
Cause. The referenced .dfe has its own errors; they are reported above this one against the .dfe's own path.
Fix. Fix the .dfe. Its diagnostics carry its own file and line, not the host's.
DFX3042
errorraised byGeneration/DreamFXGenerator.cpp:1891
'%s' declares a %s, but 'from' needs an Emitter document.
Cause. from pulls in an emitter, and the referenced file declares something else.
Fix. Point from at a .dfe.
DFX3043
errorraised byGeneration/DreamFXGenerator.cpp:1683
'%s' reads user parameters this system does not declare: %s. Add them to the Properties block.
Cause. A .dfe is merged by copy (R3), including whatever User.* it reads. The host has to declare those or the copied emitter reads a parameter that does not exist. The diagnostic points at the from line, because that is where the decision was made.
Fix. Add the named parameters to the host's Properties block.
DFX3044
errorraised byGeneration/DreamFXModuleGenerator.cpp:967
The default for input '%s' has to be a literal or an enum entry. A module input default is stored on the asset, so it cannot reference anything outside the module.
Cause. A module input's default is stored on the asset, so it cannot reference anything outside the module.
Fix. Use a literal or an enum entry. To make it caller-supplied, leave it and set it at the call site.
DFX3045
errorraised byGeneration/DreamFXModuleGenerator.cpp:499
'%s' is not a type a particle attribute can have.
Cause. A particle attribute was declared in a .dfm body with a type that is not a Niagara value type.
Fix. Use one of the DSL types -- float, int, bool, Vector2, Vector, Vector4, Color, Position, Quat.
DFX3046
errorraised byGeneration/DreamFXModuleGenerator.cpp:599
'%s' is not a particle attribute DreamFX knows the type of. Write the type at its first use in the body -- `float %s = ...;` -- the way a .dfs declares a new attribute.
Cause. A .dfm body touches a Particles.* attribute that is neither a common Niagara attribute nor declared in the body. The pin wired for it needs a type, and guessing would wire one of the wrong width.
Fix. Write the type at its first use, the way a .dfs declares a new attribute: float Particles.Moon.Phase = 0.0;
DFX3047
errorraised byGeneration/DreamFXModuleGenerator.cpp:1003
A DynamicInput computes a value; it cannot write '%s'. Move the write into a Module.
Cause. A dynamic input computes a value in an input slot; it has no place in the stack to write from.
Fix. Move the write into a Module.