I ended up using this modified from line-of-sight teleporting to check if it's safe, though the teleport still errors if it intersects a player. It's good enough for what I need, thanks a lot for the help!
Code:
bool IsEntityStuck(float pos[3], int entity)
{
float fMins[3];
float fMaxs[3];
GetEntPropVector( entity, Prop_Send, "m_vecMins", fMins );
GetEntPropVector( entity, Prop_Send, "m_vecMaxs", fMaxs );
for (int i=0; i<sizeof(fMins); i++)
{
fMins[i] -= 3;
fMaxs[i] += 3;
}
TR_TraceHullFilter(pos, pos, fMins, fMaxs, MASK_SOLID, TraceEntityFilterPlayer, entity);
return TR_DidHit();
}
bool TraceEntityFilterPlayer(int entity, int contentsMask)
{
return false;
}