Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

LuaScript - для RS

Другие вопросы и проблемы разработки дополнений

Re: LuaScript - для RS

Сообщение Света » 03.12.2017, 13:55

Сюрприз оптимизации от TrainSimulator - если локомотив находится дальше нескольких километров от игрока, в нем происходят неприятные изменения. Например, может отключиться звук, отключаются источники света и скрываются ноды, ломается обмен сообщениями, могут самопроизвольно отключиться (или включиться) эмиттеры.
То же касается и функции OnControlValueChange - установка контролов происходит не в момент инициализации локомотива, а в момент, когда игрок оказывается ближе порогового расстояния к этому локомотиву.
Подозреваю, что, при удалении локомотива свыше порогового расстояния, происходит также выгрузка его из памяти, со всеми печальными последствиями.
В результате, если не обновлять все эмиттеры, источники света, звуковую схему и отображение/скрытие нодов каждый кадр (что неправильно, с точки зрения оптимизации), встреча с ботом, который в начале сценария находится на другом конце карты, будет не очень впечатляющей. Возможно, что бот, который генерируется из портала, также будет увечным.
Выход есть. Можно с помощью вызова Call ("getNearPosition") определить расстояние до игрока. Если расстояние больше минимально допустимого (3 км), то инициализацию считать неполной и, как только это расстояние станет ниже порога, провести повторную принудительную инициализацию. Проверено, бот после этого чувствует себя преотлично, даже если проинициализировался на ходу.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Skif » 03.12.2017, 17:22

Учитывая, что метод Initialise тоже довольно странно отрабатывает некоторые начальные установки, дополнение весьма полезное.
Skif
 
Сообщения: 3601
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 391 раз.
Поблагодарили: 1012 раз.
Блог: Просмотр блога (3)
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Света » 03.12.2017, 17:53

Проверено, что Initialise() не отрабатывает вызовы установки контролов "SetControlValue" и команды прямого управления анимацией.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Skif » 03.12.2017, 18:05

Именно. Дизель на старте тоже нормально заглушить получится через раз.

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


Кстати, отмечен приятный плюс - LUA в TS поддерживает ко-рутины, что в некоторой мере позволяет выполнять асинхронные операции. Но как это может быть использовано в игре, требует уточнений. Для более внятной работы скриптов, TS бы сильно не помешал набор методов, определенных в современных игровых движках для повышения надежности - Awake, Destroy, LastUpdate, FixedUpdate и прочая. Вполне ожидаемо, что Initialise, отработав один раз при размещении локомотива в сцене в редакторе (движок не делает различий между сценами редактора и игровой с точки зрения скриптов, только что не запускает Update), с милой улыбкой не срабатывает, если из редактора перейти в геймплей. К счастью, можно написать полную замену этого метода самому (определив пользовательский метод, перегрузить Initialise не получится), и запустить его однократно или любое требуемое число раз из Update. Кстати, это можно использовать и для сохранения кадра скрипта или запуска на выбор "горячего" или "холодного" состояния локомотива, исходя из каких-либо настроек (не уверен, но возможно, это можно повесить на наличие прикрепленного игрока (иконки машиниста на локомотиве) или цифру динамического бортового номера).
Skif
 
Сообщения: 3601
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 391 раз.
Поблагодарили: 1012 раз.
Блог: Просмотр блога (3)
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение BooYa » 03.12.2017, 23:34

Skif писал(а):Дизель на старте тоже нормально заглушить получится через раз.

Много раз запускал игру с глушеным локом, он как был глушеный, так и оставался. Через раз не было. И он не глушился на старте, а изначально был холодный. :dontknow:
Аватара пользователя
BooYa
 
Сообщения: 2571
Зарегистрирован: 24.01.2010, 16:30
Откуда: Екатеринбург
Благодарил (а): 795 раз.
Поблагодарили: 1880 раз.
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Андрей

Re: LuaScript - для RS

Сообщение Skif » 04.12.2017, 10:17

У моей машины дизель глушится вообще прямо в редакторе - но я долго этого добивался, чтобы отработать технологию.
Skif
 
Сообщения: 3601
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 391 раз.
Поблагодарили: 1012 раз.
Блог: Просмотр блога (3)
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение BooYa » 04.12.2017, 15:22

Skif
Ну я описывал то, что лок даже в редакторе не глушится, он просто заглушен. Тыкнул его, и он как вагон поставился, и всё. Запустил игру, сел в лок, завёл и поехал.
Аватара пользователя
BooYa
 
Сообщения: 2571
Зарегистрирован: 24.01.2010, 16:30
Откуда: Екатеринбург
Благодарил (а): 795 раз.
Поблагодарили: 1880 раз.
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Андрей

Re: LuaScript - для RS

Сообщение Света » 30.03.2018, 14:05

Света писал(а):Раз уж пошел разговор о совместимости и разработках, прошу разработчиков при организации межлокомотивной связи бережно относится к этим константам:
Код: Выделить всё
   POSITION_DATA = 1818190202
   PROBE_COUPLINGS = 1818190203
   ENGINE_SYNCHRO_CONTROL = 1818190301
   ENGINE_LOCK_CONTROL = 1818190401
   ENGINE_STATE_QUERY = 1818190501
   ENGINE_REMOTE_CONTROL = 1818190601
   TRANSLATE_CONTROL_VALUE = 1818190701
   DEF_LEADING_LOCOMOTIVE = 1818190801
   INTERVIEW_CONSIST = 1818190901

Так как обмен ещё на стадии разработки, я не могу предоставить протоколы сообщений на каждую константу. По завершении обязательно все будет. А пока что, если понадобится согласование обмена, обращайтесь в ЛС, я опишу протокол на требуемую константу и расскажу, что и зачем используется :cofe:

Обещанное описание можно найти здесь
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Skif » 30.03.2018, 14:27

Предлагаю полезное улучшение на будущее - раз уж с глушением тепловозов/электровозов разобрались, давайте прописывать и отключение источников света в режиме редактора. Делается по аналогии, в том же месте кода, скрытием узлов с лампочками. Быстрее будет работать редактор с вашим подвижным составом.
Skif
 
Сообщения: 3601
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 391 раз.
Поблагодарили: 1012 раз.
Блог: Просмотр блога (3)
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Света » 30.03.2018, 15:02

Код: Выделить всё
-- Список нодов внешнего освещения
TabLightNods = {
[1] = "head_l", [2] = "head_h", [3] = "lig_blr", [4] = "lig_blw", [5] = "lig_brr",
[6] = "lig_brw", [7] = "lig_flr", [8] = "lig_flw", [9] = "lig_frr", [10] = "lig_frw" }
-- Гашение
for k, val in ipairs (TabLightNods) do
   Call("ActivateNode", val, 0)
end
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Skif » 30.03.2018, 15:12

Да, можно и так. Тут много вариантов, в зависимости от того, как собрана модель. У моих, например, имена световых узлов не нумерованные, поэтому в цикле их не вырубишь. Я выключаю и включаю построчно. Полезная пометочка мне на будущее - раз они все равно управляются через контролы кабины, узлы можно и тупо пронумеровать, а не обозначить именами.
Skif
 
Сообщения: 3601
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 391 раз.
Поблагодарили: 1012 раз.
Блог: Просмотр блога (3)
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Света » 05.05.2018, 17:04

Скрипт - генератор для автоматизированного создания номеров ПС.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Света » 16.09.2018, 20:12

По поводу сообщений с идентификатором 4 (REQUEST_TO_PASS_DANGER).
Я говорю о скрипте для путевых объектов на базе signal blueprint.
Есть стандартизированная форма функции OnSignalMessage (message, parameter, direction, linkIndex), при которой происходит сверка на несколько предопределенных типов сообщений, а остальные просто пересылаются дальше. В самом укороченном виде это выгляди так:
Код: Выделить всё
-------------------------------------------------------------------------------------
-- ON SIGNAL MESSAGE
-- Handles messages from other signals.
function OnSignalMessage (message, parameter, direction, linkIndex)

   -- SIGNAL RESET
   if message == RESET_SIGNAL_STATE then
      -- Resets signal state, if scenario is reset
      Initialise ()
   elseif
      -- другие идентификаторы --
   else   
      Call ("SendSignalMessage", message, parameter, -direction, 1, linkIndex)
   end
   
end -- end function OnSignalMessage

Такое решение обладает серьезным недостатком. Запрос на проезд закрытого светофора, отсылаемый игроком, приходит на линк 0 с минусовой стороны, т.е., с противоположной от локомотива игрока! Если этот запрос не обрабатывается в скрипте, он будет просто переслан в противоположную от светофора сторону.
Чтобы с этим бороться и чтобы созданные путевые объекты не блокировали запросы REQUEST_TO_PASS_DANGER, надо следовать двум правилам.
Первое - оснастить все сообщения с идентификатором 4, отсылаемые маркерами или светофорами, каким-нибудь параметром (parameter). Так как движок передает сообщение с пустым параметром, уже будет видно, кто отправитель, особенно если в строке параметра это будет конкретно указано.
Второе - реверсировать сообщение. Причем, реверсировать его в тех случаях, когда оно приходит на линк 0 и не имеет параметра, т.е., является движковым:
Код: Выделить всё
-------------------------------------------------------------------------------------
-- ON SIGNAL MESSAGE
-- Handles messages from other signals.
function OnSignalMessage (message, parameter, direction, linkIndex)

   -- SIGNAL RESET
   if message == RESET_SIGNAL_STATE then
      -- Resets signal state, if scenario is reset
      Initialise ()
   elseif message == REQUEST_TO_PASS_DANGER then
      Call ("SendSignalMessage", REQUEST_TO_PASS_DANGER, parameter, ((linkIndex == 0 and parameter ~= "") and 1 or -direction), 1, linkIndex)
   elseif
      -- другие идентификаторы --
   else   
      Call ("SendSignalMessage", message, parameter, -direction, 1, linkIndex)
   end
   
end -- end function OnSignalMessage
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Re: LuaScript - для RS

Сообщение i2GR » 16.09.2018, 20:54

Решение найдено. Осталось выяснить, решение какой проблемы B)
Аватара пользователя
i2GR
 
Сообщения: 504
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 274 раз.
Поблагодарили: 288 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Света » 16.09.2018, 21:06

Это же просто.
Света писал(а):Запрос на проезд закрытого светофора, отсылаемый игроком, приходит на линк 0 с минусовой стороны, т.е., с противоположной от локомотива игрока! Если этот запрос не обрабатывается в скрипте, он будет просто переслан в противоположную от светофора сторону.
Так как запрос пересылается перехватившим его линком в противоположную сторону от светофора, который требуется открыть, очевидно, что светофор останется закрытым. В этом и заключается проблема: я жму ТАВ, а светофор не открывается, потому что между ним и моим локомотивом стоит маркер, который отзеркаливает мои запросы в никуда.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 480
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 234 раз.
Поблагодарили: 473 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик

Пред.След.

Вернуться в [RW] Другие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1