void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType) { pev->model = 0; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if (pTrace->flFraction != 1) pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); int iContents = UTIL_PointContents(pev->origin); CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); entvars_t *pevOwner; if (pev->owner) pevOwner = VARS(pev->owner); else pevOwner = NULL; pev->owner = NULL; RadiusFlash(pev->origin, pev, pevOwner, 4); if (RANDOM_FLOAT(0, 1) < 0.5) UTIL_DecalTrace(pTrace, DECAL_SCORCH1); else UTIL_DecalTrace(pTrace, DECAL_SCORCH2); float flRndSound = RANDOM_FLOAT(0, 1); switch (RANDOM_LONG(0, 1)) { case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-1.wav", 0.55, ATTN_NORM); break; case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-2.wav", 0.55, ATTN_NORM); break; } pev->effects |= EF_NODRAW; SetThink(&CGrenade::Smoke); pev->velocity = g_vecZero; pev->nextthink = gpGlobals->time + 0.3; if (iContents != CONTENTS_WATER) { int sparkCount = RANDOM_LONG(0, 3); for (int i = 0; i < sparkCount; i++) Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); } }
void CFlashbangProjectile::Detonate() { RadiusFlash(GetAbsOrigin(), this, GetThrower(), 4, CLASS_NONE, DMG_BLAST); EmitSound("Flashbang.Explode"); // tell the bots a flashbang grenade has exploded CMomentumPlayer *player = static_cast<CMomentumPlayer*>(GetThrower()); if (player) { IGameEvent * event = gameeventmanager->CreateEvent("flashbang_detonate"); if (event) { event->SetInt("userid", player->GetUserID()); event->SetFloat("x", GetAbsOrigin().x); event->SetFloat("y", GetAbsOrigin().y); event->SetFloat("z", GetAbsOrigin().z); gameeventmanager->FireEvent(event); } } UTIL_Remove(this); }