Summary
In monk_action_t::consume_resource() the "Chi Savings on Dodge & Parry & Miss"
block refunds last_resource_cost as chi, without checking which resource
was actually spent. For an energy-cost ability such as Tiger Palm (60 energy),
the engine requests a gain of 60 chi.
Where
engine/class_modules/monk/sc_monk.cpp, lines 410-416
(build 1210-01, git midnight c1935b9; the block is identical in master
as of 2026-09-16):
// Chi Savings on Dodge & Parry & Miss
if ( base_t::last_resource_cost > 0 )
{
double chi_restored = base_t::last_resource_cost;
if ( !base_t::aoe && base_t::result_is_miss( base_t::execute_state->result ) )
p()->resource_gain( RESOURCE_CHI, chi_restored, p()->gain.chi_refund );
}
last_resource_cost is the cost of whatever resource the action used, so it is
only a chi amount for chi spenders. There is no current_resource() == RESOURCE_CHI
guard, unlike the energy refund immediately below it, which does check.
Reproduction
Minimal profile (level 20 so the numbers are easy to read, but the mechanism is
not level-specific — it needs only a miss/dodge/parry on a non-AoE ability):
monk="BugRepro"
level=20
race=pandaren
role=attack
spec=windwalker
main_hand=,id=9485,bonus_id=6710,drop_level=20
off_hand=,id=9485,bonus_id=6710,drop_level=20
target_level=38
max_time=300
iterations=1
log=1
actions=auto_attack
actions+=/blackout_kick
actions+=/tiger_palm
Combat log (gains <actual> (<requested>)):
5.023 BugRepro gains 1.00 (1.00) chi from chi_refund (1.00/5.00)
8.060 BugRepro gains 5.00 (60.00) chi from chi_refund (5.00/5.00)
10.069 BugRepro gains 1.00 (1.00) chi from chi_refund (4.00/5.00)
The 1.00 lines are Blackout Kick (1 chi). The 60.00 line is Tiger Palm:
its 60 energy cost is passed as a chi amount, and the player is filled to
the chi cap in one go.
Resource gains from the same run:
242.0 : chi_refund (chi) (overflow=85.03%)
24.0 : tiger_palm (chi)
So 90% of the chi actually gained came from the refund rather than from the
chi generator.
Expected
The refund should only apply when the spent resource was chi, e.g.
if ( base_t::current_resource() == RESOURCE_CHI && !base_t::aoe &&
base_t::result_is_miss( base_t::execute_state->result ) )
p()->resource_gain( RESOURCE_CHI, base_t::last_resource_cost, p()->gain.chi_refund );
Impact
Any Windwalker sim where non-AoE abilities miss or are dodged gains extra chi,
which turns into extra spender casts. The effect scales with miss/dodge chance,
so it is largest against higher-level targets and negligible against a same-level
dummy. In our level-20 twink sims against a level 38 target the refund supplied
63% of all chi gained over a 10 minute fight (302 chi from chi_refund versus
177 from Tiger Palm), which inflates both DPS and stat weights — mastery in
particular, because the surplus chi is spent on Spinning Crane Kick.
Note that aoe actions (Spinning Crane Kick, Fists of Fury) are excluded by the
!base_t::aoe condition, so the extra chi lands on single-target spenders.
Not part of this report
The energy_refund block below it looks correct: it checks
current_resource() == RESOURCE_ENERGY and refunds 80% of the cost.
A separate question, which we are not claiming either way: whether chi should be
refunded on miss/dodge/parry at all for actual chi spenders. The resource-type
mix-up above is a bug regardless of how that question is answered.
Summary
In
monk_action_t::consume_resource()the "Chi Savings on Dodge & Parry & Miss"block refunds
last_resource_costas chi, without checking which resourcewas actually spent. For an energy-cost ability such as Tiger Palm (60 energy),
the engine requests a gain of 60 chi.
Where
engine/class_modules/monk/sc_monk.cpp, lines 410-416(build
1210-01, gitmidnight c1935b9; the block is identical inmasteras of 2026-09-16):
last_resource_costis the cost of whatever resource the action used, so it isonly a chi amount for chi spenders. There is no
current_resource() == RESOURCE_CHIguard, unlike the energy refund immediately below it, which does check.
Reproduction
Minimal profile (level 20 so the numbers are easy to read, but the mechanism is
not level-specific — it needs only a miss/dodge/parry on a non-AoE ability):
Combat log (
gains <actual> (<requested>)):The
1.00lines are Blackout Kick (1 chi). The60.00line is Tiger Palm:its 60 energy cost is passed as a chi amount, and the player is filled to
the chi cap in one go.
Resource gains from the same run:
So 90% of the chi actually gained came from the refund rather than from the
chi generator.
Expected
The refund should only apply when the spent resource was chi, e.g.
Impact
Any Windwalker sim where non-AoE abilities miss or are dodged gains extra chi,
which turns into extra spender casts. The effect scales with miss/dodge chance,
so it is largest against higher-level targets and negligible against a same-level
dummy. In our level-20 twink sims against a level 38 target the refund supplied
63% of all chi gained over a 10 minute fight (302 chi from
chi_refundversus177 from Tiger Palm), which inflates both DPS and stat weights — mastery in
particular, because the surplus chi is spent on Spinning Crane Kick.
Note that
aoeactions (Spinning Crane Kick, Fists of Fury) are excluded by the!base_t::aoecondition, so the extra chi lands on single-target spenders.Not part of this report
The
energy_refundblock below it looks correct: it checkscurrent_resource() == RESOURCE_ENERGYand refunds 80% of the cost.A separate question, which we are not claiming either way: whether chi should be
refunded on miss/dodge/parry at all for actual chi spenders. The resource-type
mix-up above is a bug regardless of how that question is answered.