void CCineBlood :: BloodGush ( void ) { Vector vecSplatDir; TraceResult tr; pev->nextthink = gpGlobals->time + 0.1; UTIL_MakeVectors(pev->angles); if ( pev->health-- < 0 ) REMOVE_ENTITY(ENT(pev)); // CHANGE_METHOD ( ENT(pev), em_think, SUB_Remove ); if ( RANDOM_FLOAT ( 0 , 1 ) < 0.7 )// larger chance of globs { UTIL_BloodDrips( pev->origin, UTIL_RandomBloodVector(), BLOOD_COLOR_RED, 10 ); } else// slim chance of geyser { UTIL_BloodStream( pev->origin, UTIL_RandomBloodVector(), BLOOD_COLOR_RED, RANDOM_LONG(50, 150) ); } if ( RANDOM_FLOAT ( 0, 1 ) < 0.75 ) { // decals the floor with blood. vecSplatDir = Vector ( 0 , 0 , -1 ); vecSplatDir = vecSplatDir + (RANDOM_FLOAT(-1,1) * 0.6 * gpGlobals->v_right) + (RANDOM_FLOAT(-1,1) * 0.6 * gpGlobals->v_forward);// randomize a bit UTIL_TraceLine( pev->origin + Vector ( 0, 0 , 64) , pev->origin + vecSplatDir * 256, ignore_monsters, ENT(pev), &tr); if ( tr.flFraction != 1.0 ) { // Decal with a bloodsplat UTIL_BloodDecalTrace( &tr, BLOOD_COLOR_RED ); } } }
Vector CBlood::Direction( void ) { if ( pev->spawnflags & SF_BLOOD_RANDOM ) return UTIL_RandomBloodVector(); return pev->movedir; }
//----------------------------------------------------------------------------- // Purpose: // Input : *current_origin - // *current_angles - //----------------------------------------------------------------------------- void CTEBloodStream::Test( const Vector& current_origin, const QAngle& current_angles ) { // Fill in data r = 247; g = 0; b = 0; a = 255; m_nAmount = random->RandomInt(50, 150); m_vecOrigin = current_origin; Vector forward; m_vecOrigin.GetForModify()[2] += 24; AngleVectors( current_angles, &forward ); forward[2] = 0.0; VectorNormalize( forward ); m_vecOrigin += forward * 50; m_vecDirection = UTIL_RandomBloodVector(); CBroadcastRecipientFilter filter; Create( filter, 0.0 ); }
//========================================================= // RunTask //========================================================= void CGargantua::RunTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_DIE: if ( gpGlobals->time > m_flWaitFinished ) { pev->renderfx = kRenderFxExplode; pev->rendercolor.x = 255; pev->rendercolor.y = 0; pev->rendercolor.z = 0; StopAnimation(); pev->nextthink = gpGlobals->time + 0.15; SetThink( SUB_Remove ); int i; int parts = MODEL_FRAMES( gGargGibModel ); for ( i = 0; i < 10; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( GARG_GIB_MODEL ); int bodyPart = 0; if ( parts > 1 ) bodyPart = RANDOM_LONG( 0, pev->body-1 ); pGib->pev->body = bodyPart; pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * RANDOM_FLOAT( 300, 500 )); pGib->SetNextThink( 1.25 ); pGib->SetThink( SUB_FadeOut ); } Vector vecOrigin = GetAbsOrigin(); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecOrigin ); WRITE_BYTE( TE_BREAKMODEL); // position WRITE_COORD( vecOrigin.x ); WRITE_COORD( vecOrigin.y ); WRITE_COORD( vecOrigin.z ); // size WRITE_COORD( 200 ); WRITE_COORD( 200 ); WRITE_COORD( 128 ); // velocity WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); // randomization WRITE_BYTE( 200 ); // Model WRITE_SHORT( gGargGibModel ); //model id# // # of shards WRITE_BYTE( 50 ); // duration WRITE_BYTE( 20 );// 3.0 seconds // flags WRITE_BYTE( BREAK_FLESH ); MESSAGE_END(); return; } else CBaseMonster::RunTask(pTask); break; case TASK_FLAME_SWEEP: if ( gpGlobals->time > m_flWaitFinished ) { FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { BOOL cancel = FALSE; Vector angles = g_vecZero; FlameUpdate(); CBaseEntity *pEnemy = m_hEnemy; if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; angles = UTIL_VecToAngles( dir ); angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = TRUE; } if ( fabs(angles.y) > 60 ) cancel = TRUE; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } // FlameControls( angles.x + 2 * sin(gpGlobals->time*8), angles.y + 28 * sin(gpGlobals->time*8.5) ); FlameControls( angles.x, angles.y ); } break; default: CBaseMonster::RunTask( pTask ); break; } }
void CGargantua::RunTask( const Task_t& task ) { switch ( task.iTask ) { case TASK_DIE: if ( gpGlobals->time > m_flWaitFinished ) { SetRenderFX( kRenderFxExplode ); SetRenderColor( Vector( 255, 0, 0 ) ); StopAnimation(); SetNextThink( gpGlobals->time + 0.15 ); SetThink( &CGargantua::SUB_Remove ); int i; int parts = MODEL_FRAMES( gGargGibModel ); for ( i = 0; i < 10; i++ ) { auto pGib = CGib::GibCreate( GARG_GIB_MODEL ); int bodyPart = 0; if ( parts > 1 ) bodyPart = RANDOM_LONG( 0, GetBody() -1 ); pGib->SetBody( bodyPart ); pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * RANDOM_FLOAT( 300, 500 ) ); pGib->SetNextThink( gpGlobals->time + 1.25 ); pGib->SetThink( &CGib::SUB_FadeOut ); } MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, GetAbsOrigin() ); WRITE_BYTE( TE_BREAKMODEL); // position WRITE_COORD( GetAbsOrigin().x ); WRITE_COORD( GetAbsOrigin().y ); WRITE_COORD( GetAbsOrigin().z ); // size WRITE_COORD( 200 ); WRITE_COORD( 200 ); WRITE_COORD( 128 ); // velocity WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); // randomization WRITE_BYTE( 200 ); // Model WRITE_SHORT( gGargGibModel ); //model id# // # of shards WRITE_BYTE( 50 ); // duration WRITE_BYTE( 20 );// 3.0 seconds // flags WRITE_BYTE( BREAK_FLESH ); MESSAGE_END(); return; } else CBaseMonster::RunTask( task ); break; case TASK_FLAME_SWEEP: if ( gpGlobals->time > m_flWaitFinished ) { FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { bool cancel = false; Vector angles = g_vecZero; FlameUpdate(); CBaseEntity *pEnemy = m_hEnemy; if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; angles = UTIL_VecToAngles( dir ); angles.x = -angles.x; angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = true; } if ( fabs(angles.y) > 60 ) cancel = true; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } // FlameControls( angles.x + 2 * sin(gpGlobals->time*8), angles.y + 28 * sin(gpGlobals->time*8.5) ); FlameControls( angles.x, angles.y ); } break; default: CBaseMonster::RunTask( task ); break; } }
//========================================================= // RunTask //========================================================= void CNPC_Gargantua::RunTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_DIE: if ( gpGlobals->curtime > m_flWaitFinished ) { //TEMP TEMP m_nRenderFX = kRenderFxExplode; SetRenderColor( 255, 0, 0 , 255 ); StopAnimation(); SetNextThink( gpGlobals->curtime + 0.15 ); SetThink( &CBaseEntity::SUB_Remove ); int i; int parts = modelinfo->GetModelFrameCount( modelinfo->GetModel( gGargGibModel ) ); for ( i = 0; i < 10; i++ ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); pGib->Spawn( GARG_GIB_MODEL); int bodyPart = 0; if ( parts > 1 ) bodyPart = random->RandomInt( 0, parts-1 ); pGib->SetBodygroup( 0, bodyPart ); pGib->SetBloodColor( BLOOD_COLOR_YELLOW ); pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * random->RandomFloat( 300, 500 ) ); pGib->SetNextThink( gpGlobals->curtime + 1.25 ); pGib->SetThink( &CBaseEntity::SUB_FadeOut ); } Vector vecSize = Vector( 200, 200, 128 ); CPVSFilter filter( GetAbsOrigin() ); te->BreakModel( filter, 0.0, GetAbsOrigin(), vec3_angle, vecSize, vec3_origin, gGargGibModel, 200, 50, 3.0, BREAK_FLESH ); return; } else BaseClass::RunTask( pTask ); break; case TASK_FLAME_SWEEP: if ( gpGlobals->curtime > m_flWaitFinished ) { //TEMP TEMP FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { bool cancel = false; QAngle angles = QAngle( 0, 0, 0 ); //TEMP TEMP FlameUpdate(); CBaseEntity *pEnemy = GetEnemy(); if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; VectorAngles( dir, angles ); angles.x = -angles.x; angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = true; } if ( fabs(angles.y) > 60 ) cancel = true; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } //TEMP TEMP //FlameControls( angles.x + 2 * sin(gpGlobals->curtime*8), angles.y + 28 * sin(gpGlobals->curtime*8.5) ); FlameControls( angles.x, angles.y ); } break; default: BaseClass::RunTask( pTask ); break; } }