1. Отображение наложенных на персонажа эффектов
Мод показывает наложенные на персонажа игрока эффекты в виде иконок и время до их окончания (см. скриншот).
Время действия эффекта может зависеть от уровня умения, которое накладывает на персонажа данный эффект, либо указывается в скриптах сервера, например, для НЯ, БУ, СУС и так далее. Поэтому, при первом наложении эффекта определенного уровня, мод будет засекать время его действия (калиброваться) и выводить время в течение которого он уже действует. При последующих наложениях эффекта будет отображаться время, которое осталось до окончания его действия, а на иконке эффекта будет проигрываться анимация КД.
Игрок может настраивать мод с помощью команд чата, либо путем редактирования конфигурационного файла:
1) /mod.plug.[enable|disable] - Включить или отключить мод;
2) /mod.plug.setpos([x], [y]) - Установить координаты (X, Y) расположения панели с эффектами;
3) /mod.plug.setlinesize([number]) - Установить количество иконок в строке на панели эффектов. Например, при [number]=3 4-я иконка будет располагаться под 1-й, 5-я под 2-й и так далее;
4) /mod.plug.seticon([id], [level], [icon]) - Установить иконку для эффекта с ID [id] уровня [level]. Иконка эффекта может зависеть от его уровня. При значении [level]=0 иконка будет установлена для всех уровней эффекта;
5) /mod.plug.language.[rus|eng] - Выбрать язык: русский или английский;
6) /mod.plug.timereset - Сбросить записанное время действия эффектов (сбросить калибровку);
7) /mod.plug.effects - Отобразить в системном чате наложенные на персонажа игрока эффекты (см. скриншот);
8) /mod.plug.settings - Отобразить в системном чате текущие настройки мода.
2. Отображение ЖЗ игроков, монстров и количества ресурсов рядом с ними
Данная модификация отображает жизни игроков, монстров и количество ресурсов в виде текста рядом с их моделями на игровой сцене (см. скриншот).
Мод можно настроить используя команды чата, либо с помощью текстового редактора, отредактировав конфигурационный файл:
1) /mod.hp.[enable|disable] - Включить или отключить мод;
2) /mod.hp.show.players.[enable|disable] - Отображать или скрывать ЖЗ других игроков;
3) /mod.hp.show.me.[enable|disable] - Отображать или скрывать ЖЗ персонажа игрока;
4) /mod.hp.show.enemy.[enable|disable] - Выделять цветом друзей и врагов, а также ресурсы;
5) /mod.hp.language.[rus|eng] - Выбрать язык: русский или английский;
6) /mod.hp.settings - Отобразить в системном чате текущие настройки мода.
3. Иконки для гильдий
Мод позволяет устанавливать гильдиям иконки, которые отображаются рядом с их названием под именем персонажа. Возможно реализовать выбор иконок, которые уже находятся в ресурсах клиента, так и иконок динамически подгружаемых с сервера. Иконку можно установить, например, с помощью LUA-функции, либо через веб-сайт.
4. Автоматическое использование кексов
Этот мод автоматически использует кексы и другие предметы восстановления при значениях ЖЗ персонажа ниже определенного. В настройках мода можно указать ячейку инвентаря, из которой использовать кексы, либо установить автоматический поиск кексов в мешке персонажа; отключать и включать сообщения в систему; устанавливать частоту использования кексов. ID кекса и других предметов восстановления также указываются в настройках.
Мод можно включать и отключать с помощью команд чата:
1) /cake-enable - Включить мод;
2) /cake-disable - Отключить мод;
3) /cake-settings - Вывести текущие настройки мода.
5. Кастомная кнопка
Мод добавляет в GUI клиента новую кнопку, при нажатии на которую игрок переходит в Discord-чат сервера.
6. Функция для GameServer.exe, которая позволяет изменять имена Монстров, NPC, Игроков для данного игрока
С помощью этой функции можно изменять имена монстров, NPC и игроков (@other), которые отправляются при синхронизации данному игроку (@role). Например, можно сделать чтобы игрок "V3ct0r" (@role) видел Лесного духа (@other) с именем "AAAAAAAA", а игрок "Test1024" (@role) видел Лесного духа (@other) с именем "ББББББББ". Или игрокам можно добавлять в имя уровень их персонажа, а в именах монстров выводить их ID из CharacterInfo.txt (см. пример кода выше).
7. Функция для GameServer.exe, которая позволяет выбирать точку воскрешения персонажей игроков
При смерти персонажа игрока вызывается функция GetChaRespawnPoint(), в которой можно выбрать точку воскрешения в зависимости от различных условий. Функция может понадобиться при создании карт для командных сражений типа Священной войны и Войны гильдий, так как при смерти игрок воскрешается на последней записанной точке вне карты.
8. Обход антибота (DLL, которая автоматически распознает капчу и отправляет ответ на сервер)
При запросе ответа на капчу, сервер отправляет клиенту 4 случайных BMP-изображения из папки GameServer\resource\Pic. Эти изображения являются монохраматическими, т.е. имеют цветность 1 бит (палитра состоит из 2 цветов - белого и черного), размеры 26 на 29 пикселей и весят 178 байт.
Сначала у меня была идея скопировать эти изображения с символами в клиент и просто побайтово сравнивать их с изображениями, полученными от сервера, таким образом определять текстовые символы. Но оказалось, что сервер перед отправкой изображения случайным образом добавляет в него шумы, т.е. каждый раз клиент получает разные изображения и их нельзя сравнивать.
Изображения, которые лежат в папке Pic сервера:
Примеры изображений, которые получает клиент:
Тогда я решил воспользоваться библиотекой для распознавания текста: даем ей на вход изображение символа, получаем на выходе текстовый символ. Чтобы повысить вероятность корректного распознавания символов, я написал простую функцию, которая убирает шумы:
=> => "M"
Стоит отметить, что DLL распознает капчу с не 100% вероятностью: могут возникать ошибки распознавания текста. Если DLL вообще не может распознать какой-либо символ из 4-буквенного кода, то появляется окошко для ввода капчи и управление процессом передается пользователю (на скриншоте в шапке поста окошко ввода капчи отображается принудительно). Также DLL может перепутать символы, например, символ "6" на изображении определить как букву "C", в этом случае на сервер будет отправлен неверный код, и сервер может кикнуть игрока после 3-ех неверных попыток.