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(); } }
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(); }
void CGib::SpawnStickyGibs( CBaseEntity *pVictim, Vector vecOrigin, int cGibs ) { int i; //City17: Germany Violence Fix. /*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(); } }
void CGib::SpawnHeadGib( CBaseEntity *pVictim ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); //City17: Germany Violence Fix. /*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(); }
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(); }
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(); }
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(); } }
//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<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(); } }