5.9 KiB
WoW Killing Spree player and companion parity — 2026-10-04
Implemented behavior
Player and generated Rogue companions now share the timed Killing Spree window in src/game/wow335RogueKillingSpreeRuntime.ts and the owner-keyed scheduler in src/game/combatStore.ts. The local 51690 data gives the aura a 500-ms interval, a 2,000-ms duration, and SPELL_ATTR5_EXTRA_INITIAL_PERIOD; the modeled assaults therefore occur at cast time and at +500, +1,000, +1,500, and +2,000 ms. Each owner's window records its own target pool, weapon snapshots, and cooldown-backed ability identity. Irregular simulation advances process each due assault at its scheduled timestamp.
Both paths capture targets once when the cast starts. The player captures living, positioned targets in the local 10-yard area; party Rogue selection captures engaged targets in that range with line of sight. Later arrivals do not join the window. At each assault, dead, missing, stealthed, or invisible targets are pruned, then the simulator selects from the remaining list with replacement. Selection is deterministic and seeded for repeatable local combat; the historical script uses random selection.
The linked 61851 aura applies +20% damage for the two-second window. The simulator retains it through the scheduled final assault at exactly +2,000 ms, then removes it before the advance returns. An internal +1-ms expiration allowance preserves that event ordering without leaving the damage bonus available to subsequent actions at the boundary. Player pulses update GameStore relocation; companion pulses queue a one-shot combat relocation that PartyPopulation applies to the actor and snaps to a nearby navigation surface when one is available.
The companion AI can select its learned Combat Rogue action through the narrow rotation-semantics exception for local WoW progression spell 51690. Cooldowns remain attached to the casting actor. Windows are canceled with their owner's damage aura when the player dies or resets, or when a companion dies or leaves the party roster. A missing or invalid target is pruned independently and does not cancel the other actor's window.
Evidence and authority
The static spell data inspected is the read-only snapshot at ../wow-pvt-server-backups-2/build/bin/RelWithDebInfo/data/dbc/Spell.dbc; HealerMan's generated local catalog identifies 51690 as the Combat Rogue talent at talent-2076. In that DBC, 51690 has the 500-ms periodic dummy effect, 2-second duration, 10-yard hostile selection, and extra initial period. Linked spell 61851 is AuraType 79 (SPELL_AURA_MOD_DAMAGE_PERCENT_DONE) with 20 base points and all schools. The backup SQL row ../wow-pvt-server-backups-2/azerothcore-wotlk/data/sql/base/db_world/spell_linked_spell.sql links 51690 to 61851; spell_script_names.sql binds 51690 to spell_rog_killing_spree.
The corresponding backup script is ../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/scripts/Spells/spell_rogue.cpp (Killing Spree aura and spell scripts around lines 304–420). It adds the initial spell-area targets to the aura script, applies the linked damage buff, and on each periodic callback chooses a retained target at random, removes invalid/stealth/invisible targets, casts teleport spell 57840, and triggers weapon damage spell 57841. Its target list is not expanded as later mobs arrive. FilterTargets rejects an empty list, vehicle use, and rooted casters, and removes existing auras marked for cast or spell-attack interruption before the spell proceeds. HandleRemove removes linked 61851.
This source is a local AzerothCore-derived server snapshot and includes fork-specific comments/behavior; it is evidence for that snapshot, not a claim about pristine stock AzerothCore or Blizzard server code. Extending the script's ToPlayer() teleport assumption to generated NPCs is HealerMan simulator behavior.
Known simulator approximations and gaps
- The local simulator snapshots one hit per equipped hand per pulse and uses its existing weapon/AP estimate. It records hand-specific child identifiers 57841/57842, but it does not reproduce every triggered-child damage, proc, and combat-roll detail from the server's spell chain. Exact damage parity is not claimed.
- Target choice is stable seeded selection instead of the script's random choice. Party target capture also restricts the pool to engaged hostiles, matching HealerMan's companion encounter policy rather than asserting server-equivalent NPC targeting.
- The server invokes spell 57840 for teleport. The simulator approximates the result as 1.5 yards behind target orientation (or caster-facing fallback); companion landings additionally use HealerMan navigation-surface snapping. Exact teleport coordinates and collision behavior are not claimed.
- The source script's explicit interruption handling removes pre-existing auras with cast/spell-attack interrupt flags before the cast. The available 61851 data and script do not establish a separate stun or movement cancellation rule for the two-second periodic aura, so this simulator does not invent one. The precise semantics of control effects during the active window remain unverified.
The earlier Killing Spree audit documents the prior immediate-player-strike gap; this parity note supersedes that section with the current shared timed implementation while retaining its original audit history.
Validation
npx vitest run src/game/wow335RogueMechanics.test.ts src/game/partyRuntime.test.ts src/game/partyRuntimeRegistry.test.ts passed 71 tests. Coverage includes cast-time versus later target arrival, immediate and irregularly caught-up ticks, the boosted final pulse before aura removal, player relocation, companion-owned targets/cooldowns/relocation, and player death/reset plus companion removal cleanup. Ready-five and the combined application build/release checks are left to the parent task's final integration pass.