A step with bind: interact now expands at compile time into the full chain
(CTM on -> Interact with Target -> sleep walk_delay_ms -> CTM off), driven
by profile.interact (style + walk_delay_ms). One user keypress, four
keystrokes dispatched to every captured slot.
Styles:
- standard (default): chain runs, CTM ends off
- auto: chain runs, CTM stays on (toggle via ctm_off later)
- hold: press fires CTM-on + Alt+J; bind: ctm_off in
release_steps to fire it on hotkey release
Example loot (Alt+G) and interact (Alt+I) maps now use the shortcut. A
loot_manual map (Ctrl+Alt+G) exercises the explicit chain for users who
want per-step control.
92/92 unit tests pass; clippy clean. New tests:
- interact_smart_shortcut_standard_emits_full_sequence
- interact_smart_shortcut_auto_emits_two_no_tail
- interact_smart_shortcut_hold_emits_press_only
Docs: MACROS.md (new Smart interact shortcut section with style table),
NOTES.md callout, examples/profile.yaml comments, CHANGELOG.md entry.
2.4 KiB
Notes (WoW + Hyprland)
Interact with Target
The game bind does what a right-click on the current target would do: attack, loot, gossip. With Auto-Interact (autoInteract CVar), the character faces and walks to the target. They stop if the interact happens. They do not stop if they miss. Spamming the bind makes them circle. That is the game, not a timer in enBoxer.
Walking is the client. walk_delay_ms only holds Auto-Interact on long enough to arrive, then turns it off so a stray click does not send people running.
The example binds Interact with Target to Alt+J on every account; see docs/MACROS.md.
Styles:
| Style | Auto-Interact | Interact with Target |
|---|---|---|
| standard | on, then off after the delay | once |
| auto | left on | once |
| hold | on while the hotkey is down | on press; off on release |
Macros: docs/MACROS.md.
Hyprland 0.56
Lua dispatchers. Example:
hl.dispatch(hl.dsp.send_shortcut({ window = "address:0x…", mods = "ALT", key = "g" }))
hl.dispatch(hl.dsp.send_key_state({ window = "address:0x…", mods = "", key = "e", state = "down" }))
hl.bind("ALT + G", function() … end, { description = "enboxer:loot" })
Binds exist only while a managed game window or an enboxer-vfx overlay is focused.
enBoxer does not start XWayland. Hyprland already runs it. Wine WoW is almost always an XWayland window (xwayland: true in hyprctl clients). Keys go in through XWayland as normal X key events — the same path as a keyboard from the game’s point of view, not a memory inject.
If a window is native Wayland (including winewayland), unfocused inject often does nothing. For those, enBoxer focuses the window, sends the key, then restores focus.
The Session page lists each window as XWayland/Wine or Wayland.
Visible-pixel capture: grim (default). Overlay: mpv --wayland-app-id=enboxer-vfx plus JSON IPC to reload frames. Covered sources use zwlr_export_dmabuf_unstable_v1 (Hyprland implements the wlroots protocol); gated behind ENBOXER_ENABLE_TOPLEVEL=1. See docs/VIDEO.md.
Smart interact shortcut
bind: interact in any map step expands at compile time into the full chain
(CTM on → Interact with Target → walk delay → CTM off), driven by
profile.interact (style + walk_delay_ms). This is the ISBoxer Mapped
Key analog — one user keypress, four keystrokes dispatched to every captured
slot. See docs/MACROS.md for the per-style table and the manual form.