enBoxer/docs/MACROS.md
en 1ec8d78f71 Implement ISBoxer-style smart interact shortcut (bind: interact)
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.
2026-09-16 04:51:07 +02:00

122 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# In-game macros (no addon, retail-shaped)
enBoxer only sends keystrokes. Bind these in WoW on **every** account. **The example profile targets retail (The War Within era, 2026).** Forever is not out yet, so the macro set is whatever current retail uses. If Interact with Target is missing on a client, the loot map will not walk or loot until a later helper (not shipped).
Match keys to `game_binds` in the profile.
## Interact with Target (keybind, no macro needed)
In WoW: **Key Bindings → Targeting → Interact with Target**. Bind it on every account to the same key (the example uses **Alt+J**). enBoxer routes the keystroke to every captured slot — no macro needed.
> Do not bind Interact Target to a mouse button; that is unreliable while enBoxer is routing mouse clicks.
Turn **Auto Loot** on in-game so the corpse is looted when the alts arrive.
## Auto-Interact (the legacy "CTM")
"Click to Move" was removed in Warlords of Draenor (2014). What multibox guides still call CTM is the `autoInteract` CVar: when on, your character walks up to the target and interacts automatically instead of needing a separate walk + interact sequence. enBoxer turns it on for the duration of an interact/loot map and turns it off afterwards.
CVars are not keybindable, so these need to be macros.
**CTM On**`game_binds.ctm_on` (example Shift+F3):
```
/console autoInteract 1
```
**CTM Off**`game_binds.ctm_off` (example Shift+F4):
```
/console autoInteract 0
```
If `/console autoInteract` is rejected (some protected profiles, a SecureCVar-protected client), the equivalent is:
```
/run C_CVar.SetCVar("autoInteract", "1")
```
and `"0"` for off.
## Assist and Follow (per-character macros)
The example profile stores a default key under `game_binds.assist` and `game_binds.follow`, and **overrides them per character** under `characters[].assist_key` and `characters[].follow_key`. The override is what every account actually binds in-game (so swap-to-slot-N retargets the bind automatically).
Pick a different in-game macro **per character** that targets the leader's name. For a Main named Eisheth:
**Assist** — bind to whatever you set on the character:
```
/assist Eisheth
```
**Follow** — bind to whatever you set on the character:
```
/follow Eisheth
```
If you swap leaders, edit the `assist` / `follow` macros on each client to match the new main's name, or just swap which client is the leader.
Built-in keybinds `Targets → Assist Target` / `Follow Target` only assist or follow the **current target**, which is not what multiboxing wants when the alts need to name-target the main. That's why enBoxer ships the per-character macro override.
## Optional, class-dependent (in-game keybinds, no macro)
- **Pet Attack** — Key Bindings → Pet Actions → Attack. Useful for Hunter / Warlock / DK / Demon Hunter. Wire it through enBoxer with `game_binds.pet_attack`.
- **Target Last Target** — Key Bindings → Targeting → Target Last Target. Useful as a "retry" if the first interact was on cooldown. Wire it with `game_binds.target_last`.
Both are pure in-game keybinds; enBoxer just routes the keystroke.
## One loot press (the `loot` map)
1. Target the corpse or NPC on the primary.
2. Press the loot hotkey (example Alt+G). That key is consumed; the primary does not interact unless the map targets `current`.
3. Alts assist, Auto-Interact on, Interact with Target once, walk `walk_delay_ms`, interact or loot, Auto-Interact off.
4. enBoxer's `interact.style` controls how aggressively Auto-Interact stays on: `standard` (on, then off), `auto` (stays on after the press), `hold` (on while the hotkey is down, off on release).
Do not mash. A second interact while they are still pathing is how characters run circles.
If they stop short, raise `walk_delay_ms` (25004000), or use `interact.style: auto` (CTM stays on), or `interact.style: hold`.
## Smart interact shortcut (`bind: interact`)
The example profile's `loot` map (Alt+G) and `interact` map (Alt+I) both use a **smart shortcut**: a single user keypress fires the full chain (CTM on → Interact with Target → sleep `walk_delay_ms` → CTM off). It is what ISBoxer did with a "Mapped Key" — you press one key, the multibox software sends the whole chain.
In enBoxer the shortcut is `bind: interact` in a step:
```yaml
- name: loot
hotkey: "Alt+G"
steps:
- bind: assist
target: others
- bind: interact # <-- smart shortcut
target: others
```
The engine expands that one step at compile time. Driven by `profile.interact`:
| `interact.style` | What happens on the press | CTM after the press |
| ---------------- | ----------------------------------------------------------------------------------------- | --------------------- |
| `standard` | `ctm_on``interact` (`game_binds.interact`) → sleep `walk_delay_ms``ctm_off` | off |
| `auto` | `ctm_on``interact` | stays on (toggle off via `ctm_off` when you want) |
| `hold` | `ctm_on``interact` (Down); put `bind: ctm_off` in `release_steps` to turn it off on release | matches the hotkey down/up |
Walk distance and follower latency are absorbed by `walk_delay_ms` (default 2500 ms). If your alts stop short, raise it (25005000 ms is typical for indoor encounters).
If you need per-step control (different keys, branches, conditional delays), use the manual form:
```yaml
- name: loot_manual
hotkey: "Ctrl+Alt+G"
steps:
- bind: assist
- bind: ctm_on
- bind: interact
- delay_ms: 5000
- bind: ctm_off
```
Both forms are tested in `engine::tests`; see `interact_smart_shortcut_standard_emits_full_sequence`, `…_auto_emits_two_no_tail`, `…_hold_emits_press_only`, and `loot_manual` (which exercises the explicit chain).