Jump to content

Помощь разработчику миссий


StarLey_Andrew

Recommended Posts

  • ED Team
32 минуты назад, grinya-lg сказал:

Предполагаю, что у меня на этом диске редактируется компания.

Если диск на месте, то проблема поидее не должна была возникнуть. Странно все это, никогда такого у меня не было. Возможно плохая идея брать файл из корня диска, а не из папки.

Link to comment
Share on other sites

8 минут назад, SL PAK сказал:

Если диск на месте, то проблема поидее не должна была возникнуть. Странно все это, никогда такого у меня не было.

Но миссии с которыми работаю всегда держу в игровой папке пользователя.

Просто у меня, фалы миссий, компаний, аудифайлы, фото хранятся в одном месте на отдельном диске и дам уже чёрт ногу сломит. А эту компанию, что бы не искать на отдельный кинул, отредактировал скопировал в DCS, компания зер гуд работает. Диск на месте. Но случилась эта проблема, которую помог решить испанский коллега. Сам я пользователь компьютера не скажу, что опытный.
З.Ы. Добавлю, отдельно всё держу т.к. был печальный опыт когда накрылся SSD с виндой и пришлось всё заново нарабатывать. А так всё на разных дисках.


Edited by grinya-lg

Intel Core i5-12400F, MSI MAG B760M MORTAR DDR4, DDR4 32GB, Colorful iGame GeForce RTX 3050 Ultra W DUO OC, T.Flight Hotas X, Gladiator NXT EVO SCG Premium, Logitech Flight Rudder Pedals

Link to comment
Share on other sites

  • ED Team
16 минут назад, grinya-lg сказал:

Добавлю, отдельно всё держу т.к. был печальный опыт когда накрылся SSD с виндой и пришлось всё заново нарабатывать. А так всё на разных дисках.

Это нормально. У меня все нужные миссиям файлы хранятся на отдельном диске в папке синхронизирующейся с облаком. В папке пользователя только файлы miz находящиеся в работе.

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

Link to comment
Share on other sites

Здравствуйте! Хотел задать такой вопрос по  целеуказанию для бота. Игрок - F-14  с лантирна подсвечиваю лазером цель. Бот - Мираж 2000С - Задача атака точки на карте ( в непосредственной близости от подсвечиваемой цели) - сбрасывает ГБУ-12 (коды лазеров бомбы и подсвета в настройках совпадают) с горизонтального полёта. С внешних видов на ГБУ видно как бомба начинает "подруливать" и попадает не в подсвечиваемую цель, а в точку указанную в редакторе. Подскажите пожалуйста как в редакторе возможно осуществить внешнее ЦУ для бота. Заранее спасибо

 

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

  • Like 1
Link to comment
Share on other sites

05.12.2021 в 15:45, bvv.81 сказал:

Здравствуйте! Хотел задать такой вопрос по  целеуказанию для бота. Игрок - F-14  с лантирна подсвечиваю лазером цель. Бот - Мираж 2000С - Задача атака точки на карте ( в непосредственной близости от подсвечиваемой цели) - сбрасывает ГБУ-12 (коды лазеров бомбы и подсвета в настройках совпадают) с горизонтального полёта. С внешних видов на ГБУ видно как бомба начинает "подруливать" и попадает не в подсвечиваемую цель, а в точку указанную в редакторе. Подскажите пожалуйста как в редакторе возможно осуществить внешнее ЦУ для бота. Заранее спасибо

 

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

Попробуйте поставить боту не атаку точки на карте. 

Link to comment
Share on other sites

Добрый день! А подскажите пожалуйста, как решить такую задачку: Самолет Хорнет.

1. У меня остаток топлива меньше 30% - поднять флаг. ( Ну или остаток топлива такой то)

2. У моего ведомого  - остаток топлива меньше 30% - поднять флаг.

3. Запрос ведомого на остаток топлива.


Edited by Redneck
уточнения
Link to comment
Share on other sites

  • ED Team
4 часа назад, Redneck сказал:

У моего ведомого  - остаток топлива меньше 30% - поднять флаг.

Флаг по топливу бота можно поднять только с помощью скрипта на lua. Примеры таких скриптов выкладывались где-то рядом с этим местом форума: 

 

Link to comment
Share on other sites

38 минут назад, SL PAK сказал:

Флаг по топливу бота можно поднять только с помощью скрипта на lua. Примеры таких скриптов выкладывались где-то рядом с этим местом форума: 

 

Страница 70 🙂 Я изучил ее как мог, но там просто выдает топливо больше или меньше в действии. А мне это надо в условии. Грубо во втором слобце.

Link to comment
Share on other sites

2 часа назад, Redneck сказал:

Страница 70 🙂 Я изучил ее как мог, но там просто выдает топливо больше или меньше в действии. А мне это надо в условии. Грубо во втором слобце.

Тебе нужно запускать проверку топлива раз в N секунд, этого можно добиться несколькими способами, первый примерно как kievbsm посоветовал, через флаги сообразить цикл и либо выполнять там в предикате проверку, либо запускать функцию скрипта. Либо через Lua же все время планировать функцию проверки, примерно так:

MyMission = {}

function MyMission.checkFuel()
    local unit = Unit.getByName("UnitName")
    if 30 > unit:getFuel() * 100 then
        trigger.action.setUserFlag("1", 1)
        trigger.action.outString("Fuel is less than 30%")
        return nil --больше не проверять
    else
        return timer.getTime() + 10--проверить снова через 10 секунд
    end
end

timer.scheduleFunction(MyMission.checkFuel, {}, timer.getTime()+10 )

Метод getFuel коварный, он за 1 единицу считает вместимость только внутренних баков, а подвесные будут как бы сверху, т.е. для например для полного хорнета с 3мя баками он вернет примерно 1.7. Поэтому имхо лучше считать топливо в единицах массы, но я сходу не подскажу как.

 

P.S. Конкретно этот скрипт на работоспособность не проверял. "UnitName" надо заменить на нужное имя.

Верните короновирус в качестве главной проблемы, спать в маске буду, обещаю.

Скрытый текст

Hardware: AMD 5900x, 64Gb RAM@3200MHz, NVidia RTX3070 8Gb, Monitor 3440x1440(21:9), Samsung 980pro 1Tb NVMe SSD, VKB Gunfighter+MCGU, Virpil Throttle CM3, VKB T-Rudder, TrackIR.

 

Link to comment
Share on other sites

12 часов назад, Blackfyre сказал:

Тебе нужно запускать проверку топлива раз в N секунд, этого можно добиться несколькими способами, первый примерно как kievbsm посоветовал, через флаги сообразить цикл и либо выполнять там в предикате проверку, либо запускать функцию скрипта. Либо через Lua же все время планировать функцию проверки, примерно так:

MyMission = {}

function MyMission.checkFuel()
    local unit = Unit.getByName("UnitName")
    if 30 > unit:getFuel() * 100 then
        trigger.action.setUserFlag("1", 1)
        trigger.action.outString("Fuel is less than 30%")
        return nil --больше не проверять
    else
        return timer.getTime() + 10--проверить снова через 10 секунд
    end
end

timer.scheduleFunction(MyMission.checkFuel, {}, timer.getTime()+10 )

Метод getFuel коварный, он за 1 единицу считает вместимость только внутренних баков, а подвесные будут как бы сверху, т.е. для например для полного хорнета с 3мя баками он вернет примерно 1.7. Поэтому имхо лучше считать топливо в единицах массы, но я сходу не подскажу как.

 

P.S. Конкретно этот скрипт на работоспособность не проверял. "UnitName" надо заменить на нужное имя.

error.jpg

Link to comment
Share on other sites

Вот, получилось! Проверяет каждые 30 сек. до остатка 40%

MyMission = {}

function MyMission.checkFuel()
    local unit = Unit.getByName("xxx")
    if 40 > unit:getFuel() * 100 then
        trigger.action.setUserFlag("2", 1)
        return nil --больше не проверять
    else
        return timer.getTime() + 30--проверить снова через 30 секунд
    end
end

timer.scheduleFunction(MyMission.checkFuel, {}, timer.getTime()+30 )

Link to comment
Share on other sites

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

trigger.action.outText('ВТОРОЙ: ОСТАТОК: ' ..  string.format("%d", Group.getByName('Самолетная группа'):getUnit(2):getFuel() * 980 * 11.071) .. ' ft.', 10, true)

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

А мысль, чтобы каждый раз по запросу показывал. Есть какие идеи?

Link to comment
Share on other sites

Э... ИМХО ,может так: в триггерах запрос в радиоменю-флаг, в самом скрипте проверка флага и в конце куска его сброс на false? Всё равно в скрипте реализована повторяющаяся функция.

Link to comment
Share on other sites

8 минут назад, Olle1004 сказал:

Э... ИМХО ,может так: в триггерах запрос в радиоменю-флаг, в самом скрипте проверка флага и в конце куска его сброс на false? Всё равно в скрипте реализована повторяющаяся функция.

Может. Просто я не умею это делать

Link to comment
Share on other sites

8 минут назад, Olle1004 сказал:

trigger.misc.getUserFlag( 1 ) == true

 

Могу я Вас попросить весь скрипт прописать? Со сбросом. Флаг на страбатывание ну пусть будет 3, значение 1. 

Link to comment
Share on other sites

Думаю, что так. Извиняюсь, давно уже не писал скрипты, после того, как чуть мозг себе не сжёг, компонуя куски кода MOOSE в единый скрипт. 😐

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

MyMission = {}

local sub = "Команда в меню F10" -- заголовок пункта меню
if trigger.misc.getUserFlag(3) == false then return end -- проверка на срабатывание пункта меню
 function MyMission.checkFuel()
    local unit = Unit.getByName("xxx")
    if 40 > unit:getFuel() * 100 then
        trigger.action.setUserFlag("2", 1)
        return nil --больше не проверять
    else
        missionCommands.removeItem(sub) -- удаление пункта меню
        missionCommands.addCommand(sub) -- возврат пункта меню в исходное состояние
        return timer.getTime() + 30--проверить снова через 30 секунд
    end
 end

timer.scheduleFunction(MyMission.checkFuel, {}, timer.getTime()+30 )


https://wiki.hoggitworld.com/view/DCS_func_getUserFlag


Edited by Olle1004
Link to comment
Share on other sites

14.12.2021 в 20:38, Olle1004 сказал:

Думаю, что так. Извиняюсь, давно уже не писал скрипты, после того, как чуть мозг себе не сжёг, компонуя куски кода MOOSE в единый скрипт. 😐

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

MyMission = {}

local sub = "Команда в меню F10" -- заголовок пункта меню
if trigger.misc.getUserFlag(3) == false then return end -- проверка на срабатывание пункта меню
 function MyMission.checkFuel()
    local unit = Unit.getByName("xxx")
    if 40 > unit:getFuel() * 100 then
        trigger.action.setUserFlag("2", 1)
        return nil --больше не проверять
    else
        missionCommands.removeItem(sub) -- удаление пункта меню
        missionCommands.addCommand(sub) -- возврат пункта меню в исходное состояние
        return timer.getTime() + 30--проверить снова через 30 секунд
    end
 end

timer.scheduleFunction(MyMission.checkFuel, {}, timer.getTime()+30 )


https://wiki.hoggitworld.com/view/DCS_func_getUserFlag

 

Ох вот да - это та же причина, почему я отказался от кодирования и имею понимание, что этим могут заниматься люди только с крепкой психикой и умеющие переключаться.

Я наверное не очень точно объяснил, чего я хотел. Попробую подробнее 🙂

Я периодически ваяю миссии, и стараюсь их делать так, чтоб во время одной миссии могло быть несколько вариантов развития. Назначать цели и поднимать противника случайными флагами. Еще больше «запутать миссию» на выполнение на мой взгляд можно еще только при правильном использовании ведомого в полную силу. И вот тут выскакивает беда - Очень не логично он порой тратит керосин, и потому не понимая остатка - трудно порой определить стратегию. Например - патрулируем мы, и тут появляются цели. Понимая сколько у него горючки можно принять решение, самому идти на разборки или его отправить. Вторая беда, когда второй выдаёт БИНГО, у него далеко не всегда хватает топлива на то, чтобы долететь до точки и сесть. 

Вторую проблему вроде как совместными усилиями решили - он один раз выдаёт - остаток менее 40% и отправляем его на точку, понимая, что он не боец. 

И вот осталась первая проблема - выдавать по запросу остаток топлива.  Тот скрипт что я нашел он выдаёт на постоянку, и мешает работать миссии в остальном. А вот то, что сделали Вы - это ж скрипт, который промеряет остаток топлива только на то, что он более 40%

А скрипт который нужно модифицировать вот

trigger.action.outText('ВТОРОЙ: ОСТАТОК: ' ..  string.format("%d", Group.getByName('Самолетная группа'):getUnit(2):getFuel() * 980 * 11.071) .. ' ft.', 10, true)

 

 


Edited by Redneck
Link to comment
Share on other sites

  • ED Team
2 часа назад, Redneck сказал:

Очень не логично он порой тратит керосин

А вы после взлета даете ему быстро вас догнать? Он же на форсаже в строй стремится.

Link to comment
Share on other sites

5 часов назад, SL PAK сказал:

А вы после взлета даете ему быстро вас догнать? Он же на форсаже в строй стремится.

Да, стараюсь им быстро дать себя догнать. Беда, что он на форсаже и противника атакует и на нем же в строй спешит 🙂 Наверное )

Link to comment
Share on other sites

  • ED Team
1 час назад, Redneck сказал:

Беда, что он на форсаже и противника атакует и на нем же в строй спешит 🙂 Наверное )

Я не пробовал так ограничивать ведомого,  но можно попробовать прописать в триггерах группы игрока две модели поведения:

- не использовать форсаж;

- использовать форсаж.

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

 

Или просто прямо в ИПМ навсегда запретить группе игрока форсаж. Ведомые будут летать на максимале максимум.

Link to comment
Share on other sites

10 часов назад, Redneck сказал:

Ох вот да - это та же причина, почему я отказался от кодирования и имею понимание, что этим могут заниматься люди только с крепкой психикой и умеющие переключаться.

Программирование - это не это не только про написание кода, это в большей степени про продумывание логики. Составление миссии на триггерах и флагах - тоже вполне себе программирование, только, ИМХО, менее удобное чем в виде кода. На первый взгляд выглядит проще, но как только нужно сделать нечто более сложное, то все - ппц. А разобраться в более менее сложной миссии на триггерах(не своей, или своей, которую полгода не видел) уже даже на первый взгляд не просто.

 

10 часов назад, Redneck сказал:

Вторую проблему вроде как совместными усилиями решили - он один раз выдаёт - остаток менее 40% и отправляем его на точку, понимая, что он не боец. 

И вот осталась первая проблема - выдавать по запросу остаток топлива.  Тот скрипт что я нашел он выдаёт на постоянку, и мешает работать миссии в остальном. А вот то, что сделали Вы - это ж скрипт, который промеряет остаток топлива только на то, что он более 40%

Ниже скрипт, который решает вроде как обе твои проблемы, если я их правильно понял. Добавил еще возможность работать с группами с любым количеством самолетов(2-4). Во вложении проверочная миссия (скрипт важно запускать из триггера, как в ней). Чтобы чуть поднастроить под себя, можно менять параметры, отмеченные комментариями.

MyMission = {}
MyMission.cmdReportFuelState = "Доложить статус топлива" --текст пункта меню F10
MyMission.groupName = "USN_Hornet" --имя группы, заменить на свое из миссии
MyMission.threshold = 0.4 -- остаток топлива, о котором докладывать без запроса
MyMission.msgSeconds = 20 -- время показа сообщений в секундах
MyMission.checkDelay = 10 -- время между проверками остатка топлива
MyMission.groupUnits = {} 

function MyMission:initRadioMenu()
    missionCommands.addCommand(self.cmdReportFuelState, nil,
                               self.reportFuelState, self)
end

function MyMission:initGroupUnits()
    for i, u in pairs(Group.getByName(self.groupName):getUnits()) do
        if u:getPlayerName() == nil then
            table.insert(self.groupUnits, u)
        end
    end
end

function MyMission.checkFuel(param)
    for i, u in ipairs(param.groupUnits) do
        if u:getPlayerName() == nil then
            if u:getFuel() < param.threshold then
                param:outFuelReport(Group.getByName(param.groupName), u)
                table.remove(param.groupUnits, i)
            end
        end
    end
    if #param.groupUnits == 0 then
        trigger.action.outText("All out of fuel", 10, false)
        return nil --all below threshold, end checks
    else
        return timer.getTime() + param.checkDelay
    end
end

function MyMission:outFuelReport(group, u)
    trigger.action.outTextForGroup(group:getID(),
                                   string.format("%s топлива %0.2f", u:getName(), u:getFuel()),
                                   self.msgSeconds, false)
end

function MyMission.reportFuelState(param)
    local group = Group.getByName(param.groupName)
    for i, u in pairs(group:getUnits()) do
        if u:getPlayerName() == nil then
            param:outFuelReport(group, u)
        end
    end
end

timer.scheduleFunction(MyMission.checkFuel, MyMission, timer.getTime()+MyMission.checkDelay )
MyMission:initRadioMenu()
MyMission:initGroupUnits()

 

ReportFuel.miz

1 час назад, SL PAK сказал:

Я не пробовал так ограничивать ведомого,  но можно попробовать прописать в триггерах группы игрока две модели поведения:

- не использовать форсаж;

- использовать форсаж.

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

 

Или просто прямо в ИПМ навсегда запретить группе игрока форсаж. Ведомые будут летать на максимале максимум.

Боты как-то непредсказуемо используют форсаж, если при полете по маршруту опция поведения спасает, то например на патрулировании ее использовать не стоит, а то они и в воздушный бой полетят без форсажа. А они зачем-то в ожидании на круге иногда тоже форсаж включают с неизвестной целью🙁

  • Like 2

Верните короновирус в качестве главной проблемы, спать в маске буду, обещаю.

Скрытый текст

Hardware: AMD 5900x, 64Gb RAM@3200MHz, NVidia RTX3070 8Gb, Monitor 3440x1440(21:9), Samsung 980pro 1Tb NVMe SSD, VKB Gunfighter+MCGU, Virpil Throttle CM3, VKB T-Rudder, TrackIR.

 

Link to comment
Share on other sites

  • ED Team
9 минут назад, Blackfyre сказал:

А они зачем-то в ожидании на круге иногда тоже форсаж включают с неизвестной целью🙁

Если им не задана слишком высокая скорость на ожидании, то это звучит как баг. Если бот в круизном режиме на ожидании зачем-то врубает форсаж, то нужно воспроизвести в треке и поделиться с тестерами. Исправят.

Link to comment
Share on other sites

19 минут назад, SL PAK сказал:

Если им не задана слишком высокая скорость на ожидании, то это звучит как баг. Если бот в круизном режиме на ожидании зачем-то врубает форсаж, то нужно воспроизвести в треке и поделиться с тестерами. Исправят.

Я с этим уже довольно давно сталкилвался(в апреле примерно), может уже и поправили. А так у меня Су-27 меня от вражеских ястребов охраняли и во время тестов миссии я пару раз удивлялся, когда они возвращались слишком рано. При просмотре трэков сначала узнал о опции "отлючить форсаж", а потом, что и в круге ожидания они его иногда(!) пользуют. Скорости там адекватные были, что-то около 0.6Маха на 10 километрах. Еще раз столкнусь - сделаю репорт.

Верните короновирус в качестве главной проблемы, спать в маске буду, обещаю.

Скрытый текст

Hardware: AMD 5900x, 64Gb RAM@3200MHz, NVidia RTX3070 8Gb, Monitor 3440x1440(21:9), Samsung 980pro 1Tb NVMe SSD, VKB Gunfighter+MCGU, Virpil Throttle CM3, VKB T-Rudder, TrackIR.

 

Link to comment
Share on other sites

  • Recently Browsing   0 members

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