для проверки дистанции лучше использовать IsSpellInRange(47788, "target") вернёт 1 в случае успеха, 0 если не достаем и nil (!) если цель неверная (например цель враждебная или спел только на группу, а цель не в группе)
LoS проверяется только на сервере
стан и сало проверить можно через UnitAura, перечислив все подобные эффекты. В макрос не впихуемо ))
А вобще гораздо проще сделать мини-аддон который вешает обработчик на COMBAT_LOG_EVENT и отфильтровать там события с которыми вешается твой Оберегающий дух