No description
Find a file
MiTHRAL 7632978bf3
Some checks failed
Build DevourUnlocker / windows-cross (push) Failing after 8s
Build DevourUnlocker / linux (push) Failing after 8s
Build DevourUnlocker / standalone (push) Successful in 5s
v2.0.11: fabricate ownership at the source — inject catalog into SteamInventoryManager.userItems
Trace proved pet/outfit UI never consults UserHasItem/HasPerk for lock display
(0 HasPerk calls while browsing; buys no-op'd on 'already owned' guard) — display
reads the raw userItems list field directly.

fabricateOwnership(): resolves SteamInventoryManager.instance static, walks
steamItems (List<SteamInventoryItem>, itemID int @+0x10), and List<Add>s every
missing def id into userItems (List<SteamItemDef_t>).

Critical fix: SteamItemDef_t is a 4-byte int enum even though
il2cpp_class_array_element_size reports 8 — reading with 8-byte stride produced
composite garbage ids so dedup never matched and values looked corrupt.
All readers/writers now use 4-byte stride; add verified in-memory:
add sent=1 stored_last=1 ... injected=59, game stable.

Periodic refill every 15s x240 (game recreates the list on inventory refresh).
Inspector keeps container summaries only (element deref removed after hang).
GetCurrentTokens/HasRetrievedUserItems remain pass-through (spoofing broke
credit purchases); UserHasItem/PlayerHasItem stay true as belt-and-braces.
2026-08-24 13:21:46 -04:00
.github version.dll is now sole unlocker — full hooks, no user WINEDLLOVERRIDES needed 2026-08-24 00:29:51 -04:00
BepInEx ignore BepInEx/obj build artifacts 2026-08-24 00:11:43 -04:00
DirectX11 Edition v2.0.0: cross-platform winhttp proxy rewrite 2026-08-21 15:28:02 -04:00
scripts v2.0.10: trace build — log ownership queries, unbreak token purchases 2026-08-24 01:40:39 -04:00
src v2.0.11: fabricate ownership at the source — inject catalog into SteamInventoryManager.userItems 2026-08-24 13:21:46 -04:00
standalone make install actually work — robust VDF patch + diagnose VDF check 2026-08-24 00:34:14 -04:00
tools add version.dll (less flagged) + per-platform installers with redownload/shift check 2026-08-24 00:03:19 -04:00
.gitignore version.dll is now sole unlocker — full hooks, no user WINEDLLOVERRIDES needed 2026-08-24 00:29:51 -04:00
CMakeLists.txt version.dll is now sole unlocker — full hooks, no user WINEDLLOVERRIDES needed 2026-08-24 00:29:51 -04:00
DevourUnlocker.json v2.0.0: cross-platform winhttp proxy rewrite 2026-08-21 15:28:02 -04:00
LICENSE Initial commit 2023-02-08 11:34:27 +02:00
README.md v2.0.0: cross-platform winhttp proxy rewrite 2026-08-21 15:28:02 -04:00

DevourUnlocker v2 — Cross-Platform (Windows + Linux Proton)

Full rewrite of the 3-year-stale DirectX11 DLL. Now: selective GUI, no hard offsets (il2cpp resolver + sigscan), winhttp.dll proxy for zero-install, multiplayer safe for friend lobbies, plus a standalone tool.

Legacy DirectX11 Edition/ is kept as legacy/ reference — new code is in src/ (CMake) + BepInEx/ + standalone/.

Quick Install (pulls from your Git releases)

Windows (PowerShell):

iwr https://raw.githubusercontent.com/mithral/DevourUnlocker/main/scripts/install.ps1 -OutFile install.ps1
.\install.ps1          # auto-finds Steam Devour
# or: .\install.ps1 -GameDir "C:/Program Files (x86)/Steam/steamapps/common/Devour"

Linux — CachyOS / Proton:

curl -fsSL https://raw.githubusercontent.com/mithral/DevourUnlocker/main/scripts/install.sh | bash
# then in Steam: Devour -> Properties -> Launch Options:
# WINEDLLOVERRIDES="winhttp=n,b" %command%

Uninstall:

bash scripts/install.sh --uninstall
# or ps1: .\install.ps1 -Uninstall

Launch Devour → F6 toggles GUI (pick robes/characters), F5 unloads. No BepInEx needed.

What It Does

  • Hooks IsRobeUnlocked / IsCharacterUnlocked resolved at runtime via il2cpp_class_from_name + string-xref sigscan — no 0x74B0B0 hard offset. Works across updates until method names change.
  • winhttp.dll proxy forwards all WinHttp* exports to system winhttp — HTTP/auth/lobby unaffected. Photon/udpkit/bold networking untouched.
  • GUI: ImGui DX11 (Win) / SDL fallback (Proton). Selective per-item overrides stored in DevourUnlocker.json beside DEVOUR.exe.
  • Multiplayer: client-visual only, no VAC/EAC. Friend lobbies tested on Proton ↔ Windows — no desync, no ban.

Alternatives

  • BepInEx plugin (BepInEx/DevourUnlocker.cs) — if you already use Thunderstore/r2modman. Patches by method name via Harmony, same GUI via OnGUI.
  • Standalone (standalone/devour_unlocker.py + gui.py) — no injection; writes DevourUnlocker.json for the mod to consume. Run python standalone/gui.py or python standalone/devour_unlocker.py unlock --all.
python standalone/devour_unlocker.py list
python standalone/devour_unlocker.py unlock --robes Golden,StraightJacket --chars Molly,Zara
python standalone/devour_unlocker.py unlock --all --exclusive --json ~/DevourUnlocker.json
python standalone/gui.py  # Tkinter checkboxes

Build From Source

Windows (MSVC):

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
# outputs build/winhttp.dll + build/DevourUnlocker.dll

Linux (for .so / testing):

cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_WINHTTP_PROXY=OFF
cmake --build build

Release zip:

powershell scripts/make_release.ps1  # or: zip -j DevourUnlocker_winhttp_v2.0.0.zip build/winhttp.dll build/DevourUnlocker.dll DevourUnlocker.json

Structure

src/               # native mod (CMake, winhttp proxy, resolver, patches, gui)
  il2cpp_resolver.* # no hard offset
  patches.*        # IsRobe/IsCharacter hooks (MinHook)
  gui/overlay.*    # ImGui selective GUI
  platform/        # win32.cpp, winhttp_proxy.cpp, linux.cpp
BepInEx/           # fallback Harmony plugin
standalone/        # python CLI + Tkinter GUI
scripts/install.*  # pull-from-git installers
tools/dump_metadata.py # parse global-metadata.dat -> robes list
DirectX11 Edition/ # legacy v1 (unchanged, now x64/ removed)

Troubleshooting

  • GUI not showing: Under Proton, ensure WINEDLLOVERRIDES is set. Check compatdata/1274570/.../Player.log for [DevourUnlocker] Present hooked.
  • winhttp conflict: Another mod already uses winhttp.dll → use BepInEx build or chain-load via doorstop.
  • After game update hooks miss: Run python tools/dump_metadata.py /path/to/global-metadata.dat — if IsRobeUnlocked gone, open issue with new Player.log.

License

MIT — see LICENSE. Original by RaizyDaizy, rewrite by fork.