config.txt
угольного
хоппера, описывающеий его входную очередь:
queues { load0 { size 54300 initial-count 0 animated-mesh load product-kuid <KUID:44179:60013> allowed-categories { 0 <KUID:-3:10040> } } }
Очередь load0
имеет максимальную емкость 54300, а КИД груза
product-kuid
установлен в КИД угля, стандартный груз для хоппера -
уголь. Однако по умолчанию вагон пуст, поскольку начальная загрузка
initial-count
равна 0. Указав разрешенные категории
allowed-categories
, мы определяем, что очередь может
содержать множество различных грузов. Использован КИД категории "Насыпные грузы", поэтому вагон
кроме угля сможет перевозить любой груз, входящий в эту категорию, включая
опилки.
Чтобы показать анимированный процесс загрузки хоппера,
load
нашей очереди определен как анимированная
сетка animated-mesh
. Теперь Trainz сможет
автоматически подогнать сетку в зависимости от заполненности очереди. Так
создаетя иллюзия повышения и понижения груза угля.
include "vehicle.gs" // // Класс сценария для хоппера. Потоков нет - только перекрытые обратные вызовы Vehicle, // которые вызывает Industry. // class Hopper isclass Vehicle { // Проиграть звук в начале загрузки хоппера". float BeginLoad(LoadingReport report) { Asset meAsset = GetAsset(); World.PlaySound(meAsset, "coal_load1.wav", 1000.0f, 20.0f, 1000.0f, me, ""); return 0.0; } // Запустить эффекты и проиграть звук в начале разгрузки хоппера. float BeginUnload(LoadingReport report) { SetMeshAnimationState("left-door", true); SendMessage(me, "pfx", "+0+1"); SetMeshAnimationState("right-door", true); SendMessage(me, "pfx", "+2+3"); Asset meAsset = GetAsset(); World.PlaySound(meAsset, "coal_dump1.wav", 1000.0f, 20.0f, 1000.0f, me, ""); return 1.0; } // Отключить эффекты и проиграть звук в конце разгрузки хоппера. float EndUnload(LoadingReport report) { Sleep(1.0); SetMeshAnimationState("left-door", false); SendMessage(me, "pfx", "-0-1"); SetMeshAnimationState("right-door", false); SendMessage(me, "pfx", "-2-3"); return 1.0; } };
Поскольку хоппер относится к вагонам, класс Hopper
наследует от класса Vehicle. Обратите внимание, что
в этом классе нет потоков. Единственные методы - BeginLoad(), BeginUnload() and EndUnload(), являются перекрытыми
методами обратного вызова из
Vehicle.
BeginLoad()
вызывается методом Vehicle::LoadProduct() до начала загрузки
вагона. Это можно проверить в реализации метода LoadProduct() в файле
vehicle.gs
. В этом классе проигрывается звуковой файл.
Поскольку
PlaySound() возвращает
управление сразу же, а не после проигрывания звука, метод BeginLoad()
закончится сразу после вызова PlaySound().
BeginUnload() и EndUnload() вызываются методом UnloadProduct() соответственно в
начале и в конце операции разгрузки.
BeginUnload()
проигрывает анимацию нижних дверей хоппера с
обоих сторон вагона и включает атмосферные эффекты. Несколькими секундами позже
вызывается EndUnload()
. Этот метод практически идентичен
BeginUnload()
, только он останавливает анимацию дверей и
отключает эффекты. Оба этих метода возвращают 1.0, чтобы Vehicle::UnloadProduct() знал, как долго
продлятся эти действия (в нашем примере - 1.0 секунда в обоих методе).
Цепочка событий выглядит примерно так:
BeginUnload()
и EndUnload()
.Hopper
реализует методы Vehicle::BeginUnload() и Vehicle::EndUnload(), вызываются именно
они, а не методы по умолчанию, содержащиеся в классе Vehicle, так что во время
разгрузки проигрывается анимация и включаются эффекты.