Dynamic Leveled Lists Wiki
An SKSE plugin that merges leveled list records (LVLI) from all mods at runtime. When multiple mods edit the same leveled list, Skyrim's last-loaded-wins rule discards changes from all but the final override. Dynamic Leveled Lists merges the lost items back in automatically, and respects intentional removals.
Quick Start: Install via your mod manager and launch the game. The plugin runs automatically on data load. Check Data/SKSE/Plugins/DynamicLeveledLists.log to see what was merged.
The Problem
Skyrim uses a "last writer wins" rule for records. If three mods edit the same leveled list (e.g. LItemWeaponGreatSword), only the last mod in your load order keeps its changes. Items added by the other mods are silently lost. This affects loot tables, vendor inventories, encounter zones, and anything else driven by leveled lists.
This is why compatibility patches exist for nearly every weapon/armor mod. Without them, half of the items you installed never actually drop.
The Solution
Dynamic Leveled Lists reads the original leveled list definition from every plugin that touches it, computes what each "loser" mod added or removed, and merges those deltas into the winning record at runtime. The result is the same as if you had built a manual patch, but fully automatic.
How It Works
- Fires on
kDataLoaded, runs once before the main menu - Scans every
LVLI(leveled item) form for multi-source conflicts (3+ plugins touching the same record) - Parses each plugin's LVLI subrecords directly from disk to reconstruct what each mod intended
- Computes per-mod deltas against the base record using multiplicity-based diffing
- Largest addition/removal wins across losers (no data lost from load order)
- Intentional removals override additions (a mod that deliberately removes an item wins)
- Applies merged deltas to the winning record in memory
Key Features
Overflow Sublists (255 Entry Limit)
Skyrim's engine stores the entry count for leveled lists as a single byte, limiting each list to 255 entries. When many mods add items to popular lists like LItemWeaponGreatSword, the merged result can easily exceed this limit.
Dynamic Leveled Lists solves this by creating overflow sublists at runtime. The engine natively supports nested leveled lists (a leveled list containing other leveled lists), so excess entries are distributed into sublists that the engine resolves recursively. No existing Skyrim mod does this.
UseAll Lists
When a list has the UseAll flag (every entry produces an item), direct entries are kept in the parent and overflow entries go into sublists with the same flag. Every item still appears.
Random Pick Lists
When a list picks one random entry, all entries are distributed evenly across sublists. The engine picks one sublist, then the sublist picks one item. Equal probability is preserved.
Circular Reference Breaking
Leveled lists can reference other leveled lists (nested lists). If the merge creates a circular reference where List A contains List B and List B contains List A, the engine follows the cycle infinitely when resolving loot, causing a crash. This is rare (two unrelated mods would have to independently create both halves of the cycle), but it's a real risk with automatic merging.
After all merges complete, Dynamic Leveled Lists builds a directed graph of every leveled list reference and runs cycle detection across the entire graph. When a circular reference is found, the plugin breaks the cycle at runtime by removing the back-edge entry from the parent list. This is an in-memory change only. Your plugin files on disk are never modified.
Each broken cycle is logged with the full path, the entry that was removed, and instructions for creating a permanent fix in xEdit:
Circular leveled list reference detected: 00035319 -> 000A1234 -> 00035319 Broke circular reference: removed SomeSublist [LVLI:000A1234] from MainList [LVLI:00035319] To permanently fix: open MyMod.esp in xEdit, find MainList [LVLI:00035319], and remove the entry pointing to SomeSublist [LVLI:000A1234]
Always logged: Cycle warnings are always written to the log with readable names regardless of the enablelogs setting, since they indicate crash risk.
Duplicate Weighting
Some mods use duplicate entries to weight drop probabilities. For example, an Iron Bow appearing 3 times in a list gives it 3x the drop chance. Dynamic Leveled Lists tracks multiplicity (how many times an identical entry appears) and preserves it correctly during merges. If Mod A adds 3 copies and Mod B adds 2 copies of the same item, the larger count (3) wins.
INI Settings
Configuration is at Data/SKSE/Plugins/DynamicLeveledLists.ini. If the file doesn't exist, it will be auto-generated with defaults on first launch.
[General] ;Enable detailed merge logging (true/false) enablelogs = false
Settings Reference
enablelogs
Default: false
When enabled, logs every individual item added, removed, or skipped per leveled list with form type tags, a final state snapshot, and an aggregate summary of most frequently added items. Useful for debugging but adds startup time due to EditorID lookup.
Reading the Log
The log at Data/SKSE/Plugins/DynamicLeveledLists.log always shows a summary:
=== DynamicLeveledLists: Merge complete === Total leveled lists: 4821 With overrides (base + winner only): 312 With conflicts (3+ sources): 87 Actually merged: 41 Total entries added: 156 Total entries removed: 12 Overflow sublists created: 3 Circular references broken: 1
The cycle line always appears: "No circular references detected" when clean, or "Circular references broken: N" when cycles were found. Each cycle is logged individually with the full path, and the entry that was removed to break it:
Circular leveled list reference detected: 00035319 -> 000A1234 -> 00035319 Broke circular reference: removed SomeSublist [LVLI:000A1234] from MainList [LVLI:00035319] To permanently fix: open MyMod.esp in xEdit, find MainList [LVLI:00035319], and remove the entry pointing to SomeSublist [LVLI:000A1234]
With enablelogs=true, each merged list also gets detailed output:
LItemWeaponGreatSword [LVLI:00035319]
Sources: Skyrim.esm, ImmersiveWeapons.esp, HeavyArmory.esp
-- Changes --
+ [WEAP] GreatSwordOfMight x1 @lvl1 [0A012345] (1x, added by ImmersiveWeapons.esp)
+ [WEAP] SteelClaymore x1 @lvl6 [0B023456] (2x, added by ImmersiveWeapons.esp)
-- Carried forward --
. [WEAP] NordicGreatsword x1 @lvl12 [0B034567] (1x)
Result: +3 added, -0 removed
-- Final state --
* [WEAP] IronGreatsword x1 @lvl1 [00012EB7]
* [WEAP] GreatSwordOfMight x1 @lvl1 [0A012345]
* [WEAP] SteelClaymore x1 @lvl6 [0B023456]
* [WEAP] NordicGreatsword x1 @lvl12 [0B034567]
(4 entries total)
At the end of the merge, an aggregate summary shows the most frequently added items:
=== Most frequently added items (top 15) === [WEAP] SteelClaymore [0B023456] - added to 12 leveled lists (from ImmersiveWeapons.esp) [ARMO] NordicShield [0B034568] - added to 8 leveled lists (from HeavyArmory.esp)
Performance note: Detailed logging requires scanning every loaded mod's LVLI records from disk to build an EditorID cache. This adds noticeable startup time. Keep enablelogs=false for normal play.
Compatibility
- Open World Loot / Morrowloot Ultimate: Fully supported. Their intentional removals are respected even if another mod adds the same item back
- Wrye Bash / Mator Smash: Works alongside them. They handle it at build time, this handles it at runtime for anything they miss. Keeping existing patches won't cause issues
- Dynamic Container Loot: Companion mod. DCL handles container records (CONT), this handles leveled list records (LVLI). They work on completely different record types and do not interfere
- SPID / KID / CLLF: Fully compatible. These distribute items through scripts, not LVLI record edits
- Any load order: Reads plugin data non-destructively. No conflicts with other SKSE plugins
Requirements
- Skyrim SE (1.5.97+), AE (1.6.x), or VR
- SKSE64 (matching your game version)
- Address Library for SKSE Plugins
Link to This Page
Copy a link to share this wiki from your Nexus description or documentation:
