PDA

Просмотр полной версии : Клавиши в trainz


TRam_
27.08.2008, 18:07
до недавнего времени на всех "наших" сайтах о данной игре не освещался способ скриптования кавиш. И хотя почти все могут использовать форму

void UserPressKey(string s)
{
if (!veh)
{
inherited(s);
return;
}

Train train = veh.GetMyTrain();

if (s == "train_cabin_brake_application")
{
if (train_brake_lever )
{
// self-lapping brakes
float brakes = train.GetTrainBrakes();

if (brakes < Train.TRAIN_BRAKE_INITIAL)
brakes = Train.TRAIN_BRAKE_INITIAL;
else
{
brakes = brakes + 0.05f;
if (brakes > Train.TRAIN_BRAKE_APPLICATION)
brakes = Train.TRAIN_BRAKE_APPLICATION;
}

train.SetTrainBrakes(brakes);
}
}
}
в скрипте кабины, но никто не говорил о кодовых строках подобных "train_cabin_brake_application" . Полный их список содержится в
(директория трейнз)->Settings->keyboard.txt

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

train_dcc_down x, comma
train_dcc_up w, fullstop
train_dcc_stop s, slash
train_dcc_handbrake a, apostrophe

т.е. можно строку s скрипта сравнивать также со строками типа "train_dcc_up" или "train_dcc_stop".
Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки :rolleyes: :russian:

Combine
27.08.2008, 19:24
Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки Да я это все знаю давно, не всё, что в файле описано, работает, и в ВЛ10 управление с клавиатуры делать не будем.

Skif
27.08.2008, 21:51
-20% привлекательности модели.

TRam_
27.08.2008, 22:04
-20% привлекательности модели.как знать, как знать...

genesis
28.08.2008, 08:16
Не все так просто так как
1. Половина этих самых клавиш описанных в keyboard.txt не работает начиная с классика.
2. Добавление своих конешно решает эту проблему но создает лишь неудобства пользователям
3. Ауран эту проблему решать не собирается
-Pass ALL keystroke information to the cab/cabin script. Currently only a subset of the keys usable are passed to the script methods meaning the cab script cannot react to all the users control requests and the range of controls is not extensible. -eldavo
--Please provide more information on what you want here. Which keys are you missing out on that you actually need? -chris
--At this time Trainz does not passes via Cabin.UserPressKey(string) large number of keyboard shortcuts defined in file Settings/keyboard.txt. This makes difficult to override default cabin implementation and defining custom functions to keys. -Mike
--As above, please provide specifics. We will not be simply passing through all keyboard information because this breaks localisation support. We may be able to help with specific requests. ~chris
Об какой спрашивается локализации они говорят?
4. Могу заверить что все это скриптерам давно известно:p

Combine
28.08.2008, 15:04
-20% привлекательности модели. Не нравится, не катайся ;)

genesis
28.08.2008, 16:36
Присоединяюсь. Мышкой гораздо приятнее управляться в кабине, щелкать кнопками и прч.:)

Skif
28.08.2008, 22:19
Вот и крути одновременно мышом камеру и ручки - если успеешь управиться одновременно смотреть в окно и на кран. А я буду дальше кататься с пульта, как нормальный человек.

genesis
28.08.2008, 22:52
поверь, прекрасно успеваю, и еще получаю от этого удовольствие. Если у вас на экране не помещаются все рычаги управления, измените угол обзора в кабине ключом -cabinFOV=XX в trainzoptions.txt

Skif
28.08.2008, 23:34
... А код-то в примере практически чистый С++ :)). Ох, чую я, что займусь я этими скриптами, да так, что от траинзы щепки полетят!

// злорадно и многообещающе потирает руки, ехидно посмеиваясь

Skif
30.08.2008, 21:20
Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....

А кто вообще может дать почитать список всех используемых игрой функций управления объектами классов, описание самих классов ? Пожалуйста, очень интересно.

genesis
30.08.2008, 23:06
АПИ, загружается на files.auran.com

Skif
01.09.2008, 21:20
Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.

xXx
02.09.2008, 13:25
Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....


Вроде бы здесь о разрядке речь не идёт? :confused:
В скрипте речь идёт чисто о степени применения тормоза.

genesis
02.09.2008, 14:04
Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.
Мозг будет кипеть после того, как узнаешь что половина "пикантных особенностей" не оговорена ни словом, к куче функций описания весьма скормны и непонятны, а кое-что поблескивает надписью "Obsolete, do not use!!!" или "This functions isn't implemented yet"... x_x

TRam_
02.09.2008, 20:50
ну и что? главное - что можно сделать кучу процессов которые будут работать одновременно(звуки, управления тягой, тормозами, проскальзыванием, тормозной рукояткой, компрессором, светом, "прикрепляемыми" и(или) анимрованными сценами (возможна даже "вложенная анимация", хотя официально это не возможно :) ), звуком, как 2-мерным, так и 3-мерным(и при удалении от этого звук естественно затухает))).
Но запомните - при торможении мы сможем опустошить только ГМ, т.к. "зарядка" в трейнз "автоматическая", автомат начинает прекрашать подачу воздуха в ТМ без сверхзарядки совсем (к сожалению я ошибся насчёт неё).

genesis
02.09.2008, 23:09
возможна даже "вложенная анимация", хотя официально это не возможно :)
Не понял что здесь имеется ввиду О_о Если сложение/наложение анимаций то все работает и поддерживается самим джетом

TRam_
03.09.2008, 11:50
это не поддерживается плагином. обычные точки привязки неанимируемы

Evgenyi
03.09.2008, 16:45
Не нравится, не катайся ;)

Сто раз согласен:drinks: ! Наконец-то будет лок, который управляется как в реале. Или вреале вы тоже нажимаете Num3, чтобы затормазить;) ?

Вопрос по теме:
Тут недавно вышел ВЛ80Р-1867 со скриптом включения ГВ и МВ. А можно это дело привязать к клавишам?

Combine
03.09.2008, 19:07
Но запомните - при торможении мы сможем опустошить только ГМ ГМ не бывает. Есть НМ, ТМ...

TRam_
03.09.2008, 19:34
вибачте, ГР (головний резервуар :) )

привязать то можно, но нужно и скрипт переделать и сделать скрипт кабины (а поскольку админ этого скрипта TRam_, и он пока не разрабатывает, то ответ нет)

TRam_
22.07.2009, 19:12
возобновляю эту старую, забытую тему....

итак... Открываем папку любой trz , папку Settings, файл keyboard.txt

В нём мы видим все используемые этой игрой клавиши, и строки, кодирующие эти клавиши.
Именно СТРОКИ движок trz воспринимает при нажатии клавиш. Как видете, многие клавиши
повторяются для разных строк (значит, обе эти строки будут обрабатываться одновременно).


В трс можно два способа "информирования" скрипта о нажатии клавиши - скриптовый и косвенно-скриптовый.

Начнём с косвенно-скриптового, т.е. с распознавания сообщений о том или ином действии клавиши.
Таких действия 4 - включение гудка, включение "звонка"(Америка...), включение посыпания песка
и поднятие токоприёмника. Покажу, как их "доставать". Если у нас 2009(более ранним не надо),
то в trainzoptions.txt прописывем строку

-enablescriptmessagelogging

Заходим в trz, устанавливаем на рельсы электровоз, и нажимаем клавиши из keyboard.txt
соответствующие строкам

train_horn
train_sand
train_bell
train_pantograph_toggle

После этого выключаем trz и просматриваем файл "JetLog.txt". В нём находим интресующие нас
строки -

? 000004B8 Warn 1:01.1 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyHorn
? 000004B8 Warn 0:53.1 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifySanding
? 000004B8 Warn 0:54.2 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyBell
? 000004B8 Warn 0:58.7 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyPantographs

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

void obrabotchik1(Message msg)
{
// проверяем, что это сообщение послал именно наш поезд
if(cast<train> (msg.src)==me.GetMyTrain())
{
//здесь собственно обработка нажатия
}
}

и "установить" её на локомотив

AddHandler(me,"Train","NotifyHorn","obrabotchik1");

Но это не основной способ получения клавиш.


Рассмотрим основной, скриптовый. Итак, заходим в папку scripts , находим там файл "Cabin.gs" и открываем его.
Тут описывается всё функции кабины, написаные аурановцами и скомпилированные в "Cabin.gsl" папки libraries .

класс CabinControl вообще широко известен, именно он широко используются в ВЛ10-1628 и ЧС4т для
"вылавливания" поворота мышью ручек и тумблеров. Ну класс Cabin является родителем класса DefaultLocomotiveCabin,
установленного почти на всех "нескриптованных" непаровых локомотивах .

А теперь рассмотрим функцию, которая в самом низу этого класса, выглядящую так

public void UserPressKey(string s)
{
Interface.Log("Cabin.UserPressKey> unhandled key-command " + s);
}

Аурановцы говорят, что вызовом этой функции заставить trz "подумать, что нажималась клавиша" нельзя,
эта функция только ВЫЗЫВАЕТСЯ ОБРАБОТЧИКОМ нажатия клавиши на клавиатуре.

Подождите, что-то знакомая строка.... Открываем JetLog.txt и перед строкой

? 000004B8 Warn 0:58.7 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyPantographs

видим строку (тут прописывание -enablescriptmessagelogging в 2009 роли не играет)

? 000004B8 Warn 0:58.7 Trainz : WorldState::NativeLog> Cabin.UserPressKey> unhandled key-command firebox-door-toggle

Вот-то она, работа этой самой процедуры... А "firebox-door-toggle" - почти то же, что "train_cabin_firebox_door_toggle",
согласно keyboard.txt соответствует клавиша KP1 , та же, что и для токоприёмника.

Ну и перебрав таким же образом (на нескриптованном электровозе) все клавиши, описанные в keyboard.txt, получаем следующий список
"работающих":

а) для всех версий trz

train_cabin_brake_application
firebox-door-toggle (соответствует train_cabin_firebox_door_toggle)
train_cabin_throttle_0
train_cabin_throttle_up
train_cabin_throttle_down
steam-regulator-up (соответсвует train_cabin_regulator_up)
steam-regulator-down (соответсвует train_cabin_regulator_down)
steam-reverser-up (соответсвует train_cabin_reverser_up)
steam-reverser-down (соответсвует train_cabin_reverser_down)
wave (соответсвует train_cabin_coalman_wave)
steam-blower-up (соответсвует train_cabin_blower_up)
steam-blower-down (соответсвует train_cabin_blower_down)
steam-injector-up (соответсвует train_cabin_injector_up)
steam-injector-down (соответсвует train_cabin_injector_down)
cabin-fans (соответсвует train_cabin_fans)
shovel-coal (соответсвует train_cabin_shovel_coal)


б) и для версий 2009 и старше (аурановцы, как и обещали, расширили предыдущий список)


train_cabin_toggle_draincocks
train_cabin_aws_isolate
train_cabin_aws_activate
train_cabin_tpws_reset
train_cabin_tpws_override
train_cabin_dra_on
train_cabin_dra_off
train_cabin_emergency_stop
train_cabin_master_switch_on
train_cabin_master_switch_off
train_cabin_panel_lamp_test
steam-injector2-up (соответсвует train_cabin_injector2_up)
steam-injector2-down (соответсвует train_cabin_injector2_down)
train_cabin_toggle_draincocks
train_cabin_engine_on
train_cabin_engine_off
train_cabin_hardware_0
train_cabin_hardware_1
train_cabin_panel_lamp_test
train_cabin_wipers_on
train_cabin_wipers_off
train_cabin_hardware_0
train_cabin_hardware_1


обращаю Ваше внимание - некоторые строки относятся к 2 клавишам одновременно. Хотя файл keyboard.txt в ранних версиях
защищён от записи, Вы можете скопировать его содержимое в копию любого текстового файла из директории trs (для сохранения кодировки)
назвать keyboard.txt и заменить им этот файл.

В 2009 его можно редактировать свободно.

Ну а пример обработки кабиной, например, "wave" такой

void UserPressKey(string s)
{
if (s == "wave")
{
// собственно обработка клавиши
}
}

Напоминаю, что кабина "активна", если вы находитесь на этом локомотиве (но не обязательно в виде "1" - и в "2" и остальных :) )

Skif
23.07.2009, 10:11
А если сделать шаг дальше - дописать в файл keyboard.txt еще пару клавиш и назначить им сообщение?

TRam_
23.07.2009, 11:47
Новых строк назначить нельзя. Можно только переназначит клавиши, соответствующие строкам

А сообщения вообще нильзя сделать никак

TRam_
23.07.2009, 12:05
точнее, самый простой способ "улавливания клашиши" и передачи её локомотиву в виде сообщения такой

class Cabin_keyb isclass DefaultLoocmotiveCabin
{

void UserPressKey(string s)
{
if (s == "train_cabin_engine_on")
{
PostMessage(loco,"engine","on",0);
}
else
if (s == "train_cabin_engine_off")
{
PostMessage(loco,"engine","off",0);
}
}

хотя я предпочитаю другой способ, используя класс CabinData

}

Skif
23.07.2009, 14:52
Володя, а ты не пробовал раскурочить аурановские файлы? Которые скомпилированные? Они ж все, заразы, дополнительно в виде исходников выложены. Может, стоит там поискать список сообщений?

TRam_
23.07.2009, 15:18
список строк я дал. Думаю, он совершенно полный, т.к. именно по файлу keyboard.txt трейнз расшифровывает клавиатуру (насколько я понял аурановцев). Если хотите, можете перепроверить его на наличие неуказнных мною строк, которые всё-таки работают...

в 2009 нам дали 23(!!!) дополнительных слоков под клавиши. В дефолтных локах они ни на что не влияют. Поэтому смело делай "преобразователь" своего пульта на клавиши, соответствующие им (там большинство расшифровывается как Alt+<клавиша> )

Которые скомпилированные? но зачем? И так 23 новых слота под клавиши работают... Неужели мало?

Задай к ним нужные тебе клавиши и "прилагай" к своему "пульту" новый keyboard.txt , адаптированный к пульту.

genesis
13.11.2009, 23:07
Есть предложение глобально изменить keyboard.txt файл, так, чтобы было одинаково у всех.
Что не нравится в текущем варианте:
1. Наличие строк с неназначенными комбинациями, вроде
train_cabin_throttle_8 null
Это снижает количество возможных комбинаций
2. Несколько клавиш, обрабатываемые одной строкой, к примеру:
train_cabin_brake_release q, KP9, KPPgUp
Это сразу лишает возможности отдельно использовать нампад.
3. Клавиши p, [, ] заняты самой игрой. Я не знаю, исправит ли это правка файла, но стоит попробовать.

Одна из целей этого - обеспечить возможность реализации более удобной раскладки клавиш:
Блок qweasd - управление контроллером
r, f - управление реверсивкой
[, ] - КВТ (, и . в случае невозможности)
; ' - КМ
x, h, b - песок, тифон, свисток
Нампад - управление дверями в трамваях и МВПС, а также функции автоинформаторов, МСУД и т.п.

Соответственно, хочется услышать мнения насколько это все необходимо и обосновано, а также возможные последствия от этого шага.

TRam_
14.11.2009, 13:10
считаю что необходимо. Только потом сделать описание, чему каждая клавиша соостветствует и распространять его вместе с keyboard.txt

Skif
14.11.2009, 13:35
Согласен. На основе унифицированного файла всем будет удобнее. А вот нумпад желательно бы вообще исключить :) - ну его, этот нумпад. Верхние цифры заняты под камеры, F-ы - под менюшки. Может, стоит рассмотреть вариант Shift+кнопка по образцу МСТС?

TRam_
14.11.2009, 13:39
так поредактируй в своём трс файл keyboard.txt :). shift+кнопка там прописать можно. Если получится что-то интересное, можешь здесь отписаться

Combine
14.11.2009, 17:02
Нампад может быть полезен для ввода команд автоведения и КЛУБ.

Skif
14.11.2009, 17:29
А ведь верно :) . Про панели таких приборчиков я и забыл!

genesis
14.11.2009, 17:58
В ТРС09 удалось перенаправить команды вроде смены вида камеры на другие клавиши. Правда также выяснилось, что некоторые строки, наподобие train_cabin_brake_release в скрипт не поступают.

TRam_
14.11.2009, 20:28
train_cabin_brake_release да, аурановцы обработку train_cabin_brake_release и train_cabin_brake_lap не делали ...

genesis
14.11.2009, 21:10
Там еще с десяток таких. Это скорее всего намеренно.

TRam_
14.11.2009, 21:13
МБ. Аурановцы тоже нас боятся :)

Evgenyi
14.03.2010, 15:12
TRam_, у меня вот такой вот вопрос:
Как реализуется прямое управление? Через public в скрипте лока, а вот каков сам механизм? Что и как и где надо прописывать? То что скрипт лока надо в кабину кинуть и инклудить его это я знаю.

genesis
14.03.2010, 15:50
Прямое управление чего и чем?

TRam_
15.03.2010, 15:16
Как реализуется прямое управление?поясни

Evgenyi
15.03.2010, 16:35
Ну кабина-локомотив, как это сделанно в 1628

genesis
15.03.2010, 16:50
Для этого нужно иметь доступ к фактическому классу локомотива из кабины. А для этого нужно иметь точную копию скрипта лока в папке кабины (даже мизерное отличие приведет к null'у в касте) и в аттаче привести лок к его фактическому классу. В ТРС09 можно использовать script-include-table и подключить скрипт лока сразу из ассета лока, без мучений с копированием.
Набор методов в локе ты сам волен определить, так что не спрашивай что делать :)

Combine
15.03.2010, 17:03
даже мизерное отличие приведет к null'у в касте Я думаю, будет достаточно просто бинарной совместимости классов.

genesis
15.03.2010, 18:00
Хочешь выстрелить себе в ногу?)

Combine
15.03.2010, 18:06
Ну это так, чисто теоретическое измышление.

L.U.B.I.N.D.A...
10.05.2010, 12:25
Вспомнилось тут...
Зажал как-то в trs какую-то комбинацию клавиш и после этого "летал" в кабине при помощи стрелок. Теперь ищу эту комбинацию. :)

Snark
10.05.2010, 14:11
L.U.B.I.N.D.A..., можно написать в trainzoptions.txt (в корневой папке ТРС) "-freeintcam" и теперь всегда можно передвигаться по кабине при помощи стрелок.

ViktorRy
19.07.2014, 16:35
В своё время TRam_ публиковал в этой ветке полный список строковых эквивалентов, генерируемых движком при нажатии определённых клавиш клавиатуры. Именно эти строковые эквиваленты обрабатываются методом UserPressKey(string s). С тех пор было написано много скриптов к различным локомотивам, использующих этот метод для отслеживания нажатия клавиш.

Но вот на дворе уже 2014 г., Auran успела выпустить ещё одну новую игру и несколько обновлений к ней. К несчастью, разработчики почему-то значительно решили урезать список доступных кодов...

Приведу полный список действующих строк для версии игры Trainz Simulator 12 v3.7:


train_cabin_brake_application
train_cabin_throttle_0
train_cabin_throttle_up
train_cabin_throttle_down
wave
cabin-fans
train_cabin_aws_reset (новая)
train_cabin_aws_isolate
train_cabin_aws_activate
train_cabin_tpws_reset
train_cabin_tpws_isolate (новая)
train_cabin_tpws_activate (новая)
train_cabin_tpws_override
train_cabin_dra_on
train_cabin_dra_off
train_cabin_emergency_stop
train_cabin_panel_lamp_test
train_cabin_engine_on
train_cabin_engine_off
train_cabin_hardware_0
train_cabin_hardware_1
train_cabin_wipers_on
train_cabin_wipers_off
train_cabin_vigilance_foot_pedal (новая)



Были исключены:

firebox-door-toggle
steam-regulator-up
steam-regulator-down
steam-reverser-up
steam-reverser-down
steam-blower-up
steam-blower-down
steam-injector-up
steam-injector-down
shovel-coal
train_cabin_toggle_draincocks
train_cabin_master_switch_on
train_cabin_master_switch_off
steam-injector2-up
steam-injector2-down



Так что для создателей модификаций ПС со скриптованными кабинами предстоит кропотливая работа по исправлению скриптов. Пожелаю им удачи...

TRam_
19.07.2014, 17:40
Не совсем. Аурановцы ввели новый тип ассетов - KIND Controlset (http://online.ts2009.com/mediaWiki/index.php/KIND_Controlset). В нём прописываешь все нужные тебе контейнеры клавиш, а затем прописываешь этот куид в кабине или библиотеке. В результате нажатия настроенных у этих контейнеров клавиш (в главном меню игры) получаешь сообщения, которые затем обрабатываешь хендлерами или потоками в скриптах кабин/библиотек. Пример локомотивов с этим хозяйством - 2ТЭ121 и ДМ62.

ViktorRy
19.07.2014, 21:26
TRam_, спасибо, попробую разобраться...