How to prepare craftbukkit to russian language compatibility (ru)

Краткая инструкция по решению проблемы с кодировками для сервера craftbukkit

История проблемы или зачем это всё нужно

Наверно каждый, кто включал русский язык в майнкрафте, обращал внимание на то, что при попытке набрать что-то в чат на сервер отправлялись какие-то кракозяблики их же можно было увидеть в книгах, а на табличках вместо русских букв появлялись непонятные знаки вопросов. Причина всего это проста. В стандартный клиент майнкрафта включена устаревшая версия библиотеки LWJGL, при вводе символов с клавиатуры, кодирует их не в кодировке UTF-8, а в какой-то безумной смеси: один байт от кодировки UTF-8, а второй - обычный символ в кодировке CP1251. Полученные символы и явлются теми кракозябликами, которые так сильно нас раздражают. Казалось бы, решение простое: нужно обновить библиотеку LWJGL (последняя версия доступна по адресу: http://lwjgl.org/download.php), однако разработчики Minecraft'а не спешат с таким обновлением (как я понимаю из-за каких-то проблем в новой версии библиотеки с Mac'ами), а всех пользователей вручную сменить библиотеку не заставишь. В результате то тут, то там на серверах появляются таблички с "кривыми" символами, а все благодаря тому, что традиционная руссификация методом "подстановки" файла font.txt на самом деле не решает проблемы, а маскирует её: в клиентах, руссифицированных посредством font.txt (и соответствующего графического файла) на самом деле кодировка не исправлена, исправлено только её отображение, а на сервер символы попадают во все том же кривом отображении. Таким образом, у потенциальных игроков на сервере может быть:

  1. Стандартный клиент со стандартной руссификацией и старой версией LWJGL (Windows) — если не прилагать каких-то усилий, то он в принципе не сможет писать на русском.
  2. Стандартный клиент со стандартной руссификацией и старой версией LWJGL (Linux) — насколько знаю тут всё хорошо, UTF-8 в чате, на табличках и вообще. То что он пишет видят все.
  3. Стандартный клиент c руссификатором методом font.txt и старой версией LWJGL (Windows) — клиент пишет в чат на русском. Его не понимают клиенты из п.1 и п.2, но понимают все клиенты из п.3
  4. Стандартный клиент c обновленной версией LWJGL (Windows) — собственно всё нормально текст принимается в UTF-8, игрок видит, что он пишет и его текст понятен всем.

Как с этим бороться

Естественно самым координальным и верным решением было бы устранение изначальной проблемы - внедрением исправленной версией LWJGL в клиент Minecraft'а. Но пока это не сделают разработчики, это решение будет неэффективным. Придется контроллировать игроков, заставлять их либо самостоятельно обновлять злосчастную LWJGL или же усиленно "впаривать" собственный клиент (с обновленной библиотекой). В ряде случаев второй вариант может решить проблему, но по тем или иным причинам ограничивать игроков каким-то специальным клиентом не всегда представляется возможным (да и удобным). Поэтому, при текущей ситуации, сервер направленный на полноценную поддержку кириллицы в игре должен уметь приводить к нормальному виду текст в "кривой" кодировке поступаемый от клиента. Процедура "руссфикации" сервера в этом случае будет выглядеть следующим образом.

Что нужно для организации поддержки русского языка

Собственно, для организации поддержки русского языка нужно не так уж и много:

  1. Убедиться, что при вызове Java для старта сервера, включена поддержка UTF-8 для файлов. Для этого при запуске должен использоваться ключ: -Dfile.encoding=UTF-8
  2. Необходимо внедрить "русский" файл font.txt в craftbukkit.jar. Это необходимо для того, чтобы русский язык начал поддерживаться в табличках (в чате он и так воспринимается нормально).
  3. Установить плагин CPFix, который необходим для того чтобы приводить весь поступающий в чат, таблички, книги текст в едино-верную кодировку UTF-8. С этим плагином даже клиенты под Windows с устаревшей LWJGL смогут с горем пополам писать на русском языке. К примеру, слово "ïðèâåò", поступившее от такого клиента, после перекодировки превратится в "привет".

А как же консоль?

С консолью есть несколько нюансов. Все они связаны с консолью в Windows (в Linux насколько я понимаю с поддержкой кодировки UTF-8 в консоли проблем никаких нет). Поэтому все о чем я буду говорить ниже относится к стандартной консоли Windows. Для того чтобы консоль нормально отображала текст UTF-8 (т.е. сообщения игроков в чате, текст выводимый плагинами на русском) необходимо включить в ней вывод в кодировке UTF-8. Проще всего это сделать вызвав команду chcp 65001. И уже после этой команды запускать Java. В качестве примера привожу содержимое cmd-файла, которым я запускаю свой "домашний тестовый" сервер:

chcp 65001
"%ProgramFiles%\Java\jre7\bin\java.exe" -Xms1024M -Xmx1024M -Dfile.encoding=UTF-8 -jar craftbukkit.jar
pause

После этого, сервер будет поддерживать вывод текста на русском языке (и кстати в цвете - тоже). Однако остается одно огромное "но": Windows-консоль не поддерживает ввод текста в кодировке UTF-8! То есть не поддерживает ВООБЩЕ! То есть текст вы на русском читать сможете, а писать нет. Лично меня это устраивает: на домашне-тестовом сервере писать что-то с консоли на русском не приходится, а на активном игровом сервере вряд ли будет использоваться Windows.

Однако если уж очень хочется, то можно и заставить консоль "принимать" русский текст. Для этого придется устроить небольшую чехарду с кодировками. Во-первых, надо будет отказаться от кодировки UTF8 в консоли. Т.е. убрать chcp 65001 из командного файла, которым запускается сервер. Также необходимо будет отключить поддержку UTF-8 для файлов (т.е. убрать из строки запуска Java ключ -Dfile.encoding=UTF-8). В результате мы получим вот такой файл:

"%ProgramFiles%\Java\jre7\bin\java.exe" -Xms1024M -Xmx1024M -jar craftbukkit.jar
pause<</code>>

Теперь необходимо в настройках плагина CPFix (версии 0.2.0) настроить перекодирование текста из консоли:
<<code yml>>output-recode:
  console:
    enable: true
    code-page: CP866
  server-log:
    enable: true
    code-page: CP866
input-recode:
  enable: true
  code-page: CP866

Все эти опции отключены по умолчанию, но в файле настроек присутствуют - нужно включить и перезагрузить сервер. Кстати, если вы используете в консоли какую-то другую кодировку, то можете подставить и её. Ну и кстати, кодировку журнального файла (server-log) может отличаться от кодировки консоли: в консоль текст может выводиться в CP866, а в server.log при желании можно вести в UTF8.

Собственно после этого можно будет вводить в консоли текст на русском и сервером, а также плагинами он будет восприниматься адекватно. И команда /say Привет! будет понята всеми :)

Что и где качать?

  1. Craftbukkit лучше всего брать с оффсайта: http://dl.bukkit.org/
  2. Файл font.txt можно взять тут: https://dl.dropbox.com/u/64799811/CPFix/font.txt
  3. Плагин CPFix всегда доступен тут: http://dev.bukkit.org/server-mods/cpfix/