Через скорбоард. Создаёшь скорбоард с названием например Timer и со старта значением 0, делаешь цикличный кб работающий постоянно и пусть он каждый тик (это 20 раз в секунду) плюсует к Timer единичку. Получается каждый тик у тебя таймер будет повышаться. Теперь ставишь второй кб, который будет проверять, дошёл ли таймер до 600 (это 30 раз по 20, те самые 30 секунд). И пусть этот кб при выполнении этого условия запускает ту цепочку и в той цепочке добавь кб, который будет устанавливать Timer в значение 0.
Объясню, что мы сотворили. Цикличный командный блок отвечает за "секундомер". Второй командный блок проверяет, дошел ли секундомер до 600 тактов (30 секунд) и если дошёл то обнуляет, параллельно запуская основной механизм.
Команды:
/scoreboard objectives add <задача> <тип> [<отображаемое название>] - создание скорбоарда. Тип указывай dummy, задачу и отображаемое название делай для удобства одинаковые
/scoreboard players add <цели> <задача> 1 - прибавляет 1 к задаче у цели. Цель можешь указать не существующую. Например цель пусть будет Ticker
/scoreboard players set <цели> <задача> 0 - примерно то же самое, только не изменяет значение а устанавливает. Конкретно этот пример обнуляет задачу у цели
Если нужно уточнить ещё что-то, можешь в личку писать, я помогу. И хорошей идеей будет всё это делать не на кб а датапаком. Как это делать, могу рассказать, хотя инфы в интернете гора