Source-checkedAdmin & protection

NoArbitraryIncompatibilityFlag

by IAmOnTheInternetAndItIsScary · for Valheim

Removes incompatibility restrictions from RtD mods, allowing them to work with other popular Valheim mods.

4.5KDownloads
3 mo agoLast updated
BepInExLoaders
ThunderstoreSource

About NoArbitraryIncompatibilityFlag

From Thunderstore

Removes incompatibility restrictions from RtD mods, allowing them to work with other popular Valheim mods.

NoArbitraryIncompatibilityFlag

A BepInEx patcher that removes incompatibility restrictions from RtD mods, allowing them to work alongside other popular Valheim mods.

What Does It Do?

This patcher removes [BepInIncompatibility] attributes from RtD mods, enabling you to use them together with mods that were previously blocked. The mods themselves work fine together - this simply removes the restrictions.

Affected RtD Mods:

  • RtDOcean
  • RtDVines
  • RtDMonsters
  • RtDSouls & RtDSouls_Addon
  • RtDBiomes
  • RtDMonstrum
  • RtDDungeons
  • RtDFairyTale
  • RtDGardening
  • RtDHorrors
  • RtDItems
  • RtDMagic
  • RtDLegends
  • RtDMythics
  • RtDQuestForge

Previously Blocked Mods (Now Compatible):

  • CookieMilk.MagicalMounts
  • CookieMilk.MajesticChickens
  • CookieMilk.BuildPieces
  • CookieMilk.CarryMeMaster
  • CookieMilk.DiscordControl
  • CookieMilk.UltimateServerControl
  • Therzie.MonstrumDeepNorth
  • Therzie.WarfareFireAndIce
  • Therzie.Monstrum
  • Therzie.Armory
  • Therzie.Wizardry
  • Therzie.Warfare
  • blacks7ar.MagicPlugin
  • blacks7ar.MagicRevamp
  • blacks7ar.SeedBed
  • blacks7ar.OreMines
  • blacks7ar.BowPlugin
  • randyknapp.mods.epicloot
  • org.bepinex.plugins.valheim_plus

Installation

IMPORTANT: This is a PATCHER, not a regular plugin!

  1. Download NoArbitraryIncompatibilityFlag.dll
  2. Place it in BepInEx/patchers/ folder (NOT plugins!)
  3. Launch the game
  4. The patcher will automatically process RtD mods on startup

How It Works

The patcher uses a dual-layer approach combining Cecil IL patching with Harmony runtime patches. All modifications are in-memory only - no files are ever modified on disk.

On launch, you'll see:

Processing RtDVines.dll...
  Stripped 19 incompatibility attribute(s) from RtDVines
  Neutered RtDVines.Fail()
  Removed 4 Fail() call(s) from RtDVines.Awake()
✓ Cecil IL patching complete - RtD detection code neutralized
✓ Harmony fallback: Ready to bypass incompatibility checks
✓ Harmony fallback: Ready to hide from ContainsKey detection
✓ Harmony fallback: Ready to hide assembly name
✓ Harmony fallback: Ready to filter GetAssemblies
✓ Found RtD mod: RtDVines
✓ Successfully bypassed incompatibility checks for 1 RtD mod(s)

Technical Details

RtD mods added four detection checks in their Awake() method:

  1. IL Bytecode Integrity Check: Verifies their "Block" method hasn't been modified
   MethodInfo method = typeof(RtDMod).GetMethod("Block", ...);
   byte[] ilAsByteArray = method?.GetMethodBody()?.GetILAsByteArray();
   if (method == null || ilAsByteArray == null || ilAsByteArray.Length <= 2)
       Fail();
  1. PluginInfo Dictionary Check: Looks for our GUID in BepInEx's plugin registry
   if (Chainloader.PluginInfos.ContainsKey("IAmOnTheInternetAndItIsScary.NoArbitraryIncompatibilityFlag"))
       Fail();
  1. Assembly Name Scan: Searches all loaded assemblies for our name
   if (AppDomain.CurrentDomain.GetAssemblies().Any(a => a.GetName().Name.Contains("NoArbitraryIncompatibilityFlag")))
       Fail();
  1. Module Name Scan: Searches all loaded assembly modules for our name
   if (AppDomain.CurrentDomain.GetAssemblies().Any(a => a.ManifestModule.Name.IndexOf("NoArbitraryIncompatibilityFlag", StringComparison.OrdinalIgnoreCase) >= 0))
       Fail();

The patcher uses a dual-layer defense strategy. The Cecil layer runs during BepInEx's preloader phase, before any plugin code executes. BepInEx loads each RtD DLL into memory as an AssemblyDefinition object, passes it to our Patch() method, we modify the IL instructions, and BepInEx loads the modified version into the CLR. The original DLL on disk is never touched.

Cecil IL Patching (Primary Defense)

  1. Strip Incompatibility Attributes: Removes all [BepInIncompatibility] custom attributes from types. This is the primary goal - removing the actual incompatibility declarations.
  1. Neuter Fail() Method: Replaces the method body with just ret. Even if detection checks somehow execute, calling Fail() does nothing.
   // Before:
   private static void Fail() {
       throw new Exception("Mod integrity check failed.");
   }
   
   // After:
   private static void Fail() {
       return; // Does nothing
   }
  1. Strip Static Constructor Throws: NOPs throw statements in .cctor. Finds static constructors that contain integrity check strings and replaces ldstr + newobj Exception + throw with nop instructions.
  1. Strip Fail() Calls from Awake(): NOPs all calls to Fail() in the Awake method. Finds all call Fail instructions and replaces them with nop (no operation).

Harmony Runtime Patches (Fallback Protection)

The Harmony layer provides fallback protection in case the Cecil layer misses something or a future RtD mod uses different patterns:

  1. Incompatibility Bypass: Patches PluginInfo.Incompatibilities getter to return empty array for RtD mods (identified by "Soloredis." GUID prefix).
  1. ContainsKey Stealth: Patches Dictionary<string, PluginInfo>.ContainsKey to return false only for our specific GUID and only when called from RtD code. Uses stack trace analysis to identify the caller.
  1. Assembly Name Hiding: Patches Assembly.GetName() to return "HiddenAssembly" instead of "NoArbitraryIncompatibilityFlag" when called from RtD mods. Uses recursion guard to prevent issues during GetAssemblies calls.
  1. GetAssemblies Filtering: Patches AppDomain.GetAssemblies() to filter our assembly from results only when called from RtD mods. Uses recursion guard (insideGetAssemblies flag) to prevent infinite loops - Prefix sets flag to true, Postfix sets it to false after filtering, and GetName_Postfix checks this flag and skips processing when true.

FAQ

Q: Is this safe?

Read the full description on Thunderstore →

Highlights

From source data

Loaders

Runs on BepInEx.

Footprint

Rated a light load on a server.

Last update

Its author last shipped an update 3 mo ago.

NoArbitraryIncompatibilityFlag on Nxeon

From our catalogue
One-click install
Supported on Nxeon Valheim servers, for BepInEx servers. We download it from Thunderstore, place it, and restart the server.
Server type needed
BepInEx
Server load
light
Smallest plan we suggest
Valheim — 4 GB (4 GB RAM). This follows our own load rating above, not a benchmark.
Latest build
1.1.3, released 2026-08-21

Game versions by loader

LoaderGame versionsNewest
BepInEx

From 14 recorded builds of NoArbitraryIncompatibilityFlag.

Recent builds

BuildReleasedGame versionsLoaders
1.1.32026-08-21n/aBepInEx
1.1.22026-06-18n/aBepInEx
1.1.12026-04-11n/aBepInEx
1.1.02026-04-06n/aBepInEx
1.0.92026-04-06n/aBepInEx
1.0.82026-04-06n/aBepInEx

Run NoArbitraryIncompatibilityFlag on a Valheim server

Pick a server or deploy a new one above; it is installed in one click.

What kind of mod it is

From the catalog
Listed on Thunderstore as “Admin”

Admin & protection

Permissions, moderation, anti-cheat and land protection for the people running the server.

Compatibility

Game
Valheim
Loaders
BepInEx
Requires
One-click install needs a BepInEx server.

Verified at the source

  • ✓ThunderstoreOfficial listing, checked 2026-10-02Open ↗
  • ✓AuthorIAmOnTheInternetAndItIsScary, as published on Thunderstore
  • ✓LicenseNot published by the sourceFree

NoArbitraryIncompatibilityFlag, answered

Generated from the mod’s own source data.

Which loaders does it support?

BepInEx.

Is it free?

Yes. NoArbitraryIncompatibilityFlag is free to download from Thunderstore.

How do I add it to my Nxeon server?

Use “Add to a server” on this page, or open NxLabs from your dashboard. We install it, restart your server and switch it on.

NxLabs

Run NoArbitraryIncompatibilityFlag on a Valheim server.

Deploy in about a minute from $9.99 a month, then add NoArbitraryIncompatibilityFlag in one click.