You are viewing a potentially older version of this package. View all versions.
Wubarrk-The_Eye-2.2.0 icon

The Eye

A deterministic, cross-platform Valheim API extraction tool, vibe coders love it!

Date uploaded 3 weeks ago
Version 2.2.0
Download link Wubarrk-The_Eye-2.2.0.zip
Downloads 31
Dependency string Wubarrk-The_Eye-2.2.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2333 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2333
ValheimModding-JsonDotNET-13.0.4 icon
ValheimModding-JsonDotNET

Shared version 13.0.3 of Json.NET from Newtonsoft, net45 package for use in Valheim mods. Maintained by the ValheimModding team.

Preferred version: 13.0.4

README

πŸ‘οΈ WubarrksEye (TheEye)

"Stop guessing what the IL does. Stop decompiling 130,000 lines just to find out if CanSenseTarget is virtual or static. The truth is in the assembly, and now it's in your hands."


πŸ“£ All my mods are alive, updated, and on Hexium

Every Wubarrk mod is maintained and published only on Hexium. If you got one somewhere else, it is stale. Current roster as of this release:

Mod Latest What it is
Mists of Avalor (Open BETA) 0.2.1 The big one. Join the open beta.
VikingOS (BETA) 0.9.8
Njord 2.0.0
Wings of the Valkyrie 2.1.5
TortalPortal 1.4.6
AwayFromHome 1.0.6
Let It Grow 0.1.2
StackIT 0.2.1
Fatty 1.1.11
DvergrAllies 1.0.6
RuneboundRest 1.1.0
The Eye 2.2.0 This one.

Valheim 1.0 lands and every one of these gets re-verified against it with this tool. That is what 2.2.0 is for.


WubarrksEye (TheEye) is a deterministic, cross-platform Valheim extraction tool. It is, without exaggeration, a vibe coder's wet dream. But let's be real, with this data at your fingertips you're not just a vibe coder anymore. You're an AI-augmented game mod designer, and your dreams can come true. When Valheim 1.0 drops and the API shifts under everyone's feet, this is the tool that maps the new world, tells you exactly what changed against your pre-1.0 baseline, and feeds it straight to your AI pair programmer.

Forget hand-grepping decompiled source for hours. Forget guessing why your Harmony patches misfire because you bound the wrong overload, or realising months later that your custom monster AI was inert because vanilla's Character.OnDamaged never fires for most creatures. TheEye gives you the ground truth of the game's architecture, serialized data, method call graphs and live world state, straight from memory.

This isn't a dumper. It's an autopsy table for the game engine, and as of 2.2.0 it comes with a before/after report.


βš”οΈ What's new in 2.2.0 (the pre-1.0 baseline release)

🧾 Manifest.json β€” every dump knows what build it came from

Valheim stamps every DLL 0.0.0.0. So TheEye now writes, before anything else, the game version string with build hash, the Steam buildid, the md5 and size of every DLL in Managed/, the BepInEx version and every loaded plugin, the world name, seed and global keys, and the options used. A dump from a contaminated profile is visible on sight.

πŸ¦β€β¬› Huginn's Report β€” a real diff, not a line hash

Every record in every file is keyed on its identity (type name, prefab name, ZDO UID, _Source/_Key). Huginn now says, per file, exactly which records were ADDED, REMOVED and CHANGED, and for CHANGED lists the field-level deltas with old and new values. Huginn_Summary.json has the counts. Pick the baseline: dump_eye baseline=<dir> or the config. Run it after 1.0 against your pre-1.0 dump and read the summary first.

πŸ—ΊοΈ API dump rewritten

Full member surface per type: fields with modifiers and constant values, properties with accessor visibility, events, constructors, full method signatures with virtual / override / abstract, interfaces, attributes, nested types, enum values. Members are keyed by name so a renamed overload is one line in the diff. Game assemblies only by default; the 20,000-type mscorlib noise is gone.

πŸ“š Registry_Dump.json β€” where a new biome shows up first

Enums with values, the ZDOVars hash table, console commands with cheat/server/admin flags, spawn tables, creature spawners, environments and biome weather, raids, piece tables with every piece and its costs, skill definitions, and the full localization table.

🧬 ZDO dump that means something

Prefab hash resolved to a name, rotation, sector, persistence, revisions, creation time, and every key/value the ZDO carries with hashes mapped back to ZDOVars names (health, owner, items...). The session-long ZNetScene active-area override that forced every object in the world to instantiate is now off by default.

πŸ“‘ RPC names in the call graph

Every ZNetView / ZRoutedRpc / ZRpc.Register string literal, and the method that registers it. A renamed RPC breaks every mod that Invoke()s it by name; now it is one diff line.

πŸ–₯️ Headless

A dedicated server has no console to type into. [Automation] AutoDumpOnWorldLoad = true dumps once the world is populated, and AutoDumpQuit exits afterwards. One-shot server baseline.

🧹 Determinism and hygiene

UTF-8 without BOM (line splitters were dropping the first record). Types, prefabs, items, ZDOs and indexes sorted. Invariant-culture round-trip floats. Two dumps of the same build on the same world are byte-identical, and that was verified.


βš”οΈ Features carried forward

πŸ•ΈοΈ Deep Call-Graph Extraction

Walks the method IL and emits call and field-access edges. Does an override call base? Which overload does a call site really reach, static or instance? Who calls method X? All in CallGraph_Dump.json, with call vs callvirt on every edge and a CalledBy inverted index.

πŸ’Ž Serialized Value Extraction

Declarations tell you a field exists; Values_Dump.json tells you what is in it. Every item, recipe, status effect, prefab component, vegetation and location entry, flattened to dotted paths, cycle-safe, with per-entry budgets so it never explodes.

πŸš€ Zero-Stall Background Architecture

Coroutine-batched, RAM-profile scaled, cancellable, streamed straight to disk. The game keeps rendering, the server keeps ticking. A full dump on a dedicated server takes about a minute.


πŸ— Guide to Extraction

  • Launch the Game and load a world. (API and call graph work from the main menu; everything else needs a world.)
  • Run the Dump: dump_eye in the F5 console, or F8 β†’ Start Dump. eye_status shows progress. F9 toggles the HUD.
  • Options: dump_eye baseline=<dir> nodiff noml nozdo noscene noloc
  • Review the Goods: BepInEx/config/WubarrksEye_Dumps/<timestamp>/. AgentML_Complete_Dump.zip bundles everything as one minified JSONL plus the manifest for machine ingestion.
  • Write Better Mods, you vibe coder you.

What You Will Find Inside

File Contains Keyed on
Manifest.json Build identity, md5 table, plugins, world, options, per-file results
API_Dump.json Every type in the game assemblies with its full member surface FullName
Values_Dump.json Field contents for items, recipes, status effects, prefabs, vegetation, locations _Source/_Key
Registry_Dump.json Enums, ZDOVars, commands, spawns, environments, raids, pieces, skills, localization _Source/_Key
CallGraph_Dump.json Per-method IL edges, CalledBy index, RpcRegistration index Type.Signature
Prefabs_Dump.json / ObjectDB_Dump.json / Scene_Dump.json Component lists Name
ZDO_Dump.json Every ZDO in the loaded world with its key/values UID
Huginn_Diff_Report.jsonl + Huginn_Summary.json ADDED / REMOVED / CHANGED against the baseline

πŸ”Ž Why Before You Grep The Decompile

API_Dump.json answers three questions without reading a line of decompiled source:

  1. Which type declares a member. Members are DeclaredOnly, so if m_targetCreature sits under MonsterAI it is not on BaseAI. Binding the wrong type throws MissingFieldException into a catch that swallows it.
  2. The full overload set with complete parameter types.
  3. virtual / override / abstract, derived from GetBaseDefinition().

CallGraph_Dump.json answers method body questions reflection cannot see:

  • ChainsToBase: Humanoid.OnDamaged does not call base, so a patch on Character.OnDamaged never fires for most creatures. Player.OnDamaged does.
  • Calls[].Op: call vs callvirt, which is how you tell a base chain from re-dispatch, and a static target from an instance one.
  • CalledBy and RpcRegistration indexes.

Accessibility is the runtime assembly's. Projects compiling against a publicized assembly_valheim see private members here as directly callable.


🧭 Taking a baseline before Valheim 1.0

  1. Copy the game folder first. Steam overwrites it on launch day and the old build is gone.
  2. Dump on a clean profile (BepInEx + TheEye only). Manifest.json lists every plugin, so contamination is at least visible.
  3. Dump from the main menu, from inside a world, and from your dedicated server if you patch server code.
  4. After the update: dump_eye baseline=<your pre-1.0 dump> and read Huginn_Summary.json.

βš™οΈ Configuration (wubarrk.theeye.cfg)

Key Default Purpose
[API] ApiAssemblyFilter assembly_*,gui_framework,Splatform Assemblies covered by the API and enum dumps. * for everything loaded
[ZDO] ZdoIncludeData true Emit every ZDO key/value
[ZDO] ForceGlobalActiveArea false The old always-on instantiate-everything patch. Leave off
[Registry] DumpLocalization true Full token β†’ text table
[Huginn] HuginnBaselineDir empty Fixed baseline directory
[Huginn] HuginnMaxDeltasPerRecord 200 Cap on deltas per CHANGED record
[Automation] AutoDumpOnWorldLoad / AutoDumpDelaySeconds / AutoDumpQuit false / 20 / false Headless one-shot dump
[Hardware] SystemMemoryProfile Rig_16GB Batch sizes per frame

⚠️ Dependencies: BepInEx, Newtonsoft.Json (installed automatically as the JsonDotNET dependency)


πŸ“œ License

MIT. Copyright (c) 2026 Ross G. Support development at https://www.patreon.com/c/WubarrkDev

CHANGELOG

Changelog β€” The Eye

2.2.0 β€” 2026-09-03 (pre-1.0 baseline release)

Provenance

  • New Manifest.json, written before any extractor runs: game version string with build hash, Steam buildid, md5 + size of every Managed DLL, BepInEx version and every loaded plugin, world name/seed/global keys, options used, and per-file results when the dump ends. Also bundled into the AgentML zip.

API dump rewritten

  • Full member surface per type: fields (with modifiers and constant values), properties (with accessor visibility), events, constructors, methods (full signatures with virtual / override / abstract), interfaces, attributes, nested types, enum values, Unity metadata.
  • Members are objects keyed by name so Huginn reports member-level adds and removes.
  • Only game assemblies by default ([API] ApiAssemblyFilter); compiler-generated types skipped.
  • Sequential, sorted by FullName. The old Parallel.ForEach made the file order random per run.

Huginn's Report rewritten as a structural diff

  • Every record is keyed on its identity; the report says ADDED, REMOVED and CHANGED per file, with flattened field-level deltas (old/new) for CHANGED and a Huginn_Summary.json of counts.
  • The baseline can be chosen: dump_eye baseline=<dir> or [Huginn] HuginnBaselineDir.
  • The old line-hash diff could not say "removed" and produced an 80 MB report of ADDED_OR_MODIFIED.

ZDO dump

  • Prefab hash resolved to a prefab name. Adds rotation, sector, persistence, object type, revisions, creation time, and every key/value from ZDOExtraData with hashes reverse-mapped through ZDOVars. Sorted by UID.
  • The ZNetScene active-area override is now off by default ([ZDO] ForceGlobalActiveArea). It forced the game to instantiate every ZDO in the world for the whole session and the dump never needed it on a host.

New Registry_Dump.json

  • Enums with values, ZDOVars hash table, console commands with cheat/server/admin flags, SpawnSystemList spawn tables, CreatureSpawner prefabs, environments and biome environments, random events, piece tables and every piece with requirements, skill definitions, and the full localization table.

Call graph

  • RpcRegistration index records: the RPC name string and the registering method for every ZNetView / ZRoutedRpc / ZRpc.Register call.
  • Types and the CalledBy index are sorted.

Determinism and hygiene

  • All output is UTF-8 without BOM (line splitters were dropping the first record).
  • Prefabs and ObjectDB items sorted by name; positions and floats in invariant round-trip format.
  • Localization now resolves (Localization lives in assembly_guiutils; the old reflective lookup asked assembly_valheim and 894 display names stayed as $tokens).

Console and automation

  • dump_eye options: baseline=<dir> nodiff noml nozdo noscene noloc; results print to the in-game console, not only the BepInEx log. New eye_status.
  • [Automation] AutoDumpOnWorldLoad / AutoDumpDelaySeconds / AutoDumpQuit for dedicated servers, which have no console to type into.

2.1.1

  • ValueExtractor (Values_Dump.json) and CallGraphExtractor (CallGraph_Dump.json) added.
  • Streaming JSON dump engine, AgentML zip bundle, F8/F9 IMGUI controls, line-hash Huginn's Report.

1.2.9

  • Fixed Readme file

1.2.8

  • Initial public release

Support Development

https://www.patreon.com/c/WubarrkDev