Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
trevorm4 committed Oct 23, 2024
1 parent 18b943c commit ddf6e0b
Show file tree
Hide file tree
Showing 33 changed files with 202 additions and 227 deletions.
1 change: 1 addition & 0 deletions src/analysis/retail/monk/mistweaver/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Trevor, Vetyst, Vohrr } from 'CONTRIBUTORS';
import SpellLink from 'interface/SpellLink';

export default [
change(date (2024, 10, 22), <>Update MW for 11.0.5</>, Trevor),
change(date (2024, 10, 13), <>Add <SpellLink spell={TALENTS_MONK.ASPECT_OF_HARMONY_TALENT}/> guide section</>, Trevor),
change(date (2024, 10, 12), <>Added an average healing per cast metric to the <SpellLink spell={TALENTS_MONK.REVIVAL_TALENT}/> healing breakdown statistic.</>, Vohrr),
change(date (2024, 10, 12), <>Fix an issue with <SpellLink spell={TALENTS_MONK.UPLIFTED_SPIRITS_TALENT}/> and updated to include additional <SpellLink spell={SPELLS.GUSTS_OF_MISTS}/> healing.</>, Vohrr),
Expand Down
2 changes: 1 addition & 1 deletion src/analysis/retail/monk/mistweaver/CONFIG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const config: Config = {
contributors: [Trevor, Vohrr],
branch: GameBranch.Retail,
// The WoW client patch this spec was last updated.
patchCompatibility: '11.0.2',
patchCompatibility: '11.0.5',
supportLevel: SupportLevel.MaintainedFull,
// Explain the status of this spec's analysis here. Try to mention how complete it is, and perhaps show links to places users can learn more.
// If this spec's analysis does not show a complete picture please mention this in the `<Warning>` component.
Expand Down
2 changes: 0 additions & 2 deletions src/analysis/retail/monk/mistweaver/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import MistweaverHealingEfficiencyDetails from './modules/features/MistweaverHea
import HealingEfficiencyTracker from './modules/features/MistweaverHealingEfficiencyTracker';
import REMGraph from './modules/features/REMGraph';
import JadeBond from './modules/spells/JadeBond';
import NourishingChi from './modules/spells/NourishingChi';
import RisingSunRevival from './modules/spells/UpliftedSpirits';
import JadefireStompHealing from './modules/spells/JadefireStompHealing';
import AncientTeachings from './modules/spells/AncientTeachings';
Expand Down Expand Up @@ -164,7 +163,6 @@ class CombatLogParser extends CoreCombatLogParser {
manaTeaSources: ManaTeaSources,
mistsOfLife: MistsOfLife,
mistyPeaks: MistyPeaks,
nourishingCh: NourishingChi,
refreshingJadeWind: RefreshingJadeWind,
renewingMist: RenewingMist,
renewingMistDuringManaTea: RenewingMistDuringManaTea,
Expand Down
5 changes: 3 additions & 2 deletions src/analysis/retail/monk/mistweaver/Guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import AplChoiceDescription from './modules/core/apl/AplChoiceDescription';
import { AplSectionData } from 'interface/guide/components/Apl';
import { defaultExplainers } from 'interface/guide/components/Apl/violations/claims';
import { filterCelestial } from './modules/core/apl/ExplainCelestial';
import { getCurrentRSKTalent } from './constants';

const explainers = {
overcast: filterCelestial(defaultExplainers.overcastFillers),
Expand All @@ -30,7 +31,7 @@ export default function Guide({ modules, events, info }: GuideProps<typeof Comba
modules.risingSunKick.guideSubsection}
{modules.thunderFocusTea.guideSubsection}
{modules.vivify.guideSubsection}
{info.combatant.hasTalent(TALENTS_MONK.ANCIENT_TEACHINGS_TALENT) &&
{info.combatant.hasTalent(TALENTS_MONK.JADEFIRE_TEACHINGS_TALENT) &&
modules.ancientTeachings.guideSubsection}
{info.combatant.hasTalent(TALENTS_MONK.SHEILUNS_GIFT_TALENT) && (
<SheilunsGraph modules={modules} events={events} info={info} />
Expand Down Expand Up @@ -111,7 +112,7 @@ function RemGraphSubsection({ modules, events, info }: GuideProps<typeof CombatL
</strong>{' '}
- this graph shows how many <SpellLink spell={TALENTS_MONK.RENEWING_MIST_TALENT} /> you have
over the course of the fight in relation to your{' '}
<SpellLink spell={TALENTS_MONK.RISING_SUN_KICK_TALENT} /> and{' '}
<SpellLink spell={getCurrentRSKTalent(info.combatant)} /> and{' '}
<SpellLink spell={SPELLS.VIVIFY} /> casts.
{modules.remGraph.plot}
</SubSection>
Expand Down
16 changes: 16 additions & 0 deletions src/analysis/retail/monk/mistweaver/constants.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import SPELLS from 'common/SPELLS';
import Spell from 'common/SPELLS/Spell';
import { TALENTS_MONK } from 'common/TALENTS';
import { Talent } from 'common/TALENTS/types';
import Combatant from 'parser/core/Combatant';
export const ABILITIES_AFFECTED_BY_HEALING_INCREASES = [
// Spells
TALENTS_MONK.ENVELOPING_MIST_TALENT.id,
Expand Down Expand Up @@ -49,6 +52,7 @@ export const ABILITIES_AFFECTED_BY_HEALING_INCREASES = [
export const THUNDER_FOCUS_TEA_SPELLS = [
SPELLS.VIVIFY,
TALENTS_MONK.RISING_SUN_KICK_TALENT,
TALENTS_MONK.RUSHING_WIND_KICK_TALENT,
TALENTS_MONK.ENVELOPING_MIST_TALENT,
TALENTS_MONK.RENEWING_MIST_TALENT,
SPELLS.EXPEL_HARM,
Expand Down Expand Up @@ -150,3 +154,15 @@ export const SPELL_COLORS = {
ALTERNATE_GUST_OF_MIST: '#7f7f7f',
ZEN_PULSE: '#c6f4f5',
};

export function getCurrentRSKTalent(player: Combatant): Talent {
return player.hasTalent(TALENTS_MONK.RUSHING_WIND_KICK_TALENT)
? TALENTS_MONK.RUSHING_WIND_KICK_TALENT
: TALENTS_MONK.RISING_SUN_KICK_TALENT;
}

export function getCurrentRSKTalentDamage(player: Combatant): Spell {
return player.hasTalent(TALENTS_MONK.RUSHING_WIND_KICK_TALENT)
? SPELLS.RUSHING_WIND_KICK_DAMAGE
: SPELLS.RUSHING_WIND_KICK_DAMAGE;
}
29 changes: 24 additions & 5 deletions src/analysis/retail/monk/mistweaver/modules/core/apl/AplCheck.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,16 @@ const BLACKOUT_KICK = {
spell: SPELLS.BLACKOUT_KICK,
condition: cnd.optionalRule(
cnd.describe(
cnd.spellCooldownRemaining(talents.RISING_SUN_KICK_TALENT, { atLeast: 3500, atMost: 12000 }),
cnd.or(
cnd.spellCooldownRemaining(talents.RISING_SUN_KICK_TALENT, {
atLeast: 3500,
atMost: 12000,
}),
cnd.spellCooldownRemaining(talents.RUSHING_WIND_KICK_TALENT, {
atLeast: 3500,
atMost: 12000,
}),
),
(tense) => (
<>
<SpellLink spell={talents.RISING_SUN_KICK_TALENT} /> has more than half its cooldown
Expand All @@ -87,7 +96,17 @@ const commonTop = [
},
{
spell: talents.RISING_SUN_KICK_TALENT,
condition: cnd.hasTalent(TALENTS_MONK.RISING_MIST_TALENT),
condition: cnd.and(
cnd.hasTalent(TALENTS_MONK.RISING_MIST_TALENT),
cnd.not(cnd.hasTalent(TALENTS_MONK.RUSHING_WIND_KICK_TALENT)),
),
},
{
spell: talents.RUSHING_WIND_KICK_TALENT,
condition: cnd.and(
cnd.hasTalent(TALENTS_MONK.RISING_MIST_TALENT),
cnd.hasTalent(TALENTS_MONK.RUSHING_WIND_KICK_TALENT),
),
},
{
spell: talents.RENEWING_MIST_TALENT,
Expand All @@ -96,7 +115,7 @@ const commonTop = [
];

const commonBottom = [talents.CHI_WAVE_TALENT];
const atMissingCondition = cnd.buffMissing(talents.ANCIENT_TEACHINGS_TALENT, {
const atMissingCondition = cnd.buffMissing(talents.JADEFIRE_TEACHINGS_TALENT, {
duration: 15000,
timeRemaining: 1500,
});
Expand Down Expand Up @@ -143,15 +162,15 @@ export enum MistweaverApl {

export const chooseApl = (info: PlayerInfo): MistweaverApl => {
if (
info.combatant.hasTalent(talents.ANCIENT_TEACHINGS_TALENT) &&
info.combatant.hasTalent(talents.JADEFIRE_TEACHINGS_TALENT) &&
info.combatant.hasTalent(talents.RISING_MIST_TALENT) &&
info.combatant.hasTalent(talents.SHAOHAOS_LESSONS_TALENT) &&
info.combatant.hasTalent(talents.INVOKERS_DELIGHT_TALENT)
) {
return MistweaverApl.RisingMistAncientTeachingsShaohaos;
} else if (
info.combatant.hasTalent(talents.AWAKENED_JADEFIRE_TALENT) &&
info.combatant.hasTalent(talents.ANCIENT_TEACHINGS_TALENT)
info.combatant.hasTalent(talents.JADEFIRE_TEACHINGS_TALENT)
) {
return MistweaverApl.AwakenedFaeline;
} else if (info.combatant.hasTalent(TALENTS_MONK.TEAR_OF_MORNING_TALENT)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const aplTitle = (choice: MistweaverApl) => {
return (
<>
<SpellLink spell={talents.RISING_MIST_TALENT} /> /{' '}
<SpellLink spell={talents.ANCIENT_TEACHINGS_TALENT} /> /{' '}
<SpellLink spell={talents.JADEFIRE_TEACHINGS_TALENT} /> /{' '}
<SpellLink spell={talents.SHAOHAOS_LESSONS_TALENT} />
</>
);
Expand Down Expand Up @@ -43,7 +43,7 @@ const AncientTeachingsDescription = () => {
<>
to heal by using your damaging abilities (<SpellLink spell={talents.RISING_SUN_KICK_TALENT} />
, <SpellLink spell={SPELLS.BLACKOUT_KICK} />, and <SpellLink spell={SPELLS.TIGER_PALM} />) via{' '}
<SpellLink spell={talents.ANCIENT_TEACHINGS_TALENT} />.
<SpellLink spell={talents.JADEFIRE_TEACHINGS_TALENT} />.
</>
);
};
Expand Down Expand Up @@ -77,12 +77,12 @@ const RisingMistAncientTeachingsShaohaosDescription = () => {
</p>
<p>
When playing <SpellLink spell={talents.RISING_MIST_TALENT} /> and{' '}
<SpellLink spell={talents.ANCIENT_TEACHINGS_TALENT} /> with{' '}
<SpellLink spell={talents.JADEFIRE_TEACHINGS_TALENT} /> with{' '}
<SpellLink spell={talents.SHAOHAOS_LESSONS_TALENT} />, you cast{' '}
<SpellLink spell={talents.RENEWING_MIST_TALENT} /> and{' '}
<SpellLink spell={talents.RISING_SUN_KICK_TALENT} /> as often as possible, and cast{' '}
<SpellLink spell={talents.JADEFIRE_STOMP_TALENT} /> as often as necessary to maintain the{' '}
<SpellLink spell={talents.ANCIENT_TEACHINGS_TALENT} /> buff. <ShaohaosDescription />
<SpellLink spell={talents.JADEFIRE_TEACHINGS_TALENT} /> buff. <ShaohaosDescription />
<ThunderFocusTeaREM />
</p>
</>
Expand Down
14 changes: 14 additions & 0 deletions src/analysis/retail/monk/mistweaver/modules/features/Abilities.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,20 @@ class Abilities extends CoreAbilities {
},
timelineSortIndex: 100,
},
{
spell: TALENTS_MONK.RUSHING_WIND_KICK_TALENT.id,
category: combatant.hasTalent(TALENTS_MONK.RISING_MIST_TALENT)
? SPELL_CATEGORY.ROTATIONAL
: SPELL_CATEGORY.HEALER_DAMAGING_SPELL,
cooldown: (haste: number) => 12 / (1 + haste),
gcd: {
base: 1500,
},
castEfficiency: {
suggestion: combatant.hasTalent(TALENTS_MONK.RUSHING_WIND_KICK_TALENT),
},
timelineSortIndex: 100,
},
{
spell: SPELLS.SPINNING_CRANE_KICK.id,
category: SPELL_CATEGORY.HEALER_DAMAGING_SPELL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import Events, {
} from 'parser/core/Events';
import { ThresholdStyle, When } from 'parser/core/ParseResults';
import CoreAlwaysBeCastingHealing from 'parser/shared/modules/AlwaysBeCastingHealing';
import { getCurrentRSKTalent } from '../../constants';

class AlwaysBeCasting extends CoreAlwaysBeCastingHealing {
HEALING_ABILITIES_ON_GCD: number[] = [
Expand All @@ -35,10 +36,11 @@ class AlwaysBeCasting extends CoreAlwaysBeCastingHealing {
if (this.selectedCombatant.hasTalent(TALENTS_MONK.RISING_MIST_TALENT)) {
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RISING_SUN_KICK_TALENT.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.RISING_SUN_KICK_DAMAGE.id);
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RUSHING_WIND_KICK_TALENT.id);
}
if (
this.selectedCombatant.hasTalent(TALENTS_MONK.COURAGE_OF_THE_WHITE_TIGER_TALENT) ||
this.selectedCombatant.hasTalent(TALENTS_MONK.ANCIENT_TEACHINGS_TALENT)
this.selectedCombatant.hasTalent(TALENTS_MONK.JADEFIRE_TEACHINGS_TALENT)
) {
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.TIGER_PALM.id);
}
Expand All @@ -49,10 +51,11 @@ class AlwaysBeCasting extends CoreAlwaysBeCastingHealing {
);
this.addEventListener(Events.death.to(SELECTED_PLAYER_PET), this.handleChijiDeath);
}
if (this.selectedCombatant.hasTalent(TALENTS_MONK.ANCIENT_TEACHINGS_TALENT)) {
if (this.selectedCombatant.hasTalent(TALENTS_MONK.JADEFIRE_TEACHINGS_TALENT)) {
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RISING_SUN_KICK_TALENT.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.RISING_SUN_KICK_DAMAGE.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.BLACKOUT_KICK.id);
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RUSHING_WIND_KICK_TALENT.id);
}
if (this.selectedCombatant.hasTalent(TALENTS_MONK.AWAKENED_JADEFIRE_TALENT)) {
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.SPINNING_CRANE_KICK.id);
Expand All @@ -67,6 +70,7 @@ class AlwaysBeCasting extends CoreAlwaysBeCastingHealing {
handleChijiStart(event: CastEvent) {
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.TIGER_PALM.id);
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RISING_SUN_KICK_TALENT.id);
this.HEALING_ABILITIES_ON_GCD.push(TALENTS_MONK.RUSHING_WIND_KICK_TALENT.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.RISING_SUN_KICK_DAMAGE.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.BLACKOUT_KICK.id);
this.HEALING_ABILITIES_ON_GCD.push(SPELLS.SPINNING_CRANE_KICK.id);
Expand All @@ -75,7 +79,9 @@ class AlwaysBeCasting extends CoreAlwaysBeCastingHealing {

handleChijiDeath(event: DeathEvent) {
const tpSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(SPELLS.TIGER_PALM.id);
const rskSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(TALENTS_MONK.RISING_SUN_KICK_TALENT.id);
const rskSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(
getCurrentRSKTalent(this.selectedCombatant).id,
);
const rskTwoSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(SPELLS.RISING_SUN_KICK_DAMAGE.id);
const bokSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(SPELLS.BLACKOUT_KICK.id);
const sckSpot = this.HEALING_ABILITIES_ON_GCD.indexOf(SPELLS.SPINNING_CRANE_KICK.id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class MistweaverHealingEfficiencyDetails extends HealingEfficiencyDetails {
<>
<SpellLink spell={SPELLS.GUSTS_OF_MISTS} /> healing is added to the appropriate spell
that caused the gust. <br />
{this.selectedCombatant.hasTalent(TALENTS_MONK.ANCIENT_TEACHINGS_TALENT) && (
{this.selectedCombatant.hasTalent(TALENTS_MONK.RISING_MIST_TALENT) && (
<>
<SpellLink spell={TALENTS_MONK.ANCIENT_TEACHINGS_TALENT} /> is given to{' '}
<SpellLink spell={TALENTS_MONK.RISING_MIST_TALENT} /> is given to{' '}
<SpellLink spell={TALENTS_MONK.JADEFIRE_STOMP_TALENT} /> since it is the spell that
applied the buff. <br />
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,10 @@ class MistweaverHealingEfficiencyTracker extends HealingEfficiencyTracker {
spellInfo = this.getVivifyDetails(spellInfo);
} else if (spellId === TALENTS_MONK.REFRESHING_JADE_WIND_TALENT.id) {
spellInfo = this.getRefreshingJadeWindDetails(spellInfo);
} else if (spellId === TALENTS_MONK.RISING_SUN_KICK_TALENT.id) {
} else if (
spellId === TALENTS_MONK.RISING_SUN_KICK_TALENT.id ||
spellId === TALENTS_MONK.RUSHING_WIND_KICK_TALENT.id
) {
spellInfo = this.getRisingSunKickDetails(spellInfo);
} else if (spellId === TALENTS_MONK.INVOKE_YULON_THE_JADE_SERPENT_TALENT.id) {
spellInfo = this.getYulonDetails(spellInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import BaseChart, { formatTime } from 'parser/ui/BaseChart';
import Panel from 'parser/ui/Panel';
import { VisualizationSpec } from 'react-vega';
import AutoSizer from 'react-virtualized-auto-sizer';
import { SPELL_COLORS } from '../../constants';
import { getCurrentRSKTalent, SPELL_COLORS } from '../../constants';

type SpellTracker = {
timestamp: number;
Expand All @@ -26,7 +26,7 @@ class REMGraph extends Analyzer {
super(options);
this.addEventListener(Events.cast.by(SELECTED_PLAYER).spell(SPELLS.VIVIFY), this.vivifyCast);
this.addEventListener(
Events.cast.by(SELECTED_PLAYER).spell(TALENTS_MONK.RISING_SUN_KICK_TALENT),
Events.cast.by(SELECTED_PLAYER).spell(getCurrentRSKTalent(this.selectedCombatant)),
this.rskCast,
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class TalentHealingStatistic extends Analyzer {
if (this.selectedCombatant.hasTalent(TALENTS_MONK.LEGACY_OF_WISDOM_TALENT)) {
talentList.push(this.legacyOfWisdom.subStatistic());
}
if (this.selectedCombatant.hasTalent(TALENTS_MONK.ANCIENT_TEACHINGS_TALENT)) {
if (this.selectedCombatant.hasTalent(TALENTS_MONK.RISING_MIST_TALENT)) {
talentList.push(this.ancientTeachings.talentHealingStatistic());
}
if (this.selectedCombatant.hasTalent(TALENTS_MONK.JADEFIRE_STOMP_TALENT)) {
Expand Down
Loading

0 comments on commit ddf6e0b

Please sign in to comment.