Jump to content

Разработка миссии на основе Simulator Scripting Engine


Recommended Posts

Решение найдено.

Дело в том, что вызывая Weapon.Category обращаемся к таблице свойства «категория» которую последовательно перебираем и оно НЕ является свойством конкретного боеприпаса.

Есть событие (event) у которого есть набор свойств в который входит и (.weapon), вот это и есть конкретный боеприпас.

У него тоже есть набор свойств (.Desc)

 

 

Weapon.Desc = extends Object.Desc {
  category = enum Weapon.Category,
  warhead = {
    type = enum Weapon.WarheadType,
    mass = Mass,
    caliber = Distance,
    explosiveMass = Mass or nil, --for HE and AP(+HE) warheads only
    shapedExplosiveMass = Mass or nil, --for shaped explosive warheads only
    shapedExplosiveArmorThickness = Distance or nil ----for shaped explosive warheads only
  }
}

 

 

И ряд функций:

Weapon.getLauncher

Weapon.getTarget

Weapon.getDesc()

 

Как видим функции Weapon.getCategory нет, вот она то и возвращала некое непонятное число 2.

Т.е. функция получения категории применяемого оружия будет выглядеть как

 local _weapon = Weapon.getDesc(event.weapon);
local _category = _weapon.category; 

которая вернет числовое значение, что в файле и сделано. Дальше обращаемся к таблице Weapon.Category, где перебором узнаем буквенное обозначение типа.

 

Пол дня убил, но теперь есть новый навык J

event_test_new.lua

Link to comment
Share on other sites

  • Replies 543
  • Created
  • Last Reply

Top Posters In This Topic

Господа разработчики, меня очень давно интересует вопрос каким образом можно отловить луч. Класс Spot есть, и к нему функции. У этого класса есть и свойства, но как отловить сам луч?!! По идее, чтобы получить объект класса Unit, достаточно вызвать функцию getUnit инициатор (если инициатор сам юнит), а Spot к чему относится?

Link to comment
Share on other sites

вариант изменения базовых скриптов

 

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

Главные изменения:

 

msf_changed.lua - список погрузочных зон в радиоменю сделан динамическим и теперь погрузочная зона появляется в списке при посадке возле неё в радиусе 150м в течении 5-7 сек (как и поиск группы для подбора требует времени).

 

L_E_R.lua(Load&Eject&Radio) - у катапультантов учитывается время горения шашки; у синей коалиции катапультант включает 2 маяка - 243МГц для Ми8 и 500КГц для Хьюи; динамическое добавление группы в "доступные для подбора" при наличии в ней пехотинца (следует учитывать при создании групп); возможность использования радиопередатчиков для наведения по Р828 в связке с АРК-УД в онлайне; отслеживание доставки грузов в триггерные зоны.

 

Использование:

Предполагается, что пользователю не придётся ковыряться в скриптах, все функции назначаются в редакторе миссий, что должно облегчить использование.

 

1) Радиопередача. Радиопередатчик можно добавить статику или наземной технике. Для этого к имени юнита (НЕ К ИМЕНИ ГРУППЫ, А ИМЕННО К ИМЕНИ ЮНИТА) стоит добавить _@X, где X - цифра от 0 до 9, обозначающая канал Р828 от 1 до 10 (0 соотв. 10му каналу), на которой ведётся радиопередача с данного юнита (при условии, что файл соответствия частот каналам Р828 не изменялся). Подвижный юнит с таким обозначением будет вести радиопередачу только во время остановки. Для того, чтобы юнит вёл радиопередачу и в движении, к имени юнита следует добавить _m@X, где m показывает необходимость радиопередачи в мобильном режиме. Поддержка радиопередачи для Уха не разрабатывалась.

 

2) Грузы. Можно создать до 20 зон, в которые требуется доставить грузы (напр. 10 для красных и 10 для синих). Зоны следует именовать нумерацией от 900 до 919. Для каждой зоны можно назначить до 10 грузов, именуя их по шаблону XXX_Y, где XXX - номер зоны от 900 до 919, а Y - порядковый номер груза от 1 до 10. При нахождении всех грузов в пределах соответствующей им зоны и не выше 2м относительно центра зоны флагу(XXX) присваивается значение 1, которое можно отследить стандартным триггером.

 

Хотел бы поблагодарить BAntDit и StarLey_Andrew за скрипты и возможность их редактирования, а также членов сквадов =TMS= и =RAF= за помощь в тестировании.

 

ЗЫ Хоть в мануале и не указано, но не забывайте удерживать кнопку АСУ до погасания лампы НАСТР. при изменении канала на Р828.

 

ЗЫ2 Пустой звуковой файл continue.ogg для работоспособности скриптов можно вытащить либо из миссии, либо записать самостоятельно.

Demo.miz

msf_changed.lua

L_E_R.lua

  • Like 3

[sIGPIC][/sIGPIC]

Я не читаю Чижей и прочий зоопарк..

Link to comment
Share on other sites

Отличная работа, Chichco!

Вообще радиосвязи с наземной не хватает, как свойства, выставляемого в редакторе миссии.

Из предложений есть следующее:

-прежде всего разделить функции по разным файлам (т.о. можно будет подключать только то, что нужно миссиоделом);

-диапазон имён зон доставки грузов можно задавать в начале скрипта переменной. Как я понял при доставке в зону груза увеличивается флаг, одноимённый зоне? Как вариант можно рассмотреть возможность доставки любого груза в именованные зоны с увеличением выделенных для каждой коалиции флагов.

Ну и как альтернатива, сложить все в этой ветке


Edited by StarLey_Andrew
Link to comment
Share on other sites

Спасибо, стараемся не отставать от твоих наработок))

Относительно разделения на разные файлы - в своё время как раз счёл оптимальным все функции привязывать к юнитам при минимальном количестве переборов юнитов, т.е. за один цикл по всем юнитам добавлять им различные функции, а не для каждой функции устраивать очередной перебор всех юнитов. Если, например, грузы или радио не нужно и пользователь не будет добавлять дополнения к именам в редакторе, то функции проверки местоположения грузов или статуса радиопередатчиков не запустятся и не нагрузят систему. В то же время не будет путаницы с файлами (по себе знаю, обязательно что-то забывал подключить в очередной миссии, в том числе звуковой файл).

Касательно грузов в данный момент флаг соответствующей зоны принимает значение 1 только при доставке всех соответствующих грузов в зону, т.е. напр. если для зоны 900 создан только 1 груз, а для зоны 901 4 груза, то флаги этих зон примут значение 1 только после доставки всех грузов в соответствующие зоны (кстати, интересная мысль в флаге вести учёт кол-ва доставленных грузов или %-ное соотношение, а не только констатировать полное заполнение).

Спасибо за предложение, следующую версию выложу там.

  • Like 1

[sIGPIC][/sIGPIC]

Я не читаю Чижей и прочий зоопарк..

Link to comment
Share on other sites

  • 3 months later...
  • 1 month later...
  • 1 month later...

Что стало с "function mission.controller.sendMessageForAll(string message);" в 1.5? Оно как-то неадекватно теперь работает, либо я чего-то не понял. Постоянно обновляется и выдает сообщение, вместо одноразового вывода на экран.

В миссии из этого поста можно увидить это:

http://forums.eagle.ru/showpost.php?p=1776654&postcount=93

Как правильно работать с этой функцией? Как заставить её исполняться один раз по любому триггеру? Нужно реализовывать какое-то прерывание потока что ли?

Link to comment
Share on other sites

Что стало с "function mission.controller.sendMessageForAll(string message);" в 1.5? Оно как-то неадекватно теперь работает, либо я чего-то не понял. Постоянно обновляется и выдает сообщение, вместо одноразового вывода на экран.

В миссии из этого поста можно увидить это:

http://forums.eagle.ru/showpost.php?p=1776654&postcount=93

Как правильно работать с этой функцией? Как заставить её исполняться один раз по любому триггеру? Нужно реализовывать какое-то прерывание потока что ли?

В 1.5 необходимость в этой функции отпала, т.к. Предыдущие сообщения не стираются, а съезжают выше и пропадают со временем, как это делала Функция.. SendMessages. Вместо не следует использовать стандартный. Trigger.action.OutText (за синтаксис не ручаюсь, нужно смотреть в вики)


Edited by StarLey_Andrew
Link to comment
Share on other sites

  • 1 year later...

Group.getByName() возвращает null в MP

 

Вчера пытался запустить один из своих скриптов в МП, ну и чего вы думаете - выяснил что Group.getByName() для клиентской группы возвращает null. Это что бажина такой или я что-то упустил?

 

Т.е., создал единственную группу с единственным ЛА типа Client. Подцепил скрипт, который выполняет:

 

local group = Group.getByName('alpha') -- где alpha - имя группы

 

в результате переменной group присвоено значение null :(

 

в синглплее - всё работает как и должно.

i5-9600K@4.8GHz 32Gb DDR4 Asus TUF rtx3080 OC Quest Pro Warthog on Virpil base

Link to comment
Share on other sites

Вчера пытался запустить один из своих скриптов в МП, ну и чего вы думаете - выяснил что Group.getByName() для клиентской группы возвращает null. Это что бажина такой или я что-то упустил?

 

Т.е., создал единственную группу с единственным ЛА типа Client. Подцепил скрипт, который выполняет:

 

local group = Group.getByName('alpha') -- где alpha - имя группы

 

в результате переменной group присвоено значение null :(

 

в синглплее - всё работает как и должно.

 

Да баг, отписывались по нему начиная с перехода на 1.5, из-за этого пришлось переделывать много скриптов. О мерах поведаю через недельку в личку. Кроме того с именами сейчас не все просто, его нужно получать через env.get...что-то...key, в скриптах у меня можно найти пример. С телефона точно не отвечу


Edited by StarLey_Andrew
Link to comment
Share on other sites

похоже в моём случае - это моя личная ошибка. Совершенно забыл, что в МП миссия стартует с момента запуска сервера, а скрипт мой на MISSION START был подцеплен. А поскольку ЛА выбран ещё не был, то и функция возвращала null. Переподцепил скрипт на ONCE-->GROUP ALIVE и всё заработало: как только залезаю в кабину - выплняется скрипт и функция возвращает мою группу.

i5-9600K@4.8GHz 32Gb DDR4 Asus TUF rtx3080 OC Quest Pro Warthog on Virpil base

Link to comment
Share on other sites

  • 2 weeks later...

Добрый вечер ..

 

Не подскажите как инструментами SSE получить номер свободных парковых зон на аэродроме.

Тут такая проблемка, если инструментом Coalition.addGroup() добавить юнит "Самолёт" , то все юниты появляются на одном месте, насколько я понимаю, за место на аэродроме отвечает значение ["parking_id"] или ["parking"] в таблице юнита. Если подставлять сгенерённое значение типа math.random(), то ничего не изменяется. Соответсвенно нужно, чтобы всё самолёты расстовлялись по свободнысм местам.

Если кто знает, подскажите пожалуйста..

Link to comment
Share on other sites

Добрый вечер ..

 

Не подскажите как инструментами SSE получить номер свободных парковых зон на аэродроме.

Тут такая проблемка, если инструментом Coalition.addGroup() добавить юнит "Самолёт" , то все юниты появляются на одном месте, насколько я понимаю, за место на аэродроме отвечает значение ["parking_id"] или ["parking"] в таблице юнита. Если подставлять сгенерённое значение типа math.random(), то ничего не изменяется. Соответсвенно нужно, чтобы всё самолёты расстовлялись по свободнысм местам.

Если кто знает, подскажите пожалуйста..

 

Из экспериментов получилось так, что эти ИД не влияют ни на что, а вот координаты более действинно на это влияют. Может конечно я и ошибаюсь и что-то не так делал, но при указании координат рождения в районе торца ВПП они рождались у меня на ближайших к этим координатам стоянках

Link to comment
Share on other sites

  • 4 weeks later...

Как в дкс массивы работают?

Допустим, у меня есть н-ное количество групп в массиве (пусть будет 5), мне нужно активировать 2 рандомные. С луа я никогда не работал, а конкретно по дкс примеры хрен найдёшь, из того что удалось нагуглить это должно выглядеть примерно как:

grps = {g1,g2,g3,g4,g5}

for i = 1, 2 do

local r = math.random(1,5)

Group.activate(grps[r])

end

Что не так, как заставить это работать?

Link to comment
Share on other sites

как объеденить две миссии..... точнее расположение юнитов нужно вставить в другую миссию.

Помогите пожалуйста

Попадания: (100%) приехали......

Link to comment
Share on other sites

как объеденить две миссии..... точнее расположение юнитов нужно вставить в другую миссию.

Помогите пожалуйста

 

Можно открыть блокнотом файл mission в контейнере миссии, там скопировать необходимую информацию раздела coalitions.

После вставки в новую миссию, нужно проверить id-шники групп и юнитов. Где повторяются заменить.

Вообще без опыта это делать не рекомендую.

Link to comment
Share on other sites

Что не так, как заставить это работать?

 

local gr;

local grps = {"group1","group2","group3","group4","group5"};

for i = 1, 2 do

local r = math.random(1,5);

gr = Group.getByName(grps[r]);

trigger.action.activateGroup(gr);

end;

 

 

Это если без проверки уже активированной группы.


Edited by 29S
Link to comment
Share on other sites

Это если без проверки уже активированной группы.

 

Спасибо. С проверкой, я так понимаю, должно выглядеть так?

 

local gr;
local grps = {"grp #001","grp #002","grp #003","grp #004","grp #005"};
local grpCount = table.getn(grps);
for i = 1, 2 do 
local r = math.random(1,grpCount);
gr = Group.getByName(grps[r]);
trigger.action.activateGroup(gr);
table.remove(grps,r);
grpCount = grpCount - 1;
end;

Link to comment
Share on other sites

Можно открыть блокнотом файл mission в контейнере миссии, там скопировать необходимую информацию раздела coalitions.

После вставки в новую миссию, нужно проверить id-шники групп и юнитов. Где повторяются заменить.

Вообще без опыта это делать не рекомендую.

 

Понял.. Спаибо

зы а опыт то как заработать :) только так..

Попадания: (100%) приехали......

Link to comment
Share on other sites

Спасибо. С проверкой, я так понимаю, должно выглядеть так?

 

Можно и так, если табличка с группами больше не понадобиться.

Link to comment
Share on other sites

  • 1 year later...

что я мог не так написать в этом скрипте ? Не работает в версии 2.5 DCS

 

-- NHNHT:

 

mission.model:addUnit("ru_heli_1");

mission.model:addUnit("ru_heli_2");

 

local _cargo_Place = trigger.misc.getZone("cargo_Place_1");

local _wtch_tower = StaticObject.misc.getByName("cargo_Place_2");

 

local _cargo_Place_number_1 = mission.model:addcargoPlace("штаб первой дивизии", _cargo_Place.point, _cargo_Place.radius, coalition.side.RED);

local _cargo_Place_number_2 = mission.model:addcargoPlace("штаб второй дивизии", _wtch_tower:getPoint(), 75, coalition.side.RED);

 

local _units_templates_1 = {};

local _units_templates_2 = {};

 

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 8, y = 8 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 12, y = 12 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 10, y = 18 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 18, y = 10 } });

 

table.insert(_units_templates_2, { unitType = "SA-18 Igla-S comm", playerCanDrive false, pointofset = { x = 8, y = 8 } });

table.insert(_units_templates_2, { unitType = "SA-18 Igla-S manpad", playerCanDrive false, pointofset = { x = 10, y = 10 } });

table.insert(_units_templates_2, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 14, y = 18 } });

table.insert(_units_templates_2, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 18, y = 14 } });

 

mission.model.cargoPlaces[_cargo_Place_number_1]:addCargoTemplate(

"infantry_1", "UH-1H", 10, _units_templates_1, 3, 3, { altitudeLessThen = 0, speedLessThen = 0, command = 1, }

country.id.RUSSIA, "взвод пехоты");

 

mission.model.cargoPlaces[_cargo_Place_number_1]:addcargoTemplate(

"infantry_2", "UH-1H", 10, _units_templates_2, 3, 3, { altitudeLessThen = 0, speedLessThen = 0, command = 1, }

country.id.RUSSIA, "ђасчЮт Џ‡ђЉ €гла-‘");

 

mission.controiier:start();

 

 

переписывал его один в один в нотепаеде

Link to comment
Share on other sites

что я мог не так написать в этом скрипте ? Не работает в версии 2.5 DCS

 

-- NHNHT:

 

mission.model:addUnit("ru_heli_1");

mission.model:addUnit("ru_heli_2");

 

local _cargo_Place = trigger.misc.getZone("cargo_Place_1");

local _wtch_tower = StaticObject.misc.getByName("cargo_Place_2");

 

local _cargo_Place_number_1 = mission.model:addcargoPlace("штаб первой дивизии", _cargo_Place.point, _cargo_Place.radius, coalition.side.RED);

local _cargo_Place_number_2 = mission.model:addcargoPlace("штаб второй дивизии", _wtch_tower:getPoint(), 75, coalition.side.RED);

 

local _units_templates_1 = {};

local _units_templates_2 = {};

 

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 8, y = 8 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 12, y = 12 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 10, y = 18 } });

table.insert(_units_templates_1, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 18, y = 10 } });

 

table.insert(_units_templates_2, { unitType = "SA-18 Igla-S comm", playerCanDrive false, pointofset = { x = 8, y = 8 } });

table.insert(_units_templates_2, { unitType = "SA-18 Igla-S manpad", playerCanDrive false, pointofset = { x = 10, y = 10 } });

table.insert(_units_templates_2, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 14, y = 18 } });

table.insert(_units_templates_2, { unitType = "infantry_AK", playerCanDrive false, pointofset = { x = 18, y = 14 } });

 

mission.model.cargoPlaces[_cargo_Place_number_1]:addCargoTemplate(

"infantry_1", "UH-1H", 10, _units_templates_1, 3, 3, { altitudeLessThen = 0, speedLessThen = 0, command = 1, }

country.id.RUSSIA, "взвод пехоты");

 

mission.model.cargoPlaces[_cargo_Place_number_1]:addcargoTemplate(

"infantry_2", "UH-1H", 10, _units_templates_2, 3, 3, { altitudeLessThen = 0, speedLessThen = 0, command = 1, }

country.id.RUSSIA, "ђасчЮт Џ‡ђЉ €гла-‘");

 

mission.controiier:start();

 

 

переписывал его один в один в нотепаеде

 

причина в нотепаде, пересохрани этот файл в кодировке "UTF8 без BOM" - например с помощью notepad++

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...