- Removed vendored
ida_plugin_mcpfrom the repository and switched Cursor MCP wiring to external checkout paths. - Ignored Python bytecode artifacts and removed tracked
__pycache__files. - Updated internal menus:
- Moved the former profiles/cpu-eaters content into the
CPUtab. - Removed the standalone profile tab navigation.
- Added profile preview block with
Will set...target values andCustom/Currentview mode. - Simplified profile apply flow to a single
Apply Profileaction. - Updated tab/page labels from
ProfilestoCpuEaterswhere applicable. - Removed
Map studyfrom menu navigation tabs.
- Moved the former profiles/cpu-eaters content into the
- Lighting menu controls:
- Enforced integer slider behavior for
_sofbuddy_lighting_cutoff. - Enforced integer slider behavior for
_sofbuddy_water_size.
- Enforced integer slider behavior for
- UI scaling/runtime updates:
- Included recent tweaks in
scaled_con,scaled_hud, andscaled_ui_basecvar handling.
- Included recent tweaks in
- Detours / codegen: Expanded
detours.yamlandtools/generate_hooks.pyfor pointer-backed hook targets;rsrc/funcmaps/SoF.exe.jsonand per-featurehooks/pointers.json(plussrc/core/pointers.json);docs/DETOUR_SYSTEM.mdandhdr/detours.hupdates;DetourXSand core detour registration (detours.cpp,shared_hook_manager.cpp) aligned with the new flow. - Core: Init and loader path work (
simple_init.cpp,module_loaders.cpp,wsock_entry.cpp,update_command.cpp,sofbuddy_cfg.cpp) so startup and update behavior match the hook system changes. - entity_visualizer (new, optional): Map-study tooling (spawn/draw, cvars, QCommon frame and loading hooks). Still off by default in
features/FEATURES.txtalongside other experimental toggles; enable by uncommenting the feature line for local builds. - Internal menus: Map debug RMF assets (
map_debug.rmf,map_debug_content.rmf); tab content and loading/menu hook follow-ups;hooks/pointers.jsonfor internal menu hooks. - Graphics / ref-DLL features:
lighting_blend,scaled_ui_base,scaled_menu,texture_mapping_min_mag,vsync_toggle— cvar/refdll and hook wiring updates where pointers apply; feature README tweaks where noted. - Other features:
http_maps,media_timers,new_system_bug— small hook/cvar/README adjustments;raw_mousemessage-pump and hook touch-ups. - Cbuf / config:
cbuf_limit_increaseREADME and early callback updates;FEATURES.txtcomment clarifies deprecation in favor ofsofbuddy.cfgpersistence. - Tooling / docs: IDA MCP plugin (
ida_plugin_mcp/),ida_dump_main.py, and Cursor MCP/command helpers for IDA workflows;README.mdand several feature READMEs refreshed.
- Build defaults:
entity_visualizerremains under Game Features but is commented out by default in auto-generatedfeatures/FEATURES.txt(tools/generate_features_txt.py). Default-disabled features arescaled_menu,cbuf_limit_increase, andentity_visualizer(map entity / wireframe tools). - HTTP maps: stabilize deferred precache and loading-status flow; harden HTTPS, size fallbacks, loading status, and logging (
http_maps.cpp, README). - Internal menus: restore early loading UI with a pak-aware fast path; harden loading menu behavior in unlock mode; loading safe RMF updates;
SCR_BeginLoadingPlaquepost-hook adjustments.
- Raw mouse: removed the
IN_MenuMouseengine hook (SofExe0x4A420), Pre/Post callbacks, andin_menumouse.cpp.GetCursorPosno longer takes a special “real API” path while menu-mouse runs; with raw mouse enabled it always drains pending mickeys and reports the synthetic cursor position like other code paths.
- Raw mouse: if
RegisterRawInputDevicesreturnsERROR_INVALID_PARAMETER(87) for focus-following registration (hwndTarget=NULL), retry once with an explicit same-process top-level HWND (resolved viacl_hwnd, window heuristics, or foreground when it belongs to the game process). Non-nullhwndTargetmust be owned by the calling process; comments inraw_shared.cppdocument that Win32 rule. - Raw mouse:
DispatchMessageAcallsraw_mouse_ensure_registeredwhile_sofbuddy_rawmouseis on and registration is not complete yet, so enable still settles if the first attempt runs before the pump has ticked. - Raw mouse:
RegisterRawInputDevicesmay still be invoked from the cvar path or other threads (same as v5.2); raw input registration is per-process and must not be restricted to the window thread only.
- Raw mouse: stop binding normal foreground raw input registration to a specific HWND.
RegisterRawInputDevicesnow uses focus-following mode (hwndTarget = NULL), while window resolution is kept only for cursor clip/focus decisions. This avoidsERROR_INVALID_PARAMETER87 from bad or overlay-polluted HWNDs and lets registration succeed earlier in startup. - Raw mouse: prefer the engine’s real
cl_hwnd(RVA0x403564) as the game window, withActiveApp(RVA0x40351C) as another guard before draining raw input. Heuristic fallback still exists, but same-process helper/tool windows now score much lower and class"Quake 2"scores higher. - Raw mouse: add richer registration diagnostics, including candidate window dumps and
GetRegisteredRawInputDevicesstate, to make injected-overlay conflicts (for example ShadowPlay) much easier to spot.
- Raw mouse: hook
IN_MenuMouse(SofExe0x4A420) with Pre/Post callbacks; while inside it,GetCursorPosuses the real API so menu cursor motion matches the OS (avoids synthetic cursor lag on connect / low FPS).detours.yamlusescvar_t*parameters;hooks.jsonregisters Pre/Post; newin_menumouse.cpptracks scope with a depth counter. - Raw mouse: fold pending mickeys at read time —
GetCursorPoscallsraw_mouse_drain_pending_raw_for_cursor()(sharedGetRawInputBufferdrain with bounded multi-batch emptying) so the virtual cursor stays fresh without waiting on the next pump boundary. - Raw mouse:
Sys_SendKeyEventsonly resets deltas (consume_deltas); raw queue draining is no longer done there — only theGetCursorPospath drains (plus lazy registration when not yet registered). Removedraw_processed_this_frame/raw_mouse_on_peek_returned_no_message;raw_mouse_process_raw_mouse()forwards to the same drain helper. - Raw mouse: registration cleanup —
RawMouseDropRegistration(), singleRawMouseCommitRawInputRegistration()for Win32 register + validation;raw_mouse_ensure_registeredfast-paths when already registered for the same root (skips heavy window resolution on commonDispatchMessageAcalls). Dropped publicraw_mouse_register_input(onlyensure_registeredneeded it). - Raw mouse: message pump default
MAX_MSG_PER_FRAMEset to 10 with a short comment on the vanilla full-drain vs capped tradeoff.
- Raw mouse: message pump no longer removes
WM_INPUTfrom the queue (avoids high-frequency peel cost on high-poll mice). Uses filteredPeekMessagebands aroundWM_INPUTwhen it blocks the head; otherwiseGetMessagefor strict FIFO. When both low-ID and high-ID candidates exist, orders byMSG.timewith high-band tie-break for mouse/client messages. Raises per-pump cap to 10 dispatched messages; updatessys_msg_timeand centralizes quit/dispatch inDispatchOneMsg. - Raw mouse: fix enabling
_sofbuddy_rawmousewhen the engine runs the cvar change callback beforeCvar_Getreturns — setin_mouse_raw = cvarat the start ofraw_mouse_on_change; drop redundant secondraw_mouse_on_changeafter registration (avoids false “not enabled” / “registration failed” pairs and duplicate “ENABLED” logs). - Raw mouse: optional dev logging when
raw_mouse_ensure_registeredis asked to log — “not enabled or API not supported”, “already registered for this window”;raw_mouse_register_inputlogs “Raw input registration succeeded” when registration completes.
- Raw mouse: register raw input only with HWNDs owned by the game process (
GetWindowThreadProcessIdvsGetCurrentProcessId). Resolve the window viaGetGUIThreadInfo, thenGetActiveWindow/GetForegroundWindowonly when they are local, plusEnumThreadWindowsfallback—fixesRegisterRawInputDevicesfailing with error 87 (ERROR_INVALID_PARAMETER) when foreground belonged to another app or at startup. Cvar enable uses the sameraw_mouse_ensure_registeredpath as the message pump; clearer log lines for invalid HWND and for error 87. - Raw mouse: the “Wine/X11 raw input” hint is shown only when actually running under Wine/Proton (
is_running_under_wine()), not on native Windows failures. - Core:
is_running_under_wine()implementation moved tosrc/utils/util.cppwith declaration inhdr/util.h(shared helper for updater and raw mouse).
- Updater: refactored zip selection to strict priority order (
preferred_release_zip_names,pick_best_zip_url) instead of scoring; native Windows prefersrelease_windows.zipthenrelease_windows_xp.zipwhen the main zip is missing (fixes Windows 7 receiving wine_linux build). Wine detection hardened (validatewine_get_versionreturn). - Update scripts: clarified prompts in
update_from_zip.shandupdate_from_zip.cmdfor user input options when applying fresh settings.
- Raw mouse: SetCursorPos hook now always calls the original so the OS cursor is warped when the game recenters, fixing dual-monitor focus loss (e.g. left edge on Wine/Kubuntu).
- Raw mouse: message-pump–based flow. Replaced engine-frame hooks (IN_MouseMove, IN_MenuMouse, PeekMessageA, GetMessageA) with Sys_SendKeyEvents replacement and dedicated capped two-range pump so WM_INPUT is never peeked or delivered. One GetRawInputBuffer per frame in Sys_SendKeyEvents path; DispatchMessageA only handles window events (registration/clip). Virtual cursor via GetCursorPos/SetCursorPos. WOW64: buffer size×8 and RAWMOUSE at offset 24. Single cvar 0=off, non-zero=on. README updated.
- Media timers: Sys_SendKeyEvents call site (exe 0x65D5E) now uses my_TimeGetTime (QPC) instead of my_Sys_Milliseconds for consistent frame timing.
- Raw mouse: reimplemented with single setting (0=off, non-zero=on). PH3-style only: two-range PeekMessageA so WM_INPUT is never seen; GetMessageA swallows WM_INPUT (no GetRawInputData); one GetRawInputBuffer per frame in IN_MouseMove/IN_MenuMouse Pre; DispatchMessageA returns 0 for WM_INPUT. No per-message processing or drain-from-handle.
- Internal menus: SoF Buddy RMF assets renamed from sb_* to shorter names (e.g. sb_perf → cpu, sb_input → input, sb_http → network, sb_tweaks_perf → profiles, sb_scaling → ui_scale).
- Docs: README menu.png hero image; raw_mouse and internal_menus README updates. Update-from-zip scripts (Windows/Linux) refinements.
- Raw mouse: reworked raw input pipeline to buffer and drain high-Hz
WM_INPUTviaGetRawInputBuffer, skip zero-delta packets, and keep the game's original mouse cvars/flow intact while sourcing movement from hardware deltas instead of OS cursor position. - Raw mouse: hardened window/foreground and clip handling (no cursor warping on clip refresh, proper unregister on failure/teardown, disabled-path hooks now pure passthrough with no side effects when
_sofbuddy_rawmouseis 0). - Raw mouse docs: expanded feature README with callback/override details, disabled-path behavior, jitter/high-polling guidance, and configuration notes so users understand how and when to enable it.
- Docs: README now surfaces a prominent “#1 thing you need to know” section and in-game command docs that emphasize
F12/sofbuddy_menu sof_buddyas the primary entry point into SoF Buddy.
- Docs: add http.png hero image to README.
- Internal menus: RMF layout and content pass across SoF Buddy tabs (main, input, lighting, perf, scaling, social, texture, tweaks, HTTP, update help/prompt), loading header, and HTTP providers; FS_LoadFile override and internal menu hooks refined.
- Menu docs: menu-know-how guidance and build/makefile tweaks.
- Windows updater UX polish: silenced noisy extractor stderr/stdout (
tar,7z, PowerShell fallback) inupdate_from_zip.cmdso successful fallback installs do not show misleading error spam.
- Windows updater launch fix: switched queued installer script path to Windows separators (
sof_buddy\update_from_zip.cmd) so post-exitcmd.exeexecution no longer misparses the script path on Win10/11.
- Windows updater path handling: canonicalized
%ZIP_PATH%to full absolute form before existence/extract checks, preventing malformed Wine path edge-cases. - VBScript fallback noise cleanup: removed a fragile redirection from
.vbsgeneration inupdate_from_zip.cmdto avoid spurious'2' is not recognizedconsole errors.
- Linux/Wine package completeness:
release_linux_wine.zipnow includesupdate_from_zip.cmdin CI packaging, matching the current auto-install launch path. - Windows updater script hardening: normalized relative zip paths to absolute/backslash form for extraction/deletion reliability under Wine cmd.
- Extraction command robustness:
update_from_zip.cmdnow callstar.exe/7z.exeexplicitly and hardens VBScript fallback temp-file creation +cscript.exeprobing.
- Misc tab UX: updated labels to show actual cvar names (matching Profiles tab style) for faster config auditing and copy/paste workflows.
- Wine/Proton updater downloads: runtime Wine detection now biases asset selection toward
release_linux_wine.zipduringsofbuddy_update download(non-XP builds). - Auto-install launch hardening: reverted Wine
/unixlaunch path and standardizedwinstartinstall command toupdate_from_zip.cmdto avoid repeatedInvalid Namedialogs fromstartwrapper parsing. - Installer scripts:
update_from_zip.cmdnow prefers non-PowerShell extractors first (tar,7z, VBScript) and uses PowerShell only as fallback. - Post-install cleanup: both Windows and Linux/Wine update scripts now delete the extracted zip on successful install to prevent
sof_buddy/update/accumulation.
- Updater install:
sofbuddy_update_installnow detects Wine (wine_get_version) and preferssof_buddy/update_from_zip.shunder Wine/Proton. - Shutdown launch path: Wine install commands are queued in
winstartas/unix "<script>" "<zip>", with fallback to.cmdwhen.shis unavailable. - Native Windows behavior remains unchanged (
update_from_zip.cmd) while still using directwinstartbuffer queueing.
- Updater install:
sofbuddy_update_installnow writes thewinstartcommand buffer directly (nostartcommand seeding), improving reliability for auto-install on shutdown. - Internal menus (480p safety): removed risky quoted flow-text lines and standardized long prose blocks to use left layout with inset spacing instead of centered long text.
- Update UX: update prompt/help copy/layout refreshed for auto-install-first flow (compact prompt sizing, solid background, clearer action text, trimmed obsolete manual-only text).
- SoF Buddy tabs: Network now shows only a white
Current mapbound tomapname; Social removed link-status/last-URL rows; Profiles button label simplified toApply Profile. - Menu docs:
menu-know-howguidance now explicitly recommends avoiding long prose under<center>and using left+inset for 480p.
- Updater: added
sofbuddy_update_installto queue install command through the enginewinstartpointer (0x40353C) and quit for fully automatic post-exit update flow. - Updater install targeting:
sofbuddy_update_installnow passes the exact_sofbuddy_update_download_pathzip intoupdate_from_zip.cmd, avoiding wrong-zip selection when multiple zips exist. - Internal menus: update prompt/help actions now support one-click download+install+exit flow.
- Build hygiene:
src/features/internal_menus/menu_data.cppis now ignored and untracked as generated output to avoid recurring dirty status.
- http_maps: when a map is downloaded/extracted, loading status stays at "HTTP Downloading..." (MAP PRESENT is only used when no HTTP download was needed).
- Core:
sofbuddy_list_featuresnow logs via PRINT_DEV instead of the normal console, keeping the feature listing in the dev log channel.
- Internal menus: startup update prompt now triggers on menu disclaimer (root
disclaimer) instead ofstart; README and docs use "menu disclaimer" naming.
- Internal menus (loading): engine loading UI is disabled via NOPs at exe 0x13AC7 (menu push) and 0x13ACE (SCR_UpdateScreen call); we push
loading/loadingand call SCR_UpdateScreen(true) in SCR_BeginLoadingPlaque Post hook. SCR_UpdateScreen at exe 0x15FA0. Additional 2-byte NOP at 0x13AAA so the plaque shows when the console is open. - Internal menus: Reconnect_f hooks removed; loading trigger is SCR_BeginLoadingPlaque only. M_PushMenu Pre simplified (start/update-prompt only). FS_LoadFile override and READMEs updated.
- Updater: default
_sofbuddy_update_check_startupis now enabled (1) so new installs check for updates on startup automatically.
- Build system: removed
http_mapsfromtools/generate_features_txt.pydefault-disabled set, somake/CI auto-generation no longer silently disables it infeatures/FEATURES.txt.
- HTTP maps: removed experimental/default-disabled note from docs; feature is now treated as normal.
- Updater: startup update prompt now pre-intercepts menu disclaimer (start menu) flow; redundant post-hook injection removed.
- Updater downloads: zip asset selection tightened for build target (Windows vs Windows XP, Linux/Wine fallback penalties), with stricter fallback filtering.
- Updater UX: selected/downloaded release asset filename is now printed via
PRINT_DEVand surfaced in update prompt/help menus.
- HTTP maps: reconnect-stage hook path added, frame/config handling tightened, and provider/update wiring refined.
- Internal menus: SoF Buddy RMF tab/content layout pass, loading screen variants added, and FS load override integrated.
- Update flow: update command and zip-update scripts hardened for Linux/Windows and compatibility glue cleaned up.
- Build/docs: detour registrations regenerated and feature READMEs/root docs refreshed.
- Internal menus: loading screen RMF consolidated (loading_recent/loading_status removed; loading, loading_files, loading_header reworked); SoF Buddy tabs (main, input, HTTP content) layout tweaks; internal_menus/menu_data/README cleanup.
- HTTP maps: code simplification and trim.
- Internal menus: SoF Buddy in-game tabs (main, input, lighting, perf, scaling, social, texture, tweaks), loading screens, RMF layout rework.
- HTTP maps: download/install maps from URLs; console progress; provider config.
- sofbuddy config file and update-from-zip flow (Linux/Windows scripts).
- Perf: reduced hook hot-path overhead and stutter.
- raw_mouse: keep engine cursor centering to avoid edge-of-screen issues.
- cbuf overflow bypass; internal_menus/http_maps/cbuf_limit_increase docs.
- SoF Buddy side-frame backfill centering fix; lighting blend null checks.