World and maps¶
All · 10 min · No code
Problems with maps, terrain, surfaces, pack content and the things you place in a level. For the model behind them, read Interaction, NPCs and dialogue and the map recipes, including Give a map its music.
Footsteps sound like concrete on grass¶
Fails silently
The footstep system works; the ground simply never says it is grass.
Why: footstep sounds and effects are picked by the surface type under the foot, through
Lyra's context effects (ContextEffects/CFX_XenoCore). A landscape with no physical material
reports the default surface, and the default surface is mapped to concrete. Unless the landscape's
material has a physical material output per layer, the landscape's only surface comes from its
Default Phys Material.
Fix:
- Select the landscape in your map and set Default Phys Material to
Environment/PM_XenoCore_Grass, or your own physical material. - For a new surface: add it under Project Settings › Physics › Physical Surface, map it to a
SurfaceType.*tag in Project Settings › Game › LyraContextEffects › Surface Type to Context Map, create a physical material that uses it, and add rows for that tag toCFX_XenoCore.
Every new map's landscape needs step 1, or it sounds like concrete again.
Avoid it next time: Footsteps per surface.
Pack assets are missing when the project is opened on another machine¶
Fails silently
Your own machine shows everything, because the files are on your disk.
Why: pack folders under Content/ (Megascans, Custom, FX, MSPresets, Meshes, PCG,
PhysicalMaterials, SmartAssets, Landscape) are usually listed in the project's .gitignore,
so a whole pack cannot be committed by accident. Anything you place from an ignored folder then
stays on your disk only, and a teammate's clone shows a hole where it should be.
Fix: for each pack asset your maps use, add it and everything it depends on to source control explicitly. Right-click the map, open Reference Viewer or Size Map to see the dependency list, and add those files. Keep textures and meshes at the sizes your game needs before the first push; a full-size commit stays in history forever.
Avoid it next time: Use Megascans and pack assets.
A ridge or cliff edge casts no shadow onto the plain below¶
Why: from the sun's side, the far wall of terrain that ends at the world edge faces away from the light. Shadows skip back faces, so the wall casts nothing unless its material is two-sided. Setting shadow options on the landscape components does not help: Nanite reads the material.
Fix: tick Two Sided on the landscape material.
Test shadow settings from startup, not by toggling them
Changing any shadow setting while the editor runs resets the shadow cache and can hide the fault you are testing. Set the value, restart, then look.
Avoid it next time: Build a World Partition map.
A map plays no music, or the music stops as you walk¶
Fails silently
Nothing is logged when a map has no music actor, and a streamed-out one simply goes quiet.
Why: a map's music comes from one placed XenoCore Area Music actor. Three things stop it:
- The map has no such actor, or its Field Music is empty and no fallback is set. An empty slot plays Project Settings › Game › XenoCore Content › Startup › Fallback Field Music (or Fallback Battle Music); with those empty too, it is silence by design. The shipped Gaur Plain leaves its slots empty, because the sample tracks are not licensed to ship.
- In a World Partition map, someone turned Is Spatially Loaded on for the actor (it is off by default), so it streams out with its cell when the player walks far enough away.
- Two of them are in the map, and both play.
When an Area Music actor starts, the Output Log prints one line naming both tracks:
AreaMusic <name>: field=<track> (x<volume>), battle=<track> (x<volume>).
Fix: keep exactly one Area Music actor per map, set its Field Music (Music › Field) or the project's fallback tracks, and make sure Is Spatially Loaded is off on it.
Fights much louder or quieter than exploring, or the Music slider does nothing
The first is a volume mismatch between the two tracks: match Field Volume and
Battle Volume by loudness. The second means the tracks are not on Lyra's
Audio/Classes/Music sound class.
Avoid it next time: Give a map its music.
My new actor never shows an interaction prompt¶
Why: the interaction prompt only knows about XenoCore interactables: NPCs, chests, party
members and children of XenoCoreInteractableActor. Lyra's own interaction system
does not drive the prompt, so an actor set up only for Lyra's interaction is ignored. For an actor
that does qualify, the usual causes are: Interact Enabled is off on that placed instance; its
Can Interact returns false; the player is not within Interact Range of the actor's
origin (range is measured from the root, not from the mesh); or a nearer interactable is
taking the prompt.
Fix: make your actor a Blueprint whose parent class is XenoCoreInteractableActor (a door,
lever or sign), or a child Blueprint of Characters/NPC/B_XenoCore_Npc (a person) or
Inventory/Loot/BP_XenoCore_TreasureChest (a chest). Each signs itself up. Then check the four
causes above.
Avoid it next time: Add an interactable object.
An NPC's third action never appears on its prompt¶
Why: only A and X have interact inputs (IA_XenoCore_Interact, IA_XenoCore_InteractSecondary),
so XenoCore offers at most two verbs per actor: the Interact Verb, then the
first extra one. Everything after that is dropped from the prompt and from the press alike. An NPC
with Trade Offers already has Trade on X, so none of its Extra Interact Verbs shows. The
Output Log says so once per actor (LogXenoInteract: "offers 3 verbs but only 2 interact inputs
exist (A, X) - dropping ...").
Fix: offer at most two actions. Put a third choice inside the conversation instead (a branch
after Show Dialogue). A real third button needs a new input action, a new interact-press
ability, and a programmer (the two-verb limit, MaxPressableVerbs, is fixed in C++).
Avoid it next time: Branch a conversation.
The speech box height can't be changed, or a warning names the dialogue anchor¶
Why: the dialogue box is carried by an actor the game spawns, and its settings, such as the box
height above the speaker's head, live on Characters/NPC/BP_XenoCore_DialogueAnchor. If that
Blueprint is moved, renamed or deleted, the game falls back to the C++ class, logs a warning, and
the settings are no longer editable.
Fix: keep BP_XenoCore_DialogueAnchor at its path, and change its Class Defaults to tune
the box.
Avoid it next time: Write an NPC conversation.
A conversation closes on its own after 2 seconds, with a warning¶
Why: the NPC's On Interact graph shows lines with Show Dialogue and one of its branches
ends without Close Dialogue. With no line waiting for A, nothing could ever move the
conversation on, so XenoCore closes it after 2 seconds and logs a LogXenoDialogue
warning naming the NPC: "conversation with ... was left open with no line waiting - closing it."
The same happens if the graph waits more than 2 seconds between two lines (a long Delay): the
box closes, and the next line opens it again.
Fix: end every branch with Close Dialogue (XenoCore › Dialogue). Keep pauses between lines under 2 seconds.
Avoid it next time: Branch a conversation.
A new NPC offers the sample quest or says the sample lines¶
Why: you placed, or made a child of, Characters/NPC/B_XenoCore_Npc_Sample, which carries the
sample conversation and the sample quest. The plain Characters/NPC/B_XenoCore_Npc starts blank.
Fix: clear Quest and Dialogue on the placed NPC, or place B_XenoCore_Npc instead.
Avoid it next time: Give an NPC a conversation.
A chest the player emptied is full again after loading a save¶
Fails silently
Nothing is logged: the save simply has no record that matches the chest.
Why: a hand-placed chest's saved state (emptied, or holding leftovers) is keyed by the chest actor's name in the level. Renaming the actor, deleting and re-placing it, or moving it into another level breaks the match, so older saves see a chest they know nothing about. Enemy-dropped chests are not affected; the save stores them whole.
Fix: do not rename or re-place hand-placed chests once saves exist. Settle their names before release and keep them across updates.
Avoid it next time: Loot.
A saved actor comes back with its default values¶
Fails silently
Nothing is logged unless two participants share a key.
Why: one of these, most likely first:
- The variable is not flagged SaveGame, or it is a struct whose own fields are not flagged. Only flagged properties are written.
- The actor's save key changed. A placed actor's derived key is its map plus its actor name, so deleting and re-placing it, or moving it to another map, gives it a new key, and old saves hold a record nobody claims.
- The actor is not a participant: it has no XenoCore Save Participant component, was never passed to Register Save Participant, and is not a component on the player controller, player state or game state implementing the interface.
- Its On Save Data Restored is where you apply the loaded values, and it is not implemented. The variables load; the actor just does not show them.
Fix: flag the variables, add the component, and keep keys stable. Set an explicit Save Key on anything whose name may change.
Avoid it next time: Make a system save.
Only one copy of a spawned actor keeps its saved state¶
Why: a spawned actor with no Save Key is keyed by its class, so every copy shares one key.
Only the first registered is saved. The Output Log shows XenoCoreSave: ... registered with save key
'...', already used by ... and, at each save, duplicate save participant key '...' ... it was not
saved.
Fix: give each copy its own Save Key when you spawn it (for example from an id you store).
Avoid it next time: Make a system save.
Saves made on my map show no location on the save screen¶
Fails silently
The row simply leaves the location out.
Why: a save row's location comes from Location Names in Project Settings › Game › XenoCore Save, one entry per map. A map with no entry prints nothing.
Fix: add an entry for your map with the name to show. For a region inside a large map, call Set Location Text on the save subsystem (Get Game Instance Subsystem › Xeno Core Save Subsystem) when the player enters it.
Avoid it next time: Save and front end.