Перейти к содержанию

Arma 3 полезные скрипты для сценариев


 Поделиться

Работа с объектом
Одно из удобных (на мой взгляд) я бы выделил взаимодействие, вызывая SQF файл
 
this addaction ["Ваш_текст","файл.sqf"];
 
Подобрать "объект"
(можно подбирать что захотите)
В инициализации объекта прописываем следующее:
this addAction ["Take Intel", {hint format ["Intel Taken"]; DeleteVehicle (_this select 0) select 0;}, [], 6, true, true, "", "", 6];
Take Intel и Intel Taken - ваш текст
 
"Подышать на объект"
this addAction ["Подышать на стол", {hint format ["Успешно"]; RemoveAllActions (_this select 0) select 0;}, [], 6, true, true, "", "", 6];
 
Закрыть двери в объекте
this setVariable ["bis_disabled_Door_1", 1, true];
 
Повреждение объекта
unit setdammage 0.8; 0.9 - состояние когда объект сильно поврежден, но не уничтожен - 1 – полностью уничтожена
 
Удаление
Удаление экипажа и любого объекта (кроме Простых объектов)
heli - имя переменной
deleteVehicleCrew heli; 
deleteVehicle heli;

 

 
Урон по объекту
unit allowdammage Значение;
Имя
Значение
True
Включен
False
Выключен
 
Увеличить или уменьшить объект
В инициализации объекта пишем следующее
this setObjectScale ЧИСЛО;
 
Прикрепить флаг к чему либо
Устанавливает флагу "this" текстуру и прикрепляет его к технике
this setFlagTexture "a3\data_f_orange\flags\flag_idap_co.paa"; [this, aa] call BIS_fnc_attachToRelative
aa - имя переменной машины
 
Прикрепить объект, транспорт, турель к чему либо
Делаем как хотим и что хотим
Вбиваем предмету с которым вы хотите работать(машина например) имя переменной и просто ставим в редакторе как вам угодно, затем пишем волшебную команду в инициализации предметах которые будут на машине
[this, aa] call BIS_fnc_attachToRelative
aa - имя переменной машины
Например - можно делать вот такие танки
698C62FAE142484A5AE30520E78BF871DA25E025
 
Динамическая прорисовка объектов
Возможно повышает FPS. Полезно для сценариев которые состоят из несколько частей в одной миссии, чтобы не мешаться друг другу, либо же архитектура сценария полностью самодельна.
  • Создаем триггер
  • Создаем объект и сохраняем его в композиции - называем ее например Mis
В триггере пишем следующее
C9C4AE4732381FBEE93F6A3AB09ABD32CA85915B
В активацию
{_x enableSimulation false;_x hideObjectGlobal true;} forEach (getMissionLayerEntities "Mis" select 0);
В диактивацию
{_x enableSimulation true;_x hideObjectGlobal false;} forEach (getMissionLayerEntities "Mis" select 0);
Повторяемый. Сервер.

Теперь спавним нашу композицию.
И далее просто заносим наши вновь поставленные объекты в папочку Mis
23C75E475972E4E2E2058979157497EA48D1F041
ВАЖНО! Перенос объектов в композицию происходит только в левом окне с элементами. То есть жмем на объект один раз - он выделяется(можно выделять несколько), а далее зажав ЛКМ мы его переносим.
Переносы работают криво, объяснять думаю нет смысла - сами поймете когда будете этим заниматься

 
Анимация движения объекта
  • Создаем 4 модуля Ключ расширенной кривой
  • Создаем 2 модуля Отрезок
  • Создаем 2 модуля Расширенная кривая
  • Тепловоз (Train)
И так. Представим, что мы делаем анимацию тепловоза, который просто едет вперед. Определяем для себя какая точка будет началом. Ставим туда в друг друга 2 ключа(один будет работать в точку А, другой в точку В). ПИШЕМ для себя чтобы не путаться имя переменной им! и так же ставим в точке В 2 ключа (Так же в друг дружке!)
У меня так. a1 и a1_2 и другая пара b1 и b1_2
D478D8057FCB33D0345F75CF8FE302553F75206D3B1B6DAD5DE3E5E1D867ED50BBCB49012A965F71
Наименование
Значение
Время
50 и 0
Режим
EaseInOut
Тангенс
10
Поле зрения
0.75
b1 и b1_2 аналогично только поменяйте местами их в написании "внутрянки"

Далее ставим 2 отрезка и 2 расширенных кривых
Синхронизируем между собой по паре (Отрезок -> кривая)
933D90E2D976D6B5F8C706C54F9E60A75F56FDAD
Далее делаем следующее с 2 отрезками и называем их line1 и line2
0A79B27B85A7C132B62BD841AC676DBD60B44D1D48B1E788FEC34B9E8039FA1C776A58162B43E722Событие у меня свое, в данном случае когда поезд начинает движение он гудит
Значение длины и скорости воспроизведения тоже подогнаны под свой вкус
Синхронизируем кривые с ключами И ОБЯЗАТЕЛЬНО с тепловозом (им.перем Train)

a1 и b1 синхронизируем с кривой которая идет на line2
a1_2 и b1_2 синхронизируем с кривой которая идет на line1
Наименование
Значение
Длина
600
Скорость
0.5
Режим
EaseInOut

В итоге должно получится что кривая соединяет 2 ключа, поезд и отрезок
 
  • Далее, чтобы запустить движение - создаем 2 "консоли" . Одна движение в точку B, другая реверс.
D5B13EEE4D45EAE4B2B0FACC70DAD631D3814D834B1F3F673560043B215696EE98E5CCC9036DF0EB
Если так нужен будет поворот, снижение и повышение высот, то попробуйте просто полетать рядом с анимационной линией с зажатым шифтом. Игра вам предложит сделать там точку следующего отталкивания, а там уже легко подогнать все. Синхронизирует оно само (оно умное). Не забывайте сделать это и на реверсе!!
Выглядят они так
68A1EB5AE704FFA5D54C2735F5110878EEA47F52
 
Обнаружение цели
от Vivian
  • Создаем триггер
  • Создаем "Создать задание" и синхронизируем
В условиях триггера пишем
currentWeapon Player == "binocular" and cursorObject == VIP
VIP - имя переменной мужика
binocular - бинокль (ванильный). Чтобы заменить его - выбираем в арсенале другой бинокль и жмем CTRL+C и меняем значение бинокля.
Как только перекрестие бинокля пересекается с моделькой нужного персонажа, триггер срабатывает.
5F2B3E903A0A0A40733562774A0E8E066F70449E
Либо альтернатива
  • Создаем триггер
В условиях триггера пишем
!(gg1 KnowsAbout t1 <1)
Как только игрок(gg1) сможет увидеть t1, триггер срабатывает.
 
 
Работа с текстом
Список команд

globalChat
groupChat
vehicleChat
commandChat
systemChat
hint
hintC
hintSilent
BIS_fnc_guiMessage
BIS_fnc_dynamicText
BIS_fnc_infoText
BIS_fnc_textTiles
BIS_fnc_typeText
BIS_fnc_typeText2
BIS_fnc_EXP_camp_SITREP
BIS_fnc_showNotification
BIS_fnc_showSubtitle
BIS_fnc_WLSmoothText


 
Примеры некоторых команд
№1
["ОПЕРАЦИЯ ПЕРДЕЖ",-1,-1,4,1,0,789] spawn BIS_fnc_dynamicText;
E2993C0074A49A564D3F7678BB7EDBE4AD7425FE
 
№2
["<t color='ffffff' font='PuristaMedium' size = '0.7'>Глава 2: Ты мне друг или враг? </t>",-0,0.92,7,0,0,789] spawn BIS_fnc_dynamicText;
Можно менять шрифт, см https://community.bistudio.com/wiki/FXY_File_Format
 
№3
titletext ["Штаб: Старший Прапорщик Головнюк убит в бою.","plain down"];
67F81590804C552DE52F0CCEC70BBDE9C7AA1EF5
 
№4
call {cutText ["<t color='#00bfff'size='1.4'>Гражданский: </t> <t size='1.4'>Неплохая погодка да?<br/> Самое время чтобы погулять!</t>", "PLAIN DOWN", -1, true, true];}
Если нужно чтобы тот кто говорит был жив пишем в условие это
call{player inArea thistrigger && alive имя перем;}
1C4633E382B45B4FDCBE8D1704409C6C2237CD3F
 
№5
Текст пишется слева снизу (Там где чат, ну так у меня)
"Stratis, 2035-07-14 0130<br />A dark night ahead…" call BIS_fnc_titleText;
 
№6
Примерно такие еще есть в 3den(мод), но там их мало
[
[
["После попадания в голову 50 калибром, ", "align = 'center' shadow = '1' size = '0.7' font='PuristaBold'"],
["Морг", "align = 'center' shadow = '1' size = '0.7'", "#aaaaaa"],
["","<br/>"], ["10 минут спустя...","align = 'center' shadow = '1' size = '1.0'"]
]
] spawn BIS_fnc_typeText2;
E72243E96B852E2CEDD130DF0D7A13F77DE31A61
 
№7
["Пульс потерян", 2, 3, [1,0,0,1], true] spawn BIS_fnc_WLSmoothText;
41E78F16BC0E19E15780674213ADD32F5F9118D2
 
№8
Выводит подсказочное сообщение справа от экрана со звуком. Для разделения сообщения на несколько строк используйте \n.
hint "Чтобы убрать оружие из рук.\nВозьми рпг в руки и резко упади на землю."
F69D368B714FE6FA1821530669905FC6B7702CC2
Можно добавить картинку
hint parseText "<img image='ваша_картинка.paa' <img size='20' /><br/><br/><t size='1.2'>Ваш_текст.</t>";
 
Цветной текст
0C9D4D1C66D3B0A1D520B276D706E76E15E23552Пример <font color='#00FF00' size=18>ОЙ</font> что-то <font color='#0000FF'>Бу-бухноло</font> и <font color='#FF0000' size=28>Все погибли</font>
Цвет и размер можно настраивать под свой вкус.
 
Статья AAN(новости)
Можно вписывать в sqf или триггер, кому как удобно.
[ [ ["title","My Title"], ["meta",["Katherine Bishop",[2035,2,24,11,38],"CET"]], ["textbold","This is a bold text"], ["image",["\a3\Missions_F_Orange\Data\Img\orange_overview_ca.paa","Some image description"]], ["box",["\a3\Missions_F_Orange\Data\Img\Faction_IDAP_overview_CA.paa","You won't believe how playing Showcase Laws of War can change your life!"]], ["text","Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt pretium ultricies. Etiam ac ornare est, quis posuere nisl. Mauris facilisis lectus eu turpis maximus consequat. Donec ut metus nec risus tristique mattis. Ut posuere rutrum tellus, ut molestie orci mattis id. Cras ultrices euismod diam, in venenatis nunc commodo eget. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi congue dolor rutrum lectus euismod, ac faucibus magna molestie. Aliquam in libero sit amet eros sagittis tristique. Nam pellentesque dignissim aliquam."], ["textlocked",["Sed non est risus. Nulla condimentum at leo sed bibendum. Phasellus laoreet sit amet leo tincidunt consequat. Curabitur nec hendrerit purus. Nam massa nisi, mattis in aliquet consectetur, ornare eget nibh. Nunc dignissim, nibh sit amet ultrices tincidunt, mi nulla fermentum quam, non condimentum dolor eros vulputate massa.","SUBSCRIBE PLZ"]], ["author",["\a3\Missions_F_Orange\Data\Img\avatar_journalist_ca.paa","Katherine Bishop is a journalist"]] ] ] call BIS_fnc_showAANArticle;
67867FD6AA79C70347A0E3D797D9DE90A162CC3F
Это мой вариант
030C4166ABA68C467EB9023CC4C015077202C9BD
 
 
Работа с картинками
Своя картинка на объекте
Ну тут все просто
Кидаем в папку с миссией свою картинку в формате .jpg, но желательно в paa.
Далее указываем путь к ней
9CA54D013142F0B1224E1A02E6ED0A5F8D44C2BF11303F853238B203C94DF60589226A228699BCCD
 
Своя картинка на задании либо в "разведки" миссии
Создаем модуль "Создать задание"
Пишем и делаем все как вам удобно и в описании пишем следующее:
Ваш текст(если нужно) <img image="pictuk.jpg" width="270" height="270"/>
pictuk.jpg - в моем случае это название моей пикчи в папке миссии
width и height можно менять
Вот так выглядит у меня
44A73AC2AAA548882384AF8CE328067594499288
 
Своя картинка и текст на листе, газете и прочее или интел с картинкой
В имени пишем например myLeaflet
sna.jpg - картинка, которая будет видна при приближении
Если вместо картинки нужен просто цвет, то например #(argb,8,8,3)color(1,0,1,1)
Пишем дальше в инициализацию того же объекта
[myLeaflet, "sna.jpg", "Ваш текст"] call BIS_fnc_initInspectable;
Либо так
[myLeaflet, ["sna.jpg", -1, -1], "Ваш текст."] call BIS_fnc_initInspectable;
 
Текст с картинкой
969A3C4135D4E5F3AF4BA278FC64B981634B62B3
Делаем все как было описано раннее
Пишем:
["<img size='5' image='путь_к_картинке' />",0,0.5,38,3,0,9459] spawn bis_fnc_dynamicText; call {cutText ["<t color='#284e26'size='1.4'>Майор Порошко: </t> <t size='1.4'>Удачи, бойцы!</t>", "PLAIN DOWN", -1, true, true];}
[текст(в данном случае картинка), x, y, длительность, время затухания, задержка, rsclayer]
Большой акцент на числа 38 и 3 - именно столько идет(в секундах) монолог в моем сценарии
 
Плавное появление картинки на экране
Исчезает так же плавно
["path\to\image.paa"] spawn BIS_fnc_textTiles;
 
Нашивка
  • Картинка(желательно в .paa вообще любую картинку можно впаять)
  • Триггер(необязательно)
896512D93C39D6B1B34DF348BB5FFF199E02C9D6
description.ext
class CfgUnitInsignia { class ork { displayName = "ORK"; author = "Lastick"; texture = "ork.paa"; material = "\A3\Ui_f\data\GUI\Cfg\UnitInsignia\default_insignia.rvmat"; textureVehicle = ""; }; };
Пишем в триггере либо юните
[Kulo, "ork"] call BIS_fnc_setUnitInsignia;
Kulo - имя переменной юнита
 
 
Маркер
Маркер-указатель
CFE17A2DB06AB843272049B1AF2393616ECDB2E6
  • Создаем сам маркер и называем его. В моем случае Paros, маркер можно брать любой.
В любом из разделов инструктажа или задачи пишем
<marker name="Paros">Ваш текст</marker>
Выглядит это вот так
E4D8586C1C05E2A7B5FDDA8C78CD97D788E7037FДо и после этого может стоять ваш текст. По нажатию на подсвеченное слово желтым, камера будет вас перемещать на маркер
 
Динамические маркеры
 
Init.sqf
Пишем следующее
"one" setMarkerAlpha 0; "two" setMarkerAlpha 0;
one и two - имя переменной маркера

В триггере пишем следующее
"one" setMarkerAlpha 1; "two" setMarkerAlpha 1;
(актуально использовать, как какие-нибудь разведданные)
 
Телепорт на заданный маркер
В триггере пишем следующее:
В условие
player in thisList
В активацию
player setPos GetMarkerPos "MyMarker";
  • Создаем сам маркер(я брал "Пусто" чтобы его не было видно) и пишем в нем имя переменной MyMarker

Альтернатива (с затемнением)
this addAction ["Переход", { 1 cutText ["","BLACK OUT",1]; sleep 2; player setPosASL (getPosASL mine2); player setDir 181; sleep 0.5; 1 cutText ["","BLACK IN",1]; }, nil, 1.5, true, true, "", "true", 5, false, "", ""];
 
Динамическая точка возрождения
Создаем
  • Точку возрождения (ТВ) (любую, хоть маркер)
  • Триггер

Прописываем имя переменной ТВ, в моем случае respawn_east
Далее в триггере пишем
_marker = createMarker ["respawn_east_2", position pos1]; "respawn_east_2" setMarkerAlpha 0; deleteMarker "respawn_east";
pos1 - переменная объекта чьи координаты будут использованы для создания нового маркера
Другие фракции
east
west
guerrila
 
 
Экран
Эффект будто резко встал с дивана
В активацию
[1, "BLACK", 5, 1] spawn BIS_fnc_fadeEffect;
Можно поменять на WHITE
1 - затухание (0 - обратное)
5 - длительность
1 - размытие (0 - нету)

 
Затемнение экрана
titleCut ["", "BLACK FADED", 999]; titleCut ["", "BLACK IN", 5];
 
Убирает интерфейс и делает черный экран
["BIS_fnc_quotations_blackScreen", false] call BIS_fnc_blackOut;
Можно накладывать текст
["BIS_fnc_quotations_blackScreen", false] call BIS_fnc_blackOut; ["Вас ♥♥♥♥♥♥♥♥анули черенком от лопаты - вы погибли.",-1,-1,4,1,0,789] spawn bis_fnc_dynamicText;
E8EDE49F3B32E19E06F4550745E8371ACC69DD42
Вернуть экран обратно
["BIS_fnc_quotations_blackScreen", false] call BIS_fnc_blackIn;
 
Рамки как в кино
Очень рекомендую использовать с "черным экраном", который выше
4C0D9764929BE086338DE4612B392E06F46C0D0C
Включить
[0, 20, true, true ] call BIS_fnc_cinemaBorder
Выключить
[1, 20, true, true ] call BIS_fnc_cinemaBorder
Наименование
Значение
Выкл и Вкл
1 и 0
Продолжительность
20
Звук
true и false
Блокировка первого лица
true и false
 
Эффект синего ПНВ
031CCB73E83A02BBAAFF98D3AFD5AA6530C74544
эффекты помимо синего фильтра - асе
Создаем следующие файлы в папке с миссией
  • nvg.sqf
  • init.sqf
 
init.sqf
[] execVM "nvg.sqf";
nvg.sqf
if (isDedicated) exitWith {}; if (player != player) then {waitUntil {player == player};}; while {true} do { waitUntil {(currentVisionMode player) == 1}; PP_radial = ppEffectCreate ["radialBlur",100]; PP_radial ppEffectEnable true; PP_radial ppEffectAdjust [0.02,0.13,0.21,0.36]; PP_radial ppEffectCommit 0; PP_dynamic = ppEffectCreate ["DynamicBlur",100]; PP_dynamic ppEffectEnable true; PP_dynamic ppEffectAdjust [0.35]; PP_dynamic ppEffectCommit 0; PP_film = ppEffectCreate ["FilmGrain",2000]; PP_film ppEffectEnable true; PP_film ppEffectAdjust [0.14,1,1,0.5,0.5,true]; PP_film ppEffectCommit 0; pp_Color = ppEffectCreate ["ColorCorrections", 1502]; pp_Color ppEffectEnable true; pp_Color ppEffectAdjust [1, 0.6, 0, [0, 0.1, 0.2, 0], [0, 1, 1.2, 0], [1, 1, 1, 0]]; pp_Color ppEffectCommit 0; pp_Color ppEffectForceInNVG true; waitUntil {(currentVisionMode player) != 1}; ppEffectDestroy PP_radial; ppEffectDestroy PP_dynamic; ppEffectDestroy pp_Color; };
 
Концовка
Создаем модуль Закончить сценарий и триггер
Делаем свои условия и пишем в модуле "Задаваемый тип" - End1
description.ext
class CfgDebriefing { class End1 { title = "Задача выполнена"; subtitle = "Конец 1 миссии"; description = "Вы отлично зачистили пригород<br/>Готовьтесь к следующей атаке."; picture = "n_inf"; pictureColor[] = {0.0,0.5,0.0,1}; }; };
picture - это маркер (F6 в редакторе, наводим на любой маркер и ниже пишется его название)
Маркеры тут
https://community.bistudio.com/wiki/Arma_3:_CfgMarkers
Что получается
76D5B67CC7538726E0C59F49168A26079EED103A
 
Загрузочный экран
Текст заполнения слева сверху и снизу(типа подсказки)
egl_lv426flat - название вашей карты (см.название файла вашей миссии, после точки)
description.ext
class CfgWorlds { class egl_lv426flat { author = "Территория: Восточная Европа"; description = "Психиатрическая больница"; pictureMap = "ваша_картинка.jpg"; pictureShot = "ваша_картинка.jpg"; loadingTexts[] = { "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст." }; }; };
Пример
1F376B3FB21F8FA73478CF5230D0D109BCA7BA53
 
Эффект будто вас ранило
call BIS_fnc_indicateBleeding;
 
Землетрясение
[1] call BIS_fnc_earthquake;
Существуют от 1 до 4.
 
 
Музыка
Можно прописывать музыку, как через CfgSounds, так и CfgMusic
Но первый вариант будет накладываться друг на друга, если ваша первая музыка не закончила играть.
 
description.ext
class CfgSounds { class boevoirubej { name = "boevoirubej"; sound[] = {"sound\boevoirubej.ogg", 1,1}; titles[] = {}; }; } Или class CfgMusic { class theend { name = ""; sound[] = {\sound\theend.ogg, 4.0, 1.0}; }; }
Это имя - название вашей музыки
7FCB97EA1C4768D7316871C0EA6EB459A2F23B35

Теперь идем дальше - нам нужна сама музыка.
Создаем в папочке миссии папку и называем ее sound
614FE570657F6506ECEDBEA5B91EB79CD25F1177И теперь кидаем туда музыку, НО.
Название должно строго соответствовать как в Description(или наоборот)
Формат файла должен быть .ogg
0DCAAB7DEC6535CB0FB78FFDEB9B50D23B5B7325

С этим мы закончили. Теперь в арме создаем триггер и пишем в нем playsound "название вашей музыки в Description";
Вызов музыки можно делать в зависимости, как вы приписали ее выше. 3 вариантами.
playsound "boevoirubej";
playmusic "theend";
Ob1 say3D ["music", 50];
^- последний вариант запускается через триггер и включается на объекте "Ob1".ЯВЛЯЕТСЯ ЗВУКОМ!

И все. Заходим проверяем, слушаем.
 
Музыка "радио"
Работает так же как выше, просто имеет другое написание
От Братишки
В инициализацию объекта пишем:
this addAction ["Включить радиостанцию", { params ["_target", "_caller", "_actionId", "_arguments"]; _target say3D ["music", 50]; removeAllActions _target; }, nil, 6, true, true, "", "", 6];
 
description.ext
class CfgSounds { sounds[] = {}; class music { name = "music"; sound[] = {"sound\music.ogg", 1, 1}; titles[] = {0,""}; }; };
Не забываем закинуть саму музыку
 
Музыка "радио" альт
Создаем в папочке миссии папку и называем ее sounds
Кидаем туда нашу музыку
description.ext
class CfgSounds { sounds[] = {}; class вашамузыка { name = "вашамузыка"; sound[] = {"\sounds\вашамузыка.ogg", 300, 1}; titles[] = {0,""}; }; };
ТЕПЕРЬ!
Задаем имя переменной объекту (в моем случае c1)
И в инициализации вбиваем это
c1 addAction ["Включить музыку" , {c1 say3D [ "3Dsound", 50, 1]; RemoveAllActions (_this select 0) select 0;}, [], 6, true, true, "", "", 6];
 
 
Транспорт
Закрыть двери у транспорта
Человек будучи в этом транспорте не сможет вылезти или пересесть
vehicleName lock lockstate - ПРИМЕР jeep lock 2
vehicleName - имя переменной у машины
lockstate:
0-разблокировано
1-по умолчанию
2-заперто
3-заблокирован для игрока
 
Заблокировать инвентарь транспорта
Невозможно залутать транспорт
this lockInventory true;
 
Частичное ограничение дверей транспорта
Человек может сесть только за водителя, пересаживаться или садиться в другие места нельзя
this lockCargo true;
 
Очистить инвентарь транспорта
Каждый код удаляет определенный вид того или иного лута
clearWeaponCargoGlobal this; clearMagazineCargoGlobal this; clearItemCargoGlobal this; clearBackpackCargoGlobal this;
 
Ограничение водительской двери транспорта
Человек может пересесть или выйти, но обратно за водителя - нет
this lockDriver true;
 
Бесконечные патроны
В инициализации
БЕЗ ПЕРЕЗАРЯДКИ
this addEventHandler ["fired",{(vehicle (_this select 0)) setvehicleammo 1;}];
 
Бесконечный боезапас
помощь комментария от An!s!mov
В инициализации
С ПЕРЕЗАРЯДКОЙ
this addEventHandler ["reloaded", {(_this select 0) addMagazine ((_this select 3) select 0);}];
 
 
Фонарики, фары, лампы
Фонарик у бота
3 вида использования для удобств:
this enableGunLights "forceOn"; - только включает фонарик.Добавлять надо ручками!
this addPrimaryWeaponItem "acc_flashlight"; this enableGunLights "forceOn"; - добавляет И включает фонарик юниту.
this unassignItem "NVGoggles"; this removeItem "NVGoggles"; this addPrimaryWeaponItem "acc_flashlight"; this enableGunLights "forceOn"; - убирает ПНВ, добавляет и включает фонарик.
 
Включаем фары у транспорта
Транспорт - ПУСТОЙ
this switchLight "ON";
помощь комментария от Snezhok
this setPilotLight true; - прописываем в инициализации технике this disableAI "LIGHTS"; - прописываем пилоту/водиле
 
Мерцающие фонари
В инициализации пишем
Лампы
if (isServer) then { l13 = this spawn { while {alive _this} do { _this switchLight "OFF"; sleep (random 4); _this switchLight "ON"; sleep (random 4); }; }; };

Фонарик на оружии
if (isServer) then { l13 = this spawn { while {alive _this} do { _this enableGunLights "ForceOff"; sleep (random 4); _this enableGunLights "ForceOn"; sleep (random 4); }; }; };
 
 
CfgIdentities
Изменение лиц у игроков
у ботов можно в идентификации редактора поменять
У игроков по умолчанию ставится его лицо в настройках
В инициализации пишется следующая команда:
this setFace "лицо";

Узнаем тут
238E0A133F9E1D0878EEF7570C00874B952ACE2B
Или тут
https://community.bistudio.com/wiki/Arma_3_CfgIdentities
 
Изменение голоса у игроков
У игроков по умолчанию ЕСЛИ с модом АСЕ голос - отсутствует
В инициализации пишется следующая команда:
this setspeaker "голос";

Узнаем тут
5BE556C0F0715DDAFB4738B939FB06D64080DE7C
 
Индивидуальность персонажей
Выше изложен 1 вариант, но тут будет конкретно тот случай, когда это будет работать в мультиплеере всегда.

Лицо, голос, позывной группы, тон голоса, маска(ну то что на лице игрока)

Выглядит это вот так:
description.ext
class CfgIdentities { class Pawel { name = "Pawel"; nameSound = "None"; face = "CamoHead_White_09_F"; glasses = "None"; speaker = "Male01ENGB"; pitch = 0.9; }; class Wel { name = "Wel"; nameSound = "None"; face = "CamoHead_Greek_07_F"; glasses = "None"; speaker = "Male04ENGB"; pitch = 1.1; }; }
Там где "None" это не значит что его нету, просто это означает, что оно не используется
BC3497EAAA86690686CF19726F2651626E1F1563
!!!Важно - обязательно следите за расстановкой скобочек.
Можете даже покликать на них и понять какая скобка с какой связывается, если "конечной" нету, то в миссии вам скорее всего выдаст ошибку, мол на такой то линии у вас некорректно и тд.

Теперь, мы молодцы поставили эти значения - что дальше?
Дальше мы создаем триггер(можете хоть на всю карту) и указываем в нем Повторение
!Пишем нашим юнитам имя переменной - например solda
В триггере пишем следующее: solda setIdentity "Pawel"; solda2 setIdentity "Wel";
И все. Проверяем, умераем - смотрим, что все работает прекрасно и радуемся что теперь в нашем африканском сценарии не белые воюют друзья,а темные.
 
 
Анимации
Лично я использую обе команды
this switchMove "анимация_01";
^- используется имя переменной
0 = this spawn{_this switchMove "анимация_01";};
Одну на юните, а другую в триггере.
POLPOX (для удобств)
 
Пример
this switchMove "Acts_AidlPercMstpSnonWnonDnon_warmup_2_loop";
3A05588272E22003C206F9FBD1B1FB535396BEE8
 
Анимация - смерть (для ботов)
  • Убираем хп
  • Выключаем моделирование
0 = this spawn{_this switchMove "Acts_StaticDeath_04";};
 
Анимация - брифинг либо введение
  • Триггер
  • POLPOX (для удобств)
Даем юнитам которые будут в анимации имя переменной (gg1 gg2 gg3 и тд)
Создаем 2 триггера
Пишем в первом например
gg1 switchMove "Acts_C_in1_briefing"; gg2 switchMove "Acts_Executioner_StandingLoop"; gg3 switchMove "Acts_AidlPercMstpSnonWnonDnon_warmup_1_loop";
Во втором пишем (выход из анимации, не забываем про время после которого он активируется)
gg1 call BIS_fnc_ambientAnim__terminate; gg1 switchMove ""; gg2 call BIS_fnc_ambientAnim__terminate; gg2 switchMove ""; gg3 call BIS_fnc_ambientAnim__terminate; gg3 switchMove "";

Рекомендую использовать на переходах затемнение экрана
Использование POLPOX позволяет вам точно определить и затестить прямо в редакторе как будет двигаться или стоять юнит, выбор анимаций можете делать прям там, инструкция по применению есть в моде. Необязательно включать его в пресет, все работает без него после теста и без ошибок
Примеры анимаций
Анимация
Анимация
HubBriefing_loop
Acts_AidlPercMstpSloWWrflDnon_warmup_8_loop
Acts_AidlPercMstpSloWWrflDnon_warmup_1_loop
Acts_AidlPercMstpSloWWpstDnon_warmup_2_loop
Acts_passenger_flatground_leanright
Acts_Briefing_SA_StartLoop
 
Анимация - ранение (для ботов)
от SHMEL
При получении урона, бот падает, бросает основное оружие.
  • Триггер
  • bot_ranen.sqf
LOP - имя бота
sq - игрок

Условие триггера
(getDammage LOP) > 0.0000001
Активация
null = [] execVM "bot_ranen.sqf"
bot_ranen.sqf
_weapon = currentWeapon LOP; LOP RemoveWeapon (currentWeapon LOP); sleep .1; _weaponHolder = "WeaponHolderSimulated" createVehicle [0,0,0]; _weaponHolder addWeaponCargoGlobal [_weapon,1]; _weaponHolder setPos (LOP modelToWorld [0,.2,1.2]); _weaponHolder disableCollisionWith LOP; _dir = random(360); _speed = 1.5; _weaponHolder setVelocity [_speed * sin(_dir), _speed * cos(_dir),4]; sleep .2; LOP lookAt sq; LOP switchMove "Acts_CivilInjuredLegs_1";
 
Беседы с ботом
от Dominion1859
Бот параллельно звуковому файлу шевелит губами, имитируя речь.
  • Триггер
  • Duckspeak.sqf
Пример активации: [Vasya, "VasyaSpeech", false] execVM "Duckspeak.sqf"
Примечание: Если для звука нужны субтитры, лучше их сразу прописать в description.ext
Duckspeak.sqf
params ["_boy", "_sound", ["_is3D", true]]; // _boy - имя бота // _sound - класснейм звука // _is3D - true/false. Если true, то звук будет проигран в 3D. По-умолчанию true. if (_is3D) then // Код для 3D-звука { _sound = _boy say3D _sound; _boy setRandomLip true; waitUntil {isNull _sound}; _boy setRandomLip false; } else // Код для звука, не в 3D { _sound = playSound _sound; // Используется playSound, так как его состояние можно отследить (т.е у него есть return value), в отличие от say. _boy setRandomLip true; waitUntil {isNull _sound || !alive _boy}; // Из-за того, что playSound не привязан к объектам (в отличие от say), приходится добавлять условие на отслеживание состояния "говорящего" _boy setRandomLip false; if (!alive _boy) then {deleteVehicle _sound}; }
 
 
Триггеры, условие, задача и Description
Служит базой для:
Скриптов;
Воспроизведения звука, голоса, музыки, окружения, слоев интерфейса;
Окончания или поражения для сценария;
И прочего..

Активатором может быть как любой объект(проп) так и человек, игрок, ИИ, группа людей(задать владельца триггера)
 
С объектами на сценарии можно взаимодействовать как на прямую через команду "this" так и через имя переменной
- второй в основном используется если подключается триггер для активации.

Создание задания

B5C4D74D25FAC9146B1636DAEC5928CA9C5E2557

"Создать дневниковую запись" - означает Инструктаж, боевая сводка и прочая хрень описывающая действия в которые попали бойцы
"Создать задание" - логично задание,в него входит описание задания и название. Единица, указанная в триггере описанная выше - активирует его и задание будет не выполнено вплоть до того пока не сделаешь условия другого триггера (Да, их нужно минимум 2).
Например: Тебе нужно взорвать дом.
Ставишь 2 триггера - 1 на месте активации, другой на месте выполнения задания.
1 - триггер создает задание, а условия выполнения задания(2 триггера) это отсутствия данного объекта.(Т.е после ПОВРЕЖДЕНИЯ или УНИЧТОЖЕНИЯ объекта задание будет выполнено)

9A01B2AB7B1B0E13DB252A9B3E699EB36152FCFE

"Установить назначения задания и Установить описание задания" - не знаю зачем это существует, расширенная функция

Создание и состояние задания нужно синхронизовывать между собой, чтобы оно РАБОТАЛО.

Если нужно чтобы триггер активировался не сразу - делаем следующее:
CF8C7988E5062E8C531C7151CF0B822F455EF611Значение идет в секундах, в данном случае через 10 секунд активируется триггер.
Так можно строить целые разговоры из нескольких триггеров и текста.
 
Главная задача
D72E7E436AC9280880082ED8E2D7DBAAB5CA3EFA
  • Создаем 3 задачи
Первая будет как "Заголовок"
Идентификатор род.задачи ставим имя - task1
Номер задания - task1
Вторая и третья как задачи и так далее
Идентификатор род.задачи ставим имя - task1
Номер задания - task2 и task3
Для того чтобы сделать вторую главную задачу, делаем тоже самое, только просто меняем имя (task1). Аналогично.
Выполнения задач и самой главной задачи - это условия вашего триггера. У меня выполнение главной задачи - условие, что все цели ликвидированы.
 
Условия
Значения логики
  1. Логическое ИЛИ
    • || или or
  2. Логическое И
    • && или and
  3. Логическое НЕ
    • ! или not

Соответственно к примеру
!alive name

Условие активируется когда объект \ юнит уничтожен - обратное значение alive name
Можно так же задавать условия чтобы активация была засчитана при уничтожении нескольких объектов \ юнитов.

Игрок в зоне триггера
player in thislist

Игрок сел в машину (jeep)
player in jeep

У игрока винтовка в руках
player hasWeapon "класс оружия"

Если необходимо, чтобы триггер был активен сразу то.
call{true}
Рекомендую для сцен в начале сценария, текста, выдачи заданий, либо для анимаций, например, смерть бота и тд.

 
Description
Является конфигом для вашей миссии. Крутая вещь, можно проводить в ней работы от простой замены лица, до каких-нибудь кастомных вещей, например музыки.
 
Заниматься этим можно непосредственно сидя в сценарии, да даже не можно, а нужно

Переходим в папку с миссией(там должна быть ваша миссия - mission.sqm) и в этой папочке создаем Текстовой документ и теперь переименовываем его. Пишем - description.ext - файл становится "белым", либо нет. Теперь открываем его через Notepad++ или любую другую программу которая в принципе выполняет такую же роль(можете даже вообще не парится и писать все в Текстовом документе и только потом прописать description.ext)
20E10480B9906F37259A7FB1D6330B6E45AEA42D
Вот ссылка на Description
https://community.bistudio.com/wiki/Description.ext
 
 
Прочие настройки
Сейв зона
  • Создаем триггер на карте
В условиях
this && player in thisList
Активация
inZoneH = [] execVm "inSafeZone.sqf";
Деактивация
null = [] execVM "leftSafeZone.sqf";
Повторяемый
Далее переходим в файлы миссии и создаем
  • inSafeZone.sqf
  • leftSafeZone.sqf
inSafeZone.sqf
hint "Безопасная зона"; player allowDamage false; while {true} do { player action ["SwitchWeapon", player, player, 299]; sleep 1; };
leftSafeZone.sqf
terminate inZoneH; hint "Отправляемся в рейд"; player allowDamage true; player action ["SwitchWeapon", player, player, 0];

Сохраняем. Заходим в обратно в арму и запускаем. Персонаж будучи в триггере не должен брать оружие и наносить урон другим.
ВАЖНОЕ ПРИМЕЧАНИЕ! данные актуальны с модом асе! Для простой версии - напишите вместо 299 - 100, это в inSafeZone
 
Сохранение инвентаря после смерти
Данный скрипт сохраняет вещи, патроны, гранаты и прочее, которые были перед смертью игрока. (Актуально с возрождениями, но не актуально с модом ace, т.к там эта ф-ция есть)
В файлах миссии создаем:
  • onPlayerKilled.sqf
  • onPlayerRespawn.sqf
 
onPlayerKilled.sqf
player setVariable ["Saved_Loadout",getUnitLoadout player]; removeAllActions player; player setVariable ["SHF_Enabled",nil,true]; playerDeadBody = player;
onPlayerRespawn.sqf
player setUnitLoadout (player getVariable ["Saved_Loadout",[]]);
 
Либо альтернатива
В файлах миссии создаем:
  • initPlayerLocal.sqf
 
initPlayerLocal.sqf
player addEventHandler ["Killed", {loadout = getUnitLoadout player; true}]; player addEventHandler ["Respawn", {player setUnitLoadout loadout; loadout = nil; true}];
 
Радиомолчание группы
Данный скрипт отключает переговоры группы.
В файлах миссии создаем:
  • InitPlayerLocal.sqf
  • Init.sqf
 
InitPlayerLocal.sqf
enableRadio false; enableSentences false; 1 fadeRadio 1;
 
Init.sqf
if ((!isServer) && (player != player)) then {waitUntil {player == player};}; enableRadio false; enableSentences false; 1 fadeRadio 1;
 
 
 
Поведение ботов
Отношения сторон
Данная команда нужна, чтобы изменить отношения фракций во время сценария.
  • west = blufor
  • east = opfor
  • resistance = independent
Пример, делает дружелюбие между Независимыми и Блюфоровцами
resistance setFriend [west, 1]; west setFriend [resistance, 1];
Обратное значение
west setFriend [resistance, 0]; resistance setFriend [west, 0];
Больше информации тут:
https://community.bistudio.com/wiki/Side_Relations
 
"Вызов подкрепления" у противника
Создаем такой триггер, например на 500м.
Тип - Пропустить точку, активация - в моем случае любой Блюфоровец, в типе активации - обнаружен Независимыми(т.е юнит обнаружил солдата BLUFOR в данном триггере). Логично что в триггере должны быть как те и другие юниты(Кто-то же должен их обнаружить)
EF8E97514AC4F169ACB9C5C1402371C73EAC7FC0
Наименование
Значение
Тип
Пропустить точку
Активация
BLUFOR
Тип активации
Обнаружен независимыми
Создаем группу бомжей
FD06EBBA36493E33FA327D1560CC9A26B52917FC
И указываем у них(ЕСЛИ связаны с техникой!(Т.е приедут на ней)) 4 маршрутные точки:
1 Точка - ОСТАНОВИТЬСЯ - к ней мы прикрепляем триггер через "Задать активацию точки"
2 Точка - СЕСТЬ - юниты войдут в технику после активации триггера(пока триггер не активен, они будут стоять на 1 точке)
3 Точка - ВЫЙТИ - т.е любое место где вам угодно чтобы юниты высадились
4 Точка - НАЙТИ И УНИЧТОЖИТЬ - либо если что-то далеко то ПЕРЕМЕЩЕНИЕ, а потом НАЙТИ И УНИЧТОЖИТЬ.

 
Засада
Создаем группу ботов - поведение и положение тела указываем следующие:
8A9FD6197D323730FB4F4611C90B21C5391B91B7
Наименование
Значение
Режим боя
Не стрелять, даже если не стреляют
Поведение
Скрытно либо Беспечно
Боевой порядок
Любой
Скоростной режим
Любой
Положение юнита
Лежа либо сидя

Создаем модуль - "Установить режим" и делаем в нем следующее:
4D0A6E5BE94DEDE9110F4681B143DF4D79D6E0C8
Наименование
Значение
Применить
Группы
Режим боя
Открыть огонь
Поведение
Бой
Позиция
Пригнуться либо встать
Создаем триггер - любой который нравится, а там указываем кто его активирует!
И теперь самое простое: синхронизировать между собой это все - группы ботов с модулем "Установить режим" - а модуль с триггером.
Итого что имеем - активатор делает активацию триггера, и боты выходят из пассивного режима в боевой.
 
Контроль и атака
от Vivian
Заставляет бота целиться в заданную цель
unit1 doTarget unit2;
Заставляет выбрать оружие
unit1 fireAtTarget [unit2, "wea" ]
wea это код оружия
Заставляет стрелять по выбранной цели
unit1 doFire unit2;
 
Движение юнита в бою
Не двигаться
doStop this; - бот останется на месте
Альтернатива.
call{this disableAI "move";} - бот останется на месте и НЕ будет поворачиваться (только 40 градусный сектор перед ним)
Альтернатива.
this DisableAi "PATH" - бот останется на месте и будет поворачиваться на 360 градусов
 
Задать скорость юниту
Имя
Значение
бег
this forcespeed 8;
трусцой
this forcespeed 4;
ходьба
this forcespeed 2;
 
Задать скорость для транспорта
jeep setCruiseControl [скорость, true/false];
jeep - имя переменной транспорта
Имя
Значение
True
транспорт сам будет поддерживать заданную скорость, если водитель не будет жать тормоз/назад (можно увеличивать газ и превысить заданный минимум).
False
транспорт получит максимальное значение скорости и не сможет превысит его независимо, от тормоза/газа который прожимает водитель.
 
Задать высоту полёта
MyHeli FlyInHeight 100;
(MyHeli - имя переменной) (100 - высота(Пример для вертолета:Сначала идет подъем на нужную высоту, а только потом движение))
Либо задаем напрямую через this
 
Принудительная посадка вертолета
от Dominion1859
Скрипт, который заставляет вертолет сразу садиться, а не кружить над посадочной площадкой до бесконечности
  • Триггер
  • Landing.sqf
 
Landing.sqf
params ["_heli", "_helipad", ["_mode", "LAND"]]; // _heli - имя вертолета // _heipad - имя посадочной площадки (желательно невидимой) // _mode - String. Режимы посадки. Доступны "LAND", "GET IN", "GET OUT". По-умолчанию "LAND". _heli move getPosATL _helipad; sleep 3; while { alive _heli && not unitReady _heli } do{ sleep 1;}; if (alive _heli) then{ _heli land _mode;};

Активация где угодно: [_heli, helipad, "LAND"] execVM "Landing.sqf"
 
Запрещает юниту отступать
this allowfleeing 0;
если 1 - разрешает
 
Стрельба по объектам
strelok1 doSuppressiveFire (getposASL target1);
strelok1 - стрелок
target1 - имя переменной(цель)

Альтернатива
s doTarget t; s doSuppressiveFire t;

Альтернатива
от Dominion1859
Отменяет приказ на движение и заставляет юнит начать стрелять.
params ["_target", "_shooter", ["_infinite", false], ["_ammomode", false]]; // _target - объект-цель. Можно сделать невидимым // _shooter - тот, кто будет стрелять. Можно указать несколько юнитов (как массив), но только если они входят в одну группу // _infinte - true или false. Если true, то стрельба будет вестись до исчерпания боезапаса. По-умолчанию false. // _ammomode - true или false. Если true, то боезапас у стрелка станет бесконечным. _i = 1; _target2 = getPosASL _target; if (_infinite) then { for "_i" from 1 to 10 do { _shooter doSuppressiveFire _target2; sleep 1; _i = 1; if (_ammomode) then {_shooter addEventHandler ["reloaded", {_shooter setVehicleAmmo 1}]}; }; } else { _shooter doSuppressiveFire _target2; if (_ammomode) then {_shooter addEventHandler ["reloaded", {_shooter setVehicleAmmo 1}]} }
 
 
Поведение ботов ч2
Подавляющий огонь
от Dominion1859
Боевая машина начинает стрелять по цели, пока цель либо техника(сам стрелок) не будет уничтожена.
  • Триггер
  • Firemis.sqf
Пример в триггере
[BTR, Tar, currentMuzzle (gunner (BTR)), 60, true] execVM "Firemis.sqf"

 
Firemis.sqf
params ["_shooter", "_target", "_muzzle", ["_RPM", 60], ["_infinite", false]]; // _shooter - имя техники, который будет стрелять. // _target - имя цели. Или AGL-координаты цели // _muzzle - класснейм ствола. Также можно использовать currentMuzzle (gunner (BTR)) // _RPM - число. Кол-во выстрелов в минуту. По-умолчанию 60. //_infinite - true или false. Если true, то боезапас у техники станет бесконечным. По-умолчанию false. _i = 0; _RPM = 60/_RPM; for "_i" from 0 to 2 do { _cel = _target call BIS_fnc_position; gunner _shooter lookAt _cel; [_shooter, _muzzle] call BIS_fnc_fire; sleep _RPM; if (_infinite) then {_shooter setVehicleAmmo 1}; hint str _i; _i = _i-1; if (!alive _target) exitWith {}; // Условие на прекращение стрельбы. По-умолчанию это условие смерти цели, но можно вписать что угодно, лишь бы было true. };
Если заменить lookAt на doWatch, то скрипт будет работать и на пехоту тоже. Правда, пехтура тогда будет в землю стрелять, а не в цель.
 
Подавляющий огонь.Альтернатива
Можно прямо при вызове скрипта писать условие на прекращение стрельбы
Пример в триггере
[BTR, Tar, currentMuzzle (gunner (BTR)), 60, true, "!alive BTRD"] execVM "Firemis.sqf"

 
Firemis.sqf
params ["_shooter", "_target", "_muzzle", ["_RPM", 60], ["_infinite", false], ["_condition", "!alive _target"]]; // _shooter - имя техники, который будет стрелять. // _target - имя цели. Или AGL-координаты цели // _muzzle - класснейм ствола. Также можно использовать currentMuzzle (gunner (BTR)) // _RPM - число. Кол-во выстрелов в минуту. По-умолчанию 60. // _infinite - true или false. Если true, то боезапас у техники станет бесконечным. По-умолчанию false. // _condition - строка. Условие, при котором прекратится стрельба. По-умолчанию "!alive _target" _RPM = 60/_RPM; _condition = compile _condition; for "_i" from 0 to 2 do { _cel = _target call BIS_fnc_position; gunner _shooter lookAt _cel; [_shooter, _muzzle] call BIS_fnc_fire; sleep _RPM; _i = _i - 1; if (_infinite) then {_shooter setVehicleAmmo 1}; if (call _condition) exitWith {}; };
 
 
Полезные ссылки
?&imh=88&ima=fit&impolicy=Letterbox&imco

?&imh=88&ima=fit&impolicy=Letterbox&imco

Либо это(Не рекомендую использовать Ахилес и Зевс одновременно, функции они выполняют одинаковые, а некоторые панели будут только мешать(будут накладываться друг на друга))
?&imh=88&ima=fit&impolicy=Letterbox&imco

Дополнение к Ахилесу либо к Зевсу
?&imh=88&ima=fit&impolicy=Letterbox&imco

Мод добавляющий скрытые предметы
?&imh=88&ima=fit&impolicy=Letterbox&imco

Для анимаций
?&imh=88&ima=fit&impolicy=Letterbox&imco  
 
 
Полезные модули
Простые модули
Закрыть карту
Модуль позволяет закрасить ненужные участки карты темным цветом. Размер можно настроить в трансформации, либо нажать клавишу "5" предварительно нажав на модуль.
 
Скрыть объекты ландшафта
Ну тут все логично, скрывает не нужные объекты - редактируется так же.
 
Животные
Существует 2 модуля - один из них более редактируемый(там можно настроить радиус размещения в районе)
 
Показать\скрыть объект
Одна подфункция скрывает объекты, другая показывает.
 
Постобработка
Крутая вещь, можно накладывать другой тон атмосфере
 
Ускорение времени
Устанавливает с какой скоростью идет время на сценарии
Диапазон 0.1 ... 120
 
Пропустить время
 
Комбинация модулей
Вызов поддержки
D5BF902918BC166FE761F2227B22F45B70AAA869Обязательно синхронизируем между собой!
-Вроде перестает работать если человек умерает(для сетевых режимов с воскрешением)
466CC371B20FE708A8BD2AFCF87CDACEAF1EC548




 
Сектор
  • Создаем модуль Сектор
Далее переходим к логическим элементам. Стороны > Выбираем стороны
7EF3A17AACC7BA5909BDF63F7A2ACD50EF5ACDE5
Например OPFOR и BLUFOR
Далее сам сектор. Настраивайте под свой вкус и цвет
Мой пример
CE9BF386EB0F5A0C5CF69CA09A4B79614DA9880A
Обязательно синхронизируйте между собой! Два элемента к сектору!
 
Управление группами
  • Создаем модуль "Управление группами - командир" и "Управление группами - подчиненный"
Синхронизируем между собой их
03AE58525D2D2F9594711BD36F578CDF0EABE004Далее Синхронизируем с условным командиром (игрок) модуль командира и синхронизируем модуль подчиненных с нпс\техникой\группами.
Каждый модуль подчиненных идет на свою группу\нпс\технику.
И все. Заходим на игровой слот и жмем сочетание клавиш CTRL + SPACE
Ниже появляются группы в моем случае это танк и группа пехоты
DC4ABA7371A62F8D87C4BA8820BD3EA4892B888AЦифра соответствует клавишам F1...F10, но так же можно выбирать группы через мышку. Далее просто жмем на нужную группу и даем ей задачу.Управлять можно и через карту (Будет показан количественный процент группы)
 
Виртуальный Зевс
Практически ничем не отличается от телесного, но как по мне удобнее этот вариант
  • Создаем модуль Мастер игры
  • Переходим в панель Логические элементы - Виртуальные объекты - создаем любого Зевса

Ставим обоих и прописываем имя переменной у логики и владельца у модуля
Плюсы
Можно подслушивать разговоры игроков и так же говорить по рации (TaskForceRadio)
Минусы
Взаимодействие с триггерами, а именно - если у вас есть триггеры где используется условие Любой игрок - Зевс тоже игрок - соответственно он может задеть триггер
 
Ограничение по зоне
  • Создаем триггер
  • Создаем модуль "Ограничение по зоне"
Триггер > Повторяемый
Модуль настраиваем под себя.
Применяем для игровых групп / юнита
Инвертированная граница: Нет > работает если вне триггера; Да > работает если в триггере.
Предупреждение: можно написать что будет предупреждением. Я писал так hint "Вы покидаете территорию сценария. Вас поглотит пустошь."
Санкции: по умолчанию это спаун мины под ногами. Я же пишу так _this setdamage 1;
Синхронизируем. Триггер > модуль > игроки / группы
 
 
Погода
Туман
time setFog fog
time - переход к новому значению(туману)
fog - плотность тумана. Диапазон 0...1
Пример
15 setFog 0.5;
Горный туман, начинается с 70 м ASL и сгущается тем больше, чем выше вы поднимаетесь:
0 setFog [1, -1, 70];
Долина тумана, начинается с 60 м ASL и сгущается больше, чем ниже вы спускаетесь:
0 setFog [1, 1, 60];
Туман на воде:
0 setFog [1, 1, 0];
 
Убираем траву
В инициализации газонокосилки пишем следующее:
setTerrainGrid 50;
 
 
Постобработка
Здесь буду собирать что-то вроде каталога, чтобы не тратить свое время на поиски по интернету и использования модов.
Init.sqf
 
"Ближний восток, сухость, песчаная буря"
590852E5ACC828DF4D19EE96C70F8154F0223875
[] spawn { grain_sand = 0; while {grain_sand<2} do { effect_screen = ppEffectCreate ["FilmGrain", 2000]; effect_screen ppEffectEnable true; effect_screen ppEffectAdjust [0.1,0.1,grain_sand,0.1,0.1,true]; effect_screen ppEffectCommit 0; grain_sand = grain_sand + 0.1; sleep 0.5; }; }; [] spawn { sleep 5; col_fct =1; while {col_fct>0.86} do { "colorCorrections" ppEffectAdjust[col_fct, 1, 0.01, [-0.14, 0.17, 0.33, col_fct-1],[col_fct, -0.4, col_fct, col_fct],[-0.57, col_fct, -1.2, col_fct]]; "colorCorrections" ppEffectCommit 0; "colorCorrections" ppEffectEnable true; col_fct = col_fct-0.001; sleep 0.1; }; };
 
"Реализм"
BEE01CF95E47DE6F2F560367CAD9664ED086DA50
"ColorCorrections" ppEffectEnable true; "ColorCorrections" ppEffectAdjust [0.88, 0.88, 0, [0.2, 0.29, 0.4, -0.22], [1, 1, 1, 1.3], [0.15, 0.09, 0.09, 0.0]]; "ColorCorrections" ppEffectCommit 0;
 
"Постапокалипсис"
34E44D9B1E8D5D8708355E8558161565E087AC17
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 0.9, -0.002, [0.0, 0.0, 0.0, 0.0], [1.0, 0.6, 0.4, 0.6], [0.199, 0.587, 0.114, 0.0]]; "colorCorrections" ppEffectCommit 0;
 
"Ночной охотник"
72B810EBDF6EDBBAD62D0B395B187A99AC44BEF5
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1.1, 0.0, [0.0, 0.0, 0.0, 0.0], [1.0,0.7, 0.6, 0.60], [0.200, 0.600, 0.100, 0.0]]; "colorCorrections" ppEffectCommit 0;
 
"Золотая осень"
DE02610213FB0E2750672893EC233F367411B1E8
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1, 0, [0.0, 0.0, 0.0, 0.0], [1.8, 1.8, 0.3, 0.7], [0.199, 0.587, 0.114, 0.0]]; "colorCorrections" ppEffectCommit 0;
 
"Африка"
2C43E818811BBFECA535BE7A688EC81D275C3175
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1.3, 0.001, [-0.11, -0.65, -0.76, 0.015],[-5, -1.74, 0.09, 0.86],[-1.14, -0.73, 1.14, -0.09]]; "colorCorrections" ppEffectCommit 0;
 
"Афган"
5EDE610C770B8E51149D627906C1DF7B0A0FB2E8
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [0.9, 0.9, 0, [0, 0.1, 0.25, -0.14], [1, 1, 1, 1.26], [0.15, 0.09, 0.09, 0.0]]; "colorCorrections" ppEffectCommit 0;
 
"Ближний восток v2"
A1433A5A4D52FBA40EACE759C21AC58692625030
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [0.9, 1, 0, [0.1, 0.1, 0.1, -0.1], [1, 1, 0.8, 0.528], [1, 0.2, 0, 0]]; "colorCorrections" ppEffectCommit 0;
 
"Коричневый"
D2836C09671AE762D272AAEC95C24C5053738DCE
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1,1,0,[0.1,0.2,0.3,-0.3],[1,1,1,0.5],[0.5,0.2,0,1]]; "colorCorrections" ppEffectCommit 0;
 
"Серый"
F727660D768FD03BA071679A474892733B27D039
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1.0, 1.0, 0.0,[1.0, 1.0, 1.0, 0.0],[1.0, 1.0, 0.9, 0.35],[0.3,0.3,0.3,-0.1]]; "colorCorrections" ppEffectCommit 0;
 
"Холод, два варианта"
B2A0A78813C3FC9939910598AA802CC1AF0EB622
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1.0, 1.0, 0.0,[0.2, 0.2, 1.0, 0.0],[0.4, 0.75, 1.0, 0.60],[0.5,0.3,1.0,-0.1]]; "colorCorrections" ppEffectCommit 0;
19AB0EA1EE738CF304D55B5F2B25449A5E659A86
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1, 0, [0.0, 0.0, 0.0, 0.0], [0.6, 1.4, 0.6, 0.7], [0.199, 0.587, 0.114, 0.0]]; "colorCorrections" ppEffectCommit 0;
 
"Зимний голубой и белый"
AE23068B951F46C07D12781539669251EEB7D729
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1.1, 1.3, 0.0, [0.5, 0.5, 0.1, -0.1], [0.4, 0.75, 1.0, 0.60], [0.5,0.3,1.0,-0.1]]; "colorCorrections" ppEffectCommit 0;
721A0123F6D4231ABAEB78EE610B85B46C741798
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1, 0, [0.31, 0.31, 1.0, 0.1], [0.85, 0.85, 0.92, 0.48], [1 , 1, 1, 0.03]]; "colorCorrections" ppEffectCommit 0;
 
"Перенасыщение"
A28C0A4AB9B9AC6D70AE940D922787923C256119
"colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1.01, 1.18, -0.04, [1.0, 1.4, 0.8, -0.04], [0.55, 0.55, 0.72, 1.35], [0.699, 1.787, 0.314, 20.03]]; "colorCorrections" ppEffectCommit 0;
 
 
Вызов поддержки
Артобстрел
от Dominion1859
  • Триггер
  • Artobstrel.sqf

Пример в триггере
[[1497.998, 6609.139, 150], 15, 50, 15, "BO_GBU12_LGB", [1,2]] execVM "Artobstrel.sqf";


Объяснение
[[X, Y, Z], радиус, высота, количество, "BO_GBU12_LGB", [1,5]] execVM "Artobstrel.sqf";


[X, Y, Z] - координаты цели
радиус - разброс спавна, по-умолчанию 100 метров
высота - высота спавна снарядов, по-умолчанию 200 метров
количество - количество выпускаемых снарядов (по-умолчанию 5)
BO_GBU12_LGB - класс снаряда (технически можно использовать любой объект), по-умолчанию "стреляем" авиабомбой;
1,5 - минимальная и максимальная задержка в спавне снарядов, по-умолчанию задержка от 1 до 5 секунд;
 
Artobstrel.sqf
params ["_target",["_rad", 100], ["_alt", 200], ["_colvo", 5], ["_snar", "BO_GBU12_LGB"], ["_time", [1,5]]]; _i = 1; for "_i" from 1 to _colvo do { _result = _target vectorAdd [random _rad, random _rad, _alt]; _result2 = _result vectorDiff [random _rad, random _rad]; // Метод задания точки падения ублюдский, зато прост как пробка _timeMin = _time select 0; _timeMax = _time select 1; _timeRes = _timeMax - _timeMin; sleep (_timeMin + random _timeRes); _bomb = _snar createVehicle _result2; _bomb setVectorDirAndUp [[0, 0, -1], [0, 1, 0]]; // Спавн снаряда "головой" вниз _bomb setVelocity [0, 0, -200]; // Даем саряду пинка. При желании таким образом можно сделать снос в сторону }
 
Пуск крылатой ракеты
от Dominion1859
  • Триггер
  • CruiseMissileLaunch.sqf

Пример в триггере
[Tonk, VLS, 3, 300, false, false, 35] execVM "CruiseMissileLaunch.sqf"


Объяснение
Tonk - название цели, в которую будет запущена ракета
VLS - название конкретной установки VLS
"3" - количество выстрелов, которое сделает VLS. По-умолчанию 1. Максимальный боезапас установки VLS - 36 ракет. 18 обычных и 18 кассетных.
"300" - время, которое ракета будет знать, где находится цель. Если время выйдет до того, как ракета поразит цель - она укнется в землю. По-умолчанию 1000 секунд.
"false" - true или false. Если true, то следующая ракета будет запущена только после попадания предыдущей По-умолчанию true.
"false" - true или false. Если true, то боезапас установки VLS не закончится (логично).
"35" - задержка между запусками. Не может быть меньше 20 секунд (время перезарядки).
 
CruiseMissileLaunch.sqf
params ["_target", "_ust", ["_salvo", 1], ["_time", 1000], ["_wait", true], ["_infinite", true], ["_delay", 30]]; _i = 1; for "_i" from 1 to _salvo do { west reportRemoteTarget [_target, _time]; // ВСЯ сторона BLUFOR видит цель на радаре _target confirmSensorTarget [west, true]; // ВСЯ сторона BLUFOR узнает о новообноруженном объекте, как о цели _ust fireAtTarget [_target, "weapon_vls_01"]; if (_wait == true) then // Если выставлено условие ожидания, то следующий запуск ракеты произойдет только после погибели предыдущей { _rocket = nearestObject [_ust, "ammo_Missile_Cruise_01_Cluster"]; waitUntil {not alive _rocket}; } else { sleep _delay; // Эта часть срабатывает, если не выставлено условие ожидания }; if (not alive _target) exitWith {hint "Target destroyed"}; // Если цель уничтожена, VLS прекратит стрельбу. Добавлял hint для отладки. Можно ее обыграть повесив на ее место реплику, или вообще удалить if (_infinite == true) then {_ust setVehicleAmmo 1;} else {}; // Восстанавливает боекомплект ракетной установки };
 
Пуск крылатой ракеты v.2
от Dominion1859
  • Триггер
  • CruiseMissileLaunch.sqf

Пример в триггере
[Tonk, VLS, 3, 300, false, 35, 1] execVM "CruiseMissileLaunch.sqf"

 
CruiseMissileLaunch.sqf
params ["_target", "_ust", ["_salvo", 1], ["_time", 1000], ["_infinite", true], ["_delay", 16], ["_wait", 0]]; // _target - название цели, или координаты // _ust - название установки VLS // _salvo - количество выстрелов, которое сделает VLS. По-умолчанию 1. Максимальный боезапас установки VLS - 36 ракет. 18 обычных и 18 кассетных. // _time - время, которое ракета будет знать, где находится цель. Если время выйдет до того, как ракета поразит цель - она укнется в землю. По-умолчанию 1000 секунд. // _infinite - true или false. Если true, то боезапас установки VLS не закончится (логично) // _delay - задержка между запусками. Не может быть меньше 16 секунд (время перезарядки) // _wait - 0, 1 или 2. 0 - ракета будет выпущена после окончания _delay (по-умолчанию). 1 - ракета будет выпущена после "смерти" предыдущей. 2 - ракета будет выпущена после "смерти" предыдущей + _delay.
 
  • Примечание 1: Стрельба по объектам возможна если это юниты, техника (включая турели), и другие объекты, кроме тех, что находятся в группе "Структуры" (при игре без модов)
  • Примечание 2: Почти все объекты из модов (почти!) могут быть целью сами по себе. Объекты из CUP и Q&T Expansion (даже деревья и здания) спокойно работают мишенями.
  • Примечание 3: Если хочется использовать ракеты в качестве поддержки, то в _target прописывать cursorObject или cursorTarget.
  • Примечание 4: Для стрельбы кластерными ракетами нужно где-нибудь прописать турели смену магазина (перезарядка будет долгой, очень долгой)
 
CruiseMissileLaunch.sqf
_i = 1; // Блок удара по координатам. По ним обстрел можно вести хоть до посинения if (_target isEqualType []) then { // Создается череп Йорика, на который навешивается неуязвимость, невидимость и неподвижность _skull = createVehicle ["Land_HumanSkull_F", _target, [], 0, "NONE"]; _skull allowDamage false; _skull enableSimulation false; _skull hideObject true; // Собственно запуск ракет for "_i" from 1 to _salvo do { west reportRemoteTarget [_skull, _time]; // ВСЯ сторона BLUFOR видит цель на радаре _skull confirmSensorTarget [west, true]; // ВСЯ сторона BLUFOR узнает о новообноруженном объекте, как о цели _ust fireAtTarget [_skull, "weapon_vls_01"]; if (_infinite) then {_ust setVehicleAmmo 1}; // Восстановление боекомплекта установки // Блок слежения за полетом ракеты switch (_wait) do { case 0: {sleep _delay;}; case 1: { _snar = nearestObjects [_ust, ["ammo_Missile_Cruise_01", "ammo_Missile_Cruise_01_Cluster"], 10]; _rocket = _snar select 0; waitUntil {sleep 1; !alive _rocket}; // Sleep добавлен, дабы не слишком сильно нагружать систему. Паузу можно сделать меньше (не стоит ставить меньше 0.1) }; case 2: { _snar = nearestObjects [_ust, ["ammo_Missile_Cruise_01", "ammo_Missile_Cruise_01_Cluster"], 10]; _rocket = _snar select 0; waitUntil {sleep 1; !alive _rocket}; sleep _delay; }; }; }; } // Блок удара по объекту else { for "_i" from 1 to _salvo do { west reportRemoteTarget [_target, _time]; _target confirmSensorTarget [west, true]; _ust fireAtTarget [_target, "weapon_vls_01"]; if (_infinite) then {_ust setVehicleAmmo 1}; switch (_wait) do { case 0: {sleep _delay;}; case 1: { _snar = nearestObjects [_ust, ["ammo_Missile_Cruise_01", "ammo_Missile_Cruise_01_Cluster"], 10]; _rocket = _snar select 0; waitUntil {sleep 1; !alive _rocket}; }; case 2: { _snar = nearestObjects [_ust, ["ammo_Missile_Cruise_01", "ammo_Missile_Cruise_01_Cluster"], 10]; _rocket = _snar select 0; waitUntil {sleep 1; !alive _rocket}; sleep _delay; }; }; if (!alive _target) exitWith {}; // Прекращение стрельбы в случае уничтожения цели. Необязательная строчка
 
 
 
Вызов поддержки ч2
Артобстрел v.2
от Dominion1859
Добавлено условие на досрочное окончание
  • Триггер
  • Artobstrel.sqf
 
Artobstrel.sqf
// Скрипт артобстрела с заданными параметрами params ["_target", ["_rad", 100], ["_colvo", 5], ["_snar", "BO_GBU12_LGB"], ["_timer", [1,5]], ["_alt", 200], ["_cond", "false"], ["_update", false]]; // _target - массив или имя юнита/предмета, точка центра зоны спавна снарядов; // _rad - разброс спавна, по-умолчанию 100 метров; // _colvo - количество выпускаемых снарядов (по-умолчанию 5); // _snar - класс снаряда (технически можно использовать любой объект), по-умолчанию "стреляем" авиабомбой; // _timer - массив - минимальная и максимальная задержка в спавне снарядов, по-умолчанию задержка от 1 до 5 секунд; // _alt - высота спавна снарядов, по-умолчанию 200 метров; // _cond - строка. Условие, при котором артобстрел прекратится. По-умолчанию "false"; // _update - true или false. Если true, то зона обстрела будет перемещаться вслед за целью (если в _target указан движущийся объект); // Активация: [[50, 100, 150], 150, 15, "Rocket_04_HE_F", [1,2], 50 true] execVM "Artobstrel.sqf"; // Примечание: если _colvo приравнять к нулю, то обстрел будет вестись бесконечно _pos = _target call BIS_fnc_position; _cond = compile _cond; _timeMin = _timer select 0; _timeMax = _timer select 1; _timeRes = abs _timeMax - _timeMin; // Костыль, который позволяет писать в _time (почти) любые числа в любом порядке. if (_timeRes == 0) then {_timeMin = 1}; // Костыль, делающий минимальную задержку между спавном в 1 секунду. Если не нужно, то эту строчку можно (почти) смело удалить if (_colvo == 0) then { while {true} do { if (_update) then {_pos = _target call BIS_fnc_position}; // Обновление точки спавна снарядов _angle = random 360; // Определение азимута _distance = random _rad * sqrt random 1; // Определение дальности с выравниванием _result = _pos getPos [_distance, _angle]; // Вычисление координат точки _result = _result vectorAdd [0,0,_alt]; sleep (_timeMin + random _timeRes); _bomb = _snar createVehicle _result; _bomb setVectorDirAndUp [[0, 0, -1], [0, 1, 0]]; // Спавн снаряда "головой" вниз _bomb setVelocity [0, 0, -200]; // Даем саряду пинка. При желании таким образом можно сделать снос в сторону if (call _condition) exitWith {}; // Выход из цикла при выполнении условия }; } else { for "_i" from 1 to _colvo do { if (_update) then {_pos = _target call BIS_fnc_position}; // Обновление точки спавна снарядов _angle = random 360; // Определение азимута _distance = random _rad * sqrt random 1; // Определение дальности с выравниванием _result = _pos getPos [_distance, _angle]; // Вычисление координат точки _result = _result vectorAdd [0,0,_alt]; sleep (_timeMin + random _timeRes); _bomb = _snar createVehicle _result; _bomb setVectorDirAndUp [[0, 0, -1], [0, 1, 0]]; // Спавн снаряда "головой" вниз _bomb setVelocity [0, 0, -200]; // Даем саряду пинка. При желании таким образом можно сделать снос в сторону if (call _condition) exitWith {}; // Выход из цикла при выполнении условия }; };
 
Пуск ракеты по лазеру
от Dominion1859
  • Триггер
  • CruiseMissileGuided.sqf
Пример в триггере
[Spotter, VLS, false] execVM "CruiseMissileGuided.sqf";
  • Примечание 1: Скрипт строго одноразовый. То есть для возможности повторного пуска ракеты нужно запустить его еще раз
  • Примечание 2: Минимальное время между запусками - 16 секунд. Если активировать скрипт еще раз до завершения перезарядки, то ничего не произойдет
В теории screenToWorld можно заменить на getPosASL laserTarget
CruiseMissileGuided.sqf
params ["_boyz", "_ust", ["_infinite", true]]; // _boyz - имя персонажа-игрока (ИИ эту вещь лучше не давать), который будет наводчиком // _ust - имя установки, которая будет запускать ракеты // _infnite - делает бесконечным боезапас ракет для установки _i = 0; waitUntil {sleep 1; !(isNull laserTarget _boyz)}; // Ракета не будет запущена до тех пор, пока _boyz не включит лазерный целеуказатель _pos = screenToWorld [0.5, 0.5]; // Заносятся координаты поверхности (или объекта), на который смотрит _boyz _tar = "Land_HumanSkull_F" createVehicle _pos; // Создается череп Йорика, которому прописана невидимость и неуязвимость _tar hideObject true; _tar allowDamage false; west reportRemoteTarget [_tar, 1000]; // На череп наводится ракета _ust fireAtTarget [_tar, "weapon_vls_01"]; if (_infinite) then {_ust setVehicleAmmo 1}; // Восстановление боекомплекта // Отслеживание полета ракеты и проверка на то, не выключил ли _boyz целеуказатель. Покуда целеуказатель включен, череп будет следовать за лучом лазера. _sna = nearestObjects [_ust, ["ammo_Missile_Cruise_01", "ammo_Missile_Cruise_01_Cluster"], 10]; _mis = _sna select 0; while {alive _mis and !(isNull laserTarget _boyz)} do { sleep 0.05; // Тик можно делать еще меньше, но это ударит по производительности _pos = getPosASL laserTarget _boyz; _tar setPos _pos; } deleteVehicle _tar; // Удаление черепа
 
Сброс ящиков/турелей/транспорта с парашютом
от Dominion1859
  • Триггер
  • Paradrop.sqf

Пример в триггере
[getPos player, "B_MRAP_01_F", 50, 0, [["arifle_MX_SW_F", 5], ["B_Carryall_ocamo", 5]], true] execVM "Paradrop.sqf";

 
Paradrop.sqf
params ["_pos", "_veh", ["_alt", 100], ["_rad", 0], ["_cargo", []], ["_invul", false]]; // _pos - координаты точки, над которой произойдет спавн, либо имя объекта; // _veh - класснейм сбрасываемого объекта; // _alt - число. Определяет высоту спавна; // _rad - число. Определяет радиус спавна; // _cargo - массив массивов вида [класснейм_предмета, количество]. Спавнит предметы внутрь _veh; // _invul - true/false. Если true, то парашют и спавнимый предмет станут неуничтожимыми во время спуска; // Примечание 1: если пользоваться маркерами, у которых есть z-координата, то спавн произойдет именно на этой z-координате; // Примечание 2: если пользоваться _cargo, то все спавнимые по-умолчанию в инвентарь техники предметы исчезают; _pos = _pos call BIS_fnc_position; // Вычисляем координаты (так надо) _pos = _pos vectorAdd [0, 0, _alt]; // Вычисляем высоту _para = createVehicle ["B_Parachute_02_F", _pos, [], _rad, ""]; // Создаем парашют _veh = createVehicle [_veh, getPos _para, [], 0, ""]; // Создаем предмет _veh attachTo [_para, [0, 0, -1]]; // Цепляем предмет к парашюту if (_invul) then // Делаем парашют и предмет бессмертными { _veh allowDamage false; _para allowDamage false }; // Добавление предметов в инвентарь предмета if (count _cargo != 0) then { clearWeaponCargoGlobal _veh; clearMagazineCargoGlobal _veh; clearBackpackCargoGlobal _veh; clearItemCargoGlobal _veh; for "_i" from 0 to (count _cargo - 1) do { _item = _cargo select _i; // Рюкзаки приходится спавнить особо извращенным способом if (_item select 0 isKindOf "Bag_Base") then { _veh addBackpackCargoGlobal [_item select 0, _item select 1]; } else { _veh addItemCargoGlobal [_item select 0, _item select 1]; }; }; }; waitUntil {(getPos _veh select 2) < 5}; // Ждем, когда предмет окажется у земли detach _veh; // Отцепляем _para setVelocity [3,3,0.5]; // Даем парашюту пинка, чтоб на землю упал и сложился if (_invul) then // Снимаем неуязвимость { _veh allowDamage true; _para allowDamage true; };
 
 
Вызов поддержки ч3
Десант
от Dominion1859
  • Триггер
  • Paratroop.sqf

Пример в триггере
[Paragroup, "B_T_VTOL_01_infantry_F", player, 180, 500, 300, 1000] execVM "Paratroop.sqf";
Пример в ините одного из юнитов группы
[group this] execVM "Paratroop.sqf"
Paratroop.sqf
params ["_paraGr", ["_veh", "B_T_VTOL_01_infantry_F"], ["_LZ", getPos player], ["_dir", getDir player], ["_alt", 300], ["_acc", 300], ["_dis", 3000]]; // _paraGr - имя группы юнитов, которая будет сброшена с паращютом; // _veh - класснейм транспорта, который будет использован для выброски десанта; // _LZ - координаты точки посадки, либо имя объекта; // _dir - направление полета _veh; // _alt - высота полета _veh; // _acc - число. Определяет расстояние, на котором начнется десантирование. По-умолчанию 300 метров; // _dis - расстояние на котором _veh заспавнится от _LZ; // Примечание: если _acc выставлять на значения меньше 100, то выброс десанта может и не произойти; // Костыль, позволяющий указывать в _LZ имена объектов _LZ = _LZ call BIS_fnc_position; // Расчет траектории полета: точки спавна и точки, куда полетит транспорт _DirX = _dis * sin (_dir - 180); _DirY = _dis * cos (_dir - 180); _SpX = _LZ select 0; _SpY = _LZ select 1; _SpZ = _LZ select 2; _SpPos = [_SpX + _DirX, _SpY + _DirY, _SpZ + _alt]; VehWpPos = [_SpX - _DirX, _SpY - _DirY, _SpZ + _alt]; // Создание транспорта и перемещение в него десантников _veh = createVehicle [_veh, _SpPos, [], 0, "FLY"]; _veh allowDamage false; // Если не прописать транспорту неуязвимость, то он взорвется при попытке поместить в него десантников и экипаж _crew = side _paraGr createVehicleCrew _veh; _veh setDir _dir; _veh flyInHeight _alt; {_x moveInCargo _veh} forEach units _paraGr; // Создание вейпоинта для транспорта, и задание ботам поведения _WP =_crew addWaypoint [VehWpPos, 1, -1, ""]; _WP setWaypointType "MOVE"; _WP setWaypointStatements ["true", "deleteVehicle vehicle this; {deleteVehicle _x} forEach units group this"]; // По достижении конца маршрута, транспорт будет удален _crew setCurrentWaypoint _WP; _veh allowDamage true; // Снятие неуязвимости с транспорта {_x setSkill ["courage", 1]; _x allowFleeing 0;} forEach units _crew; _crew deleteGroupWhenEmpty true; // Высадка десанта при приближении к точке высадки. waitUntil {_veh distance2D _LZ < _acc}; _units = units _paraGr; for "_i" from 0 to count units _paraGr - 1 do { _boy = _units select _i; unassignVehicle _boy; _boy moveOut _veh; sleep 0.5; _para = createVehicle ["Steerable_Parachute_F", getPos _boy, [], 0, "CAN_COLLIDE"]; _boy moveInDriver _para; unassignVehicle _boy; // Включение ботам неуязвимости у земли, а то они подозрительно часто бьются или ноги ломают _boy spawn { waitUntil {getPos vehicle _this select 2 < 2}; _this allowDamage false; unassignVehicle _this; waitUntil {getPos _this select 2 == 0}; _this allowDamage true; }; };
 
 
Таймер
Обратный отсчет
Пишем в инициализации
LM_fnc_timeoutCountdown = { params []], ["_colour", "#FFFFFF", [""]] ]; private _timeout = time + _time; RscFiringDrillTime_done = false; 1 cutRsc ["RscFiringDrillTime", "PLAIN"]; while { time < _timeout } do { private _remainingTime = _timeout - time; private _timeFormat = [_remainingTime, "MM:SS.MS", true] call BIS_fnc_secondsToString; private _text = format ["<t align='left' color='%1'><img image='%2' />%3:%4<t size='0.8'>.%5</t>", _colour, "A3\Modules_F_Beta\data\FiringDrills\timer_ca", _timeFormat select 0, _timeFormat select 1, _timeFormat select 2 ]; RscFiringDrillTime_current = parseText _text; sleep 0.01; }; private _timeFormat = [0, "MM:SS.MS", true] call BIS_fnc_secondsToString; RscFiringDrillTime_current = parseText format ["<t align='left' color='%1'><img image='%2' />%3:%4<t size='0.8'>.%5</t>", _colour, "A3\Modules_F_Beta\data\FiringDrills\timer_ca", _timeFormat select 0, _timeFormat select 1, _timeFormat select 2]; sleep 4; RscFiringDrillTime_done = true; }; [10, "#FF5500"] spawn LM_fnc_timeoutCountdown;
10 - секунды, можно настраивать; #FF5500 - цвет таймера
 
(!)
Стим ворует какой-то символ, поэтому данный скрипт некорректно копируется


 
 
 
Стратегическая карта
от Usually
  • Папка scripts
  • osm.sqf

1. На предмете, на котором будет кнопка «Открыть стратегическую карту» вешаем это:
this addAction ["Открыть стратегическую карту","scripts\osm.sqf",[false],1,false,true,"","(_target distance _this) < 3"];
2. Перед тем как открыть «Стратегическая карта» , надо дать команду показать на ней места заданий, иначе ошибка. Можно сделать триггер и в "При активации" добавить это :
showAAATask = true;
showArtyTask = true;
showHeloTask = true;
3. Далее создаем 7 маркеров(в моем случае) (я выбирал пустые, чтобы их не было видно на простой карте)
Теперь вписываем в имя переменной mrk_AAA, mrk_Arty, mrk_Helo, base (откуда вы будете стартовать) это для заданий
Так же вписываем в оставшиеся 3 маркера - mrk_startAAA, mrk_startArty, mrk_startHelo это для позиций куда телепортировать игрока.
4. Теперь сам скрипт
 
osm.sqf
startAAA = { player enableSimulation false; // Отключаем симуляцию у игрока "mrk_startAAA" setMarkerSize [1,1]; // Устанавливаем размер маркера player setpos getmarkerpos "mrk_startAAA"; // Переносим игрока к маркеру mrk_startAAA player setdir 64; // Поворачиваем игрока на 64* player enableSimulation true; //Включаем симуляцию у игрока }; startArty = { player enableSimulation false; "mrk_startArty" setMarkerSize [1,1]; player setpos getmarkerpos "mrk_startArty"; player setdir 124; player enableSimulation true; }; startHelo = { player enableSimulation false; "mrk_startHelo" setMarkerSize [1,1]; player setpos getmarkerpos "mrk_startHelo"; player setdir 57; player enableSimulation true; };
Далее само задание для карты(пишем туда же)
_missionsData = []; if (showAAATask) then { _missionsData pushBack [getmarkerpos "mrk_AAA",startAAA,"Позиция зенитки","Второстепенная задача: выведите их зенитку из строя","","",1,[]] }; if (showArtyTask) then { _missionsData pushBack [getmarkerpos "mrk_Arty",startArty,"Название задания","Описание задания, при наведении мыши на него.","","",1,[]]}; if (showHeloTask) then { _missionsData pushBack [getmarkerpos "mrk_Helo",startHelo,"Украсть документы","Найдите и украдите документы","","",1,[]]};
 
disableserialization; _parentDisplay = [] call bis_fnc_displayMission; _mapCenter = getmarkerpos "base"; // На каком месте откроется карта. Если не прописать - укажет координаты 0,0,0 (левый нижний угол) _ORBAT = []; // Боевое расписание. Если надо. _markers = []; // Маркера. Если надо. _images = []; // Картинки. Если надо. _overcast = overcast; // Погода _isNight = !((dayTime > 6) && (dayTime < 20)); //Проверка ночь ли это. ХЗ зачем, не стал вникать _scale = 1.5; // Масштаб отображаемой карты (по умолчанию = 1) _simul = true; [ findDisplay 46, _mapCenter, _missionsData, _ORBAT,_markers, _images, _overcast, _isNight, _scale, _simul ] call Bis_fnc_strategicMapOpen;

В редакторе
5ACA287D5E919276137369E4A1B7EEFE4828FA29
На карте
530105C661CAB28D779B71372938BB56855EC187

 

Статью писал Lastick, взята из Стима


×
×
  • Создать...

Важная информация

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