You’re right—the timer never counts down because your “damage detected” block keeps firing every tick as long as prev_health_percent is higher than current, so it instantly resets the timer back to 10 before the countdown can subtract anything.
Fix it by only running the damage block when the flash is currently inactive (i.e., health_flash_timer = 0). The ticker should look like this:
▶ IF (Is Number getvariable:health_flash_timer = 0)
└─ IF (Is Number current_player_health_percent < getvariable:prev_health_percent)
└─ Set Variable Value health_flash_timer:10
└─ Set Variable Value health_flash_alpha:1
Then keep the countdown block as before:
▶ IF (Is Number getvariable:health_flash_timer > 0)
└─ Set Variable Value health_flash_timer:{"placeholder":"maxnum","values":{"first":"0","second":{"placeholder":"calc","values":{"decimal":"true","expression":"{"placeholder":"getvariable","values":{"name":"health_flash_timer"}} - 1"}}}}
└─ Set Variable Value health_flash_alpha:{"placeholder":"calc","values":{"decimal":"true","expression":"{"placeholder":"getvariable","values":{"name":"health_flash_timer"}} / 10"}}
...and finally, after that countdown finishes:
▶ IF (Is Number getvariable:health_flash_timer = 0)
└─ Set Variable Value prev_health_percent:{"placeholder":"current_player_health_percent"}
This way the damage branch can only trigger when the flash isn’t already running, letting the timer tick from 10 down to 0. Make sure all nested placeholders are inserted as JSON objects (no extra quotes) so they can evaluate each tick.