Описание работы стека команд на примере телепортирования игрока

Пояснения по телепортированию.

Разберем на таком примере: 
3. ACT_FLAGMAN_TRIGGER, 8670, 1631, 90 
2. ACT_SET_GOAL_FOR_TELEPORT, 2312, 2404, 0 
1. ACT_SCRIPT_EVENT, 13, 0, 0 
0. ACT_GOTO_STACK, 3, 0, 0 

Каждая команда имеет порядковый номер от 0 до <кол-во команд минус один>, в нашем случае от нуля до трёх. Причём самая верхняя команда, которая выполняется первой, имеет номер 3, следующая - номер два и так далее - до нуля. Вообще говоря номера команд нужны только для команды ACT_GOTO_STACK.

Стек выполняется сверху вниз, то есть сначала верхняя команда ACT_FLAGMAN_TRIGGER, потом следующая (ACT_SET_GOAL_FOR_TELEPORT) и т. д. 

После того, как выполнилась самая нижняя команда, выполнение стека останавливается. 

Но! После выполнения некоторых команд управление не передается на следующую команду.
Команда ACT_FLAGMAN_TRIGGER передает управление на следующую строчку, только если игрок попал в указанный радиус около указанной точки карты. а до тех пор она продолжает постоянно проверять, не выполнилось ли это условие.
Команда ACT_GOTO_STACK с параметром 3 означает что следующей командой выполнится команда под номером 3 (в нашем случае - это ACT_FLAGMAN_TRIGGER). Если бы команды ACT_GOTO_STACK не было, то стек бы просто закончил свою работу и наш телепорт сработал бы ровно один раз. Но так получается, что последняя команда стека ACT_GOTO_STACK кидает обратно на первeю строчку и всё начинается сначала, телепорт таким образом может сработать бесконечное число раз. 

Внимание!
1) если команда ACT_GOTO_STACK указыает на несуществующую команду, то с большой вероятностью вылетит фатальная ошибка, либо просто начнутся непонятные баги. 
2) при вставке новой команды в стек - всё номера команд меняются, поэтому нужно обязательно глазами посмотреть, а нет ли в стеке команды ACT_GOTO_STACK и если есть, то поправить у неё первый параметр (номер команды, на которую она кидает). 

Команда ACT_SET_GOAL_FOR_TELEPORT устанавливает цель для телепортирования. Телепорт при этом сам запоминает "цель" и поэтому в принципе эту команду можно вызвать только один раз (в нашем примере она вызывается перед каждым телепортированием).
Но в том, что она вызывается каждый раз, тоже ничего плохого нет, я просто это расписываю, чтобы было понятно, что не эта команда телепортирует.

Команда ACT_SCRIPT_EVENT, 13 - это уже непосредственно телепортация. 
Считайте, что ACT_SCRIPT_EVENT - это просто вызов какой-то особой процедуры, написанной в движке (если кому-то интересно, то при этом вызвается функция ScriptEvent13 из файла util_teleport.lgc, а это означает, что в принципе можно создавать новые функции в движке (необязательно для телепортов), которые потом можно будет вызывать из карт). 
Так вот, функция ACT_SCRIPT_EVENT, 13 просто телепортирует игрока в указанную точку.
Есть еще две похожие функции для телепортирования: 
ACT_SCRIPT_EVENT, 11 - телепортирование вверх (то есть игрок будет как будто подниматься снизу вверх (например для лестниц мы такое юзали)). То есть он абсолютно также телепортируется в указанную точку, но при появлении еще двигается снизу вверх.
ACT_SCRIPT_EVENT, 12 - аналогичное телепортирование вниз. 

Кстати в движке есть vid'ы, которые автоматом выполняют телепортирование: телепорт обыкновенный (1112, 1113 - один вниз, другой вверх), телепорт - платформа (1143, 1142 - одна вверх - другая вниз), телепорт - обычный (1144 - просто телепорт). 
Их удобно использовать тем, что там автоматом после телепортирования ставится пауза в несколько секунд, в течение которой обратно телепортнутся не получится. Ну и стек им прописывать не надо, только ACT_SET_GOAL_FOR_TELEPORT.