Delayed explosion

This commit is contained in:
mittorn 2016-03-02 15:01:27 +00:00
parent 344364cc71
commit 700a102f86
1 changed files with 30 additions and 8 deletions

View File

@ -89,9 +89,10 @@ public:
virtual int BloodColor(void) { return DONT_BLEED; } virtual int BloodColor(void) { return DONT_BLEED; }
virtual void Killed(entvars_t *pevAttacker, int iGib); virtual void Killed(entvars_t *pevAttacker, int iGib);
void CheckRotate(); void CheckRotate();
void RespawnThink(); void EXPORT RespawnThink();
void AngleThink(); void EXPORT AngleThink();
void DeployThink(); void EXPORT DeployThink();
void EXPORT DieThink();
void DamageSound( void ); void DamageSound( void );
void PropRespawn(); void PropRespawn();
void KeyValue( KeyValueData* pkvd); void KeyValue( KeyValueData* pkvd);
@ -576,6 +577,8 @@ void CProp::Killed(entvars_t *pevAttacker, int iGib)
void CProp::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) void CProp::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{ {
if( pev->health <= 0)
return;
if (m_owner2 != pActivator->edict()) if (m_owner2 != pActivator->edict())
{ {
if (pev->velocity.Length() < 100 && pActivator->IsPlayer()) if (pev->velocity.Length() < 100 && pActivator->IsPlayer())
@ -645,6 +648,8 @@ void CProp::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType,
void CProp::Force(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) void CProp::Force(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{ {
if( pev->health <= 0 )
return;
if (m_owner2 != pActivator->edict()) if (m_owner2 != pActivator->edict())
{ {
if (pev->velocity.Length() < 100 && pActivator->IsPlayer()) if (pev->velocity.Length() < 100 && pActivator->IsPlayer())
@ -749,6 +754,8 @@ void CProp::DeployThink( void )
void CProp::BounceTouch(CBaseEntity *pOther) void CProp::BounceTouch(CBaseEntity *pOther)
{ {
if( pev->health <= 0 )
return;
//ALERT( at_console, "BounceTouch: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z ); //ALERT( at_console, "BounceTouch: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z );
// only do damage if we're moving fairly fast // only do damage if we're moving fairly fast
DeployThink(); DeployThink();
@ -776,8 +783,8 @@ void CProp::BounceTouch(CBaseEntity *pOther)
} }
if( (pev->spawnflags & SF_PROP_BREAKABLE) && (pev->velocity.Length() > 700) ) if( (pev->spawnflags & SF_PROP_BREAKABLE) && (pev->velocity.Length() > 700) )
{ {
Killed( VARS(m_attacker), GIB_NORMAL ); pev->nextthink = gpGlobals->time + 0.1;
Die(); SetThink( &CProp::DieThink );
} }
pev->velocity = pev->velocity + pOther->pev->velocity; pev->velocity = pev->velocity + pOther->pev->velocity;
@ -913,7 +920,14 @@ void CProp::PropRespawn()
void CProp::RespawnThink() void CProp::RespawnThink()
{ {
if( !(pev->spawnflags & SF_PROP_RESPAWN)) if( !(pev->spawnflags & SF_PROP_RESPAWN))
{
if( pev->health <= 0 )
{
pev->nextthink = gpGlobals->time + 0.1;
SetThink( &CBaseEntity::SUB_Remove );
}
return; return;
}
PropRespawn(); PropRespawn();
} }
@ -1023,6 +1037,11 @@ void CProp::AngleThink()
pev->angles.z = UTIL_AngleMod(pev->angles.z); pev->angles.z = UTIL_AngleMod(pev->angles.z);
} }
void CProp::DieThink()
{
Killed( VARS(m_attacker), GIB_NORMAL );
Die();
}
int CProp::TakeDamage(entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType) int CProp::TakeDamage(entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType)
{ {
@ -1038,6 +1057,8 @@ int CProp::TakeDamage(entvars_t* pevInflictor, entvars_t* pevAttacker, float flD
if ( !(pev->spawnflags & SF_PROP_BREAKABLE ) ) if ( !(pev->spawnflags & SF_PROP_BREAKABLE ) )
return 0; return 0;
if ( pev->health <= 0 )
return;
// Breakables take double damage from the crowbar // Breakables take double damage from the crowbar
if ( bitsDamageType & DMG_CLUB ) if ( bitsDamageType & DMG_CLUB )
flDamage *= 2; flDamage *= 2;
@ -1049,10 +1070,11 @@ int CProp::TakeDamage(entvars_t* pevInflictor, entvars_t* pevAttacker, float flD
// do the damage // do the damage
pev->health -= flDamage; pev->health -= flDamage;
if (pev->health <= 0) if ( pev->health <= 0 )
{ {
Killed( VARS(m_attacker), GIB_NORMAL ); // delayed explode
Die(); SetThink( &CProp::DieThink );
pev->nextthink = gpGlobals->time + 0.2;
return 0; return 0;
} }