//------------------------------------------------------------------------------ // Purpose : Spawn random gibs of the given gib type // Input : // Output : //------------------------------------------------------------------------------ void CGib::SpawnRandomGibs( CBaseEntity *pVictim, int cGibs, GibType_e eGibType ) { int cSplat; for ( cSplat = 0 ; cSplat < cGibs ; cSplat++ ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); if ( g_Language.GetInt() == LANGUAGE_GERMAN ) { pGib->Spawn( "models/germangibs.mdl" ); pGib->m_nBody = random->RandomInt(0,GERMAN_GIB_COUNT-1); } else { switch (eGibType) { case GIB_HUMAN: // human pieces pGib->Spawn( "models/gibs/hgibs.mdl" ); pGib->m_nBody = random->RandomInt(1,HUMAN_GIB_COUNT-1);// start at one to avoid throwing random amounts of skulls (0th gib) break; case GIB_ALIEN: // alien pieces pGib->Spawn( "models/gibs/agibs.mdl" ); pGib->m_nBody = random->RandomInt(0,ALIEN_GIB_COUNT-1); break; } } pGib->InitGib( pVictim, 300, 400); } }
NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cGibs) { if (g_Language == LANGUAGE_GERMAN) { // no sticky gibs in germany right now! return; } for (int i = 0; i < cGibs; ++i) { CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL); pGib->Spawn("models/stickygib.mdl"); pGib->pev->body = RANDOM_LONG(0, 2); if (pevVictim) { pGib->pev->origin.x = vecOrigin.x + RANDOM_FLOAT(-3, 3); pGib->pev->origin.y = vecOrigin.y + RANDOM_FLOAT(-3, 3); pGib->pev->origin.z = vecOrigin.z + RANDOM_FLOAT(-3, 3); // make the gib fly away from the attack vector pGib->pev->velocity = g_vecAttackDir * -1; // mix in some noise pGib->pev->velocity.x += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity.y += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity.z += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity = pGib->pev->velocity * 900; pGib->pev->avelocity.x = RANDOM_FLOAT(250, 400); pGib->pev->avelocity.y = RANDOM_FLOAT(250, 400); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if (pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if (pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else { pGib->pev->velocity = pGib->pev->velocity * 4; } pGib->pev->movetype = MOVETYPE_TOSS; pGib->pev->solid = SOLID_BBOX; UTIL_SetSize(pGib->pev, Vector(0, 0,0), Vector(0, 0, 0)); pGib->SetTouch(&CGib::StickyGibTouch); pGib->SetThink(NULL); } pGib->LimitVelocity(); } }
//------------------------------------------------------------------------------ // Purpose : Given an .mdl file with gibs and the number of gibs in the file // spawns them in pVictim's bounding box // Input : // Output : //------------------------------------------------------------------------------ void CGib::SpawnSpecificGibs( CBaseEntity* pVictim, int nNumGibs, float vMinVelocity, float vMaxVelocity, const char* cModelName, float flLifetime) { for ( int i = 0; i < nNumGibs; i++ ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); pGib->Spawn( cModelName, flLifetime ); pGib->m_nBody = i; pGib->InitGib( pVictim, vMinVelocity, vMaxVelocity ); pGib->m_lifeTime = flLifetime; if ( pVictim != NULL ) { pGib->SetOwnerEntity( pVictim ); } //If pVictim is on fire, ignite pVictim's gibs as well. if ( pVictim->GetFlags() & FL_ONFIRE ) { pGib->Ignite( ( flLifetime - 1 ), false ); } } }
void CGib::SpawnHeadGib(entvars_t *pevVictim) { CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL); if (g_Language == LANGUAGE_GERMAN) { // throw one head pGib->Spawn("models/germangibs.mdl"); pGib->pev->body = 0; } else { // throw one head pGib->Spawn("models/hgibs.mdl"); pGib->pev->body = 0; } if (pevVictim) { pGib->pev->origin = pevVictim->origin + pevVictim->view_ofs; edict_t *pentPlayer = FIND_CLIENT_IN_PVS(pGib->edict()); if (RANDOM_LONG(0, 100) <= 5 && pentPlayer != NULL) { // 5% chance head will be thrown at player's face. entvars_t *pevPlayer = VARS(pentPlayer); pGib->pev->velocity = ((pevPlayer->origin + pevPlayer->view_ofs) - pGib->pev->origin).Normalize() * 300; pGib->pev->velocity.z += 100; } else { // TODO: fix test demo pGib->pev->velocity.z = RANDOM_FLOAT(200, 300); pGib->pev->velocity.y = RANDOM_FLOAT(-100, 100); pGib->pev->velocity.x = RANDOM_FLOAT(-100, 100); } pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200); pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if (pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if (pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else pGib->pev->velocity = pGib->pev->velocity * 4; } pGib->LimitVelocity(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNPC_AntlionGrub::SpawnSquashedGrub( void ) { CGib *pStandin = CREATE_ENTITY( CGib, "gib" ); Assert( pStandin ); pStandin->SetModel( ANTLIONGRUB_SQUASHED_MODEL ); pStandin->AddSolidFlags( FSOLID_NOT_SOLID ); pStandin->SetLocalAngles( GetLocalAngles() ); pStandin->SetLocalOrigin( GetLocalOrigin() ); }
void CGib :: SpawnHeadGib( entvars_t *pevVictim, const char* szGibModel ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( szGibModel );// throw one head pGib->pev->body = 0; if ( pevVictim ) { pGib->pev->origin = pevVictim->origin + pevVictim->view_ofs; edict_t *pentPlayer = FIND_CLIENT_IN_PVS( pGib->edict() ); if ( RANDOM_LONG ( 0, 100 ) <= 5 && pentPlayer ) { // 5% chance head will be thrown at player's face. entvars_t *pevPlayer; pevPlayer = VARS( pentPlayer ); pGib->pev->velocity = ( ( pevPlayer->origin + pevPlayer->view_ofs ) - pGib->pev->origin ).Normalize() * 300; pGib->pev->velocity.z += 100; } else { pGib->pev->velocity = Vector (RANDOM_FLOAT(-100,100), RANDOM_FLOAT(-100,100), RANDOM_FLOAT(200,300)); } pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if ( pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if ( pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else { pGib->pev->velocity = pGib->pev->velocity * 4; } } pGib->LimitVelocity(); }
CGib *CGibShooter :: CreateGib ( void ) { if ( CVAR_GET_FLOAT("violence_hgibs") == 0 ) return NULL; CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/hgibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_RED; if ( pev->body <= 1 ) { ALERT ( at_aiconsole, "GibShooter Body is <= 1!\n" ); } pGib->pev->body = RANDOM_LONG ( 1, pev->body - 1 );// avoid throwing random amounts of the 0th gib. (skull). return pGib; }
void CHoundeye :: MakeGib ( int body, entvars_t *pevAttacker ) { if ( m_iHasGibbed == 1 ) return; m_iHasGibbed = 1; CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/houndeye_gibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->pev->body = body; pGib->pev->origin = pev->origin + Vector ( 0, 0, 40 ); pGib->pev->velocity = ( Center() - pevAttacker->origin).Normalize() * 300; pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); }
//------------------------------------------------------------------------------ // Purpose : Given an .mdl file with gibs and the number of gibs in the file // spawns them in pVictim's bounding box // Input : // Output : //------------------------------------------------------------------------------ void CGib::SpawnSpecificGibs( CBaseEntity* pVictim, int nNumGibs, float vMinVelocity, float vMaxVelocity, const char* cModelName, float flLifetime) { for (int i=0;i<nNumGibs;i++) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); pGib->Spawn( cModelName ); pGib->m_nBody = i; pGib->InitGib( pVictim, vMinVelocity, vMaxVelocity ); pGib->m_lifeTime = flLifetime; if ( pVictim != NULL ) { pGib->SetOwnerEntity( pVictim ); } } }
void CGib :: SpawnHeadGib( entvars_t *pevVictim ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); if ( g_Language == LANGUAGE_GERMAN ) { pGib->Spawn( "models/germangibs.mdl" );// throw one head pGib->pev->body = 0; } else { pGib->Spawn( "models/head.mdl" );// throw one head } if ( pevVictim ) { pGib->pev->origin = pevVictim->origin + pevVictim->view_ofs; edict_t *pentPlayer = FIND_CLIENT_IN_PVS( pGib->edict() ); pGib->pev->velocity = Vector (RANDOM_FLOAT(-100,100), RANDOM_FLOAT(-100,100), RANDOM_FLOAT(300,400)); pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); // Set its groupinfo to the player's pGib->pev->groupinfo = pevVictim->groupinfo; // Since this only ever happens when a player is hit by a frozen decapitator disc, make the gibs glow pGib->pev->renderfx = kRenderFxGlowShell; pGib->pev->rendercolor = Vector( 100,100, 250 ); pGib->pev->renderamt = 25; } pGib->LimitVelocity(); }
CGib *CEnvShooter :: CreateGib ( void ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( STRING(pev->model) ); int bodyPart = 0; if ( pev->body > 1 ) bodyPart = RANDOM_LONG( 0, pev->body-1 ); pGib->pev->body = bodyPart; pGib->m_bloodColor = DONT_BLEED; pGib->m_material = m_iGibMaterial; pGib->pev->rendermode = pev->rendermode; pGib->pev->renderamt = pev->renderamt; pGib->pev->rendercolor = pev->rendercolor; pGib->pev->renderfx = pev->renderfx; pGib->pev->scale = pev->scale; pGib->pev->skin = pev->skin; return pGib; }
void CGib::SpawnHeadGib( CBaseEntity *pVictim ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); if ( g_Language.GetInt() == LANGUAGE_GERMAN ) { pGib->Spawn( "models/germangibs.mdl" );// throw one head pGib->m_nBody = 0; } else { pGib->Spawn( "models/gibs/hgibs.mdl" );// throw one head pGib->m_nBody = 0; } if ( pVictim ) { Vector vecNewVelocity = pGib->GetAbsVelocity(); pGib->SetLocalOrigin( pVictim->EyePosition() ); edict_t *pentPlayer = UTIL_FindClientInPVS( pGib->edict() ); if ( random->RandomInt ( 0, 100 ) <= 5 && pentPlayer ) { // 5% chance head will be thrown at player's face. CBasePlayer *player = (CBasePlayer *)CBaseEntity::Instance( pentPlayer ); if ( player ) { vecNewVelocity = ( player->EyePosition() ) - pGib->GetAbsOrigin(); VectorNormalize(vecNewVelocity); vecNewVelocity *= 300; vecNewVelocity.z += 100; } } else { vecNewVelocity = Vector (random->RandomFloat(-100,100), random->RandomFloat(-100,100), random->RandomFloat(200,300)); } QAngle vecNewAngularVelocity = pGib->GetLocalAngularVelocity(); vecNewAngularVelocity.x = random->RandomFloat ( 100, 200 ); vecNewAngularVelocity.y = random->RandomFloat ( 100, 300 ); pGib->SetLocalAngularVelocity( vecNewAngularVelocity ); // copy owner's blood color pGib->SetBloodColor( pVictim->BloodColor() ); pGib->AdjustVelocityBasedOnHealth( pVictim->m_iHealth, vecNewVelocity ); pGib->SetAbsVelocity( vecNewVelocity ); } pGib->LimitVelocity(); }
//========================================================= // 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; } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPropAPC::Event_Killed( const CTakeDamageInfo &info ) { m_OnDeath.FireOutput( info.GetAttacker(), this ); Vector vecAbsMins, vecAbsMaxs; CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs ); Vector vecNormalizedMins, vecNormalizedMaxs; CollisionProp()->WorldToNormalizedSpace( vecAbsMins, &vecNormalizedMins ); CollisionProp()->WorldToNormalizedSpace( vecAbsMaxs, &vecNormalizedMaxs ); Vector vecAbsPoint; CPASFilter filter( GetAbsOrigin() ); for (int i = 0; i < 5; i++) { CollisionProp()->RandomPointInBounds( vecNormalizedMins, vecNormalizedMaxs, &vecAbsPoint ); te->Explosion( filter, random->RandomFloat( 0.0, 1.0 ), &vecAbsPoint, g_sModelIndexFireball, random->RandomInt( 4, 10 ), random->RandomInt( 8, 15 ), ( i < 2 ) ? TE_EXPLFLAG_NODLIGHTS : TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOFIREBALLSMOKE | TE_EXPLFLAG_NODLIGHTS, 100, 0 ); } // TODO: make the gibs spawn in sync with the delayed explosions int nGibs = random->RandomInt( 1, 4 ); for ( int i = 0; i < nGibs; i++) { // Throw a flaming, smoking chunk. CGib *pChunk = CREATE_ENTITY( CGib, "gib" ); pChunk->Spawn( "models/gibs/hgibs.mdl" ); pChunk->SetBloodColor( DONT_BLEED ); QAngle vecSpawnAngles; vecSpawnAngles.Random( -90, 90 ); pChunk->SetAbsOrigin( vecAbsPoint ); pChunk->SetAbsAngles( vecSpawnAngles ); int nGib = random->RandomInt( 0, APC_MAX_CHUNKS - 1 ); pChunk->Spawn( s_pChunkModelName[nGib] ); pChunk->SetOwnerEntity( this ); pChunk->m_lifeTime = random->RandomFloat( 6.0f, 8.0f ); pChunk->SetCollisionGroup( COLLISION_GROUP_DEBRIS ); IPhysicsObject *pPhysicsObject = pChunk->VPhysicsInitNormal( SOLID_VPHYSICS, pChunk->GetSolidFlags(), false ); // Set the velocity if ( pPhysicsObject ) { pPhysicsObject->EnableMotion( true ); Vector vecVelocity; QAngle angles; angles.x = random->RandomFloat( -20, 20 ); angles.y = random->RandomFloat( 0, 360 ); angles.z = 0.0f; AngleVectors( angles, &vecVelocity ); vecVelocity *= random->RandomFloat( 300, 900 ); vecVelocity += GetAbsVelocity(); AngularImpulse angImpulse; angImpulse = RandomAngularImpulse( -180, 180 ); pChunk->SetAbsVelocity( vecVelocity ); pPhysicsObject->SetVelocity(&vecVelocity, &angImpulse ); } CEntityFlame *pFlame = CEntityFlame::Create( pChunk, false ); if ( pFlame != NULL ) { pFlame->SetLifetime( pChunk->m_lifeTime ); } } UTIL_ScreenShake( vecAbsPoint, 25.0, 150.0, 1.0, 750.0f, SHAKE_START ); if( hl2_episodic.GetBool() ) { // EP1 perf hit Ignite( 6, false ); } else { Ignite( 60, false ); } m_lifeState = LIFE_DYING; // Spawn a lesser amount if the player is close m_iRocketSalvoLeft = DEATH_VOLLEY_ROCKET_COUNT; m_flRocketTime = gpGlobals->curtime; }
//------------------------------------------------------------------------------ // Pow! //------------------------------------------------------------------------------ void CPropAPC::ExplodeAndThrowChunk( const Vector &vecExplosionPos ) { ExplosionCreate( vecExplosionPos, vec3_angle, this, 1000, 500, SF_ENVEXPLOSION_NODAMAGE | SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE | SF_ENVEXPLOSION_NOFIREBALLSMOKE, 0 ); UTIL_ScreenShake( vecExplosionPos, 25.0, 150.0, 1.0, 750.0f, SHAKE_START ); // Drop a flaming, smoking chunk. CGib *pChunk = CREATE_ENTITY( CGib, "gib" ); pChunk->Spawn( "models/gibs/hgibs.mdl" ); pChunk->SetBloodColor( DONT_BLEED ); QAngle vecSpawnAngles; vecSpawnAngles.Random( -90, 90 ); pChunk->SetAbsOrigin( vecExplosionPos ); pChunk->SetAbsAngles( vecSpawnAngles ); int nGib = random->RandomInt( 0, APC_MAX_CHUNKS - 1 ); pChunk->Spawn( s_pChunkModelName[nGib] ); pChunk->SetOwnerEntity( this ); pChunk->m_lifeTime = random->RandomFloat( 6.0f, 8.0f ); pChunk->SetCollisionGroup( COLLISION_GROUP_DEBRIS ); IPhysicsObject *pPhysicsObject = pChunk->VPhysicsInitNormal( SOLID_VPHYSICS, pChunk->GetSolidFlags(), false ); // Set the velocity if ( pPhysicsObject ) { pPhysicsObject->EnableMotion( true ); Vector vecVelocity; QAngle angles; angles.x = random->RandomFloat( -40, 0 ); angles.y = random->RandomFloat( 0, 360 ); angles.z = 0.0f; AngleVectors( angles, &vecVelocity ); vecVelocity *= random->RandomFloat( 300, 900 ); vecVelocity += GetAbsVelocity(); AngularImpulse angImpulse; angImpulse = RandomAngularImpulse( -180, 180 ); pChunk->SetAbsVelocity( vecVelocity ); pPhysicsObject->SetVelocity(&vecVelocity, &angImpulse ); } CEntityFlame *pFlame = CEntityFlame::Create( pChunk, false ); if ( pFlame != NULL ) { pFlame->SetLifetime( pChunk->m_lifeTime ); } }
void CTank :: TankDeath ( void ) { bTankDead = 1; pev->sequence = 2;/*LookupSequence( "die" );*/ ResetSequenceInfo (); m_pPlayer->TakeDamage ( pev,pev,(float)999, DMG_CRUSH ); // mouru pev->velocity = pev->avelocity = m_pTankBSP->pev->velocity = m_pTankBSP->pev->avelocity =Vector (0,0,0); m_pTankBSP->pev->origin = pev->origin; m_pTankBSP->pev->angles = pev->angles; m_pCam->pev->velocity = m_pCam->pev->avelocity = Vector (0,0,0); UpdateSound (); SetThink ( DeadThink ); pev->nextthink = gpGlobals->time + 29 / 21.0; // maman, c'est quoi qu'a fait boum ? EMIT_SOUND(ENT(pev), CHAN_AUTO, TANK_EXPLO_SOUND1, 1, ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_WEAPON, TANK_EXPLO_SOUND2, 1, ATTN_NORM); // sprites de feu - explosion for ( int i=0; i<20; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 50), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE*2 ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,22) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-150,150),RANDOM_FLOAT(-150,150),100/*RANDOM_FLOAT(130,150)*/ ); } // sprites de feu en colonne for ( i=0; i<6; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,25) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),140/*RANDOM_FLOAT(130,150)*/ ); } for ( i=0; i<10; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_SMOKEBALL, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_SMOKEBALL_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(2,3) ); pSpr->SetTransparency ( kRenderTransAlpha, 255, 255, 255, 255, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),RANDOM_FLOAT(50,50) ); } // gibs for ( i = 0; i<20; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/mechgibs.mdl" ); pGib->m_bloodColor = DONT_BLEED; pGib->pev->body = RANDOM_LONG (1,5); pGib->pev->origin = pev->origin + Vector ( 0, 0, 250 ); pGib->pev->velocity = Vector ( RANDOM_FLOAT(-200,200),RANDOM_FLOAT(-200,200),RANDOM_FLOAT(0,400)); pGib->pev->avelocity = Vector ( RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000) ); pGib->pev->solid = SOLID_NOT; pGib->SetThink(SUB_Remove); pGib->pev->nextthink = gpGlobals->time + 1; } // étincelles for ( i = 0; i < 10; i++ ) { Create( "spark_shower", pev->origin, Vector (0,0,1), NULL ); } }
void CGib::SpawnStickyGibs( CBaseEntity *pVictim, Vector vecOrigin, int cGibs ) { int i; if ( g_Language.GetInt() == LANGUAGE_GERMAN ) { // no sticky gibs in germany right now! return; } for ( i = 0 ; i < cGibs ; i++ ) { CGib *pGib = (CGib *)CreateEntityByName( "gib" ); pGib->Spawn( "models/stickygib.mdl" ); pGib->m_nBody = random->RandomInt(0,2); if ( pVictim ) { pGib->SetLocalOrigin( Vector( vecOrigin.x + random->RandomFloat( -3, 3 ), vecOrigin.y + random->RandomFloat( -3, 3 ), vecOrigin.z + random->RandomFloat( -3, 3 ) ) ); // make the gib fly away from the attack vector Vector vecNewVelocity = g_vecAttackDir * -1; // mix in some noise vecNewVelocity.x += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity.y += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity.z += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity *= 900; QAngle vecAngVelocity( random->RandomFloat ( 250, 400 ), random->RandomFloat ( 250, 400 ), 0 ); pGib->SetLocalAngularVelocity( vecAngVelocity ); // copy owner's blood color pGib->SetBloodColor( pVictim->BloodColor() ); pGib->AdjustVelocityBasedOnHealth( pVictim->m_iHealth, vecNewVelocity ); pGib->SetAbsVelocity( vecNewVelocity ); pGib->SetMoveType( MOVETYPE_FLYGRAVITY ); pGib->RemoveSolidFlags( FSOLID_NOT_SOLID ); pGib->SetCollisionBounds( vec3_origin, vec3_origin ); pGib->SetTouch ( &CGib::StickyGibTouch ); pGib->SetThink (NULL); } pGib->LimitVelocity(); } }
// Fograin92: Extension of "cough" animation, just for fun void CGrapple::PukeGibs(void) { // Fograin92: Make sure we go back to idle anim after this SetThink(&CGrapple::WeaponIdle); pev->nextthink = gpGlobals->time + 1.3; #ifndef CLIENT_DLL // Fograin92: Get proper XYZ values UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); Vector GunPosition = m_pPlayer->GetGunPosition(); GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 16; CGib *pGib = GetClassPtr( (CGib *)NULL ); // Fograin92: Changed model dir and names int iRandom = RANDOM_LONG(2, 11); switch( iRandom) { case 2: pGib->Spawn( "models/gibs/human_gib2.mdl" ); break; case 3: pGib->Spawn( "models/gibs/human_gib3.mdl" ); break; case 4: pGib->Spawn( "models/gibs/human_gib4.mdl" ); break; case 5: pGib->Spawn( "models/gibs/human_gib5.mdl" ); break; case 6: pGib->Spawn( "models/gibs/human_gib6.mdl" ); break; case 7: pGib->Spawn( "models/gibs/human_gib7.mdl" ); break; case 8: pGib->Spawn( "models/gibs/human_gib8.mdl" ); break; case 9: pGib->Spawn( "models/gibs/human_gib9.mdl" ); break; case 10: pGib->Spawn( "models/gibs/human_gib10.mdl" ); break; case 11: pGib->Spawn( "models/gibs/human_gib11.mdl" ); break; default: pGib->Spawn( "models/gibs/human_gib3.mdl" ); break; } pGib->pev->body = 0; //pGib->Spawn( "models/hgibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_RED; pGib->pev->body = 0; pGib->pev->origin = GunPosition + gpGlobals->v_forward * 40; pGib->pev->velocity = gpGlobals->v_forward * 100; // Fograin92: Some spin variations pGib->pev->avelocity.x = RANDOM_LONG( 200, 600 ); pGib->pev->avelocity.y = RANDOM_LONG( 200, 600 ); pGib->pev->avelocity.z = RANDOM_LONG( 100, 200 ); pGib->pev->nextthink = gpGlobals->time + 10.0; pGib->SetThink( &CBaseEntity::SUB_FadeOut ); // Fograin92: Cough some blood MESSAGE_BEGIN(MSG_ALL, gmsgParticles); WRITE_SHORT(0); WRITE_BYTE(0); WRITE_COORD( pGib->pev->origin.x ); WRITE_COORD( pGib->pev->origin.y ); WRITE_COORD( pGib->pev->origin.z ); WRITE_COORD( pGib->pev->avelocity.x ); WRITE_COORD( pGib->pev->avelocity.y ); WRITE_COORD( pGib->pev->avelocity.z ); WRITE_SHORT(iImpactBloodRed); MESSAGE_END(); #endif }
void CGib::SpawnRandomGibs(entvars_t *pevVictim, int cGibs, int human) { int cSplat; for (cSplat = 0; cSplat < cGibs; ++cSplat) { CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL); if (g_Language == LANGUAGE_GERMAN) { pGib->Spawn("models/germangibs.mdl"); pGib->pev->body = RANDOM_LONG(0, GERMAN_GIB_COUNT - 1); } else { if (human) { // human pieces pGib->Spawn("models/hgibs.mdl"); // start at one to avoid throwing random amounts of skulls (0th gib) pGib->pev->body = RANDOM_LONG(1, HUMAN_GIB_COUNT - 1); } else { // aliens pGib->Spawn("models/agibs.mdl"); pGib->pev->body = RANDOM_LONG(0, ALIEN_GIB_COUNT - 1); } } if (pevVictim) { // spawn the gib somewhere in the monster's bounding volume pGib->pev->origin.x = pevVictim->absmin.x + pevVictim->size.x * (RANDOM_FLOAT(0, 1)); pGib->pev->origin.y = pevVictim->absmin.y + pevVictim->size.y * (RANDOM_FLOAT(0, 1)); // absmin.z is in the floor because the engine subtracts 1 to enlarge the box pGib->pev->origin.z = pevVictim->absmin.z + pevVictim->size.z * (RANDOM_FLOAT(0, 1)) + 1; // make the gib fly away from the attack vector pGib->pev->velocity = g_vecAttackDir * -1; // mix in some noise pGib->pev->velocity.x += RANDOM_FLOAT(-0.25, 0.25); pGib->pev->velocity.y += RANDOM_FLOAT(-0.25, 0.25); pGib->pev->velocity.z += RANDOM_FLOAT(-0.25, 0.25); pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT(300, 400); pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200); pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if (pevVictim->health > -50) pGib->pev->velocity = pGib->pev->velocity * 0.7; else if (pevVictim->health > -200) pGib->pev->velocity = pGib->pev->velocity * 2; else pGib->pev->velocity = pGib->pev->velocity * 4; pGib->pev->solid = SOLID_BBOX; UTIL_SetSize(pGib->pev, Vector(0, 0, 0), Vector(0, 0, 0)); } pGib->LimitVelocity(); } }
//LRC - changed signature, to support custom gib models void CGib :: SpawnRandomGibs( entvars_t *pevVictim, int cGibs, int notfirst, const char *szGibModel ) { if (cGibs == 0) return; // spawn nothing! CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( szGibModel ); //LRC - check the model itself to find out how many gibs are available studiohdr_t *pstudiohdr = (studiohdr_t *)(GET_MODEL_PTR( ENT(pGib->pev) )); if (! pstudiohdr) return; mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex); //ALERT(at_console, "read %d bodyparts, canonical is %d\n", pbodypart->nummodels, HUMAN_GIB_COUNT); for (int cSplat = 0 ; cSplat < cGibs ; cSplat++ ) { if (pGib == NULL) // first time through, we set pGib before the loop started { pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( szGibModel ); } if (notfirst) pGib->pev->body = RANDOM_LONG(1, pbodypart->nummodels - 1);// start at one to avoid throwing random amounts of skulls (0th gib) else pGib->pev->body = RANDOM_LONG(0, pbodypart->nummodels - 1); if ( pevVictim ) { // spawn the gib somewhere in the monster's bounding volume pGib->pev->origin.x = pevVictim->absmin.x + pevVictim->size.x * (RANDOM_FLOAT ( 0 , 1 ) ); pGib->pev->origin.y = pevVictim->absmin.y + pevVictim->size.y * (RANDOM_FLOAT ( 0 , 1 ) ); pGib->pev->origin.z = pevVictim->absmin.z + pevVictim->size.z * (RANDOM_FLOAT ( 0 , 1 ) ) + 1; // absmin.z is in the floor because the engine subtracts 1 to enlarge the box // make the gib fly away from the attack vector pGib->pev->velocity = g_vecAttackDir * -1; // mix in some noise pGib->pev->velocity.x += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity.y += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity.z += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT ( 300, 400 ); pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if ( pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if ( pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else { pGib->pev->velocity = pGib->pev->velocity * 4; } pGib->pev->solid = SOLID_BBOX; UTIL_SetSize ( pGib->pev, Vector( 0 , 0 , 0 ), Vector ( 0, 0, 0 ) ); } pGib->LimitVelocity(); pGib = NULL; //LRC } }
void CGib :: SpawnRandomGibs( entvars_t *pevVictim, int cGibs, int human ) { int cSplat; for ( cSplat = 0 ; cSplat < cGibs ; cSplat++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); if ( g_Language == LANGUAGE_GERMAN ) { pGib->Spawn( "models/germangibs.mdl" ); pGib->pev->body = RANDOM_LONG(0,GERMAN_GIB_COUNT-1); } else { if ( human ) { // human pieces pGib->Spawn( "models/hgibs.mdl" ); pGib->pev->body = RANDOM_LONG(1,HUMAN_GIB_COUNT-1);// start at one to avoid throwing random amounts of skulls (0th gib) } else { // aliens pGib->Spawn( "models/agibs.mdl" ); pGib->pev->body = RANDOM_LONG(0,ALIEN_GIB_COUNT-1); } } if ( pevVictim ) { // spawn the gib somewhere in the monster's bounding volume pGib->pev->origin.x = pevVictim->absmin.x + pevVictim->size.x * (RANDOM_FLOAT ( 0 , 1 ) ); pGib->pev->origin.y = pevVictim->absmin.y + pevVictim->size.y * (RANDOM_FLOAT ( 0 , 1 ) ); pGib->pev->origin.z = pevVictim->absmin.z + pevVictim->size.z * (RANDOM_FLOAT ( 0 , 1 ) ) + 1; // absmin.z is in the floor because the engine subtracts 1 to enlarge the box // make the gib fly away from the attack vector pGib->pev->velocity = g_vecAttackDir * -1; // mix in some noise pGib->pev->velocity.x += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity.y += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity.z += RANDOM_FLOAT ( -0.25, 0.25 ); pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT ( 600, 700 ); pGib->pev->avelocity.x = RANDOM_FLOAT ( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT ( 100, 300 ); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if ( pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if ( pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else { pGib->pev->velocity = pGib->pev->velocity * 4; } pGib->pev->solid = SOLID_BBOX; UTIL_SetSize ( pGib->pev, Vector( 0 , 0 , 0 ), Vector ( 0, 0, 0 ) ); // Set its groupinfo to the player's pGib->pev->groupinfo = pevVictim->groupinfo; // Since this only ever happens when a player is hit by a frozen decapitator disc, make the gibs glow pGib->pev->renderfx = kRenderFxGlowShell; pGib->pev->rendercolor = Vector( 150,150,250 ); pGib->pev->renderamt = 100; } pGib->LimitVelocity(); } }
//========================================================= // 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; } }