/**
* Description: Normally called whenever an entity dies.
* Forward params: function(this, idattacker, shouldgib)
* Return type: None.
* Execute params: ExecuteHam(Ham_Killed, this, idattacker, shouldgib);
*/
Ham_Killed,
Ham_Killed wykrywa śmierć dowolnego bytu o określonej klasie.
Samo ustawienie flagi FL_KILLMEjednak nie usuwa jednak bytu, konieczne jest wywołanie procesu myślenia bytu, by został on zabity.
Tym samym odpowiedź na pytanie jest negatywna, ustawienie glagi FL_KILLMEnie wywołuje Ham_Killed, a dopiero proces myślenia po ustawieniu flagi.
Jednakże, i to nie zawsze zadziała, a tym samym nie zawsze aktywuje Ham_Killed, gdyż niektóre typy bytów nie potrafią obsłużyć procesu samozagłady,
nawet posiadając pdatę flag na śmierć i przyjąwszy flagę FL_KILLME, gdyż nie będą w stanie usunąć się, co wynika ze specyfikacji procesu samozagłady:
void CBaseEntity::UpdateOnRemove( void )
{
int i;
if ( FBitSet( pev->flags, FL_GRAPHED ) )
{
// this entity was a LinkEnt in the world node graph, so we must remove it from
// the graph since we are removing it from the world.
for ( i = 0 ; i < WorldGraph.m_cLinks ; i++ )
{
if ( WorldGraph.m_pLinkPool [ i ].m_pLinkEnt == pev )
{
// if this link has a link ent which is the same ent that is removing itself, remove it!
WorldGraph.m_pLinkPool [ i ].m_pLinkEnt = NULL;
}
}
}
if ( pev->globalname )
gGlobalState.EntitySetState( pev->globalname, GLOBAL_DEAD );
}
pev->targetname nie przechowuje bowiem w przypadku niektórych bytów danych, co uniemożliwia zakończenia procesu samozagłady.
Tym samym, nie dla każdego typu bytów zostanie wywołane Ham_Killed, a bez wywołania procesu myślenia, nigdy.