bind: "interact" now resolves to game_binds.interact (Alt+J) only — a single keystroke. The full ISBoxer-style chain (CTM on -> Alt+J -> sleep walk_delay_ms -> CTM off) lives at bind: "smart_interact". Fixes the doubling bug Grok flagged: bind: "interact" previously expanded into the full chain unconditionally, so the loot_manual and interact_hold example maps fired ctm_on/ctm_off twice and produced unwanted sleep delays. - engine.rs: rename shortcut trigger (was: "interact") - examples/profile.yaml: loot now uses smart_interact; loot_manual and interact_hold keep "interact" as a single Alt+J send - docs/MACROS.md: heading + shortcut comment - docs/NOTES.md: trigger name - Add new test: interact_simple_sends_only_alt_j (1-line single-send) - Existing smart shortcut tests renamed to bind: smart_interact - CHANGELOG.md: trigger split note 93/93 cargo test pass; clippy clean.
48 lines
2.5 KiB
Markdown
48 lines
2.5 KiB
Markdown
# 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:
|
||
|
||
```lua
|
||
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](VIDEO.md).
|
||
|
||
## Smart interact shortcut
|
||
|
||
`bind: smart_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.
|