diff -r 2d4c0402fde1 docs/zandronum-history.txt
--- a/docs/zandronum-history.txt	Sun Jan 12 12:13:41 2014 +0100
+++ b/docs/zandronum-history.txt	Sun Apr 13 23:36:17 2014 +0200
@@ -35,6 +35,7 @@
 -	- Fixed: A malformed packet could make the server kick the clients. Thanks to Konar6 for supplying a proof-of-concept exploit that allowed to debug the issue. [Torr Samaho]
 - 	- Fixed: Tampered clients could insert ASCII control characters into chat messages (e.g. line breaks) (ported from Konar6's kpatch). [Torr Samaho]
 -	- Fixed: Strife's crossbow did not appear to use ammo on clients online. [Dusk]
+-	- Fixed: when a player is damaged, don't send useless inconsistent values of HP and Armor (100/100) to the clients if they're not allowed to see the real HP/Armor. [Edward-san]
 !	- Changed huffman code from Hexen II's to that provided by Vortex Cortex. [Blzut3, Vortex Cortex]
 !	- Changed the Offline Skirmish frag slider bar to go in intervals of 1 instead of 5. [Water]
 
diff -r 2d4c0402fde1 src/sv_commands.cpp
--- a/src/sv_commands.cpp	Sun Jan 12 12:13:41 2014 +0100
+++ b/src/sv_commands.cpp	Sun Apr 13 23:36:17 2014 +0200
@@ -632,25 +632,20 @@
 		if ( SERVER_IsValidClient( ulIdx ) == false )
 			continue;
 
+		// [EP] Send the updated health and armor of the player who's being damaged to this client
+		// only if this client is allowed to know (still, don't forget the pain state!).
+		if ( SERVER_IsPlayerAllowedToKnowHealth( ulIdx, ulPlayer ) == false ) {
+			SERVERCOMMANDS_SetThingState( players[ulPlayer].mo, STATE_PAIN, ulIdx, SVCF_ONLYTHISCLIENT );
+			continue;
+		}
+
 		SERVER_CheckClientBuffer( ulIdx, 8, true );
+
 		NETWORK_WriteHeader( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, SVC_DAMAGEPLAYER );
 		NETWORK_WriteByte( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, ulPlayer );
-
-		// Only send the player who's being damaged to this player if this player is
-		// allowed to know what his health is. Otherwise, just tell them it's 100/100
-		// (WHICH IS A LIE!!!!!!).
-		if ( SERVER_IsPlayerAllowedToKnowHealth( ulIdx, ulPlayer ))
-		{
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, players[ulPlayer].health );
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, ulArmorPoints );
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, players[ulPlayer].attacker ? players[ulPlayer].attacker->lNetID : -1 );
-		}
-		else
-		{
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, 100 );
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, 100 );
-			NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, -1 );
-		}
+		NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, players[ulPlayer].health );
+		NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, ulArmorPoints );
+		NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, players[ulPlayer].attacker ? players[ulPlayer].attacker->lNetID : -1 );
 	}
 }
 
@@ -2129,23 +2124,18 @@
 
 //*****************************************************************************
 //
-void SERVERCOMMANDS_SetThingState( AActor *pActor, ULONG ulState )
+void SERVERCOMMANDS_SetThingState( AActor *pActor, ULONG ulState, ULONG ulPlayerExtra, ULONG ulFlags )
 {
 	ULONG	ulIdx;
 
 	if ( !EnsureActorHasNetID (pActor) )
 		return;
 
-	for ( ulIdx = 0; ulIdx < MAXPLAYERS; ulIdx++ )
-	{
-		if ( SERVER_IsValidClient( ulIdx ) == false )
-			continue;
-
-		SERVER_CheckClientBuffer( ulIdx, 4, true );
-		NETWORK_WriteByte( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, SVC_SETTHINGSTATE );
-		NETWORK_WriteShort( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, pActor->lNetID );
-		NETWORK_WriteByte( &SERVER_GetClient( ulIdx )->PacketBuffer.ByteStream, ulState );
-	}
+	NetCommand command( SVC_SETTHINGSTATE );
+	command.addShort( pActor->lNetID );
+	command.addByte( ulState );
+	command.sendCommandToClients( ulPlayerExtra, ulFlags );
+
 }
 
 //*****************************************************************************
diff -r 2d4c0402fde1 src/sv_commands.h
--- a/src/sv_commands.h	Sun Jan 12 12:13:41 2014 +0100
+++ b/src/sv_commands.h	Sun Apr 13 23:36:17 2014 +0200
@@ -135,7 +135,7 @@
 void	SERVERCOMMANDS_MoveThingExact( AActor *pActor, ULONG ulBits, ULONG ulPlayerExtra = MAXPLAYERS, ULONG ulFlags = 0 );
 void	SERVERCOMMANDS_DamageThing( AActor *pActor );
 void	SERVERCOMMANDS_KillThing( AActor *pActor, AActor *pSource, AActor *pInflictor );
-void	SERVERCOMMANDS_SetThingState( AActor *pActor, ULONG ulState );
+void	SERVERCOMMANDS_SetThingState( AActor *pActor, ULONG ulState, ULONG ulPlayerExtra = MAXPLAYERS, ULONG ulFlags = 0 );
 void	SERVERCOMMANDS_SetThingTarget( AActor *pActor );
 void	SERVERCOMMANDS_DestroyThing( AActor *pActor );
 void	SERVERCOMMANDS_SetThingAngle( AActor *pActor, ULONG ulPlayerExtra = MAXPLAYERS, ULONG ulFlags = 0 );
