Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
IsModded
Restore Steam achievement progression with BepInEx on Valheim 1.0-1.0.15. Preserves vanilla cheat and official bypass logic while ignoring Game.isModded.
| Last updated | 2 days ago |
| Total downloads | 1432 |
| Total rating | 1 |
| Categories | Mods Tweaks Misc Client-side Utility AI Generated Deep North Update |
| Dependency string | djcdevelopment-IsModded-1.0.4 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured and includes unstripped Unity DLLs.
Preferred version: 5.4.2202README
Valheim 1.0-1.0.15 :: isModded & Achievements Architecture
Technical analysis, runtime decoupling, and verification suite for Valheim 1.0.x Steam achievement progression

📌 Overview
Supported game versions: Valheim 1.0.0 through 1.0.15. Latest runtime verification: 1.0.15 on 2026-09-20. The build, Harmony target audit, isolated boot log, package validation, and assembly hashes are recorded in the fleet compatibility evidence.
During the release of Valheim 1.0 (Deep North / Ashlands), an official community update noted:
"We have learned that you cannot earn achievements while playing modded."
Version 1.0.4 runs Iron Gate's complete Achievements.IsCheatedAtAll() implementation while temporarily masking only Game.isModded. This preserves the 1.0.15 item, world, devcommand, cache, and official bypass rules without copying those rules into the mod.
For players and server communities utilizing client-side quality-of-life plugins—such as inventory management, crafting interfaces, camera adjustments, or administrative utilities—this policy introduced an unintended suppression of Steam achievement progression.
This repository provides an open-source technical breakdown and solution:
- Bytecode Root-Cause Analysis: Inspection of the decompiled C# IL showing why
Game.isModdedcauses achievement suppression. - Interactive Architecture Model: A structured system flow compiled via Archify showing the exact engine evaluation paths.
- Lightweight Runtime Plugin (
IsModded.dll): An 11.8 KB Harmony patch that decouplesGame.isModdedfrom cheat validation while keeping genuine cheat protections active. - Embedded Snippet for Mod Authors: A 15-line drop-in Harmony patch that authors can incorporate directly into existing mods without requiring a separate plugin.
- Automated Verification Suite: Standalone CLI executable (
Verify-IsModded.exe), PowerShell verification script, and live in-game console command (ismodded) to inspect engine bytecode and validate runtime state.
🗺️ System Architecture
The interaction flow below is compiled directly from the formal specification using Archify:

Interactive Viewer: Open
docs/valheim-ismodded.html(Live Web Preview) in any browser for the full interactive model:
- Guided Views: End-to-End Unlock Flow, Vanilla Mod Lockout, IsModded Prefix Decoupling, and Zero-Overhead Verification.
- Navigation: Dynamic pan, zoom, component metadata inspection, and dark/light theme toggle.
- Source & Vector Exports: Specification in
docs/valheim-ismodded.architecture.jsonand standalone vector inassets/architecture-archify.svg.
📥 Installation (For Players)
To restore Steam achievement progression while running BepInEx:
- Download
IsModded.dll(11.8 KB) from the repositorydist/directory, GitHub Releases, or Thunderstore. - Place the file into your Valheim BepInEx plugins folder:
<Valheim-Directory>/BepInEx/plugins/IsModded.dll - Launch the game normally. Steam achievements will record as milestones are achieved.
🔬 Technical Analysis: Root Cause in Valheim 1.0
The suppression of achievements under modded environments is not driven by an anti-cheat engine or file integrity scanning. Instead, it stems from the coupling of a legacy telemetry flag with 1.0 achievement evaluation logic.
1. The Game.isModded Telemetry Field
In early versions of Valheim, Iron Gate introduced a static boolean field in Game.cs designed to assist with customer support triage:
// Valheim assembly_valheim.dll :: Game.cs
public static bool isModded = false;
// Note in codebase:
// "While we don't officially support mods in Valheim at this time,
// we ask that you please set the following isModded value to true in your mod.
// This will place a small text in the menu to inform the player that their
// game is modded and help us solving support issues. Thank you for your help!"
2. Automatic Flagging by BepInEx
To cooperate with developer support guidelines, the BepInEx loader implemented an automated reflection helper (Chainloader.SetIsModdedTrue()) that sets Game.isModded = true whenever BepInEx initializes.
3. Achievement Evaluation in Valheim 1.0
With the introduction of Steam achievements in Valheim 1.0, an internal method Achievements.IsCheatedAtAll() was added to evaluate session eligibility. In addition to testing console cheat flags, world modifiers, and spawned items, the fallback condition evaluates Game.isModded:
// Valheim 1.0 assembly_valheim.dll :: Achievements.cs
public static bool IsCheatedAtAll()
{
if (Time.frameCount == Achievements.m_cheatCheckFrame)
return Achievements.m_cheatCheckCache;
Achievements.m_cheatCheckFrame = Time.frameCount;
// Check if player used console devcommands
bool profileCheated = (Game.instance != null) && Game.instance.GetPlayerProfile().m_usedCheats;
// Check if server world has cheat modifiers (passive enemies, etc.)
bool worldCheated = Achievements.IsWorldCheated();
// Check if player has spawned items in inventory
bool itemCheated = (Player.m_localPlayer != null) && Player.m_localPlayer.GetInventory().AnyCheatedItem();
if (profileCheated || worldCheated || itemCheated)
{
Achievements.m_cheatCheckCache = true;
}
else
{
// Evaluates Game.isModded directly as a cheat condition:
Achievements.m_cheatCheckCache = Game.isModded;
}
return Achievements.m_cheatCheckCache;
}
4. Downstream Impact on Progression
Whenever a progression milestone occurs (e.g., boss defeats, crafting, gathering), PlayerProfile.IncrementStat() evaluates the eligibility gate:
if (!Achievements.CanGetAchievements(false)) return;
Because Game.isModded is true, IsCheatedAtAll() returns true, causing CanGetAchievements() to return false. The stat increment is silently discarded, preventing any call to Steamworks.SteamUserStats.SetAchievement().
🛠️ Implementation: scoped telemetry masking
IsModded installs a lightweight Harmony prefix, postfix, and finalizer on Achievements.IsCheatedAtAll(). The prefix masks only the loader telemetry flag, the original game method evaluates every vanilla rule, and the postfix/finalizer restores the flag even if the method throws:
[HarmonyPatch(typeof(Achievements), nameof(Achievements.IsCheatedAtAll))]
static class Achievements_IsCheatedAtAll_Patch
{
private struct State { internal bool Applied; internal bool Original; }
[HarmonyPrefix]
static void Prefix(out State __state)
{
__state = new State { Applied = true, Original = Game.isModded };
Game.isModded = false;
}
[HarmonyPostfix]
static void Postfix(State __state) => Game.isModded = __state.Original;
}
For legitimate players with quality-of-life mods loaded, IsCheatedAtAll() evaluates to false, allowing CanGetAchievements() to return true and enabling standard Steam achievement triggers.
🧪 Verification Protocols
Three independent verification methods are provided to audit and confirm achievement eligibility:
Method 1: Standalone Bytecode Verifier (Verify-IsModded.exe)
A zero-dependency CLI tool built on Mono.Cecil. Run dist/Verify-IsModded.exe or tools/Verify-IsModded.ps1:
It decompiles local game assemblies live, detects the CIL instruction targeting Game.isModded, and provides an execution matrix:
================================================================================
Valheim 1.0 :: isModded & Achievement Integrity Verifier
================================================================================
[+] Valheim Directory : C:\Program Files (x86)\Steam\steamapps\common\Valheim
[+] Valheim Version : 1.0.15 (Latest Verified Build)
--- [STEP 1: INSPECTING VALHEIM 1.0.15 BYTECODE] --------------------------------
[OK] Found method: Achievements.IsCheatedAtAll()
Scanning instruction stream for Game.isModded access...
-> IL_005B: ldsfld Game::isModded
[CONFIRMED] Valheim 1.0.15 directly checks Game.isModded when evaluating cheats!
If Game.isModded is True, the engine evaluates the session as CHEATED,
which forces CanGetAchievements() to return FALSE.
--- [STEP 2: INSPECTING BEPINEX CHAINLOADER] ----------------------------------
[OK] Found BepInEx method: Chainloader.SetIsModdedTrue()
-> BepInEx automatically sets Game.isModded = True on startup.
--- [STEP 3: CHECKING ISMODDED PLUGIN STATUS] --------------------------------
[PASS] Achievement bypass plugin detected: IsModded.dll
Location: C:\Program Files (x86)\Steam\steamapps\common\Valheim\BepInEx\plugins\IsModded.dll
[PASS] Verified Harmony prefix hook targeting Achievements.IsCheatedAtAll
--- [STEP 4: LOG FILE INSPECTION] ---------------------------------------------
[OK] Found in LogOutput.log: [Info : BepInEx] Loading [IsModded 1.0.4]
================================================================================
FINAL VERDICT
================================================================================
Simulation of In-Game Achievement Evaluation (Legitimate Player with Mods):
Condition | Without IsModded | With IsModded
-----------------------------+---------------------------+-----------------------
BepInEx Running | YES (Game.isModded=True) | YES (Game.isModded=True)
Character Devcommands | FALSE | FALSE
World Cheat Modifiers | FALSE | FALSE
Inventory Cheated Items | FALSE | FALSE
-----------------------------+---------------------------+-----------------------
Achievements.IsCheatedAtAll | TRUE (Treats mod as cheat) | FALSE (Ignores isModded!)
Achievements.CanGet | FALSE [BLOCKED] | TRUE [RESTORED!]
Steamworks.Unlock() | NEVER CALLED | CALLED ON PROGRESSION
-----------------------------+---------------------------+-----------------------
>>> STATUS: READY! Your setup is configured to earn Steam achievements with mods.
Method 2: Live In-Game Runtime Audit (ismodded)
- In-game, press F5 to open the Valheim console.
- Enter the audit command:
ismodded - The engine outputs a real-time diagnostic report indicating:
- State of
Game.isModded. - Projected vanilla evaluation (Blocked).
- Active runtime evaluation with the patch (Eligible & Active).
- State of
Method 3: In-Game Progression Test
- Create a temporary character on a fresh local world.
- Collect the first stone or wood branch (
E). - The initial progression stat will fire, triggering the Steam achievement notification.
👨💻 Integration Guide (For Mod Authors)
Mod developers wishing to bundle this decoupling logic directly into existing plugins should use the same scoped mask pattern. See src/Patches/AchievementsPatch.cs; the production version includes configuration handling and a Harmony finalizer so Game.isModded is restored if vanilla evaluation throws.
using HarmonyLib;
[HarmonyPatch(typeof(Achievements), nameof(Achievements.IsCheatedAtAll))]
public static class DecoupleModdedAchievementsPatch
{
public struct State { public bool Applied; public bool Original; }
[HarmonyPrefix]
public static void Prefix(out State __state)
{
__state = new State { Applied = true, Original = Game.isModded };
Game.isModded = false;
}
[HarmonyPostfix]
public static void Postfix(State __state) => Game.isModded = __state.Original;
[HarmonyFinalizer]
public static Exception Finalizer(Exception error, State __state)
{
Game.isModded = __state.Original;
return error;
}
}
⚙️ Configuration
Configuration is managed via Valheim/BepInEx/config/djc.valheim.ismodded.cfg:
[General]
## Enable earning achievements while playing with BepInEx / mods loaded.
# Setting type: Boolean
# Default value: true
AllowWhileModded = true
## Optional: Enable earning achievements even if devcommands / cheats were used on this character or world.
# Setting type: Boolean
# Default value: false
AllowWithDevcommands = false
[Visual]
## Optional: Hide the 'Modded' watermark on the main menu.
# Setting type: Boolean
# Default value: false
HideModdedWatermark = false
❓ Technical FAQ
Does this interact with Valve Anti-Cheat (VAC)?
No. Valheim does not utilize Valve Anti-Cheat. Achievement synchronization is handled via the standard client-side Steamworks API (SteamUserStats.SetAchievement).
Does this disable cheat detection for devcommands?
No. By default (AllowWithDevcommands = false), characters or worlds that utilize developer console cheats (devcommands, god, spawn) remain ineligible for achievements according to vanilla rules. This patch exclusively decouples the Game.isModded flag.
Does this function on dedicated servers?
Yes. Achievements are client-evaluated and synced directly from the local client to Steamworks.
📜 License
This project is released under the MIT License. Permitted uses include redistribution, modification, and direct embedding within third-party plugins.