Objective
Rewrite Twin Emperors tank behavior so swap pickup, side anchoring, reserve promotion, teleport-prep geometry, Vek'nilash orientation, and emergency split recovery are phase-driven and deterministic.
Why this exists
The local logs show the encounter failing exactly where tank control should be strongest.
Observed locally:
493 split_risk entries, all with reason=tank_swap_failure.
- Separation starts failing at
61 and drops as low as 17.
Heal Brother is repeatedly firing instead of being prevented:
17:00:00.504 SPELL_HEAL Emperor Vek'lor -> Emperor Vek'nilash "Heal Brother"
17:00:00.512 SPELL_HEAL Emperor Vek'nilash -> Emperor Vek'lor "Heal Brother"
17:00:56.309 SPELL_HEAL Emperor Vek'lor -> Emperor Vek'nilash "Heal Brother"
- Tank mechanics are happening during the collapse:
17:00:00.512 SPELL_DAMAGE Emperor Vek'nilash -> Rov "Uppercut"
- Current fallback behavior still allows ad hoc range-chasing and
MoveNear recovery instead of a strict anchor plan.
Current code hotspots
src/Ai/Raid/Aq40/Action/RaidAq40Actions_TwinEmperors.cpp
ResolveTwinPickupAnchor
Aq40TwinEmperorsHoldSplitAction
Aq40TwinEmperorsWarlockTankAction
StopTwinDamageOn
GetFarSidePosition
GetTwinRecoveryStepTowardAnchor
src/Ai/Raid/Aq40/Util/RaidAq40TwinEmperors.cpp
- melee recovery timers
- pickup anchor locking
kTwinTeleportWindowMs = 6000
src/Ai/Raid/Aq40/Util/RaidAq40Helpers.cpp
- tank executor / reserve resolution
- Current warlock pickup geometry already uses:
desiredRange = 24.0f
minRange = 19.0f
maxRange = 30.0f
but it is still too reactive and does not encode the intended pre-teleport ordering strongly enough.
Required implementation
- Make both tank roles explicitly phase-driven.
- During
TeleportWindow and PickupRecovery:
- primary warlock and primary melee tank must move to forced pickup anchors first
- threat generation or melee uptime starts only after the anchor step is satisfied or a clearly defined “in-position enough” rule is met
- Define reserve behavior explicitly:
- reserve tanks stay parked and do not improvise
- reserves are promoted only by encounter state, not by incidental aggro
- Add an encounter-wide emergency split recovery routine:
- trigger when separation enters urgent/terminal bands or
Heal Brother fires
- stop raid DPS on both bosses
- stop pets
- clear unsafe current targets
- force both tanks through re-separation routing until the split is stable again
- Replace
MoveNear as the primary tank recovery behavior. MoveNear should only survive as a last-resort fallback with logging that makes it obvious it was reached.
- Tie
Uppercut / Unbalancing Strike recovery directly into the tank state machine so recovery windows are explicit and compatible with emergency split recovery.
- Keep primary tank movement owner-exclusive while the tank is in a recovery phase.
Additional tank-positioning requirements
Vek'nilash side orientation
- The Vek'nilash tank should face the boss toward the wall so
Uppercut knockbacks send melee toward the room center instead of deeper into unsafe geometry.
- This facing/orientation rule should be part of the tank positioning contract, not an incidental side effect.
- If exact facing control is difficult, at minimum the selected tank anchor family should make the likely
Uppercut vector center-safe.
Vek'lor receiving side
- Shortly before teleport resolves, the designated warlock tank on the receiving side must move inward toward the melee tank.
- The goal is that when Vek'lor arrives, the warlock is the second closest valid unit and can immediately cast
Searing Pain.
- This movement must happen before Vek'lor arrives, not only after the swap has already completed.
- Backup warlocks must stay parked and must not drift into the receiving geometry.
Vek'nilash receiving side
- Shortly before teleport resolves, the designated melee tank on the receiving side must move inward so they are the closest valid unit when Vek'nilash arrives.
- That inward movement must still respect Vek'lor's Arcane Burst safety rules.
- Do not let the melee receiving tank solve this by simply standing too deep and eating Vek'lor danger range.
Implementation guidance
- Encode these as named Twin geometry rules or phase-specific anchor families instead of relying on generic “approach until in range” behavior.
- If current hardcoded distances (
24/19/30) are kept, wrap them in named constants that explain their role in teleport-prep geometry.
- If better geometry is found during implementation, keep the relative ordering contract:
- receiving melee tank is closest for Vek'nilash
- receiving warlock tank is second closest for Vek'lor
- Vek'lor safety band is still respected
Reference patterns
Validation
- Run at least 3 teleports with a supported Twin comp.
- Success criteria:
- no
split_risk
- no
heal_brother_terminal
- tanks re-establish both sides before ranged DPS resumes on Vek’lor
- primary tanks do not drift into
MoveNear as the normal recovery path
- receiving warlock is staged for immediate
Searing Pain on Vek'lor arrival
- receiving melee tank is closest for Vek'nilash arrival without violating Vek'lor safety spacing
- Vek'nilash tank orientation keeps
Uppercut knockback center-safe
- Additional test:
- induce
Uppercut / Unbalancing Strike pressure and confirm tanks recover without collapsing the split
Related
- Depends on
#2 phase and ownership work.
- Coordinate with
#6 so spell-driven events can trigger recovery at the right time.
- Coordinate with
#8 for the broader pre-pull / opener choreography.
Objective
Rewrite Twin Emperors tank behavior so swap pickup, side anchoring, reserve promotion, teleport-prep geometry, Vek'nilash orientation, and emergency split recovery are phase-driven and deterministic.
Why this exists
The local logs show the encounter failing exactly where tank control should be strongest.
Observed locally:
493split_riskentries, all withreason=tank_swap_failure.61and drops as low as17.Heal Brotheris repeatedly firing instead of being prevented:MoveNearrecovery instead of a strict anchor plan.Current code hotspots
src/Ai/Raid/Aq40/Action/RaidAq40Actions_TwinEmperors.cppResolveTwinPickupAnchorAq40TwinEmperorsHoldSplitActionAq40TwinEmperorsWarlockTankActionStopTwinDamageOnGetFarSidePositionGetTwinRecoveryStepTowardAnchorsrc/Ai/Raid/Aq40/Util/RaidAq40TwinEmperors.cppkTwinTeleportWindowMs = 6000src/Ai/Raid/Aq40/Util/RaidAq40Helpers.cppdesiredRange = 24.0fminRange = 19.0fmaxRange = 30.0fbut it is still too reactive and does not encode the intended pre-teleport ordering strongly enough.
Required implementation
TeleportWindowandPickupRecovery:Heal BrotherfiresMoveNearas the primary tank recovery behavior.MoveNearshould only survive as a last-resort fallback with logging that makes it obvious it was reached.Uppercut/Unbalancing Strikerecovery directly into the tank state machine so recovery windows are explicit and compatible with emergency split recovery.Additional tank-positioning requirements
Vek'nilash side orientation
Uppercutknockbacks send melee toward the room center instead of deeper into unsafe geometry.Uppercutvector center-safe.Vek'lor receiving side
Searing Pain.Vek'nilash receiving side
Implementation guidance
24/19/30) are kept, wrap them in named constants that explain their role in teleport-prep geometry.Reference patterns
#2363: ICC V2, Autogear BiS cmd mod-playerbots/mod-playerbots#2363Validation
split_riskheal_brother_terminalMoveNearas the normal recovery pathSearing Painon Vek'lor arrivalUppercutknockback center-safeUppercut/Unbalancing Strikepressure and confirm tanks recover without collapsing the splitRelated
#2phase and ownership work.#6so spell-driven events can trigger recovery at the right time.#8for the broader pre-pull / opener choreography.