diff --git a/engine/class_modules/monk/sc_monk.cpp b/engine/class_modules/monk/sc_monk.cpp index c27e5f6e49d..cfe6bda6ae1 100644 --- a/engine/class_modules/monk/sc_monk.cpp +++ b/engine/class_modules/monk/sc_monk.cpp @@ -106,7 +106,6 @@ void monk_action_t::apply_buff_effects() */ // Monk - parse_effects( p()->buff.fatal_touch ); // Brewmaster parse_effects( p()->buff.blackout_combo ); @@ -133,6 +132,7 @@ void monk_action_t::apply_buff_effects() parse_effects( p()->buff.press_the_advantage ); parse_effects( p()->buff.combo_breaker, affect_list_t( 1, 2, 3 ).remove_spell( p()->talent.windwalker.teachings_of_the_monastery_blackout_kick->id() ) ); + parse_effects( p()->buff.zenith ); // Conduit of the Celestials parse_effects( p()->buff.heart_of_the_jade_serpent_cdr, @@ -150,8 +150,6 @@ void monk_action_t::apply_buff_effects() parse_effects( p()->buff.balanced_stratagem_magic, CONSUME_BUFF ); // Shado-Pan - parse_effects( p()->buff.wisdom_of_the_wall_crit ); - parse_effects( p()->buff.vigilant_watch ); // TWW S1 Set Effects parse_effects( @@ -660,35 +658,6 @@ struct flurry_strikes_t : public monk_melee_attack_t if ( last_used + 10 * 150_ms < sim->current_time() ) set_recent_trigger( false ); - if ( p()->talent.shado_pan.wisdom_of_the_wall->ok() ) - { - flurry_strikes_counter++; - - if ( flurry_strikes_counter >= flurry_strikes_threshold ) - { - flurry_strikes_counter -= flurry_strikes_threshold; - - // Draw new card - const auto card = wisdom_buff_e( deck->trigger() ); - switch ( card ) - { - case WISDOM_OF_THE_WALL_CRIT: - p()->buff.wisdom_of_the_wall_crit->trigger(); - break; - case WISDOM_OF_THE_WALL_DODGE: - p()->buff.wisdom_of_the_wall_dodge->trigger(); - break; - case WISDOM_OF_THE_WALL_MASTERY: - p()->buff.wisdom_of_the_wall_mastery->trigger(); - break; - default: - assert( false ); - } - } - } - - p()->buff.against_all_odds->trigger(); - if ( auto target_data = p()->get_target_data( s->target ); target_data ) target_data->debuff.high_impact->trigger(); } @@ -754,10 +723,6 @@ struct flurry_strikes_t : public monk_melee_attack_t for ( int charge = 1; charge <= stacks; charge++ ) make_event( *sim, p(), strike, p()->target, charge * 150_ms ); - if ( stacks && p()->buff.vigilant_watch->check() ) - make_event( *sim, p(), stacks * 150_ms + 1_ms, - [ & ] { p()->buff.vigilant_watch->expire(); } ); - if ( source_default ) p()->buff.flurry_charge->expire(); @@ -1407,7 +1372,6 @@ struct blackout_kick_t : overwhelming_force_tresult ) ) return; - p()->buff.vigilant_watch->trigger(); p()->buff.tigers_ferocity->trigger(); if ( p()->buff.combo_breaker->up() ) @@ -1470,59 +1434,6 @@ struct blackout_kick_t : overwhelming_force_t - struct impact_t : base_action_t - { - fotrc_source_e source; - - template - impact_t( monk_t *player, Args &&...args ) : base_action_t( player, std::forward( args )... ) - { - source = source_effect; - base_action_t::background = true; - base_action_t::aoe = - as( player->talent.conduit_of_the_celestials.flight_of_the_red_crane->effectN( 1 ).base_value() ); - - if constexpr ( std::is_same_v ) - base_action_t::target = player; - } - - void execute() override - { - base_action_t::execute(); - - if ( source == BASE ) - base_action_t::p()->buff.inner_compass_crane_stance->trigger(); - - if constexpr ( trigger_buff == TRIGGER_BUFF ) - base_action_t::p()->buff.flight_of_the_red_crane->trigger(); - } - }; - - flight_of_the_red_crane_t( monk_t *player ) : conduit_of_the_celestials_container_t( player ) - { - base = new impact_t( - player, "flight_of_the_red_crane_dmg", player->talent.conduit_of_the_celestials.flight_of_the_red_crane_dmg ); - celestial = new impact_t( - player, "flight_of_the_red_crane_dmg_celestial", - player->talent.conduit_of_the_celestials.flight_of_the_red_crane_celestial_dmg ); - } -}; - struct rushing_jade_wind_t : public monk_melee_attack_t { buff_t *buff; @@ -2025,9 +1936,6 @@ struct strike_of_the_windlord_t : public monk_melee_attack_t if ( result_is_hit( oh_attack->execute_state->result ) ) mh_attack->execute(); - if ( p()->talent.windwalker.rushing_jade_wind->ok() ) - p()->buff.rushing_jade_wind->trigger(); - p()->buff.tigers_ferocity->trigger(); p()->buff.heart_of_the_jade_serpent_cdr->trigger(); @@ -2333,7 +2241,6 @@ struct touch_of_death_t : public monk_melee_attack_t monk_melee_attack_t::execute(); p()->buff.touch_of_death_ww->trigger(); - p()->buff.fatal_touch->trigger(); } void impact( action_state_t *s ) override @@ -3326,7 +3233,7 @@ struct courage_of_the_white_tiger_t : conduit_of_the_celestials_container_t struct xuen_spell_t : public monk_spell_t { xuen_spell_t( monk_t *p, std::string_view options_str ) - : monk_spell_t( p, "invoke_xuen_the_white_tiger", p->talent.windwalker.invoke_xuen_the_white_tiger ) + : monk_spell_t( p, "invoke_xuen_the_white_tiger", p->talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger ) { parse_options( options_str ); @@ -3352,7 +3259,7 @@ struct xuen_spell_t : public monk_spell_t } } - p()->pets.xuen.spawn( p()->talent.windwalker.invoke_xuen_the_white_tiger->duration(), 1 ); + p()->pets.xuen.spawn( p()->talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger->duration(), 1 ); p()->buff.invoke_xuen->trigger(); @@ -3360,9 +3267,6 @@ struct xuen_spell_t : public monk_spell_t p()->buff.flurry_of_xuen->trigger(); p()->buff.courage_of_the_white_tiger->trigger(); - - if ( p()->talent.monk.summon_white_tiger_statue->ok() ) - p()->pets.white_tiger_statue.spawn( p()->talent.monk.summon_white_tiger_statue_npc->duration(), 1 ); } }; @@ -3651,6 +3555,24 @@ struct jadefire_stomp_t : public monk_spell_t damage->execute_on_target( s->target ); } }; + +struct zenith_t : public monk_spell_t +{ + zenith_t( monk_t *player, std::string_view options_str ) + : monk_spell_t( player, "zenith", player->talent.windwalker.zenith ) + { + parse_options( options_str ); + } + + void execute() override + { + monk_spell_t::execute(); + + p()->buff.zenith->trigger(); + p()->cooldown.rising_sun_kick->reset( true ); + p()->resource_gain( RESOURCE_CHI, data().effectN( 9 ).base_value(), p()->gain.zenith ); + } +}; } // namespace spells namespace heals @@ -4647,12 +4569,6 @@ monk_td_t::monk_td_t( player_t *target, monk_t *p ) : actor_target_data_t( targe ->set_trigger_spell( p->talent.shado_pan.high_impact ) ->set_quiet( true ); - debuff.veterans_eye = make_buff_fallback( p->talent.shado_pan.veterans_eye->ok(), *this, "veterans_eye_debuff", - p->talent.shado_pan.veterans_eye_debuff ) - ->set_trigger_spell( p->talent.shado_pan.veterans_eye ) - ->set_refresh_behavior( buff_refresh_behavior::DURATION ) - ->set_quiet( true ); - dot.breath_of_fire = target->get_dot( "breath_of_fire_dot", p ); dot.crackling_jade_lightning_aoe = target->get_dot( "crackling_jade_lightning_aoe", p ); dot.aspect_of_harmony = target->get_dot( "aspect_of_harmony_damage", p ); @@ -4674,7 +4590,7 @@ monk_t::monk_t( sim_t *sim, std::string_view name, race_e r ) pets( this ), user_options( options_t() ) { - cooldown.anvil__stave = get_cooldown( "anvil__stave" ); + cooldown.anvil_and_stave = get_cooldown( "anvil_and_stave" ); cooldown.blackout_kick = get_cooldown( "blackout_kick" ); cooldown.fists_of_fury = get_cooldown( "fists_of_fury" ); cooldown.rising_sun_kick = get_cooldown( "rising_sun_kick" ); @@ -4725,25 +4641,8 @@ void monk_t::parse_player_effects() parse_effects( buff.ferociousness, USE_CURRENT ); // Shadopan - if ( auto &b = buff.wisdom_of_the_wall_dodge; !b->is_fallback ) - { - auto add_and_invalidate = [ & ]( std::vector &effect_vector, int effect_index, - cache_e invalidate ) { - add_parse_entry( effect_vector ) - .set_type( USE_CURRENT ) - .set_buff( b ) - .set_eff( &b->data().effectN( effect_index ) ); - b->add_invalidate( invalidate ); - }; - add_and_invalidate( dodge_effects, 1, CACHE_DODGE ); - add_and_invalidate( crit_chance_effects, 2, CACHE_CRIT_CHANCE ); - } - parse_effects( buff.wisdom_of_the_wall_mastery ); - parse_effects( buff.against_all_odds ); - parse_effects( buff.veterans_eye ); // Conduit of the Celestials - parse_effects( buff.flight_of_the_red_crane ); parse_effects( buff.inner_compass_crane_stance ); parse_effects( buff.inner_compass_ox_stance ); parse_effects( buff.inner_compass_serpent_stance ); @@ -4850,6 +4749,8 @@ action_t *monk_t::create_action( std::string_view name, std::string_view options return new rushing_jade_wind_t( this, options_str ); if ( name == "whirling_dragon_punch" ) return new whirling_dragon_punch_t( this, options_str ); + if ( name == "zenith" ) + return new zenith_t( this, options_str ); // Conduit of the Celestials if ( name == "celestial_conduit" ) @@ -5072,77 +4973,77 @@ void monk_t::init_spells() // monk_t::talent::monk { - talent.monk.rising_sun_kick = _CT( "Rising Sun Kick" ); - talent.monk.soothing_mist = _CT( "Soothing Mist" ); - talent.monk.paralysis = _CT( "Paralysis" ); - talent.monk.stagger = _CT( "Stagger" ); - talent.monk.elusive_mists = _CT( "Elusive Mists" ); - talent.monk.tigers_lust = _CT( "Tiger's Lust" ); - talent.monk.crashing_momentum = _CT( "Crashing Momentum" ); - talent.monk.disable = _CT( "Disable" ); - talent.monk.fast_feet = _CT( "Fast Feet" ); - talent.monk.grace_of_the_crane = _CT( "Grace of the Crane" ); - talent.monk.bounding_agility = _CT( "Bounding Agility" ); - talent.monk.calming_presence = _CT( "Calming Presence" ); - talent.monk.winds_reach = _CT( "Wind's Reach" ); - talent.monk.detox = _CT( "Detox" ); - talent.monk.vivacious_vivification = _CT( "Vivacious Vivification" ); - talent.monk.jade_walk = _CT( "Jade Walk" ); - talent.monk.pressure_points = _CT( "Pressure Points" ); - talent.monk.spear_hand_strike = _CT( "Spear Hand Strike" ); - talent.monk.ancient_arts = _CT( "Ancient Arts" ); - talent.monk.chi_wave = _CT( "Chi Wave" ); - talent.monk.chi_wave_buff = find_spell( 450380 ); - talent.monk.chi_wave_driver = find_spell( 115098 ); - talent.monk.chi_wave_damage = find_spell( 132467 ); - talent.monk.chi_wave_heal = find_spell( 132463 ); - talent.monk.chi_burst = _CT( "Chi Burst" ); - talent.monk.chi_burst_buff = find_spell( 460490 ); - talent.monk.chi_burst_projectile = find_spell( 461404 ); - talent.monk.chi_burst_damage = find_spell( 148135 ); - talent.monk.chi_burst_heal = find_spell( 130654 ); - talent.monk.transcendence = _CT( "Transcendence" ); - talent.monk.energy_transfer = _CT( "Energy Transfer" ); - talent.monk.celerity = _CT( "Celerity" ); - talent.monk.chi_torpedo = _CT( "Chi Torpedo" ); - talent.monk.quick_footed = _CT( "Quick Footed" ); - talent.monk.hasty_provocation = _CT( "Hasty Provocation" ); - talent.monk.ferocity_of_xuen = _CT( "Ferocity of Xuen" ); - talent.monk.ring_of_peace = _CT( "Ring of Peace" ); - talent.monk.song_of_chi_ji = _CT( "Song of Chi-Ji" ); - talent.monk.spirits_essence = _CT( "Spirit's Essence" ); - talent.monk.tiger_tail_sweep = _CT( "Tiger Tail Sweep" ); - talent.monk.improved_touch_of_death = _CT( "Improved Touch of Death" ); - talent.monk.vigorous_expulsion = _CT( "Vigorous Expulsion" ); - talent.monk.yulons_grace = _CT( "Yu'lon's Grace" ); - talent.monk.yulons_grace_buff = find_spell( 414143 ); - talent.monk.peace_and_prosperity = _CT( "Peace and Prosperity" ); - talent.monk.fortifying_brew = _CT( "Fortifying Brew" ); - talent.monk.fortifying_brew_buff = find_spell( 120954 ); - talent.monk.dance_of_the_wind = _CT( "Dance of the Wind" ); - talent.monk.save_them_all = _CT( "Save Them All" ); - talent.monk.swift_art = _CT( "Swift Art" ); - talent.monk.strength_of_spirit = _CT( "Strength of Spirit" ); - talent.monk.profound_rebuttal = _CT( "Profound Rebuttal" ); - talent.monk.summon_black_ox_statue = _CT( "Summon Black Ox Statue" ); - talent.monk.summon_white_tiger_statue = _CT( "Summon White Tiger Statue" ); - talent.monk.summon_white_tiger_statue_npc = find_spell( 388686 ); - talent.monk.claw_of_the_white_tiger = find_spell( 389541 ); - talent.monk.ironshell_brew = _CT( "Ironshell Brew" ); - talent.monk.expeditious_fortification = _CT( "Expeditious Fortification" ); - talent.monk.diffuse_magic = _CT( "Diffuse Magic" ); - talent.monk.celestial_determination = _CT( "Celestial Determination" ); - talent.monk.chi_proficiency = _CT( "Chi Proficiency" ); - talent.monk.healing_winds = _CT( "Healing Winds" ); - talent.monk.windwalking = _CT( "Windwalking" ); - talent.monk.bounce_back = _CT( "Bounce Back" ); - talent.monk.martial_instincts = _CT( "Martial Instincts" ); - talent.monk.lighter_than_air = _CT( "Lighter Than Air" ); - talent.monk.flow_of_chi = _CT( "Flow of Chi" ); - talent.monk.escape_from_reality = _CT( "Escape from Reality" ); - talent.monk.transcendence_linked_spirits = _CT( "Transcendence: Linked Spirits" ); - talent.monk.fatal_touch = _CT( "Fatal Touch" ); - talent.monk.rushing_reflexes = _CT( "Rushing Reflexes" ); + talent.monk.soothing_mist = _CT( "Soothing Mist" ); + talent.monk.paralysis = _CT( "Paralysis" ); + talent.monk.rising_sun_kick = _CT( "Rising Sun Kick" ); + talent.monk.stagger = _CT( "Stagger" ); + talent.monk.elusive_mists = _CT( "Elusive Mists" ); + talent.monk.tigers_lust = _CT( "Tiger's Lust" ); + talent.monk.crashing_momentum = _CT( "Crashing Momentum" ); + talent.monk.disable = _CT( "Disable" ); + talent.monk.fast_feet = _CT( "Fast Feet" ); + talent.monk.grace_of_the_crane = _CT( "Grace of the Crane" ); + talent.monk.bounding_agility = _CT( "Bounding Agility" ); + talent.monk.calming_presence = _CT( "Calming Presence" ); + talent.monk.winds_reach = _CT( "Wind's Reach" ); + talent.monk.detox = _CT( "Detox" ); + talent.monk.vivacious_vivification = _CT( "Vivacious Vivification" ); + talent.monk.jade_walk = _CT( "Jade Walk" ); + talent.monk.pressure_points = _CT( "Pressure Points" ); + talent.monk.spear_hand_strike = _CT( "Spear Hand Strike" ); + talent.monk.ancient_arts = _CT( "Ancient Arts" ); + talent.monk.chi_wave = _CT( "Chi Wave" ); + talent.monk.chi_wave_buff = find_spell( 450380 ); + talent.monk.chi_wave_driver = find_spell( 115098 ); + talent.monk.chi_wave_damage = find_spell( 132467 ); + talent.monk.chi_wave_heal = find_spell( 132463 ); + talent.monk.chi_burst = _CT( "Chi Burst" ); + talent.monk.chi_burst_buff = find_spell( 460490 ); + talent.monk.chi_burst_projectile = find_spell( 461404 ); + talent.monk.chi_burst_damage = find_spell( 148135 ); + talent.monk.chi_burst_heal = find_spell( 130654 ); + talent.monk.tiger_fang = _CT( "Tiger Fang" ); + talent.monk.transcendence = _CT( "Transcendence" ); + talent.monk.energy_transfer = _CT( "Energy Transfer" ); + talent.monk.celerity = _CT( "Celerity" ); + talent.monk.chi_torpedo = _CT( "Chi Torpedo" ); + talent.monk.stillstep_coil = _CT( "Stillstep Coil" ); + talent.monk.quick_footed = _CT( "Quick Footed" ); + talent.monk.hasty_provocation = _CT( "Hasty Provocation" ); + talent.monk.ferocity_of_xuen = _CT( "Ferocity of Xuen" ); + talent.monk.ring_of_peace = _CT( "Ring of Peace" ); + talent.monk.song_of_chi_ji = _CT( "Song of Chi-Ji" ); + talent.monk.spirits_essence = _CT( "Spirit's Essence" ); + talent.monk.tiger_tail_sweep = _CT( "Tiger Tail Sweep" ); + talent.monk.improved_touch_of_death = _CT( "Improved Touch of Death" ); + talent.monk.vigorous_expulsion = _CT( "Vigorous Expulsion" ); + talent.monk.yulons_grace = _CT( "Yu'lon's Grace" ); + talent.monk.yulons_grace_buff = find_spell( 414143 ); + talent.monk.peace_and_prosperity = _CT( "Peace and Prosperity" ); + talent.monk.fortifying_brew = _CT( "Fortifying Brew" ); + talent.monk.fortifying_brew_buff = find_spell( 120954 ); + talent.monk.dance_of_the_wind = _CT( "Dance of the Wind" ); + talent.monk.save_them_all = _CT( "Save Them All" ); + talent.monk.swift_art = _CT( "Swift Art" ); + talent.monk.strength_of_spirit = _CT( "Strength of Spirit" ); + talent.monk.profound_rebuttal = _CT( "Profound Rebuttal" ); + talent.monk.summon_black_ox_statue = _CT( "Summon Black Ox Statue" ); + talent.monk.zenith_stomp = _CT( "Zenith Stomp" ); + talent.monk.ironshell_brew = _CT( "Ironshell Brew" ); + talent.monk.expeditious_fortification = _CT( "Expeditious Fortification" ); + talent.monk.diffuse_magic = _CT( "Diffuse Magic" ); + talent.monk.celestial_determination = _CT( "Celestial Determination" ); + talent.monk.chi_proficiency = _CT( "Chi Proficiency" ); + talent.monk.healing_winds = _CT( "Healing Winds" ); + talent.monk.windwalking = _CT( "Windwalking" ); + talent.monk.chi_transfer = _CT( "Chi Transfer" ); + talent.monk.martial_instincts = _CT( "Martial Instincts" ); + talent.monk.lighter_than_air = _CT( "Lighter Than Air" ); + talent.monk.flow_of_chi = _CT( "Flow of Chi" ); + talent.monk.escape_from_reality = _CT( "Escape from Reality" ); + talent.monk.transcendence_linked_spirits = _CT( "Transcendence: Linked Spirits" ); + talent.monk.fatal_touch = _CT( "Fatal Touch" ); + talent.monk.rushing_reflexes = _CT( "Rushing Reflexes" ); } // monk_t::talent::brewmaster @@ -5178,8 +5079,8 @@ void monk_t::init_spells() talent.brewmaster.breath_of_fire_dot = find_spell( 123725 ); talent.brewmaster.gai_plins_imperial_brew = _ST( "Gai Plin's Imperial Brew" ); talent.brewmaster.gai_plins_imperial_brew_heal = find_spell( 383701 ); - talent.brewmaster.training_of_niuzao = _ST( "Training of Niuzao" ); talent.brewmaster.light_brewing = _ST( "Light Brewing" ); + talent.brewmaster.training_of_niuzao = _ST( "Training of Niuzao" ); talent.brewmaster.pretense_of_instability = _ST( "Pretense of Instability" ); talent.brewmaster.scalding_brew = _ST( "Scalding Brew" ); talent.brewmaster.salsalabims_strength = _ST( "Sal'salabim's Strength" ); @@ -5199,7 +5100,7 @@ void monk_t::init_spells() talent.brewmaster.press_the_advantage = _ST( "Press the Advantage" ); talent.brewmaster.press_the_advantage_damage = find_spell( 418360 ); talent.brewmaster.blackout_combo = _ST( "Blackout Combo" ); - talent.brewmaster.anvil__stave = _ST( "Anvil & Stave" ); + talent.brewmaster.anvil_and_stave = _ST( "Anvil and Stave" ); talent.brewmaster.counterstrike = _ST( "Counterstrike" ); talent.brewmaster.exploding_keg = _ST( "Exploding Keg" ); talent.brewmaster.ox_stance = _ST( "Ox Stance" ); @@ -5244,7 +5145,7 @@ void monk_t::init_spells() talent.windwalker.crane_vortex = _ST( "Crane Vortex" ); talent.windwalker.meridian_strikes = _ST( "Meridian Strikes" ); talent.windwalker.rising_star = _ST( "Rising Star" ); - talent.windwalker.weapons_of_order = _ST( "Weapons of Order" ); + talent.windwalker.zenith = _ST( "Zenith" ); talent.windwalker.hit_combo = _ST( "Hit Combo" ); talent.windwalker.hit_combo_buff = find_spell( 196741 ); talent.windwalker.brawlers_intensity = _ST( "Brawler's Intensity" ); @@ -5260,54 +5161,48 @@ void monk_t::init_spells() talent.windwalker.combo_breaker_buff = find_spell( 116768 ); talent.windwalker.dance_of_chiji = _ST( "Dance of Chi-Ji" ); // do not use talent.windwalker.dance_of_chiji->effectN( 1 ).trigger() to avoid talent known dependency - talent.windwalker.dance_of_chiji_buff = find_spell( 325202 ); - talent.windwalker.shadowboxing_treads = _STID( 392982 ); - talent.windwalker.strike_of_the_windlord = _ST( "Strike of the Windlord" ); - talent.windwalker.whirling_dragon_punch = _ST( "Whirling Dragon Punch" ); - talent.windwalker.whirling_dragon_punch_aoe_tick = find_spell( 158221 ); - talent.windwalker.whirling_dragon_punch_st_tick = find_spell( 451767 ); - talent.windwalker.whirling_dragon_punch_buff = find_spell( 196742 ); - talent.windwalker.energy_burst = _ST( "Energy Burst" ); - talent.windwalker.inner_peace = _ST( "Inner Peace" ); - talent.windwalker.sequenced_strikes = _ST( "Sequenced Strikes" ); - talent.windwalker.stormspirit_strikes = _ST( "Stormspirit Strikes" ); - talent.windwalker.communion_with_wind = _ST( "Communion With Wind" ); - talent.windwalker.revolving_whirl = _ST( "Revolving Whirl" ); - talent.windwalker.echo_technique = _ST( "Echo Technique" ); - talent.windwalker.rushing_jade_wind = _ST( "Rushing Jade Wind" ); - talent.windwalker.memory_of_the_monastery = _ST( "Memory of the Monastery" ); - talent.windwalker.memory_of_the_monastery_buff = find_spell( 454970 ); - talent.windwalker.rushing_wind_kick = _ST( "Rushing Wind Kick" ); - talent.windwalker.xuens_battlegear = _ST( "Xuen's Battlegear" ); - talent.windwalker.thunderfist = _ST( "Thunderfist" ); - talent.windwalker.thunderfist_buff = find_spell( 393565 ); - talent.windwalker.invoke_xuen_the_white_tiger = _ST( "Invoke Xuen, the White Tiger" ); - talent.windwalker.invoke_xuen_the_white_tiger_npc = find_spell( 132578 ); - talent.windwalker.crackling_tiger_lightning_driver = find_spell( 123999 ); - talent.windwalker.crackling_tiger_lightning = find_spell( 123996 ); - talent.windwalker.knowledge_of_the_broken_temple = _ST( "Knowledge of the Broken Temple" ); - talent.windwalker.slicing_winds = _ST( "Slicing Winds" ); - talent.windwalker.slicing_winds_damage = find_spell( 1217411 ); - talent.windwalker.jadefire_stomp = _ST( "Jadefire Stomp" ); - talent.windwalker.jadefire_stomp_damage = find_spell( 388207 ); - talent.windwalker.skyfire_heel = _ST( "Skyfire Heel" ); - talent.windwalker.harmonic_combo = _ST( "Harmonic Combo" ); - talent.windwalker.flurry_of_xuen = _ST( "Flurry of Xuen" ); - talent.windwalker.flurry_of_xuen_driver = find_spell( 452117 ); - talent.windwalker.xuens_bond = _ST( "Xuen's Bond" ); - talent.windwalker.airborne_rhythm = _ST( "Airborne Rhythm" ); - talent.windwalker.hurricanes_vault = _ST( "Hurricane's Vault" ); - talent.windwalker.path_of_jade = _ST( "Path of Jade" ); - talent.windwalker.singularly_focused_jade = _ST( "Singularly Focused Jade" ); + talent.windwalker.dance_of_chiji_buff = find_spell( 325202 ); + talent.windwalker.shadowboxing_treads = _STID( 392982 ); + talent.windwalker.strike_of_the_windlord = _ST( "Strike of the Windlord" ); + talent.windwalker.whirling_dragon_punch = _ST( "Whirling Dragon Punch" ); + talent.windwalker.whirling_dragon_punch_aoe_tick = find_spell( 158221 ); + talent.windwalker.whirling_dragon_punch_st_tick = find_spell( 451767 ); + talent.windwalker.whirling_dragon_punch_buff = find_spell( 196742 ); + talent.windwalker.energy_burst = _ST( "Energy Burst" ); + talent.windwalker.inner_peace = _ST( "Inner Peace" ); + talent.windwalker.sequenced_strikes = _ST( "Sequenced Strikes" ); + talent.windwalker.sunfire_spiral = _ST( "Sunfire Spiral" ); + talent.windwalker.communion_with_wind = _ST( "Communion With Wind" ); + talent.windwalker.revolving_whirl = _ST( "Revolving Whirl" ); + talent.windwalker.echo_technique = _ST( "Echo Technique" ); + talent.windwalker.universal_energy = _ST( "Universal Energy" ); + talent.windwalker.memory_of_the_monastery = _ST( "Memory of the Monastery" ); + talent.windwalker.memory_of_the_monastery_buff = find_spell( 454970 ); + talent.windwalker.rushing_wind_kick = _ST( "Rushing Wind Kick" ); + talent.windwalker.xuens_battlegear = _ST( "Xuen's Battlegear" ); + talent.windwalker.thunderfist = _ST( "Thunderfist" ); + talent.windwalker.thunderfist_buff = find_spell( 393565 ); + talent.windwalker.knowledge_of_the_broken_temple = _ST( "Knowledge of the Broken Temple" ); + talent.windwalker.slicing_winds = _ST( "Slicing Winds" ); + talent.windwalker.slicing_winds_damage = find_spell( 1217411 ); + talent.windwalker.jadefire_stomp = _ST( "Jadefire Stomp" ); + talent.windwalker.jadefire_stomp_damage = find_spell( 388207 ); + talent.windwalker.skyfire_heel = _ST( "Skyfire Heel" ); + talent.windwalker.harmonic_combo = _ST( "Harmonic Combo" ); + talent.windwalker.flurry_of_xuen = _ST( "Flurry of Xuen" ); + talent.windwalker.flurry_of_xuen_driver = find_spell( 452117 ); + talent.windwalker.martial_agility = _ST( "Martial Agility" ); + talent.windwalker.airborne_rhythm = _ST( "Airborne Rhythm" ); + talent.windwalker.hurricanes_vault = _ST( "Hurricane's Vault" ); + talent.windwalker.path_of_jade = _ST( "Path of Jade" ); + talent.windwalker.singularly_focused_jade = _ST( "Singularly Focused Jade" ); } // monk_t::talent::conduit_of_the_celestials { - talent.conduit_of_the_celestials.celestial_conduit = _HT( "Celestial Conduit" ); - talent.conduit_of_the_celestials.celestial_conduit_action = find_spell( 443028 ); - talent.conduit_of_the_celestials.celestial_conduit_buff = find_spell( 443028 ); - talent.conduit_of_the_celestials.celestial_conduit_damage = find_spell( 443038 ); - talent.conduit_of_the_celestials.celestial_conduit_heal = find_spell( 443039 ); + talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger = _HT( "Invoke Xuen, the White Tiger" ); + talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger_npc = find_spell( 132578 ); + talent.conduit_of_the_celestials.crackling_tiger_lightning_driver = find_spell( 123999 ); talent.conduit_of_the_celestials.temple_training = _HT( "Temple Training" ); talent.conduit_of_the_celestials.xuens_guidance = _HT( "Xuen's Guidance" ); talent.conduit_of_the_celestials.courage_of_the_white_tiger = _HT( "Courage of the White Tiger" ); @@ -5315,7 +5210,7 @@ void monk_t::init_spells() talent.conduit_of_the_celestials.courage_of_the_white_tiger_damage = find_spell( 457917 ); talent.conduit_of_the_celestials.courage_of_the_white_tiger_heal = find_spell( 443106 ); talent.conduit_of_the_celestials.restore_balance = _HT( "Restore Balance" ); - talent.conduit_of_the_celestials.yulons_knowledge = _HT( "Yu'lon's Knowledge" ); + talent.conduit_of_the_celestials.xuens_bond = _HT( "Xuen's Bond" ); talent.conduit_of_the_celestials.heart_of_the_jade_serpent = _HT( "Heart of the Jade Serpent" ); talent.conduit_of_the_celestials.heart_of_the_jade_serpent_buff = find_spell( 443421 ); talent.conduit_of_the_celestials.heart_of_the_jade_serpent_celestial_buff = find_spell( 443616 ); @@ -5325,17 +5220,16 @@ void monk_t::init_spells() talent.conduit_of_the_celestials.strength_of_the_black_ox_buff = find_spell( 443112 ); talent.conduit_of_the_celestials.strength_of_the_black_ox_absorb = find_spell( 443113 ); talent.conduit_of_the_celestials.strength_of_the_black_ox_damage = find_spell( 443127 ); - talent.conduit_of_the_celestials.flight_of_the_red_crane = _HT( "Flight of the Red Crane" ); - talent.conduit_of_the_celestials.flight_of_the_red_crane_buff = find_spell( 457459 ); - talent.conduit_of_the_celestials.flight_of_the_red_crane_dmg = find_spell( 443263 ); - talent.conduit_of_the_celestials.flight_of_the_red_crane_heal = find_spell( 443272 ); - talent.conduit_of_the_celestials.flight_of_the_red_crane_celestial_dmg = find_spell( 443611 ); - talent.conduit_of_the_celestials.flight_of_the_red_crane_celestial_heal = find_spell( 443614 ); + talent.conduit_of_the_celestials.path_of_the_falling_star = _HT( "Path of the Falling Star" ); talent.conduit_of_the_celestials.yulons_avatar = _HT( "Yu'lon's Avatar" ); talent.conduit_of_the_celestials.niuzaos_protection = _HT( "Niuzao's Protection" ); talent.conduit_of_the_celestials.jade_sanctuary = _HT( "Jade Sanctuary" ); talent.conduit_of_the_celestials.jade_sanctuary_buff = find_spell( 448508 ); - talent.conduit_of_the_celestials.stampede_of_the_ancients = _HT( "Stampede of the Ancients" ); + talent.conduit_of_the_celestials.celestial_conduit = _HT( "Celestial Conduit" ); + talent.conduit_of_the_celestials.celestial_conduit_action = find_spell( 443028 ); + talent.conduit_of_the_celestials.celestial_conduit_buff = find_spell( 443028 ); + talent.conduit_of_the_celestials.celestial_conduit_damage = find_spell( 443038 ); + talent.conduit_of_the_celestials.celestial_conduit_heal = find_spell( 443039 ); talent.conduit_of_the_celestials.inner_compass = _HT( "Inner Compass" ); talent.conduit_of_the_celestials.inner_compass_crane_stance_buff = find_spell( 443572 ); talent.conduit_of_the_celestials.inner_compass_ox_stance_buff = find_spell( 443574 ); @@ -5363,45 +5257,44 @@ void monk_t::init_spells() talent.master_of_harmony.balanced_stratagem = _HT( "Balanced Stratagem" ); talent.master_of_harmony.balanced_stratagem_magic = find_spell( 451508 ); talent.master_of_harmony.balanced_stratagem_physical = find_spell( 451514 ); + talent.master_of_harmony.harmonic_surge = _HT( "Harmonic Surge" ); talent.master_of_harmony.tigers_vigor = _HT( "Tiger's Vigor" ); talent.master_of_harmony.roar_from_the_heavens = _HT( "Roar from the Heavens" ); talent.master_of_harmony.endless_draught = _HT( "Endless Draught" ); talent.master_of_harmony.mantra_of_purity = _HT( "Mantra of Purity" ); talent.master_of_harmony.mantra_of_tenacity = _HT( "Mantra of Tenacity" ); + talent.master_of_harmony.potential_energy = _HT( "Potential Energy" ); talent.master_of_harmony.overwhelming_force = _HT( "Overwhelming Force" ); talent.master_of_harmony.overwhelming_force_damage = find_spell( 452333 ); talent.master_of_harmony.path_of_resurgence = _HT( "Path of Resurgence" ); talent.master_of_harmony.way_of_a_thousand_strikes = _HT( "Way of a Thousand Strikes" ); talent.master_of_harmony.clarity_of_purpose = _HT( "Clarity of Purpose" ); + talent.master_of_harmony.meditative_focus = _HT( "Meditative Focus" ); talent.master_of_harmony.coalescence = _HT( "Coalescence" ); } // monk_t::talent::shado_pan { - talent.shado_pan.flurry_strikes = _HT( "Flurry Strikes" ); - talent.shado_pan.flurry_charge = find_spell( 451021 ); - talent.shado_pan.flurry_strikes_hit = find_spell( 450617 ); - talent.shado_pan.pride_of_pandaria = _HT( "Pride of Pandaria" ); - talent.shado_pan.high_impact = _HT( "High Impact" ); - talent.shado_pan.high_impact_debuff = find_spell( 451037 ); - talent.shado_pan.veterans_eye = _HT( "Veteran's Eye" ); - talent.shado_pan.veterans_eye_buff = find_spell( 451085 ); - talent.shado_pan.veterans_eye_debuff = find_spell( 451071 ); - talent.shado_pan.martial_precision = _HT( "Martial Precision" ); - talent.shado_pan.protect_and_serve = _HT( "Protect and Serve" ); - talent.shado_pan.lead_from_the_front = _HT( "Lead from the Front" ); - talent.shado_pan.one_versus_many = _HT( "One Versus Many" ); - talent.shado_pan.whirling_steel = _HT( "Whirling Steel" ); - talent.shado_pan.predictive_training = _HT( "Predictive Training" ); - talent.shado_pan.against_all_odds = _HT( "Against All Odds" ); - talent.shado_pan.against_all_odds_buff = find_spell( 451061 ); - talent.shado_pan.efficient_training = _HT( "Efficient Training" ); - talent.shado_pan.vigilant_watch = _HT( "Vigilant Watch" ); - talent.shado_pan.vigilant_watch_buff = find_spell( 451233 ); - talent.shado_pan.wisdom_of_the_wall = _HT( "Wisdom of the Wall" ); - talent.shado_pan.wisdom_of_the_wall_crit_buff = find_spell( 452684 ); - talent.shado_pan.wisdom_of_the_wall_dodge_buff = find_spell( 451242 ); - talent.shado_pan.wisdom_of_the_wall_mastery_buff = find_spell( 452685 ); + talent.shado_pan.flurry_strikes = _HT( "Flurry Strikes" ); + talent.shado_pan.flurry_charge = find_spell( 451021 ); + talent.shado_pan.flurry_strikes_hit = find_spell( 450617 ); + talent.shado_pan.pride_of_pandaria = _HT( "Pride of Pandaria" ); + talent.shado_pan.high_impact = _HT( "High Impact" ); + talent.shado_pan.high_impact_debuff = find_spell( 451037 ); + talent.shado_pan.veterans_eye = _HT( "Veteran's Eye" ); + talent.shado_pan.martial_precision = _HT( "Martial Precision" ); + talent.shado_pan.shado_over_the_battlefield = _HT( "Shado Over the Battlefield" ); + talent.shado_pan.combat_stance = _HT( "Combat Stance" ); + talent.shado_pan.initiators_edge = _HT( "Initiator's Edge" ); + talent.shado_pan.one_versus_many = _HT( "One Versus Many" ); + talent.shado_pan.whirling_steel = _HT( "Whirling Steel" ); + talent.shado_pan.predictive_training = _HT( "Predictive Training" ); + talent.shado_pan.stand_ready = _HT( "Stand Ready" ); + talent.shado_pan.against_all_odds = _HT( "Against All Odds" ); + talent.shado_pan.efficient_training = _HT( "Efficient Training" ); + talent.shado_pan.vigilant_watch = _HT( "Vigilant Watch" ); + talent.shado_pan.weapons_of_the_wall = _HT( "Weapons of the Wall" ); + talent.shado_pan.wisdom_of_the_wall = _HT( "Wisdom of the Wall" ); } // monk_t::talent::tier @@ -5439,10 +5332,48 @@ void monk_t::init_spells() talent.shared_spell.rushing_jade_wind_tick = find_spell( 148187 ); // Register passives - // Aura adjustments that are only visual on tooltip and don't actually have an effect - deregister_passive_effect( baseline.brewmaster.aura->effectN( 27 ) ); - deregister_passive_effect( baseline.windwalker.aura_3->effectN( 4 ) ); - + // Instant Spells with a reduced GCD + register_passive_affect_list( baseline.brewmaster.aura_2, affect_list_t( 3 ).remove_label( 640 ) ); + // Instant Spells with a reduced GCD + register_passive_affect_list( baseline.brewmaster.aura_4, + affect_list_t( 7 ).remove_spell( 115098, // Chi Wave Action + 130654, // Chi Burst Heal + 148135, // Chi Burst Damage + 185099, // Rising Sun Kick Damage + 228649, // Teachings of the Monastery Blackout Kick + 261682, // Chi Burst Energize + 280184, // Unknown Leg Sweep? + 322111, // Touch of Death Damage + 331433, // Unknown Tiger Palm? + 392959, // Glory of the Dawn + 450342, // Crashing Momentum + 451968, // Combat Wisdom Expel Harm Heal + 468179, // Rushing Wind Kick Damage + 1249625 // Zenith + ) ); + // Chargeless Spells with a reduced Charge Cooldown + register_passive_affect_list( talent.brewmaster.fluidity_of_motion, + affect_list_t( 2 ).remove_spell( 100784 ) ); // Blackout Kick + // Instant Spells with a reduced GCD + register_passive_affect_list( baseline.windwalker.aura_2, affect_list_t( 2 ).remove_label( 640 ) ); + // Instant Spells with a reduced GCD + register_passive_affect_list( baseline.windwalker.aura_4, + affect_list_t( 8 ).remove_spell( 115098, // Chi Wave Action + 130654, // Chi Burst Heal + 148135, // Chi Burst Damage + 185099, // Rising Sun Kick Damage + 228649, // Teachings of the Monastery Blackout Kick + 261682, // Chi Burst Energize + 280184, // Old Leg Sweep Modifier + 322111, // Touch of Death Damage + 331433, // Some Weird Tiger Palm + 392959, // Glory of the Dawn + 450342, // Crashing Momentum + 451968, // Combat Wisdom Expel Harm Heal + 468179, // Rushing Wind Kick Damage + 1249625 // Zenith + ) ); + // Scripted enablement based on specialization register_passive_effect_mask( talent.shado_pan.efficient_training, specialization() == MONK_WINDWALKER ? effect_mask_t( true ).disable( 5 ) : effect_mask_t( true ) ); @@ -5466,15 +5397,11 @@ void monk_t::init_background_actions() // Conduit of the Celestials bool uw = talent.conduit_of_the_celestials.unity_within->ok(); bool cwt = talent.conduit_of_the_celestials.courage_of_the_white_tiger->ok() || uw; - bool frc = talent.conduit_of_the_celestials.flight_of_the_red_crane->ok() || uw; bool sbt = talent.conduit_of_the_celestials.strength_of_the_black_ox->ok() || uw; if ( cwt ) action.courage_of_the_white_tiger = actions::spells::courage_of_the_white_tiger_t( this ); - if ( frc ) - action.flight_of_the_red_crane = actions::attacks::flight_of_the_red_crane_t( this ); - if ( sbt ) action.strength_of_the_black_ox = actions::spells::strength_of_the_black_ox_t( this ); @@ -5529,7 +5456,7 @@ void monk_t::init_base_stats() case MONK_WINDWALKER: if ( base.distance < 1 ) base.distance = 5; - base.attack_power_per_agility = 1.0; + base.attack_power_per_agility = 1.0; resources.active_resource[ RESOURCE_MANA ] = false; break; default: @@ -5658,19 +5585,13 @@ void monk_t::create_buffs() ->set_trigger_spell( talent.windwalker.combat_wisdom ) ->set_default_value_from_effect( 1 ); - buff.fatal_touch = make_buff_fallback( talent.monk.fatal_touch->ok(), this, "fatal_touch", - talent.monk.fatal_touch->effectN( 2 ).trigger() ) - ->set_trigger_spell( talent.monk.fatal_touch ); - buff.chi_wave = make_buff_fallback( talent.monk.chi_wave->ok(), this, "chi_wave", talent.monk.chi_wave_buff ); buff.fortifying_brew = make_buff_fallback( talent.monk.fortifying_brew->ok() && specialization() == MONK_BREWMASTER, this, "fortifying_brew" ); buff.rushing_jade_wind = make_buff_fallback( - talent.brewmaster.rushing_jade_wind->ok() || talent.windwalker.rushing_jade_wind->ok() || - talent.conduit_of_the_celestials.restore_balance->ok(), - this, "rushing_jade_wind" ); + talent.brewmaster.rushing_jade_wind->ok(), this, "rushing_jade_wind" ); buff.spinning_crane_kick = make_buff( this, "spinning_crane_kick", baseline.monk.spinning_crane_kick ) ->set_default_value_from_effect( 2 ) @@ -5817,8 +5738,8 @@ void monk_t::create_buffs() ->set_freeze_stacks( true ); buff.invoke_xuen = make_buff_fallback( - talent.windwalker.invoke_xuen_the_white_tiger->ok(), this, "invoke_xuen_the_white_tiger", - talent.windwalker.invoke_xuen_the_white_tiger ); + talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger->ok(), this, "invoke_xuen_the_white_tiger", + talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger ); buff.memory_of_the_monastery = make_buff_fallback( talent.windwalker.memory_of_the_monastery->ok(), this, "memory_of_the_monastery", @@ -5845,6 +5766,8 @@ void monk_t::create_buffs() buff.whirling_dragon_punch = make_buff_fallback( talent.windwalker.whirling_dragon_punch->ok(), this, "whirling_dragon_punch" ); + buff.zenith = make_buff_fallback( talent.windwalker.zenith->ok(), this, "zenith", talent.windwalker.zenith ); + // Conduit of the Celestials buff.celestial_conduit = make_buff_fallback( talent.conduit_of_the_celestials.celestial_conduit->ok(), this, "celestial_conduit", @@ -5858,10 +5781,6 @@ void monk_t::create_buffs() talent.conduit_of_the_celestials.courage_of_the_white_tiger->ok(), this, "courage_of_the_white_tiger", talent.conduit_of_the_celestials.courage_of_the_white_tiger_buff ); - buff.flight_of_the_red_crane = - make_buff_fallback( talent.conduit_of_the_celestials.flight_of_the_red_crane->ok(), this, - "flight_of_the_red_crane", talent.conduit_of_the_celestials.flight_of_the_red_crane_buff ); - buff.heart_of_the_jade_serpent_cdr = make_buff_fallback( talent.conduit_of_the_celestials.heart_of_the_jade_serpent->ok(), this, "heart_of_the_jade_serpent_cdr", @@ -5939,7 +5858,6 @@ void monk_t::create_buffs() talent.conduit_of_the_celestials.unity_within_buff ) ->set_expire_callback( [ this ]( buff_t *, double, timespan_t ) { buff.jade_sanctuary->trigger(); - action.flight_of_the_red_crane.celestial->execute(); action.strength_of_the_black_ox.celestial->execute(); action.courage_of_the_white_tiger.celestial->execute(); @@ -5956,43 +5874,10 @@ void monk_t::create_buffs() talent.master_of_harmony.balanced_stratagem_physical ); // Shado-Pan - buff.against_all_odds = make_buff_fallback( talent.shado_pan.against_all_odds->ok(), this, "against_all_odds", - talent.shado_pan.against_all_odds_buff ) - ->set_default_value_from_effect( 1 ) - ->set_trigger_spell( talent.shado_pan.against_all_odds ); - buff.flurry_charge = make_buff_fallback( talent.shado_pan.flurry_strikes->ok(), this, "flurry_charge", talent.shado_pan.flurry_charge ) ->set_default_value_from_effect( 1 ); - buff.veterans_eye = make_buff_fallback( talent.shado_pan.veterans_eye->ok(), this, "veterans_eye", - talent.shado_pan.veterans_eye_buff ) - ->set_default_value_from_effect( 1 ); - - buff.vigilant_watch = make_buff_fallback( talent.shado_pan.vigilant_watch->ok(), this, "vigilant_watch", - talent.shado_pan.vigilant_watch_buff ) - ->set_default_value_from_effect( 1 ); - - buff.wisdom_of_the_wall_crit = - make_buff_fallback( talent.shado_pan.wisdom_of_the_wall->ok(), this, "wisdom_of_the_wall_crit", - talent.shado_pan.wisdom_of_the_wall_crit_buff ) - ->set_default_value_from_effect( 1 ); - - buff.wisdom_of_the_wall_dodge = - make_buff_fallback( talent.shado_pan.wisdom_of_the_wall->ok(), this, "wisdom_of_the_wall_dodge", - talent.shado_pan.wisdom_of_the_wall_dodge_buff ) - ->set_trigger_spell( talent.shado_pan.wisdom_of_the_wall ) - ->set_stack_change_callback( [ & ]( buff_t *self, int, int ) { - self->current_value = self->data().effectN( 3 ).percent() * composite_damage_versatility(); - } ) - ->set_tick_behavior( buff_tick_behavior::CLIP ); - - buff.wisdom_of_the_wall_mastery = - make_buff_fallback( talent.shado_pan.wisdom_of_the_wall->ok(), this, "wisdom_of_the_wall_mastery", - talent.shado_pan.wisdom_of_the_wall_mastery_buff ) - ->set_trigger_spell( talent.shado_pan.wisdom_of_the_wall ) - ->set_default_value_from_effect( 1 ); - // TWW S2 Tier Buffs // WW tier.tww2.winning_streak = @@ -6058,13 +5943,14 @@ void monk_t::init_gains() gain.energy_burst = get_gain( "energy_burst" ); gain.energy_refund = get_gain( "energy_refund" ); gain.touch_of_death_ww = get_gain( "touch_of_death_ww" ); + gain.zenith = get_gain( "zenith" ); } void monk_t::init_procs() { base_t::init_procs(); - proc.anvil__stave = get_proc( "Anvil & Stave" ); + proc.anvil_and_stave = get_proc( "Anvil & Stave" ); proc.blackout_combo_tiger_palm = get_proc( "Blackout Combo - Tiger Palm" ); proc.blackout_combo_keg_smash = get_proc( "Blackout Combo - Keg Smash" ); proc.charred_passions = get_proc( "Charred Passions" ); @@ -6241,20 +6127,6 @@ void monk_t::init_special_effects() buff.flurry_of_xuen->trigger(); } ); - if ( talent.shado_pan.veterans_eye->ok() ) - create_proc_callback( { talent.shado_pan.veterans_eye.spell(), static_cast( 0ull ), PF2_ALL_HIT } ) - ->register_callback_execute_function( [ & ]( const dbc_proc_callback_t *, action_t *, action_state_t *state ) { - monk_td_t *td = get_target_data( state->target ); - if ( !td ) - return; - td->debuff.veterans_eye->trigger(); - if ( td->debuff.veterans_eye->at_max_stacks() ) - { - buff.veterans_eye->trigger(); - td->debuff.veterans_eye->reset(); - } - } ); - if ( talent.monk.chi_burst->ok() && specialization() == MONK_WINDWALKER ) create_proc_callback( { talent.monk.chi_burst.spell() } ); @@ -6317,19 +6189,6 @@ void monk_t::init_special_effects() return false; } ); - if ( talent.conduit_of_the_celestials.flight_of_the_red_crane->ok() ) - create_proc_callback( { talent.conduit_of_the_celestials.flight_of_the_red_crane, static_cast( 0ull ), - static_cast( 0ull ), action.flight_of_the_red_crane.base } ) - ->register_callback_trigger_function( - dbc_proc_callback_t::trigger_fn_type::CONDITION, - [ & ]( const dbc_proc_callback_t *, action_t *, action_state_t *state ) { - if ( state->action->id == talent.shared_spell.rushing_jade_wind_tick->id() ) - return true; - if ( state->action->id == baseline.monk.spinning_crane_kick->effectN( 1 ).trigger()->id() ) - return true; - return false; - } ); - if ( tier.tww2.ww_2pc->ok() ) create_proc_callback( { tier.tww2.ww_2pc } ); if ( tier.tww2.brm_2pc->ok() ) @@ -6446,9 +6305,6 @@ double monk_t::composite_dodge() const if ( specialization() == MONK_BREWMASTER ) d += buff.elusive_brawler->current_stack * cache.mastery_value(); - if ( buff.wisdom_of_the_wall_dodge->check() ) - d += buff.wisdom_of_the_wall_dodge->check_value(); - return d; } @@ -6459,16 +6315,6 @@ double monk_t::composite_player_target_armor( player_t *target ) const return armor; } -double monk_t::resource_regen_per_second( resource_e resource ) const -{ - double regen = base_t::resource_regen_per_second( resource ); - - if ( resource == RESOURCE_ENERGY && buff.flight_of_the_red_crane->check() ) - regen *= 1.0 + buff.flight_of_the_red_crane->data().effectN( 1 ).percent(); - - return regen; -} - void monk_t::invalidate_cache( cache_e c ) { base_t::invalidate_cache( c ); @@ -6633,12 +6479,12 @@ void monk_t::assess_damage( school_e school, result_amount_type dtype, action_st proc.elusive_brawler_preserved->occur(); // Saved as 5/10 base values but need it as 0.5 and 1 base values - if ( talent.brewmaster.anvil__stave->ok() && cooldown.anvil__stave->up() ) + if ( talent.brewmaster.anvil_and_stave->ok() && cooldown.anvil_and_stave->up() ) { - cooldown.anvil__stave->start( talent.brewmaster.anvil__stave->internal_cooldown() ); - proc.anvil__stave->occur(); + cooldown.anvil_and_stave->start( talent.brewmaster.anvil_and_stave->internal_cooldown() ); + proc.anvil_and_stave->occur(); baseline.brewmaster.brews.adjust( - timespan_t::from_seconds( talent.brewmaster.anvil__stave->effectN( 1 ).base_value() / 10 ) ); + timespan_t::from_seconds( talent.brewmaster.anvil_and_stave->effectN( 1 ).base_value() / 10 ) ); } buff.counterstrike->trigger(); diff --git a/engine/class_modules/monk/sc_monk.hpp b/engine/class_modules/monk/sc_monk.hpp index 7461904f188..627cee21a40 100644 --- a/engine/class_modules/monk/sc_monk.hpp +++ b/engine/class_modules/monk/sc_monk.hpp @@ -53,7 +53,6 @@ struct niuzao_pet_t : public monk_pet_t void init_spells() override; }; } // namespace niuzao -struct white_tiger_statue_t; } // namespace pets namespace actions @@ -334,7 +333,6 @@ struct monk_td_t : public actor_target_data_t // Shado-Pan propagate_const high_impact; - propagate_const veterans_eye; } debuff; monk_t &monk; @@ -435,7 +433,6 @@ struct monk_t : public stagger_t // Conduit of the Celestials actions::conduit_of_the_celestials_container_t courage_of_the_white_tiger; - actions::conduit_of_the_celestials_container_t flight_of_the_red_crane; actions::conduit_of_the_celestials_container_t strength_of_the_black_ox; // Shado-Pan @@ -452,7 +449,6 @@ struct monk_t : public stagger_t { // General propagate_const chi_wave; - propagate_const fatal_touch; propagate_const rushing_jade_wind; propagate_const spinning_crane_kick; // TODO: is this necessary? propagate_const yulons_grace; @@ -492,12 +488,12 @@ struct monk_t : public stagger_t propagate_const touch_of_death_ww; propagate_const touch_of_karma; propagate_const whirling_dragon_punch; + propagate_const zenith; // Conduit of the Celestials propagate_const celestial_conduit; propagate_const chijis_swiftness; propagate_const courage_of_the_white_tiger; - propagate_const flight_of_the_red_crane; propagate_const heart_of_the_jade_serpent_cdr_celestial; propagate_const heart_of_the_jade_serpent_cdr; propagate_const inner_compass_crane_stance; @@ -514,13 +510,7 @@ struct monk_t : public stagger_t propagate_const balanced_stratagem_magic; // Shado-Pan - propagate_const against_all_odds; propagate_const flurry_charge; - propagate_const veterans_eye; - propagate_const vigilant_watch; - propagate_const wisdom_of_the_wall_crit; - propagate_const wisdom_of_the_wall_dodge; - propagate_const wisdom_of_the_wall_mastery; // TWW1 Set Bonus propagate_const tiger_strikes; @@ -537,11 +527,12 @@ struct monk_t : public stagger_t propagate_const energy_burst; propagate_const energy_refund; propagate_const touch_of_death_ww; + propagate_const zenith; } gain; struct { - propagate_const anvil__stave; + propagate_const anvil_and_stave; propagate_const blackout_combo_tiger_palm; propagate_const blackout_combo_keg_smash; propagate_const charred_passions; @@ -558,7 +549,7 @@ struct monk_t : public stagger_t struct { - propagate_const anvil__stave; + propagate_const anvil_and_stave; propagate_const blackout_kick; propagate_const expel_harm; propagate_const fists_of_fury; @@ -657,7 +648,7 @@ struct monk_t : public stagger_t player_talent_t bounding_agility; player_talent_t calming_presence; player_talent_t winds_reach; - player_talent_t detox; // Brewmaster and Windwalker + player_talent_t detox; // Row 4 player_talent_t vivacious_vivification; player_talent_t jade_walk; @@ -665,7 +656,7 @@ struct monk_t : public stagger_t player_talent_t spear_hand_strike; player_talent_t ancient_arts; // Row 5 - player_talent_t chi_wave; // Brewmaster and Windwalker + player_talent_t chi_wave; // Brewmaster const spell_data_t *chi_wave_buff; const spell_data_t *chi_wave_driver; const spell_data_t *chi_wave_damage; @@ -675,10 +666,12 @@ struct monk_t : public stagger_t const spell_data_t *chi_burst_projectile; const spell_data_t *chi_burst_damage; const spell_data_t *chi_burst_heal; + player_talent_t tiger_fang; // Windwalker player_talent_t transcendence; player_talent_t energy_transfer; player_talent_t celerity; player_talent_t chi_torpedo; + player_talent_t stillstep_coil; // Row 6 player_talent_t quick_footed; player_talent_t hasty_provocation; @@ -701,10 +694,8 @@ struct monk_t : public stagger_t player_talent_t swift_art; player_talent_t strength_of_spirit; player_talent_t profound_rebuttal; - player_talent_t summon_black_ox_statue; // Brewmaster - player_talent_t summon_white_tiger_statue; // Windwalker - const spell_data_t *claw_of_the_white_tiger; - const spell_data_t *summon_white_tiger_statue_npc; + player_talent_t summon_black_ox_statue; // Brewmaster + player_talent_t zenith_stomp; // Windwalker player_talent_t ironshell_brew; player_talent_t expeditious_fortification; player_talent_t diffuse_magic; @@ -713,7 +704,7 @@ struct monk_t : public stagger_t player_talent_t chi_proficiency; player_talent_t healing_winds; player_talent_t windwalking; - player_talent_t bounce_back; + player_talent_t chi_transfer; player_talent_t martial_instincts; // Row 10 player_talent_t lighter_than_air; @@ -787,7 +778,7 @@ struct monk_t : public stagger_t player_talent_t press_the_advantage; const spell_data_t *press_the_advantage_damage; player_talent_t blackout_combo; - player_talent_t anvil__stave; + player_talent_t anvil_and_stave; player_talent_t counterstrike; // row 9 player_talent_t exploding_keg; @@ -841,7 +832,7 @@ struct monk_t : public stagger_t player_talent_t crane_vortex; player_talent_t meridian_strikes; player_talent_t rising_star; - player_talent_t weapons_of_order; + player_talent_t zenith; player_talent_t hit_combo; const spell_data_t *hit_combo_buff; player_talent_t brawlers_intensity; @@ -869,11 +860,11 @@ struct monk_t : public stagger_t player_talent_t inner_peace; // Row 8 player_talent_t sequenced_strikes; - player_talent_t stormspirit_strikes; + player_talent_t sunfire_spiral; player_talent_t communion_with_wind; player_talent_t revolving_whirl; player_talent_t echo_technique; - player_talent_t rushing_jade_wind; + player_talent_t universal_energy; player_talent_t memory_of_the_monastery; const spell_data_t *memory_of_the_monastery_buff; // Row 9 @@ -881,10 +872,7 @@ struct monk_t : public stagger_t player_talent_t xuens_battlegear; player_talent_t thunderfist; const spell_data_t *thunderfist_buff; - player_talent_t invoke_xuen_the_white_tiger; - const spell_data_t *invoke_xuen_the_white_tiger_npc; - const spell_data_t *crackling_tiger_lightning_driver; - const spell_data_t *crackling_tiger_lightning; + player_talent_t weapon_of_wind; player_talent_t knowledge_of_the_broken_temple; player_talent_t slicing_winds; const spell_data_t *slicing_winds_damage; @@ -895,7 +883,7 @@ struct monk_t : public stagger_t player_talent_t harmonic_combo; player_talent_t flurry_of_xuen; const spell_data_t *flurry_of_xuen_driver; - player_talent_t xuens_bond; + player_talent_t martial_agility; player_talent_t airborne_rhythm; player_talent_t hurricanes_vault; player_talent_t path_of_jade; @@ -910,11 +898,9 @@ struct monk_t : public stagger_t struct { // Row 1 - player_talent_t celestial_conduit; - const spell_data_t *celestial_conduit_action; - const spell_data_t *celestial_conduit_buff; - const spell_data_t *celestial_conduit_damage; - const spell_data_t *celestial_conduit_heal; + player_talent_t invoke_xuen_the_white_tiger; + const spell_data_t *invoke_xuen_the_white_tiger_npc; + const spell_data_t *crackling_tiger_lightning_driver; // Row 2 player_talent_t temple_training; player_talent_t xuens_guidance; @@ -923,7 +909,7 @@ struct monk_t : public stagger_t const spell_data_t *courage_of_the_white_tiger_damage; const spell_data_t *courage_of_the_white_tiger_heal; player_talent_t restore_balance; - player_talent_t yulons_knowledge; + player_talent_t xuens_bond; player_talent_t heart_of_the_jade_serpent; const spell_data_t *heart_of_the_jade_serpent_buff; const spell_data_t *heart_of_the_jade_serpent_celestial_buff; @@ -934,18 +920,17 @@ struct monk_t : public stagger_t const spell_data_t *strength_of_the_black_ox_buff; const spell_data_t *strength_of_the_black_ox_absorb; const spell_data_t *strength_of_the_black_ox_damage; - player_talent_t flight_of_the_red_crane; - const spell_data_t *flight_of_the_red_crane_buff; - const spell_data_t *flight_of_the_red_crane_dmg; - const spell_data_t *flight_of_the_red_crane_heal; - const spell_data_t *flight_of_the_red_crane_celestial_dmg; - const spell_data_t *flight_of_the_red_crane_celestial_heal; + player_talent_t path_of_the_falling_star; player_talent_t yulons_avatar; // Row 4 player_talent_t niuzaos_protection; player_talent_t jade_sanctuary; const spell_data_t *jade_sanctuary_buff; - player_talent_t stampede_of_the_ancients; + player_talent_t celestial_conduit; + const spell_data_t *celestial_conduit_action; + const spell_data_t *celestial_conduit_buff; + const spell_data_t *celestial_conduit_damage; + const spell_data_t *celestial_conduit_heal; player_talent_t inner_compass; const spell_data_t *inner_compass_crane_stance_buff; const spell_data_t *inner_compass_ox_stance_buff; @@ -977,18 +962,21 @@ struct monk_t : public stagger_t player_talent_t balanced_stratagem; const spell_data_t *balanced_stratagem_physical; const spell_data_t *balanced_stratagem_magic; + player_talent_t harmonic_surge; // Row 3 player_talent_t tigers_vigor; player_talent_t roar_from_the_heavens; player_talent_t endless_draught; player_talent_t mantra_of_purity; player_talent_t mantra_of_tenacity; + player_talent_t potential_energy; // Row 4 player_talent_t overwhelming_force; const spell_data_t *overwhelming_force_damage; player_talent_t path_of_resurgence; player_talent_t way_of_a_thousand_strikes; player_talent_t clarity_of_purpose; + player_talent_t meditative_focus; // Row 5 player_talent_t coalescence; } master_of_harmony; @@ -1005,26 +993,22 @@ struct monk_t : public stagger_t player_talent_t high_impact; const spell_data_t *high_impact_debuff; player_talent_t veterans_eye; - const spell_data_t *veterans_eye_buff; - const spell_data_t *veterans_eye_debuff; player_talent_t martial_precision; + player_talent_t shado_over_the_battlefield; // Row 3 - player_talent_t protect_and_serve; - player_talent_t lead_from_the_front; + player_talent_t combat_stance; + player_talent_t initiators_edge; player_talent_t one_versus_many; player_talent_t whirling_steel; player_talent_t predictive_training; + player_talent_t stand_ready; // Row 4 player_talent_t against_all_odds; - const spell_data_t *against_all_odds_buff; player_talent_t efficient_training; player_talent_t vigilant_watch; - const spell_data_t *vigilant_watch_buff; + player_talent_t weapons_of_the_wall; // Row 5 player_talent_t wisdom_of_the_wall; - const spell_data_t *wisdom_of_the_wall_crit_buff; - const spell_data_t *wisdom_of_the_wall_dodge_buff; - const spell_data_t *wisdom_of_the_wall_mastery_buff; } shado_pan; } talent; @@ -1083,7 +1067,6 @@ struct monk_t : public stagger_t { spawner::pet_spawner_t xuen; spawner::pet_spawner_t niuzao; - spawner::pet_spawner_t white_tiger_statue; pets_t( monk_t *p ); } pets; @@ -1147,7 +1130,6 @@ struct monk_t : public stagger_t double composite_attack_power_multiplier() const override; double composite_dodge() const override; double composite_player_target_armor( player_t *target ) const override; - double resource_regen_per_second( resource_e ) const override; // Other bool wowv_l( wowv_t value ) const; diff --git a/engine/class_modules/monk/sc_monk_pets.cpp b/engine/class_modules/monk/sc_monk_pets.cpp index 040c9609cfb..aeb9c89bc24 100644 --- a/engine/class_modules/monk/sc_monk_pets.cpp +++ b/engine/class_modules/monk/sc_monk_pets.cpp @@ -279,7 +279,8 @@ struct xuen_pet_t : public monk_pet_t struct crackling_tiger_lightning_tick_t : public pet_spell_t { crackling_tiger_lightning_tick_t( xuen_pet_t *p ) - : pet_spell_t( "crackling_tiger_lightning_tick", p, p->o()->talent.windwalker.crackling_tiger_lightning ) + : pet_spell_t( "crackling_tiger_lightning_tick", p, + p->o()->talent.conduit_of_the_celestials.crackling_tiger_lightning_driver->effectN( 1 ).trigger() ) { background = true; merge_report = false; @@ -289,14 +290,17 @@ struct xuen_pet_t : public monk_pet_t struct crackling_tiger_lightning_t : public pet_spell_t { crackling_tiger_lightning_t( xuen_pet_t *p, std::string_view options_str ) - : pet_spell_t( "crackling_tiger_lightning", p, p->o()->talent.windwalker.crackling_tiger_lightning_driver ) + : pet_spell_t( "crackling_tiger_lightning", p, + p->o()->talent.conduit_of_the_celestials.crackling_tiger_lightning_driver ) { parse_options( options_str ); - s_data_reporting = p->o()->talent.windwalker.crackling_tiger_lightning; + s_data_reporting = + p->o()->talent.conduit_of_the_celestials.crackling_tiger_lightning_driver->effectN( 1 ).trigger(); - dot_duration = p->o()->talent.windwalker.invoke_xuen_the_white_tiger->duration(); + dot_duration = p->o()->talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger->duration(); cooldown->duration = - p->o()->talent.windwalker.invoke_xuen_the_white_tiger->duration(); // we're done when Xuen despawns + p->o()->talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger->duration(); // we're done when Xuen + // despawns tick_action = new crackling_tiger_lightning_tick_t( p ); } @@ -403,8 +407,8 @@ struct auto_attack_t : public pet_auto_attack_t niuzao_pet_t::niuzao_pet_t( std::string_view name, monk_t *player ) : monk_pet_t( player, name, PET_NIUZAO, false, true ), stomp( nullptr ) { - npc_id = as( o()->talent.windwalker.invoke_xuen_the_white_tiger_npc->effectN( 1 ).misc_value1() ); - main_hand_weapon.type = WEAPON_BEAST; + npc_id = as( o()->talent.conduit_of_the_celestials.invoke_xuen_the_white_tiger_npc->effectN( 1 ).misc_value1() ); + main_hand_weapon.type = WEAPON_BEAST; main_hand_weapon.min_dmg = dbc->spell_scaling( o()->type, level() ); main_hand_weapon.max_dmg = dbc->spell_scaling( o()->type, level() ); main_hand_weapon.damage = ( main_hand_weapon.min_dmg + main_hand_weapon.max_dmg ) / 2; @@ -442,54 +446,11 @@ struct invoke_niuzao_pet_t : public niuzao::niuzao_pet_t { } }; - -struct white_tiger_statue_t : public monk_pet_t -{ -private: - struct claw_of_the_white_tiger_t : public pet_spell_t - { - claw_of_the_white_tiger_t( white_tiger_statue_t *p, std::string_view options_str ) - : pet_spell_t( "claw_of_the_white_tiger", p, p->o()->talent.monk.claw_of_the_white_tiger ) - { - parse_options( options_str ); - aoe = -1; - } - }; - -public: - white_tiger_statue_t( monk_t *owner ) : monk_pet_t( owner, "white_tiger_statue", PET_MONK_STATUE, false, true ) - { - npc_id = owner->talent.monk.summon_white_tiger_statue->effectN( 1 ).misc_value1(); - main_hand_weapon.type = WEAPON_BEAST; - main_hand_weapon.min_dmg = dbc->spell_scaling( o()->type, level() ); - main_hand_weapon.max_dmg = dbc->spell_scaling( o()->type, level() ); - main_hand_weapon.damage = ( main_hand_weapon.min_dmg + main_hand_weapon.max_dmg ) / 2; - main_hand_weapon.swing_time = timespan_t::from_seconds( 2.0 ); - owner_coeff.ap_from_ap = 1.00; - } - - void init_action_list() override - { - action_list_str = "claw_of_the_white_tiger"; - - pet_t::init_action_list(); - } - - action_t *create_action( std::string_view name, std::string_view options_str ) override - { - if ( name == "claw_of_the_white_tiger" ) - return new claw_of_the_white_tiger_t( this, options_str ); - - return pet_t::create_action( name, options_str ); - } -}; - } // end namespace pets monk_t::pets_t::pets_t( monk_t *p ) : xuen( "xuen_the_white_tiger", p, []( monk_t *p ) { return new pets::xuen_pet_t( p ); } ), - niuzao( "niuzao_the_black_ox", p, []( monk_t *p ) { return new pets::invoke_niuzao_pet_t( p ); } ), - white_tiger_statue( "white_tiger_statue", p, []( monk_t *p ) { return new pets::white_tiger_statue_t( p ); } ) + niuzao( "niuzao_the_black_ox", p, []( monk_t *p ) { return new pets::invoke_niuzao_pet_t( p ); } ) { } } // namespace monk diff --git a/engine/dbc/sc_data.cpp b/engine/dbc/sc_data.cpp index 37c18b5ffa4..791e8bac277 100644 --- a/engine/dbc/sc_data.cpp +++ b/engine/dbc/sc_data.cpp @@ -49,7 +49,7 @@ template bool override_field( T* data, const Fields& fields, util::string_view name, double value ) { return detail::handle_field( data, fields, name, [ value ] ( auto& field ) { - field = static_cast>( value ); + field = as>( value ); return true; }, false, detail::size_c::value>{} ); }