Arma 2 как писать скрипты

Обновлено: 02.07.2024

Вот, решил наконец создать Простой и понятный (в идеале) гайд по редактору миссий.

Сам попробую написать всё, что знаю, что нашёл на форуме (с указанием авторов и ссылкой на оригинал), и попробую ответить на наиболее частые вопросы типа "Как. " и "Почему. ". Всё делается в обычной, чистой Arma 2 (не OA), однако почти всё применимо как в аддоне Operation arrowhead, так и в различных модах. Скриншоты все на Английском, взяты из официальной вики.

Оговорюсь, что сам я не профи в редакторе, так что мои способы решения различных задач могут (и скорее всего) не являются самыми правильными, красивыми и быстрыми. Если у вас есть что добавить/оспорить/спросить, то добавляйте/оспаривайте/спрашивайте.
P.s. Я сам не понимаю некоторых вещей, если кто-то меня просветит в комментариях, буду очень рад.

Начало. Основные термины.

Для начала разъясню те спорные термины, которые я буду использовать:
- Объекты. Это ВСЁ, что можно разместить на карте: от юнитов до модулей.
- Юниты. Это ВСЁ, что создаётся с помощью инструмента Units, кроме модулей. Модули это модули.
- Дополнительные команды. Это те команды, которые записываются в "Инициализацию" и "Активацию\Деактивацию"

Общий вид редактора.


Надеюсь, что вы смогли сами найти редактор в меню, и даже (!) зайти в него.
Итак, что мы видим:

  • Переключение между различными частями миссии. Их четыре вида: вступительный ролик, сама миссия, ролики, которые будут показываться в случае победы\ поражения.
  • Панель разведки. Здесь вы можете изменить погодные условия, дату, и сторону, которую будут поддерживать партизаны.
  • Создание различных объектов, в различных версиях их может быть 6 или 7 видов, так как в более поздних версиях модули вынесены в отдельный вид (ранее принадлежали к юнитам).
  • Загрузка сохранённой миссии.
  • Объединение с другой миссией (перетаскивание всех объектов из одной миссии в другую).
  • Сохранение миссии в различных форматах.
  • Включение\отключение отображения ID всех предметов на карте.
  • Включение\отключение отображения текстуры карты.
  • Пробный прогон миссии.
  • Выход.
  • Side\Сторона - Сторона, к которой будет принадлежать юнит. Сюда же относятся технические юниты (логика игры) и различные строения и пустая техника (пусто).
  • Faction\Фракция - Фракция юнита. Зависит от стороны.
  • Class\Класс - Род войск, к которому будет принадлежать юнит.
  • Control\Контроль - Будет ли у игрока возможность играть за этого юнита.
  • Info age\Время - Назначение мне лично не понятно.
  • Vihicle lock\Доступ - Открывает\запирает двери транспорта. По умолчанию - закрыты.
  • Rank\Ранг - изменяет звание юнита.
  • Unit\Отряд - выбор типа юнита.
  • Special\Особенности - Изменяет режим расположения юнита.
    Нюанс: если выбрано что угодно, кроме "Нет", то любые юниты будут появляться в построении, указанном в их первом вейпоитне, или, если его нет, в построении "Клином". Исключением является появление в кузове транспорта.
  • Name\Имя - техническое имя юнита, это не его имя, отображающееся в радиопереговорах . Отображается во всех вейпоинтах юнита. Основное использование - дополнительные команды.
  • Skill\Уровень - опыт юнита. Более опытные юниты действуют более продумано.
  • Initialization\Инициализация - дополнительные команды, применяемые к нему во время его появления.
  • Description\Описание - описание юнита, используется в мультиплеере, при выборе юнита.
  • Health\Armor|Fuel|Ammunation \ Здоровье\Броня|Горючее|Боеприпасы - регулирует уровень Здоровья|Горючего|Боеприпасов у юнита.
  • Azimut\Азимут - направление размещения юнита.
  • Probability of Presence\Вероятность присутствия - тут думаю, понятно.
  • Condition of Presence\Условие присутствия - юнит будет появлятся, только если будет выполнятся условие, записанное с помощью дополнительных команд.
  • Placement Radius\Радиус размещения - устанавливает радиус, в случайной точке которого будет появляться юнит.

(вместо Х - высота здания, вычесляется методом тыка) команду вставить в графу "Инициализация" технике.

Arma 2 как писать скрипты

Основы выполнения скриптов в МП

Думаю все замечали что частенько те скрипты что работали в сингле, отказываются работать, или работают криво в мультиплеере. Чаще всего это происходит с маркерами, звуками, эффектами, действиями и т.д. В чём же здесь причина ?

Причина в том, что в сети у части команд результат выполнения локален (далее я буду писать что команда локальна или выполняется локально) т.е. результат выполнения появляется только на том компьютере, на котором эта команда была запущена. А у другой части команд результат выполнения глобален (далее я буду писать что команда глобальна или выполняется глобально) т.е. после выполнения команды на одном компьютере, результат её выполнения передаётся по сети остальным компьютерам. Под компьютерами я имею ввиду сервер и компьютеры всех игроков играющих в сети.

Чтобы было понятней, приведу два простых примера :

Создаём снеговика (да да, снеговик есть в аа2, можете проверить. там ещё много чего смешного есть) рядом с юнитом man. Для этого в ините юнита man пишем следующее :

snegovik = "snowman" createVehicle ( position this);

В сингле всё отлично, но стоит нам позвать другого игрока чтобы показать это, и запустить на на выделенном сервере, как вместо одного снеговика мы получаем сразу трёх. Почему ? А потому что команда createVehicle глобальна, и запущена была на всех трёх компьютерах (сервер, ваш клиент, клиент другого игрока). Т.е. она сначала выполнилась на сервере, и у всех создался первый снеговик, потом у вас, и второй снеговик появился у всех, и наконец у другого игрока - вот и третий снеговик.

Делаем экшен по которому вам будет вылетать хинт. В инит своему юниту пишем :

hintAct = this addAction [" Хинт !", "hint.sqf"]

А в скрипте hint .sqf пишем простейшее :

В сингле всё опять отлично, жамкаем на действие, выскакивает хинт с абугага. Зовём друга проверить это дело в сети, жамкаем на действие, у нас хинт выскочил, а другой игрок говорит что у него ничего нет. Просим его нажать на действие, он говорит что нажал и у него всё выскочило, но у нас ничего не выскакивает. Почему ? Команда hint локальна. А скрипт запускаемый по нажатию на экшен запускается только на компьютере того кто нажал на действие.

Различить локальные и глобальные команды очень просто :

У глобальных команд на бис вики стоит значок

А у локальных команд стоит значок

Запрет на выполнение на части компьютеров

Начнём с решения проблемы первого примера. Очевидно что нам нужно ограничиться выполнением скрипта только на одном компьютере. Для этого существует три команды, но одна из них почти не используется. Вот они :

isServer - проверяет является ли компьютер сервером, и если да, то возвращает true . В сингле она также возвращает true .

isDedicated - проверяет является ли компьютер выделенным сервером. В отличие от изСервер в сингле возвращает false .

local - проверяет является ли объект локальным. Т.е. игрок будет локален для компьютера игрока, а бот будет локален для сервера (подробнее о том что кому локально можно прочитать тут).

Соответственно для решения проблемы с созданием снеговиков достаточно написать следующее :

if (isServer) then

Отправка команд на остальные компьютеры

С тем чтобы ограничить выполнение команды запущенной на всех компьютерах как видите всё довольно просто. Но как решать проблему из примера 2, когда команда локальна и запущена только на одной машине, т.е. результат её выполнения не передастся на другие компьютеры ?

Я знаю четыре способа. Хотя нет, благодаря ofpwarior их уже пять.

Способ первый : Пабликвар и триггер или while

Это самый простой способ, но при использовании триггеров применимый к сожалению только для миссий. В аддонах его использовать выйдет только если использовать while , но там встаёт вопрос о том как связать пабликвар и конкретную машину, поэтому для аддонов зачастую удобней способ №2.

Идея такая : по нажатию на экшен мы создаём publicVariable а в миссию добавляем триггер (или пускаем скрипт с бесконечным циклом из инита), условием в котором стоит этот пабликвар, а в эффекте то что нам было нужно сделать на всех компьютерах.

Т.е. на рассматриваемом примере с хинтом это будет так :

В скрипте hint .sqf мы пишем :

В условии триггера вместо this пишем my_pv_hint

А в активации пишем :

Способ второй : сетвар и триггер или while

Отлично подходит для аддонов, или для вещей связанных с объектами. Идея в том чтобы для определённого объекта добавить некоторое свойство. В отличие от пабликвар переменная установленная для объекта командой setVariable может быть любого типа. Соответственно мы устанавливаем нужное нам значение, а в триггере или запущенном везде скрипте с бесконечным циклом проверяем изменилось значение на то которое нам нужно, или нет. Для этого используем команду getVariable . Как я уже говорил, для миссий данный способ не шибко удобен, но для создания контрольной панели к какому нибудь объекту - то что нужно.

Способ третий : инит

Сам не использовал, только видел примеры использования. Возможно плохо дружит с JIP ( join in progress) т.е. возможно не будет срабатывать у игроков присоединившихся после старта, в отличии от первых двух вариантов. Повторяю, возможно т.к. сам я этот способ ни разу не использовал.

Идея простая. Мы изменяем на ходу строчку инита у некоего объекта, и заставляем её выполниться. Пример выполнения :

//Передаем анимацию на все компьютеры

_unit setVehicleInit "this switchMove 'AcrgPknlMstpSnonWnonDnon_AmovPercMstpSrasWrflDnon_getOutMedium'";

Думаю всё понятно, т.к. идея действительно очень простая.

В нашем случае примера с хинтом это будет так, пишем в hint .sqf

player setVehicleInit "hint 'abugaga'";

Способ четвёртый : пабликВар ЕХ

Универсально, на как всё универсальное не самое удобное. Идея заключается в использовании команды addPublicVariableEventHandler. Работает как часы, но надо помнить что срабатывает только на других машинах, т.е. не на той на которой изменён сам пабликВар. Чтобы было хоть чуточку понятней, вернёмся к нашему экшену с хинтом.

В инит своему юниту пишем слудующее :

hintAct = this addAction [" Хинт !", "hint.sqf"];

А в самом скрипте hint .sqf : (обратите внимание что тут мы тоже вызываем хинт, если этого не сделать, то хинт вылете у всех, кроме того кто нажал на действие)

Способ пятый : используем CBA

Кто не знает, СВА (Community Base addons) это набор аддонов включающих в себя кучу всяких полезностей для картоделов и скриптёров. В частности он включён в АСЕ. Так что если вы всё равно используете CBA, то почему бы не использовать его мощь ?

Итак функция CBA_fnc_globalExecute из аддона CBA

[ _channel , < player globalChat _this >, _parameter ] call CBA_fnc_globalExecute;

_channel Всем : -2, Только клиентам : -1, Только серверу : 0 [Целое число] (именно с минусом)

_code Code to execute [Code]

_parameter Опционально. Передается в код в переменных _this [Любое значение]

Надеюсь я смог хоть немного помочь разобраться в этом деле. Первоначально кажется что это всё очень сложно, но при ближайшем рассмотрении всё становится довольно простым и понятным. Если разобраться с этим, то создание любых МП миссий становится лишь вопросом свободного времени.

Arma 2 как писать скрипты

Как сделать ролики в аа2?
Во избежания таких вопросов я и написал данное пособие. Это мой взгляд на создания роликов и мое желания поделится с Вами.

Простейшие знания скриптов:
Это можете прочитать в справочниках, там популярно расписано что и как.
От себя добавлю, существует три вида роликов:
1. интро ролик(вступительный ролик), активируется с помощью скрипта Introinit.sqs это зарезервированое названия, и скрипт срабатывает сразу же с начала интро ролика. Активировать его не надо!
2. оутро ролик(заключительный ролик), активируется с помощью скрипта OutroInit.sqs это зарезервированое названия, и скрипт срабатывает сразу же с начала интро ролика. Активировать его не надо! Примечания: в арма2 он не работает по неизвестным причинам, в аа1 работает. В таком случае в оутро ролике в инициализации любого юнита активируем наш ролик к приеру outro.sqs.
3. ролик в середине миссии, делается скриптом и активируется как обычный скрипт там где это необходимо
А теперь рассмотрим все по пунктам содержания любого скрипта ролика:

; отключаем радио
enableRadio false
; нормальное время
setAccTime 1
; убираем кинематографические полосы, можно этого не делать, кому как нравится
showcinemaborder false
; вводим в черный экран
titleCut ["","Black faded", 0]
; отключаем звуки
0 fadesound 0
; создаем камеру
_camera = "camera" camcreate [0,0,0]
_camera cameraeffect ["internal", "back"]
; меняем фокус для того чтоб не было запыленности при переходе между позициями камеры
_camera camPrepareFocus [-1,-1]
; пауза в скрипте

2
; выводим из черного экрана за 2 секунды
titleCut ["","BLACK IN", 2];
; включаем звук, включения нарастающее за 2 секунды
2 fadesound 1
; а теперь смотрим че мы сделали: мы создали камеру (_camera) и сделали черный экран на 2 секунды, это делается для того чтоб погрузилась игра, можно и не делать, но без подгрузки игрок(особенно на слабых машинах) увидит незагружонные текстуры и аа2 в виде квадратиков.
; СЕРЕДИНА СКРИПТА

; КОНЕЦ СКРИПТА
; делаем плавное затухания за 2 секунды
titleCut ["","BLACK OUT", 2]
; затухания музыки и звуков за 2 секунды
2 fademusic 0
2 fadesound 0
; пауза в скрипте

2
; удаляем камеру
_camera cameraeffect ["terminate", "Back"]
camdestroy _camera
; заканчиваем просмотр ролика
endMission "END1"
; выход из скрипта
exit

Вот в принципе и все, а теперь самое интересное и трудное - середина нашего ролика, в нем мы и делаем то что хотим показать зрителям.
Для начала нам нужны координаты камеры, делаем это так:
в инте любого игрока прописываем this exec «camera.sqs»(это системный скрипт и его создавать негде не надо. ), нажимаем предосмотр. И мы играем в роле камеры, можно литать туда и сюда(управления как вертолета почти:) ), как нашли мы то что хотим заснять, то и нажимаем на левую кнопку мыши, следом сразу идем в наш скрипт ролика и копируем координаты(как обычный текст, нажимая контр и в к примеру). Увидем что то вроде этого:

;=== 18:41:15
_camera camSetTarget [7912.55,103006.88,8793.68]
_camera camSetPos [9627.82,3406.36,2.00]
_camera camSetFOV 0.700
_camera camCommit 0
@camCommitted _camera
вот мы и получили наши координаты.
в строчке:
_camera camCommit 0
поменяв вместо 0 на 20 к примеру, то это означает что камера прийдет к данной точке за 20 секунд.
строчка:
@camCommitted _camera
озночает что следующие действия будет сделано только после того как камера встанет на сврю позицию( в данном случае [9627.82,3406.36,2.00])
Настоятельно рекомендую пользоватся именно этим способом, он самый быстрый и простой, не нужно искать координаты камеры относительно объекта(как показывает практика это «вертолетная площадка») и выводить ее на нужную высоту.

Дальше уже ваш полет фантазий и умений, можно заснять все что душа пожелает.
Некоторые примеры и полезные советы и команды:

- Как показать свою картинку в миссии? Скачивайте пример с форума в полезных совета

- Пишете в инцилизацию игрока - hint format["position: %1", getpos player], и сразу в начале миссии вы получите координаты места на котором стоит игрок.
Это будет выглядеть что-то вроде этого - 8627.95,9372.47,6.

- управления камерой:
8 : наклонять вверх
2 : наклонять вниз
4 : поворот влево
6 : поворот вправо
+ : увеличить
- : уменьшить
V : выход из режима камеры
L : включает и выключает прицел (крест в центре экрана)
Q : движение вверх
Z : движение вниз
W : движение вперёд (нормально)
E : движение вперёд (быстро)
S : движение назад
A : движение налево
D : движение направо
DEL : движение налево и отдаление цели
END : движение направо и отдаление цели
PAGE UP : смотри Q
PAGE DOWN : смотри Z
X : как A но быстрее
C : как D но быстрее
- Основные команды для создания видео-роликов:
 CamCreate - создать камеру
 CameraEffect - указать эффекты камеры
 CamSetPos - указать позицию камеры
 CamSetTarget - указать цель камеры
 CamSetRelPos - указать позицию камеры относительно ее цели
 CamCommit - выполнить изменения
 CamDestroy - удалить камеру
- Выражение лица.

aP setmimic Play
aP - имя солдата
Play - выражение лица
Вместо Play:
 angry - злой
 smile - улыбающийся
 suprise - удивленный
 hurt - чувство боли
 sad - обидился
 ironic - улыбка
 cynic - ухмылка
 agresive - агрессивный
 normal - нормальный
- полезные команды:
заканчивает миссию или ролик
endMission "END1"
отключает разговор между ботами
unitName setVariable ["BIS_noCoreConversations", true];
отключает управления у игрока, чтоб игроки обязательно посмотрел ваш ролик, не забудте в конце скрипта прописать внушения ( false)
disableUserInput true
бесмертие
this allowdamage false
прикрепления name к name_6
name attachTo [name_v, [0,0,0]]
дождь
time setRain rainDensity
скорость передвидения
groupOne setSpeedMode "LIMITED"
проведения юнита
groupOne setBehaviour "SAFE"
режим боя юнита
groupOne setCombatMode "BLUE"
положения юнита
soldierOne setUnitPos "Down"
союзник всем (в него стрилять не будут)
player setCaptive true
повреждения
player setdammage 1
поворот
player setDir 180
телепорт к name
player setPos (getpos name)
удалить что либо с карты
deletevehicle man

Пока все:)
Надеюсь это пособия по роликам сможет помочь в создании Вашего первого ролика.
Все очень просто, мешает лишь лень и незнания, знария я дал, все остальное за Вами.

Arma 2 как писать скрипты

DayZ Singleplayer

Вот несколько важных тем с форума:

Поизучайте форумы. Там много чего есть нужного и нтересного.

Скрипт команды для Arma 2 и Arma 2 OA:

DayZ Singleplayer

Вибирайте тот, который вам больше понравится.

В запуске игры указывайте параметр -showscripterrors что бы показывались ошибки скриптов. И можно еще добавить -window что бы было удобнее переключаться между окнами.

Так же не забывайте просматривать лог игры.

Что бы из скриптов писалась инфа в лог используйте команду diag_log

Можно для наглядности использовать чат

Совет: Чаще пользуйтесь поиском.

Например вам нужно узнать где используется переменная myHelyTime Вы запаковываете миссию в pbo и засовываете в текстовый документ. Включаете Найти и ищете myHelyTime

Читайте также: