《武装突袭3》场景实用脚本

0 点赞
武装突袭3
转载

Для создания сценариев. Зевс. Сценарий. Упрощение работы Зевса. Zeus. Scenario. Scripts. Содержание Сделано для удобного поискаЖмем CTRL+F и ищемРабота с объектом Подобрать "объект" "Подышать на объект" Закрыть двери в объекте Повреждение объекта Удаление Урон по объекту Увеличить или уменьшить объект Прикрепить флаг к чему либо Прикрепить объект, транспорт, турель к чему либо Динамическая прорисовка объектов Анимация движения объект Обнаружение целиРабота с текстом Список команд Примеры некоторых команд Цветной текст Статья AAN(новости)Работа с картинками Своя картинка на объекте Своя картинка на задании либо в "разведки" миссии Своя картинка и текст на листе, газете и прочее или интел с картинкой Текст с картинкой Плавное появление картинки на экране НашивкаМаркер Маркер-указатель Динамические маркеры Телепорт на заданный маркер Динамическая точка возрожденияЭкран Эффект будто резко встал с дивана Затемнение экрана Черный экран Рамки как в кино Эффект синего ПНВ Концовка Загрузочный экран Эффект будто вас ранило ЗемлетрясениеМузыка и звук Общие сведения Радио Зацикливание звукаТранспорт Закрыть двери у транспорта Заблокировать инвентарь транспорта Частичное ограничение дверей транспорта Очистить инвентарь транспорта Ограничение водительской двери транспорта Заглушить транспорт Бесконечные патроны Бесконечный боезапасФонарики, фары, лампы Фонарик у бота Включаем фары у транспорта Мерцающие фонариCfgIdentitiesАнимацииТриггеры, условие, задача и Description Главная задача Условия DescriptionПрочие настройки Сейв зона Сохранение инвентаря после смерти Радиомолчание группы Добавление / Удаление предмета в инвентареПоведение ботов Отношения сторон "Вызов подкрепления" у противника Засада Контроль и атака Движение юнита в бою Задать скорость юниту Задать скорость для транспорта Задать высоту полёта Запрещает юниту отступать Стрельба по объектам Подавляющий огонь Пополнение боеприпасов на "ходу"Полезные ссылкиПолезные модули Простые модули Комбинация модулейПогодаПостобработкаВызов поддержки Артобстрел Артобстрел v.2 Пуск крылатой ракеты Пуск крылатой ракеты v.2 Пуск ракеты по лазеру Сброс ящиков/турелей/транспорта с парашютом ДесантТаймерСтратегическая картаКампания Работа с объектом Одно из удобных (на мой взгляд) я бы выделил взаимодействие, вызывая 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 - имя переменной машины Например - можно делать вот такие танки

动态渲染对象 可能会提高帧率。对于由多个部分组成的单任务场景很有用,可避免相互干扰,或者适用于完全自定义的场景架构。 创建触发器 创建对象并将其保存到组合中 - 例如命名为Mis 在触发器中编写以下内容

激活时 {_x enableSimulation false;_x hideObjectGlobal true;} forEach (getMissionLayerEntities "Mis" select 0); 停用 {_x enableSimulation true;_x hideObjectGlobal false;} forEach (getMissionLayerEntities "Mis" select 0); 可重复。服务器端。 现在生成我们的组合体。 然后只需将新放置的对象放入Mis文件夹

重要提示!只能在左侧的元素窗口中移动组合中的对象。操作方法为:单击对象一次将其选中(可选中多个),然后按住鼠标左键进行拖动。 移动功能目前存在问题,具体原因不再赘述,实际操作时你们会明白。 在多人模式中移动对象的动画需使用【KeyFrame】(工坊),但!在测试过程中发现,即使是关键帧(KeyFrame)的工作也并非完全稳定,可能会导致不同步的问题。 创建4个【扩展曲线关键】模块 创建2个【线段】模块 创建2个【扩展曲线】模块 以火车(Train)为例。假设我们要制作一个火车向前行驶的动画。首先确定起始点,然后在该位置叠加放置2个关键帧(一个用于A点,另一个用于B点)。为了避免混淆,我们自己写的时候要注意变量名!并且在点V2中设置键(在另一个程序中也是如此!)。我的设置是这样的:a1和a1_2,还有另一组b1和b1_2。

名称 数值 时间 50和0 模式 缓入缓出 切线 10 视野 0.75 b1和b1_2类似,只需在“内部”写法中互换它们的位置 接下来设置2个线段和2条扩展曲线 按对(线段->曲线)相互同步

接下来对两个线段进行如下操作,并将它们命名为line1和line2

我有自己的事件,在这种情况下,当火车开始移动时会鸣笛。长度和播放速度的值也根据个人喜好进行了调整。将曲线与关键帧同步,并且必须与火车(变量名Train)同步。a1和b1与通向line2的曲线同步。a1_2和b1_2与通向line1的曲线同步。名称 数值 长度 600 速度 0。5 模式 缓入缓出 最终应实现曲线连接两个关键帧、列车和线段 接下来,要启动移动,需创建两个【控制台】。一个用于移动到B点,另一个用于反转。

如果需要进行转向、降低或提升高度,可以尝试按住Shift键在动画线附近飞行。游戏会提示你在那里设置下一个弹跳点,之后就能轻松调整好一切。系统会自动同步(它很智能)。别忘了在反向时也要这样做! 它们看起来是这样的

维维安的目标识别 创建触发器 创建“创建任务”并进行同步 在触发器条件中输入: 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章:你是我的朋友还是敌人?】生成BIS_fnc_dynamicText;可以更改字体,详见相关文档。 【指挥部:戈洛夫纽克大尉在战斗中阵亡。】

【平民:天气不错吧?正好适合出去走走!】 如果需要说话者处于存活状态,请在条件中添加此内容 调用{玩家在该触发器区域内 && 变量名存活;}

5.文本从左下角开始书写(就是聊天框的位置,反正我的是这样) "斯特拉蒂斯岛,2035年07月14日01:30<br/>前方将是一个漆黑的夜晚……"调用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;

无法识别或无法翻译,已删除。

8.在屏幕右侧显示提示信息并伴有声音。若要将消息分成多行,请使用\n。提示“要收起手中的武器。\n拿起火箭筒(RPG)并猛地摔向地面。”

可以添加图片 提示解析文本 "<img image='ваша_картинка.paa' <img size='20' /><br/><br/><t size='1.2'>Ваш_текст.</t>"; 彩色文本

示例 哦 发生了一些 噗通声 然后 所有人都死了 颜色和大小可以根据个人喜好进行调整。 AAN文章(新闻)可以嵌入到sqf或触发器中,哪种方式方便就用哪种。 [ [ ["标题","我的标题"], ["元数据",["凯瑟琳·毕肖普",[2035,2,24,11,38],"中欧时间"]], ["粗体文本","这是粗体文本"], ["图片",["a3 Missions_F_Orange Data Img orange_overview_ca.paa","一些图片描述"]], ["方框",["a3 Missions_F_Orange Data Img Faction_IDAP_overview_CA.paa","你不会相信玩《武装突袭3》战争法则展示任务能如何改变你的生活!"]无法识别或无法翻译,已删除。肌肉质量差,在某些结缔组织中存在垫子,装饰有 nibh。Nunc 尊严,nibh 位于 ultrices tincidunt 之上,我没有发酵 quam,非调味品 dolor eros vulputate 质量。凯瑟琳·毕肖普是一名记者

这是我的方案

图片处理 为物体添加自定义图片 操作很简单 将自定义图片(建议为paa格式,jpg格式也可)放入任务文件夹 然后指定图片路径

在任务或“侦察”任务中使用自定义图片 创建“创建任务”模块 按照您的习惯进行编写和设置,并在描述中填写以下内容: 您的文本(如有需要)<img image="pictuk.jpg" width="270" height="270"/> pictuk.jpg是我任务文件夹中图片的名称 width和height可以调整 这是我的效果示例

在传单、报纸等物品上自定义图片和文字,或带有图片的情报。名称例如填写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; 带图片的文字。

按之前所述操作 编写: ["<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——这正是我剧本中独白的时长(以秒为单位) 图片在屏幕上平滑出现,同样平滑消失 ["图片路径。["paa"]生成BIS_fnc_textTiles;徽章图片(建议为.paa格式,实际上任何图片都可以嵌入);触发器(非必需)

描述.ext类 CfgUnitInsignia { 类 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.编写以下内容:"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无法翻译的跳过动态重生点 创建重生点(任意,即使是标记) 触发器 设置重生点变量名称,在我的示例中为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] spawnBIS_fnc_fadeEffect;可更改为白色 1 - 渐暗(0 - 反向)5 - 持续时间 1 - 模糊(0 - 无) 屏幕变暗 titleCut ["", "BLACK OUT", 5];平滑变暗屏幕 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.无法识别或无法翻译,已删除。extclass CfgDebriefing { class End1 { title = "任务完成"; subtitle = "第一关结束"; description = "你们出色地清理了郊区<br/>准备好迎接下一次进攻。"; picture = "n_inf"; pictureColor[] = {0.0,0.5,0.0,1}; }; }; picture是标记(在编辑器中按F6,将鼠标悬停在任何标记上,下方会显示其名称) 标记相关内容

加载屏幕 左侧顶部和底部的填充文本(类似提示) egl_lv426flat - 您的地图名称(请查看您的任务文件名,在点之后)

description.ext 类 CfgWorlds { 类 egl_lv426flat { author = "Территория: Восточная Европа"; description = "精神病院"; pictureMap = "ваша_картинка.jpg"; pictureShot = "ваша_картинка.jpg"; loadingTexts[] = { "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст.", "Ваш_текст." }; }; }; 示例

受伤效果调用BIS_fnc_indicateBleeding; 地震震动等级为1到4级。 [1]调用BIS_fnc_earthquake; 或者这样 [1]远程执行["BIS_fnc_earthquake"]; 音乐和声音 基本信息可以通过CfgSounds和CfgMusic设置音乐,但如果第一种方式下前一首音乐未播放完毕,新的音乐会叠加播放。 description.ext类CfgSounds { 类boevoirubej { name = "boevoirubej"; sound[] = {"sound boevoirubej.ogg", 1,1}; titles[] = {}; }; } 或者 类CfgMusic { 类theend { name = ""; sound[] = { sound theend.ogg, 4.0, 1.这是您的音乐名称

接下来,我们需要音乐本身。在任务文件夹中创建一个文件夹,并将其命名为sound。

现在我们来添加音乐,但是。 文件名必须与描述中的名称严格一致(或者反过来) 文件格式必须为.ogg

С этим мы закончили. Теперь в арме создаем триггер и пишем в нем 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.extclass CfgSounds { sounds[] = {}; class music { name = "music"; sound[] = {"sound music.ogg", 1, 1}; titles[] = {0,""}; }; }; Не забываем закинуть саму музыку Музыка "радио" альтСоздаем в папочке миссии папку и называем ее sounds Кидаем туда нашу музыку description.extclass 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]; Зацикливание звукаот Dominion1859 Он необходим для зацикливания коротких звуковых дорожек. Например, для озвучивания гула двигателя, тиканья часов, звуков сирены и так далее. В файлах миссии создаем: initServer.sqf description.ext папка sound initServer.sqf_sound = createSoundSource ["S1", A1, [], 0]; _sound2 = createSoundSource ["S2", A2, [], 0]; _sound3 = createSoundSource ["S3", A3, [], 0]; _sound4 = createSoundSource ["S4", A4, [], 0]; A1...A4 это имя переменной ОБЪЕКТА на котором будет звук description.extclass CfgSFX { class Sound1 { sound0[] = {" sound звук_часов.ogg", db+10, 1.0, 5, 1, 1, 1, 1}; sounds[] = {"sound0"}; empty[] = {"", 0, 0, 0, 0, 0, 0, 0}; }; class Sound2 { sound0[] = {" sound звук_часов.ogg", db+10, 1.0, 5, 1, 1, 1, 1}; sounds[] = {"sound0"}; empty[] = {"", 0, 0, 0, 0, 0, 0, 0}; }; class Sound3 { sound0[] = {" sound звук_подстанции.ogg", db+10, 1.0, 10, 1, 0, 0, 0}; sounds[] = {"sound0"}; empty[] = {"", 0, 0, 0, 0, 0, 0, 0}; }; class Sound4 { sound0[] = {" sound звук_радио.ogg", db+10, 1.0, 15, 1, 1, 1, 1}; sounds[] = {"sound0"}; empty[] = {"", 0, 0, 0, 0, 0, 0, 0}; }; }; 5, 10 и 15 это радиусы в котором вы их слышите!Обратите внимание на звук_подстанции! Последние 3 цифры это как в триггере "Время" - малое, среднее и позднее значение. Если нужно без задержек, то цифры ставим "0"! class CfgVehicles { class S1 { sound = "Sound1"; }; class S2 { sound = "Sound2"; }; class S3 { sound = "Sound3"; }; class S4 { sound = "Sound4"; }; }; Ну и все. После всего этого заходим в арму, ставим переменные и радуемся. Их можно добавлять хоть до бесконечности. Транспорт Закрыть двери у транспортаЧеловек будучи в этом транспорте не сможет вылезти или пересесть 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; Заглушить транспортjeep engineOn false; Бесконечные патроныВ инициализации БЕЗ ПЕРЕЗАРЯДКИthis addEventHandler ["fired",{(vehicle (_this select 0)) setvehicleammo 1;}]; Бесконечный боезапаспомощь комментария от An!s!mov В инициализации С ПЕРЕЗАРЯДКОЙthis addEventHandler ["reloaded", {(_this select 0) addMagazine ((_this select 3) select 0);}]; Фонарики, фары, лампы Фонарик у ботаТри вида использования для удобств: Только включает фонарик. Добавлять надо ручками! 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 "лицо"; Узнаем тут

玩家默认情况下,如果使用ACE模组,将没有声音。 在初始化时输入以下命令: this setspeaker "声音"; 相关信息可在此处查询。

角色个性化 上述为其中一种方案,但此处将介绍一种在多人游戏中始终有效的具体情况。 角色的面部、声音、团队呼号、语音语调、面部面具(即玩家角色脸上的装饰)设置如下: description.extclass 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.标注为“None”的地方并不意味着它不存在,而只是表示它未被使用。

重要提示:务必注意括号的匹配。你甚至可以点击它们来理解哪个括号与哪个配对,如果没有“闭合”括号,任务中很可能会出现错误,提示你在某行存在格式不正确等问题。 现在,我们已经设置好了这些数值——接下来该做什么? 接下来我们创建触发器(你甚至可以覆盖整个地图),并在其中设置重复选项。给我们的单位命名变量名 - 例如solda 在触发器中写入以下内容:solda setIdentity "Pawel"; solda2 setIdentity "Wel"; 这样就可以了。测试一下,让单位死亡 - 看看是否一切正常运行,然后就可以开心地看到在我们的非洲场景中,作战的不再是白人士兵,而是黑人士兵了。 动画 我个人使用这两个命令 this switchMove "анимация_01"; ^- 使用变量名 0 = this spawn{_this switchMove "анимация_01";}; 一个用于单位,另一个用于触发器。POLPOX(为方便起见) 示例:此switchMove【Acts_AidlPercMstpSnonWnonDnon_warmup_2_loop】

Анимация - смерть (для ботов) Убираем хп Выключаем моделирование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.sqfLOP - имя бота sq - игрок Условие триггера (getDammage LOP) &gt; 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.sqfparams ["_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" так и через имя переменной - второй в основном используется если подключается триггер для активации. Создание задания

“创建日记记录”指的是简报、战斗报告以及其他描述士兵行动的内容。 “创建任务”即合理的任务,其中包括任务描述和名称。上述触发器中指定的单位会激活该任务,并且在完成另一个触发器的条件之前,该任务将处于未完成状态(是的,至少需要两个触发器)。 例如:你需要炸毁房屋。设置两个触发器——一个在激活位置,另一个在任务完成位置。 1. 第一个触发器用于创建任务,而任务的完成条件(第二个触发器)是指定对象不存在。(即当对象被【损坏】或【摧毁】后,任务将完成)

“设置任务目标”和“设置任务描述”——我不知道这有什么存在的意义,这是个扩展功能。任务的创建和状态需要相互同步,这样它才能正常运行。如果希望触发器不立即激活,可以按以下步骤操作:

数值以秒为单位,在这种情况下,10秒后触发条件被激活。可以通过多个触发条件和文本构建完整的对话。主要任务

创建3个任务。第一个作为“标题”,父任务标识符设为名称 - task1,任务编号 - task1。第二和第三个作为后续任务,父任务标识符同样设为名称 - task1,任务编号分别为task2和task3。若要创建第二个主要任务,操作相同,只需更改名称(task1)。任务的完成情况以及主要任务本身,均作为触发器的条件。我的主要任务完成条件是所有目标均被消灭。 逻辑条件值 逻辑或 || 或 or 逻辑与 && 或 and 逻辑非 ! 或 not 举例来说 !alive name 当对象【单位】被摧毁时条件激活——与alive name的值相反 也可以设置条件,以便在摧毁多个对象【单位】时判定激活。玩家处于触发区域 玩家在列表中 玩家已进入载具(吉普车) 玩家在吉普车内 玩家手持步枪 玩家持有武器【武器类别】 若需触发立即激活 调用{true} 推荐用于场景开头、文本、任务发放或动画,例如机器人死亡等场景 描述:这是你的任务配置文件。非常实用,可用于从简单的面部替换到自定义内容(如音乐)等各种操作。你可以直接在脚本中进行操作,实际上这不仅是可以,而是必须的。 进入任务所在的文件夹(里面应该有你的任务文件 - mission.sqm),在这个文件夹中创建一个文本文档,然后重命名它。命名为 - description.ext - 文件会变成“白色”,或者不会。现在通过Notepad++或任何其他具有相同功能的程序打开它(你甚至可以直接在文本文档中编写,之后再将内容写入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.在ZoneH区域内终止sqf;提示“前往突袭”;玩家允许伤害设为开启;玩家执行【切换武器】动作[玩家,玩家,0];保存。返回装备界面并启动。角色处于触发器内时不应拿起武器或对其他角色造成伤害。重要说明!这些数据在安装ase模组时有效!对于普通版本,请将inSafeZone中的299替换为100。死亡后保存 inventory该脚本会保存玩家死亡前拥有的物品、弹药、手榴弹及其他物品。(适用于重生机制,但不适用于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.sqfplayer 添加事件处理器 ["Killed", {装备 = 获取单位装备 玩家; true}]; 玩家 添加事件处理器 ["Respawn", {玩家 设置单位装备 装备; 装备 = nil; true}]; 队伍无线电静默 此脚本用于关闭队伍对话。 在任务文件中创建: InitPlayerLocal.sqf Init.sqf InitPlayerLocal.sqf 启用无线电 false; 启用语音 false; 1 淡入无线电 1; Init.sqf 如果 ((!是服务器) && (玩家 !在背包和制服中添加或移除物品有三种常用命令:向背心、背包和制服添加物品。例如,我将防毒面具添加到背心的代码为gg1 addItemToVest "av_gasm1"。也可以添加其他物品,例如在物品栏中找到装备选项卡,其中的所有物品都可以添加到你的士兵身上。

添加到制服 addItemToUniform 添加到背心 addItemToVest 添加到背包 addItemToBackpack 若要通过命令删除物品,请使用remove。例如 gg1 removeItemFromUniform "FirstAidKit"; gg1 removeItemFromVest "FirstAidKit"; gg1 removeItemFromBackpack "FirstAidKit"; 若要删除武器配件(弹匣除外),使用以下命令 removeAllPrimaryWeaponItems gg1; 机器人行为 阵营关系此命令用于在场景中更改阵营之间的关系。西方阵营 = 蓝方 东方阵营 = 红方 抵抗势力 = 独立势力 例如,设置独立势力与蓝方之间为友好关系 独立势力 setFriend [西方阵营, 1]; 西方阵营 setFriend [独立势力, 1]; 设置为敌对关系 西方阵营 setFriend [独立势力, 0]; 独立势力 setFriend [西方阵营, 0]; “呼叫敌方支援” 创建此类触发器,例如在500米范围。 类型 - 通过点,激活条件 - 在我的案例中为任意蓝方单位,激活类型 - 被独立势力发现(该单位在此触发器中发现了蓝军士兵。逻辑上,触发器中应该同时存在这两种单位(总需要有单位去发现他们)。

名称 数值 类型 跳过点 激活 蓝方 激活类型 被中立单位发现 创建流浪汉组

并且我们要为他们(如果与载具有关!即他们会乘坐载具)设置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.sqfparams ["_heli", "_helipad", ["_mode", "LAND"]]; // _heli - имя вертолета // _heipad - имя посадочной площадки (желательно невидимой) // _mode - String. Режимы посадки. Доступны "LAND", "GET IN", "GET OUT". По-умолчанию "LAND". _heli move getPosATL _helipad; sleep 3; while { alive _heli &amp;&amp; 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.sqfparams ["_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.sqfparams ["_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 {}; }; Пополнение боеприпасов на "ходу"от Dominion1859 Примечания:Не восполняются ручные гранаты. Если стрелять с турели (не пилонов) "дистанционно" (т.е через "ручное управление огнем") то пополнение боезапаса происходить не будет. Большинство ручных гранатометов пополняются "новыми" снарядами, так как отстреленные старые не учитываются игрой. fn_ammoMode.sqf Примеры:[Boy, [], [], []] call DOM_fnc_ammoMode; У бота Boy будут восполняться запасы всех магазинов, всего используемого им оружия. [Boy, ["hgun_ACPC2_F"], ["GL_3GL_F"], ["30Rnd_65x39_caseless_mag_Tracer"]] call DOM_fnc_ammoMode; У бота Boy будет восполняться боезапас ко всему, кроме магазинов к пистолету, гранат к подствольнику, и желтых дымовых гранат. [this, [], [], []] execVM "fn_ammoMode.sqf"; На юните. Параметры_this select 0 — &lt;Объект&gt;. Юнит или техника. _this select 1 — &lt;Массив&gt;. Массив строк с класснеймами оружия (weapon), боекомплект которых восполняться НЕ будет. По-умолчанию пустой массив (восполняется все). _this select 2 — &lt;Массив&gt;. Массив строк с класснеймами стволов (muzzle), боекомплект которых восполняться НЕ будет. По-умолчанию пустой массив (восполняется все). _this select 3 — &lt;Массив&gt;. Массив строк с класснеймами магазинов, которые не будут восполняться. По-умолчанию пустой массив (восполняется все). Возвращаемое значение: Массив вида ["Тип EH", EH ID].fn_ammoMode.sqfprivate ["_boyz", "_weap", "_muzz", "_magz", "_cond"]; _boyz = _this param [0, objNull, [objNull]]; _weap = _this param [1, [], [[]]]; _muzz = _this param [2, [], [[]]]; _magz = _this param [3, [], [[]]]; if (isNil "_weap") then {_weap = []}; if (isNil "_muzz") then {_muzz = []}; if (isNil "_magz") then {_magz = []}; switch true do { // Если boyz оказался юнитом case (_boyz isKindOf "CAManBase"): { private _EvHa = _boyz addEventHandler ["Reloaded", format [ " _weap = %1; _muzz = %2; _magz = %3; params ['_unit', '_weapon', '_muzzle', '_newMag', '_oldMag']; private _exit1 = (isNil '_oldMag'); private _exit2 = (_weapon in _weap); private _exit3 = (_muzzle in _muzz); private _exit4 = ((_oldMag select 0) in _magz); private _exit5 = ((_oldMag select 1) &gt; 0); private _exit6 = ((_newMag select 0) in _magz); private _launch = (_weapon isKindOf ['Launcher', configFile &gt;&gt; 'CfgWeapons']); if (_launch) then { if (_exit2 || _exit3 || _exit4 || _exit5 || _exit6) exitWith {}; if (isNil 'oldMag') then { _unit addMagazineGlobal (_newMag select 0); } else {_unit addMagazineGlobal (_oldMag select 0);}; }; if (_exit1 || _exit2 || _exit3 || _exit4 || _exit5 || _exit6) exitWith {}; _unit addMagazineGlobal (_oldMag select 0); ", _weap, _muzz, _magz ] ]; ["Reloaded", _EvHa]; }; Продолжение ниже! Поведение ботов ч3 // Если boyz оказался вертолетом/самолетом case ((_boyz isKindOf "Helicopter") || (_boyz isKindOf "Plane")): { private _EvHa = _boyz addEventHandler ["Fired", /*{ params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"]; private _exit1 = (_weapon in _weap); private _exit2 = (_muzzle in _muzz); private _exit3 = (_magazine in _magz); if (_exit1 || _exit2 || _exit3) exitWith {}; // Проверка количества патронов/снарядов на пилонах private _pylonMagz = getPylonMagazines _unit; for "_i" from 0 to ((count _pylonMagz) - 1) do { // Добавление патронов в пилон, при исчерпании им боезапаса if (_unit ammoOnPylon (_i + 1) == 0) then { _unit setAmmoOnPylon [_i + 1, 9999]; }; }; // Информация о текущем магазине, загруженном в турель private _data = _unit currentMagazineDetailTurret (_unit unitTurret _gunner); _data = _data splitString "()"; // Метка для выхода из цикла scopeName "Поиск патриков"; for "_i" from 0 to (count _data - 1) do { // Поиск инфы об оставшихся в магазине патронах private _dta = _data select _i; if (_dta find "/" != -1) then { _dta = _dta splitString "/"; _dta = parseNumber (_dta select 0); // Если патронов в магазине меньше двух, добавляет такой же магазин в турель if (_dta &lt; 2) then { _unit addMagazineTurret [_magazine, (_unit unitTurret _gunner)]; }; // Выход из цикла breakTo "Поиск патриков"; }; }; }*/ format [" _weap = %1; _muzz = %2; _magz = %3; params ['_unit', '_weapon', '_muzzle', '_mode', '_ammo', '_magazine', '_projectile', '_gunner']; private _exit1 = (_weapon in _weap); private _exit2 = (_muzzle in _muzz); private _exit3 = (_magazine in _magz); if (_exit1 || _exit2 || _exit3) exitWith {}; if (_weapon == 'CMFlareLauncher' || _weapon == 'CMFlareLauncher_Singles' || _weapon =='CMFlareLauncher_Triples') then { _data = magazinesAllTurrets _unit; for '_i' from 0 to (count _data - 1) do { _mag = _data select _i; _type = _mag select 0; _path = _mag select 1; _ammo = _mag select 2; if (_type find 'CMFlare' != -1 and _ammo == 0) then { _unit removeMagazinesTurret [_type, _path]; _unit removeWeaponTurret [_weapon, _path]; _unit addMagazineTurret [_type, _path]; _unit addWeaponTurret [_weapon, _path]; } }; }; private _pylonMagz = getPylonMagazines _unit; for '_i' from 0 to ((count _pylonMagz) - 1) do { if (_unit ammoOnPylon (_i + 1) == 0) then { _unit setAmmoOnPylon [_i + 1, 9999]; }; }; private _data = _unit currentMagazineDetailTurret (_unit unitTurret _gunner); _data = _data splitString '()'; scopeName 'Поиск патриков'; for '_i' from 0 to (count _data - 1) do { private _dta = _data select _i; if (_dta find '/' != -1) then { _dta = _dta splitString '/'; _dta = parseNumber (_dta select 0); if (_dta &lt; 2) then { _unit addMagazineTurret [_magazine, (_unit unitTurret _gunner)]; }; breakTo 'Поиск патриков'; }; } ", _weap, _muzz, _magz] ]; ["Fired", _EvHa]; }; // Все остальные случаи default { private _EvHa = _boyz addEventHandler ["Fired", /*{ params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"]; private _exit1 = (_weapon in _weap); private _exit2 = (_muzzle in _muzz); private _exit3 = (_magazine in _magz); if (_exit1 || _exit2 || _exit3) exitWith {}; // Информация о текущем магазине, загруженном в турель private _data = _unit currentMagazineDetailTurret (_unit unitTurret _gunner); _data = _data splitString "()"; // Метка для выхода из цикла scopeName "Поиск патриков"; for "_i" from 0 to (count _data - 1) do { // Поиск инфы об оставшихся в магазине патронах private _dta = _data select _i; if (_dta find "/" != -1) then { _dta = _dta splitString "/"; _dta = parseNumber (_dta select 0); // Если патронов в магазине меньше двух, добавляет такой же магазин в турель if (_dta &lt; 10) then { _unit addMagazineTurret [_magazine, (_unit unitTurret _gunner)]; }; // Выход из цикла breakTo "Поиск патриков"; }; }; }*/ format [ " _weap = %1; _muzz = %2; _magz = %3; params ['_unit', '_weapon', '_muzzle', '_mode', '_ammo', '_magazine', '_projectile', '_gunner']; private _exit1 = (_weapon in _weap); private _exit2 = (_muzzle in _muzz); private _exit3 = (_magazine in _magz); if (_exit1 || _exit2 || _exit3) exitWith {}; if (_weapon == 'SmokeLauncher') then { _data = magazinesAllTurrets _unit; for '_i' from 0 to (count _data - 1) do { _mag = _data select _i; _type = _mag select 0; _path = _mag select 1; _ammo = _mag select 2; if (_type find 'SmokeLauncher' != -1 &amp;&amp; _ammo == 0) then { _unit removeMagazinesTurret [_type, _path]; _unit removeWeaponTurret [_weapon, _path]; _unit addMagazineTurret [_type, _path]; _unit addWeaponTurret [_weapon, _path]; }; }; } else { _data = _unit currentMagazineDetailTurret (_unit unitTurret (gunner _unit)); _data = _data splitString '()'; for '_i' from 0 to (count _data - 1) do { _dat = _data select _i; if (_dat find '[' != -1) exitWith {}; if (_dat find '/' != -1) then { _dat = _dat splitString '/'; _dat = _dat select 0; _dat = parseNumber _dat; if (_dat == 0) then { _unit addMagazineTurret [_magazine, (_unit unitTurret (gunner _unit)), 9999]; }; }; }; }; ", _weap, _muzz, _magz ] ]; ["Fired", _EvHa]; }; }; Полезные ссылки https://steamcommunity.com/sharedfiles/filedetails/?id=623475643 https://steamcommunity.com/sharedfiles/filedetails/?id=723217262 Либо это(Не рекомендую использовать Ахилес и Зевс одновременно, функции они выполняют одинаковые, а некоторые панели будут только мешать(будут накладываться друг на друга)) https://steamcommunity.com/sharedfiles/filedetails/?id=1779063631&amp;searchtext=Zeus Дополнение к Ахилесу либо к Зевсу https://steamcommunity.com/sharedfiles/filedetails/?id=1355571744&amp;searchtext=Achilles Мод добавляющий скрытые предметы https://steamcommunity.com/sharedfiles/filedetails/?id=1923321700 Для анимаций https://steamcommunity.com/sharedfiles/filedetails/?id=1341387001 Полезные модули Простые модулиЗакрыть картуМодуль позволяет закрасить ненужные участки карты темным цветом. Размер можно настроить в трансформации, либо нажать клавишу "5" предварительно нажав на модуль. Скрыть объекты ландшафтаНу тут все логично, скрывает не нужные объекты - редактируется так же. ЖивотныеСуществует 2 модуля - один из них более редактируемый(там можно настроить радиус размещения в районе) Показать скрыть объектОдна подфункция скрывает объекты, другая показывает. ПостобработкаКрутая вещь, можно накладывать другой тон атмосфере Ускорение времениУстанавливает с какой скоростью идет время на сценарии Диапазон 0.1 ... 120 Пропустить время Комбинация модулейВызов поддержки

一定要同步! - 好像在有复活机制的网络模式中,如果玩家死亡就会失效

扇区 创建模块 扇区 接下来转到逻辑元素。侧面 > 选择侧面

例如敌方部队(OPFOR)和友方部队(BLUFOR) 接下来是区域本身。根据自己的喜好和风格进行设置 我的示例

务必同步!两个元素到扇区! 群组管理 创建【群组管理-指挥官】模块和【群组管理-下属】模块,将它们相互同步

接下来,将指挥官模块与虚拟指挥官(玩家)进行同步,并将下属模块与NPC技术组同步。每个下属模块对应一个NPC技术组。操作完成后,进入游戏存档并按下组合键CTRL + SPACE,屏幕下方会显示分组,在我的情况下显示为坦克和步兵组。

数字对应F1至F10键,也可以通过鼠标选择分组。接下来只需点击所需分组并为其分配任务。也可以通过地图进行管理(会显示队伍的百分比数量)。虚拟宙斯:和实体宙斯几乎没有区别,但个人觉得这个版本更方便。创建游戏大师模块,进入逻辑元素面板 - 虚拟对象 - 创建任意宙斯。放置两者并为逻辑设置变量名称,为模块设置所有者。优点:可以监听玩家对话,也可以通过电台(TaskForceRadio)进行通话。缺点:与触发器的交互,即如果存在使用【任意玩家】条件的触发器,而宙斯也算玩家,因此他可能会触发该触发器。 区域限制: 1. 创建触发器。 2. 创建【区域限制】模块。 3. 触发器>设为重复触发。 4. 根据自身需求设置模块。 将其应用于游戏单位组/单位。 反向边界:否>在触发器区域外生效;是>在触发器区域内生效。警告:可以编写提示内容。我会这样写提示“您正在离开任务区域。您将被虚空吞噬。” 惩罚:默认是在脚下生成地雷。我会这样写_this setdamage 1; 进行同步。触发器>模块>玩家/小组 天气 雾time setFog fog time - 过渡到新值(雾) fog - 雾的浓度。范围0...1 示例 15 setFog 0.山地雾:从海拔70米开始出现,海拔越高雾气越浓。代码:0 setFog [1, -1, 70]; 山谷雾:从海拔60米开始出现,海拔越低雾气越浓。代码:0 setFog [1, 1, 60]; 水面雾:代码:0 setFog [1, 1, 0]; 移除草地:在割草机初始化时输入以下内容:setTerrainGrid 50; 移除兔子和蛇:EnableEnvironment也可在触发区域内使用。当玩家离开触发区域时,也可启用禁用功能。init.sqf sleep 0.1; enableEnvironment [FALSE, TRUE]; enableEnvironment [环境生物, 环境音效, 风力系数] 环境生物 环境音效 风力系数 兔子/蛇/鱼等生物活动 猫头鹰、蝉等环境音效 风速 TRUE和FALSE TRUE和FALSE 0...1 后期处理 这里我会整理类似目录的内容,以便节省在互联网上搜索和使用模组的时间。 Init.sqf "中东,干燥,沙尘暴"

无法翻译的内容已删除

"色彩校正" ppEffectEnable true; "色彩校正" 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]]; "色彩校正" 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; 金色的秋天

"色彩校正" 后处理效果启用 真; "色彩校正" 后处理效果调整 [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]]; "色彩校正" 后处理效果提交 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; 【阿富汗】

"色彩校正" 后处理效果启用 真; "色彩校正" 后处理效果调整 [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]]; "色彩校正" 后处理效果提交 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; 【棕色】

"色彩校正" 后处理效果启用 真; "色彩校正" 后处理效果调整 [1,1,0,[0.1,0.2,0.3,-0.3],[1,1,1,0.5],[0.5,0.2,0,1]]; "色彩校正" 后处理效果提交 0; "灰色"

"色彩校正" 后处理效果启用 真; "色彩校正" 后处理效果调整 [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]]; "色彩校正" 后处理效果提交 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" 后处理效果启用 真; "colorCorrections" 后处理效果调整 [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" 后处理效果提交 0;

“色彩校正”后处理效果启用 真; “色彩校正”后处理效果调整 [1, 1, 0, [0.31, 0.31, 1.0, 0.1], [0.85, 0.85, 0.92, 0.48], [1 , 1, 1, 0.03]]; “色彩校正”后处理效果提交 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.sqfparams ["_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.sqfparams ["_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.sqfparams ["_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&amp;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.sqfparams ["_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.sqfparams ["_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) &lt; 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.sqfparams ["_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 &lt; _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 &lt; 2}; _this allowDamage false; unassignVehicle _this; waitUntil {getPos _this select 2 == 0}; _this allowDamage true; }; }; Таймер Обратный отсчет LM_fnc_timeoutCountdown = { params [ ["_time", 30, [0]], ["_colour", "#FFFFFF", [""]] ]; private _timeout = time + _time; RscFiringDrillTime_done = false; 1 cutRsc ["RscFiringDrillTime", "PLAIN"]; while { time &lt; _timeout } do { private _remainingTime = _timeout - time; private _timeFormat = [_remainingTime, "MM:SS.MS", true] call BIS_fnc_secondsToString; private _text = format ["&lt;t align='left' color='%1'&gt;&lt;img image='%2' /&gt;%3:%4&lt;t size='0.8'&gt;.%5&lt;/t&gt;", _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 ["&lt;t align='left' color='%1'&gt;&lt;img image='%2' /&gt;%3:%4&lt;t size='0.8'&gt;.%5&lt;/t&gt;", _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) &lt; 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.sqfstartAAA = { 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 &gt; 6) &amp;&amp; (dayTime &lt; 20)); //Проверка ночь ли это. ХЗ зачем, не стал вникать _scale = 1.5; // Масштаб отображаемой карты (по умолчанию = 1) _simul = true; [ findDisplay 46, _mapCenter, _missionsData, _ORBAT,_markers, _images, _overcast, _isNight, _scale, _simul ] call Bis_fnc_strategicMapOpen; В редакторе

在地图上

战役 我使用战役这样的工具的经验。 方便整合模组。可以直接将所需内容固定,这样所有人都能下载。 只有主机能看到显示界面。 由于它是作为模组运行的,所以可以整合本地模组。(不建议将盗版内容公开分享,仅限个人或小范围使用。) 所有任务都整合在一个“文件”中,而且界面设计美观。不确定,但似乎在加载场景时不需要下载任务文件(当然前提是战役已下载)。这里我不会介绍所有内容,只说明如何让它正常工作和显示。 首先,我们需要创建自己的任务。 其次,创建5个文件(也可以是4个),不包括.pbo文件: Coop Missions pic(可选,用于开场图片) config描述.ext 顺序如下:

在合作模式(Coop)中必须包含Missions文件夹和Description.ext文件。Missions文件夹中存放你的任务,我这里有3个任务。 pic文件夹我用于存放开场图片。你也可以不用该文件夹,直接将图片放入pbo文件中。 config.cpp文件的存放方式与合作模式(Coop)相同,同样放在pbo文件中。 显示

1. 来自config.cpp的战役简称 2. 来自config.cpp的任务简称 3. 来自任务description.ext的名称。特意设置了不同的名称,以便清晰区分各自的来源。示例:briefingName = "序章.VCh-71882."; 4. 来自任务description.ext的图片。overviewPicture。 5. 来自任务description.ext的文本。overviewText。我还会在场景编辑器的【属性】部分添加一些数据。这是为了让其他人能够理解我们在玩什么(真的有人会看这个吗?☺)。你可以按照自己认为合适的方式去做。 接下来是填充.config.cpp文件。严格遵守任务目录。如果任务超过三个,就再添加。当然不要忘记class和directory。 class CfgPatches { class MyCampaign { // 编辑器元信息 name = "矿难事件"; author = "Lastick"; url = ""; requiredVersion = 2.02; requiredAddons[] = { "A3_Functions_F" }; units[] = {}; weapons[] = {}; }; }; class CfgMissions { class Campaigns { class MyCampaign { directory="Coop_bm Coop"; }; }; class MPMissions { class MyCampaign { briefingName="沙列耶夫斯基矿场"; class Paranoia_0 { briefingName="序幕. 内务部队"; directory="Coop_bm Coop Missions Paranoia_0.grassland"; }; class Paranoia_1 { briefingName="第一部分. 抵达"; directory="Coop_bm Coop Missions Paranoia_1.grassland"; }; class Paranoia_2_LLIAXTA { briefingName="第二部分. 沙列耶夫斯基矿场矿井"; directory="Coop_bm Coop Missions Paranoia_2_LLIAXTA.cytech_underground_terrain"; }; }; }; }; }; Description.ext!此文件中出现的任何错误都将导致武器崩溃。

class NoEndings { endDefault = ""; }; class MissionDefault : NoEndings { lives = -1; cutscene = ""; lost = ""; end1 = ""; end2 = ""; end3 = ""; end4 = ""; end5 = ""; end6 = ""; }; class Campaign { firstBattle = "Missions"; name = "Инцидент на шахте"; briefingName = "Сценарий за спецназ."; author = "Lastick"; overviewPicture = " Coop_bm pic intro.paa"; overviewText = "Кампания из 3 миссий. Где вам предстоит поиграть в роли спецназа, которого отправили на шахту."; class MyCampaign : NoEndings { firstMission = "Paranoia_0"; name = "Военная часть 71882"; cutscene = ""; end1 = ""; class Paranoia_0 : MissionDefault { myCustomEnd = ""; endDefault = ""; end1 = ""; lost = "Paranoia_0"; template = "Paranoia_0.grassland"; }; class Paranoia_1 : MissionDefault { endDefault = ""; lost = "Paranoia_1"; template = "Paranoia_1.grassland"; }; class Paranoia_2_LLIAXTA : MissionDefault { endDefault = ""; lost = "Paranoia_2_LLIAXTA"; template = "Paranoia_2_LLIAXTA.cytech_underground_terrain"; }; }; class Missions { name = "$STR_CAMPAIGN_TITLE"; cutscene = ""; firstMission = ""; end1 = ""; end2 = ""; end3 = ""; end4 = ""; end5 = ""; end6 = ""; lost = ""; }; }; Обновления рук-ва Здесь будет информация о последнем обновлении руководства +Своя картинка на задании в миссии +Подобрать "интел" * Небольшое изменение в Важных и "средних" скриптах 03.06.21+Показать скрыть объект * Небольшое изменение в названии последнего скрипта 08.06.21+Пополнение в "Полезные ссылки" 07.07.21Скрипты низкой важности: +Выход из черного экрана +Плавное появление текста +Обратный отсчет +Эффект будто вас ранило +Еще текстуха +Статья AAN(новости) 16.07.21Файлы миссии +Своя музыка на машине радио(объекте) 20.07.21Файлы миссии +Стратегическая карта 21.08.21Полезные ссылки +Мод добавляющий скрытые предметы 31.08.21Файлы миссии +Своя картинка и текст на листе, газете и прочее 02.09.21Скрипты средней важности +Увеличить или уменьшить объект 13.10.21*Удаление неактуальной информации в важных скриптах +Альтернатива текста на экране +Телепорт на заданный маркер 23.10.21+Эффект будто резко встал с дивана +Эффект синего ПНВ 22.11.21+Маркер-указатель +Цветной текст 07.01.22+Сектор +Сейв зона 03.02.22+Текст с картинкой 19.03.22 - 22.03.22+Анимация - смерть (для ботов) +Альтернатива "радио на объекте" +Заблокировать инвентарь транспорта +Альтернатива. Бот перестает двигаться +Динамическая прорисовка объектов +Закрыть двери в здании 10.04.22+Альтернатива x2 +Плавное появление картинки на экране +Включаем фары у транспорта 16.06.22+Концовка 20.06.22+Обнаружение цели +Контроль и атака 04.08.22 - 06.08.22+2 модуля в полезные модули (время) +Управление группами +Анимация движения объекта 13.08.22+Ограничение по зоне 25.08.22+Мерцающие фонари +Нашивка +Очистить инвентарь машины 25.09.22+Рамки как в кино +Условия *Редактирование скринов(увеличение их в размере), добавление к ним таблиц где это было необходимо 23.10.22*Редактирование и перенос некоторых скриптов 17.12.22+Анимация - брифинг либо введение +Еще одна альтернатива на текстуху (Текст посреди экрана) +Виртуальный Зевс 03.01.23+Удаление 21.02.23+Главная задача 17.04.23+Загрузочный экран *Подсказка 28.08.23+Сохранение инвентаря после смерти *Условия 18.10.23*Сохранение инвентаря после смерти (добавлена альтернатива) +Радиопереговоры группы 24.10.23+Динамическая точка возрождения *Радиомолчание группы 16.11.23 - 21.11.23+Отношения сторон -Рейтинг +Задать скорость для транспорта *Сортировка скриптов влияющих на поведение ботов, см. Поведение ботов *Редактирование 27.01.24*Кардинальное изменение рук-ва 28.02.24Вызов поддержки+Артобстрел 03.03.24+Анимация - ранение (для ботов) 13.03.24+Пуск крылатой ракеты 04.05.24+Принудительная посадка вертолета 01.06.24 - 02.06.24+Пуск крылатой ракеты v.2 +Артобстрел v.2 +Стрельба по объектам (еще одна альтернатива) +Подавляющий огонь +Постобработка *Принудительная посадка вертолета (скрипт ушел в поведение ботов) 14.07.24 - 16.07.24+Беседы с ботом +Пуск ракеты по лазеру +Постобработка (14 цветов) 26.08.24 - 29.08.24*Артобстрел v.2 *Подавляющий огонь.Альтернатива +Сброс ящиков/турелей/транспорта с парашютом +Вызов поддержки ч3 +Десант +Бесконечный боезапас 19.01.25 - 25.01.25*Музыка и звук*Фонарик у бота *Концовка +Зацикливание звука +Добавление / Удаление предмета в инвентаре 17.02.25+КампанияМелкие изменения *Нашивка *Закрыть двери у транспорта *Затемнение экрана(подписал и добавил состояние OUT, помощь комментария) *Обратный отсчет (стим перестал воровать символ) 28.02.25+Убираем кроликов и змей 31.05.25+Заглушить транспорт 18.10.25+Пополнение боеприпасов на "ходу" +Поведение ботов ч3*Содержание (Кампания) // Немного увлекся созданием и обновлением мода. Про рук-во я помню всегда, оно закреплено в профиле, о таком не забудешь☺. Просто щас небольшой кризис в создании сценариев и обновление рук-ва заморозилось. Спасибо всем, кто ставит лайки и дарит награды!