SimPassiveLevelingOverhaul
Overhauls Erenshor's Sim level progression with passive XP over time.Sim Passive Leveling Overhaul — v1.4.2
Erenshor game update (2026-07-16): Supported.
Note 1.4.2 represents an update where I believe the mod is stable, heavily tested, and guarded against even the most minute possible issue that could crop up. I will keep it updated for game versions, but i'm out of ideas that fit the mods scope!
Description
This mod replaces the vanilla sim XP catchup system with a highly configurable passive XP drip that runs in the background while you play, and only while you play. No offline catch up.
The vanilla system grants simulated players most of their levels in abrupt bursts each time you log in, depending on which slot the sims are assigned to. I found this a bit immersion breaking with my playstyle: I log out frequently and only play a couple times a week.
Many values are exposed and configurable so you can tweak the leveling to your liking. The mod can be added or removed mid playthrough with no issues.
If you're starting fresh and want more of a "day one" MMO experience, I recommend pairing this with my companion mod, Sim Start At Level 1.
Features
Passive XP for All Eligible Sims
- Unassigned generic sims gain XP on the standard curve.
- Rival sims level roughly 25% faster.
- Your own character slot sims gain XP on the standard curve up to a cap of two levels above you, with a configurable catch up multiplier when behind.
- Active party members and sims tied to other character slots do not receive passive XP. They gain levels through combat or when you play those characters.
- Passive XP stacks with whatever sims earn from their own kills out in the world. Neither overwrites the other.
1–35 Leveling Curve (~110 Hours Total assuming no variance)
- Levels 2–5: 12 to 18 minutes per level
- Levels 6–10: 18 minutes to 1 hour per level
- Levels 11–15: 1 hour 6 minutes to 1 hour 36 minutes per level
- Levels 16–20: 1 hour 48 minutes to 3 hours per level
- Levels 21–25: 3 hours 30 minutes to 5 hours 6 minutes per level
- Levels 26–30: 5 hours 24 minutes to 6 hours 30 minutes per level
- Levels 31–35: 6 hours 42 minutes to 7 hours 30 minutes per level
Per-Sim Variance (Configurable, default 0.5× – 1.5×)
XP modifier from a random seed, which rerolls on zone changes. Produces organic variation across the roster.
Configuration
All settings are stored in BepInEx/config/erenshor.simxpovertime.cfg. Edit this file while the game is closed to adjust behavior.
-
TickIntervalSeconds— Default:120, minimum90, maximum3600
Interval in seconds between XP grants. The XP granted is scaled accordingly, so the leveling speed stays the same regardless of interval. Values outside the range are clamped. -
MaxLevel— Default:35, range1–35
Maximum level cap for sims. Sims will not gain passive XP beyond this level. Values outside the range are clamped. 35 is the game's own maximum, and post 35 ascension progression is left entirely to the base game. -
VarianceMin— Default:0.5
Minimum speed variance per sim. A value of0.5means the slowest sim levels at half speed. -
VarianceMax— Default:1.5
Maximum speed variance per sim. A value of1.5means the fastest sim levels at 1.5× speed. -
UseFixedSeed— Default:false
If enabled, uses a fixed seed for variance per sim. Pair it withSeedIncrementOnZoneChange = falsefor stable variance between multiple sessions. -
FixedSeedValue— Default:12345
The seed value used whenUseFixedSeedis enabled. -
SeedIncrementOnZoneChange— Default:true
If enabled rerolls variance per sim at every save point, zone changes, teleports, respawns, altar saves. Set tofalsefor stable variance throughout an entire session. -
RivalSpeedMultiplier— Default:1.25
XP speed multiplier for rival sims (Friends' Club). Set to1.0for no bonus. -
SlotCatchupPerLevel— Default:0.10
Catch up boost applied per level behind. For example, if a sim is 5 levels behind, they receive a0.5(50%) boost. -
SlotCatchupMax— Default:3.0
Upper limit for the catch up multiplier. Prevents extreme catch up boosts. -
SlotLevelCapOffset— Default:2
How many levels above the player a character tied sim can passively reach. Set to 35 to effectively disable this cap. -
[XPCurve]section:HoursForLevel2throughHoursForLevel35(bottom of the config file)
Hours of passive XP each level takes to reach, at 1.0× variance (rival and catch up multipliers still apply on top).HoursForLevel2is the climb from level 1 to 2, and so on up the ladder. The defaults produce the curve in the table above. -
DebugLogging— Default:false
Enables verbose logging for troubleshooting.
Requirements
- BepInEx 5.4.23.5
Installation
- Install BepInEx for Erenshor.
- Place
SimPassiveLevelingOverhaul.dllin yourBepInEx/plugins/folder. - Launch the game. The configuration file generates in
BepInEx/config/automatically on the first run.
Compatibility
Fifteen small Harmony patches across twelve game methods to natural event boundaries, logging in, sims spawning, sims saving, zone changes, and does all of its ongoing work in its own coroutines. What that means in practice:
-
Other mods: A conflict is only possible if another mod patches one of the methods listed below and changes what it does (skipping the original or rewriting the same fields). Mods that read sim data or touch other parts of the game will coexist fine.
-
Game updates: If an update removes or renames a patched method, the mod fails to load and logs an error. The game itself keeps running vanilla. Updates that change how sims save or load can change behavior more quietly, which is why each game patch gets checked.
-
Adding or removing mid playthrough: Safe. The mod only writes the level and XP fields of the same save files the game already uses. Delete the DLL and vanilla leveling, including the login catchup, simply resumes.
Methods Patched
-
SimPlayerMngr.Start— Postfix
Launches the mod's three coroutines: the XP tick, the background writer, and the login restore. The game recreates this manager every login, so the coroutines relaunch with it. -
SimPlayerMngr.LoadSimPlayersIntoGame— Prefix
Wipes the mod's session state clean at the start of each login. -
SimPlayerDataManager.CheckLoadData— Prefix + Postfix
The Prefix validates each sim's save file before the game reads it: a damaged file is restored from the game's own backups folder, and an unreadable (locked) file is served from backup in memory while the real file is protected for the session. The Postfix grabs a copy of each record as it goes by, providing the pre login snapshot and seeding the in memory record cache. -
SimPlayerDataManager.LoadFromFile— Postfix
Same capture for the generic sim loading path — plus the same repair. A damaged generic file used to hang the loading screen; it now restores from backup (or resets, worst case) and the login always survives. -
SimPlayer.Start— Postfix
A spawning sim gets its stats from its save file, which can lag behind the mod's tracked values. This brings the fresh spawn up to date. For a sim quarantined by an unreadable file, this is also where recovery completes: the real file is read directly, its values win, and normal service resumes. -
SimPlayer.SaveSim— Prefix + Postfix
When the game saves a spawned sim, the Postfix copies the saved XP back into tracking (the game does this for Level, but never did for XP), drops the sim's cached record, and cancels any pending background write. The Prefix snapshots the tracked level so the spawn time save the game performs (added in the July 16th patch) can't push stale file values over it. Quarantined sims recover here too, when their spawn reads the real file. -
SimPlayerDataManager.SaveSimData— Prefix + Postfix
The Prefix seals the quarantine: during login the game resaves each sim record right after reading it, and for a quarantined sim that record is the mod's in memory substitute — the write is skipped so substitute data can never reach the real file, even if the lock releases at that exact instant. The Postfix fires whenever the game writes any sim's file after login: the mod drops its cached copy of that record so a later background write can't resurrect older data. This covers the save paths that skip SaveSim, like the social list's friend toggle. -
SimPlayerDataManager.DeleteSimSaveData— Postfix
When the game deletes a sim's file on purpose (renames, sim resets), the mod forgets its cached copy and cancels any pending write, so the file stays deleted. -
SimPlayerMngr.CollectActiveSimData— Prefix
Rerolls the variance seed per sim at save points (zone changes, teleports, respawns), if enabled in config. -
SimPlayerDataManager.SaveAllSimData— Prefix
Fires at every save point: zone changes (including teleports), logout, quit, respawn. Writes out anything the background writer hasn't reached yet, so the files on disk always match the inmemory state before the game moves on. -
AuctionHouse.LoadAllSPData— Finalizer (runs only when the method throws)
The auction house rereads every sim's file with no error handling — one unreadable file used to hang the loading screen forever. The login now continues with partial auction data for that session instead. -
SimPlayerMngr.SimPlayerCatchupCode— Prefix (skips the original)
Turns off the vanilla random catchup leveling. Replacing it is the whole point of the mod.
Performance
During normal gameplay the mod does no work on each frame. Three coroutines sit parked in Unity's scheduler. A background writer wakes four times a second and persists at most one changed sim per wake, using buffered atomic writes. This uses the same temp file, replace, and backup pattern as the game's own saver.
XP ticks run roughly every 120 seconds by default. They are pure arithmetic, processed in batches of 25 per frame, well under 0.1 milliseconds per frame with debug logging off. No file is read or written on a tick frame.
At login the mod validates each premade sim's save file before the game reads it — a few milliseconds behind the loading screen, reading only files the game was about to read anyway. Repair work only ever costs time when a file is actually damaged.
Notes
-
This passive XP stops at level 35 by default. I recommend keeping this, so sims don't become overpowered by getting too many ascension levels.
-
If the game hard crashes, unspawned sims can lose up to one tick interval of passive XP (whatever the writer hadn't persisted yet). Normal quits, logouts, and zone changes always save everything.
-
Sim save files self repair: if a file is ever damaged (power loss, disk trouble), the mod restores the game's own backup copy at the next login and notes it in the log. That costs the sim a few minutes of progress at most. The game's full backup snapshots (taken at every logout, restorable from the main menu) remain the recovery of last resort.
-
The "player level + offset" cap only limits passive XP. A slot sim that banked combat XP from its own kills can level past the cap when that XP converts. This matches vanilla combat leveling behavior.
To-Do
- Scrubby specific multiplier of .2 to simulate his true leveling speed.
