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

LuaScript - для RS

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

Re: LuaScript - для RS

Сообщение Mr. Angelo » 19.04.2015, 18:28

Игорь, без tostring-а тоже будет работать. Так зачем платить больше?

Код: Выделить всё
logfile:write( "RETURN_V0 "..RETURN_V0 )
Аватара пользователя
Mr. Angelo
 
Сообщения: 3227
Зарегистрирован: 03.01.2004, 22:22
Откуда: Тюмень
Благодарил (а): 360 раз.
Поблагодарили: 526 раз.
Блог: Просмотр блога (9)
Играю в: Train Simulator Classic
Роль: Сотрудник РЖД
Имя: Андрей

Re: LuaScript - для RS

Сообщение i2GR » 20.04.2015, 02:36

Андрей, иногда оказывается, что надо было проверить переменную, а она nil, и значения true / false через tostring удобно проверять
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Skif » 13.05.2015, 00:36

У меня определенно разрыв шаблона: как заставить код обработать событие изменения состояния контрола Battery в этом скрипте (кусок с функцией обработчика прилагается)?!

Код: Выделить всё
function OnControlValueChange ( name, index, value )

if  Call( "*:ControlExists", name, index ) then
   
   if (name == "t_Battery") then -- проверка состояния батареи.
      Call( "*:SetControlValue", name, index, value );
      if (value == 1) then
      Call ("*:SetControlValue", "Battery", 0, 1);
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "Battery is ON", 5, 1);
      elseif (Call ("*:GetControlValue", "Startup", 0) == -1) and (value < 1) then
      Call ("*:SetControlValue", "Battery", 0, 0);
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "Battery is OFF", 5, 1);
      end
   
   elseif (name == "Battery") then -- Состояние батареи
      Call( "*:SetControlValue", name, index, value );
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "BATTERY BATTERY", 5, 1);
   
      if ( value < 1) then
      -- здесь добавляются НА ВЫКЛЮЧЕНИЕ все питающиеся от батареи потребители
      Call ("*:SetControlValue", "OnControl", 0, 0);
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "CONTROL is OFF", 5, 1);
      end   
   
   elseif (name == "t_Main switch") then -- "Управление общее"
      Call( "*:SetControlValue", name, index, value );
      if ( value == 1) and (Call ("*:GetControlValue", "Battery", 0) == 1) then
      Call ("*:SetControlValue", "OnControl", 0, 1);
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "CONTROL is ON", 5, 1);
      elseif ( value == 0) then
      Call ("*:SetControlValue", "OnControl", 0, 0);
      SysCall("ScenarioManager:ShowAlertMessageExt", "System alert!", "CONTROL is OFF", 5, 1);
      end   
   
   else
      Call( "*:SetControlValue", name, index, value );
   
   end -- end "name =="
end


end


Я в полном ступоре - такое впечатление, что контролы, которые перемещает не игрок, движок игнорирует. Тесты показывают, что в блок Battery скрипт не выходит вообще, кроме одного раза при запуске сценария (что показывает дурацкий месседж "BATTERY BATTERY"). Ребята, помогите, на эти два чертовых контрола вся дальнейшая логика вешается. Если я не разберусь, как эта чертовщина работает, дальше будет только хуже...
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение Mr. Angelo » 13.05.2015, 00:58

В том то и дело, что OnControlValueChange вызывается только, когда контрол меняется через интерфейс игры (с клавы или мышкой). А если в контрол просто пишется значение скриптом, то эта функция не вызывается.
Аватара пользователя
Mr. Angelo
 
Сообщения: 3227
Зарегистрирован: 03.01.2004, 22:22
Откуда: Тюмень
Благодарил (а): 360 раз.
Поблагодарили: 526 раз.
Блог: Просмотр блога (9)
Играю в: Train Simulator Classic
Роль: Сотрудник РЖД
Имя: Андрей

Re: LuaScript - для RS

Сообщение радиомастер » 13.05.2015, 08:05

Skif
t_Battery -это что такое вообще ? кнопка в кабине , нажимаемая рукой ? каким образом меняется значение этого контролла ?
вот например по образцу кнопочного переключения реверса сделай
Код: Выделить всё
    if ( name == "ButtonForward" ) then
         if ( value == 1 ) then
           Call( "*:SetControlValue", "Reverser", 0, 1 );
         end
      elseif ( name == "ButtonBackward" ) then
         if ( value == 1 ) then
           Call( "*:SetControlValue", "Reverser", 0, -1 );
         end
      end
Объекты от радиомастера для RailWorks бесплатно Способ поддержки ПСБ 2200 0303 3116 4229 Save DONBASS People from Kiev Agression
Аватара пользователя
радиомастер
 
Сообщения: 2378
Зарегистрирован: 23.10.2010, 18:42
Откуда: Макеевка
Благодарил (а): 1371 раз.
Поблагодарили: 1888 раз.
Блог: Просмотр блога (4)
Играю в: Train Simulator Classic
Роль: Разработчик
Имя: Костик

Re: LuaScript - для RS

Сообщение le Sandro » 13.05.2015, 09:09

Дима, кажется, спрашивал про поведение трафика.
Почему не отрабатывается скрипт при изменении контрола трафиком?!
Аватара пользователя
le Sandro
 
Сообщения: 2709
Зарегистрирован: 30.03.2005, 00:14
Откуда: Пенза
Благодарил (а): 1610 раз.
Поблагодарили: 1165 раз.
Блог: Просмотр блога (2)
Играю в: Train Simulator Classic
Роль: Разработчик

Re: LuaScript - для RS

Сообщение Skif » 13.05.2015, 10:28

Не трафиком, скриптом.

t_Battery, t_Main switch - тумблеры на пульте. Battery и OnControl - "системные" контролы тепловоза, ведомые этими тумблерами (а OnControl и батареей). Андрей проблему понял верно - как он написал, обработчик не вызывается для контролов, изменяемых движком игры и скриптом. Как тогда работать с ними? Можно ли написать собственный обработчик прерываний и как тогда он должен выглядеть?

Я попробовал только что вписать обработку состояния "внутреннего" контрола Battery в хвост функции OnControlValueChange, вот так:

Код: Выделить всё
... ... ...

end -- end "name =="
end

if (Call ("*:GetControlValue", "Battery",0) == 0 ) then

   Call ("*:SetControlValue", "OnControl", 0, 0);
   
elseif (Call ("*:GetControlValue", "Battery",0) == 1 ) and (Call ("*:GetControlValue", "t_Main switch",0) == 1 ) then
   
   Call ("*:SetControlValue", "OnControl", 0, 1);
   
end

end     -- end of OnControlValueChange



Все заработало. По сути, получилась схема: при любом изменении управляемых контролов, проверить состояние всех контролов пульта и обновить их. Но мне этот вариант не нравится двумя вещами:

1) Может возникнуть ситуация, когда ни один "пользовательский" контрол (с органами управления) не изменился, а опрос провести нужно.

2) Просто не изящно - обновлять весь пульт ради изменения одного параметра. Проще уже тогда вообще не использовать функцию OnControlValueChange (или использовать ее только для обновления контролов, непосредственно происходящих от органов управления и только от них - клапанов свистков, например) , и всю обработку вынести в Update... А это зверски просадит fps.

Добавлено спустя 21 минуту 59 секунд:
У меня есть вариант, как сделать, он мне вроде даже и нравится. Помогите реализовать:


Покажите, как просто вызывать из Update собственную, пользовательскую функцию. Я, пожалуй, напишу собственный обработчик для "внутренних" контролов. Из OnControlValueChange ( name, index, value ) буду передавать name того контрола, который я в ней изменил скриптом, во внешнюю глобальную переременную и буду взводить флаг события "Изменен системный контрол". Из Update я по этому флагу вызову свою функцию, передам в нее Name и обработаю все зависимости этого контрола. Вроде, экономно получается - не будет молотить каждый кадр, а только при изменении нужных контролов.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение i2GR » 13.05.2015, 12:13

Ой-ё-ёй как все в первом куске скрипта все страшно
Skif
По крайне мере согласно последним руководствам SetControlValue и т.п. быстрее вызывать без звездочки, т.е. не как "*:SetControlValue"
Ну и вообще первый кусок написан ... не стандартно.
Контролы не работают для трафика, потому что трафик, как было сказано уже, кнопок и рукояток не нажимает.

Вследствие 1) остается только вариант 2).
Описанный вариант несколько заморочен и по сути своей видится как вариант 1). т.е. обработка все равно ведется по задействованию игроком контролов

По большому счету, если "внутренний" контрол, не используется скриптом симуляции, то вместо него быстрее использовать глобальную переменную
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Skif » 13.05.2015, 13:10

Я сейчас работаю по второму варианту.


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

Re: LuaScript - для RS

Сообщение i2GR » 13.05.2015, 18:12

хм, а есть разница в выводе в текстовик значений переменных или значений контролов?
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Skif » 13.05.2015, 18:21

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

Re: LuaScript - для RS

Сообщение i2GR » 13.05.2015, 19:25

Не вдаваясь в подробности, есть в этом смысл...
кстати а вопрос:
какими средствами проводится опрос состояния контролов самого пульта?
проверить состояние всех контролов пульта и обновить их.
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Re: LuaScript - для RS

Сообщение Skif » 13.05.2015, 19:28

Ты про железный пульт или про пульт, который в кабине тепловоза в игре? Первый - аналоговые контролы вроде валов контроллеров, рукояток кранов машиниста - через HID-устройство. Дискретные контролы - через маппер виртуальной клавиатуры. Если еще немного накрутить скрипт, то можно было бы и от одного устройства посылать, но и так все работает замечательно с практически любым количеством каналов ввода данных. Тестировали с 8 джойстиками по 8 осей каждый и задействовав практически все клавиши клавиатуры - порядка 200 комбинаций.

Второй - через OnControlValueChange, для всех контролов, состояние которых определяется в том числе и кнопками/тумблерами.
Skif
 
Сообщения: 3750
Зарегистрирован: 01.10.2009, 17:42
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Имя: Дмитрий

Re: LuaScript - для RS

Сообщение BooYa » 02.09.2015, 18:15

Подскажите пожалуйста, возможно ли скриптом определить, какой тип локомотива (diesel, electric) подцеплен к составу? Если да, то какой функцией?
Аватара пользователя
BooYa
 
Сообщения: 3750
Зарегистрирован: 24.01.2010, 16:30
Откуда: Екатеринбург
Благодарил (а): 1556 раз.
Поблагодарили: 2968 раз.
Играю в: Train Simulator Classic
Роль: Разработчик
Имя: Андрей

Re: LuaScript - для RS

Сообщение i2GR » 03.09.2015, 00:52

Неизвестна функция подобная, спрашиваешь о какой ты. Пусть информацию эту локомотив сам вагону передавать будет
Аватара пользователя
i2GR
 
Сообщения: 540
Зарегистрирован: 04.09.2008, 16:59
Благодарил (а): 260 раз.
Поблагодарили: 303 раз.
Блог: Просмотр блога (4)
Имя: Игорь

Пред.След.

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

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

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