00054. Внешние скрипты в main.scm
Внешние скрипты в main.scm|Начинаем новый урок по Sanny Builder. И на этот раз мы рассмотрим внешние скрипты.|wmysterio|wmysterio||||Всем привет! Что значит"внешние"? Это те скрипты, которые загружаются из файлы "script.img". Например: скрипт авто-тюнинга, парашюта или казино. Сегодня мы создадим один такой скрипт и рассмотрим основные опкоды для загрузки таких скриптов.
Прежде всего нужно написать сам скрипт ( пишутся как и обычные потоки в мейне ). Для примера у меня будет внешний скрипт, суть которого заключается в том, что когда машина игрока перевернута, то при нажатии кнопки CTRL` машина будет перекидываться обратно на колёса.
Прежде всего напишем поток ":NOFLIP". И переместим его в самый конец мейна ( все внешние скрипты пишутся после блока с миссиями ). Вот сам код:
:NOFLIP
thread 'NOFLIP'
wait 0
while actor.Driving($PLAYER_ACTOR)
wait 0
03C0: 0@ = actor $PLAYER_ACTOR car
if
01F4: car 0@ flipped
then
if
0AB0: key_pressed 17 // CTRL
then
00A0: store_actor $PLAYER_ACTOR position_to 1@ 2@ 3@
4@ = car.Angle(0@)
car.PutAt(0@, 1@, 2@, 3@)
car.Angle(0@) = 4@
end
end
end
end_thread
Можно было и запустить этот поток командой "create_thread", но раз мы учимся создавать внешние скрипты, то мы запускать его мы будем иным образом. Прежде всего нужно объявить этот поток как внешний. Находим стоку вначале мейна:
DEFINE EXTERNAL_SCRIPTS 0
Меняем значение 0 на 1, это указывается общее количество внешних скриптов. Так, как мы планируем создать новый внешний скрипт, то значение нужно прибавить. Далее нужно написать сам потом и дать имя нашему внешнему скрипту. Сразу после этого допишем строку:
DEFINE SCRIPT NO_FLIPPED AT @NOFLIP // 0
Здесь: NO_FLIPPED - имя нашего внешнего скрипта @NOFLIP - указываем метку с которой будет начинаться сам скрипт // 0 - это обычный комментарий, но я специально его написал, так как каждый скрипт имеет свой номер, счёт которых начинается с нуля. Дальше вы увидите зачем я это сделал.
Таким образом мы получим:
DEFINE EXTERNAL_SCRIPTS 1
DEFINE SCRIPT NO_FLIPPED AT @NOFLIP // 0
Теперь рассмотрим основные опкоды для работы внешних скриптов. Опкод записует в переменную текущий статус внешнего скрипта:
0926: $SCRIPT_STATUS = external_script_status 0 (NO_FLIPPED) // return 0 if not active
Далее:
08A9: load_external_script 0 (NO_FLIPPED)
Опкод загружает внешний скрипт.
08AB: external_script 0 (NO_FLIPPED) loaded
Проверка: "Внешний скрипт загружен?"
0913: run_external_script 0 (NO_FLIPPED)
Опкод запускает внешний скрипт.
090F: end_external_script 0 (NO_FLIPPED)
Опкод выгружает с памяти внешний скрипт ( завершает его ).
Здесь: 0 - номер внешнего скрипта NO_FLIPPED - указываем имя нашего внешнего скрипта
Это основные команды. Давайте теперь напишем поток, который будет запускать, написанный нами, внешний скрипт. Создадим поток с именем ":TRIGGER" и напишем необходимые условия:
:TRIGGER
thread 'TRIGGER'
wait 0
0926: $SCRIPT_STATUS = external_script_status 0 (NO_FLIPPED)
if AND
actor.Driving($PLAYER_ACTOR)
$SCRIPT_STATUS == 0
then
if
08AB: external_script 0 (NO_FLIPPED) loaded
then
0913: run_external_script 0 (NO_FLIPPED)
else
08A9: load_external_script 0 (NO_FLIPPED)
jump @TRIGGER
end
end
:TRIGGER_3_1
wait 0
090F: end_external_script 0 (NO_FLIPPED)
jump @TRIGGER
Как видите сначала мы запишем в переменную статус внешнего скрипта, дале мы проверяем: "СЖ в машине?" и "внешний скрипт отключен?". Если эти условие выполняются, то проверяем "Внешний скрипт загружен?". Если скрипт не загружен, то загружаем его, и так дальше, пока скрипт всё таки не загрузится. После загрузки идёт старт внешнего скрипта опкодом 0913. Дальше игра ждёт окончания потока ":NOFLIP". То есть, когда СЖ выйдет с тачки, то поток завершится, а затем и завершится внешний скрипт опкодом 090F.
Теперь запускаем поток ":TRIGGER" командой "create_thread" из потока "MAIN". В результате мы получили неплохую палочку-выручалочку. Теперь машина всегда будет под вашим контролем ;) Вот код мейна: main.txt. Это один из самых простых примеров, по этому разобраться в них думаю сложно не будет.
Теперь поговорим о том, зачем они нужны. Я сначала не понимал зачем они вообще нужны. Работал только с обычными потоками. Но вдруг игра начала сильно тормозить. Я не мог понять с чего это вдруг. Потом увидел статью о внешних скриптах и попробовал сделать несколько. На моё удивление, игра перестала тормозить. Как оказалось, игра выделяет дополнительную память под внешние скрипты, что значительно увеличивает быстродействие.
Особенно помогает, если в потоке идёт очень много проверок и арифметических операций. Максимальное количество внешних скриптов - 70 ( одновременно работающих ), то есть мы так же получаем дополнительный бонус в потоках ( 70+96=166 ) 166 штук!!! Однако не стоит злоупотреблять этим, поэтому старайтесь максимально снизить количество потоков. Например, не нужно делать потоки для каждого внешнего скрипта, а стараться объединять их в один.
И напоследок рассмотрим ещё несколько полезных опкодов:
07D3: 'HOUSE' = init_external_script_named_handle 23 (BURG_BRAINS)
0884: 'DANCER' = init_external_script_named_handle 52 (DANCER)
Внешние скрипты инициализируются как строки ( задают им строковые имена ( не больше 7 символов! ) ). Привязываются к интерьеру, однако точный принцип работы этих опкодов я точно не знаю.
0928: init_external_script_trigger 19 (DEALER) with_actor_model #BMYDRUG priority 100
08E8: assign_external_script_handle 'DEALER' to_model #BMYDRUG
Внешний скрипт будут выполнять актёры с определённой моделью. В оригинальном мейне эти опкоды идут в паре. Здесь:
Здесь: #BMYDRUG - модель актёра, который будет выполнять действия во внешнем скрипте 'DEALER' - строковое имя скрипта 19 (DEALER) - номер и имя скрипта 100 - приоритет в процентах ( целое число )
0929: init_external_script_trigger 7 (ARCADE) with_object_model #CJ_COIN_OP_3 priority 100 radius 4.0 type -1
Внешний скрипт привязывается к объекту.
× **Примечание:** опкоды 08E8, 0928 и 0929 не требуют запуска. Они запускаются автоматически× **ВАЖНО:** Если Вы добавили внешний скрипт, то компилировать его нужно после выхода с игры ( полностью )!
P.S Попробуйте тоже сделать какой-то примитивный внешний скипт, чтобы попрактиковаться. На этом урок окончен. Спасибо за внимание! :)|1621|1|0||vneshnie_skripty_v_main_scm|1499523457
Last updated
Was this helpful?