CLEO_&_DYOM
August 29, 2020

CLEO & DYOM: Эффект пьяной камеры во время цели

Приветствую! Сегодня поговорим о взаимодействии CLEO скриптов и DYOM.

Если вы хоть раз делали миссии в DYOM, то вы наверняка знаете, что функционал в нем ограничен. Например, в миссиях нельзя добавить актерам анимацию разговора по телефону, добавить стрельбу из машины от первого лица, добавить диалог во время поездки к чекпоинту и многое многое другое.

В этом случае нам поможет знание CLEO скриптинга, ведь именно благодаря скриптам мы можем добавить в свою миссию те функции, которых так не хватает в DYOM.

Прежде чем мы приступим к написанию и разбору скрипта, вспомним о глобальных переменных. Глобальная переменная - это контейнер, в котором хранятся какие-либо данные. Считывать и изменять их мы можно любым CLEO скриптом. Так вот, взаимодействие DYOM и CLEO возможно именно благодаря глобальным переменным.

Пример:
Нам нужно чтобы во время миссии игрок умер на цели №30. Каким образом наш скрипт узнает, когда именно текущей целью станет цель №30, чтобы именно в этот момент убить игрока? Можно, конечно, просто проверить находится ли игрок в определенной точке, но мы пойдем более надежным и простым путем.
Вот тут нам и понадобятся глобальные переменные из кода DYOM (посмотреть их можно тут).

$9903 - данная переменная хранит номер текущей цели на миссии. И если мы хотим узнать, является ли цель №30 текущей, то нам нужно создать проверку $9903 == 29. Почему 29, а не 30? Потому что цели в DYOM отсчитываются не с первой, а с нулевой. Поэтому при проверке цели надо указывать число на 1 единицу меньше.

Выглядит это все следующим образом:

if
$9903 == 29
then
...наш код...
end

И так, теперь давайте напишем скрипт, который будет добавлять в нашу миссию эффект пьяной камеры как в GTA 4 во время цели №4.

Какие переменные нам для этого понадобятся:
$10914 - номер слота текущей миссии (от 1 до 8)
$9903 - номер текущей цели на миссии

Как всегда создаем скрипт, добавляем метку и задержку 0 мс

{$CLEO}
0000:

:DRUNK
wait 0

Далее нам необходимо будет добавить 3 условия:
1) миссия запущена (переменная $ONMISSION)
2) слот миссии равен 1 (переменная $10914)
3) цель миссии равна 3 (переменная $9903)

if and
$ONMISSION == 1
$10914 == 1
$9903 == 3

Теперь создаем цикл, который будет выполняться пока текущая цель будет равна 3. Далее добавляем wait 0, в циклах while это обязательно.

После этого добавим опкод 052C: set_player $PLAYER_CHAR drunk_visuals 100, который создает эффект пьяной камеры с интенсивностью тряски 100 (число можно установить свое). Закрываем цикл опкодом end.
После завершения цикла (текущая цель не равна 3), убираем эффект пьяной камеры. Добавляем еще один end для закрытия условия, которое мы открыли в предыдущем куске кода.

then
    while $9903 == 3
    wait 0
    052C: set_player $PLAYER_CHAR drunk_visuals 100
    end
    052C: set_player $PLAYER_CHAR drunk_visuals 0   
end

В конце добавляем jump @DRUNK для того, чтобы скрипт повторялся.

И так, для чего мы добавили цикл? Можно же было просто написать так:

:DRUNK
wait 0
if and
$ONMISSION == 1
$10914 == 1
$9903 == 3
then
052C: set_player $PLAYER_CHAR drunk_visuals 100
else 
052C: set_player $PLAYER_CHAR drunk_visuals 0  
end
jump @DRUNK

Но так писать скрипт неправильно. Почему? Потому что если хотя бы одно условие не будет верным, то начнет выполняться опкод 052C: set_player $PLAYER_CHAR drunk_visuals 0 . То есть он будет постоянно работать, если цель не равна 3 (на цели 1, 2, 4, 5 и так далее). А зачем нам убирать пьяную камеру, когда она еще даже не включилась? Так же этот опкод будет постоянно работать если миссия выключена или если слот миссии не равен 1. Нам такое не нужно. Это лишняя работа для скрипта, от которой можно легко избавиться.

Если мы добавим цикл, все сразу станет работать так, так нужно. Ведь в цикл мы попадаем лишь один раз: если миссия запущена, слот миссии равен 1 и цель равна 3. Соответственно и выходим мы из него только 1 раз. Значит опкод отключения пьяной камеры выполнится тоже лишь однажды за миссию.

В итоге у нас получился вот такой скрипт:

{$CLEO}
0000:

:DRUNK
wait 0
if and
$ONMISSION == 1
$10914 == 1
$9903 == 3
then
    while $9903 == 3
    wait 0
    052C: set_player $PLAYER_CHAR drunk_visuals 100
    end
    052C: set_player $PLAYER_CHAR drunk_visuals 0   
end
jump @DRUNK

Попробуйте создать миссию из 5 целей, сохраните её на 1 слот и проверьте работает ли получившийся скрипт. Пьяная камера должна включиться на цели 4 и отключиться во время цели 5.

Надеюсь, урок был для вас полезен. А на этом все!