Работа с объектом
Одно из удобных (на мой взгляд) я бы выделил взаимодействие, вызывая 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 - имя переменной машиныНапример - можно делать вот такие танки
Динамическая прорисовка объектов
Возможно повышает FPS. Полезно для сценариев которые состоят из несколько частей в одной миссии, чтобы не мешаться друг другу, либо же архитектура сценария полностью самодельна.
- Создаем триггер
- Создаем объект и сохраняем его в композиции - называем ее например Mis
В активацию
{_x enableSimulation false;_x hideObjectGlobal true;} forEach (getMissionLayerEntities "Mis" select 0);
В диактивацию
{_x enableSimulation true;_x hideObjectGlobal false;} forEach (getMissionLayerEntities "Mis" select 0);
Повторяемый. Сервер.Теперь спавним нашу композицию.
И далее просто заносим наши вновь поставленные объекты в папочку Mis
ВАЖНО! Перенос объектов в композицию происходит только в левом окне с элементами. То есть жмем на объект один раз - он выделяется(можно выделять несколько), а далее зажав ЛКМ мы его переносим.
Переносы работают криво, объяснять думаю нет смысла - сами поймете когда будете этим заниматься
Анимация движения объекта
- Создаем 4 модуля Ключ расширенной кривой
- Создаем 2 модуля Отрезок
- Создаем 2 модуля Расширенная кривая
- Тепловоз (Train)
У меня так. a1 и a1_2 и другая пара b1 и b1_2
Наименование
Значение
Время
50 и 0
Режим
EaseInOut
Тангенс
10
Поле зрения
0.75
Далее ставим 2 отрезка и 2 расширенных кривых
Синхронизируем между собой по паре (Отрезок -> кривая)
Далее делаем следующее с 2 отрезками и называем их line1 и line2
Событие у меня свое, в данном случае когда поезд начинает движение он гудит
Значение длины и скорости воспроизведения тоже подогнаны под свой вкус
Синхронизируем кривые с ключами И ОБЯЗАТЕЛЬНО с тепловозом (им.перем Train)
a1 и b1 синхронизируем с кривой которая идет на line2
a1_2 и b1_2 синхронизируем с кривой которая идет на line1
Наименование
Значение
Длина
600
Скорость
0.5
Режим
EaseInOut
В итоге должно получится что кривая соединяет 2 ключа, поезд и отрезок
- Далее, чтобы запустить движение - создаем 2 "консоли" . Одна движение в точку B, другая реверс.
Если так нужен будет поворот, снижение и повышение высот, то попробуйте просто полетать рядом с анимационной линией с зажатым шифтом. Игра вам предложит сделать там точку следующего отталкивания, а там уже легко подогнать все. Синхронизирует оно само (оно умное). Не забывайте сделать это и на реверсе!!
Выглядят они так
Обнаружение цели
от Vivian
- Создаем триггер
- Создаем "Создать задание" и синхронизируем
currentWeapon Player == "binocular" and cursorObject == VIP
VIP - имя переменной мужика
binocular - бинокль (ванильный). Чтобы заменить его - выбираем в арсенале другой бинокль и жмем CTRL+C и меняем значение бинокля.
Как только перекрестие бинокля пересекается с моделькой нужного персонажа, триггер срабатывает.
Либо альтернатива
- Создаем триггер
!(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;
№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"];
№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 имя перем;}
№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;
№7
["Пульс потерян", 2, 3, [1,0,0,1], true] spawn BIS_fnc_WLSmoothText;
№8
Выводит подсказочное сообщение справа от экрана со звуком. Для разделения сообщения на несколько строк используйте \n.hint "Чтобы убрать оружие из рук.\nВозьми рпг в руки и резко упади на землю."
Можно добавить картинку
hint parseText "<img image='ваша_картинка.paa' <img size='20' /><br/><br/><t size='1.2'>Ваш_текст.</t>";
Цветной текст
Пример <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;
Это мой вариант
Работа с картинками
Своя картинка на объекте
Ну тут все простоКидаем в папку с миссией свою картинку в формате .jpg, но желательно в paa.
Далее указываем путь к ней
Своя картинка на задании либо в "разведки" миссии
Создаем модуль "Создать задание"Пишем и делаем все как вам удобно и в описании пишем следующее:
Ваш текст(если нужно) <img image="pictuk.jpg" width="270" height="270"/>
pictuk.jpg - в моем случае это название моей пикчи в папке миссииwidth и height можно менять
Вот так выглядит у меня
Своя картинка и текст на листе, газете и прочее или интел с картинкой
В имени пишем например myLeafletsna.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;
Текст с картинкой
Делаем все как было описано раннее
Пишем:
["<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 вообще любую картинку можно впаять)
- Триггер(необязательно)
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 - имя переменной юнита
Маркер
Маркер-указатель
- Создаем сам маркер и называем его. В моем случае Paros, маркер можно брать любой.
<marker name="Paros">Ваш текст</marker>
Выглядит это вот такДо и после этого может стоять ваш текст. По нажатию на подсвеченное слово желтым, камера будет вас перемещать на маркер
Динамические маркеры
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;
Можно поменять на WHITE1 - затухание (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;
Вернуть экран обратно
["BIS_fnc_quotations_blackScreen", false] call BIS_fnc_blackIn;
Рамки как в кино
Очень рекомендую использовать с "черным экраном", который вышеВключить
[0, 20, true, true ] call BIS_fnc_cinemaBorder
Выключить
[1, 20, true, true ] call BIS_fnc_cinemaBorder
Наименование
Значение
Выкл и Вкл
1 и 0
Продолжительность
20
Звук
true и false
Блокировка первого лица
true и false
Эффект синего ПНВ
эффекты помимо синего фильтра - асе
Создаем следующие файлы в папке с миссией
- 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
Что получается
Загрузочный экран
Текст заполнения слева сверху и снизу(типа подсказки)egl_lv426flat - название вашей карты (см.название файла вашей миссии, после точки)
description.ext
class CfgWorlds { class egl_lv426flat { author = "Территория: Восточная Европа"; description = "Психиатрическая больница"; pictureMap = "ваша_картинка.jpg"; pictureShot = "ваша_картинка.jpg"; loadingTexts[] = { "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст." }; }; };
Пример
Эффект будто вас ранило
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}; }; }
Это имя - название вашей музыкиТеперь идем дальше - нам нужна сама музыка.
Создаем в папочке миссии папку и называем ее sound
И теперь кидаем туда музыку, НО.
Название должно строго соответствовать как в Description(или наоборот)
Формат файла должен быть .ogg
С этим мы закончили. Теперь в арме создаем триггер и пишем в нем playsound "название вашей музыки в Description";
Вызов музыки можно делать в зависимости, как вы приписали ее выше. 3 вариантами.
playsound "boevoirubej";
playmusic "theend";
Ob1 say3D ["music", 50];
^- последний вариант запускается через триггер и включается на объекте "Ob1".ЯВЛЯЕТСЯ ЗВУКОМ!playmusic "theend";
Ob1 say3D ["music", 50];
И все. Заходим проверяем, слушаем.
Музыка "радио"
Работает так же как выше, просто имеет другое написаниеОт Братишки
В инициализацию объекта пишем:
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 "лицо";
Узнаем тут
Или тут
https://community.bistudio.com/wiki/Arma_3_CfgIdentities
Изменение голоса у игроков
У игроков по умолчанию ЕСЛИ с модом АСЕ голос - отсутствуетВ инициализации пишется следующая команда:
this setspeaker "голос";
Узнаем тут
Индивидуальность персонажей
Выше изложен 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" это не значит что его нету, просто это означает, что оно не используется
!!!Важно - обязательно следите за расстановкой скобочек.
Можете даже покликать на них и понять какая скобка с какой связывается, если "конечной" нету, то в миссии вам скорее всего выдаст ошибку, мол на такой то линии у вас некорректно и тд.Теперь, мы молодцы поставили эти значения - что дальше?
Дальше мы создаем триггер(можете хоть на всю карту) и указываем в нем Повторение
!Пишем нашим юнитам имя переменной - например solda
В триггере пишем следующее: solda setIdentity "Pawel"; solda2 setIdentity "Wel";
И все. Проверяем, умераем - смотрим, что все работает прекрасно и радуемся что теперь в нашем африканском сценарии не белые воюют друзья,а темные.
Анимации
Лично я использую обе команды
this switchMove "анимация_01";
^- используется имя переменной
0 = this spawn{_this switchMove "анимация_01";};
Одну на юните, а другую в триггере.
^- используется имя переменной
0 = this spawn{_this switchMove "анимация_01";};
POLPOX (для удобств)
Пример
this switchMove "Acts_AidlPercMstpSnonWnonDnon_warmup_2_loop";
Анимация - смерть (для ботов)
- Убираем хп
- Выключаем моделирование
Анимация - брифинг либо введение
- Триггер
- POLPOX (для удобств)
Создаем 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
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
Примечание: Если для звука нужны субтитры, лучше их сразу прописать в 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
Служит базой для:
Скриптов;
Воспроизведения звука, голоса, музыки, окружения, слоев интерфейса;
Окончания или поражения для сценария;
И прочего..
Активатором может быть как любой объект(проп) так и человек, игрок, ИИ, группа людей(задать владельца триггера)
Создание задания
"Создать дневниковую запись" - означает Инструктаж, боевая сводка и прочая хрень описывающая действия в которые попали бойцы
"Создать задание" - логично задание,в него входит описание задания и название. Единица, указанная в триггере описанная выше - активирует его и задание будет не выполнено вплоть до того пока не сделаешь условия другого триггера (Да, их нужно минимум 2).
Например: Тебе нужно взорвать дом.
Ставишь 2 триггера - 1 на месте активации, другой на месте выполнения задания.
1 - триггер создает задание, а условия выполнения задания(2 триггера) это отсутствия данного объекта.(Т.е после ПОВРЕЖДЕНИЯ или УНИЧТОЖЕНИЯ объекта задание будет выполнено)
"Установить назначения задания и Установить описание задания" - не знаю зачем это существует, расширенная функция
Создание и состояние задания нужно синхронизовывать между собой, чтобы оно РАБОТАЛО.
Если нужно чтобы триггер активировался не сразу - делаем следующее:
Значение идет в секундах, в данном случае через 10 секунд активируется триггер.
Так можно строить целые разговоры из нескольких триггеров и текста.
Идентификатор род.задачи ставим имя - task1
Номер задания - task1
Вторая и третья как задачи и так далее
Идентификатор род.задачи ставим имя - task1
Номер задания - task2 и task3
Для того чтобы сделать вторую главную задачу, делаем тоже самое, только просто меняем имя (task1). Аналогично.
Соответственно к примеру
!alive name
Условие активируется когда объект \ юнит уничтожен - обратное значение alive name
Можно так же задавать условия чтобы активация была засчитана при уничтожении нескольких объектов \ юнитов.
Игрок в зоне триггера
player in thislist
Игрок сел в машину (jeep)
player in jeep
У игрока винтовка в руках
player hasWeapon "класс оружия"
Если необходимо, чтобы триггер был активен сразу то.
call{true}
Рекомендую для сцен в начале сценария, текста, выдачи заданий, либо для анимаций, например, смерть бота и тд.
Переходим в папку с миссией(там должна быть ваша миссия - mission.sqm) и в этой папочке создаем Текстовой документ и теперь переименовываем его. Пишем - description.ext - файл становится "белым", либо нет. Теперь открываем его через Notepad++ или любую другую программу которая в принципе выполняет такую же роль(можете даже вообще не парится и писать все в Текстовом документе и только потом прописать description.ext)
Вот ссылка на Description
https://community.bistudio.com/wiki/Description.ext
Скриптов;
Воспроизведения звука, голоса, музыки, окружения, слоев интерфейса;
Окончания или поражения для сценария;
И прочего..
Активатором может быть как любой объект(проп) так и человек, игрок, ИИ, группа людей(задать владельца триггера)
С объектами на сценарии можно взаимодействовать как на прямую через команду "this" так и через имя переменной
- второй в основном используется если подключается триггер для активации.Создание задания
"Создать дневниковую запись" - означает Инструктаж, боевая сводка и прочая хрень описывающая действия в которые попали бойцы
"Создать задание" - логично задание,в него входит описание задания и название. Единица, указанная в триггере описанная выше - активирует его и задание будет не выполнено вплоть до того пока не сделаешь условия другого триггера (Да, их нужно минимум 2).
Например: Тебе нужно взорвать дом.
Ставишь 2 триггера - 1 на месте активации, другой на месте выполнения задания.
1 - триггер создает задание, а условия выполнения задания(2 триггера) это отсутствия данного объекта.(Т.е после ПОВРЕЖДЕНИЯ или УНИЧТОЖЕНИЯ объекта задание будет выполнено)
"Установить назначения задания и Установить описание задания" - не знаю зачем это существует, расширенная функция
Создание и состояние задания нужно синхронизовывать между собой, чтобы оно РАБОТАЛО.
Если нужно чтобы триггер активировался не сразу - делаем следующее:
Значение идет в секундах, в данном случае через 10 секунд активируется триггер.
Так можно строить целые разговоры из нескольких триггеров и текста.
Главная задача
- Создаем 3 задачи
Идентификатор род.задачи ставим имя - task1
Номер задания - task1
Вторая и третья как задачи и так далее
Идентификатор род.задачи ставим имя - task1
Номер задания - task2 и task3
Для того чтобы сделать вторую главную задачу, делаем тоже самое, только просто меняем имя (task1). Аналогично.
Выполнения задач и самой главной задачи - это условия вашего триггера. У меня выполнение главной задачи - условие, что все цели ликвидированы.
Условия
Значения логики
-
Логическое ИЛИ
- || или or
-
Логическое И
- && или and
-
Логическое НЕ
- ! или not
Соответственно к примеру
!alive name
Условие активируется когда объект \ юнит уничтожен - обратное значение alive name
Можно так же задавать условия чтобы активация была засчитана при уничтожении нескольких объектов \ юнитов.
Игрок в зоне триггера
player in thislist
Игрок сел в машину (jeep)
player in jeep
У игрока винтовка в руках
player hasWeapon "класс оружия"
Если необходимо, чтобы триггер был активен сразу то.
call{true}
Рекомендую для сцен в начале сценария, текста, выдачи заданий, либо для анимаций, например, смерть бота и тд.
Description
Является конфигом для вашей миссии. Крутая вещь, можно проводить в ней работы от простой замены лица, до каких-нибудь кастомных вещей, например музыки.
Заниматься этим можно непосредственно сидя в сценарии, да даже не можно, а нужно
Переходим в папку с миссией(там должна быть ваша миссия - mission.sqm) и в этой папочке создаем Текстовой документ и теперь переименовываем его. Пишем - description.ext - файл становится "белым", либо нет. Теперь открываем его через Notepad++ или любую другую программу которая в принципе выполняет такую же роль(можете даже вообще не парится и писать все в Текстовом документе и только потом прописать description.ext)
Вот ссылка на 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 в данном триггере). Логично что в триггере должны быть как те и другие юниты(Кто-то же должен их обнаружить)
Наименование
Значение
Тип
Пропустить точку
Активация
BLUFOR
Тип активации
Обнаружен независимыми
И указываем у них(ЕСЛИ связаны с техникой!(Т.е приедут на ней)) 4 маршрутные точки:
1 Точка - ОСТАНОВИТЬСЯ - к ней мы прикрепляем триггер через "Задать активацию точки"
2 Точка - СЕСТЬ - юниты войдут в технику после активации триггера(пока триггер не активен, они будут стоять на 1 точке)
3 Точка - ВЫЙТИ - т.е любое место где вам угодно чтобы юниты высадились
4 Точка - НАЙТИ И УНИЧТОЖИТЬ - либо если что-то далеко то ПЕРЕМЕЩЕНИЕ, а потом НАЙТИ И УНИЧТОЖИТЬ.
Засада
Создаем группу ботов - поведение и положение тела указываем следующие:
Наименование
Значение
Режим боя
Не стрелять, даже если не стреляют
Поведение
Скрытно либо Беспечно
Боевой порядок
Любой
Скоростной режим
Любой
Положение юнита
Лежа либо сидя
Создаем модуль - "Установить режим" и делаем в нем следующее:
Наименование
Значение
Применить
Группы
Режим боя
Открыть огонь
Поведение
Бой
Позиция
Пригнуться либо встать
И теперь самое простое: синхронизировать между собой это все - группы ботов с модулем "Установить режим" - а модуль с триггером.
Итого что имеем - активатор делает активацию триггера, и боты выходят из пассивного режима в боевой.
Контроль и атака
от 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 {}; };
Полезные ссылки
Полезные модули
Простые модули
Закрыть карту
Модуль позволяет закрасить ненужные участки карты темным цветом. Размер можно настроить в трансформации, либо нажать клавишу "5" предварительно нажав на модуль.
Скрыть объекты ландшафта
Ну тут все логично, скрывает не нужные объекты - редактируется так же.
Животные
Существует 2 модуля - один из них более редактируемый(там можно настроить радиус размещения в районе)
Показать\скрыть объект
Одна подфункция скрывает объекты, другая показывает.
Постобработка
Крутая вещь, можно накладывать другой тон атмосфере
Ускорение времени
Устанавливает с какой скоростью идет время на сценарииДиапазон 0.1 ... 120
Пропустить время
Комбинация модулей
Вызов поддержки
Обязательно синхронизируем между собой!-Вроде перестает работать если человек умерает(для сетевых режимов с воскрешением)
Сектор
- Создаем модуль Сектор
Например OPFOR и BLUFOR
Далее сам сектор. Настраивайте под свой вкус и цвет
Мой пример
Обязательно синхронизируйте между собой! Два элемента к сектору!
Управление группами
- Создаем модуль "Управление группами - командир" и "Управление группами - подчиненный"
Далее Синхронизируем с условным командиром (игрок) модуль командира и синхронизируем модуль подчиненных с нпс\техникой\группами.
Каждый модуль подчиненных идет на свою группу\нпс\технику.
И все. Заходим на игровой слот и жмем сочетание клавиш CTRL + SPACE
Ниже появляются группы в моем случае это танк и группа пехоты
Цифра соответствует клавишам F1...F10, но так же можно выбирать группы через мышку. Далее просто жмем на нужную группу и даем ей задачу.Управлять можно и через карту (Будет показан количественный процент группы)
Виртуальный Зевс
Практически ничем не отличается от телесного, но как по мне удобнее этот вариант
- Создаем модуль Мастер игры
- Переходим в панель Логические элементы - Виртуальные объекты - создаем любого Зевса
Ставим обоих и прописываем имя переменной у логики и владельца у модуля
Плюсы
Можно подслушивать разговоры игроков и так же говорить по рации (TaskForceRadio)
Минусы
Взаимодействие с триггерами, а именно - если у вас есть триггеры где используется условие Любой игрок - Зевс тоже игрок - соответственно он может задеть триггер
Ограничение по зоне
- Создаем триггер
- Создаем модуль "Ограничение по зоне"
Модуль настраиваем под себя.
Применяем для игровых групп / юнита
Инвертированная граница: Нет > работает если вне триггера; Да > работает если в триггере.
Предупреждение: можно написать что будет предупреждением. Я писал так hint "Вы покидаете территорию сценария. Вас поглотит пустошь."
Санкции: по умолчанию это спаун мины под ногами. Я же пишу так _this setdamage 1;
Синхронизируем. Триггер > модуль > игроки / группы
Погода
Туман
time setFog fogtime - переход к новому значению(туману)
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
"Ближний восток, сухость, песчаная буря"
[] 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; }; };
"Реализм"
"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;
"Постапокалипсис"
"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;
"Ночной охотник"
"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;
"Золотая осень"
"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;
"Африка"
"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;
"Афган"
"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"
"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;
"Коричневый"
"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;
"Серый"
"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;
"Холод, два варианта"
"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;
"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;
"Зимний голубой и белый"
"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;
"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;
"Перенасыщение"
"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 секунд. Если активировать скрипт еще раз до завершения перезарядки, то ничего не произойдет
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
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. Теперь сам скрипт
- Папка 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;
Статью писал Lastick, взята из Стима