Voici le code de TraceAttack :
PHP Code:
void CBasePlayer::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
{
BOOL shouldBleed = TRUE;
BOOL shouldSpark = FALSE;
BOOL hitShield = IsHittingShield( vecDir, ptr );
CBasePlayer *pAttacker = (CBasePlayer *)CBaseEntity::Instance( pevAttacker );
if( m_iTeam == pAttacker->m_iTeam && CVAR_GET_FLOAT( "mp_friendlyfire" ) )
{
shouldBleed = FALSE;
}
if( !pev->takedamage )
{
return;
}
m_LastHitGroup = ptr->iHitgroup;
if( hitShield )
{
flDamage = 0.0;
shouldBleed = FALSE;
if( RANDOM_LONG( 0, 1 ) )
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/ric_metal-1.wav", VOL_NORM, ATTN_NORM );
else
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/ric_metal-2.wav", VOL_NORM, ATTN_NORM );
UTIL_Sparks( ptr->vecEndPos );
pev->punchangle.x = flDamage * RANDOM_FLOAT( -0.15, 0.15 );
pev->punchangle.z = flDamage * RANDOM_FLOAT( -0.15, 0.15 );
if( pev->punchangle.x < 4 )
pev->punchangle.x = -4;
if( pev->punchangle.z < -5 )
pev->punchangle.z = -5;
else if( pev->punchangle.z > 5 )
pev->punchangle.z = 5;
}
else
{
switch( ptr->iHitgroup )
{
case HITGROUP_HEAD :
{
if( m_iKevlar == 2 )
{
shouldBleed = FALSE;
shouldSpark = TRUE;
}
flDamage *= 4;
if( shouldBleed )
{
pev->punchangle.x = flDamage * -0.5;
if( pev->punchangle.x < -12 )
pev->punchangle.x = -12;
pev->punchangle.z = flDamage * RANDOM_FLOAT( -1.0, 1.0 );
if( pev->punchangle.z < -9 )
pev->punchangle.z = -9;
else if( pev->punchangle.z > 9 )
pev->punchangle.z = 9;
}
break;
}
case HITGROUP_CHEST :
{
if( m_iKevlar )
{
shouldBleed = FALSE;
}
if( shouldBleed )
{
pev->punchangle.x = flDamage * -0.1;
if( pev->punchangle.x < -4 )
pev->punchangle.x = -4;
}
break;
}
case HITGROUP_STOMACH :
{
if( m_iKevlar )
{
shouldBleed = FALSE;
}
flDamage *= 1.25;
if( shouldBleed )
{
pev->punchangle.x = flDamage * -0.1;
if( pev->punchangle.x < -4 )
pev->punchangle.x = -4;
}
break;
}
case HITGROUP_LEFTARM :
case HITGROUP_RIGHTARM :
{
if( m_iKevlar )
{
shouldBleed = FALSE;
}
break;
}
case HITGROUP_LEFTLEG :
case HITGROUP_RIGHTLEG :
{
flDamage *= 0.75;
break;
}
}
}
if( shouldBleed )
{
BloodSplat( ptr->vecEndPos, vecDir, ptr->iHitgroup, (int)( flDamage * 5 ) );
SpawnBlood( ptr->vecEndPos, BloodColor(), flDamage );
TraceBleed( flDamage, vecDir, ptr, bitsDamageType );
}
else if( ptr->iHitgroup == HITGROUP_HEAD && shouldSpark )
{
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, ptr->vecEndPos );
WRITE_BYTE( TE_STREAK_SPLASH );
WRITE_COORD( ptr->vecEndPos.x );
WRITE_COORD( ptr->vecEndPos.y );
WRITE_COORD( ptr->vecEndPos.z );
WRITE_COORD( ptr->vecPlaneNormal.x );
WRITE_COORD( ptr->vecPlaneNormal.y );
WRITE_COORD( ptr->vecPlaneNormal.z );
WRITE_BYTE( 5 );
WRITE_SHORT( 22 );
WRITE_SHORT( 25 );
WRITE_SHORT( 65 );
MESSAGE_END();
}
AddMultiDamage( pevAttacker, this, flDamage, bitsDamageType );
}
Ca n'appelle pas directement TakeDamage et tu vois à la place AddMultiDamage.
PHP Code:
//
// ClearMultiDamage - resets the global multi damage accumulator
//
void ClearMultiDamage(void)
{
gMultiDamage.pEntity = NULL;
gMultiDamage.amount = 0;
gMultiDamage.type = 0;
}
//
// ApplyMultiDamage - inflicts contents of global multi damage register on gMultiDamage.pEntity
//
// GLOBALS USED:
// gMultiDamage
void ApplyMultiDamage(entvars_t *pevInflictor, entvars_t *pevAttacker )
{
Vector vecSpot1;//where blood comes from
Vector vecDir;//direction blood should go
TraceResult tr;
if ( !gMultiDamage.pEntity )
return;
gMultiDamage.pEntity->TakeDamage(pevInflictor, pevAttacker, gMultiDamage.amount, gMultiDamage.type );
}
// GLOBALS USED:
// gMultiDamage
void AddMultiDamage( entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType)
{
if ( !pEntity )
return;
gMultiDamage.type |= bitsDamageType;
if ( pEntity != gMultiDamage.pEntity )
{
ApplyMultiDamage(pevInflictor,pevInflictor); // UNDONE: wrong attacker!
gMultiDamage.pEntity = pEntity;
gMultiDamage.amount = 0;
}
gMultiDamage.amount += flDamage;
}
Le but de AddMultiDamage, c'est de cumuler les dégâts subits, pour un même joueur, de n'importe quel attaqueur, le temps d'une frame. Et après, ApplyMultiDamage est appelé pour envoyer TakeDamage.
C'est là ton problème.
Normalement quand TraceAttack est appelé, ApplyMultiDamage doit être appelé immédiatement après dans ton code. Tu peux voir des exemples dans HLSDK, c'est toujours appelé. Ca permet comme tu l'auras compris de donner les dégâts accumélés.
En ne le faisant pas et en se basant que sur AddMultiDamage, ApplyMultiDamage va se déclencher que quand l'entité (victime) enregistré la première fois ne sera plus le même, et du coup TakeDamage se executé sur l'entité enregistré auparavant.
Pour résoudre ton souci, soit tu zappes TraceAttack, soit tu utilises Orpheu pour appeler ApplyMultiDamage après ton TraceAttack. La deuxième option est plus cool tout de même. Si t'as besoin d'aide sur orpheu, dis le moi.
__________________