World Building
Every World Building command in CodeFizz Editor Agent, with parameters and examples.
Every World Building command in CodeFizz Editor Agent, with parameters and examples.
55 commands. Each shows its parameters and an example, and has a copyable deep link, so you (or an AI agent) can jump straight to one.
paint_landscape_layersPaint every landscape layer in one normalised pass
Paints all layers together with per-vertex weights normalised to sum to exactly 255. This exists because painting layers one at a time is wrong: LandscapeLayerBlend normalises internally, so several layers each written at 255 average into a washed-out mix instead of resolving to a dominant material, and any vertex no rule claims ends up with zero total weight and renders black. Slope is measured on a box-blurred heightfield (--slope-smoothing), because central differences over adjacent samples are high frequency and alias into a stipple that no amount of weight blending repairs. Layer syntax is "Name:rule:threshold:blend", semicolon separated. Rules: all, above_height, below_height, slope_above, slope_below. Include one 'all' layer as a base so every vertex is covered. Weights are read back per layer and reported, so engine renormalisation is visible rather than assumed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| layers | string | Yes | "Name:rule:threshold:blend;...", include one 'all' layer as the base |
| layer_info_path | string | No | Package path for any layer info assets that must be created |
| slope_smoothing | int | No | Box-blur radius in vertices applied before slope is measured |
| edge_noise | float | No | Jitter each boundary so transitions are not clean contour lines |
cfa paint_landscape_layers --layers "Rock:all; Grass:below_height:3000:2600; Snow:above_height:5400:1800"
cfa paint_landscape_layers --layers "Rock:all; Grass:slope_below:200:180; Snow:above_height:6000:1500" --slope-smoothing 3create_volumeSpawn a volume with real brush geometry at a given size
Spawns any AVolume subclass and builds its brush at the size you ask for, mirroring the editor's own drag-and-drop path (UCubeBuilder + UActorFactory::CreateBrushForVolumeActor). spawn_actor_by_class also produces a volume, but always with the actor factory's fixed 200x200x200 brush, so sizing it afterwards means scaling the actor rather than rebuilding the brush the collision is derived from. --size is the full box size in world units, not half-extents. Use --unbound for a post-process volume that should affect the whole level regardless of shape. Verified identical on UE 5.6, 5.7 and 5.8 (CubeBuilder.h:18/28/32/36, ActorFactory.h:99).
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_path | string | Yes | Volume class: full path (/Script/Engine.PostProcessVolume) or short name (PostProcessVolume) |
| name | string | No | Actor label for the new volume (defaults to the class name) |
| location | string | No | World location of the volume centre as "X,Y,Z", e.g. "0,0,500". Defaults to the origin |
| rotation | string | No | World rotation as "Pitch,Yaw,Roll". Defaults to zero |
| size | string | No | Full box size in world units as "X,Y,Z", e.g. "4000,4000,2000". Defaults to 1000,1000,1000 |
| unbound | bool | No | Post-process volumes only: affect the whole level regardless of the volume's shape |
| folder | string | No | Outliner folder to place the volume in, e.g. Environment |
cfa create_volume --class-path /Script/Engine.PostProcessVolume --name Grade_Main --size 4000,4000,2000
cfa create_volume --class-path NavMeshBoundsVolume --name Nav_Bounds --size 8000,8000,2000
cfa create_volume --class-path PostProcessVolume --name Grade_Global --unboundvalidate_volumeVerify a volume has brush geometry and actually does something
Checks that a volume works rather than merely exists: brush geometry present, bounds non-zero, and for post-process volumes how many bOverride_ flags are actually active. A post-process volume with zero active overrides changes nothing, which is the most common silent no-op in the domain. Returns verdict pass / pass_with_warnings / fail plus an issues list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor label or name of the volume to check |
cfa validate_volume --actor-label Grade_Maincreate_landscapeCreate a landscape at a chosen resolution
Spawns an ALandscape and imports a flat heightfield at the requested resolution. Resolution comes from section_size x sections_per_component x component_count, giving (component_count * section_size * sections_per_component) + 1 vertices per axis. Defaults produce 8x8 components of 63 quads = 505x505 vertices, 50400x50400 world units at scale 100. Scale is applied BEFORE import because ULandscapeInfo captures DrawScale when it is created, which import does. Uses the TArrayView Import overload, the older TArray* form is deprecated on 5.6/5.7 and gone in 5.8.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Actor label (defaults to Landscape) |
| section_size | int | No | Quads per section: 7, 15, 31, 63, 127 or 255 |
| sections_per_component | int | No | 1 or 2 |
| component_count_x | int | No | Components in X |
| component_count_y | int | No | Components in Y |
| location | string | No | World location as "X,Y,Z" |
| scale | string | No | Actor scale as "X,Y,Z" |
| material | string | No | Landscape material asset path |
cfa create_landscape --name Terrain --component-count-x 8 --component-count-y 8
cfa create_landscape --name Small --section-size 31 --component-count-x 2 --component-count-y 2 --scale 100,100,100sculpt_landscapeSculpt landscape heights with a shape
Writes heights through FLandscapeEditDataInterface, which is public in all three versions (the interactive brush FEdModeLandscape is Private/ and unreachable). Shapes: flat, hill, valley, ramp, terrace, noise, ridge, mountain (ridged multifractal, sharp crests rather than a dome), plateau, crater. Two passes reshape existing terrain and therefore REQUIRE --additive: erosion (thermal, material above the talus angle slides downhill, producing scree slopes and flat valley floors) and river (carves a meandering channel with smooth banks; --height is the cut depth, --radius sets the channel width). --additive adds to existing heights instead of replacing, so shapes can be layered. --seed makes noise and ridge reproducible. Heights are read back after the write, so the reported min/max world height is measured, not predicted. The edit layer is addressed by explicit GUID rather than the default constructor, which would target whatever layer the editor happens to have selected.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| shape | string | Yes | flat, hill, valley, ramp, terrace, noise, ridge, mountain, plateau, crater, erosion or river |
| height | float | No | Peak height in world units, signed |
| center | string | No | Centre in landscape vertex coordinates as "X,Y" |
| radius | float | No | Radius in vertices (defaults to a quarter of the landscape) |
| seed | int | No | Seed for noise and ridge |
| additive | bool | No | Add to existing heights instead of replacing |
cfa sculpt_landscape --shape hill --height 4000 --radius 120
cfa sculpt_landscape --shape noise --height 800 --seed 7 --additive
cfa sculpt_landscape --shape ridge --height 2500 --additivepaint_landscape_layerPaint a landscape weight layer
Paints a target layer, creating its layer info asset if needed via UE::Landscape::CreateTargetLayerInfo, present in 5.6, 5.7 and 5.8, unlike ALandscapeProxy::CreateLayerInfo which 5.8 removed. Rules select which vertices get weight: all, above_height, below_height, slope_above, slope_below (--threshold sets the cutoff). Weights are always read back afterwards and reported as vertices_verified_nonzero, because on 5.8 SetAlphaData's weight-adjust arguments are silently discarded, so the write cannot be trusted to have renormalized. A material must be assigned for painted layers to be visible.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| layer_name | string | Yes | Target layer name, e.g. Grass |
| layer_info_path | string | No | Package path for a new layer info asset |
| rule | string | No | all, above_height, below_height, slope_above or slope_below |
| threshold | float | No | Cutoff for the height and slope rules |
| weight | int | No | Weight 0-255 to paint |
| blend_range | float | No | Distance over which weight ramps in around the threshold. Zero gives a hard edge that aliases into a stipple pattern |
| edge_noise | float | No | Jitter the boundary by this amount so the transition is not a clean contour line |
cfa paint_landscape_layer --layer-name Grass
cfa paint_landscape_layer --layer-name Rock --rule slope_above --threshold 300
cfa paint_landscape_layer --layer-name Snow --rule above_height --threshold 2500get_landscape_infoRead a landscape's resolution, scale, height range and layers
Reports resolution, component sizing, scale, world size, the measured min/max world height read from the heightfield, the assigned material and the target layer list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
cfa get_landscape_infoclear_landscape_splinesRemove all landscape splines
Removes every control point and segment from the landscape's spline component and re-rasterises the splines edit layer. Clearing the objects alone is not enough: the deformation lives in that layer and stays baked in until it is re-applied from the empty set.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
cfa clear_landscape_splinesadd_landscape_splineDeform the landscape along a spline
Places a Landscape Spline that raises or lowers the terrain along a path. Unlike carving heights directly this is NON-DESTRUCTIVE: the deformation lives in the landscape's own spline edit layer, and the control points stay editable by hand in the Landscape tool afterwards. Heights are sampled from the terrain at each point, so the corridor follows the ground unless you offset it. Optionally paints a target layer along the corridor, which is how road beds and riverbanks are normally authored.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| points | string | Yes | Control points "X,Y; X,Y; X,Y" in WORLD units; at least two |
| width | float | No | Half-width of the flattened corridor, world units (default 400) |
| side_falloff | float | No | Falloff either side beyond the width, world units (default 600) |
| end_falloff | float | No | Falloff at the two ends, world units (default 400) |
| raise | bool | No | Raise terrain below the spline (default true) |
| lower | bool | No | Lower terrain above the spline (default true) |
| layer_name | string | No | Target layer to paint along the corridor, e.g. Gravel |
| height_offset | float | No | Vertical offset on every sampled height (default 0) |
| apply | bool | No | Apply the deformation now; false leaves it for hand editing (default true) |
| point_spacing | float | No | Max spacing between control points, world units; the path is subdivided and dropped onto the terrain so the corridor follows the ground instead of ramping. 0 uses your points verbatim (default 1500) |
| height_smoothing | int | No | Smooth sampled heights along the run, points either side (default 2) |
cfa add_landscape_spline --points "-20000,0; -5000,3000; 8000,-2000; 20000,1000" --width 500
cfa add_landscape_spline --points "0,0; 10000,0" --width 300 --layer-name "Gravel" --height-offset 120edit_terrain_regionEdit one region of an existing landscape
Applies a single operation to a circular region of the landscape that is already there, or to the whole landscape if no centre is given. The operation runs over the full heightfield and is then blended into the region through a smoothstep falloff, so erosion never sees an artificial boundary to erode against and the edit welds into the surrounding terrain with no visible rim. flatten with no explicit height targets the region's own mean, which lands the plateau where the ground already is instead of stepping.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| operation | string | Yes | raise, lower, flatten, smooth, noise, mountain, terrace, erode, thermal |
| center | string | No | Centre "X,Y" in WORLD units; omit to affect the whole landscape |
| radius | float | No | Region radius in world units (default 10000) |
| falloff | float | No | Fraction of the radius spent blending out, 0-1; 0 gives a hard seam (default 0.5) |
| amount | float | No | Height change for raise/lower/noise/mountain (default 1000) |
| height | float | No | Target height for flatten; omit to use the region's own mean |
| use_height | bool | No | Set when passing an explicit flatten height |
| radius2 | int | No | Blur radius for smooth, brush radius for erode (default 2) |
| iterations | float | No | Passes for smooth/thermal, droplets per vertex for erode (default 4) |
| step_height | float | No | Vertical step spacing for terrace, in world units (default 400) |
| feature_scale | float | No | Feature wavelength in vertices for noise/mountain (default 120) |
| seed | int | No | Random seed (default 1) |
cfa edit_terrain_region --operation flatten --center "0,0" --radius 6000
cfa edit_terrain_region --operation mountain --center "-12000,4000" --radius 9000 --amount 2500
cfa edit_terrain_region --operation smooth --center "5000,5000" --radius 4000 --iterations 6add_riverCarve a river into an existing landscape
Edits the landscape that is already there, without regenerating it. The river's path is traced by following the terrain's own steepest descent from the start point, so it physically cannot run uphill or over a summit whatever start you give it. Width and depth are sized from the drainage each cell carries, so headwaters are a shallow notch and the trunk cuts deep and wide. Depressions are filled first, otherwise the trace stops in the first pit it meets. Reports total descent from source to mouth as proof the channel actually falls.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| start | string | No | Start "X,Y" in WORLD units; omit to start from the wettest point |
| from_peak | bool | No | Start from the highest point instead of the wettest |
| depth | float | No | Bed depth in world units at the widest point (default 300) |
| width_scale | float | No | Width multiplier; width follows drainage area (default 2.5) |
| valley_width | float | No | Valley shoulder as a multiple of channel width (default 2.5) |
| tributaries | bool | No | Also carve every tributary above the channel threshold |
| to | string | No | Destination "X,Y" in WORLD units; routes THROUGH what lies between, cutting a gorge across high ground (a water gap) |
| climb_penalty | float | No | How hard the route avoids climbing when 'to' is given; high hugs valleys, low drives over ridges (default 40) |
| flow_attraction | float | No | How strongly the route is drawn onto existing channels, 0-0.95; without it the route is a straight canal (default 0.85) |
| excavation_weight | float | No | How strongly the route prefers low ground over being short; the main knob against a straight canal (default 12) |
| relax | int | No | Stream power steps after the carve so the terrain erodes to the river as base level, growing tributaries and flanks instead of a bare trench; 0 skips |
| water_plugin | bool | No | Use the engine Water plugin river body for real water rendering instead of a plain spline mesh ribbon |
| channel_depth | float | No | Minimum channel depth below local ground so the water runs the whole course; 0 derives it from water depth |
| carve | bool | No | Carve the channel into the heightmap ourselves; ignored when a Water plugin body is created since its brush already lowers the terrain |
| min_width | float | No | Narrowest the river may get in world units; the engine default is 2048 and thinner reads as a ribbon in a dry channel |
| spline_points | int | No | How many points the water spline gets; tangents interpolate between them, so few and smooth beats many and stepped |
| max_slope_degrees | float | No | Steepest reach the river may hold; the headwater above this slope is dropped so the river starts below the cascade |
| wall_angle | float | No | Valley wall angle in degrees; real threshold hillslopes are 30-35 (default 35) |
| concavity | float | No | Profile concavity; 0.45 is the conventional reference (default 0.45) |
| incision | float | No | Extra drop of the whole bed below the traced ground, world units (default 0) |
| water | bool | No | Also place a visible water surface along the channel (spline meshes, no plugin needed) |
| water_depth | float | No | How far above the carved bed the water sits, world units (default 60) |
| water_material | string | No | Material for the water; omit to generate a translucent one |
| layers | string | No | Paint from the river's own masks: "Riverbank:water_above:0.04:0.10; Rock:all". Adds water and flow to the height/slope rules |
| layer_info_path | string | No | Package path for any layer info assets that must be created |
| mask_smoothing | int | No | Blur radius for the water and flow masks before painting (default 3) |
cfa add_river
cfa add_river --start "25000,25000" --depth 400
cfa add_river --from-peak --tributariesgenerate_terrainGenerate a complete eroded terrain into a landscape
Builds the whole terrain in one pass: a ridged multifractal base shape with domain warping, then droplet hydraulic erosion which carves dendritic drainage networks, then thermal talus slippage which stops the ridges hydraulic erosion sharpens from becoming knife edges. Reports the slope distribution, because that is what actually distinguishes plausible terrain from procedural-looking terrain: real mountains run about 20-30 degrees median with under one percent above 60. Erosion cost is linear in droplets and quadratic in brush radius.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| seed | int | No | Random seed; the same seed always gives the same terrain |
| amplitude | float | No | Peak-to-trough height in world units before erosion (default 4000) |
| sharpness | float | No | 0 rolling hills, 1 sharp ridged crests (default 1) |
| warp | float | No | How much ridgelines meander; 0 runs them straight (default 0.5) |
| feature_scale | float | No | Largest feature wavelength in vertices (default 220) |
| erosion | float | No | Hydraulic droplets per vertex; 0 skips erosion (default 1) |
| erosion_radius | int | No | Brush radius in vertices; 2 narrow gullies, 4 broad valleys (default 3) |
| talus_angle | float | No | Thermal talus angle in degrees; 30-35 scree, 40-45 rocky (default 33) |
| thermal_iterations | int | No | Thermal passes; without these ridges never converge (default 12) |
| layers | string | No | Paint from the erosion's own history: "Name:rule:threshold:blend" separated by semicolons. Rules add flow, deposit, wear, debris (thresholds 0-1) to height and slope |
| layer_info_path | string | No | Package path for any layer info assets that must be created |
| mask_structure | float | No | Accumulation mask detail, 0 smooth to 1 fine (default 0.5) |
| mask_smoothing | int | No | Blur radius for accumulation masks; droplet deposition is per-cell so without this they are speckly (default 2) |
| hydrology | bool | No | Fill depressions, route flow, extract and carve the river network (default true) |
| channel_density | float | No | Channel head at this fraction of map drainage area; lower is denser (default 0.002) |
| river_depth | float | No | Channel bed depth in world units (default 260) |
| flow_convergence | float | No | MFD exponent; 1 diffuse, 4 crisp channels without D8 staircase (default 4) |
| stream_power_iterations | int | No | Stream power steps; makes valleys concave and slope-area correct. 0 skips (default 220) |
| erodibility | float | No | K in dz/dt = U - K*A^m*S^n; higher cuts faster and lowers relief (default 0.00004) |
| uplift | float | No | Rock uplift per step in world units; relief scales with uplift/erodibility (default 2) |
| hillslope_diffusion | float | No | Diffusion as a fraction of the stability limit, 0-0.9; rounds ridge crests (default 0.25) |
| detail | float | No | Fine relief added back AFTER erosion, world units. Stream power diffuses every step and thermal smooths every pass, so a long run leaves smooth clay however good the large shape is; this puts rock texture back on the faces. 0 disables (default 55) |
| detail_scale | float | No | Wavelength of that detail in vertices; smaller is crisper (default 9) |
| detail_slope_bias | float | No | Slope in degrees at which detail reaches full strength; below it it ramps off so flats stay smooth (default 26) |
| river_start | string | No | River source "X,Y" world units; with river_to the river is graded BEFORE erosion so the ranges build around it |
| river_to | string | No | River mouth "X,Y" world units; placed at the floor of the map |
| river_meander | float | No | Sideways wander of the course in world units; 0 is a dead-straight canal |
| river_meander_wavelength | float | No | Distance between one bend and the next, world units |
| river_valley_width | float | No | Valley floor half-width coefficient (metres at 1 km2 drainage) |
| river_wall_angle | float | No | Corridor valley wall angle in degrees |
| river_drop_fraction | float | No | How far the river descends as a fraction of map relief |
| concavity | float | No | Long-profile concavity for the corridor |
cfa generate_terrain --amplitude 5000 --erosion 1.0
cfa generate_terrain --sharpness 0.3 --erosion 0.5 --feature-scale 400validate_landscapeVerify a landscape is usable
Checks the landscape has ULandscapeInfo (absent means it was never imported), a readable extent, non-flat heights, an assigned material (without one, painted layers are invisible), target layers, and registered components. Returns verdict pass / pass_with_warnings / fail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
cfa validate_landscapebuild_lightingStart a Lightmass lighting build
Starts GEditor->BuildLighting at the chosen quality. Lightmass runs out of process, so this returns immediately, poll lighting_build_status. Refuses when Auto Apply Lighting is disabled in Editor Preferences, because in that state Lightmass finishes and then parks forever waiting for a human to click Apply Now, with the build reporting in_progress true and no completion delegate ever firing. Progress percentage is not available: FStaticLightingManager is engine-private, so only a running/not-running state exists.
| Parameter | Type | Required | Description |
|---|---|---|---|
| quality | string | No | preview, medium, high or production |
| current_level_only | bool | No | Build only the current level |
cfa build_lighting --quality preview
cfa build_lighting --quality production --current-level-onlylighting_build_statusPoll a lighting build
Reports in_progress, exporting, and the unbuilt-object counts. By default it also ticks UpdateBuildLighting, which is the pump that advances the build's stages, an interactively ticking editor calls it already, but an unattended one needs this to progress.
| Parameter | Type | Required | Description |
|---|---|---|---|
| pump | bool | No | Tick the build once while polling |
cfa lighting_build_statusrecapture_skyRecapture sky lights
The engine's RecaptureSky only ENQUEUES a capture; the work happens in UpdateSkyCaptureContents, which the editor tick normally drives. This command does both, so a headless run completes. Static-mobility sky lights are reported as skipped rather than counted as success: the engine refuses to capture those unless the project has ray tracing or distance fields enabled.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Sky light actor label (omit for all sky lights) |
cfa recapture_sky
cfa recapture_sky --actor SkyLightupdate_reflection_capturesFlush or fully rebake reflection captures
By default flushes pending capture updates via UpdateReflectionCaptureContents. --full-build runs GEditor->BuildReflectionCaptures, which waits on shader compilation and recaptures sky first. That path is gated on feature level SM5 because the engine hard-asserts below it. Note per-capture resolution does not exist in any version, it is the project setting r.ReflectionCaptureResolution, reachable through set_project_settings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| full_build | bool | No | Full rebake instead of flushing pending updates |
cfa update_reflection_captures
cfa update_reflection_captures --full-buildvalidate_lightingVerify lighting is built
Reads the same unbuilt-object count that drives the viewport's LIGHTING NEEDS TO BE REBUILT banner, refreshing it from the renderer first so the number is live rather than stale. Also reports unbuilt reflection captures and how many static/stationary lights have no baked data. Returns verdict pass / pass_with_warnings / fail.
cfa validate_lightingset_spline_pointsSet or append a spline's points
Writes points through the USplineComponent function API using the editor's own mutation sequence: batch every point with bUpdateSpline=false, rebuild once, then set the construction-script override so a rerun cannot discard the edit. This deliberately does NOT go through the reflection property writer: 5.7 made the parallel FSpline member persisted state with a LastAuthority arbiter, so writing SplineCurves as a property desyncs the two copies on 5.7 and 5.8. Reading by reflection is still fine.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | Yes | Actor label or name owning the spline |
| component | string | No | Spline component name (defaults to the actor's first) |
| points | string | Yes | Points as "X,Y,Z; X,Y,Z;..." |
| space | string | No | Coordinate space of the given points: world or local |
| point_type | string | No | linear, curve, constant, curveclamped or curvecustomtangent |
| append | bool | No | Append instead of replacing the existing points |
| closed_loop | bool | No | Close the spline into a loop |
cfa set_spline_points --actor Road_Spline --points "0,0,0; 1000,0,0; 2000,500,0; 3000,500,100"
cfa set_spline_points --actor Fence --points "0,0,0; 500,0,0" --point-type linear --closed-loopset_spline_pointEdit one spline point: location, tangents, rotation, scale, type
Edits a single point without rebuilding the whole spline. Two engine behaviours are handled for you. First, SetRotationAtSplinePoint realigns tangents to the rotation's forward vector, so rotation is applied BEFORE tangents, otherwise your tangents would be silently discarded. Second, the engine's singular SetTangentAtSplinePoint forwards the same vector to both arrive and leave, collapsing a broken tangent; this uses the plural form so arrive and leave stay independent. Note a custom tangent only survives on a point of type curvecustomtangent.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | Yes | Actor label or name owning the spline |
| component | string | No | Spline component name (defaults to the actor's first) |
| index | int | Yes | Index of the point to edit |
| location | string | No | New location as "X,Y,Z" |
| arrive_tangent | string | No | Arrive tangent as "X,Y,Z" |
| leave_tangent | string | No | Leave tangent as "X,Y,Z" |
| rotation | string | No | Rotation as "Pitch,Yaw,Roll" (applied before tangents) |
| scale | string | No | Scale as "X,Y,Z" |
| point_type | string | No | linear, curve, constant, curveclamped or curvecustomtangent |
| space | string | No | Coordinate space: world or local |
cfa set_spline_point --actor Road --index 2 --location 1500,700,200
cfa set_spline_point --actor Road --index 2 --point-type curvecustomtangent --arrive-tangent 0,900,0 --leave-tangent 900,0,0get_splineRead a spline's points, length and sampled transforms
Returns each point's world location, type and distance along the spline, plus total length and the closed-loop flag. --sample-count additionally returns that many locations sampled at even distance, which is the same stepping scatter_foliage uses for its spline pattern, the engine has no spacing concept of its own, so distribution is defined here.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | Yes | Actor label or name owning the spline |
| component | string | No | Spline component name (defaults to the actor's first) |
| sample_count | int | No | Also return this many evenly spaced samples along the spline |
cfa get_spline --actor Road_Spline
cfa get_spline --actor Road_Spline --sample-count 20validate_splineVerify a spline is usable
Checks the spline has at least two points, non-zero length, no duplicate consecutive points (which produce zero-length segments and break distance-based sampling), and that the construction-script override flag is set, without it, a Blueprint rerun silently discards the points. Returns verdict pass / pass_with_warnings / fail plus an issues list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | Yes | Actor label or name owning the spline |
| component | string | No | Spline component name (defaults to the actor's first) |
cfa validate_spline --actor Road_Splineadd_componentAdd a component to a placed actor in the level
Adds a component instance to an actor already in the level (as opposed to add_component_to_blueprint, which edits a Blueprint's template). This is how you give a plain actor a SplineComponent, a BoxComponent, a light component and so on. The component's properties are then ordinary reflected properties, editable with set_actor_property --component-name.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | Yes | Actor label or name to add the component to |
| component_class | string | No | Component class, e.g. SplineComponent or /Script/Engine.SplineComponent |
| component_type | string | No | Alias for component_class |
| component_name | string | No | Name for the new component (defaults to the class name) |
| attach_parent | string | No | Existing component to attach under (defaults to the root) |
cfa add_component --actor Road_Spline --component-class SplineComponent --component-name Path
cfa add_component --actor Trigger_A --component-class BoxComponentcreate_foliage_typeCreate a foliage type asset from a static mesh
Creates a UFoliageType_InstancedStaticMesh asset. Foliage types must be assets: the engine asserts on a non-asset type in a World Partition level, and the engine's own save helper opens a modal dialog, so this uses the dialog-free duplicate path instead. Every placement rule is an ordinary reflected property, so shape the type with set_asset_property: Density, Radius, ScaleX/ScaleY/ScaleZ (FFloatInterval min/max), ZOffset, AlignToNormal, RandomYaw, RandomPitchAngle, GroundSlopeAngle, Height, LandscapeLayers, CollisionWithWorld, CullDistance, CastShadow and the rest. scatter_foliage then applies whatever you set.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | Yes | Static mesh to grow foliage from |
| asset_path | string | Yes | Package path for the new foliage type, e.g. /Game/Foliage/FT_Bush |
cfa create_foliage_type --mesh-path /Game/Meshes/SM_Bush --asset-path /Game/Foliage/FT_Bush
cfa set_asset_property --asset-path /Game/Foliage/FT_Bush --property-path AlignToNormal --property-value truescatter_foliagePlace foliage in a reproducible pattern (the brush, without the brush)
Places foliage using the engine's own painting pipeline, with pattern generation in place of a mouse stroke. For each point it calls AInstancedFoliageActor::FoliageTrace to find the ground, then FPotentialInstance::PlaceInstance, which applies the foliage type's own scale range, random yaw and pitch, Z offset, align-to-normal, ground-slope and height rules. So shaping the type with set_asset_property changes the result here, exactly as it would when painting by hand. Patterns: random (uniform in a disc), grid (lattice), radial (concentric rings), spline (along a spline actor, with optional sideways scatter). Use --seed for a reproducible layout. Points that miss the ground or fail the type's rules are reported as missed_ground and rejected_by_type_rules rather than dropped silently.
| Parameter | Type | Required | Description |
|---|---|---|---|
| foliage_type | string | Yes | Foliage type asset path from create_foliage_type |
| pattern | string | No | random, grid, radial or spline |
| center | string | No | Centre of the area as "X,Y,Z". Defaults to the origin |
| radius | float | No | Radius of the scatter area in world units |
| count | int | No | How many instances to attempt |
| spacing | float | No | Spacing in world units for the grid and spline patterns; overrides count |
| seed | int | No | Random seed so a scatter is reproducible |
| spline_actor | string | No | Spline actor label, for the spline pattern |
| spline_offset | float | No | Sideways scatter either side of the spline, in world units |
| trace_height | float | No | How far above the area to start the downward ground trace |
cfa scatter_foliage --foliage-type /Game/Foliage/FT_Bush --center 0,0,0 --radius 3000 --count 400
cfa scatter_foliage --foliage-type /Game/Foliage/FT_Grass --pattern grid --radius 2000 --spacing 150
cfa scatter_foliage --foliage-type /Game/Foliage/FT_Tree --pattern spline --spline-actor Road_Spline --spline-offset 400 --spacing 300clear_foliage_instancesRemove placed foliage instances, keeping the types
Removes instances while leaving the foliage types in the palette. This is deliberately separate from remove_foliage_type because the engine's own AddInstances counterpart, RemoveAllInstances, actually deletes the TYPE and destroys its components rather than clearing instances.
| Parameter | Type | Required | Description |
|---|---|---|---|
| foliage_type | string | No | Foliage type asset path. Omit to clear every type in the level |
cfa clear_foliage_instances --foliage-type /Game/Foliage/FT_Bush
cfa clear_foliage_instancesremove_foliage_typeRemove a foliage type from the level entirely
Deletes the type from the level's foliage actors, destroying its instances and render components. Requires an explicit type, there is no remove-everything form, because this is destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
| foliage_type | string | Yes | Foliage type asset path to remove |
cfa remove_foliage_type --foliage-type /Game/Foliage/FT_Bushget_foliage_infoList foliage types in the level with instance counts
Reads the authoritative editor-side instance data rather than the render component, so counts are correct even while the instance tree is still rebuilding and for actor-based foliage that has no render component at all.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring matched against the foliage type path |
| max_results | int | No | Maximum types to return |
cfa get_foliage_infovalidate_foliageVerify placed foliage is actually going to render
Checks each foliage type has a source mesh, has instances, and that the render component's instance count matches the editor data, a mismatch means the instance tree is still rebuilding, which is the difference between 'the data is right' and 'the player sees it'. Returns verdict pass / pass_with_warnings / fail plus an issues list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| foliage_type | string | No | Foliage type asset path. Omit to check every type |
cfa validate_foliage
cfa validate_foliage --foliage-type /Game/Foliage/FT_Bushlist_editor_modesList the editor modes this build registers, and which is active
Enumerates editor modes from FEditorModeRegistry rather than a hardcoded table, so modes added by plugins show up too. Typical ids are EM_Default (Selection), EM_Landscape, EM_Foliage, EM_MeshPaint, EM_Modeling, EM_Fracture, EM_Bsp, EM_AnimationEditMode and EM_PCGEditorMode. Hidden modes are excluded unless --include-hidden.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring matched against the mode id or display name |
| include_hidden | bool | No | Include modes the editor hides from the toolbar |
cfa list_editor_modes
cfa list_editor_modes --filter Foliageset_editor_modeSwitch the level editor to a mode by id
Activates an editor mode (FEditorModeTools::ActivateMode). Note you do NOT need this to author anything: foliage placement, landscape edits and spline edits all go through data APIs that work in any mode, and the interactive brushes (FEdModeFoliage, FEdModeLandscape) live in Private/ and are unreachable anyway. Use this to leave the editor on the right tab for a human to inspect or continue by hand. An unknown id lists the closest matches instead of failing blindly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mode_id | string | Yes | Mode id from list_editor_modes, e.g. EM_Foliage |
cfa set_editor_mode --mode-id EM_Foliage
cfa set_editor_mode --mode-id EM_Defaultapply_terrain_processRun one geomorphic process over an existing landscape
glacial: a shallow-ice simulation. Ice accumulates above an equilibrium line, flows under its own weight, and abrades the bed in proportion to how fast it slides. That coupling is what produces U-shaped cross sections, cirques and overdeepened basins -- shapes no amount of river erosion can make, because a river cuts at a point and a glacier cuts across its whole width. snow: lying snow with avalanching off steep faces and wind scouring the windward side into the lee. Written to the 'snow' mask, not the heightfield, so later erosion still cuts rock. coastal: a wave-cut bench at the waterline with the bluff standing behind it. stratify: tilted sedimentary bedding with alternating hard and soft beds. The tilt matters -- flat bedding gives every hill the same contour rings, which reads as a terrace filter rather than exposed geology.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| process | string | Yes | glacial, snow, coastal or stratify |
| equilibrium_line_altitude | float | No | glacial: height above which snow accumulates; the master control for where glaciers form |
| mass_balance_gradient | float | No | glacial: ice gained per world unit above the line; real alpine values are 0.005-0.01 |
| flow_rate | float | No | glacial: how far ice spreads for a given thickness; larger gives longer valley glaciers |
| glacial_erodibility | float | No | glacial: bed cut per unit of sliding; scales the result without changing its shape |
| cirque_strength | float | No | glacial: headwall retreat that opens a bowl at the valley head; 0 disables cirques |
| iterations | int | No | glacial: erosion steps (default 120) |
| snow_line | float | No | snow: height above which snow lies |
| depth_gradient | float | No | snow: extra depth per world unit above the snow line |
| repose_angle_degrees | float | No | snow: steepest slope snow sits on before avalanching |
| wind_direction_degrees | float | No | snow: wind bearing; scours the windward face and loads the lee |
| wind_strength | float | No | snow: 0 leaves an even blanket, which reads as artificial |
| sea_level | float | No | coastal: water height in world units |
| bench_width | float | No | coastal: width of the wave-cut bench |
| bluff_angle_degrees | float | No | coastal: angle of the bluff behind the bench |
| bed_thickness | float | No | stratify: thickness of one sedimentary bed |
| strength | float | No | stratify: how hard beds are snapped to, 0-1 |
| tilt_degrees | float | No | stratify: bedding tilt; flat bedding looks like a terrace filter |
| tilt_direction_degrees | float | No | stratify: direction the beds dip towards |
cfa apply_terrain_process --process glacial --equilibrium-line-altitude 3200
cfa apply_terrain_process --process snow --snow-line 2600 --wind-direction-degrees 240
cfa apply_terrain_process --process coastal --sea-level 200 --bench-width 1500
cfa apply_terrain_process --process stratify --bed-thickness 180 --tilt-degrees 6regenerate_terrain_regionRegenerate one region of a landscape and merge it seamlessly
Generates fresh terrain inside a region and marries it to what is already around it. poisson (default) solves for a surface whose SLOPES are the new terrain's but whose edge heights are exactly the old terrain's, so the join is continuous by construction rather than faded: no ramp, no flattened rim, which are the two ways a crossfade gives itself away. poisson_mixed additionally keeps whichever side has the stronger local slope at each cell, so ridges and channels running in from outside continue through the patch instead of stopping at its edge. feather is a plain crossfade, honest but flattening. replace is a hard edge. The patch is generated across the whole world grid and then mean-matched to the region it replaces, so its noise lines up and it does not sit as a dome or a bowl inside the seam. Reports the seam step before and after, so the join is measured rather than assumed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Landscape actor label (omit if there is only one) |
| center | string | Yes | Region centre "X,Y" in WORLD units |
| radius | float | Yes | Region radius in world units |
| blend | string | No | poisson, poisson_mixed, feather or replace |
| seed | int | No | Random seed for the patch |
| amplitude | float | No | Peak-to-trough height of the new terrain before erosion |
| sharpness | float | No | 0 rolling hills, 1 sharp ridged crests |
| warp | float | No | How much ridgelines meander |
| feature_scale | float | No | Largest feature wavelength in vertices |
| erosion | float | No | Hydraulic droplets per vertex; 0 skips erosion |
| talus_angle | float | No | Thermal talus angle in degrees |
| thermal_iterations | int | No | Thermal passes |
| falloff_width | float | No | Transition band in world units |
cfa regenerate_terrain_region --center "25000,25000" --radius 8000 --seed 7
cfa regenerate_terrain_region --center "25000,25000" --radius 8000 --blend poisson_mixed --amplitude 6000
cfa regenerate_terrain_region --center "12000,30000" --radius 5000 --blend feather --falloff-width 3000get_world_partition_infoReport a World Partition level's grids, data layers and loaded actor counts
Reports streaming on/off, the runtime grids with their cell size and loading range, the data layer count, and how many actors exist versus how many are loaded right now. Refuses with an explanation on a non-partitioned level, where every actor is always loaded anyway.
cfa get_world_partition_infolist_world_partition_actorsList every actor in a partitioned level without loading it
Reads the actor descriptions rather than the loaded actors, so it sees actors that streaming has unloaded and that find_actors therefore cannot. Reports label, class, bounds, whether the actor is spatially loaded, its data layers, and whether it is in memory right now. This is how you find an actor that seems to have vanished after reopening a partitioned map.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the actor label or name |
| class_path | string | No | Class filter: full path (/Script/Water.WaterBodyRiver) or short name (WaterBodyRiver); matches subclasses |
| region | string | No | World-space box "MinX,MinY,MinZ,MaxX,MaxY,MaxZ" to intersect |
| loaded_only | bool | No | Only report actors currently loaded in the editor |
| max_results | int | No | Maximum actors to return; truncation is always reported |
cfa list_world_partition_actors --class-path WaterBodyRiver
cfa list_world_partition_actors --filter River --loaded-onlyload_world_partition_regionLoad a region of a partitioned level so its actors can be edited
Loads a box or sphere of the world into the editor. Loading is asynchronous, so poll with list_world_partition_actors --loaded-only. Name the region so it can be released again.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | No | World-space box "MinX,MinY,MinZ,MaxX,MaxY,MaxZ" |
| center | string | No | Sphere centre "X,Y,Z", used with radius |
| radius | float | No | Sphere radius in world units, used with center |
| name | string | No | Name for the region so it can be unloaded again (default CFA_Region) |
cfa load_world_partition_region --center "12000,12000,0" --radius 20000unload_world_partition_regionRelease a region loaded by load_world_partition_region
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Region name; omit to release every region this tool loaded |
cfa unload_world_partition_region --name Valleypin_world_partition_actorsKeep matched actors loaded regardless of camera position
Requires a filter and/or a class, because pinning everything would load the whole map. Pass --unpin to release them back to normal streaming.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the actor label or name |
| class_path | string | No | Class filter: full path or short name; matches subclasses |
| unpin | bool | No | Release instead of pin |
| max_results | int | No | Maximum actors to pin in one call |
cfa pin_world_partition_actors --class-path WaterBodyRiverset_actor_spatially_loadedSet whether an actor streams with the grid or is always loaded
A water zone ships always-loaded and a water body does not, which is why a river vanishes from the outliner when a partitioned map is reopened. Right for a small always-relevant actor, wrong for anything numerous.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor label or name |
| spatially_loaded | bool | No | False keeps the actor always loaded |
cfa set_actor_spatially_loaded --actor-label Landscape_River --spatially-loaded=falsecreate_data_layerCreate a data layer asset and an instance of it in this world
A Runtime layer can be streamed in and out during play. An Editor layer only organises the editor and is stripped from a cook, so it can never have a runtime state.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path for the data layer asset |
| layer_type | string | No | Runtime or Editor |
| debug_color | string | No | Debug colour "R,G,B" 0-1 shown in the Data Layers outliner |
| supports_actor_filters | bool | No | Allow actors to filter on this layer |
| parent | string | No | Parent data layer instance name, so this one nests under it |
cfa create_data_layer --asset-path /Game/DataLayers/DL_Vegetation --layer-type Runtime
cfa create_data_layer --asset-path /Game/DataLayers/DL_Blockout --layer-type Editor --debug-color "0.9,0.4,0.1"list_data_layersList data layers with type, parent, state and actor counts
Membership is counted from the actor descriptions, so unloaded actors still count.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the layer name |
cfa list_data_layersassign_actors_to_data_layerAdd or remove matched actors to a data layer
Goes through the editor subsystem so the actor and the world data layers actor stay in agreement. Only LOADED actors can be assigned; load_world_partition_region first if needed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| data_layer | string | Yes | Layer instance name or the asset path it was created with |
| filter | string | No | Case-insensitive substring matched against the actor label or name |
| class_path | string | No | Class filter: full path or short name; matches subclasses |
| remove | bool | No | Remove from the layer instead of adding |
| max_results | int | No | Maximum actors to touch in one call |
cfa assign_actors_to_data_layer --data-layer DL_Vegetation --class-path InstancedFoliageActorset_data_layer_stateSet a data layer's editor visibility, editor loading and initial runtime state
Asking for a runtime state on an Editor layer is refused, because such a layer is stripped from a cook and can never have one.
| Parameter | Type | Required | Description |
|---|---|---|---|
| data_layer | string | Yes | Layer instance name or asset path |
| visible | string | No | Editor visibility; omit to leave unchanged |
| loaded_in_editor | string | No | Whether the layer's actors load in the editor; omit to leave unchanged |
| initial_runtime_state | string | No | Runtime layers only: Unloaded, Loaded or Activated |
cfa set_data_layer_state --data-layer DL_Vegetation --initial-runtime-state Activated
cfa set_data_layer_state --data-layer DL_Blockout --visible falseremove_data_layerRemove a data layer instance from this world
The data layer asset itself is left alone.
| Parameter | Type | Required | Description |
|---|---|---|---|
| data_layer | string | Yes | Layer instance name or asset path |
cfa remove_data_layer --data-layer DL_Vegetationcreate_hlod_layerCreate an HLOD layer asset
Layer types: Instancing, MeshMerge, MeshSimplify, MeshApproximate, Custom, and CustomHLODActor on 5.7+. The parent chain is what produces more than one HLOD level. An unknown type is refused with the list this engine actually offers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path for the HLOD layer asset |
| layer_type | string | No | Instancing, MeshMerge, MeshSimplify, MeshApproximate, Custom, CustomHLODActor (5.7+) |
| cell_size | int | No | Cell size of the grid its HLOD actors live on; 0 keeps the default |
| loading_range | float | No | Loading range of that grid; 0 keeps the default |
| spatially_loaded | bool | No | Whether the generated HLOD actors stream |
| parent_layer | string | No | Parent HLOD layer asset path, for a multi-level chain |
cfa create_hlod_layer --asset-path /Game/HLOD/HLOD_Instanced --layer-type Instancing
cfa create_hlod_layer --asset-path /Game/HLOD/HLOD_Far --layer-type MeshMerge --cell-size 25600 --parent-layer /Game/HLOD/HLOD_Instancedlist_hlod_layersList HLOD layer assets with type, cell size, loading range and parent
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the layer name |
cfa list_hlod_layersset_actor_hlod_layerAssign an HLOD layer to matched actors, or clear the override
Actors with no HLODLayer property are reported as unchanged rather than silently skipped.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the actor label or name |
| class_path | string | No | Class filter: full path or short name; matches subclasses |
| hlod_layer | string | No | HLOD layer asset path; empty clears the override |
| max_results | int | No | Maximum actors to touch in one call |
cfa set_actor_hlod_layer --class-path StaticMeshActor --hlod-layer /Game/HLOD/HLOD_Instancedbuild_world_partitionRun a World Partition builder (hlod, minimap, navigation, foliage...)
Builders: hlod, minimap, navigation, foliage, spline_meshes, static_lighting, rvt, and landscape on 5.7+. These run for minutes to hours and block the editor, so WITHOUT --confirm this only reports what the builder does and how long it is likely to take. Ask the user whether to run it here or leave it to them, then re-run with --confirm.
| Parameter | Type | Required | Description |
|---|---|---|---|
| builder | string | Yes | hlod, minimap, navigation, foliage, spline_meshes, static_lighting, rvt, landscape (5.7+) |
| confirm | bool | No | Actually run it; without this only the estimate is reported |
cfa build_world_partition --builder hlod
cfa build_world_partition --builder minimap --confirmset_world_partition_settingsSet any editable UWorldPartition property by reflection
Whatever this engine version exposes works; anything it does not is named along with the list of what is available. Covers streaming enable, server streaming modes, the data layers logic operator and the HLOD flags.
| Parameter | Type | Required | Description |
|---|---|---|---|
| property | string | Yes | Property name on the UWorldPartition |
| value | string | Yes | Value, parsed against the property's own reflected type |
cfa set_world_partition_settings --property bEnableStreaming --value trueset_runtime_gridAdd, edit or remove a named runtime grid
Refuses with an explanation when the world uses a runtime hash that has no named grids.
| Parameter | Type | Required | Description |
|---|---|---|---|
| grid_name | string | Yes | Grid name; a new name adds, an existing one edits |
| cell_size | int | No | Cell size in world units; 0 leaves unchanged |
| loading_range | float | No | Loading range in world units; 0 leaves unchanged |
| priority | int | No | Priority when grids overlap |
| remove | bool | No | Remove the grid instead |
cfa set_runtime_grid --grid-name Buildings --cell-size 25600 --loading-range 51200set_actor_runtime_gridPut matched actors onto a named runtime grid
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Case-insensitive substring matched against the actor label or name |
| class_path | string | No | Class filter: full path or short name; matches subclasses |
| grid_name | string | Yes | Grid name; empty puts actors back on the default grid |
| max_results | int | No | Maximum actors to touch in one call |
cfa set_actor_runtime_grid --class-path StaticMeshActor --grid-name Buildingsvalidate_world_partitionCheck a partitioned world is actually partitioned
Streaming enabled, actors that genuinely stream, and runtime data layers not left unloaded in the editor where any edit would miss their actors. Returns verdict pass/pass_with_warnings/fail.
cfa validate_world_partition