Ashenfall: Living World
What if Ashenfall didn't wait for you? Dragons leave evidence, regions react to how you hunt, and the world runs its own events whether you're watching or not — scattered clues build into a trail, the trail can escalate into a full world event, and the aftermath sticks around.
What it does
🔍 Evidence & investigation — scorched ground, disturbed tracks, dropped scales, and distant roars appear as an unseen dragon moves through the region. Evidence accumulates into a trail rather than a single marker.
🦌 Living wildlife — a territory hit by a world event goes quiet afterward — evidence and activity there thin out for a while, the way a spooked region would, before recovering.
🐉 World events — five types (Dragon Migration, Superstorm, Ancient Awakening, Wildfire, Rare Migration), each running a warning → active → resolved arc rather than a flat notification. Weighted odds are fully configurable.
🗺️ Dragon territories — evidence accumulates per-territory across three regions. Enough of it opens up a trackable hunt instead of a flat quest marker.
⚔️ Dragon hunts & trophies — track a dragon into a time-limited encounter, defeat it, and walk away with weighted trophy drops (scale, fang, bone, heart, eye). Miss the encounter window and the dragon gets away — no guaranteed kill.
🏹 Player impact — heavy hunting in one region temporarily suppresses wildlife activity there, then recovers after a cooldown.
🏆 Hunter's Lodge — collect enough trophies and unlock a permanent Lodge display of your hunting record.
🎖️ Milestones — six tracked, from your first trophy to becoming Warden of Ashenfall, with on-screen announcements and progress saved between sessions.
📖 Codex — every event, evidence find, and completed hunt is logged, with trophies tallied and progress saved between sessions.
🧪 Debug/testing commands — trigger evidence, trigger any event by name, record kills, inspect state, and reset — all from the console, so you can preview the whole system without waiting out real timers.
⚠️ One-time setup required
This mod's class names are matched against your game build via UE4SS, since Ashenfall doesn't publish a Blueprint SDK. On first launch, check UE4SS.log — it'll tell you plainly which systems are already active and which need a 2-minute GenerateSDK step (fully walked through in the README) to switch on. Nothing crashes either way; unset systems just quietly wait for their class name.
Requirements
UE4SS (matched to your Dragonwilds build) must be installed first. See the README in the download for step-by-step install and configuration instructions.
Configuration
All timings, escalation chances, hunting thresholds, event weights, and hook targets are editable in scripts/config.lua — no coding required.
Notes
This mod works entirely through the game's existing systems (Lua scripting via UE4SS) and adds no new meshes or textures. It's submitted under the UE4SS Mods class, tagged Gameplay, Creatures & Wildlife, and World Generation.
Readme contents
Setup
Three steps: install UE4SS, install the mod, then configure its hooks.
Do them in order — the hook step needs the game running at least once.
1. Requirements
RuneScape: Dragonwilds 1.0
UE4SS, matched to your Dragonwilds build
2. Install UE4SS + the mod
Install UE4SS if you haven't (CurseForge → RuneScape: Dragonwilds →
Discover → any UE4SS mod → Install sets it up, or see
blog.curseforge.com/how-to-mod-runescape-dragonwilds).
Locate your UE4SS mods folder:
...\RSDragonwilds\RSDragonwilds\Binaries\Win64\ue4ss\Mods\
Copy this package's AshenfallLivingWorld folder into that directory.
Result:
...\ue4ss\Mods\AshenfallLivingWorld\Scripts\main.lua
...\ue4ss\Mods\AshenfallLivingWorld\enabled.txt
Launch the game.
At this point the mod is running — ALW.ShowState in the UE4SS console
should already work (see "Test it" below). But its in-world systems
(dragon visuals, FX, item rewards) are still inactive until step 3.
3. Configure the game-specific hooks (~2 minutes, once)
Ashenfall doesn't publish a Blueprint SDK, so this mod's game-facing
systems are matched against your specific game build rather than
hardcoded, the same way the game's other class-name-dependent mods work.
On first launch, check ue4ss/UE4SS.log (or the console output) — it
prints a clear ACTIVE / WAITING line for each system:
[ALW] ---- Hook status ----
[ALW] PlayerPawnClass WAITING (blank in config.lua)
[ALW] CreatureBaseClass WAITING (blank in config.lua)
[ALW] CreatureDeathFunction WAITING (blank in config.lua)
[ALW] EvidenceFXClass WAITING (blank in config.lua)
[ALW] NotificationWidgetClass WAITING (blank in config.lua)
[ALW] DragonActorClass WAITING (blank in config.lua)
[ALW] GiveItemFunction WAITING (blank in config.lua)
[ALW] LodgeDisplayFunction WAITING (blank in config.lua)
Nothing crashes either way. A WAITING system just keeps tracking phase
and logging to console — evidence trails, event escalation, region
cooldowns, hunts, trophies, milestones, and the debug commands all work
regardless. Only the in-world visuals (FX spawn, HUD toasts, auto-detected
kills, spawning the actual dragon, granting real items, placing the Lodge
display) depend on the class names.
To fill them in:
With the game running, open the UE4SS console (UE4SS prints the
actual key bind to its own log on startup), and run GenerateSDK
(or DumpAllObjects if that's unavailable in your build).
Open the dump and find: the player pawn/character class, the base
creature/wildlife class, its death/kill function, a decal or particle
FX class already used for ground effects, the HUD notification/toast
widget class, the dragon actor class itself, the function used to
grant items to the player (for trophy rewards), and (optional) a way
to place a static display object for the Lodge.
Paste those into scripts/config.lua's HookTargets table (plain
strings, no coding — see the comments above each field for the exact
format expected). Everything else in config.lua — timings, chances,
thresholds — is also freely editable, no coding required.
Restart the game. The hook-status report should now show ACTIVE for
whichever entries you filled in correctly.
Test it
Open the UE4SS console.
ALW.ShowState — should print phase=IDLE event=nil evidence=0.
ALW.TriggerEvidence emberfall_ridge four times — territory evidence
climbs, and after the 3rd a "Hunt available" line appears.
ALW.ShowTerritory emberfall_ridge to check.
ALW.StartHunt emberfall_ridge — phase goes to ENCOUNTER.
ALW.DefeatDragon emberfall_ridge — should log a defeat, award two
weighted trophies, and reset that territory's evidence to 0.
ALW.ShowCodex to see the trophy tally and hunt count.
Repeat evidence → hunt → defeat in moss_hollow and shattered_coast
— should trigger the "Territorial" milestone. Keep going until total
trophies hit 5 — should trigger "Warden of Ashenfall" and unlock the
Lodge. ALW.ShowLodge and ALW.ShowMilestones to check.
ALW.TriggerEvent Superstorm — WARNING → (~60s) ACTIVE, at which
point ALW.ShowTerritory <the territory it picked> should show
suppressed=true. RESOLVED (~5 more min) fires the "Storm Chaser"
milestone. Shrink PulseIntervalSeconds etc. in config.lua for
faster testing.
ALW.RecordKill some_region six times (matches HeavyHuntingThreshold)
— should log the region entering cooldown.
Save and reload. ALW.ShowState / ALW.ShowCodex again should match
pre-reload state (proves JSON persistence in alw_state.json).
Anything fail? Check ue4ss/UE4SS.log for [ALW] lines and send
them over.

