To make the game itself send a Damage event, all you have to do is to set properly pev_dmg_take, m_bitsDamageType and pev_dmg_inflictor, Damage message will be sent at UpdateClientData :
Code:
if (pev->dmg_take || pev->dmg_save || m_bitsHUDDamage != m_bitsDamageType)
{
// Comes from inside me if not set
Vector damageOrigin = pev->origin;
// send "damage" message
// causes screen to flash, and pain compass to show direction of damage
edict_t *other = pev->dmg_inflictor;
if ( other )
{
CBaseEntity *pEntity = CBaseEntity::Instance(other);
if ( pEntity )
damageOrigin = pEntity->Center();
}
// only send down damage type that have hud art
int visibleDamageBits = m_bitsDamageType & DMG_SHOWNHUD;
MESSAGE_BEGIN( MSG_ONE, gmsgDamage, NULL, pev );
WRITE_BYTE( pev->dmg_save );
WRITE_BYTE( pev->dmg_take );
WRITE_LONG( visibleDamageBits );
WRITE_COORD( damageOrigin.x );
WRITE_COORD( damageOrigin.y );
WRITE_COORD( damageOrigin.z );
MESSAGE_END();
pev->dmg_take = 0;
pev->dmg_save = 0;
m_bitsHUDDamage = m_bitsDamageType;
// Clear off non-time-based damage indicators
m_bitsDamageType &= DMG_TIMEBASED;
}
From my gasnade plugin :
PHP Code:
TakeDamage(id, iEnt, iAttacker, Float:flDmg, iDmgBit)
{
new Float:flHealth;
pev(id, pev_health, flHealth);
flHealth -= flDmg;
if( flHealth < 1 )
{
ExecuteHamB( Ham_Killed, id, iAttacker, 0 );
return;
}
set_pev(id, pev_health, flHealth);
set_pev(id, pev_dmg_take, flDmg);
set_pdata_int(id, m_bitsDamageType, iDmgBit);
set_pev(id, pev_dmg_inflictor, iEnt);
}
This is an alternative to ExecuteHamB(Ham_TakeDamage so you know the exact damage done, because with Ham_TakeDamage you can't know the final damage.
Then the game will know that player has just taken damage and will send a Damage message with correct origins values.
__________________