Rambler's Top100
   
 

Полезные советы

JMC в примерах

Автор: Йишим

В данной статье я хочу рассмотреть некоторые аспекты использования популярного клиента jmc. В частности, те вещи, которые, как мне кажется будут полезны не только мне, но и многим другим игрокам.
Часть этой информации получена из сообщений игрока DadMin на форуме Adan'а, за что ему отдельное спасибо. Также хочу поблагодарить Варманера и Эльлека за помощь и советы по улучшению этой статьи.

О ЧЕМ я попытаюсь рассказать и какими словами:
1. Профиль/сет/профайл — файл с расширением *.set который находится в одной директории с запускаемым файлом jmc.exe. Обычно для каждого чара делается отдельный файл, содержаший в себе в текстовом виде настройки для игры. Эти настройки включают в себя триггера, алиасы, сабсты и другие установки.
2. Триггер — определенным образом заданное правило обработки и реакции на строки, приходящие в клиент из мада.
3. Алиас — именованная последовательность из одной, а чаще нескольких команд. Проще говоря — некое сокращение множества действий до пары букв или слова.
4. Сабст/subs/substitution — правило замены некоторой строки, пришедшей из мада на другую строку, которая будет отражаться в клиенте.
5. Хайлайт/highlight/подсветка — команда которая указывает клиенту необходимость вывести заданную строку определенным цветом на определенном фоне.

Раскрашиваем...

1. ДТ

Когда я в очередной раз, попав в ДТ, оправдывал себя тем, что вышел к этой самой ДТ я совсем с другой стороны, а не с той, с которой обычно ее благополучно обходил, я услышал от своих согрупников очень правильную мысль о том, что хорошо бы название клетки, которая граничит с ДТ, подкрашивать неким цветом, особенно привлекающим внимание игрока.
Помню, что были эти советы от человека, использующего совсем не JMC, но и этот клиент позволяет сделать полезные цветовые подсказки.
Итак, что мы делаем.
Находим клетку, которая граничит с ДТ. Затем делаем хайлайт с нужными цветами по названию клетки. Например:

#highlight {yellow,b light red} {Начало ветки} {default}

Усовершенствуем этот пример. Добавим еще и информацию о том, в какую сторону нежелательно ходить. Сделать это можно используя замену:

#substitute {Начало ветки} {_В_ Начало ветки}

Буква _В_ покажет, что на восток в данном случае лучше не ходить. Иначе прийдется утонуть в огне, так сказать.

Итого, для описания одного ДТ используется набор из двух команд JMC, первая заменяет название клетки на название клетки + направление, а вторая такое измененное название подсвечивает ядовитым цветом:

#substitute {Начало ветки} {_В_ Начало ветки}
#highlight {yellow,b light red} {_В_ Начало ветки} {highDT}

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

Также в данном варианте использования пары замены и подсветки может оказаться полезным знание такого режима работы JMC как #presub. Данный режим показывает, будет ли использоваться результат замены в триггерах. Т.е., фактически, будут ли обрабатываться замены до начала обработки пришедших строк триггерами. При этом #presub не влияет на работу результатов замены в подсветке.

PS. Полезная добавка от рецензентов.
В частности, если вдруг клетка такова, что вокруг нее не одно, а несколько ДТ, то, скорее всего, придется в замене указывать все направления, куда ходить нельзя.
Например:

#substitute {Под основанием маленького листа} {_СВЮЗ_ Под основанием
маленького листа}
Бывают и такие случаи, когда клетки у ДТ и рядом лежащие имеют одинаковое короткое название. Что делать в таком случае, кроме как просить билдера, если он еще доступен, изменить название, — я даже не знаю.

2. Необходимые предметы

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

#highlight {black,b charcoal} {^свиток возврата} {default}
#highlight {black,b charcoal} {^пульсирующий свиток возврата} {default}

для лампы:

#highlight {cyan,b black} {^небольшая медная лампа} {default}

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

#substitute {напиток видения невидимых} {*напиток видения невидимых}

Почему во всех этих примерах перед названиями предметов используется коробочка (^) — которая, как известно, указывает jmc, что строку нужно обрабатывать только если она начинается со слова, указанного за ^. Это сделано для того, чтобы подсветки срабатывали только при просмотре инвентаря или, например, ящика, и не срабатывали на аукцион или магазин. Насчет замен чуть ниже я опишу особенности, позволяющие использовать замены только с некоторыми ограничениями.

PS. Полезная добавка от рецензентов.
Вернее, не скажу, чтобы совсем полезная, но что-то в этом есть. Заключается она в простом триггере, который бы при выходе из городов проверял инвентарь. В том смысле, что при попадании в клетку с названием "Восточная калитка" выдавалась команда инв. Это действие по идее должно напомнить забывчивым посмотреть-таки свой инвентарь до того, как улететь из города без свитка возврата в поисках приключений на свою голову.

3. Обходимые или просто ненужные предметы

В некоторых наших зонах стали появляться такие предметы, которые зачастую несут на себе (помимо мобов) исключительно антуражный смысл. Они обычно не продаются в магазины, их не задействуешь в прохождении зон и т.п. Но, тем не менее, они забивают инвентарь, и, бывает, что из-за этого вы не можете получить квестовый объект от моба, или, не дай бог, снять меч из левой руки, чтобы зачитать свиток возврата. Чтобы не следить за всем этим добром, предлагаю написать триггера на выбрасывание этих вещей как только ваш персонаж взял их из трупа моба. Например:

#action {^Вы взяли мачтовые штаны из трупа %1} {бро мачтовые} {5} {default}

В моем профайле таких триггеров порядка 5-10 штук. Но они, конечно, всего не охватывают, так что есть еще простор для творчества.

Оптимизируем...

4. Глобальные фичи

Насколько мне известно, обычно те, кто использует клиент jmc, для каждой профессии используют, как минимум, отдельный сет алиасов, триггеров и прочего. В этом текстовом файле как раз и описываются все механизмы автоматизации клиента. Так вот, некоторые моменты, триггера, подсветки и т.п. могли бы быть одинаковыми для всех сетов.
Например, выбрасывание мачтовых штанов актуально, я думаю, практически для всех профессий, кроме разве что варваров. Подсветка ДТ актуальна для всех, и так далее.
Jmc предоставляет механизм глобального файла настройки. В файле с именем global.set можно хранить те же триггера, которые будут использоваться со всеми профилями.
Также можно перенести набор триггеров для автоматического вставания из-под баша туда же, а, например, для профиля, нацеленного на убивание игроков — в самом профиле отключать эту глобальную группу и смело вставать или несмело реколиться руками.

При подготовке данной статьи я попытался претворить все свои советы на практике. Вот что из этого вышло.
В данный момент в моем глобальном сете находятся

  • 7 алиасов
  • 10 триггеров на автовставание
  • 4 триггера на логирование
  • 5 триггеров выбрасывания ненужных вещей
  • 8 триггеров на установление тикера по событияем погоды и времени
  • ну и штук 15 подсветок различной степени нужности...
Соответственно, все эти триггера так или иначе дублировались перед оптимизацией в каждом из сетов для разных чаров на аккаунте.

С начальным заполнением файла global.set у меня возникли некоторые сложности, так что я советую делать это таким образом.
Определите некий набор триггеров, которые будут сохранены в глобальном модуле.
Введите эти триггера в окно ввода. Затем определите группу как глобальную. Пример:
1. Вводим триггер -

#action {^Началась ночь.} {#tickset} {7} {glticker}
2. Вводим триггер -
#action {^Начался день.} {#tickset} {7} {glticker}
3. Делаем группу глобальной
#group global glticker

Теоретически можно делать и через диалог JMC, который позволяет менять триггера и другие настройки, а также вводить глобальные группы и делать их разрешенными или запрещенными; но, по крайней мере у меня, при этих манипуляциях с группами JMC иногда виснет.

В глобальном сете могут храниться только алиасы, триггера и подсветки. А также определения того, что группы, в которые входят алиасы триггера и подсветки — есть группы глобальные. К сожалению, ни замены, ни прочие настройки сохранить в глобальном сете нельзя. Ну, я думаю что и указанного набора достаточно.

Всякие разности...

5. Алиасы для заучиваний

Во время подготовки данной статьи при изучении других ресурсов, посвященных триггерам и вообще использованию клиента jmc, довелось мне увидеть отличный от моего способ заучивания заклинаний кастером. Скажем, даже не способ заучивания, а способ облегчения этого самого заучивания. Как это часто бывает, пока не столкнешься с тем, что кто-то делает по-другому, считаешь свой способ самым обычным и распространенным. Мне, возможно в силу привычки, кажется, что мой способ проще и удобнее в использовании.
Для облегчения работы с заклинаниями у меня в профиле находится такой набор:

#alias {зауч} {зау '%1 %2'} {default}
#alias {зз} {заучить забыть '%1 %2'} {default}
#alias {зс} {заучить стоп '%1 %2'} {default}
Первый алиас используется чтобы заучить некие заклинания. Вроде бы, двух переменных для названия заклинания хватает. Например, команда зауч маг имп добавит в список для заучивания заклинания 'магический импульс'. Алиасы зз и зс позволяют, соответственно, забыть и остановить заучивание заданных заклинаний. Мне кажется, что этот способ намного удобнее, чем написание по три алиаса на каждое заученное персонажем заклинание, вроде того как
#alias {зсф} {зау 'сфера холода'} {default}
#alias {ззсф} {заучить забыть 'сфера холода'} {default}
#alias {зссф} {заучить стоп 'сфера холода'} {default}
А для того, чтобы посмотреть список заклинаний, можно использовать "зау". Ну и обычно все изменяют на сервере для своего персонажа магический разделитель с ' на какой-то другой, для ввода которого нет необходимости менять раскладку с русского на английский, например, на минус.

PS. Полезная добавка от рецензентов.
Хотя статья и рассчитана на тех, кто более-менее активно пользуется возможностями автоматизации клиента JMC, все же было решено добавить и алиасы для колдования заклов.

Вот несколько штук для примера:

#alias {ки} {колд =маг имп=} {default}
#alias {м} {колд =молчание=} {default}
#alias {кмз} {к =масс защ=} {default}
#alias {сф} {колд =сфера=} {default}
#alias {п} {колд =паралич=} {default}

6. Логгируем

С момента написания Эльлеком триггеров на автологирование, он уже нашел более элегантный способ этого действа. Так что покажу, как автологирование сделано сейчас у меня (думаю, многим будет полезно).

#action {^Текущее Московское время :: %1} {#log $DATE.log append;си} {5}
{gllog}
#action {^ 5. WIN (JMC, WIN TELNET, ...)} {5;#log;#tickof} {5} {gllog}
#action {^0) Выход из AdamantMUDа.} {#log} {6} {gllog}
Логи получаются в виде ДД-ММ-ГГГГ.log
Разделение на чаров не используется.

7. Спасаем

Некий простой набор для танка-спасателя емкостью в два спасаемых кастера:
алиасы для установки переменных -

#alias {каст1} {#variable {cast1} {%%1}} {default}
#alias {каст2} {#variable {cast2} {%%1}} {default}
горячая клавиша для реска -
#hot {F10} {пом;#2 спас $cast1;#2 спас $cast2}

Без чего можно обойтись, но не хочется...

8. Группы

В чем удобство использования групп по сравнению с назначением всем алиасам, триггерам, хайлайтам группы по умолчанию default? Удобно, прежде всего, отключать или включать некие группы одним, скажем так, движением руки.
Как это выглядит? Например, есть у вас некий набор триггеров, который используется время от времени, например, при раскачке каких-то умений и т.п. Так вот, для того, чтобы не ходить по всему списку триггеров, выискивая, какой из них вам в данный момент нужно отключить, а какой включить, нужно сделать следующее. Назначить для тренировочных триггеров отдельную группу. А потом только лишь включать ее или отключать при помощи алиаса.
Например:

#alias {рп} {#group disable krit} {default}
#alias {рт} {#group enable krit} {default}
Запустив на выполнение алиас рп — будем иметь запрещенной группу с названием krit, а уже в группе krit у нас есть нужные нам триггера. Обратный алиас — рт, разрешает соответствующую группу.

Полный список возможностей для групп привиден ниже:

Синтаксис: #group {command} [{group_name}]
Эта комманда используется для манипуляции с группами. Доступные команды:
  • list — Показывает список груп определенных на текущий момент.
    Пример: #group list
  • enable — включает группу по имени (включает все alias/actions/highlight, присвоенные этой группе).
    Пример: #group enable pkill
  • disable — выключает группу по имени (Выключает обработку action/highlight/aliases, присвоенных группе).
    Пример: #group disable pkill
  • delete — удаляет группу и все aliases/action/highlights присовенные группе.
    Пример: #group delete pkill
  • info — показывает все объекты в группе.
    Пример: #group info pkill
  • global — делает группу глобальной. Все aliases/actions/highlights, присвоенные этой группе, переносятся в файл global.set и стают доступными все профилям.
    Пример: #group global pkill
  • local — делает группу локальной. Все содержание переносится в файл профиля .set и стает доступным только текущему профилю.
    Пример: #group local pkill

9. Когда триггера совпадают

В частности, бывает так, что необходимо сделать несколько триггеров на одну и ту же строку мада, а потом иногда отключать второй триггер. Чтобы отключить второй триггер, можно назначить ему особую группу, а потом отключить эту группу одним алиасом. Но бывает и так, что вообще невозможно сделать одинаковый шаблон для двух и более триггеров. Т.е., в таком случае вместо двух триггеров

#action {^Вы хотите есть} {вз кус ящ;есть кус} {5} {default}
#action {^Вы хотите есть} {пить фл} {5} {default}
jmc оставит только один триггер. Чтобы обойти эту проблему, в jmc есть специальные флаги, которые указывают на то, что может быть более одного триггера на один и тот же входной шаблон.

#multiaction — команда, позволяющая включать и выключать возможность множественных триггеров на одно событие. Например

#multiaction on
находящаяся в файле установок до добавления двух триггеров, позволит этим триггерам работать совместно. При этом порядок выполнения этих триггеров определится их приоритетом. Т.е., если написать эти триггеры так:
#action {^Вы хотите есть} {вз кус ящ;есть кус} {5} {default}
#action {^Вы хотите есть} {пить фл} {2} {default}
то при приходе от сервера сообщения "Вы хотите есть" сразу сработает питие воды, а уж затем ваш персонаж попытается откушать хлебушка.
Ну, а такой флаг как #multihighlight, автор просит взять на самостоятельное изучение.

10. Замены

Замены, aka сабсты, имеют по не совсем понятной причине свои особенности в JMC. В частности, для них не подходит известный признак начала строки ^, который вполне нормально работает в алиасах, триггерах и подсветках.
Второй момент: список замен не имеет своего отражения в диалоге редактирования JMC объектов. Так что для того, чтобы посмотреть список всех замен, необходимо в строку вбить и выполнить команду #subs. Таким же образом, конечно, можно просмотреть и список всех переменных.

Если при попытке замены у вас ничего не получается, то советую просмотреть список всех замен и попыться убрать лишние замены. Например, когда я пытался сделать замену

#subs {напиток видения невидимых} {*напиток видения невидимых}
и у меня ничего не получалось — пришлось удалить предыдущие замены, которые тоже были неудачными. Тогда же и стало ясно, что ^ не работает в сабстах.

Удалить — #unsubs {^напиток видения невидимых}
чтобы сработало #subs {напиток видения невидимых} {*напиток видения невидимых}

Что еще посоветовали знающие люди...

11. Статус, время, окно вывода

Статус — это три окошка в JMC, в которые можно выводить разные полезные короткие сообщения. Например, имя того, кого будем спасать, или аффекты, которые на вас скастили злобные мобы, или дружественные, добрые и совсем не мародерствующие пкиллеры.

#action {^Вы ослепли!} {#status 3 {СЛЕПОЙ !!!} {light red}} {5} {default}
#action {^Вы прозрели!} {#status 3} {5} {default}
В этих двух примерах используется третье окошко статуса. Первый триггер выводит строку СЛЕПОЙ !!!, второй ее убирает из окна статуса.

Объединяя пример со спасением, можно сделать такой алиас:

#alias {каст1} {#variable {cast1} {%%1}; #status 1 {$cast1} {light blue} }
{default}
#alias {каст2} {#variable {cast2} {%%1}; #status 2 {$cast2} {light blue} }
{default}
Но тогда нужно будет сделать и обнуление данных переменных и, соответственно, очистку окна статуса от уже неиспользуемых имен.

Окно вывода — это еще одно окно JMC, в которое можно выводить некоторые строки из мада. При этом их можно перед этим неким способом обрабатывать и показывать уже в нужном виде. Т.е., это такое объединения замен с выводом. окно вывода пример:

#action {%1 потеря%2 способность разговаривать.} {#output {brown} %1 В МОЛЧЕ !!!} {5} {default}
Если у вас окно вывода в данный момент не используется и его не видно, можно воспользоваться клавишами Alt + 0, а затем это самое окно разместить в том месте, где вам будет удобно им пользоваться.

Из того, что я слышал или читал, в это окно часто выводят личные обращения, разговоры в группе, или, например, то, что было взято из трупа поверженного врага.
У меня не такой большой экран, чтобы комфортно разместить два окна при разрешении в 1024*768, так что я окном вывода не пользуюсь совсем, предпочитая подсветки. Например, для групповых сообщений используется вот такой хайлайт:

#highlight {grey,b light blue} {%1 сказал%2 группе:} {glhigh}

Использование времени

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

показывает время высказывания в эфир

#subst {%1 сказал%2 всем: "%3"} {%1 сказал%2 всем: "%3" $TIME}
показывает личные переговоры
#subst {%1 сказал%2 Вам: "%3"} {%1 сказал%2 Вам: "%3" $TIME}
#subst {Вы сказали %1: "%2"} {Вы сказали %1: "%2" $TIME}
показывает переговоры в группе
#subst {%1 сказал%2 группе: "%3"} {%1 сказал%2 группе: "%3" $TIME}
#subst {Вы сказали группе: "%1"} {Вы сказали группе: "%1" $TIME}
Ну и, естественно, вы должны будете выполнить эти замены во всех сетах, в которых захотите видеть привязку ко времени. Ибо, как я уже писал, замены не сохраняются в глобальном сете.

PS. последовавшее изучение этой темы на практике показало, к сожалению, что хоть время и отображается, но в файл лога оно не сохраняется, увы и увы. Видимо, таки замены притянуты в JMC в более позднее время и срабатывают они совсем не в том объеме, в котором работают, например, триггера :(

12. Один пример...

Ну и в конце статьи хочу привести пример, идею которого подсказал Варманер.

Набор этих триггеров должен помочь хиленьким и слабеньким кастерам осуществлять починку в магазинах.

Для начала делаем алиас для починения одной вещи. Затем делаем алиас для починки оружия из правой руки/двух рук и из левой руки:

#alias {глчин} {снять %1;чин %1;одеть %1} {glrepair}
#alias {глчинп} {снять %1;чин %1;воор %1} {glrepair}
#alias {глчино} {снять %1;чин %1;дер %1} {glrepair}
Дальше делаем набор триггеров, которые получают названия надетых вещей, а затем чинят их.
#action {^<надето на правый палец> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на левый палец> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на шею> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на шею> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на тело> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на голову> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на ноги> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето как обувь> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на кисти> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на руки> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<наброшено на плечи> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<надето на талию> <%1> %2 [%3} {глчин %2} {9} {glrepair}
#action {^<в обеих руках> <%1> %2 [%3} {глчинп %2} {9} {glrepair}
#action {^<в правой руке> <%1> %2 [%3} {глчинп %2} {9} {glrepair}
#action {^<в левой руке> <%1> %2 [%3} {глчино %2} {9} {glrepair}
Затем поступаем так: делаем алиас для починки всех вещей И будем его выполнять, только находясь в магазине:
#alias {почин} {#group enable glrepair;экипировка;танцевать} {glaliases}
Добавляем еще один триггер, чтобы он срабатывал только после того, как полностью отработает экипировка. К сожалению, это необходимо, чтобы починка не прекратилась до того, как клиент получит ответ от сервера.
#action {Вы пустились в пляс.} {#group disable glrepair} {9} {glrepair}
Ну и в самом конце объявляем группу глобальной и делаем ее запрещенной.
#group global glrepair
#group disable glrepair
Натурные испытания показали, что спаму от этого решения много, зато удается чинить практически все вещи без того, чтобы снимать и одевать их по одной.

Йишим

В начало

Другие полезные советы:

На страницу "Новичкам"

 

   
 
       
 


Напоминаем наш адрес: telnet://mud.a-mud.ru:4000
Контактная информация

Adamant MUD Дизайн F Snake (vipera Mandosi)
Copyright 1999 - 2008

   

Adamant MUD: World of the Rings
О Мире: новости, особенности, предыстория, население, кланы и ордена
Информация: правила, справка, карты
Новичкам: с чего начать, генератор имен, полезные советы, ответы на вопросы
Билдерам: памятка, правила, создание зон, FAQ
Ресурсы: download, ссылки
Логи Конференция Творчество: раздумья, песни и пляски, юмор