void CGibShooter :: ShootThink ( void ) { pev->nextthink = gpGlobals->time + m_flDelay; Vector vecShootDir; vecShootDir = pev->movedir; vecShootDir = vecShootDir + gpGlobals->v_right * RANDOM_FLOAT( -1, 1) * m_flVariance;; vecShootDir = vecShootDir + gpGlobals->v_forward * RANDOM_FLOAT( -1, 1) * m_flVariance;; vecShootDir = vecShootDir + gpGlobals->v_up * RANDOM_FLOAT( -1, 1) * m_flVariance;; vecShootDir = vecShootDir.Normalize(); CGib *pGib = CreateGib(); if ( pGib ) { pGib->pev->origin = pev->origin; pGib->pev->velocity = vecShootDir * m_flGibVelocity; pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); float thinkTime = pGib->pev->nextthink - gpGlobals->time; pGib->m_lifeTime = (m_flGibLife * RANDOM_FLOAT( 0.95, 1.05 )); // +/- 5% if ( pGib->m_lifeTime < thinkTime ) { pGib->pev->nextthink = gpGlobals->time + pGib->m_lifeTime; pGib->m_lifeTime = 0; } } if ( --m_iGibs <= 0 ) { if ( pev->spawnflags & SF_GIBSHOOTER_REPEATABLE ) { m_iGibs = m_iGibCapacity; SetThink ( NULL ); pev->nextthink = gpGlobals->time; } else { SetThink ( SUB_Remove ); pev->nextthink = gpGlobals->time; } } }
LTBOOL CGibFX::CreateObject(ILTClient *pClientDE) { LTBOOL bRet = CSpecialFX::CreateObject(pClientDE); if (!bRet) return bRet; // Initialize the Gib velocity ranges based on our rotation... LTVector vVelMin, vVelMax, vTemp, vU, vR, vF; VEC_SET(vVelMin, 1.0f, 1.0f, 1.0f); VEC_SET(vVelMax, 1.0f, 1.0f, 1.0f); m_pClientDE->GetRotationVectors(&m_rRot, &vU, &vR, &vF); if (vF.y <= -0.95f || vF.y >= 0.95f) { vF.y = vF.y > 0.0f ? 1.0f : -1.0f; VEC_SET(vR, 1.0f, 0.0f, 0.0f); VEC_SET(vU, 0.0f, 0.0f, 1.0f); } else if (vF.x <= -0.95f || vF.x >= 0.95f) { vF.x = vF.x > 0.0f ? 1.0f : -1.0f; VEC_SET(vR, 0.0f, 1.0f, 0.0f); VEC_SET(vU, 0.0f, 0.0f, 1.0f); } else if (vF.z <= -0.95f || vF.z >= 0.95f) { vF.z = vF.z > 0.0f ? 1.0f : -1.0f; VEC_SET(vR, 1.0f, 0.0f, 0.0f); VEC_SET(vU, 0.0f, 1.0f, 0.0f); } VEC_MULSCALAR(vVelMin, vF, m_vMinVel.y); VEC_MULSCALAR(vVelMax, vF, m_vMaxVel.y); VEC_MULSCALAR(vTemp, vR, m_vMinVel.x); VEC_ADD(vVelMin, vVelMin, vTemp); VEC_MULSCALAR(vTemp, vR, m_vMaxVel.x); VEC_ADD(vVelMax, vVelMax, vTemp); VEC_MULSCALAR(vTemp, vU, m_vMinVel.z); VEC_ADD(vVelMin, vVelMin, vTemp); VEC_MULSCALAR(vTemp, vU, m_vMaxVel.z); VEC_ADD(vVelMax, vVelMax, vTemp); // Initialize our emitters... LTVector vVel; for (int i=0; i < m_nNumGibs; i++) { if (i < m_nNumGibs - m_nNumRandomGibs) { m_hGib[i] = CreateGib(m_eGibTypes[i]); } else { m_hGib[i] = CreateRandomGib(); } m_fGibLife[i] = GetRandom(m_fLifeTime, m_fLifeTime * 2.0f); m_pGibTrail[i] = CreateGibTrail(m_hGib[i]); m_ActiveEmitters[i] = LTTRUE; m_BounceCount[i] = GetRandom(2, 5); VEC_SET(vVel, GetRandom(vVelMin.x, vVelMax.x), 50.0f + GetRandom(vVelMin.y, vVelMax.y), GetRandom(vVelMin.z, vVelMax.z)); InitMovingObject(&(m_Emitters[i]), &m_vPos, &vVel); m_Emitters[i].m_dwPhysicsFlags |= m_nGibFlags; } // Create a big burst of blood... if ( m_eModelType == eModelTypeHuman ) { //CreateBloodSpray(); } // Play die sound... char* pSound = GetGibDieSound(); if (pSound) { g_pClientSoundMgr->PlaySoundFromPos(m_vPos, pSound, 1000.0f, SOUNDPRIORITY_MISC_LOW); } return bRet; }