Are you using NULL on the trigger brushes?
If this is for your mod, you can just code an entity that does this for you:
class CTriggerKillMonsters : public CBaseEntity
{
public:
void Spawn();
void EXPORT KillUse( CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value );
};
LINK_ENTITY_TO_CLASS( trigger_killmonsters, CTriggerKillMonsters );
void CTriggerKillMonsters::Spawn()
{
SetUse( &CTriggerKillMonsters::KillUse );
}
void CTriggerKillMonsters::KillUse( CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value )
{
edict_t* pEdict = g_engfuncs.pfnPEntityOfEntIndex( gpGlobals->maxclients + 1 );
CBaseEntity* pEnt;
for( int i = gpGlobals->maxclients + 1; i < gpGlobals->maxEntities; ++i, ++pEdict )
{
pEnt = Instance( pEdict );
if( !pEnt || !pEnt->MyMonsterPointer() )
continue;
UTIL_Remove( pEnt );
}
}
(untested)
pEdict points at the first entity that is not the world or a player (who count as monsters too as indicated by MyMonsterPointer(), and is incremented every iteration to move to the next entity in the list.
The loop iterates over all possible entities (could take a while if your num_edicts is high). Every entity that is a monster is then removed, just as if they were killtargeted.