ISpooferMotion v2.5.12
v2.5.12
Two real bugs that lost user assets (pasted image IDs discarded as animations, and recoverable multi-asset jobs aborted early), plus a full Settings panel redesign and a clearer "why won't the plugin connect" message.
Fixed
- Pasted image IDs were mis-typed as animations and discarded. IDs pasted into the spoofer default to
animationas their assumed type. When the actual asset behind such an ID was an image, the upload path rejected it because the payload type did not match the real AssetTypeId -- the asset was dropped with no attempt to correct the type. Now the upload path fetches the real AssetTypeId via the economy details endpoint on a type mismatch, reclassifies confirmed images asImage, and uploads them. Non-image mismatches still reject conservatively. - Recoverable multi-asset jobs were aborted by the fast-fail gate. The fast-fail guard aborted any job whose batch metadata AND batch download-URL calls both came back empty for the whole list. But batch endpoints return empty for many developer assets that are still reachable through discovery (digging into the creator's owned places for a place-context id). Real jobs of 10-30+ animations were dying in ~2s with a "broken cookie/place/key" message even though every asset was individually downloadable. Now the guard probes discovery reachability on a sample asset before aborting, and never aborts when a forced place id is present. Empty batches alone are no longer treated as a death sentence.
AnimationId(ContentId-typed) rejected the patch value. Modern Roblox typesAnimation.AnimationIdasContentId, which accepts a plainrbxassetid://string but rejects aContentobject. The patcher's coerce path only knew aboutContent-typed properties, so ContentId fields fell through and the assignment silently no-op'd (each followed by a successfulAnimationContentpatch as a side-effect, masking it). Now the coerce path has an explicitContentIdbranch that assigns the asset URI as a string.- Open Cloud API key was lost on restart. The
keyringcrate was declared with no features (keyring = "3"), and keyring v3 ships no default backend -- so on Windows it silently fell back to an in-memory mock store.set_password/get_passwordworked within a session but nothing was ever written to the OS Credential Manager, so every secret vanished on restart. The cookie masked it because auto-detect re-reads it from Roblox Studio's own credential entry each launch; the API key had no such fallback.windows-nativeis now enabled on thekeyringdependency so secrets persist to the Windows Credential Manager. The API key is also given its own keyring entry, written before the cookie-bearing blob so it survives even when that blob exceeds the Credential Manager's 2560-byte cap, andsaveSecretsis gated on the initial load completing so a racing cookie-auto-detect save can't overwrite a not-yet-restored key with empty.
Added
- Slider settings with hover tooltips. The in-Studio Settings panel is rebuilt: numeric inputs are sliders with a hover-tooltip that appears on hover-intent (short delay, warm window, grace period, fade) instead of always-visible descriptions. The Daemon Port range is a dual-thumb slider with two value boxes. Each slider shows a "Recommended: X" line. Units (e.g. MB) are rendered in the value box.
- Clear button and Open Logs. The logs panel has a Clear button. "Export Logs" is renamed to "Open Logs" -- Roblox exposes no clipboard API to plugins, so copy-to-clipboard is not possible; Open Logs reveals the log file in the OS file manager instead.
- Connect-failure reason in the plugin. When the plugin can't find the desktop app, the console now says why: either "No desktop app found on ports X-Y..." or "Found a server on ports X-Y but it isn't ISpooferMotion...". The reason logs once per disconnect episode, not every discovery cycle, so it doesn't spam.
Changed
- Daemon Port range is read live each discovery cycle. Changing the port range in Settings now takes effect without a plugin reload; the module-level defaults are only used if the setting is missing.