Briefly looking through the code seems to agree that this theory might be correct, but it has been a long day at work and I may be misreading. I will stress the "brief" look part. Here's some of the relevant code for those interested, with the red stuff being what I believe is most important...:
Code:
// Arcane Shot Attack =======================================================
struct arcane_shot_t : public hunter_ranged_attack_t
{
arcane_shot_t( hunter_t* player, const std::string& options_str ) :
hunter_ranged_attack_t( "arcane_shot", player, player -> find_class_spell( "Arcane Shot" ) )
{
parse_options( NULL, options_str );
}
virtual double cost()
{
return thrill_discount( hunter_ranged_attack_t::cost() );
}
virtual void execute()
{
hunter_ranged_attack_t::execute();
consume_thrill_of_the_hunt();
trigger_tier16_2pc_melee();
if ( result_is_hit( execute_state -> result ) ) {
trigger_tier15_4pc_melee( p() -> procs.tier15_4pc_melee_arcane_shot, p() -> action_lightning_arrow_arcane_shot );
}
}
virtual void impact( action_state_t* state )
{
hunter_ranged_attack_t::impact( state );
if ( result_is_hit( state -> result ) )
{
p() -> buffs.cobra_strikes -> trigger( 2 );
// Needs testing
p() -> buffs.tier13_4pc -> trigger();
}
}
};
Code:
// thrill_of_the_hunt support =============================================
void trigger_thrill_of_the_hunt()
{
if ( p() -> talents.thrill_of_the_hunt -> ok() && cost() > 0 )
// Stacks: 3 initial, 3 maximum
if ( p() -> buffs.thrill_of_the_hunt -> trigger( p() -> buffs.thrill_of_the_hunt -> data().initial_stacks() ) )
p() -> procs.thrill_of_the_hunt -> occur();
}
double thrill_discount( double cost )
{
double result = cost;
if ( p() -> buffs.thrill_of_the_hunt -> check() )
result += p() -> buffs.thrill_of_the_hunt -> data().effectN( 1 ).base_value();
return std::max(0.0, result);
}
void consume_thrill_of_the_hunt()
{
if ( p() -> buffs.thrill_of_the_hunt -> up() )
{
double cost = hunter_action_t::cost();
p() -> resource_gain( RESOURCE_FOCUS, cost, p() -> gains.thrill_of_the_hunt );
p() -> buffs.thrill_of_the_hunt -> decrement();
}
}
Code:
virtual void execute()
{
ranged_attack_t::execute();
if ( p() -> specs.steady_focus -> ok() )
trigger_steady_focus();
if ( p() -> buffs.pre_steady_focus -> stack() == 2 )
{
double haste_buff = p() -> buffs.steady_focus -> data().effectN( 1 ).percent();
haste_buff += p() -> sets -> set( SET_T14_4PC_MELEE ) -> effectN( 3 ).percent();
p() -> buffs.steady_focus -> trigger( 1, haste_buff );
p() -> buffs.pre_steady_focus -> expire();
}
trigger_thrill_of_the_hunt();
trigger_tier16_bm_4pc_melee();
if ( result_is_hit( execute_state -> result ) )
trigger_wild_quiver();
}