Detect when player attacks another player

I figured out how to do this. I use the stat.damageDealt scoreboard objective. First I run the following command once:

/scoreboard objectives add hit stat.damageDealt

Then on the 20Hz clock I do the following:

  • First command block:

    /tellraw @a[score_hit_min=1] "Nice Hit!"

  • Second command block:

    /scoreboard players reset @a[score_hit_min=1] hit

How this works is that points is added to the stat.damageDealt objective each time they hit/attack/hurt an entity or player. Then it runs the command on every player that has hurt another entity or player. When that command is done, the objective gets reset.

How I found this is that on the statistics menu from the pause menu, there is a statistic called Damage Dealt.

EDIT:

In Minecraft 1.9, use the repeating command block instead of a 20Hz clock.


This answer is based on @CommandFox's answer and my own (totally awful) idea for a solution. However, I found that combination of the two adds a possible limitation to hurting specific entities.

First, create two scoreboard objectives: didDamage and hurtTime

scoreboard objectives add didDamage stat.damageDealt
scoreboard objectives add hurtTime dummy

Then, create a fill clock and run the following commands:

scoreboard players add @e hurtTime 1 
scoreboard players set @e hurtTime 0 {HurtTime:0s}

execute @e[score_hurtTime_min=1,score_hurtTime=1] ~ ~ ~ tellraw @a[score_didDamage=1] "Nice hit!"
scoreboard player set @a didDamage 0

So far, we have gained nothing by using the hurtTime objective. The main benefit of it is that it can be limited using its target selector. For example, using

scoreboard players add @e[type=Zombie] hurtTime 1 
scoreboard players set @e[type=Zombie] hurtTime 0 {HurtTime:0s}

makes it so that the message only appears when you actually hit a zombie. Using multiples of this command block pair makes it possible to select multiple entities.