Что-то каша какая-то у тебя. Чтобы решить твою задачу, можно всё сделать намного проще, при помощи функции RegisterForSingleUpdateGameTime, и обработчика события OnUpdateGameTime, в котором потом перевести квест в требуемую стадию. Например, такой скрипт повесить на квест:
Scriptname aaaMyQuestScript extends Quest
State waitForUpdate
Event OnUpdateGameTime()
; Переходим к требуемой стадии квеста (в примере - 2)
SetStage(2)
; Переводим скрипт в "пустое" состояние
GotoState("")
EndEvent
EndState
И в любом другом месте (в результирующем скрипте диалога или стадии квеста) затем зарегистрировать событие OnUpdateGameTime для квестового скрипта. Для примера, я сделал так:
; Инициировать событие OnUpdateGameTime через полчаса
thisQuest.RegisterForSingleUpdateGameTime(0.5)
; Перевести скрипт в состояние, в котором определён обработчик события OnUpdateGameTime
thisQuest.GotoState("waitForUpdate")
Естественно, thisQuest - это свойство, которое определено для фрагмента скрипта выше, который висит на стадии квеста. Свойство thisQuest должно указывать на тот квест, на который мы повесили скрипт для отлавливания события OnUpdateGameTime для перевода его в другое состояние.