Это как? Есть отдельные кастомные команды отцепки?
Вот эти команды:
Но только с помощью них, задачу не решить, прицепившийся маневровый становится вагоном, если в другом локомотиве есть машинист. Можно тем машинистом отцепить последний вагон, это и будет маневровый, и только после этого маневровый начнёт выполнять команды. Это наверно можно сделать через систему сообщений между машинистами, передать сообщение после сцепки от машиниста маневрового машинисту головного, после получения которого, тот отцепит последний вагон и пошлёт сообщение обратно маневровому, после получения которого, тот в свою очередь поедет куда-нибудь дальше по своим делам. Но я не понял как пользоваться этот системой сообщений между машинистами, нагуглить ничего не получилось, возможно, у меня чего то не хватает для её работы.
Поэтому, придётся таки высаживать машиниста головного на момент сцепки и возвращать его обратно после.
Итак, задача:
Локомотив, к которому надо прицепить вагоны, прибывает на станцию. Если им управляет игрок, то в командах у Басти пусто, если бот, тогда там "авто-машинист" или "движение до красного". В маневровом у Чарли пусто, ну или тоже "движение до красного", если он откуда-нибудь приехал. Стоят два триггера, обратите внимание где. Нам нужно, когда Басти доведёт состав до светофора, и наедет на Триггер-1, создать список команд у Чарли, на манёвр, сцепку и расцепку, после чего Чарли куда-нибудь уедет, например на тот же путь вернётся, откуда начинал манёвр. А Басти высадить в другой локомотив. А дальше, когда Чарли прицепит вагоны и сам отцепится, надо будет по наезду им на Триггер-2, вернуть Басти в его локомотив, построить маршрут на выход, активировать "авто-машинист", если состав ведёт бот а не игрок, ну и показать сообщение от диспетчера, если состав ведёт игрок. Но вот засада, Чарли будет дважды проезжать через Тригер-2, и возвращать Басти к себе в локомотив надо будет только по второму проезду. Пришлось поломать голову, может быть и есть какой-нибудь счётчик, который активирует дочерние роли, только после второго вызова, но я такой не нашёл. Сделал через систему переменных.
Решение:
1) Роль активирующая дочерние роли при наезде на Триггер-1
Выбираем локомотив, триггер и обязательно ставим галку, чтоб только один раз сработало. Потому как, локомотив долго будет стоять на триггере, и если в этот момент игрок сохранится/загрузится роль сработает повторно и собьёт команды у Чарли, и будет у вас сценарий который - "сохранения не поддерживаются, проходите за один раз".
2) Дочерние роли для Триггер-1. Используем роль "Driver Shedule Rule", которая задаёт команды машинистам. Обратите внимание на настройку "Killer style", с ней добавляемые команды будут заменять уже существующие, что нам и надо.
Басти пересаживаем в другой локомотив командой move to locomotive, а Чарли задаём всю цепочку манёвра. Обратите внимание на команду "Random" после расцепки, чуть позже объясню что это и зачем.
3) Нам надо будет как то отличить первый наезд на триггер от второго. Создаём переменную и присваиваем ей значение 0, используем для этого роль "Variable setup", жмём add, вводим имя и значение, переменная будет создаваться в начале сессии. Добавляем в команды машиниста "Variable random"
У Чарли команда с иконкой "random" это и есть Variable random. Суть в чём, в начале сессии наша переменная равна 0, а после того, как Чарли отцепится от состава, он меняет её на рандомное значение больше одного. Зачем нужен рандом? Вообще там есть команда sVariables, задающая значение переменной, но у меня она почему то не работает.
4) Остаётся вернуть Басти в его локомотив по повторному наезду Чарли на Триггер-2. Создаём роль проверки триггера, выбираем локомотив, триггер, галку однократного срабатывания не ставим, оно дважды должно отработать! Добавляем дочернюю роль Variable Check, которая занимается проверкой переменных, как не трудно догадаться по её названию. Вписываем руками название нашей переменной, которую мы создали в пункте 3, и выбираем условие проверки - is not equal to 0(не равно нулю)
Ещё раз, когда в начале сессии создаётся наша переменная её значение - 0, Чарли её меняет, после того, как отцепится от состава. Соответственно, когда он первый раз проезжает по Триггер-2, переменная равна нулю, проверку она не пройдёт и дочерние правила не сработают.
Ну и создаём роль, которая добавит Басти команды возвращающую его в локомотив, создающую маршрут на выход и авто-машинист, если это бот.
Будьте внимательны, роль Variable Check дочерняя по отношению к Trigger Check, а Driver Shedule Rule дочерняя к Variable Check. Driver Shedule Rule сработает только когда проверка в Variable Check завершится успешно.
Ну и в конце MakeDSPSpeach с сообщением игроку от диспетчера.
Итого:
Басти привёл локомотив на станцию, у Чарли очередь команд пуста.
Басти наехал на Триггер-1. У Чарли появилась очередь команд со всеми манёврами. Басти пересел в другой локомотив.
Чарли маневрирует, Басти тусуется в 2ТЭ10М
Чарли идёт на сцепку, в локомотиве состава машиниста нет!
Чарли отцепился и сейчас повторно наедет на Триггер-2. Обратите внимание, в локомотиве осталась часть команд Чарли, но мы используем Killer mode в Driver Shedule Rule, и всё это будет благополучно убито.
Чарли наезжает на Триггер-2, Басти возвращается в родной локомотив и начинает вытягивать состав на перегон.
Вместо системы переменных, можно добавить третий триггер и нагородить огород с последовательной их проверкой. Но на мой взгляд использование переменных элегантней и надёжней. Вообще хорошая вещь, можно делать вариативность в сценариях за счёт генерирования рандомного числа, и выпускать на встречу игроку разные составы, в зависимости от сгенерированного значения переменной. К переменным ещё прилагается система для отладки, роли Display Custom HUD и Show variable, которые могут выводить текущие значения переменных в сессии.
Volaner, м-да, огород знатный нагорожен. Есть система БОК Эрендира (https://forum.trainzup.net/showthread.php?t=1407). Там проще и понятнее решается такая задача. А машиниста не надо никуда пересаживать, достаточно отцепиться от состава, отъехать от состава на >= 50 метров (к примеру, до красного от маркера остановки состава) и ждать активации команд на сцепку с составом и продолжение движения.
TRam_, ага. Зато в реале локомотивная бригада перед прицепкой эвакуируется в какой-то отстойный локомотив, прикидывается там ветошью и не отсвечивает, пока ей не дадут разрешения вернуться в свой локомотив, да?
Иногда мы принимаем такие решения, которым тараканы в голове аплодируют стоя.
В реале прицепляющийся локомотив не оказывается отнесённым к тому же поезду. Но в trainz при сцеплении всегда образуется единственный объект "поезд" (второй удаляется), а у поезда может быть один единственный набор команд,
Блин, Вов, так а я с какой точки зрения говорю о каких-то там расцепках-сцепках? Прекрасно я знаю, что происходит в реале. Но Trainz наносит свои ограничения и условия.