diff --git a/scripts/talents/generate-talents.ts b/scripts/talents/generate-talents.ts index 6d7b8cf5b7b..c9371cce84c 100644 --- a/scripts/talents/generate-talents.ts +++ b/scripts/talents/generate-talents.ts @@ -22,7 +22,7 @@ import { TalentNode, } from './talent-tree-types'; -const LIVE_WOW_BUILD_NUMBER = '11.0.5.57171'; +const LIVE_WOW_BUILD_NUMBER = '11.0.5.57388'; const LIVE_TALENT_DATA_URL = 'https://www.raidbots.com/static/data/live/talents.json'; const LIVE_SPELLPOWER_DATA_URL = `https://wago.tools/db2/SpellPower/csv?build=${LIVE_WOW_BUILD_NUMBER}`; const PTR_WOW_BUILD_NUMBER = '11.0.2.55763'; diff --git a/src/CHANGELOG.tsx b/src/CHANGELOG.tsx index 59231d965a0..e3ad7fb3d65 100644 --- a/src/CHANGELOG.tsx +++ b/src/CHANGELOG.tsx @@ -40,6 +40,7 @@ import SpellLink from 'interface/SpellLink'; // prettier-ignore export default [ + change(date(2024, 11, 13), <>Updated common hunter spells and talents with script, Yellot), change(date(2024, 11, 10), <>Added , Yellot), change(date(2024, 11, 9), <>Added and , Yellot), change(date(2024, 10, 28), `Updated annotation list rendering for the annotation debugger`, Rzial), diff --git a/src/analysis/retail/hunter/marksmanship/CHANGELOG.tsx b/src/analysis/retail/hunter/marksmanship/CHANGELOG.tsx index dfda305f169..5ce67de1ecd 100644 --- a/src/analysis/retail/hunter/marksmanship/CHANGELOG.tsx +++ b/src/analysis/retail/hunter/marksmanship/CHANGELOG.tsx @@ -3,18 +3,22 @@ import { Arlie, emallson, Putro, Swolorno, ToppleTheNun, Trevor, Yellot } from ' import { ItemLink, SpellLink } from 'interface'; import TALENTS from 'common/TALENTS/hunter'; import ITEMS from 'common/ITEMS'; +import SPELLS from 'common/SPELLS'; export default [ + change(date(2024, 11, 13), 'Updated tier set', Yellot), change(date(2024, 11, 10), 'Enable Marksmanship again for usage', Yellot), - change(date(2024, 11, 10), 'Added Black Arrow, Wailing Arrow and Fort of Bear', Yellot), + change(date(2024, 11, 10), <>Added , and , Yellot), change(date(2024, 11, 10), 'Updated some constants values to match TWW 11.05', Yellot), change(date(2024, 11, 10), 'Removed DeathChakrams, Murder of crows, Steel trap', Yellot), change(date(2023, 10, 24), <>Add buff to the timeline., Putro), + change(date(2023, 10, 3), <>Add Steel Trap Talent as a trackable talent., Putro), change(date(2023, 7, 3), 'Update SpellLink usage.', ToppleTheNun), change(date(2023, 6, 4), <>Add module to hunter, Trevor), change(date(2023, 5, 9), <>Added support for T29 tier sets, Swolorno), change(date(2023, 1, 30), 'Fixed a crashing bug in the Checklist due to a no-longer generated statistic.', emallson), change(date(2023, 1, 30), <>Updated to be 2.5 seconds per 50 focus as of 10.0.5., Putro), change(date(2023, 1, 30), <>Added tracking to module., Putro), + change(date(2023, 1, 30), <>Fixed an issue with Serpent Sting Talent when combined with resulting in incorrect warnings about refreshing., Putro), change(date(2022, 12, 23), 'Enable Marksmanship for Dragonflight analysis', Putro), change(date(2022, 11, 11), 'Initial transition of Marksmanship to Dragonflight', [Arlie, Putro]), ]; diff --git a/src/analysis/retail/hunter/marksmanship/CombatLogParser.ts b/src/analysis/retail/hunter/marksmanship/CombatLogParser.ts index 4da866d4767..dc8beebeeb3 100644 --- a/src/analysis/retail/hunter/marksmanship/CombatLogParser.ts +++ b/src/analysis/retail/hunter/marksmanship/CombatLogParser.ts @@ -26,7 +26,6 @@ import GlobalCooldown from './modules/core/GlobalCooldown'; import SpellUsable from './modules/core/SpellUsable'; import AlwaysBeCasting from './modules/features/AlwaysBeCasting'; import CooldownThroughputTracker from './modules/features/CooldownThroughputTracker'; -import EagletalonsTrueFocus from './modules/talents/EagletalonsTrueFocus'; import SerpentstalkersTrickery from './modules/talents/SerpentstalkersTrickery'; import SurgingShots from './modules/talents/SurgingShots'; import Focus from './modules/resources/Focus'; @@ -49,8 +48,8 @@ import Streamline from './modules/talents/Streamline'; import Volley from './modules/talents/Volley'; import AimedShotPrepullNormalizer from './normalizers/AimedShotPrepullNormalizer'; import Deathblow from './modules/talents/Deathblow'; -import T29MMTier2P from './modules/items/T29MMTier2P'; -import T29MMTier4P from './modules/items/T29MMTier4P'; +import MMTier2P from './modules/items/MMTier2P'; +import MMTier4P from './modules/items/MMTier4P'; import FoundationGuide from 'interface/guide/foundation/FoundationGuide'; import OvinaxMercurialEgg from 'parser/retail/modules/items/thewarwithin/trinkets/OvinaxMercurialEgg'; import MadQueensMandate from 'parser/retail/modules/items/thewarwithin/trinkets/MadQueensMandate'; @@ -110,7 +109,6 @@ class CombatLogParser extends CoreCombatLogParser { deathblow: Deathblow, surgingShots: SurgingShots, serpentstalkersTrickery: SerpentstalkersTrickery, - eagletalonsTrueFocus: EagletalonsTrueFocus, //Shared Talents rejuvenatingWind: RejuvenatingWind, @@ -125,8 +123,8 @@ class CombatLogParser extends CoreCombatLogParser { blackArrow: BlackArrow, // items - t292p: T29MMTier2P, - t294p: T29MMTier4P, + mmTier2P: MMTier2P, + mmTier4P: MMTier4P, ovinaxMercurialEgg: OvinaxMercurialEgg, madQueensMandate: MadQueensMandate, skardynsGrace: SkardynsGrace, diff --git a/src/analysis/retail/hunter/marksmanship/modules/checklist/Module.tsx b/src/analysis/retail/hunter/marksmanship/modules/checklist/Module.tsx index 9b5bc6cc9fc..7007c20f044 100644 --- a/src/analysis/retail/hunter/marksmanship/modules/checklist/Module.tsx +++ b/src/analysis/retail/hunter/marksmanship/modules/checklist/Module.tsx @@ -9,6 +9,8 @@ import BaseChecklist from 'parser/shared/modules/features/Checklist/Module'; import AlwaysBeCasting from '../features/AlwaysBeCasting'; import Component from './Component'; +import MMTier2P from '../items/MMTier2P'; +import MMTier4P from '../items/MMTier4P'; class Checklist extends BaseChecklist { static dependencies = { @@ -35,6 +37,9 @@ class Checklist extends BaseChecklist { focusGeneratorDetails: FocusDetails, focusCapTracker: FocusCapTracker, //endregion + + mmTier2P: MMTier2P, + mmTier4P: MMTier4P, }; //region Core diff --git a/src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier2P.tsx b/src/analysis/retail/hunter/marksmanship/modules/items/MMTier2P.tsx similarity index 52% rename from src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier2P.tsx rename to src/analysis/retail/hunter/marksmanship/modules/items/MMTier2P.tsx index 4638fb0988a..1a3eae728a3 100644 --- a/src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier2P.tsx +++ b/src/analysis/retail/hunter/marksmanship/modules/items/MMTier2P.tsx @@ -8,27 +8,35 @@ import ItemDamageDone from 'parser/ui/ItemDamageDone'; import Events, { DamageEvent } from 'parser/core/Events'; /** - * Arcane Shot and Multi-Shot critical hits cause your next Aimed Shot to cause the target to bleed for 40% of damage dealt over 6 sec. + * Arcane Shot and Multi-Shot damage increased by 20% */ -export default class T29MMTier2P extends Analyzer { +export default class MMTier2P extends Analyzer { totalDamage: number = 0; constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has2PieceByTier(TIERS.DF1); + this.active = this.selectedCombatant.has2PieceByTier(TIERS.TWW1); this.addEventListener( - Events.damage.by(SELECTED_PLAYER).spell(SPELLS.HIT_THE_MARK), - this.onHitTheMarkDamage, + Events.damage.by(SELECTED_PLAYER).spell(SPELLS.ARCANE_SHOT), + this.onArcaneShotDamage, ); + this.addEventListener( + Events.damage.by(SELECTED_PLAYER).spell(SPELLS.MULTISHOT_MM), + this.onArcaneShotDamage, + ); + } + + onArcaneShotDamage(event: DamageEvent) { + this.totalDamage += event.amount + event.amount * 0.2 + (event.absorbed || 0); } - onHitTheMarkDamage(event: DamageEvent) { - this.totalDamage += event.amount + (event.absorbed || 0); + onMultishotDamage(event: DamageEvent) { + this.totalDamage += event.amount + event.amount * 0.2 + (event.absorbed || 0); } statistic() { return ( - + diff --git a/src/analysis/retail/hunter/marksmanship/modules/items/MMTier4P.tsx b/src/analysis/retail/hunter/marksmanship/modules/items/MMTier4P.tsx new file mode 100644 index 00000000000..c4938b9aa19 --- /dev/null +++ b/src/analysis/retail/hunter/marksmanship/modules/items/MMTier4P.tsx @@ -0,0 +1,54 @@ +import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; +import { TIERS } from 'game/TIERS'; +import Statistic from 'parser/ui/Statistic'; +import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; +import SPELLS from 'common/SPELLS'; +import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; +import ItemDamageDone from 'parser/ui/ItemDamageDone'; +import Events, { DamageEvent } from 'parser/core/Events'; +import { TALENTS_HUNTER } from 'common/TALENTS'; + +/** + * Consuming Precise Shot increases the damage of your next Aimed Shot by 20% + */ +export default class MMTier4P extends Analyzer { + totalDamage: number = 0; + buffNextAimedShot = false; + + constructor(options: Options) { + super(options); + this.active = this.selectedCombatant.has4PieceByTier(TIERS.TWW1); + this.addEventListener( + Events.removebuff.by(SELECTED_PLAYER).spell(SPELLS.PRECISE_SHOTS), + this.onPreciseShotConsumed, + ); + this.addEventListener( + Events.damage.by(SELECTED_PLAYER).spell(TALENTS_HUNTER.AIMED_SHOT_TALENT), + this.onAimedShotDamage, + ); + } + + // Increase Aimed Shot damage if precise shot buff was consumed + onAimedShotDamage(event: DamageEvent) { + if (this.buffNextAimedShot) { + this.totalDamage += event.amount + event.amount * 0.2 + (event.absorbed || 0); + this.buffNextAimedShot = false; + } + } + + //On Consumption of this buff, increase damage of next aimed shot + onPreciseShotConsumed() { + this.buffNextAimedShot = true; + } + + statistic() { + return ( + + + +
+
+
+ ); + } +} diff --git a/src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier4P.tsx b/src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier4P.tsx deleted file mode 100644 index c03740d1689..00000000000 --- a/src/analysis/retail/hunter/marksmanship/modules/items/T29MMTier4P.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import { TIERS } from 'game/TIERS'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import SPELLS from 'common/SPELLS'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import ItemDamageDone from 'parser/ui/ItemDamageDone'; -import Events, { DamageEvent } from 'parser/core/Events'; -import { calculateEffectiveDamageFromCritIncrease } from 'parser/core/EventCalculateLib'; -import StatTracker from 'parser/shared/modules/StatTracker'; -import { formatNumber } from 'common/format'; -/** - * Focusing Aim increases critical strike chance by 100% - */ -const FOCUSING_AIM_CRIT_CHANCE_INCREASE = 1; -/** - * Ranged auto-attacks have a 15% chance to increase the critical strike chance of your next Arcane Shot or Multi-Shot by 100%. - */ -export default class T29MMTier4P extends Analyzer { - static dependencies = { - statTracker: StatTracker, - }; - - totalDamage: number = 0; - totalProcs: number = 0; - - protected statTracker!: StatTracker; - - constructor(options: Options) { - super(options); - this.active = this.selectedCombatant.has4PieceByTier(TIERS.DF1); - this.addEventListener( - Events.damage.by(SELECTED_PLAYER).spell([SPELLS.ARCANE_SHOT, SPELLS.MULTISHOT_MM]), - this.onShotDamage, - ); - this.addEventListener(Events.applybuff.by(SELECTED_PLAYER).spell(SPELLS.FOCUSING_AIM), () => { - this.totalProcs += 1; - }); - } - - onShotDamage(event: DamageEvent) { - if (!this.hasFocusingAim(event)) { - return; - } - const effectiveDamgeFromCritIncrease = calculateEffectiveDamageFromCritIncrease( - event, - this.statTracker.currentCritPercentage, - FOCUSING_AIM_CRIT_CHANCE_INCREASE, - ); - - this.totalDamage += effectiveDamgeFromCritIncrease; - } - - private hasFocusingAim(event: DamageEvent) { - return this.selectedCombatant.hasBuff(SPELLS.FOCUSING_AIM.id, event.timestamp); - } - - statistic() { - return ( - - - -
- {formatNumber(this.totalProcs)} procs -
-
- ); - } -} diff --git a/src/analysis/retail/hunter/marksmanship/modules/spells/PreciseShots.tsx b/src/analysis/retail/hunter/marksmanship/modules/spells/PreciseShots.tsx index 5cc3cdc5902..29a62e43457 100644 --- a/src/analysis/retail/hunter/marksmanship/modules/spells/PreciseShots.tsx +++ b/src/analysis/retail/hunter/marksmanship/modules/spells/PreciseShots.tsx @@ -31,7 +31,7 @@ class PreciseShots extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.hasTalent(TALENTS_HUNTER.PRECISE_SHOTS_TALENT); + this.active = this.selectedCombatant.hasTalent(TALENTS_HUNTER.PRECISE_SHOT_TALENT); this.addEventListener( Events.applybuff.by(SELECTED_PLAYER).spell(SPELLS.PRECISE_SHOTS), this.onPreciseShotsApplication, diff --git a/src/analysis/retail/hunter/marksmanship/modules/talents/EagletalonsTrueFocus.tsx b/src/analysis/retail/hunter/marksmanship/modules/talents/EagletalonsTrueFocus.tsx deleted file mode 100644 index ea1de9c0e3c..00000000000 --- a/src/analysis/retail/hunter/marksmanship/modules/talents/EagletalonsTrueFocus.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { - EAGLETALONS_TRUE_FOCUS_COST_REDUCTION, - EAGLETALONS_TRUE_FOCUS_TRUESHOT_DURATION_INCREASE, -} from 'analysis/retail/hunter/marksmanship/constants'; -import { formatNumber } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import TALENTS from 'common/TALENTS/hunter'; -import RESOURCE_TYPES from 'game/RESOURCE_TYPES'; -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import Events, { CastEvent } from 'parser/core/Events'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -/** - * Trueshot lasts an additional 3.0 sec and reduces the Focus cost of all of your abilities by 25%. - * - * https://www.warcraftlogs.com/reports/M9N7LfPBgZXyAFqT#fight=9&type=damage-done&source=15 - */ - -class EagletalonsTrueFocus extends Analyzer { - focusSaved: number = 0; - trueshotDurationIncrease: number = 0; - - constructor(options: Options) { - super(options); - this.active = this.selectedCombatant.hasTalent(TALENTS.EAGLETALONS_TRUE_FOCUS_TALENT); - this.addEventListener(Events.cast.by(SELECTED_PLAYER), this.onCast); - this.addEventListener( - Events.cast.by(SELECTED_PLAYER).spell(SPELLS.TRUESHOT), - this.onTrueshotCast, - ); - } - - onCast(event: CastEvent) { - if (!this.selectedCombatant.hasBuff(SPELLS.TRUESHOT.id)) { - return; - } - const resource = event.classResources?.find( - (resource) => resource.type === RESOURCE_TYPES.FOCUS.id, - ); - if (!resource) { - return; - } - this.focusSaved += Math.floor(resource.cost * EAGLETALONS_TRUE_FOCUS_COST_REDUCTION) || 0; - } - - onTrueshotCast() { - this.trueshotDurationIncrease += EAGLETALONS_TRUE_FOCUS_TRUESHOT_DURATION_INCREASE; - } - - statistic() { - return ( - - - {formatNumber(this.focusSaved)} Focus saved -
- {formatNumber(this.trueshotDurationIncrease / 1000)}s{' '} - Trueshot Duration increase -
-
- ); - } -} - -export default EagletalonsTrueFocus; diff --git a/src/common/SPELLS/hunter.ts b/src/common/SPELLS/hunter.ts index 34ada5155ec..6ca8acaad35 100644 --- a/src/common/SPELLS/hunter.ts +++ b/src/common/SPELLS/hunter.ts @@ -707,6 +707,21 @@ const spells = { name: 'T30 4P', icon: 'ability_druid_ferociousbite', }, + + //TWW Lightless 2p + TWW_LIGHTLESS_2P_MM: { + id: 453648, + name: 'Hunter MM Lightless 2 Piece Set', + icon: 'trade_engineering', + }, + + //TWW Lightless 4p + TWW_LIGHTLESS_4P_MM: { + id: 453650, + name: 'Hunter MM Lightless 4 Piece Set', + icon: 'trade_engineering', + }, + //endregion } satisfies Record; diff --git a/src/common/TALENTS/hunter.ts b/src/common/TALENTS/hunter.ts index 72500f7c8fa..cb122418311 100644 --- a/src/common/TALENTS/hunter.ts +++ b/src/common/TALENTS/hunter.ts @@ -46,6 +46,22 @@ const talents = { entryIds: [126414], definitionIds: [{ id: 131240, specId: 253 }], }, + BANSHEES_MARK_TALENT: { + id: 467902, + name: "Banshee's Mark", + icon: 'achievement_leader_sylvanas', + maxRanks: 1, + entryIds: [117554], + definitionIds: [{ id: 122566, specId: 254 }], + }, + BARBED_SCALES_TALENT: { + id: 469880, + name: 'Barbed Scales', + icon: 'inv_misc_scales_stonygreen', + maxRanks: 1, + entryIds: [126418], + definitionIds: [{ id: 131244, specId: 253 }], + }, BARBED_SHOT_TALENT: { id: 217200, name: 'Barbed Shot', @@ -131,13 +147,28 @@ const talents = { definitionIds: [{ id: 131282, specId: 255 }], }, BLACK_ARROW_TALENT: { - id: 430703, + id: 466932, name: 'Black Arrow', icon: 'inv_ability_darkrangerhunter_blackarrow', maxRanks: 1, entryIds: [117584], definitionIds: [{ id: 122596, specId: 254 }], - focusCost: 10, + }, + BLEAK_ARROWS_TALENT: { + id: 467749, + name: 'Bleak Arrows', + icon: 'inv_quiver_1h_mawraid_d_01', + maxRanks: 1, + entryIds: [117558], + definitionIds: [{ id: 122570, specId: 254 }], + }, + BLEAK_POWDER_TALENT: { + id: 467911, + name: 'Bleak Powder', + icon: 'inv_misc_powder_tin', + maxRanks: 1, + entryIds: [117571], + definitionIds: [{ id: 122583, specId: 254 }], }, BLOODSEEKER_TALENT: { id: 260248, @@ -234,8 +265,8 @@ const talents = { name: 'Calling the Shots', icon: 'ability_hunter_assassinate', maxRanks: 1, - entryIds: [126386], - definitionIds: [{ id: 131212, specId: 254 }], + entryIds: [126372], + definitionIds: [{ id: 131198, specId: 254 }], }, CALL_OF_THE_WILD_TALENT: { id: 359844, @@ -283,8 +314,8 @@ const talents = { name: 'Cobra Senses', icon: 'ability_hunter_cobrastrikes', maxRanks: 1, - entryIds: [126418], - definitionIds: [{ id: 131244, specId: 253 }], + entryIds: [128265], + definitionIds: [{ id: 133072, specId: 253 }], }, COBRA_SHOT_TALENT: { id: 193455, @@ -370,14 +401,6 @@ const talents = { entryIds: [117564], definitionIds: [{ id: 122576, specId: 255 }], }, - DARKNESS_CALLS_TALENT: { - id: 430722, - name: 'Darkness Calls', - icon: 'spell_shadow_twilight', - maxRanks: 1, - entryIds: [117571], - definitionIds: [{ id: 122583, specId: 254 }], - }, DARK_CHAINS_TALENT: { id: 430712, name: 'Dark Chains', @@ -386,14 +409,6 @@ const talents = { entryIds: [117557], definitionIds: [{ id: 122569, specId: 254 }], }, - DARK_EMPOWERMENT_TALENT: { - id: 430718, - name: 'Dark Empowerment', - icon: 'inv_artifact_powerofthedarkside', - maxRanks: 1, - entryIds: [117583], - definitionIds: [{ id: 122595, specId: 254 }], - }, DEADLY_DUO_TALENT: { id: 378962, name: 'Deadly Duo', @@ -403,20 +418,12 @@ const talents = { definitionIds: [{ id: 131170, specId: 255 }], }, DEATHBLOW_TALENT: { - id: 378769, + id: 343248, name: 'Deathblow', icon: 'ability_hunter_runningshot', maxRanks: 1, - entryIds: [126365], - definitionIds: [{ id: 131191, specId: 254 }], - }, - DEATH_SHADE_TALENT: { - id: 430711, - name: 'Death Shade', - icon: 'ability_demonhunter_darkness', - maxRanks: 1, - entryIds: [117565], - definitionIds: [{ id: 122577, specId: 254 }], + entryIds: [126474], + definitionIds: [{ id: 131300, specId: 255 }], }, DEN_RECOVERY_TALENT: { id: 445710, @@ -474,13 +481,13 @@ const talents = { entryIds: [117586], definitionIds: [{ id: 122598, specId: 255 }], }, - EAGLETALONS_TRUE_FOCUS_TALENT: { - id: 389449, - name: "Eagletalon's True Focus", - icon: 'ability_hunter_aspectoftheironhawk', + EBON_BOWSTRING_TALENT: { + id: 467897, + name: 'Ebon Bowstring', + icon: 'inv_10_tailoring_craftingoptionalreagent_enhancedspellthread_color4', maxRanks: 1, - entryIds: [126366], - definitionIds: [{ id: 131192, specId: 254 }], + entryIds: [123780], + definitionIds: [{ id: 128618, specId: 254 }], }, EMBRACE_THE_SHADOWS_TALENT: { id: 430704, @@ -636,14 +643,6 @@ const talents = { entryIds: [126419], definitionIds: [{ id: 131245, specId: 253 }], }, - GRAVE_REAPER_TALENT: { - id: 430719, - name: 'Grave Reaper', - icon: 'inv_misc_2h_farmscythe_a_01', - maxRanks: 1, - entryIds: [123780], - definitionIds: [{ id: 128618, specId: 254 }], - }, GRENADE_JUGGLER_TALENT: { id: 459843, name: 'Grenade Juggler', @@ -724,21 +723,13 @@ const talents = { entryIds: [126829], definitionIds: [{ id: 131656, specId: 255 }], }, - IMPROVED_KILL_COMMAND_TALENT: { - id: 378010, - name: 'Improved Kill Command', - icon: 'ability_hunter_pet_goto', - maxRanks: 1, - entryIds: [126406], - definitionIds: [{ id: 131232, specId: 253 }], - }, - IMPROVED_KILL_SHOT_TALENT: { - id: 343248, - name: 'Improved Kill Shot', - icon: 'ability_hunter_snipertraining', + IMPROVED_DEATHBLOW_TALENT: { + id: 378769, + name: 'Improved Deathblow', + icon: 'ability_hunter_runningshot', maxRanks: 1, - entryIds: [126474], - definitionIds: [{ id: 131300, specId: 255 }], + entryIds: [126365], + definitionIds: [{ id: 131191, specId: 254 }], }, IMPROVED_STEADY_SHOT_TALENT: { id: 321018, @@ -890,14 +881,6 @@ const talents = { entryIds: [126491], definitionIds: [{ id: 131317, specId: 255 }], }, - KINDRED_SPIRITS_TALENT: { - id: 56315, - name: 'Kindred Spirits', - icon: 'ability_hunter_separationanxiety', - maxRanks: 2, - entryIds: [126421], - definitionIds: [{ id: 131247, specId: 253 }], - }, KODO_TRANQUILIZER_TALENT: { id: 459983, name: 'Kodo Tranquilizer', @@ -906,6 +889,14 @@ const talents = { entryIds: [126480], definitionIds: [{ id: 131306, specId: 255 }], }, + KINDRED_SPIRITS_TALENT: { + id: 56315, + name: 'Kindred Spirits', + icon: 'ability_hunter_separationanxiety', + maxRanks: 2, + entryIds: [126421], + definitionIds: [{ id: 131247, specId: 253 }], + }, LACERATION_TALENT: { id: 459552, name: 'Laceration', @@ -986,9 +977,9 @@ const talents = { entryIds: [126356], definitionIds: [{ id: 131182, specId: 254 }], }, - MERCILESS_BLOWS_TALENT: { + MERCILESS_BLOW_TALENT: { id: 459868, - name: 'Merciless Blows', + name: 'Merciless Blow', icon: 'ability_hunter_swiftstrike', maxRanks: 1, entryIds: [126327], @@ -1056,7 +1047,7 @@ const talents = { NIGHT_HUNTER_TALENT: { id: 378766, name: 'Night Hunter', - icon: 'ability_hunter_sentinelowl', + icon: 'artifactability_balancedruid_fullmoon', maxRanks: 1, entryIds: [126381], definitionIds: [{ id: 131207, specId: 254 }], @@ -1077,14 +1068,6 @@ const talents = { entryIds: [126329], definitionIds: [{ id: 131155, specId: 255 }], }, - OVERSHADOW_TALENT: { - id: 430716, - name: 'Overshadow', - icon: 'ability_piercedamage', - maxRanks: 1, - entryIds: [117558], - definitionIds: [{ id: 122570, specId: 254 }], - }, OVERWATCH_TALENT: { id: 450384, name: 'Overwatch', @@ -1141,6 +1124,14 @@ const talents = { entryIds: [126391], definitionIds: [{ id: 131217, specId: 254 }], }, + PHANTOM_PAIN_TALENT: { + id: 467941, + name: 'Phantom Pain', + icon: 'spell_holy_painsupression', + maxRanks: 1, + entryIds: [117583], + definitionIds: [{ id: 122595, specId: 254 }], + }, PIERCING_FANGS_TALENT: { id: 392053, name: 'Piercing Fangs', @@ -1149,6 +1140,14 @@ const talents = { entryIds: [126434], definitionIds: [{ id: 131260, specId: 253 }], }, + PIN_CUSHION_TALENT: { + id: 468392, + name: 'Pin Cushion', + icon: 'ability_hunter_snipershot', + maxRanks: 1, + entryIds: [128222], + definitionIds: [{ id: 133029, specId: 254 }], + }, POSTHASTE_TALENT: { id: 109215, name: 'Posthaste', @@ -1157,9 +1156,9 @@ const talents = { entryIds: [126475], definitionIds: [{ id: 131301, specId: 255 }], }, - PRECISE_SHOTS_TALENT: { + PRECISE_SHOT_TALENT: { id: 260240, - name: 'Precise Shots', + name: 'Precise Shot', icon: 'ability_hunter_snipertraining', maxRanks: 1, entryIds: [126354], @@ -1186,8 +1185,8 @@ const talents = { name: 'Ranger', icon: 'ability_hunter_thrillofthehunt', maxRanks: 1, - entryIds: [126348], - definitionIds: [{ id: 131174, specId: 255 }], + entryIds: [126315], + definitionIds: [{ id: 131141, specId: 255 }], }, RAPID_FIRE_BARRAGE_TALENT: { id: 459800, @@ -1263,10 +1262,10 @@ const talents = { definitionIds: [{ id: 131295, specId: 255 }], }, RUTHLESS_MARAUDER_TALENT: { - id: 385718, + id: 470068, name: 'Ruthless Marauder', icon: 'ability_rogue_findweakness', - maxRanks: 2, + maxRanks: 1, entryIds: [126321], definitionIds: [{ id: 131147, specId: 255 }], }, @@ -1346,7 +1345,7 @@ const talents = { SENTINEL_TALENT: { id: 450369, name: 'Sentinel', - icon: 'inv_magicalowlbearmount', + icon: 'ability_hunter_sentinelowl', maxRanks: 1, entryIds: [117573], definitionIds: [{ id: 122585, specId: 255 }], @@ -1359,6 +1358,14 @@ const talents = { entryIds: [117567], definitionIds: [{ id: 122579, specId: 255 }], }, + SERPENTINE_RHYTHM_TALENT: { + id: 468701, + name: 'Serpentine Rhythm', + icon: 'spell_nature_poisoncleansingtotem', + maxRanks: 1, + entryIds: [126421], + definitionIds: [{ id: 131247, specId: 253 }], + }, SERPENTSTALKERS_TRICKERY_TALENT: { id: 378888, name: "Serpentstalker's Trickery", @@ -1375,13 +1382,13 @@ const talents = { entryIds: [126447], definitionIds: [{ id: 131273, specId: 255 }], }, - SHADOW_ERASURE_TALENT: { - id: 430720, - name: 'Shadow Erasure', - icon: 'ability_warlock_everlastingaffliction', + SHADOW_DAGGER_TALENT: { + id: 467741, + name: 'Shadow Dagger', + icon: 'ability_throw', maxRanks: 1, - entryIds: [123778], - definitionIds: [{ id: 128616, specId: 254 }], + entryIds: [128219], + definitionIds: [{ id: 133026, specId: 254 }], }, SHADOW_HOUNDS_TALENT: { id: 430707, @@ -1391,18 +1398,10 @@ const talents = { entryIds: [117580], definitionIds: [{ id: 122592, specId: 254 }], }, - SHADOW_LASH_TALENT: { - id: 430717, - name: 'Shadow Lash', - icon: 'inv_misc_volatileshadow', - maxRanks: 1, - entryIds: [117554], - definitionIds: [{ id: 122566, specId: 254 }], - }, SHADOW_SURGE_TALENT: { - id: 430714, + id: 467936, name: 'Shadow Surge', - icon: 'ability_socererking_forcenova', + icon: 'ability_warlock_eradication', maxRanks: 1, entryIds: [117579], definitionIds: [{ id: 122591, specId: 254 }], @@ -1447,6 +1446,22 @@ const talents = { entryIds: [123779], definitionIds: [{ id: 128617, specId: 254 }], }, + SNAKESKIN_QUIVER_TALENT: { + id: 468695, + name: 'Snakeskin Quiver', + icon: 'inv_quiver_1h_hunter_c_01_green', + maxRanks: 1, + entryIds: [126406], + definitionIds: [{ id: 131232, specId: 253 }], + }, + SOUL_DRINKER_TALENT: { + id: 469638, + name: 'Soul Drinker', + icon: 'ability_warlock_soulsiphon', + maxRanks: 1, + entryIds: [128238], + definitionIds: [{ id: 133045, specId: 254 }], + }, SPEARHEAD_TALENT: { id: 360966, name: 'Spearhead', @@ -1572,8 +1587,8 @@ const talents = { name: 'Terms of Engagement', icon: 'ability_hunter_harpoon', maxRanks: 1, - entryIds: [126315], - definitionIds: [{ id: 131141, specId: 255 }], + entryIds: [126348], + definitionIds: [{ id: 131174, specId: 255 }], }, TERRITORIAL_INSTINCTS_TALENT: { id: 459507, @@ -1583,6 +1598,14 @@ const talents = { entryIds: [126458], definitionIds: [{ id: 131284, specId: 255 }], }, + THE_BELL_TOLLS_TALENT: { + id: 467644, + name: 'The Bell Tolls', + icon: 'spell_shadow_animatedead', + maxRanks: 1, + entryIds: [117565], + definitionIds: [{ id: 122577, specId: 254 }], + }, THRILL_OF_THE_HUNT_TALENT: { id: 257944, name: 'Thrill of the Hunt', @@ -1619,7 +1642,7 @@ const talents = { id: 378209, name: 'Training Expert', icon: 'spell_hunter_adaptation', - maxRanks: 2, + maxRanks: 1, entryIds: [126410], definitionIds: [{ id: 131236, specId: 253 }], }, @@ -1660,8 +1683,8 @@ const talents = { name: 'Unerring Vision', icon: 'spell_hunter_exoticmunitions_frozen', maxRanks: 1, - entryIds: [126372], - definitionIds: [{ id: 131198, specId: 254 }], + entryIds: [126386], + definitionIds: [{ id: 131212, specId: 254 }], }, UNNATURAL_CAUSES_TALENT: { id: 459527, @@ -1777,7 +1800,7 @@ const talents = { definitionIds: [{ id: 131227, specId: 253 }], }, WITHERING_FIRE_TALENT: { - id: 430715, + id: 466990, name: 'Withering Fire', icon: 'spell_shadow_painspike', maxRanks: 1,