-
Posts
983 -
Joined
-
Last visited
-
Days Won
4
Content Type
Profiles
Forums
Events
Everything posted by BAntDit
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Нет, можно где угодно. Да. См. это сообщение: http://forums.eagle.ru/showpost.php?p=1825944&postcount=160 - пункт 3 и пункт 6 то, что для этого нужно. Там написано для наземки, но это все работает и для вертушек. Создать зону погрузки динамически тоже можно, но не нужно. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Кстати почитал сейчас хотелки в других темах, многие из них реализуются на SSE... Вот что планирую добавить в связи с этим: 1. Добавлю возможность для CargoPlaces загружаться минами. 2. Добавлю возможность минирования с воздуха (с наземки можно тоже сделать, только не знаю нужно или нет). 3. Добавлю саперов и возможность их перевозить. -------------- Не знаю только когда все это успею с реализацией ПВО как-то застрял. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
А это кстати уже, скорее всего, баг самого DCS World-а, спасибо - я раньше не сталкивался. Буду дома, сделаю отдельную миссию для воспроизведения и отрепортю, если воспроизведется. Ошибка кстати из скрипта MSF вылетает, нужно прежде всего проверить есть такая, если отключить MSF или нет... -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Да, timer.scheduleFunction одна из самых полезных функций SSE. Небольшой совет при работе с timer.scheduleFunction: При выполнении schedule function любая возникшая внутри ошибка никак себя не проявит, т.е. в случае ошибки код внутри schedule function просто молча не выполнится, никаким образом не сообщив об этом пользователю и не записав информацию в лог, поэтому я рекомендую для кода внутри schedule function использовать безопасные вызовы pcall или xpcall. Пример: timer.scheduleFunction(function(_data) local _status, _result = pcall(function() -- .. тут внутри pcall ваш полезный код... end); if not _status then -- если ошибка внутри pcall trigger.action.outText('ERROR: ' .. assert(_result, 'unknown reason'), 20); -- сообщаем пользователю env.error('ERROR: ' .. assert(_result, 'unknown reason'), false); -- записываем в лог return nil; -- завершаем работу функции. end return timer.getTime() + 2; end, { rescuerName = 'heli1', pilotName = 'a10c_pilot'}, timer.getTime() + 5); -
Нет, оно есть. 1. Во-первых: В триггерных условиях есть Lua предикат, в котором можно выполнить: local _group = Group.getByName('your_group_name'); if not (_group and _group:isExist()) then return false; end local _controller = _group:getController(); local _targets = _controller:getDetectedTargets(); for _index, _target in ipairs(_targets) do if _target.visible then return true; end -- вижу врага!!! end return false; -- не вижу врага... При желании вы даже можете определять каким конкретно сенсером одни юниты в данный момент видят других. Так что все есть. (примечания: комментарии в скрипте для понимания - в предикат запихивать код с комментариями нельзя.) 2. Во-вторых, то что я написал выше, даже это не самый лучший вариант, потому что логика запихнута в триггерное условие. Каждый миссиодел должен понимать, что каждое триггерное условие отрабатывает каждый кадр игры. Влепили 100 условий в триггерах - все 100 будут конкретно грузить ваш сервер, в лучшем случае пока не выполняться, в худшем всю игру. Чем тяжелее вы нагрузили сервак тем быстрее он вам скажет "Привет", а клиентам "Пока". - оно вам надо?! - при том, что в вашем распоряжении есть на много более эффективная альтернатива: schedule functions (http://en.wiki.eagle.ru/wiki/Part_1#timer). В schedule functions можете запихнуть все проверки любой сложности и задать нужную периодичность их выполнения - эффективность будет на много выше. Так что, господа миссиоделы, за вами выбор, что использовать новые высокоэффективные решения или использовать старые костыли. Если ваш выбор старые костыли, то бог вам судья :) --------------------- IMHO: Импрувить триггерную систему больше не нужно, её возможностей уже достаточно - ибо новые костыли = новые баги + большая вероятность сломать то, что работает. Тестить перед каждым патчем вагон триггерных условий и действий, в разном сочетании как-то совсем не прикольно, а потом читать остроты - типа "че вы баг прощёлкали", "миссии сломались" и т.п. Помните, что каждая хотелка, которая дублирует то что уже есть - это большая вероятность сломать то, что итак хорошо работает
-
Ну вот - что-то типа Авиадартса... А авиабиатлон как-то не представляется реализуемым с точки зрения скоростного прохождения маршрута - что будет, если какой-то азартный пилот все топло сожжет на форсаже ко второму ППМ-у? :)
-
Так на боевых самолетах запили Авиадартс.
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
После создания юнита можешь задачу запустить раз в пару секунд расстояние до него проверять. Не большой пример: timer.scheduleFunction(function(_data) local _rescuer, _pilot = Unit.getByName(_data.rescuerName), Unit.getByName(_data.pilotName); if not (_rescuer and _rescuer:isExist()) then return timer.getTime() + 300;--если нет юнита спасателя, то снова проверить через 5 мин end if not (_pilot and _pilot:isExist()) then return nil; --если некого спасть, то снимаем задачу. end local _rescuer_point, _pilot_point = _rescuer:getPoint(), _pilot:getPoint(); local _distance = math.sqrt( (_rescuer_point.x - _pilot_point.x)^2 + (_rescuer_point.z - _pilot_point.z)^2); if _distance < 5000 then trigger.action.smoke(_pilot_point, trigger.smokeColor.Red); return nil; -- снять задачу end if _distance < 10000 then trigger.action.signalFlare(_pilot_point, trigger.flareColor.Red, 0); end return timer.getTime() + 2; -- повторить через 2 сек. end, { rescuerName = 'heli1', pilotName = 'a10c_pilot'}, timer.getTime() + 5); как-то так... - пишу не проверяя, так как DCS World под рукой нет. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Да, должно прокатить. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Попробуй так: local _object = event.initiator; local _point = _object:getPoint(); local _units = {}; table.insert(_units, { unitType = 'Infantry AK', unitName = 'dynamic_apc_1', playerCanDrive = false, point = { x = _point.x, y = _point.z } }); local _apc_group_desc = mission.utils.getGroupDescriptor('dynamic_apc', { x = _point.x, y = land.getHeight({ x = _point.x, y = _point.z }) + 0.1, z = _point.z }, _units); -------------------------- Хотя странно, насколько помню юнит созданный в воздухе сам оказывается на земле, а юнит созданный в воде тонет. Можешь добавить условие: if land.SurfaceType.WATER ~= land.getSurfaceType({ x = _point.x, y = _point.z }) then -- создавать юнита только в случае, если поверхность под ним не вода -- ... - дальше код создающий юнита end -
Ему трубка ПВД в затылок впилась :D
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Скрипт не видит таблицы mission - это говорит о том, что msf не подключен или подключен как-то не так или подключен позже выполняемого скрипта или кодировка выполняемого скрипта отличается от UTF-8 (без BOM) -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Вот этой: Vec3 function Object.getPoint(Object self) - объектом в данном случае будет юнит-инициатор события. Т.е. обработчик события получит event, а его свойство будет содержать инициатора event.initiator. ----------- Как работать с событиями описано тут: http://en.wiki.eagle.ru/wiki/Simulator_Scripting_Engine/DCS:_World/Part_1#world -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Georgia нужно большими буквами писать: country.id.GEORGIA Если что список всех идентификаторов стран приведен в руководстве по SSE: http://en.wiki.eagle.ru/wiki/Simulator_Scripting_Engine/DCS:_World/Part_1#country вот он: country.id = { RUSSIA, UKRAINE, USA, TURKEY, UK, FRANCE, GERMANY, CANADA, SPAIN, THE_NETHERLANDS, BELGIUM, NORWAY, DENMARK, ISRAEL, GEORGIA, INSURGENTS, ABKHAZIA, SOUTH_OSETIA, ITALY } ----------------- Если нужна автоматическая высадка при атаке группы или юнита, то её нужно вешать на событие onHit соответствующего объекта. Тут в двух словах не объяснить - будет время, сделаю небольшой пример. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
И ещё не большое объявление ещё: Я сейчас сильно занят новой версией MSF, поэтому практически не могу отвлекаться ни на какие другие задачи. Приоритет у меня сейчас такой: 1. Заканчиваю большую внутреннюю переработку MSF - на пользователей и разработчиков миссий это не повлияет, т.е. в миссиях уже существующих ничего менять не нужно будет. Просто делаю некоторое внутреннее окультуривание кода. 2. Из новых возможностей сейчас работаю над ПВО, то что когда начал и забросил - там будет много всего. Описание будет как будет готово. ----- Вот такие две задачи - на что-то другое у меня пока возможности отвлечься не будет, так что сорри за те вопросы, на которое не ответил в личке - пока не получается. -
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Сложность - это издержки универсальности, механизм должен работать для разных условий, от этого много всяких настроек. Хотя то, что делается в ините - в этом не столько сложность, сколько рутинность. Реальная сложность может быть при полноценном использовании механизма обработки событий, который дает MSF - в обработчики событий можно много чего полезного помещать, но пока их широко никто не применяет. ---------------------- Когда-то была такая возможность, но она как-то не прижилась и я её зарубал... :) Можно. What tack what: Погрузка выполняется методом loadCargo(), который автоматически вызывается в погрузочной зоне, никто не мешает вызвать его самостоятельно вручную. 1. Допустим есть какой-то БТР и в редакторе он имеет имя btr_1 2. Делаем из него msf-объект: mission.model:addUnit('btr_1'); - в ините 3. Далее можно грузить груз: -- создаете описание вашего груза: local _my_cargo = { units = _template, -- перечень юнитов задается также, как шаблоны для зон погрузки unloadTime = 10, -- время на выгрузку в сек. groupName = 'my_new_group', -- имя вашей будущей группы из десанта cargoPlace = { point = { x = 0, y = 0, z = 0 }, radius = 1 }, -- просто скопируйте :) countryId = _country_id, -- ИД любой страны, например, country.id.USA conditions = { -- условия высадки altitudeLessThen = nil, speedLessThen = 10, command = 0 } }; mission.model.units['btr-1']:loadCargo(_my_cargo); ------------------- MSF разбит по "классам" - внутренним сущностям игрового мира msfUnit, msfGroup, msfCargoPlace - и т.д. + глобальная структура mission.model, которая хранит их всех вместе и меняется в соответствии с происходящими в игре процессами. Смотря по каким функциям. Есть же руководство: http://forums.eagle.ru/attachment.php?attachmentid=86369&d=1377020704 - оно хоть и не полное, но большинство "открытых" функций там есть. -
Вроде как для этого не нужен Export. События можно экспортировать добавив свой код в соответствующие callback-и в файлах events.lua и server.lua в папке Scripts\net.
-
Так всё можно, мне совсем немного возможностей не хватает - мне надо функцию, которая вернет Vec3 направления обзора юнита (по направлению одного из орудий - пушки или пулемета), а ещё круче VolumePyramid - чтобы сразу пространство обзора получать, тогда без проблем можно наводить артуху по целям в области обзора. (если VolumePyramid отдать сложно (потому что ясно, что на разных юнитах разные сенсоры и их область видимости от кучи всего зависит), я согласен хотя бы направление только получать - область обзора сам смоделирую) Сейчас я могу получить пространственное положение юнита, но это актуально только для корпуса - по факту корпус может быть направлен в одну сторону, башня в другую, зенитный пулемет в третью и пойди знай куда смотрит юнит. (небольшое пояснение: я не беру во внимание функцию getDetectedTargets() - она очень полезная, но она отдает то что видит AI, а в данном случае мне надо целеуказание именно от живого игрока получить) P.S.: может конечно я тут не совсем в тему, т.к. с одной стороны хотелка затрагивает частично CA, с другой стороны возможности SSE, так что бог знает куда её лучше было написать. До этого писал её в английской тестерской ветке по SSE, но может там не удачно расписал - мне на английском тяжеловато мысли формулировать. Могу расписать на русском подробно, только думаю в этой ветке не совсем в тему будет...
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Да, так можно. -
Это все легко бы решалось, если бы была реализована хотелка по Actions Menu (Меню действий) + хотелка по новой функции в SSE для получения Vec3 направления орудия или пулемета, которые я писал ранее - не знаю были они увидены или нет. Хотелки на мой взгляд легко реализуемы и возможностей дают новых много.
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
К сожалению, большая часть из этого не реализуема: Юнит в DCS World это сам ЛА, если ЛА разбился, то оставшийся пилот это уже не юнит. Фигурка пилота - это почти тоже самое, что гражданский трафик, т.е. для пилота уже нет понятия коалиции. Можно, но не в момент приземления, а в момент катапультирования - можно создать любой сигнал, на любой частоте и любой мощности. Событие S_EVENT_PILOT_DEAD (смерть пилота) не сработает, если ЛА уже разбился. Это можно сделать, но в привязке к точке катапультирования, а не точке приземления, а они в свою очередь могут значительно отличаться, в зависимости от того, куда снесло пилота. Т.к. пилот не есть юнит, то механизма погрузки для него не сделать, но вроде как-то можно приземлится так, чтобы фигурка-пилота "застряла" в вертушке и тогда можно будет улететь вместе с ним. -
Поскольку я на ястребах не летал уже давненько, о ракетах воздух-воздух в игре я сейчас помню чуть больше чем ничего. У меня есть пара вопросов знатокам: 1. Если брать в совокупности все ракеты воздух-воздух средней дальности в игре, то какая в среднем получается дальность поражения в заднюю полусферу цели типа А-10 или Су-25 с вероятностью 0.5 и более. 2. Тот же самый вопрос, только в качестве цели AWACS, A-50 или B-52 - вообщем что-то большое и не очень быстрое.
-
Разработка миссии на основе Simulator Scripting Engine
BAntDit replied to BAntDit's topic in Треки, Миссии и Кампании
Обновленный скрипт capture_heliports. Учитывается переход площадок нейтральной коалиции. Полностью не тестировал - это долго. (убедился только, что ничего не падает). capture_heliports.lua -
1. Последний раз такое было при переходе с версии 1.2.1 на 1.2.2 (или когда там добавлялись склады, я не помню точно), ещё были проблемы, когда галочку добавили для активации с задержкой - других случаев не помню и было это уже давным давно. 2. Формат миссий открытый и если что-то и изменилось это всегда можно проверить и внести соответствующие изменения. ------------ Я бы согласился только с тем, что changelog по ME и SSE разработчикам стоило бы делать подробней.
-
Ничего подобного в CoH и CoH 2 нет. -------------- Что, интересно, должно меняться? Если в какой-то миссии условия победы беспощадно тупы, то менять что-то должен тот кто эту миссию создавал. Задать условие на победу по % от общего здоровья всех групп коалиции можно в редакторе обычными триггерами (вроде как ещё со времен ГС2). ----- Так кто мешает создавать миссии не для выноса мозга, а на 100% времени интересного геймплея? Для сравнение посмотрите на комюнити Aram 2 - они для себя создают миссии, которые на серверах крутятся годами, но интерес к ним нисколько не снижается. Что вам мешает в DCS World создавать тоже самое? Я уж молчу, что создание миссий для Arma 2 это более сложный процесс, а некоторые средства DCS World по созданию миссий превосходят армовские.