Для перехода с возвратом используется команда gosub @"Туда надо перейти",а для безвозвратного
перехода существует jump @"Туда надо перейти". Отличие возвратного перехода от безвозвратного
в том,что при возвратном переходе скрипт, дойдя до строчки gosub @"Туда надо перейти" будет
выполнять всё после объявления лэйбла "Туда надо перейти" до тех пор, пока скрипт не встретит
команду return, после чего выполнение перейдет к строчке после gosub @"Туда надо перейти", а
при безвозратном переходе после строчки jump @"Туда надо перейти" действие перейдет к лэйблу
"Туда надо перейти" и все команды после jump будут проигнорированы.Условные переход всегда без-
возвратные.
Условный переход всегда происходит после выполнения какого-либо условия.Все условия состоят из
трёх частей:
1 - объявление самого условия
2 - написание подусловий
3 - что делать после (не)выполнения или просто-напросто переход.
Любое условие начинается со строки с текстом "if",если вы хотите,чтобы все подусловия(ещё их
называют проверки) вашего условия выполнялись,то после "if" надо ставить "and"(между ними про-
бел),а если хотите,чтобы была проверка на выполнение хотя-бы одного подусловия,то вместо "and"
ставьте "or".
Например:
1) Проверка с выполнением всех подусловий:
-----------------------------------
create_thread @Test1
-----------------------------------
:Test1
wait 0
if and
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot $X $Y $Z radius $X_R $Y_R $Z_R sphere 0
8184: not actor $PLAYER_ACTOR health >= 99
jf @Test1
actor.health($PLAYER_ACTOR) = 100
end_thread
Принцип таков:
Если игрок(CJ) остановился по заданным координатам $X $Y $Z,точнее в радиусе $X_R $Y_R $Z_R от
этих координат,и если его жизни меньше 100,то его жизнь опять станет равной 100. Параметр 0 в
конце первого подусловия указывает,что игрок останавливается не в сфере(красный маркер).Если
параметр был бы равен 1,то надо было-бы создать сначало сферу,но о сферах потом.Опкод"jf @Test1"
делает переход на "Test1",если оба наших условия не выполнились.
2) Проверка с выполнением хотя-бы одного подусловия:
-------------------------------------
create_thread @Test2
-------------------------------------
:Test2
wait 0
if or
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot $X $Y $Z radius $X_R $Y_R $Z_R sphere 0
8184: not actor $PLAYER_ACTOR health >= 99
jf @Test2
actor.health($PLAYER_ACTOR) = 100
end_thread
Тут описано,что если игрок остановился в заданном радиусе от точки с координатами $X $Y $Z или
если жизнь игрока стала меньше 100,то жизнь станет равна 100.Тут при выполнении хотя-бы одного
подусловия,будет выполнятся наше действие,т.е жизнь CJ'я станет 100.
Жизнь-целое число,а вот координаты и радиусы-дробные.Если даже вам надо использовать радиус
равный 10,то надо написать 10.0.
Чтобы поток не был одноразового использования надо в конце вместо "end_thread" поставить "jump
на начало",в данном случае-это Jump @Test2.
Вот вам пример первого(Test1) скрипта,но уже с координатами,радиусами... :
----------------------------------------
create_thread @Example1
----------------------------------------
:Example1
wait 0
if and
0102: actor $PLAYER_ACTOR near_pt 2505.4812 -1687.4213 13.5543 radius 10.0 10.0 10.0 sphere 0
8184: not actor $PLAYER_ACTOR health >= 99
jf @Example1
actor.health($PLAYER_ACTOR) = 100
jump @Example1
Если жизнь игрока меньше 100,и он стоит около гаража CJ'я,то его жизнь становится равной 100.
Заметъте,что этот скрипт зациклен,он работает всегда,потому-что есть переход в его конце на
его начало.
С самого начала вставляйте "create_thread @Example1" после другого "create_thread",вто-
рой можно найти с помощью поиска.Потом ищем "----Mission 0----" и перед ней вставляем всё,что
идёт в нашем скрипте начиная с ":Example1" заканчивая "jump @Example1" включительно.Жмём "F7",
и ждём,пока пройдёт компиляция.Когда закомпилировалось жмите "F8"-запуск SA и начинайте новую
игру.
Внимание!В проверках существует только знак ">",знака "<" не существует,вместо него можно пе-
ред всем опкодом написать слово "not",это будет равносильно знаку "<",это применимо к командам
без кодовых слов.В проверках-утверждених(в которых нет слова "not") опкод(кодовое слово) нач-
ся с "0",а во всех проверках-отрецаниях используется тот же самый опкод,но уже вместо "0" там
ставится цифра "8".Поэтому если у вас есть утверждение,то вы можете,поменять первую цифру,т.е.
"0" на "8" и после знака ":" поставить "not", и это уже будет проверка-отрецание и наоборот.
Например:
Вот у меня есть проверка "игрок плавает в воде",она имеет следующий вид:
:Label1
wait 0 ms
if // если у нас только одно подусловие или проверка,то не "or" не "and" писать не надо.
0965: actor $PLAYER_ACTOR swimming_in_water
jf @Label1 // если подусловие не выполнилось,то переходим на начало.
Допустим у меня в скрипте должны выполнятся действия,когда игрок не в воде,а у меня в про-
верке написано,что действие скрипта дальше не пойдёт,если игрок не будет в воде,следовательно
надо сделать проверку "игрок не плавает".Заменяем первоначальную проверку проверкой,
противоположной по значению.И вот,что получилось:
8965: not actor $PLAYER_ACTOR swimming_in_water
Что я сделал,я заменил первую цифру опкода,т.е. "0" на "8" и после двоеточия поставил сло-
во "not".
А если у вас есть проверка-отрецание и вам надо сделать проверку-утверждение,то ищите
первую цифру опкода(она должна быть-8),затем меняйте её на 0,убирайте слово "not" и
получите свою проверку-утверждение.
Это можно делать со всеми проверками,в которых есть кодовые слова.
Максимальное число проверок - 7 штук,если надо больше,то разбейте их на несколько частей,
например:
У нас есть 10 моделей,которые мы должны проверить на загруженность,но макс. кол-во проверок
всего лишь 7,поэтому разбиваем проверки на две части,в первой будет 7,а во второй 3,и вот,что
получается:
:Test
wait 0
if and
model.Available(#1)
model.Available(#2)
model.Available(#3)
model.Available(#4)
model.Available(#5)
model.Available(#6)
model.Available(#7)
jf @Test
if and
model.Available(#8)
model.Available(#9)
model.Available(#10)
jf @Test
Вот такая проверочка вышла.Если что-то не понятно,то заходите на http://gtamaps.ovl.ru/forum .
Cам игрок тоже явл. актёром,только когда мы работаем с опкодами(командами) в которых есть
слово "player" надо использовать "$PLAYER_CHAR",а когда работаем с актёрами,то "$PLAYER_ACTOR".
Вот насчёт Jump Table (by yelmi):
Что же такое таблицы переходов? По моему это аналог массивов. Как и к массиву так и к таблице переходов обращение ведется по индексу. В качестве индекса у таблицы переходов выступает переменная, а правильнее сказать ее значение. Разберем принцип создания и работы таблицы переходов. Для создания таблицы переходов используется следующий опкод:
0871: init_jump_table $peremen total_jumps 7 0 @метка_выхода jumps 0 @метка1 1 @метка2 2 @метка3 3 @метка4 4 @метка5 5 @метка6 6 @метка7
// опкод должен быть записан одной строкой
total_jumps 7 – общее количество переходов, в нашем случае равно семи.
$peremen – переменная, по значению которой и будет осуществляться переход на определенную метку.
Отсчет ведется с 0.
@метка_выхода – выход из таблицы.
jumps 0 @метка1 - 6 @метка7 – метки переходов, то есть те метки на которые будет осуществляться переход согласно значению переменной. Цифра 0 перед меткой @метка1 означает то, что если переменная $peremen = 0 то будет произведен переход на метку1 и т.д.
Максимальное количество переходов в строке не может превышать 7. Если же необходимо большее количество переходов, то в паре с опкодом 0871: используется еще и опкод 0872:
0871: init_jump_table $peremen total_jumps 8 0 @метка_выхода jumps 0 @метка1 1 @метка2 2 @метка3 3 @метка4 4 @метка5 5 @метка6 6 @метка7
0872: jump_table_jumps 7 @метка8 -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода -1 @метка_выхода
Все отсутствующие переходы должны быть заполнены так -1 и метка выхода. В нашем случае это выглядит так -1 @метка_выхода. Так же они заполняются и в случае если переходов меньше 7.
Теперь посмотрим как же работает таблица переходов.
:метка
$peremen = 0
:метка_обращения_к_таблице
0050: gosub @метка_таблицы
//…...код миссии……
$peremen += 1
0002: jump @метка_обращения_к_таблице
:метка_таблицы
0871: init_jump_table $peremen total_jumps 7 0 @метка_выхода jumps 0 @метка1 1 @метка2 2 @метка3 3 @метка4 4 @метка5 5 @метка6 6 @метка7
// опкод должен быть записан одной строкой
:метка1
0004: $X_POZ = 2804.6594
0004: $Y_POZ = -2437.395
0004: $Z_POZ = 13.6295
0002: jump @метка_выхода
. . . . . . :
. . . . . . :
:метка7
0004: $X_POZ = 2786.3684
0004: $Y_POZ = -2392.7659
0004: $Z_POZ = 13.634
0002: jump @метка_выхода
:метка_выхода
0051: return
Принцип работы. Переменная $peremen = 0. Командой 0050: gosub @метка_таблицы мы обращаемся к таблице переходов и сразу же производится переход на первую метку, т.е. @метка1, не забываем что отсчет ведется с 0. получаем данные, которые находятся в @метка1 и прыгаем на метку выхода. Далее возвращаемся на следующую строку после команды 0050: gosub @метка_таблицы и т.д.
Вроди всё .