Вспоминаем былое: поднимаем сервер Lineage и становимся героем

Вспоминаем былое: поднимаем сервер Lineage и становимся героем
Привет, Хабр! Меня зовут Вова Туров, я разработчик в Selectel. Я познакомился с Lineage 2, когда был в начальной школе. Играл несколько лет, но замедление прогресса с ростом уровня было невыносимым, а запустить свой сервер было сложно. Так я забросил «линейку» на многие года. С тех пор заинтересовался IT, получил два высших образования и начал писать статьи на Хабр. Но мысль про свой сервер не оставляла меня.

Что произошло с игрой за 10+ лет? Можно ли сегодня прикоснуться к игре детства? Действительно ли «раньше было лучше» или это когнитивное искажение? Ответы на эти и другие вопросы ждут вас под катом.

Дисклеймер: статья написана исключительно в ознакомительных целях.

Я начал играть в Lineage 2 с версии Chronicle 4: Scions of Destiny, сокращенно — С4. Спустя время сервер обновился до версии Interlude, которую называют C6. Именно на С6 я провел больше всего времени.

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

Большая часть интерфейса была на английском, как и сюжеты квестов. Английский я тогда не знал, а охотиться на монстров скучно. Вкладывал все силы в социализацию, так что прокачал персонажа только до 64 уровня из 80 возможных. Экипировку и прочие ценные вещи мне помогали доставать взрослые. Все происходило без внутриигровых покупок!

Даже спустя 13 лет в моей памяти сохранились воспоминания о главной площади Гирана, где было поле «торгашей», и недосягаемость красивого замка Аден. Пора проверить свои школьные олдскулы на прочность. Так ли хороши пейзажи городов, как мне подсказывает память.

Время начинать!

Используйте навигацию, если не хотите читать текст полностью:

Клиент игры
Игровой сервер?
В небо и выше
Если хочется поновее
Руофф
Заключение

Клиент игры


Lineage 2 — это корейская MMORPG от компании NCSoft, вышедшая в 2004 году. Упомянутые хроники С4 вышли в 2006, а С6 — в 2007. Официально эти версии в России и странах СНГ не появлялись. Интерфейс был переведен лишь частично, а квесты… Только обязательные, связанные с развитием персонажа, и то не факт. В базах знаний было написано «поговорите с X», а чего он там говорит — не так важно. 🙂

Официально в России Lineage 2 появилась в декабре 2008 года в версии Gracia Part 1, что через две версии после выхода Interlude. Издателем выступила компания «Иннова», которая до сих пор представляет Lineage 2 и все модификации на территории России.

В отличие от Minecraft, Factorio и прочих многопользовательских игр, Lineage 2 никогда не была «открытой». У Lineage 2 были только официальные сервера: в Южной Корее, Китае, США, Европе и России. Игровой клиент был ограничен достаточно строгими правилами — распространять и модифицировать клиент нельзя.

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

  • Клиенты всех версий до High Five (2010-2011) не запускаются на Windows 10 x64. Процесс есть, а GUI не появляется.
  • Хотя клиент High Five запускается, он пытается обновить античит с серверов NCSoft, а там уже ничего нет. Так что игра закрывается.
  • В игре используется античит nProtect GameGuard. Он же используется в Helldivers 2.
  • Я субъективно сделал вывод, что Interlude является одной из самых популярных версий «оригинальной» игры.
  • Говорят, что существует клиент Interlude от NCSoft с фиксом для Windows 10.

В общем, если у вас сохранился официальный клиент Interlude, то доставайте виртуальную машину, устанавливайте Windows 7 или даже ХР и продолжим.

Игровой сервер?


Как и говорилось ранее, игровой сервер Lineage 2 существует только в одной форме: в официальной. Все остальное — игристое программное обеспечение. Исходного кода сервера в открытом виде нет. Что делать?

В 2005 году энтузиасты создали ответ на этот вопрос: эмулятор сервера L2J, написанный на Java с открытым исходном кодом под лицензией GPLv3. Сервер реализует большинство игровых механик, но даже сейчас какие-то из вариантов в квестах могут быть отмечены как «NOT IMPLEMENTED». Самый свежий коммит в проекте на момент написания статьи — 11 мая 2024, так что проект скорее жив. Попробуем развернуть.

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

Эмулятор L2J состоит из следующих частей:

  • LoginServer — точка входа, которая хранит информацию об учетных записях пользователей и позволяет игрокам выбрать нужный сервер;
  • GameServer — реализация игрового сервера;
  • Datapack — информация об игровом мире: реализация ИИ-монстров, неигровых персонажей, квестов, и т. д.;
  • Geodata — информация об окружении. Позволяет серверу корректно обрабатывать ситуации, когда персонаж проваливается сквозь землю.

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

Для запуска сервера нужно подготовиться.

  1. Установить git и Java 21.
  2. Установить и преднастроить mariadb.
  3. Открыть порты 2106 (вход для пользователей на LoginServer) и 7777 (игровой сервер).
  4. Закрыть порт 9014 (порт для подключения игровых серверов к логин-серверу).

Я выполняю все команды на Ubuntu 22 и разворачиваю сервер версии Interlude. Подробнее процедура описана в документации l2jserver, но для версии High Five, последней в «оригинальной» игре.

Планируете запустить собственный сервер для игры Lineage 2? Используйте выделенные серверы, чтобы создать надежное и мощное окружение для вашей игровой платформы.

# Ставим рекомендуемый дистрибутив JVM
apt install -y wget apt-transport-https gpg
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null
echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
apt update
apt install temurin-21-jdk
# Ставим git и unzip
apt install git unzip
# Ставим mariadb
apt install mariadb-server

Настраиваем mariadb:

# mysql_secure_installation
Switch to unix_socket authentication [Y/n] y
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Создаем пользователя с максимальными правами для l2j:

# Заходим в БД, пароль по умолчанию пустой
mariadb -u root -p
# Выполняем команды, используйте другие пароли!
CREATE OR REPLACE USER 'l2j'@'%' IDENTIFIED BY 'l2jserver2019';
GRANT ALL PRIVILEGES ON *.* TO 'l2j'@'%' IDENTIFIED BY 'l2jserver2019';
FLUSH PRIVILEGES;
exit

Игровой сервер не нуждается в правах суперпользователя, поэтому выделяем отдельного пользователя и далее работаем от него.

# useradd game
# su - game 

Клонируем репозитории l2j:

mkdir ~/git
cd ~/git
# Ветка master, последняя актуальная версия
git clone -b master https://bitbucket.org/l2jserver/l2j-server-login.git
# Эмулятор сервера, выбираем ветку Interlude
git clone -b Interlude https://bitbucket.org/l2jserver/l2j-server-game.git
git clone -b Interlude https://bitbucket.org/l2jserver/l2j-server-datapack.git

У эмулятора сервера есть ветки на большинство игровых хроник, но все, кроме Interlude и High Five, не развиваются с 2015 года. Собираем:

cd ~/git/l2j-server-login/
chmod 755 mvnw 
cd ~/git/l2j-server-game/
chmod 755 mvnw 
cd ~/git/l2j-server-datapack/
chmod 755 mvnw 

Деплоим:

# Логин-сервер
mkdir -p ~/server/login
cd ~/server/login
unzip ~/git/l2j-server-login/target/l2j-server-login-*.zip -d .
# Игровой сервер
mkdir -p ~/server/game
cd ~/server/game
unzip ~/git/l2j-server-game/target/l2j-server-game-*.zip -d .
unzip ~/git/l2j-server-datapack/target/l2j-server-datapack-*.zip -d .

Теперь инициализируем базу данных начальными значениями. Это делается через отдельную утилиту l2j-cli:

mkdir ~/cli
cd ~/cli
wget https://l2jserver.com/api/download/cli/latest -O /tmp/l2jcli-latest.zip
unzip /tmp/l2jcli-latest.zip -d .
chmod 755 l2jcli.sh
db install -sql /home/game/server/login/sql -u l2j -p l2jserver2019 -m FULL -t LOGIN -c -mods
db install -sql /home/game/server/game/sql -u l2j -p l2jserver2019 -m FULL -t GAME -c -mods
quit

У меня в процессе установки скриптов была одна ошибка, но она не повлияла на результат:

Running l2jdb_create.sql...
[WARN ] 2024-05-17 18:53:07 ErrorPacket - Error: 1050-42S01: Table 'accounts' already exists
There has been an error executing file l2jdb_create.sql!
java.sql.SQLSyntaxErrorException: (conn=105) Table 'accounts' already exists

Если все выполнено верно, то в mariadb появится две базы данных: l2jgs и l2jls, для игрового сервера и логин-сервера соответственно. Осталось сконфигурировать общие параметры приложения.

  • ~/server/login/config/database.properties — меняем имя пользователя и пароль для подключения к mariadb.
  • ~/server/game/config/rates.properties — настройки внутриигровых множителей, по умолчанию множитель для всех параметров 1.
  • ~/server/game/config/server.properties — настройки сервера. Меняем базу данных в URL с l2jdb на l2jgs; Login=l2j; Password=l2jserver2019; MinProtocolRevision=737.

Множители сервера можно оставить без изменений, ведь если вы пришли «пробежаться» по воспоминаниям, то меню администратора решит все ваши проблемы. Но если вы поставите слишком большие числа, например, 10000 на выпадение предметов, то будет что-то подобное:

Запускаем логин-сервер. Скрипт запускает его в фоне:

cd ~/server/login
chmod +x *.sh
mkdir log

Если все хорошо, то в log/stdout.log будет примерно такой результат:

[INFO ] 2024-05-17 19:16:25 LoginServer: Loaded 2 banned IPs.
[INFO ] 2024-05-17 19:16:25 LoginServer: Listening for game servers on 127.0.0.1:9014.
[INFO ] 2024-05-17 19:16:25 LoginServer: Telnet server is currently disabled.
[INFO ] 2024-05-17 19:16:25 LoginServer: Login Server is now listening on *:2106.
[INFO ] 2024-05-17 19:16:25 UPnPService: Looking for UPnP Gateway Devices...

Затем повторяем процедуру для игрового сервера. В этот раз скрипт запускает сервер в текущей сессии, поэтому откройте screen или tmux.

cd ~/server/game
chmod +x *.sh
mkdir log

Если все хорошо, то лог игрового сервера не будет пугать, а логин-сервер зарегистрирует новый игровой сервер.

$ tail -n 4 ~/server/game/log/stdout.log
Connecting to login on 127.0.0.1:9014
Maximum Numbers of Connected Players: 100
Telnet server is currently disabled.
Registered on login as Server 1 : Bartz
$ tail -n 5 ~/server/login/log/stdout.log
[INFO ] 2024-05-17 19:25:00 GameServerThread: Updated game server Bartz[1] IPs.
[INFO ] 2024-05-17 19:25:00 GameServerThread: <адреса удалены>
[INFO ] 2024-05-17 19:25:00 GameServerThread: <адреса удалены>
[INFO ] 2024-05-17 19:25:00 GameServerThread: <адреса удалены>
[INFO ] 2024-05-17 19:25:00 GameServerAuth: Game Server Interlude enabled.

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

К счастью для нас, игровой клиент обращается к серверу по доменному имени. Так что задача подключения к эмулятору сводится к подмене DNS-ответа. Это можно сделать через hosts-файл:

789.174.486.787 l2authd.lineage2.com 

Способ с локальным hosts-файлом может не работать на более современных клиентах, где GameGuard следит за этим файлом. К счастью, это не единственный вариант. Если у вас Windows 7 или старше, то можно запускать с аргументами через командную строку:

@start l2.bin IP=127.0.0.1

Windows 10 отказывается запускать bin-файлы таким способом, поэтому можно открыть Visual Studio и быстро написать запускатор через WinAPI.

Скрытый текст

#include 
#include 
int main(int argc, char* argv[])
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
    // set the size of the structures
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    char* cmdArgs[] = "l2.bin IP=127.0.0.1";
    // start the program up
    if (CreateProcessA
    (
        argv[1],   // the path
        cmdArgs,                // Command line
        NULL,                   // Process handle not inheritable
        NULL,                   // Thread handle not inheritable
        FALSE,                  // Set handle inheritance to FALSE
        CREATE_NEW_CONSOLE,     // Opens file in a separate console
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi           // Pointer to PROCESS_INFORMATION structure
    ) == 0) {
        std::cout << "Code: " << GetLastError() << std::endl;
        return 1;
    }
    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return 0;
}

В моем В моем Telegram-канале можно увидеть заметки по теме статей, над которыми я работаю. А еще там маленькие познавательные посты на разные темы.

Запускаем игру. Вводим логин-пароль, происходит авторегистрация и вот окно выбора сервера. Добро пожаловать обратно.

В небо и выше



Здравствуйте, мистер Баюм.

После регистрации и создания персонажа нужно будет первый раз залезть в базу данных. В базе данных l2jls в таблице accounts нужно изменить accesslevel на 8 для вашего аккаунта. В таблице characters нужно изменить accesslevel на 100 для вашего персонажа.

Эти операции можно выполнять через любой удобный инструмент взаимодействия с базой данных. В моем случае это функциональность подключения к БД в IDE PyCharm, но можно использовать SQL-интерфейс mariadb или освоить l2jcli. Единственное требование — выйти из аккаунта на момент применения изменений.


Небольшой коллаж админского меню.

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

  • Некоторые из команд применяются к выделенному персонажу/ монстру/ объекту. Чтобы выделить себя — нажмите по нику персонажа.
  • Вы можете создавать квестовые предметы по их идентификатору, но это не будет считаться получением предмета. Если квест требует от вас выбить 15 предметов из монстров, то вы можете «наколдовать» 14, а последний добыть честным путем, тогда подзадание квеста зачтется.
  • Аналогичным образом работают некоторые особенные монстры. Вы не сможете разбудить Баюма, если телепортируетесь прямо к нему в логово. Он скажет вам, что условия не выполнены. Нужно найти ту тряпочку и пройти через Вортекс как обычный пользователь. 🙂

В детстве я прокликивал квесты, не вдаваясь в реплики NPC. Поэтому я решил пройти «сюжетную» составляющую квестов Fate's Whisper и Mimir's Elixir (квесты на получение возможности брать саб-классы) и все четыре части Possessor of a precious soul — получение «нобла», то есть титула «дворянин».

Даже с возможностями администратора телепортироваться в определенные точки, неуязвимостью и мощью команды Kill это было долго. Каково же было тем, кто проходил это в оригинале? Наверное, им было весело.

Остался один не закрытый вопрос. Как стать героем? После получения дворянства нужно поучаствовать в олимпиаде. Проблема в том, что прежде необходимо поучаствовать в нескольких боях с другими персонажами, а мы тут одни. Второй и последний раз заходим в базу данных и заполняем одну строчку в таблице olympiad_nobbles, где:

  • char_id — это obj_Id из таблицы characters;
  • class_id и char_name также из таблицы characters;
  • olympiad_points и competitions_done — впишите любые положительные числа, чем больше — тем лучше.

После этого в меню администратора Game → Manual Hero. Готово, вы признанный герой и можете получить все положенные привилегии.

Когда играешь в Lineage 2 совершенно один, то большие и открытые, но пустые пространства немного угнетают. Не только пустотой, но и некоторой серостью. «Линейка» получала обновления каждый год. Может со временем стало лучше?

Если хочется поновее



Спустя столько лет…

Рассказать полную историю взлетов и падений Lineage 2 мне не под силу, но я попробую обозначить основные вехи. Обновления игры происходят каждые полгода по «главам» повествуемой «саги». Сейчас пять саг.

  • The Chaotic Chronicles. Это версии C0 — C4, 2004 — 2007.
  • The Chaotic Throne. Первая глава — та самая Interlude, последняя — High Five Part 5. 2007 — 2011.
  • Goddess of Destruction. 2011 — 2013.
  • Epic Tale Of Aden. 2013 — 2021.
  • Deathknight — актуальная.

В 2011 году вышла Goddess of Destruction, которая огорчила своими упрощениями «старичков». NCSoft пошли на встречу старым игрокам и сделали некое ответвление Classic, которое воссоздает то самое «раньше было лучше» в новых декорациях. Сейчас игра разделилась на три ветви.

  • Lineage 2 Classic, сейчас — Lineage 2 Legacy. Воссоздание старого, хардкорного опыта, когда прокачка была тяжелой и нужно было объединяться в группы.
  • Lineage 2 Essence. Наиболее легкая модификация игры. Прокачка быстрая и играть можно одному.
  • Lineage 2. Основная версия игры, компромисс между Legacy и Essence.

Оригинальный эмулятор L2J покрывает только первые две саги — The Chaotic Chronicles и The Chaotic Throne. L2J — это основа, на которой выросли другие проекты. Один из таких — L2JMobius.

В отличие от оригинала, L2JMobius замахнулся в более современную Epic Tale Of Aden, чтобы сделать Classic еще более хардкорным. То есть отключить телепорт из любого места в любую локацию, спрятать автолечение и так далее. Эмулятор L2JMobius взаимодействует с более современными игровыми клиентами, так что графика будет радовать вас больше.

Это упрощенный форк эмулятора L2J, однако суть осталась та же. Собираем сервер, но не через Maven, а через Ant. Инициализируем базу данных. Запускаем логин-сервер и игровой сервер. Готово! Вы восхитительны!

Да, графика похорошела. Но все еще одиноко. Куда деваться?

Руофф



Главная площадь Гирана. Не узнали? Я тоже.

Я вспомнил молодость и поиграл на оригинальном Interlude. Но я быстро вспомнил, что главное в Lineage 2 — это люди. Старые локации кажутся безжизненными без множества персонажей и постоянной болтовни героев и торговцев. Так что зашел на официальный сервер, выбрав версию Classic и сервер Antharas. Сейчас играть можно без помесячной подписки, но монетизация присутствует.


Да, это бесплатный телепорт. Даже не обязательно подходить к Gatekeeper’у.

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

Зашел в Башню Дерзости, понаблюдал короткий сюжет с устранением конкурентов под эпический саундтрек игры. Ну и хватит, пожалуй, Classic-версии. Посмотрим еще Essence.


Наконец-то старый добрый порох в мире магии!

Здесь есть две новых расы: сильфы и высшие эльфы. В целом, это плюс-минус та же игра, что и Legacy, но при прохождении обучения я смог сразу с первого уровня получить пятый.


Квесты… Щедрые!

После воспоминаний об оригинальном Interlude, обучение в Essence выглядит довольно удобно и совершенно не хардкорно. Вас сразу же обучают автоохоте, а уведомления о квесте позволяют телепортироваться в нужные охотничьи угодья. Еще и в награду подарят 100 зелий лечения. Не знаю, есть ли такое в Classic-версии, потому что я сразу полетел в Гиран.

Заключение


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

 

Источник

Читайте также