Jump to content

BAntDit

Members
  • Posts

    983
  • Joined

  • Last visited

  • Days Won

    4

Everything posted by BAntDit

  1. Я как ни пытаюсь, не могу себе представить несущийся истребитель и капельки дождя у него на фонаре. Есть у кого-нибудь видео-пример из реальной жизни? ------------------------- Моя хотелка: Добавьте Progress Bar для процесса загрузки миссии с сервера на клиент. Сейчас при загрузке просто появляется окошко с надписью Loading Mission, но поскольку сетевые миссии становятся всё здоровее, озвучки больше, то иногда не понятно пользователям - то ли всё зависло нафик, то ли до сих пор грузится.
  2. Блин,а вчера вечером запускал, где-то в 18-00 по Москве - обновления не было. Или его принудительно нужно запускать?
  3. Ok, Thank you for your answer. --------------------- By the way, i forgot to say one important detail about this mission http://forums.eagle.ru/attachment.php?attachmentid=73701&d=1353243309 This mission is required Slmod for printing messages for coalitions. If you're gonna check situation with Unit.getGroup in this mission, you have to have installed Slmod on the server or you may replace code with slmod.msg_out on trigger.action.outText. ------------------------- Ok, I'll do my best. But sometimes i can't explain some thing in english, because i speak english not well enough. Some things are difficult to explain even in russian language :)
  4. Да, решение то вообщем-то я сразу нашел. Заменил: local _initiator_group = _unit_initiator:getGroup(); local _report_eng = _initiator_group:getName() .. ', cease fire!!! cease fire!!! You are engaging ' .. _target_group:getName() .. '.'; вот на это: local _report_eng = _unit_initiator:getName() .. ', cease fire!!! cease fire!!! You are engaging ' .. _target_group:getName() .. '.'; Т.е. вместо имен групп использую имена юнитов и всё работает - на RF-е эту миссию с персональной озвучкой по бортам при обстреле своих уже выложили кстати - шикарно работает, добавляет атмосферности. ----- но сам факт такой ошибки как невозможность получить группу инициатора, если ей управляет пользователь-клиент - от самого факта существования это ошибки у меня не спокойно на душе. :) Это я нашел обходное решение конкретно для этой миссии, а вдруг в будущем мне понадобиться не жить не быть получить группу инициатора и будет очень обломно... --------------- неа... сервер знает всё - на то он и сервер :) В сетевой миссии вообщем-то сами скрипты на сервере и выполняются как я понимаю - с клиентами только синхронизируется результат выполнения. И вообщем-то всё отлично работает, но в эту прекрасную работу затесался один косячек. Ещё раз подчеркиваю суть ошибки: из юнита инициатора события нельзя получить группу, если этот юнит под управлением пользователя, вошедшего в миссию как клиент. Т.е. получается разница выполнения скрипта для серверного пользователя и для пользователя-клиента. (Фуф... может конечно, для понятности стоило сделать более маленькую миссию демонстрацию...) Может есть ещё какие-то косяки связанные с сетевой игрой, но я пока нашел тока этот.
  5. Для function trigger.action.radioTransmission(string fileName, Vec3 point, enum radio.modulation modulation, boolean loop, number frequency, number power) - тоже уже исправлено? ------------------------- Кстати функция radioTransmission сейчас самая востребованная для придания реалистичности миссиям и блин именно она не работает. Хотелось бы по ней в первую очередь получить комментарии.
  6. Далее вещи более серьёзные: --------------------------------------------------------- Скрипты для пользователей подключенных к серверу как клиенты и для пользователя зашедшего с самого сервера отрабатывают по разному. Пример в миссии, работает скрипт: (миссию-пример прикрепил к посту - если не понятно тут то смотрите код сразу в ней) перехват события: if (world.event.S_EVENT_HIT == event.id) then local _target_unit_id = event.target:getID(); local _initiator_unit_id = event.initiator:getID(); -- поиск для кого из юнитов событие -- mission.model.units - это мой массив для хранения юнитов -- для которых персонально надо перехватывать события for _unit_key, _unit in pairs(mission.model.units) do local _current_unit = _unit:getDCSWorldUnit(); local _status, _current_unit_id = pcall(function() return _current_unit:getID(); end); if not _status then env.info('не удалось получить ИД объекта ' .. _unit_key .. ', попытка получить объект по имени.', false); _current_unit = Unit.getByName(_unit_key); _status, _current_unit_id = pcall(function() return _current_unit:getID(); end); if _status then env.info('Объект ' .. _unit_key .. ' получен по имени.', false); _unit:setDCSWorldUnit(_current_unit); else env.info('не удалось получить объект ' .. _unit_key .. ' по имени.', false); end end if _status then env.info('Проверка поражения объекта ' .. _unit_key .. ': цель ид: ' .. _target_unit_id .. ', объект ИД: ' .. _current_unit_id, false); if (_target_unit_id == _current_unit_id) then _unit:hit(event); end; env.info('Проверка поражения объектом ' .. _unit_key .. ': инициатор ид: ' .. _initiator_unit_id .. ', объект ИД: ' .. _current_unit_id, false); if (_initiator_unit_id == _current_unit_id) then env.info('Перехвачено событие поражения объекта.', false); _unit:hitting(event); -- генерация для юнита события, того что он по кому-то стреляет end; end end end Если было определено, что юнит (пользователь) по кому-то стреляет: function msfUnit:hitting(eventArgs) -- ищем есть ли для данного юнита обработчик, на тот случай -- если он засадил в кого-нибудь снарядами (или ракетами - это не важно) for _onHittingEventHandlerKey, _onHittingEventHandler in pairs(self.onHitting) do _onHittingEventHandler(self, eventArgs); end end; В данной тестовой миссии обработчик-то как раз есть: function onHittingEventHandler(sender, eventArgs) env.info('запущен обработчик onHittingEventHandler для ' .. sender:getUnitName(), false); local _unit_target = eventArgs.target; local _unit_initiator = eventArgs.initiator; if (nil == _unit_target or nil == _unit_initiator) then return 0; end if (true == _unit_initiator:inAir()) then local _target_coalition = _unit_target:getCoalition(); local _initiator_coalition = _unit_initiator:getCoalition(); if (_target_coalition == _initiator_coalition) then local _target_group = _unit_target:getGroup(); local _initiator_group = _unit_initiator:getGroup(); local _target_position = _unit_target:getPosition(); if (nil == _target_group) then return 0; end local _report_ru = _initiator_group:getName() .. ', прекратить огонь!!! Прекратить огонь!!! Вы ведете огонь по ' .. _target_group:getName() .. '. По своим бьете!'; local _report_eng = _initiator_group:getName() .. ', cease fire!!! cease fire!!! You are engaging ' .. _target_group:getName() .. '.'; if not radioLock then radioLock = true; timer.scheduleFunction(unlockRadio, false, (timer.getTime() + 5)); if (coalition.side.RED == _initiator_coalition) then slmod.msg_out(_report_ru, 20, 'text', 'red'); end if (coalition.side.BLUE == _initiator_coalition) then slmod.msg_out(_report_eng, 20, 'text', 'blue'); end local _initiator_type = _unit_initiator:getTypeName(); if ('A-10C' == _initiator_type) then -- trigger.action.radioTransmission(sender:getUnitName() .. '.ogg', _target_position.p, -- radio.modulation.AM, false, 30, 15500); trigger.action.outSound(sender:getUnitName() .. '.ogg'); else trigger.action.outSound(sender:getUnitName() .. '.ogg'); end else env.info('радио блокировано', false); end end end end; вот, таким образом работает всё в тестовой миссии. (весь код выше привел для того, чтобы потом был понятен смысл stack traceback в описании ошибки, которое будет далее приведена из dcs.log) Начинаем тестировать. Тестировать надо так: 1. Запускаем приложенную к посту миссию на сервере. 2. Заходим в миссию с сервера. 3. Занимаем один из тестовых бортов: Су-25Т 310-ый или A-10C 371-ый, или Су-25Т 661 4. Обстреливаем любой дружественный юнит. 5. Выслушиваем матьки в свой адрес (воспроизведется озвучка, предупреждения огня по своим). - таким образом убеждаемся что для пользователя с сервера всё работает. 6. Подключаемся к миссии клиентом. 7. Занимаем один из тестовых бортов: Су-25Т 310-ый или A-10C 371-ый, или Су-25Т 661 8. Обстреливаем любой дружественный юнит 9. Убеждаемся, что ничерта не работает. (матьки не воспроизведуться :)) 10. Начинаем разбираться почему - открываем файл dcs.log и смотрим, что там. А там вот что: Сразу видим причину: attempt to index local '_initiator_group' (a nil value) т.е. падает в обработчике при попытке получить имя группы вот в этой строке: local _report_eng = _initiator_group:getName() .. ', cease fire!!! cease fire!!! You are engaging ' .. _target_group:getName() .. '.'; а если более конкретно то вот что падает: _initiator_group:getName() Т.е. что получается: local _initiator_group = _unit_initiator:getGroup(); - вот эта строка для сервера и клиента отрабатывает по разному. Для сервер-пользователя: _unit_initiator:getGroup(); - как положено возвращает группу Для клиент-пользователя: _unit_initiator:getGroup(); - возвращает nil _unit_initiator - этот тот самый юнит, который получен при перехвате события из event.initiator. Получается, что для клиент-пользователя этот Объект-юнит приходит какой-то покоцанный. Это есть косяк, господа ED. ---------------------------------- P.S.: если что-то не понятно, я понятию не имею как объяснить понятней... Операция Феникс_test.miz
  7. Далее по передаче радио сигналов: --------------------------------------------------------- function trigger.action.radioTransmission(string fileName, Vec3 point, enum radio.modulation modulation, boolean loop, number frequency, number power) Не работает. Скрипты для тестирования: АМ: unit_source = Unit.getByName('radio_source_1'); unit_source_position = unit_source:getPosition(); trigger.action.outText('Должен звучать радиосигнал', 15); trigger.action.radioTransmission('Su_25T_310_Kutaisi.ogg', unit_source_position.p, radio.modulation.AM, false, 124, 15000); ФМ: unit_source = Unit.getByName('radio_source_1'); unit_source_position = unit_source:getPosition(); trigger.action.outText('Должен звучать радиосигнал', 15); trigger.action.radioTransmission('Su_25T_310_Kutaisi.ogg', unit_source_position.p, radio.modulation.FM, false, 124, 15000); Юнит позиция которого берется за источник стоит близко, мощность взята аж 15 кВт. Для тестирования: 1. Запустить миссию. 2. Сесть в A-10C 3. Убедиться, что рация включена и частота установлен 124. 4. Включить модуляцию АМ. 5. Подождать 10 сек. 6. Убедиться, что ничерта не работает (сигнал не прозвучит). 7. Переключить модуляцию на FM 8. Подождать ещё 10 сек. 9. Снова убедиться, что ничерта не работает. (на ФМ он тоже не прозвучит.) ---------------- Миссию для теста приложил. radioTransmission.miz
  8. Далее по поводу функций текста: ----------------------------------------------------- Про function trigger.action.outTextForGroup(GroupId groupId, string text, Time delay) уже писал - как не работала так и не работает. Теперь протестил: function trigger.action.outTextForCountry(enum country.id country, string text, Time delay) function trigger.action.outTextForCoalition(enum coalition.side coalition, string text, Time delay) Не работают. Симптомы один в один такие же как для функций со звуком, так что примеры даже приводить не буду.
  9. Новые баги по DCS World Scripting Engine. ---------------------------------------------------------------- Начну со звука: function trigger.action.outSoundForCoalition(enum coalition.side coalition, string soundFile) function trigger.action.outSoundForCountry(enum country.id country, string soundFile) function trigger.action.outSoundForGroup(GroupId groupId, string soundFile) Все эти функции не работают! Скрипты для тестирования: Для первой: unit_su25 = Unit.getByName('test_310_su25t'); trigger.action.outSoundForCoalition(unit_su25:getCoalition(), 'Su_25T_310_Kutaisi.ogg'); Для второй: unit_su25 = Unit.getByName('test_310_su25t'); trigger.action.outSoundForCountry(unit_su25:getCountry(), 'Su_25T_310_Kutaisi.ogg'); Для третьей: group = Group.getByName('test_310'); trigger.action.outSoundForGroup(group:getID(), 'Su_25T_310_Kutaisi.ogg'); Результат: Все три функции вылетают с одинаковой ошибкой. Ниже прикрепил скриншоты ошибок и тестовые миссии. Для воспроизведения в тестовой миссии: 1. Запустить миссию. 2. Сесть в Су-25Т (он там один) 3. Подождать 10 сек. 4. Словить баг. ----------------------- P.S. для одаренных: я сам вижу, что в ошибке пишется, что id-группы, страны или коалиции должен быть вторым аргументом, но: 1. В документации написано, что это первый аргумент. 2. Ессесвено, я пробовал передавать их как второй аргумент - один фиг не работает. soundForCoalition.miz soundForCountry.miz soundForGroup.miz
  10. a small question about function env.info: Where does it write messages? I've checked all log's files in folder \Saved Games\DCS World\Logs and i didn't find my messages. Could somebody tell me path to file, where i should seek messages written by function env.info.
  11. http://en.wiki.eagle.ru/wiki/Simulator_Scripting_Engine/DCS:_World_1.2.1/Part_1#env Вопрос: при использовании этих функций info, warning, error - в какой именно файл записываются сообщения, где его найти? Я использую эти функции для записи отладочной информации - сейчас надо стало её посмотреть, я перерыл все возможные файлы логов, но ни в одном из них не могу найти своих сообщений.
  12. i have found my mistake. i did mistake in unit's names. I thought, field 'name' is name of unit. In practice it's name of group. I passed into function value form field "name", instead value form field "pilot".
  13. I have updated from 1.2.1 to 1.2.2 with autoupdate.
  14. I've got one problem after dcs world update 1.2.2: I can not get units of aircrafts in multiplayer game, if they are assigned in mission editor as Client. function Unit.getByName(string name) always return nil, even if unit is under control of player.
  15. Возвращаюсь к этому вопросу. Когда я задавал этот вопрос версия была 1.2.1. и тогда эта функция не работала! Теперь версия уже 1.2.2., т.е. следующая версия уже - функция как не работала, так и не работает - её когда нибудь исправят?
  16. Да, я завтра днем смогу появится в ТС-ке.
  17. Спасибо. Попробую.
  18. У меня готов очередной пример, что можно сотворить, если использовать Scripting Engine для написания миссий. На прошлой неделе Edwardpashkov предложил идею реализовать работу ПВО, так чтобы она выглядела более реалистично, ну вот и сегодня у меня готов пример такой реализации. Как и в прошлый раз это миссия только пример, показывающий способ реализации, но если вы хотите в своей миссии реализовать такую же работу ПВО этот пример вполне может быть взят за основу. Если вам этот пример покажется интересным, но будет не понятно как его перенести в ваши миссии - я могу ответить на любые вопросы или помочь перенести этот механизм в ваши миссии. основные особенности демо-миссии: Предложенная реализация пригодна для использования как в сетевых так и в одиночных миссиях. Никаких особых требований нет. Демо-миссия протестирована мной на DCS World 1.2.2. Ниже приложил два варианта миссии: sam_ambush - с A-10C и sam_ambush_su25 с Su-25T (т.к. пока русский world не вышел, модули есть ещё не у всех.) В скриптах в этот раз комментарии не писал, я думаю код у меня итак вполне читаемый и понятный. миссия содержит всего три скрипта: mission.lua - скрипт с основной функциональностью, в него можно вообще не заглядывать, т.к. он универсальный для всех миссий. init.lua - содержит функции-обработчики событий вхождения в зоны ПВО и выхождения из зон ПВО, связывает обработчики с конкретными юнитами и объектами. on_kill.lua - содержит код, выполняемый при уничтожении некоторых элементов системы ПВО. Будут вопросы спрашивайте. P.S.: жду предложений какие ещё фичи было бы полезно реализовать. :) sam_ambush.miz sam_ambush_su25.miz
  19. Ещё хотелка по редактору: приведите редактор к единым единицам измерения! Сейчас жесть какая-то: Линейка меряет расстояния в футах, радиусы триггерных зон задаются в метрах, высоты прохода ППМ снова в футах, в целом координатная система в метрах. :wacko: Либо пусть футы везде, либо пусть метры.
  20. Ну конечно же, всё что работало на на 1.2.1 на 1.2.2 сдохло как без этого. Сейчас неделю ковыряться искать что изменилось. :mad:
  21. Появилась иконка FC3 в списке возможных модулей.
  22. Надо скрестить пальцы в надежде, что всё, что сделано для создания миссии не сдохнет после обновления.
  23. Сомневаюсь - не может же координатная система из метров в футы масштабироваться при изменении настроек. -------------------------- Самый то прикол, я сейчас повнимательнее прочитал руководство и вот что там написано: Т.е. написано всё таки, что метры, а по факту футы :) В документации тоже ничего не сказано, что ед. измерения в координатной системе от настроек зависят. --------------------------- Извиняюсь, опять ошибся - всё таки координатная система в метрах как и написано в документации. (Я соотносил расстояния с радиусами триггерных зон, думая что ни в футах,а они в метрах оказывается... :wacko:
  24. Всё я разобрался, оказывается координатное расстояние тоже в футах измеряется. У меня просто в скрипте ошибка была, я расстояние до центра одной зоны измерял, а сравнивал с радиусом уже другой - поэтому разница получалась... --------------
  25. У меня офигенский вопрос: в каких единицах измерения измеряются расстояния в координатной системе мира DCS World??? Т.е. если, например, я измерил расстояние между двумя точками, вот так: _distance = math.sqrt(((_unit_position.p.x - _zone.point.x)^2) + ((_unit_position.p.z - _zone.point.z)^2)); , где _zone.point - центр триггерной зоны, _unit_position.p - координаты юнита Это расстояния получилось в ед. измерения координатной системы мира. Как теперь мне это расстояние пересчитать в футы или метры - есть коэффициент какой-нибудь??? Т.е. мне для полного счастья надо сравнивать полученное расстояние с радиусом триггерной зоны, а как я их буду сравнивать, если радиус триггерной зоны в футах, а полученное расстояние хрен знает в чем... Очень нада, памагите!!! - для реализации офигенских фишек в миссиях.
×
×
  • Create New...