- Inject the user-level shared-libs dir into LD_LIBRARY_PATH for installed
games so FNF finds libvlc.so.5 (idempotent, avoids duplicate entries)
- Reconcile cached installs against butlerd's live caves: normalize
int/float ids, wait for butlerd when the cache claims installs, keep the
cache when Fetch.Caves fails, and re-save the reconciled cache
- get_caves() returns null on RPC error (vs [] for genuinely nothing
installed) so callers can tell a transient failure apart
- Patch freshly installed/updated items in place so the Play button launches
the new binary immediately
- Drop and re-add items through the LibraryManager so the library menu
re-renders after install/uninstall (core handler is a no-op upstream)
- Restore launch-page focus after uninstall by searching get_tree().root:
get_tree().current_scene is null in OGPU, so the old fix silently no-oped
and left the D-pad dead
The old `find | head -n 1` guess picked the wrong binary for many games
(e.g. a Unity LinuxPlayer_s.debug stub instead of the real .x64 launcher,
or nothing at all for .love games), so most fresh installs failed to
launch. Read .itch/receipt.json.gz (butlerd writes the authoritative
launch target on every install) and use its resolved command, with a
smarter best-effort scan as fallback. Re-resolve commands on cache load
so existing installs are fixed without a reinstall.
OGPU moves the whole extracted plugin directory (plugins/itch/) to trash
on every plugin update, so keeping installed games under
user://plugins/itch/games meant game files silently vanished on update
while butler.db kept the (now orphaned) cave. That made fresh installs
fail with butlerd's "That upload is already installed!" and broke
launches for games whose files were gone.
- New installs go to user://butler/games (persistent, next to butler.db)
via a reworked _ensure_install_location; prereqs move there too
- _install/_update reconcile the cave first: a cave whose install folder
no longer exists is uninstalled before a fresh (re)install, and a valid
existing cave turns the request into an update instead
- _make_item treats missing-folder caves as not installed, and the cache
path re-checks cwd so stale caches don't render a broken Play button
- orphaned caves are cleaned out of butler.db in the background on library
load
- drop the plugin's global InstallLocation class stub: it collided with
OGPU core's nested Library.InstallLocation and broke compilation on a
cold .godot cache (the unused install_to arg is now untyped)
- Makefile: compute preset number with shell arithmetic instead of bc
The new 'Only show games available on this platform' checkbox in the
plugin settings drops games whose platforms don't include the OS
OpenGamepadUI is running on (e.g. Windows-only games on Linux). Games
with no platform info at all (HTML5) are kept since there's nothing to
filter on. The setting is read on every library load, so toggling it
reloads the itch.io library without a restart.
Godot JSON.parse decodes every JSON number as a float, so integer ids
(7670) round-trip through JSON.stringify as 7670.0, which Go's int64
fields reject with RPC error -32700. Normalize at the parse boundary so
profile/game/upload ids serialize correctly.
Also drop the nonexistent 'fresh' parameter from Fetch.ProfileOwnedKeys.