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.
122 lines
5.8 KiB
Markdown
122 lines
5.8 KiB
Markdown
# 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` (2500–4000), 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 (2500–5000 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).
|
||
|