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.
5.8 KiB
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)
- Target the corpse or NPC on the primary.
- Press the loot hotkey (example Alt+G). That key is consumed; the primary does not interact unless the map targets
current. - Alts assist, Auto-Interact on, Interact with Target once, walk
walk_delay_ms, interact or loot, Auto-Interact off. - enBoxer's
interact.stylecontrols 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:
- 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:
- 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).