Страница 6 из 18

Re: LuaScript - для RS

СообщениеДобавлено: 03.09.2015, 02:37
BooYa
i2GR, да насчет того, о чем ты говоришь, я знаю, и это естественно самый простой и логичный путь. Но я почему спрашивал то. Как известно, пассажирские вагоны топятся двумя способами: 1) Углем 2)От электрической цепи электровоза пинчами. И подобная функция позволила бы реализовать оба типа. Но локов я никаких не разрабатываю, существующие локи никто переделывать не будет, а уж какие-то зарубежные и подавно работать не будут. И это печалька(

Re: LuaScript - для RS

СообщениеДобавлено: 03.09.2015, 08:36
Linx
Стесняюсь спросить... НАХУА?! Надо еще тогда сделать скрипт переполнения унитаза :)))

Re: LuaScript - для RS

СообщениеДобавлено: 03.09.2015, 09:15
Skif
Спрошу по схожей тематике: если стоит задача отправить сообщение от локомотива по составу, как реализовать "сквозной проход" сообщения по поезду до хвостового вагона, вне зависимости от того, нужна обработка этого сообщения или нет? Т.е. можно ли вызывать SendConsistMessage из функции-обработчика для ретранслирования сообщения дальше по составу в том же направлении, не приведет ли это к зацикливанию вагона "сам на себя" ?

Re: LuaScript - для RS

СообщениеДобавлено: 03.09.2015, 18:36
BooYa
Linx писал(а):НАХУА?!

Захуа, что я хочу в РВ катать вагоны, которые и печкой будут дымить под тепловозом, и электричеством питаться от электровоза. Если есть возможность в игре это реализовать, почему нет то? Плюс, будет уже полноценная база работоспособных вагонов, на основе которой, кто-нибудь когда-нибудь в будущем, сможет сделать вагоны других типов, рестораны, почтово-багажные. Для всех сим это что-то своё, кому-то в кабине сидеть, кому-то по родным просторам ехать, а мне в пассажирском вагоне надобно, вот и делаю)

Skif писал(а):Спрошу по схожей тематике: если стоит задача отправить сообщение от локомотива по составу, как реализовать "сквозной проход" сообщения по поезду до хвостового вагона, вне зависимости от того, нужна обработка этого сообщения или нет? Т.е. можно ли вызывать SendConsistMessage из функции-обработчика для ретранслирования сообщения дальше по составу в том же направлении, не приведет ли это к зацикливанию вагона "сам на себя" ?

Можно. Как показывает практика, работает всё нормально (на примере скрипта по анимации тормозов на вагонах)

Re: LuaScript - для RS

СообщениеДобавлено: 04.09.2015, 07:57
BooYa
Итак, требуется консультация знатоков:

Возможно ли скриптом задать последовательность, при которой будет выполняться действие. А именно условие такое (для примера): вагон был сцеплен с обоих сторон (сумма проб в обоих направлениях = 2)
Код: Выделить всё
local front_probe = Call("SendConsistMessage", 0, 0, 0);
local rear_probe = Call("SendConsistMessage", 0, 0, 1);

front_probe + rear_probe == 2

и если при изначальном выполнении этого условия, происходит отцепка от вагона с одной из сторон

Код: Выделить всё
front_probe + rear_probe == 1


то выполняется действие (отправка по составу сообщения с целью изменить переменную).

Пока писал, додумал, что действию "front_probe + rear_probe" надо назначить переменную, но как задействовать её тогда, когда она перейдет из значения 2 в значение 1, а не из значения 0, например (одиночный вагон) в 1, или просто в значении 1 (потому что в хвосте есть еще один такой вагон, которому не нужно ничего посылать)


Ну, или посоветуйте, как реализовать следующее действия (выше было то, до чего додумался я)

Вначале скрипта имеем предустановку положений всех нодов и чайлдов в состоянии отопления на угле (пинчи на вагоне, идёт дымок из трубы) - спасибе Диме за этот способ, работает

Имеем состав, который топится углем, тянем его тепловозом. Доехали до электрифицированной линии - отцепляем тепловоз, цепляем пассажирский локомотив с пинчами (лок посылает вагонам сообщение про пинчи, запускается "эстафета", как мы её прозвали, до конца состава) - дым пропадает, подключаются пинчи - поехали дальше. Доехали до тепловозной ветки - отключаем электровоз и вот в этот момент нужно сделать так, чтобы первый вагон отправил по составу сообщение, которое и покажет снова тот самый дымок.

Re: LuaScript - для RS

СообщениеДобавлено: 04.09.2015, 09:08
Skif
Это лучше сделать не первым вагоном, а "автосбросом" сообщения при отсутствии сообщения о электроотоплении - смотри, как у меня реализовано управление светом.

В конце Update есть строчка, сбрасывающая в ноль переменную, разрешающую включение света в вагоне. А в единицу эта переменная взводится сообщением от локомотива.

То есть:

1) Есть локомотив? Некая переменная, отвечающая за отопление электричеством, каждый такт будет устанавливаться в 1, так как локомотив шлет сообщение и оно принимается (и ретранслируется дальше эстафетой) вагоном.

2) Локомотив отцепился? Сообщения идти перестали - и мгновенно переменная сбросится в нуль.

Применительно к моему скрипту, можно (но я так пока не делаю - незачем) таким сбросом переменной OnStart вызвать "Блок однократной установки" в теле функции Update, который как раз подобной переменной и защищается от многократных вызовов и отвечает за установку тех параметров, которые нельзя установить в Initialise. Вот. И в этот блок однократной установки пропиши то состояние, что ты описал выше - пинчи подвешены, отопление угольное.

Кстати, можно у тебя позаимствовать блюпринт и текстуры частиц эмиттера для угольного дымка? Мне свой новый откровенно лениво делать, прикрутил на время отладки дым от тепловоза.

Re: LuaScript - для RS

СообщениеДобавлено: 29.09.2015, 19:26
A1iv
Как изменить кодировку внутри скрипта, чтоб показывали русские буквы в сообщении на экране? Изначальная кодировка скрипта ANSI и если ее поменять - кирдык, все не работает.

Re: LuaScript - для RS

СообщениеДобавлено: 14.10.2015, 02:11
i2GR
Помогите кто может.
Вопрос:
Код: Выделить всё
self.Position = Call( "*:GetControlValue", "ThrottleLvr", 0 )
logfile:write("\ntRegulator:Calculation_start12 "..tostring(self.Position))
SysCall("ScenarioManager:ShowAlertMessageExt", "p=="..tostring(tRegulator.Position)--[[.." ls "..tostring(self.LowSpeed).." lt "..tostring(self.LowTraction).." hs "..tostring(self.HighSpeed).." ht "..tostring(self.HighTraction), tostring(self.Value)]], 2, 1)

почему при условии что Call( "*:GetControlValue", "ThrottleLvr", 0 ) == 1 в Логфайле текст "tRegulator:Calculation_start12 1" а в алертмессадж "p==0"
??
строчки буквально подряд в коде

Re: LuaScript - для RS

СообщениеДобавлено: 14.10.2015, 16:30
BooYa
Я вижу, что для записи в лог у тебя используется переменная self.Position, а для алертмесседжа - переменная tRegulator.Position . Из того куска что ты дал, неясно, почему переменная tRegulator.Position тоже должна быть = 1.

Re: LuaScript - для RS

СообщениеДобавлено: 14.03.2016, 11:18
Skif
В качестве апдейта.

Пойман серьезный баг режима Quick Drive в TS2015 и (вероятно) в TS2016 !

Скриптеры, будьте внимательны - по наблюдениям, функция Setup, отвечающая за предустановку значений (вызывается однократно при запуске сценария, причем и в редакторе, если зайти сначала в Build, а не сразу в Drive), В РЕЖИМЕ QUICK DRIVE НЕ ВЫЗЫВАЕТСЯ.

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

Вагоны не болеют, у них все нормально.

Для локомотивов мы вылечили так: создали глобальную переменную-флаг IsFirstCall = 0

В конце функции Setup присваиваем ей значение 1:

Setup()

-- предустановка параметров локомотива




IsFirstCall = 1;
-- конец предустановки
end

. В теле основной функции Update() сделали в самом начале кода блок

if (IsFirstCall == 0) then

-- Если функция Setup() не отработала и требуется предустановка локомотива, то выполнить:
.
.
.
.
.
.
-- Здесь повторить весь код функции Setup(). Возможно, сработает и просто вызов функции Setup(); Не проверяли. Для игровых скриптов некритично,
-- сколько строчек кода выполнится в итоге - скорость обработки одинакова при вызове функции и при выполнении аналогичного ей содержимого непосредственно в теле функции Update.

IsFirstCall = 1; -- конец предустановки. Больше на этот блок кода выходить не требуется.
end


Далее следует остальная часть тела функции Update.




Попутно исчезли некоторые неприятные звуковые эффекты, связанные с установкой локомотива на рельсы - удары сцепок. Почему - не знаем, это очень сильное индийское колдунство.

Re: LuaScript - для RS

СообщениеДобавлено: 14.03.2016, 11:58
i2GR
а
Код: Выделить всё
if (IsFirstCall == 0) then
     Setup()
     IsFirstCall = 1
end

не проще?

Re: LuaScript - для RS

СообщениеДобавлено: 14.03.2016, 12:13
Skif
Описано в тексте.

Если системную функцию можно вызвать из тела Update - то разумеется, проще. Но мы не проверяли - некогда было. Проверим в спокойной обстановке, если сработает - так и перепишем. Требовался гарантированный результат за десять минут правки кода в весьма нервозном окружении.

Re: LuaScript - для RS

СообщениеДобавлено: 14.03.2016, 17:02
BooYa
Там в форуме отписались по скриптованию, то я не совсем согласна с таким решением, потому что если инициализация дала сбой (или если её вообще не было), то очень большая вероятность, что IsFirstCall будет равно не "0", а "nil", (собственно, я вообще не понимаю, почему должен быть 0) и условие if (IsFirstCall == 0) then не выполнится. Предложи, пусть в блоке Setup() этой переменной присваивается значение "true", а в условии будет if (IsFirstCall ~= true) then. Это сделает инициализацию обязательной во ВСЕХ случаях, если нет четкого подтверждения о её корректном завершении.

Re: LuaScript - для RS

СообщениеДобавлено: 14.03.2016, 17:07
Skif
Случайный Nil исключен - переменная инициализируется нулем исправно, ей присваивается 0 при самом создании переменной IsFirstCall. Но твоя знакомая права - с логическим типом вместо численного будет работать стабильнее, так как nil устанавливается по умолчанию неопределенным переменным.

Re: LuaScript - для RS

СообщениеДобавлено: 23.03.2016, 04:12
BooYa
Возможно, кому-то пригодится.
В качестве информации, спешу сообщить, что в скриптах РВ действует ограничение на длину передаваемых сообщений.

Сообщение, например (12 символов):
Код: Выделить всё
PINCH_3000V_MSGID_L = 181819417901;

попросту не работает. При верной логике скрипта.

Стоило мне заменить это сообщение на (10 символов)
Код: Выделить всё
PINCH_3000V_MSGID_L = 1818190612;

как всё сразу заработало.