nerevar / jmc Goto Github PK
View Code? Open in Web Editor NEWJMC - Jaba Mud Client
JMC - Jaba Mud Client
Есть что-то типа такого https://github.com/nerevar/jmc/blob/master/sources/help/woutput.jht - документация на английском про команды
Список всех команд - https://github.com/nerevar/jmc/blob/master/sources/ttcoreex/cmds.h
Логи в окнах вывода пишутся жестко в текстовом виде. Предлагаю сделать возможность для них выбирать формат (TEXT, ANSI, ANSI+RMA, HTML) как для основного лога.
Падает в настройках (Actions и Hotkeys).
Aldaran:
Если в строке более 2х замен, а строк 14-15 и более, то жаба вылетает...
[adv gri 15]
Raising Grishnak [decedent] [Attack] Гришнак from level 1 to level 15!
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] амулет живой земли.
[decedent] [PK] Алдаран снЯл с себЯ факел.
[decedent] [PK] Алдаран снЯл с себЯ знак Ульмо.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] прозрачный браслет.
[decedent] [PK] Алдаран снЯл с себЯ перчатки старого мечника.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] прозрачный браслет.
[decedent] [PK] Алдаран снЯл с себЯ медвежью маску.
[decedent] [PK] Алдаран снЯл с себЯ кольцо * свЯтости *.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] кольцо с глазом медведЯ.
[decedent] [PK] Алдаран снЯл с себЯ всевидЯщие * очки *.
[decedent] [PK] Алдаран снЯл с себЯ длинную юбку.
[decedent] [PK] Алдаран снЯл с себЯ свиток 'очаровать'.
[decedent] [PK] Алдаран снЯл с себЯ кинжал предков.
[decedent] [PK] Алдаран снЯл с себЯ костЯное лезвие.
[decedent] [PK] Алдаран снЯл с себЯ легкий панцирь.
[decedent] [PK] Алдаран снЯл с себЯ курительный жакет.
[decedent] [PK] Алдаран снЯл с себЯ расшитые сапожки.
[decedent] [PK] Алдаран снЯл с себЯ бараньи рога.
[decedent] [PK] Алдаран снЯл с себЯ темный плащ.
[decedent] [PK] Алдаран снЯл с себЯ золотой поЯс с лилиЯми.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] щит предков.
В этих случаях произошел вылет.
В данный момент из скрипта весьма проблематично узнать о смене профиля (только постоянным опросом jmc.Profile в обработчике jmc.Incoming и с безосновательным предубеждением, что при загрузке профиля JMC что-нибудь да выдаст).
Логичной выглядела бы полная перезагрузка движка (как при нажатии на Reload scripts).
Можно, впрочем, и новое событие добавить, но вряд ли это имеет смысл.
круто бы было если б можно было задавать анси цвета типа $RED или $BLUE для #show в жабе) а не копировать каждый раз эту последовательность символов из других источников.
1. не во всех мадах это стандарт. вот и... что ж до &R... у меня используется похожее решение
#var R ESC[?;3?m
#showme $R\something red
При вызове jmc.SetTimer(TimerID,...) в обработчике срабатывания таймера TimerID (например, для смены периода) возможно бесконечное зацикливание.
Это происходит в том случае, если за время просмотра таймеров (цикл в конце ReadMud() ttcoreex.cpp) изменится значение GetTickCount(). Оно сохраняется в начале цикла, а при вызове SetTimer заново вычисляется и проставляется в m_dwLastTickCount. В результате может получиться, что таймер "последний раз сработал" как бы в будущем времени. Беззнаковое вычитание (dwTick - ptm->m_dwLastTickCount) (ttocreex.cpp:1086) даст большое число, заведомо превышающее интервал, обработчик таймера будет снова вызван (Fire_Timer) и т.д.
Надо либо сменить вычитание на знаковое (грамотное решение, включающее обработку момента переполнения и обнуления системного счетчика), либо обновлять значение dwTick = GetTickCount() после каждого FireTimer().
Хочется обрабатывать несколько строчек в одном месте, "склеивать их".
Как пример, получение квеста:
Вы попросили у Маслютика дать вам задание.
Маслютик говорит 'О Нэй, мне нужна ваша помощь!'
Маслютик говорит 'Подлый преступник призрак авантюриста обокрал местный банк'
Маслютик говорит 'и убил девЯть городских стражей!'
Маслютик говорит 'Совершите правосудие и уничтожьте преступника!'
Маслютик говорит 'Ищите призрака авантюриста в месте под названием У маленького дома.'
Маслютик говорит 'Это где-то в районе Руины Форноста (Fornost).'
Маслютик говорит 'У вас есть 28 минут на выполнение заданиЯ, потом будет поздно!'
Может быть обработано с помощью:
#act {quest} {1} {Вы попросили у Маслютика дать вам задание.}
#act {quest} {2} {%1 говорит 'Подлый преступник %2 обокрал местный банк'}
#act {quest} {3} {%1 говорит 'Ищите %3 в месте под названием %4.'}
#act {quest} {4} {%1 говорит 'Это где-то в районе %5.'}
#act {quest} {#var mob %2; #var place %4; #var area %5}
В последней строке общий namespace для переменных, полученных во всех строках.
Тут нужно явно определить первую и последнюю строки, которые обязательны.
Остальные строки в середине опциональны, также между первой и последней строками должно быть не больше N строк (не больше 50-100 например).
Предусмотреть, чтобы строки > 1 не срабатывали, если первая не нашлась.
Предусмотреть удобную систему плейсхолдеров для переменных %1, %2, ..., %25...
Вывод в окна 0, 1, ... строк, содержащих символ '&' некорректен, а именно последние символы этих строк закрашиваются фоном и видны только при выделении мышкой.
Причина: куда-то делся флаг DT_NOPREFIX в pDC->DrawText() (AnsiWnd.cpp:434). Во всех остальных местах он стоит (AnsiWnd.cpp:346, smcView.cpp:437, smcView.cpp:561).
Конечно важная фича. Особенно в свете развития Tor и встроенного в него локального SOCKS4/5-сервера.
Видится что-то вроде:
И совсем удобно, если ещё и поддержка proxy-lists:
Также для Тора будет полезно добавить функцию форсированной смены выходной ноды... но тут надо разобраться, не возникнет ли при этом проблем у открытых TCP-соединений; по идее, не должно бы быть.
[07.11.13, 10:49:43] Евгений: хм. странно, в жабе 3.6 когда в редактировании конфига набираю #wait
- крашит жабу.
Причем пробовал как #+w+a+i+t
- на "t" - крашит
Пробовал t+i+a+w+#
- справа налево, крашит на "#"
[07.11.13, 10:50:56] Евгений: напрямую если. в строке ввода набрать смотреть;#wait 10;смотреть
- работает. смотрит, ждет секунду, смотрит снова
Создать информационный сайт о JMC на github pages, используя Jekyll и/или Jekyll Bootstrap.
Разделы сайта:
Имею вот такой триггер.
#act {^[%1|%2 %3 %4 (%5ч) %6(%7)} {#math {hpchange} {%1 - $currenthp};#showme $hpchange;#var currenthp %1}
Суть такова. Я хочу считывать текущее хп, сранивать его с предыдущим значением хп и показывать разницу, чтобы видеть на сколько меня накернили.
Но, showme видимо срабатывает раньше чем #math, потому что он всегда мне показывает предыдущее значение.
Пример:
[299|604 90 371 (12ч) 2730834(51692) СВЮЗ ПолупьЯный корсар:корчитсЯ от боли>
Ударом кулака полупьЯный корсар цеплЯет вас!
Острыми зубами бродЯчий пес цеплЯет вас.
Укус бродЯчего пса цеплЯет вас!
Укус бродЯчего пса слегка повреждает вас!
Укус бродЯчего пса цеплЯет вас!
Укус бродЯчего пса слегка повреждает вас!
0
[251|604 90 370 (12ч) 2730834(51692) СВЮЗ ПолупьЯный корсар:корчитсЯ от боли>
Своей дубиной вы встрЯхиваете полупьЯного корсара!
Сильный удар полупьЯного корсара слегка повреждает вас!
Укус бродЯчего пса слегка повреждает вас!
-48
[233|604 90 369 (12ч) 2721743(60783) СВЮЗ ПолупьЯный корсар:почти мертв>
Предлагаю все вычислительные и "назначательные" команды типа #math и #var выполнять в первую очередь при обработке триггеров.
Что касается данного примера, то если я вместо #showme поставлю #var hpchange, то он покажет своё текущее значение которое высчиталось #math'ом, но мне это не подходит потому что там будет целая телега:
{hpchange} == {-8}\033[0;37m
такое читать неудобно, даже когда мы дождёмся фикса вывода сиране ansi цветов
JMC does not use new changed variable's value:
Example:
#var target 1
#var target 2;#show output - $target
output - 1
#var temp 1
#var temp 2;#var temp 3;#show "Temp is $temp"
"Temp is 1"
Now, if you want to get exact value of variable, you can use JavaScript:
[#var gameme]
{gameme}={0}
[#scr {jmc.Setvar("gameme", "1");};#scr {jmc.Setvar("gameme", "3");jmc.showme(jmc.GetVar("gameme"))}]
3
Иногда при логировании в формате Text клиент виснет.
Кейс (можно сделать через MUD-эмулятор): входная строка "\1xb0"
Более обще: строка начинается с символа 0x1B и не содержит символа 'm'.
Причина: в функции processTEXT() (Log.cpp) в указанном случае метод string::erase() вызывается с параметрами (0, 0) и таким образом не меняет строку, т.е. цикл выходит бесконечным.
Необходимо добавить проверку (endEscPos == string::npos).
Команда logpass не имеет эффекта. Причина: логика логирования такова, что сначала производится запись полученной от сервера строки в лог (проверка bLogPassedLine и вызов ф-ии log()), а только потом выполняется обработка полученной строки (Fire_Incoming(), триггеры, замены, подсветка). Либо это ошибка и ttcoreex.cpp::process_incoming() надо переписать, переставив местами запись в лог и обработку строки (причем в основном цикле порядок как описано, а после цикла в ветке if(!more_coming) порядок обратный, т.е. в редких ситуациях JMC будет работать иначе, чем обычно). Либо такая логика и подразумевалась (в лог пишется as-is, пользователь же видит настроенное под себя отображение), но тогда нужен фикс команды logpass.
В чистой новой JMC при #var странные цвета добавляются в конец:
Команды логирования основного окна (log) и нулевого дополнительного (wlog 0) являются синонимами (т.е. имеют ровно одинаковый эффект, в том числе отменяют одна другую). При этом получающийся лог содержит текст из обоих этих окон. С учетом того, что логи окон вывода идут жестко в текстовом формате, может получиться "микс" из строк разного формата.
Можно было бы рассматривать это как фичу, если бы, судя по исходникам, не подразумевалось (ожидаемое пользователем) разделение между этими логами. Функция Logs.cpp::StartLog() принимает первым параметром (wnd) "-1" от команды "log" и "0" от команды "wlog 0", однако далее в тексте идут сравнения типа (wnd > 0), таким образом объединяя эти два случая в один. Видимо, нужно нестрогое сравнение всюду в Logs.cpp::StartLog(int,...) и ещё в Logs.cpp::log(int, string).
навеяно бэкридом
На данный момент JMC прорисовывает строки так быстро, как только может. Соответственно при большом количестве строк для вывода прорисовка (со всеми виндовыми update-ами) происходит максимум 500Гц (фактически, строк в секунду), похоже независимо от железа даже. С учетом монитора (50-60 Гц) и человеческого глаза (24 Гц), это чрезвычайно избыточная скорость. При ограничении до 25 Гц (hard-coded минимальный интервал между update-ами 40 мс), скорость вывода большого количества строк возрастает практически пропорционально (в 15-20 раз).
Предлагаю это сделать, хотя и редко когда это действительно будет полезно, но хуже быть не должно.
Need to support A..Z, a..z, 0..9, _ in variable names
При формировании бесконечного цикла команд - жабу крешит при накоплении како-то буфера..
т.е. набор тригеров:
крешит
3.6.1.1 при 53 операциях.
3.0.5 при 32 операции.
3.26 при 80 операциях
А теперь вопрос =)
можно как то увеличить буфер?
Креш я так понимаю из за переполнения очереди команд происходит ведь?
Краеугольный камень MUD'ов, вот проблемы, которые я вижу:
В JMC это всё приводит к необходимости использовать костыль "Uncompleted lines delay" (в MMC и zMUD красивого решения я тоже не увидел).
Пока нарисовалось такое решение:
т.е. интегрально что-то вроде этого:
prompt <%h|%H %m|%M>31415
Кто-нибудь проверял одновременную работу большего кол-ва таймеров? Как бы мне кажется что их работа частенько глючит (не всегда)... Пример:
https://www.dropbox.com/s/s4ltckkx3a6ds5i/bug.txt
Хз, мне кажется есть какая-то закономерность, но не уверен, вообщем больше 6 таймеров за раз лучше не запускать:
https://www.dropbox.com/s/bw2fb490dbmum53/timer_work.txt
Немного изменил скрипт на пуск цепочки команд (задержка-команда...предыдущее задержка+новая задержка-команда...). Вообщем доработанный скрипт дробит цепочку, выполняя первые 4 команды, 5й командой идет алиас с запуском этого же скрипта с продолжением цепочки... Полет нормальный...
Aldaran:
Отсутствует команда "#ungag", в справке в предыдущей версии jmc 3.5.00 beta от 14 июня она присутствует, но как таковой такой команды нет ни в той, ни в этой версии.
Хотелось бы дополнительную команду, по очистке дополнительных окон.
Что-то вроде #wclear <1-10>
и поддержку в скриптинге в виде jmc.wclear(<1-10>)
.
Почему-то при записи логов в HTML-формате на данный момент черные текст и фон отрисовываются как тёмно-серые:
.bl{color:#555}
.b_bl{background-color:#555}
Выглядит не очень и, главное, не так, как в JMC. По-моему, должен быть унифицированный подход: и там и там одинаково.
Соответственно, совсем уж здорово будет генерить CSS-таблицу в зависимости от настроек ANSI-цветов в JMC.
Не работает jmc.DropEvent() при обработке jmc.Incoming. Единственный способ предотвратить появление строки в главном окне -- присвоить jmc.Event не-строковое значение (например, jmc.Event = null), что не очень удобно. Похоже, в ttcoreex.cpp:710 не хватает проверки значения bRet ("if ( bRet && ...")
Было бы интересно, на мой взгляд, добавить в HTML-логирование опцию, при включении которой формируемая страничка содержит дополнительные элементы а-ля плеер (пуск, пауза, стоп, ползунок) с построчным выводом текста в соответствии с реальными задержками времени, какими они были при записи лога.
Перезревшая функция, но при наличии соединения через proxy ещё будет актуальной.
Можно сделать управляемой (#mccp on|off), хотя большого смысла не вижу.
чтобы не были фиксированные, а растягивались в рамках действующей ширины окна, в зависимости от своего содержания.
протестировать без скобочек {}
типа:
Try to use both versions from activeperl site:5.20.1.2000 and 5.18.4.1803 And get an Error with PerlSE.dll(shared memory permission denied)
But when i install older versions(which could not be downloaded from official site for free...) 5.6.1.638 script engine works fine.
Mudmapper http://jmc.bl.ee/?md=mm
Здравствуйте,
Подскажите, пожалуйста, это собрать? Чем? Я пробовал VS2010 и VS2015. После определённой работы напильником оно скомпилировалось, однако вылетает в AnsiWnd.cpp:97, т. к. AfxGetMainWnd(); возвращает NULL. Я не силён в MFC, но должно же это как-то собираться, в рабочий билд?
С уважением,
Антон Горев
записываю в лог (использую #wlog 1 ADD/$charname_$charclass.csv) убиенных мобов, свой уровень и количество полученного опыта (использую ).
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 20:34
7,Кто-то,2751
7,Клоп,418
7,Сверчок,4074
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 21:11
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 21:36
7,Тэд,27564
7,Рабочий,9150
7,Косоглазый рабочий,8954
7,ТолстЯчок,7009
7,Рабочий,7541
7,Рабочий,8951
7,Рабочий,7009
7,Рабочий,7259
7,СераЯ мышка,1502
7,Кочегар-лентЯй,8576
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
7,Кочегар-лентЯй,12136
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:26
7,Житель БрылЯ,10856
8,Повариха,40015
8,Серый паук,15172
8,БелаЯ голубка,8849
8,Жаба,4498
8,Жаба,4257
8,Черепашка,1943
постоянно приходится чистить логи от бесполезных для меня в данном случае строк:
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
Можно ли сделать их появление опциональным?
Очень давняя тема: возможность учитывать в триггерах цвет текста/фона.
Весь вопрос в механизме реализации.
На мой взгляд, правильнее сделать это отдельной сущностью (типа #caction): во-первых, ради полной обратной совместимости, во-вторых ради, собственно, простоты реализации и применения.
Далее, самый простой вариант: проверять цветные триггеры до удаления ansi-команд из строки. Это легко сделать, но, очевидно, возникает проблема правильного (байт-в-байт) ввода, и нет простого механизма это сделать (видимо, писать лог и копипастить нужные строки из него). Предлагается сделать механизм преобразования цветовых ansi-команд такой, чтобы одинаково выглядящие строки транслировались в ровно идентичные байтовые представления (например, удаление команд не имеющих эффекта: дублирующих предыдущие цвет-фон или после которых до следующей команды нет текста). При этом можно заменить сами команды чем-то более легко читаемым/печатаемым (как, например, в ROM "{" или в SMAUG "&" "^*").
Предлагаю добавить запись в лог сообщений, показываемых командами showme и из скрипта (jmc.ShowMe()). Это, в общем, перекликается с вопросом идеологии логирования: писать "как показывает происходящее MUD" или "как видит происходящее игрок". Возможно, имеет смысл ввести такую глобальную настройку даже.
Предлагаемое же делается элементарно: добавлением в CJmcObj::ShowMe() и Misc.cpp::showme_command() кода log(processLine(...)); log("\n");
Test 1
Ошибка была внесена в ревизии f73840c
Logs.cpp:251:sprintf(logTitle, rs::rs(1258) , logName);
Происходит обращение к ресурсу с номером 1258, который не существует:
1257 "#Auto reconnect is now %s."
END
В результате rs::rs(1258) возвращает NULL и sprintf пытается напечатать строку по нулевому адресу. Что и приводит к кордампу.
Решение:
В старых версиях была команда #strcmp
Trying to access the JMC.* functions/object from a script in Windows 8.1 crashes JMC or the script, depending on what language is selected.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.