Skip to content

Commit 5b8b039

Browse files
[Paladin] Walk Into Light, changed Sun's Avatar, remove Herald Tier
1 parent 3f595c8 commit 5b8b039

File tree

3 files changed

+71
-180
lines changed

3 files changed

+71
-180
lines changed

engine/class_modules/paladin/sc_paladin.cpp

Lines changed: 37 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ paladin_t::paladin_t( sim_t* sim, util::string_view name, race_e r )
7676
cooldowns.second_sunrise_icd = get_cooldown( "second_sunrise_icd" );
7777
cooldowns.second_sunrise_icd->duration = find_spell( 431474 )->internal_cooldown();
7878

79+
cooldowns.walk_into_light_icd = get_cooldown( "walk_into_light_icd" );
80+
cooldowns.walk_into_light_icd->duration = find_spell( 1263782 )->internal_cooldown();
81+
7982
cooldowns.art_of_war = get_cooldown( "art_of_war" );
8083
cooldowns.art_of_war->duration = find_spell( 406064 )->internal_cooldown();
8184

@@ -267,7 +270,6 @@ avenging_wrath_t::avenging_wrath_t( paladin_t* p )
267270
: paladin_spell_t( "avenging_wrath", p, p->find_spell( 454351 ) )
268271
{
269272
background = true;
270-
is_proc_background = true;
271273
harmful = false;
272274
}
273275

@@ -285,7 +287,6 @@ avenging_wrath_t::avenging_wrath_t( paladin_t* p, util::string_view options_str
285287
background = true;
286288

287289
harmful = false;
288-
is_proc_background = false;
289290
}
290291

291292
action_state_t* avenging_wrath_t::new_state()
@@ -296,21 +297,25 @@ action_state_t* avenging_wrath_t::new_state()
296297
void avenging_wrath_t::execute()
297298
{
298299
paladin_spell_t::execute();
299-
if ( is_proc_background )
300-
return;
301300

302301
p()->buffs.avenging_wrath->trigger();
303302
if ( p()->talents.lightsmith.blessing_of_the_forge->ok() )
304303
p()->buffs.lightsmith.blessing_of_the_forge->execute();
305304

306-
if ( p()->talents.herald_of_the_sun.suns_avatar->ok() )
307-
p()->apply_avatar_dawnlights();
308-
309305
if ( p()->talents.empyrean_legacy->ok() )
310306
p()->buffs.empyrean_legacy->trigger();
311307

312308
if ( p()->talents.hammer_of_wrath->ok() )
313309
p()->buffs.hammer_of_wrath->trigger();
310+
311+
if ( p()->talents.herald_of_the_sun.walk_into_light->ok() &&
312+
p()->rng().roll( p()->talents.herald_of_the_sun.walk_into_light->effectN( 1 ).percent() ) )
313+
{
314+
p()->resource_gain( RESOURCE_HOLY_POWER,
315+
as<int>( p()->talents.herald_of_the_sun.walk_into_light->effectN( 2 ).base_value() ),
316+
p()->gains.hp_walk_into_light );
317+
p()->buffs.herald_of_the_sun.blessing_of_anshe->trigger();
318+
}
314319
}
315320

316321
// Consecration =============================================================
@@ -1648,6 +1653,11 @@ void hammer_of_wrath_t::execute()
16481653
p()->active.divine_resonance_ret_how->execute_on_target( execute_state->target );
16491654
p()->buffs.divine_resonance->decrement();
16501655
}
1656+
if (p()->talents.herald_of_the_sun.walk_into_light->ok() && p()->wings_up() && p()->cooldowns.walk_into_light_icd->up())
1657+
{
1658+
p()->active.blade_of_justice->execute_on_target( execute_state->target );
1659+
p()->cooldowns.walk_into_light_icd->start();
1660+
}
16511661
}
16521662

16531663
void hammer_of_wrath_t::impact( action_state_t* s )
@@ -2920,17 +2930,27 @@ struct dawnlight_aoe_t : public paladin_spell_t
29202930

29212931
struct dawnlight_t : public paladin_spell_t
29222932
{
2933+
struct suns_avatar_dmg_t : public paladin_spell_t
2934+
{
2935+
suns_avatar_dmg_t( paladin_t* p ) : paladin_spell_t( "suns_avatar", p, p->find_spell( 431911 ) )
2936+
{
2937+
background = true;
2938+
aoe = -1;
2939+
reduced_aoe_targets = p->talents.herald_of_the_sun.suns_avatar->effectN( 6 ).base_value();
2940+
}
2941+
};
29232942
dawnlight_aoe_t* aoe_action;
2943+
suns_avatar_dmg_t* suns_avatar;
29242944

2925-
dawnlight_t( paladin_t* p ) :
2926-
paladin_spell_t( "dawnlight", p, p->find_spell( 431380 ) ),
2927-
aoe_action( new dawnlight_aoe_t( p ) )
2928-
2945+
dawnlight_t( paladin_t* p )
2946+
: paladin_spell_t( "dawnlight", p, p->find_spell( 431380 ) ),
2947+
aoe_action( new dawnlight_aoe_t( p ) ),
2948+
suns_avatar( new suns_avatar_dmg_t( p ) )
29292949
{
2930-
background = true;
2950+
background = true;
29312951
affected_by.highlords_judgment = true;
2932-
tick_may_crit = true;
2933-
dot_behavior = dot_behavior_e::DOT_EXTEND; // per bolas test Aug 21 2024
2952+
tick_may_crit = true;
2953+
dot_behavior = dot_behavior_e::DOT_EXTEND; // per bolas test Aug 21 2024
29342954
}
29352955

29362956
void execute() override
@@ -2942,14 +2962,6 @@ struct dawnlight_t : public paladin_spell_t
29422962

29432963
if ( p()->buffs.herald_of_the_sun.morning_star->up() )
29442964
p()->buffs.herald_of_the_sun.morning_star->expire();
2945-
2946-
if ( p()->talents.herald_of_the_sun.suns_avatar->ok() )
2947-
{
2948-
if ( ( !p()->buffs.herald_of_the_sun.suns_avatar->up() ) && p()->buffs.avenging_wrath->up() )
2949-
{
2950-
p()->buffs.herald_of_the_sun.suns_avatar->trigger();
2951-
}
2952-
}
29532965
}
29542966

29552967
double composite_persistent_multiplier( const action_state_t* s ) const override
@@ -2962,42 +2974,19 @@ struct dawnlight_t : public paladin_spell_t
29622974
return cpm;
29632975
}
29642976

2965-
double dot_duration_pct_multiplier( const action_state_t* s ) const override
2966-
{
2967-
double mul = paladin_spell_t::dot_duration_pct_multiplier( s );
2968-
2969-
if ( p()->talents.herald_of_the_sun.suns_avatar->ok() )
2970-
{
2971-
if ( p()->buffs.avenging_wrath->up() )
2972-
{
2973-
mul *= 1.0 + p()->talents.herald_of_the_sun.suns_avatar->effectN( 5 ).percent();
2974-
}
2975-
}
2976-
2977-
return mul;
2978-
}
2979-
29802977
void tick( dot_t* d ) override
29812978
{
29822979
paladin_spell_t::tick( d );
29832980

29842981
aoe_action->base_dd_min = aoe_action->base_dd_max = d->state->result_amount * p()->spells.herald_of_the_sun.dawnlight_aoe_metadata->effectN( 1 ).percent();
29852982
aoe_action->execute_on_target( d->target );
2983+
suns_avatar->execute_on_target( d->target );
29862984
}
29872985

29882986
void last_tick( dot_t* d ) override
29892987
{
29902988
paladin_spell_t::last_tick( d );
29912989

2992-
unsigned num_dawnlights = p()->get_active_dots( d );
2993-
if ( num_dawnlights == 0 )
2994-
{
2995-
if ( p()->talents.herald_of_the_sun.suns_avatar->ok() )
2996-
{
2997-
p()->buffs.herald_of_the_sun.suns_avatar->expire();
2998-
}
2999-
}
3000-
30012990
if ( p()->talents.herald_of_the_sun.lingering_radiance->ok() )
30022991
{
30032992
paladin_td_t* target_data = td( d->target );
@@ -3006,75 +2995,6 @@ struct dawnlight_t : public paladin_spell_t
30062995
}
30072996
};
30082997

3009-
void paladin_t::apply_avatar_dawnlights()
3010-
{
3011-
if ( !talents.herald_of_the_sun.suns_avatar->ok() )
3012-
return;
3013-
3014-
unsigned num_dawnlights = (unsigned) as<int>( talents.herald_of_the_sun.suns_avatar->effectN( 3 ).base_value() );
3015-
3016-
// per bolas Aug 21 2024. Can't seem to find this in spelldata
3017-
if ( !talents.crusade->ok() )
3018-
num_dawnlights = 2;
3019-
if ( talents.radiant_glory->ok() )
3020-
num_dawnlights = 1;
3021-
3022-
std::vector<player_t*> tl_candidates;
3023-
std::vector<player_t*> tl_yes_dawnlight;
3024-
for ( auto* t : sim->target_non_sleeping_list )
3025-
{
3026-
if ( t->is_enemy() )
3027-
{
3028-
auto* dawnlight = active.dawnlight->get_dot( t );
3029-
if ( dawnlight->is_ticking() )
3030-
tl_yes_dawnlight.push_back( t );
3031-
else
3032-
tl_candidates.push_back( t );
3033-
}
3034-
}
3035-
3036-
if ( tl_candidates.size() < num_dawnlights )
3037-
{
3038-
auto needed = num_dawnlights - tl_candidates.size();
3039-
3040-
std::stable_sort( tl_yes_dawnlight.begin(), tl_yes_dawnlight.end(), [this]( player_t* a, player_t* b ){
3041-
auto* dla = active.dawnlight->get_dot( a );
3042-
auto* dlb = active.dawnlight->get_dot( b );
3043-
return dla->remains() < dlb->remains();
3044-
} );
3045-
3046-
auto have = tl_yes_dawnlight.size();
3047-
auto num_extra = have < needed ? have : needed;
3048-
3049-
for ( auto i = 0u; i < num_extra; i++ )
3050-
tl_candidates.push_back( tl_yes_dawnlight[ i ] );
3051-
}
3052-
3053-
auto have_total = tl_candidates.size();
3054-
if ( num_dawnlights < have_total )
3055-
have_total = num_dawnlights;
3056-
3057-
for ( auto i = 0u; i < have_total; i++ )
3058-
{
3059-
active.dawnlight->execute_on_target( tl_candidates[ i ] );
3060-
}
3061-
3062-
if ( bugs && have_total > 0 && talents.radiant_glory->ok() )
3063-
{
3064-
active.dawnlight->execute_on_target( tl_candidates[ 0 ] );
3065-
}
3066-
}
3067-
3068-
struct suns_avatar_dmg_t : public paladin_spell_t
3069-
{
3070-
suns_avatar_dmg_t( paladin_t* p ) : paladin_spell_t( "suns_avatar", p, p->find_spell( 431911 ) )
3071-
{
3072-
background = true;
3073-
aoe = -1;
3074-
reduced_aoe_targets = p->talents.herald_of_the_sun.suns_avatar->effectN( 6 ).base_value();
3075-
}
3076-
};
3077-
30782998
// ==========================================================================
30792999
// End Attacks
30803000
// ==========================================================================
@@ -3349,10 +3269,6 @@ void paladin_t::create_actions()
33493269
{
33503270
active.dawnlight = new dawnlight_t( this );
33513271
}
3352-
if ( talents.herald_of_the_sun.suns_avatar->ok() )
3353-
{
3354-
active.suns_avatar_dmg = new suns_avatar_dmg_t( this );
3355-
}
33563272

33573273
active.shield_of_vengeance_damage = new shield_of_vengeance_proc_t( this );
33583274

@@ -3535,6 +3451,7 @@ void paladin_t::init_gains()
35353451
gains.hp_divine_toll = get_gain( "divine_toll" );
35363452
gains.hp_crusading_strikes = get_gain( "crusading_strikes" );
35373453
gains.hp_glory_of_the_vanguard_2 = get_gain( "glory_of_the_vanguard" );
3454+
gains.hp_walk_into_light = get_gain( "walk_into_light" );
35383455

35393456
gains.hp_judge_jury_and_executioner_refund = get_gain( "judge_jury_and_executioner_refund" );
35403457
}
@@ -3760,35 +3677,7 @@ void paladin_t::create_buffs()
37603677
buffs.herald_of_the_sun.solar_grace = make_buff( this, "solar_grace", find_spell( 439841 ) )
37613678
-> add_invalidate( CACHE_HASTE )
37623679
-> set_stack_behavior( buff_stack_behavior::ASYNCHRONOUS );
3763-
buffs.herald_of_the_sun.dawnlight = make_buff( this, "dawnlight", find_spell( 431522 ) );
3764-
buffs.herald_of_the_sun.suns_avatar = make_buff( this, "suns_avatar", find_spell( 431907 ) )
3765-
->set_tick_callback( [ this ]( buff_t*, int, timespan_t ) {
3766-
active.suns_avatar_dmg->execute_on_target( target );
3767-
});
3768-
3769-
buffs.herald_of_the_sun.solar_wrath = make_buff( this, "solar_wrath", find_spell( 1236972 ) )
3770-
->set_expire_callback( [ this ]( buff_t*, double, timespan_t ) {
3771-
if ( !( buffs.avenging_wrath->up() ) )
3772-
buffs.herald_of_the_sun.suns_avatar->expire();
3773-
} );
3774-
3775-
if ( sets->has_set_bonus( HERO_HERALD_OF_THE_SUN, TWW3, B4 ) && talents.herald_of_the_sun.dawnlight->ok() )
3776-
{
3777-
auto solar_wrath_dawnlight_stacks = sets->set( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN( 2 ).base_value();
3778-
if ( talents.radiant_glory->ok() )
3779-
solar_wrath_dawnlight_stacks -= sets->set( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN( 5 ).base_value();
3780-
else if ( talents.crusade->ok() )
3781-
solar_wrath_dawnlight_stacks += sets->set( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN( 4 ).base_value();
3782-
3783-
buffs.herald_of_the_sun.solar_wrath->set_stack_change_callback(
3784-
[ this, solar_wrath_dawnlight_stacks ]( buff_t*, int, int new_ ) {
3785-
if ( new_ )
3786-
{
3787-
buffs.herald_of_the_sun.dawnlight->trigger( as<int>( solar_wrath_dawnlight_stacks ) );
3788-
}
3789-
} );
3790-
}
3791-
3680+
buffs.herald_of_the_sun.dawnlight = make_buff( this, "dawnlight", find_spell( 431522 ) )->set_chance( 1.0 );
37923681
buffs.vanguard = make_buff( this, "vanguard", find_spell( 1268810 ) );
37933682
buffs.valor = make_buff( this, "valor", find_spell( 1269179 ) );
37943683
buffs.light_blessed_shield =

engine/class_modules/paladin/sc_paladin.hpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ struct paladin_t : public player_t
135135
action_t* highlords_judgment;
136136
action_t* dawnlight;
137137
action_t* sun_sear;
138-
action_t* suns_avatar_dmg;
138+
action_t* blade_of_justice;
139139
action_t* armament[ NUM_ARMAMENT ];
140140
action_t* sacred_weapon_proc_damage;
141141
action_t* sacred_weapon_proc_heal;
@@ -244,8 +244,6 @@ struct paladin_t : public player_t
244244
buff_t* morning_star;
245245
buff_t* solar_grace;
246246
buff_t* morning_star_driver;
247-
buff_t* suns_avatar;
248-
buff_t* solar_wrath;
249247
} herald_of_the_sun;
250248

251249
buff_t* rise_from_ash; // Ret TWW1 4p
@@ -277,6 +275,7 @@ struct paladin_t : public player_t
277275
gain_t* hp_crusading_strikes;
278276
gain_t* hp_judge_jury_and_executioner_refund;
279277
gain_t* hp_glory_of_the_vanguard_2;
278+
gain_t* hp_walk_into_light;
280279
} gains;
281280

282281
// Spec Passives
@@ -325,6 +324,7 @@ struct paladin_t : public player_t
325324

326325
cooldown_t* aurora_icd;
327326
cooldown_t* second_sunrise_icd;
327+
cooldown_t* walk_into_light_icd;
328328

329329
cooldown_t* hammerfall_icd;
330330
cooldown_t* art_of_war;
@@ -874,8 +874,6 @@ struct paladin_t : public player_t
874874
void generate_action_prio_list_holy();
875875
void generate_action_prio_list_holy_dps();
876876

877-
void apply_avatar_dawnlights();
878-
879877
target_specific_t<paladin_td_t> target_data;
880878

881879
virtual const paladin_td_t* find_target_data( const player_t* target ) const override;
@@ -1282,11 +1280,6 @@ struct paladin_action_t : public parse_action_effects_t<Base>
12821280
am *= 1.0 + p()->buffs.avenging_crusader->check_value();
12831281
}
12841282

1285-
if (affected_by.solar_wrath && p()->buffs.herald_of_the_sun.solar_wrath->up())
1286-
{
1287-
am *= 1.0 + p()->sets->set( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN( 1 ).percent();
1288-
}
1289-
12901283
return am;
12911284
}
12921285

@@ -1730,7 +1723,6 @@ struct delayed_execute_event_t : public event_t
17301723

17311724
struct avenging_wrath_t : public paladin_spell_t
17321725
{
1733-
bool is_proc_background;
17341726
avenging_wrath_t( paladin_t* p );
17351727
avenging_wrath_t( paladin_t* p, util::string_view options_str );
17361728
void execute() override;

0 commit comments

Comments
 (0)