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

LuaScript - для RS

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

Re: LuaScript - для RS

Сообщение Света » 27.09.2018, 13:16

Это не некропостинг, если что.
ufox писал(а):У меня не получается заставить писать сообщения в лог.
Mr. Angelo писал(а):Есть такая проблема. Раньше писал, LogMate грабил все логи. А после какого-то обновления перестало.
Так что остается только писать в файл

У меня тоже какое-то время не получалось. На самом деле выводить сообщения скрипта в Logmate можно и сейчас, как минимум в TS2015. Для этого надо в CommandLine вписать команду -lua-debug-messages.
Изображение
Что мне нравится - это указание координат мира и пути к главному конфигу для отправителя сообщения. В случае сообщения об ошибке найти виновника совсем просто :D
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 591
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 315 раз.
Поблагодарили: 583 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Skif » 27.09.2018, 13:44

А еще можно просто писать данные в текстовый файл - и читать его асинхронно внешним софтом!


На основе этого метода работает моя система пульта для TS. Единственный на рынке желдорсим, который позволяет оживить приборную доску.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение радиомастер » 16.10.2018, 19:58

Подскажите пожалуйста вот с чем . Имеется три переменных назовем test1, test2 и test3
Как их объединить и отправить одним сообщением сразу , типа так
Код: Выделить всё
Call( "SendConsistMessage", MSGID, test1test2test3,1 )

а на приеме как то разделить чтобы опять на выходе получились test1, test2 и test3 . типа так
Код: Выделить всё
if ( msg == MSGID ) then
      test1 = tonumber(string.sub(argument, 1, 5))
      test2 = tonumber(string.sub(argument, 6,10))
      test3 = tonumber(string.sub(argument, 11, 15))

Напишите простой пример и попроще , мне очень нужно , а то я в координатах и точках запутался много всего туда сюда отправляется (это для трамвая по СМЕ)
Объекты от радиомастера для RailWorks бесплатно помощь R135271646332 Save DONBASS People from Kiev Agression
Аватара пользователя
радиомастер
 
Сообщения: 2315
Зарегистрирован: 23.10.2010, 18:42
Откуда: Макеевка
Благодарил (а): 1207 раз.
Поблагодарили: 1722 раз.
Блог: Просмотр блога (4)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Костик

Re: LuaScript - для RS

Сообщение Света » 16.10.2018, 20:49

Вариант, может и не проще, но надежнее.
Отсылка. Все переменные записываются в одну строку, разделенные двоеточиями и отсылаются:
Код: Выделить всё
local message = test1..":"..test2..":"..test3
Call ("SendConsistMessage", MSGID, message, 1)

В месте приема эта строка разбивается на отдельные фрагменты, которые помещаются в специально созданную таблицу (table_tests) по порядку:
Код: Выделить всё
if (msg == MSGID) then
   local table_tests = string.split (argument, ":")
   test1 = tonumber (table_tests[1])
   test2 = tonumber (table_tests[2])
   test3 = tonumber (table_tests[3])
end

Тот кусок, что был в строке первым, будет в ячейке №1, второй - в ячейке №2 и т.д.. Преимущества метода - переменные test1, test2 и test3 никогда не перепутаются, так как они всегда будут рассортированы в порядке, по которому склеивались в строку. При этом их не надо форматировать, так как длина не имеет значения, хоть 1, хоть 1.001 - все будет разделено корректно.
Вот использованная функция string.split ():
Код: Выделить всё
function string:split(delimiter)
   local result = { }
   local from  = 1
   local index = 1
   local delim_from, delim_to = string.find( self, delimiter, from  )

   while delim_from do
      result[index] = string.sub(self, from , delim_from - 1)
      from  = delim_to + 1
      delim_from, delim_to = string.find( self, delimiter, from  )
      index = index + 1
   end

   result[index] = string.sub(self, from)

   return result
end
Её надо вставить в любое место скрипта.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 591
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 315 раз.
Поблагодарили: 583 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение радиомастер » 16.10.2018, 20:54

А две точки перед и за двоеточием обязательно ?
Объекты от радиомастера для RailWorks бесплатно помощь R135271646332 Save DONBASS People from Kiev Agression
Аватара пользователя
радиомастер
 
Сообщения: 2315
Зарегистрирован: 23.10.2010, 18:42
Откуда: Макеевка
Благодарил (а): 1207 раз.
Поблагодарили: 1722 раз.
Блог: Просмотр блога (4)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Костик

Re: LuaScript - для RS

Сообщение Света » 16.10.2018, 20:58

Да, это оператор, указывающий, что данные, между которыми находятся эти точки, надо соединить в одну строку. В результате получится одна строка "test1:test2:test3". Двоеточия же в этой строке - это метки, указывающие места, по которым надо разбивать строку.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 591
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 315 раз.
Поблагодарили: 583 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 20.11.2018, 22:19

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

Re: LuaScript - для RS

Сообщение Света » 23.12.2018, 13:43

Удалось обнаружить один нюанс в работе скрипта. Оказывается, lua в симуляторе по логике работы отличается от стандартного lua. Отличие проявляется в обработке больших чисел, я предполагаю, что lua в симуляторе использует 32-й бит для своих нужд, ограничивая таким образом максимальную длину числа в 31 бит.
Мнение это у меня появилось после наблюдений, как скрипт, запущенный на lua "из коробки" дал один результат (правильный), этот же скрипт, запущенный в симуляторе, выдал совершенно другой результат. Например, если сделать простое арифметическое действие (4294967295 - 3534543), мы в симуляторе получим 4291432704, тогда как правильный ответ - 4291432752. Такие ошибки проявляются постоянно, если обрабатываются большие числа.
Этот нюанс сказывается в том числе на работе распространенных в сети функций битовых операций. Они или виснут, или возвращают некорректный результат.
Если, все же, требуется выполнить битовые операции, я могу предложить, как альтернативу, набор более "жестких" функций, по сравнению с другими. Они могут уступать в быстродействии, но зато, по крайней мере, обрабатывают 32-разрядные числа без проблем и заточены именно под них.
Код: Выделить всё
function To_Bin (num)
   local temp, bin, i = 0, {}, 0
   repeat
      temp = num
      num = math.floor(num / 2)
      table.insert (bin, 1, (temp - num * 2) ~= 0 and "1" or "0")
      i = i + 1
   until num == 0
   bin = string.rep("0", 32 - i)..table.concat(bin)
   return bin
end

function BitXOR (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, string.sub (a, i, i) == string.sub (b, i, i) and "0" or "1")
   end
   return tonumber (table.concat(res), 2)
end

function BitNOT (num)
   num = To_Bin (num)
   local res = {}
   for i = 1, 32 do
      table.insert (res, string.sub (num, i, i) == "1" and "0" or "1")
   end
   return tonumber (table.concat(res), 2)
end

function BitAND (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, (string.sub (a, i, i) == "1" and string.sub (b, i, i) == "1") and "1" or "0")
   end
   return tonumber (table.concat(res), 2)
end

function BitOR (a, b)
   a = To_Bin (a)
   b = To_Bin (b)
   local res = {}
   for i = 1, 32 do
      table.insert (res, (string.sub (a, i, i) == "1" or string.sub (b, i, i) == "1") and "1" or "0")
   end
   print (table.concat(res))
   return tonumber (table.concat(res), 2)
end

function rshift (x, by)
   return math.floor (x / 2 ^ by)
end

function lshift (x, by)
  return x * 2 ^ by
end

Функции сдвига не мои, я их выкладываю просто для комплектности, так как конкретно эти функции поддерживаются симулятором.

Добавлено спустя 7 часов 20 минут 3 секунды:
Также в симуляторном lua не работают функции math.fmod (a, b) string.reverse (s). Теоретически функцию math.fmod (a, b) можно заменить на math.mod (a, b). У меня же успешно работают эти функции:

Код: Выделить всё
function reverse (s)
   local table_char = {}
   for i = 1, string.len (s) do
      table.insert (table_char, 1, string.sub (s, i, i))
   end
   return table.concat(table_char)
end

function mod (a, b)
   return a - (math.floor(a/b)*b)
end
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 591
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 315 раз.
Поблагодарили: 583 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 20.03.2019, 14:26

Если кому интересно, для определения максимального числа из нескольких, "тернарный оператор" в lua работает быстрее базовых функций примерно на 33%. Это если сравнивается 2 или 3 числа (0.159 против 0.215 и 0.168 против 0.222 мксек соответственно).
Если же чисел 4, то скорость "тернарного оператора" выше уже всего на 25% (0.196 против 0.245 мксек)
При этом, если в сравнении участвуют глобальные переменные, скорость работы очень сильно падает. Для сравнения 4 глобальных переменных потребовалось уже 0.332 и 0.327 мксек. При этом, если предварительно переписать глобальные переменные в локальные и сравнивать именно локальные, скорость повышается (0.239 и 0.332 мксек).
Вывод: быстрее всего обрабатываются локальные переменные. Даже перезагрузка значений из глобальных переменных в локальные выгоднее по времени. Для расчета минимального или максимального значения из группы до 5 переменных более быстрым будет "тернарный оператор".

Самый плохой код (затративший 0.334 мксек):
Код: Выделить всё
   A, B, C, D = 10, 40, 30, 20
   max = math.max (A, B, C, D)

Самый быстрый код (затративший 0.166 мксек):
Код: Выделить всё
   local a, b, c, d = 10, 40, 30, 20
   max = (a > b and a > c and a > d) and a or (b > c and b > d) and b or c > d and c or d
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 591
Зарегистрирован: 18.06.2016, 19:38
Благодарил (а): 315 раз.
Поблагодарили: 583 раз.
Блог: Просмотр блога (7)
Играю в: Train Simulator 2018
Роль: Разработчик
Имя: Пандора

Re: LuaScript - для RS

Сообщение Света » 28.05.2019, 10:22

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

Re: LuaScript - для RS

Сообщение BooYa » 28.05.2019, 19:28

Стоит добавить, что речь идёт о старом LogMate, который был до 2019 сима. 19 сима у Светы нет, насколько я знаю, не проверялось.

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

Пред.

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

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

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

cron