Основная информация

Лаунчер написан на Java 8 с использованием технологии JavaFX, за счёт чего обладает широкими возможностями кастомизации, безупречной производительностью. С помощью умной обвязки, Вы можете скачать клиенты и настроить сервера всего в несколько команд, не компилируя исходники и не меняя классы клиента!

Новый функционал можно добавить через JS API, возможно так же добавление функционала в стандартную конфигурацию по запросу.

СИСЬКИ

А теперь, когда вы обратили внимание, стоит запомнить:

  1. Для работы сервера лаунчера требуется OpenJDK 8 версии (не 9, не 10, не 11 и не даже 15, ТОЛЬКО 8)
  2. НИКТО ВАМ НЕ БУДЕТ ПОМОГАТЬ С УСТАНОВКОЙ GRAVIT LAUNCHER'А НА НАШЕМ DISCORD СЕРВЕРЕ

  3. Данный лаунчер прост и не защищен. Вас никто не заставляет ставить его себе на проект. Вы решаете это сами.
  4. Не нужно задавать вопросы по своему проекту, если у вас что-то не работает НА САЙТЕ!

    От кого насмотрелись гайдов - к тому и идите

  5. Правки по лаунчеру перенесены вниз. Кому интересны детальные изменения - идите на GitHub

Установка на VDS

Запустите скрипт установки в удобной для Вас директории (для работы скрипта нужен curl):

curl -s http://mirror.keeperjerry.ru/launcher/v1/setup.sh | sh

Запустите лаунчсервер как любое другое Java-приложение:

java -Xmx512M -jar LaunchServer.jar

Для работы лаунчера и лаунчсервера нужна Java 8 и выше


Рекомендации

Рекомендую попробовать MineSocial.NET - мой сайт эмуляции сервисов Mojang.
Недавно я писал на своем Discord сервере по поводу реализации своего API сервиса для небольших проектов, которым нужен только сервер и лаунчер для скачки модов. Если сервис действительно станет актуальным - я подумаю над реализацией своего ванильного лаунчера.

Особенности системы

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

Используя этот сервис, вы можете:
- Использовать встроенную авторизацию по email
- Возможность менять никнейм, оставляя прежний UUID (аккуратнее с модами)
- Использовать систему скинов и плащей, которая работает аналогично Mojang (по hash'у, а не по никнейму)
- Не брать лицензионный лаунчер за 2к (обычно ради функционала выше и берут лицуху)

Особенности серверов

Я постарался, чтобы данный сервис максимально облегчил процесс установки серверов. В ближайшее время на сайте будут появлятся готовые ядра. Вручную привязать к сервису можно абсолютно любое ядро (способ аналогичен сашку v2). Достаточно поменять:

# В классе YggdrasilMinecraftSessionService.class
"https://sessionserver.mojang.com/session/minecraft/join" => "https://sessionserver.minesocial.net/session/minecraft/join"
"https://sessionserver.mojang.com/session/minecraft/hasJoined" => "https://sessionserver.minesocial.net/session/minecraft/hasJoined"
"https://sessionserver.mojang.com/session/minecraft/profile/" => "https://sessionserver.minesocial.net/session/minecraft/profile/"

# В классе YggdrasilGameProfileRepository.class
"https://api.mojang.com/profiles/" => "https://api.minesocial.net/profiles/"

Данная система фиксит отображение скинов как в некоторых плагинах, так и модах (если в их исходниках не лежит ссылка напрямую). Подробнее о патче серверов, вы мождете почитать здесь ниже, где "Классы для авторизации". Необходимые программы для патча вы можете скачать здесь.


Настройка LaunchServer.cfg

При первом запуске Вас попросят указать адрес VDS (IP или домен), на котором находится лаунчсервер - лаунчеры будут подключаться именно по этому адресу. После этого будет создан основной файл конфигурации - LaunchServer.cfg - в нём настраивается авторизация, обработка UUID, система скинов и сборка EXE-файла через Launch4J. Вы можете использовать локальный адрес для тестирования (localhost):

address: "localhost"; # Адрес VDS (IP или домен)
bindAddress: "0.0.0.0"; # На какой интерфейс идет обращение (0.0.0.0 - Все)
port: 7240; # Порт лаунчсервера

Проверка актуальных обновлений

Данная опция будет уведомлять вас о выходе новой версии лаунчера. При желании ее можно отключить.

# Проверять обновления с сайта разработчика?
checkServerUpdate: true;

Выбор зеркала

В свете последних событий, сашок уже не один раз забил на web-сервер своего лаунчера. Поэтому было принято решение добавить в лаунчер выбор и возможность поднять свое зеркало. Чтобы его поднять - необходимо создать директории assets и clients в целевой папке. До версии 1.7.0.0+ можно было указать только одну ссылку!

# Ссылки на действущие зеркала
mirrors: [
    "https://mirror.keeperjerry.ru/launcher/v1/" # Указывайте зеркала через запятую! Example: "url_1", "url_2"
    # "https://mirror.jocat.ru/keeperjerry/" - Прекратил поддержку зеркала с 30.04.2021
];

Так же, вы можете найти прочие (неофициальные) зеркала на нашем дискорд канале. Учтите, что разработчик данного форка не несет ответственность за другие зеркала!

Лимит на авторизацию и ограничения по IP (+1.7.4.0)

Данная функция частично разгружает сервер авторизации, защищая его от подбора паролей. С версии 1.7.3.0 данный функционал был переписан под управления IP. Пока что основной функционал работает только после перезагрузки LaunchServer'a.

# Лимит на авторизацию / защита от брутфорса
authLimit: true; # Включение системы лимита
authLimitConfig: {
    # Основные настройки
    authRateLimit: 5; # Кол-во попыток авторизации
    authRateLimitMilis: 8000; # Пауза после попыток авторизации 8 сек.
    useAllowIp: true; # Включить белый список
    useBlockIp: true; # Включить черный список

    # Сообщения клиентам
    authRejectString: "Превышен лимит авторизаций, подождите некоторое время!";
    authNotWhitelistString: "Вашего IP нет в белом списке!"; # Показывает только при включенном onlyAllowIp
    authBannedString: "Ваш IP заблокирован!"; # Сообщение о блокировке (работает при blockOnConnect: false)
    
    # Дополнительные настройки
    blockOnConnect: true; # Отключает любые подключения к LaunchServer
    onlyAllowIp: false; # Разрешить подключение только доверенным IP адресам
};

Так же, стоит отметить, что с версии 1.7.4.0 в лаунчере присутствует файл ListIpConnection.json, который хранит в себе белый список (allowIp) и черный список (blockIp). Выглядит он так:

{
  "allowIp": [
    "127.0.0.1",
    "172.18.0.1"
  ],
  "blockIp": [
    "1.2.3.4",
    "4.3.2.1"
  ]
}

Белый список (allowIp) предназначен для игровых серверов, чтобы не попадать под проверку (authRateLimit) и не ждать окончания лимита. Черный список (blockIp) предназначен для блоировки IP нежелательных пользователей.

В новой системе динамической подгрузки были добавлены команды для операциями с IP адресами:

# Белый список
allowip add 127.0.0.1 # Добавить IP в Белый список
allowip del 127.0.0.1 # Убрать IP из Белого списка
# Черный список
blockip add 127.0.0.1 # Добавить IP в Черный список
blockip del 127.0.0.1 # Убрать IP из Черного списка

P.S. НЕ НАДО РУКАМИ СТАВИТЬ IP АДРЕСА БЕЗ ПЕРЕЗАГРУЗКИ И ГОВОРИТЬ МНЕ, ЧТО ОНО НЕ РАБОТАЕТ

Параметр blockOnConnect позволяет управлять подключением с заблокированными IP адресами: если установлено значение false - клиенты увидят сообщение о том, что их IP забанен, если установлено значение true - заблокированные адреса не смогут вовсе подключится к вашему LaunchServer'у, просто отклоняя любое соединение с указанными IP.

Параметр onlyAllowIp позволяет настроить подключение только для IP, которые указанны в белом списке (allowIp), так что не забудьте включить его!


Способы авторизации (authProvider)


По умолчанию используется способ авторизации accept, который принимает любые пары логин-пароль за верные, и имя пользователя соответствует логину. Такой способ хорошо подходит для тестирования, но для использования в production рекомендуется сменить его на один из других: reject, file, request, или mysql. В отличие от accept, все эти способы требуют дополнительной конфигурации в блоке authProviderConfig:

authProvider: "accept"; # Название способа авторизации
authProviderConfig: {
    # Конфигурация способа авторизации не тебуется
};

Способ reject

Этот способ авторизации - полная противоположность accept - он принимает любые пары логин-пароль за неверные. Этот способ можно использовать во время проведения технических работ. Пример конфигурации:

authProvider: "reject"; # Название способа авторизации
authProviderConfig: {
    # Конфигурация способа авторизации
    message: "Технические работы, приходите позже!"; # Сообщение, которое будет использовано в качестве ошибки
};

Способ mojang

Для того, чтобы авторизовать пользователя, LaunchServer берет данные с официального сервера Mojang. Пример конфигурации:

authProvider: "mojang";
authProviderConfig: {
    # Конфигурация способа авторизации не тебуется
};

Способ minesocial (+1.7.3.1)

Этот способ рекомендуется для приватных серверов с небольшим количеством игроков. Пример конфигурации:

authProvider: "minesocial";
authProviderConfig: {
    # Конфигурация способа авторизации не тебуется
};

Способ elyby (+1.7.4.0)

Я хз нужно ли вообще кому нидубь кроме TLauncher'a, но раз попросили сделать из коробки - значит нужен. Пример конфигурации:

authProvider: "elyby";
authProviderConfig: {
    # Конфигурация способа авторизации не тебуется
};

Чтобы пользоваться данной авторизацией, необходимо зарегестрироваться на сайте Ely.by! Я не уверен, сливают они данные или нет, поэтому сделал свой сервис.

Способ authlib (+1.7.2.3)

Способ аналогичен Mojang, за исключением того, что все запросы LaunchServer берет из вашего эмулятора MojangAPI. Документация: authUrl. Пример конфигурации:

authProvider: "authlib";
authProviderConfig: {
    authUrl: "https://authserver.mojang.com/authenticate";
};

Способ file

Для проверки правильности логина и пароля, этот способ обращается к указанному файлу. Пример конфигурации:

authProvider: "file"; # Название способа авторизации
authProviderConfig: {
    file: "users.cfg"; # Имя файла, в котором будут приведенные ниже данные
    digest: "plain"; # Алгоритм хеширования пароля. Поддерживаются plain, MD5, SHA-1, SHA-224, SHA-256, SHA-512
};

Пример файла авторизации

Пример демонстрационного файла users.cfg в формате plain (без хеша)

# Алгоритм plain 
Test: {
    username: "Test";
    password: "12345";
};
KeeperJerry: {
    username: "KeeperJerry";
    password: "12345";
};
# и т.д.

Пример демонстрационного файла users.cfg в формате MD5

# Алгоритм MD5 
Test: {
    username: "Test";
    password: "827ccb0eea8a706c4c34a16891f84e7b"; # 12345
};
KeeperJerry: {
    username: "KeeperJerry";
    password: "827ccb0eea8a706c4c34a16891f84e7b"; # 12345
};
# и т.д.

Я надеюсь как применять остальные хеши обьяснять не надо.

Способ request

Для проверки правильности логина и пароля, этот способ обращается к указанному URL. Этот способ рекомендуется для больших проектов с CMS, которые используют нестандартные алгоритмы хеширования. Пример конфигурации:

authProvider: "request"; # Название способа авторизации
authProviderConfig: {
    url: "https://myserver.tld/auth.php?login=%login%&password=%password%"; # URL, к которому будет обращаться лаунчсервер. %login% и %password% заменяются на указанные логин и пароль, соответственно
    response: "OK:(?<username>.+)"; # Маска ответа успешной авторизации. В capture-группе <username> должно быть имя пользователя. В случае, если ответ отличается, он выводится в качестве ошибки
};

Вы можете загрузить уже готовые скрипты авторизации для DLE, WordPress, XenForo, IPB и PHPBB (Они должны находиться в корне сайта)

Способ mysql / mariadb

Для проверки правильности логина и пароля, этот способ обращается к MySQL-базе данных. Этот способ рекомендуется для больших проектов со стандартными алгоритмами хеширования. Пример конфигурации (DLE до 11.1):

authProvider: "mysql"; # Название способа авторизации
authProviderConfig: {
    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "dle?serverTimezone=UTC"; # База данных (при mariadb не нужно указывать serverTimezone)

    query: "SELECT name FROM dle_users WHERE (email=? OR name=?) AND password=MD5(MD5(?)) LIMIT 1"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: [ "%login%", "%login%", "%password%" ]; # Параметры к запросу. %login% и %password% заменяются на имя пользователя и пароль соответственно
};

Способ mysql-8 (+1.6.2.0)

Для проверки правильности логина и пароля, этот способ обращается к MySQL-базе данных. Этот способ рекомендуется для больших проектов со стандартными алгоритмами хеширования. Пример конфигурации (DLE до 11.1):

authProvider: "mysql-8"; # Название способа авторизации
authProviderConfig: {
    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "dle?serverTimezone=UTC"; # База данных
    timezone: "UTC";
    useSSL: false # Используется ли защищенное соединение

    query: "SELECT name FROM dle_users WHERE (email=? OR name=?) AND password=MD5(MD5(?)) LIMIT 1"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: [ "%login%", "%login%", "%password%" ]; # Параметры к запросу. %login% и %password% заменяются на имя пользователя и пароль соответственно
};

Способ mysql-bcrypt / mariadb-bcrypt (+1.2.0.0)

Для проверки правильности логина и пароля, этот способ обращается к MySQL-базе данных и сравнивает hash пароля. Этот способ рекомендуется для больших проектов с алгоритмом хеширования BCrypt. Пример конфигурации (DLE от 11.2):

authProvider: "mysql-bcrypt"; # Название способа авторизации
authProviderConfig: {
    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "dle?serverTimezone=UTC"; # База данных (при mariadb не нужно указывать serverTimezone)

    query: "SELECT password, name FROM dle_users WHERE (email=? OR name=?) LIMIT 1"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: [ "%login%", "%login%" ]; # Параметры к запросу. %login% заменяются на имя пользователя. Пароль передается в лаунчер и сравнивает hash
};

Способ mysql-8-bcrypt (+1.6.2.0)

Для проверки правильности логина и пароля, этот способ обращается к MySQL-базе данных и сравнивает hash пароля. Этот способ рекомендуется для больших проектов с алгоритмом хеширования BCrypt. Пример конфигурации (DLE от 11.2):

authProvider: "mysql-8-bcrypt"; # Название способа авторизации
authProviderConfig: {
    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "dle?serverTimezone=UTC"; # База данных
    timezone: "UTC"; # Замена ?serverTimezone
    useSSL: false # Используется ли защищенное соединение

    query: "SELECT password, name FROM dle_users WHERE (email=? OR name=?) LIMIT 1"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: [ "%login%", "%login%" ]; # Параметры к запросу. %login% заменяются на имя пользователя. Пароль передается в лаунчер и сравнивает hash
};

Способ sqlite (+1.6.0.0)

Для проверки правильности логина и пароля, этот способ обращается к SQLite-базе данных. Этот способ рекомендуется для администраторов с психическими отклонениями. Пример конфигурации:

authProvider: "sqlite"; # Название способа авторизации
authProviderConfig: {
    path: "db.db"; # Путь до файла базы данных
    query: "SELECT name FROM table_name WHERE (email=? OR name=?) AND password=?"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: ["%login%", "%login%", "%password%"]; # Параметры к запросу. %login% и %password% заменяются на имя пользователя и пароль соответственно
};

Способ postgresql (+1.5.0.0)

Для проверки правильности логина и пароля, этот способ обращается к PostgreSQL-базе данных. Этот способ рекомендуется для больших проектов. Пример конфигурации:

authProvider: "postgresql"; # Название способа авторизации
authProviderConfig: {
    address: "localhost"; # Адрес PostgreSQL-сервера
    port: 5432; # Порт PostgreSQL-сервера (по умолчанию 5432)
    username: "root"; # Имя пользователя PostgreSQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "dle"; # База данных

    query: "SELECT name FROM dle_users WHERE (email=? OR name=?) AND password=MD5(MD5(?)) LIMIT 1"; # Запрос. Он должен быть SELECT и возвращать имя пользователя в правильном регистре. ? заменяются на параметры ниже:
    queryParams: [ "%login%", "%login%", "%password%" ]; # Параметры к запросу. %login% и %password% заменяются на имя пользователя и пароль соответственно
};

Способ json (+1.5.0.0)

Для проверки правильности логина и пароля, этот способ обращается по URL с передачей POST. Я вообще не рекомендую данный способ, если вы не используете headless cms.
Пример конфигурации:

authProvider: "json"; # Название способа авторизации
authProviderConfig: {
    url: "https://myserver.tld/auth.php";
    userKeyName: "login"; # Ключ POST запроса с именем пользователя (на стороне php $_POST['login'])
    passKeyName: "password"; # Ключ POST запроса с паролем пользователя (на стороне php $_POST['password'])
    ipKeyName: "ip"; # Ключ POST запроса с IP пользователя (на стороне php $_POST['ip'])
    responseUserKeyName: "player"; # Ключ имени пользователя в JSON ответе серверного обработчика
    responseErrorKeyName: "error"; # Ключ ошибки в JSON ответе серверного обработчика
};

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

Проверка авторизации

Проверить авторизацию можно с помощью команды auth:

auth "username" "password"

Обработка UUID и авторизаций (authHandler)


Для управления авторизациями (joinServer, checkServer) и UUID игроков существуют несколько возможных обработчиков. Пока что их всего три, отличающихся только местом хранения: binaryFile, textFile и mysql.

Обработчик mojang (+1.7.3.1)

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

authHandler: "mojang";
authHandlerConfig: {
    # Конфигурация способа обработки UUID не тебуется
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/mojang!

Обработчик minesocial (+1.7.3.1)

LaunchServer берет данные с сервера MineSocial.NET. Этот обработчик рекомендуется использовать небольшим проектам, т.к. весь процесс автоматизирован. Пример конфигурации:

authHandler: "minesocial";
authHandlerConfig: {
    # Конфигурация способа обработки UUID не тебуется
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/minesocial!

Обработчик elyby (+1.7.4.0)

LaunchServer берет данные с сервера Ely.by. Пример конфигурации:

authHandler: "minesocial";
authHandlerConfig: {
    # Конфигурация способа обработки UUID не тебуется
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/elyby!

Обработчик authlib (+1.7.3.1)

Способ аналогичен Mojang, за исключением того, что все запросы LaunchServer берет из вашего эмулятора MojangAPI. Документация: joinUrl, hasJoinUrl (+1.7.3.2). Пример конфигурации:

authHandler: "authlib";
authHandlerConfig: {
    joinUrl: "https://sessionserver.mojang.com/session/minecraft/join";
    hasJoinUrl: "https://sessionserver.mojang.com/session/minecraft/hasJoined";
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/authlib!

Обработчик textFile

Этот обработчик хранит все данные об авторизациях в текстовом файле, генерирует случайные UUID, но есть опция для генерации UUID из MD5 имени пользователя. Пример конфигурации:

authHandler: "textFile";
authHandlerConfig: {
    fileName: "authHandler.cfg"; # Имя файла, в котором будут сохранены данные об авторизациях
    offlineUUIDs: true; # Использовать генерацию UUID из MD5 имени пользователя
};

Обработчик binaryFile

Этот обработчик хранит все данные об авторизациях в бинарном файле, в остальном идентичен обработчику textFile. Этот обработчик существует для обратной совместимости и будет удалён в следующей версии.

Обработчик mysql / mariadb

Этот обработчик хранит все данные об авторизациях в MySQL-базе данных, использует UUID готовые. Этот обработчик рекомендуется использовать всем проектам по мере возможности. Пример конфигурации:

authHandler: "mysql";
authHandlerConfig: {
    fetchAll: true; # Загрузить всю базу в кэш при запуске

    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "minecraft?serverTimezone=UTC"; # База данных (при mariadb не нужно указывать serverTimezone)

    table: "users"; # Таблица
    uuidColumn: "uuid"; # Поле с UUID пользователей
    usernameColumn: "username"; # Поле с именами пользователей
    accessTokenColumn: "accessToken"; # Поле с accessToken
    serverIDColumn: "serverID"; # Поле с serverID
};

Для того чтобы добавить недостающие поля и сгеренерировать UUID, можно использовать SQL-запрос:

-- Добавляет недостающие поля в таблицу
ALTER TABLE users
ADD COLUMN uuid CHAR(36) UNIQUE DEFAULT NULL,
ADD COLUMN accessToken CHAR(32) DEFAULT NULL,
ADD COLUMN serverID VARCHAR(41) DEFAULT NULL;

-- Создаёт триггер на генерацию UUID для новых пользователей
DELIMITER //
CREATE TRIGGER setUUID BEFORE INSERT ON users
FOR EACH ROW BEGIN
IF NEW.uuid IS NULL THEN
SET NEW.uuid = UUID();
END IF;
END; //
DELIMITER ;

-- Генерирует UUID для уже существующих пользователей
UPDATE users SET uuid=(SELECT UUID()) WHERE uuid IS NULL;

Обработчик mysql-8 (+1.6.2.0)

Этот обработчик хранит все данные об авторизациях в MySQL-базе данных, использует UUID готовые. Этот обработчик рекомендуется использовать всем проектам по мере возможности. Пример конфигурации:

authHandler: "mysql-8";
authHandlerConfig: {
    address: "localhost"; # Адрес MySQL-сервера
    port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
    username: "root"; # Имя пользователя MySQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "minecraft"; # База данных
    timezone: "UTC"; # Замена ?serverTimezone
    useSSL: false; # Используется ли защищенное соединение

    table: "users"; # Таблица
    uuidColumn: "uuid"; # Поле с UUID пользователей
    usernameColumn: "username"; # Поле с именами пользователей
    accessTokenColumn: "accessToken"; # Поле с accessToken
    serverIDColumn: "serverID"; # Поле с serverID
};

Обработчик sqlite (+1.6.0.0)

Этот обработчик хранит все данные об авторизациях в SQLite-базе данных, использует UUID готовые. Этот обработчик рекомендуется использовать администраторам проектов с психическими отклонениями. Пример конфигурации:

authHandler: "sqlite";
authHandlerConfig: {
    table: "test"; # Таблица
    uuidColumn: "uuid"; # Поле с UUID пользователей
    usernameColumn: "username"; # Поле с именами пользователей
    accessTokenColumn: "accessToken"; # Поле с accessToken
    serverIDColumn: "serverID"; # Поле с serverID
    path: "db.db"; # Путь до файла базы данных 
};

Обработчик postgresql (+1.5.0.0)

Этот обработчик хранит все данные об авторизациях в PostgreSQL-базе данных, использует UUID готовые. Этот обработчик рекомендуется использовать всем проектам по мере возможности. Пример конфигурации:

authHandler: "postgresql";
authHandlerConfig: {
    fetchAll: true; # Загрузить всю базу в кэш при запуске

    address: "localhost"; # Адрес PostgreSQL-сервера
    port: 5432; # Порт PostgreSQL-сервера (по умолчанию 5432)
    username: "root"; # Имя пользователя PostgreSQL-сервера
    password: "PSP1004"; # Пароль пользователя
    database: "minecraft"; # База данных

    table: "users"; # Таблица
    uuidColumn: "uuid"; # Поле с UUID пользователей
    usernameColumn: "username"; # Поле с именами пользователей
    accessTokenColumn: "accessToken"; # Поле с accessToken
    serverIDColumn: "serverID"; # Поле с serverID
};

Способ json (+1.5.0.0)

Этот обработчик хранит все данные об авторизациях в указанной вами базе данных, к которой идет подключение

authHandler: "json";
authHandlerConfig: {
    url: "https://myserver.tld/handler.php";
    urlCheckServer: "https://myserver.tld/CheckServer.php";
    urlUsernameToUUID: "https://myserver.tld/UsernameToUUID.php";
    urlUUIDToUsername: "https://myserver.tld/UUIDToUsername.php";
	
    userKeyName: "login";
    serverIDKeyName: "serverID";
    uuidKeyName: "uuid";
    accessTokenKeyName: "accessToken";
    responseUserKeyName: "username";
    responseErrorKeyName: "error";
};

Сорян, но я это еще делаю...


Система скинов и плащей

Обработчик void

Скины и плащи полностью отключены. Пример конфигурации:

textureProvider: "void";
textureProviderConfig: {
    # Конфигурация не требуется для текстур Void
};

Обработчик mojang

Скины и плащи LaunchServer берет с официального сервера Mojang. Пример конфигурации:

textureProvider: "mojang";
textureProviderConfig: {
    # Конфигурация не требуется для текстур Mojang
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/mojang и authHandler/mojang!

Обработчик minesocial (+1.7.3.1)

Скины и плащи LaunchServer берет с cервера MineSocial.NET. Пример конфигурации:

textureProvider: "minesocial";
textureProviderConfig: {
    # Конфигурация не требуется для текстур MineSocial
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/minesocial и authHandler/minesocial!

Обработчик elyby (+1.7.4.0)

Скины и плащи LaunchServer берет с cервера Ely.by. Пример конфигурации:

textureProvider: "elyby";
textureProviderConfig: {
    # Конфигурация не требуется для текстур Ely.by
};

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

Обработчик authlib (+1.7.2.3)

Скины и плащи LaunchServer берет из вашего эмулятора MojangAPI. Документацию можно найти здесь: usersURL, profileURL. Пример конфигурации:

textureProvider: "authlib";
textureProviderConfig: {
    usersURL: "https://api.mojang.com/users/profiles/minecraft/"; 
    profileURL: "https://sessionserver.mojang.com/session/minecraft/profile/";
};

Для правильной работоспособности, данный способ необходимо использовать в связке с authProvider/authlib и authHandler/authlib!

Обработчик request

Скины и плащи настраиваются всего двумя параметрами - маской URL на PNG-файл. Пример конфигурации:

textureProvider: "request";
textureProviderConfig: {
    skinsURL: "http://skins.minecraft.net/MinecraftSkins/%username%.png"; # Маска URL скинов
    cloaksURL: "http://skins.minecraft.net/MinecraftCloaks/%username%.png"; # Маска URL плащей
};

%username%, %uuid%, %hash% заменяются на имя пользователя, UUID и UUID без тире соответственно.

Сборка EXE с помощью Launch4J (+1.6.1.0)

Лаунчсервер так же может автоматически собирать EXE из JAR-файла - для этого требуется поставить параметр launch4J на true. Для того чтобы у EXE-файла была иконка, положите файл favicon.ico в корневую папку, где находится LaunchServer. Пример конфигурации:

launch4J: false; # Включить сборку EXE через Launch4J
launch4JConfig: {
    productName: "LauncherSchool"; # Название продукта
    fileDesc: "LauncherSchool by KeeperJerry"; # Описание файла
    internalName: "Launcher"; # Офцициальное название файла
    copyright: "© KeeperJerry"; # Авторские права (на дизайн лаунчера и т.д.)
    trademarks: "This product is licensed under GNU v3.0"; # Лицензия
};

В случае возникновения ошибок на 64-битных системах, может помочь установка 32-битного пакета glibc (Debian: lib32z1 | CentOS: glibc.i686).

Загрузка клиентов и настройка профилей

Клиенты, ресурсы и другие файлы для загрузки лаунчером хранятся в виде субдиректорий в директории updates, а профили, в которых указываются имя директорий, адрес сервера для автозахода, исключения при обновлении и другие сведения, необходимые для запуска клиента хранятся в директории profiles

Загрузка ресурсов

Для загрузки ресурсов существует команда downloadAsset. Первым аргументом передаётся версия клиента, для которого загружаются ресурсы, вторым аргументом имя субдиректории в updates:

downloadAsset 1.7.10 "asset1.7.10"

Синхронизация (см. ниже) сделается автоматически, отдельно набирать команду не требуется

Загрузка клиентов

Для загрузки клиентов существует команда downloadClient. Первым аргументом передаётся версия клиента, вторым аргументом имя субдиректории в updates:

downloadClient 1.7.10 "HiTech"

Обновление 1.7.0.0+

В данном обновлении была измена функция скачки клиентов: теперь все .cfg файлы скачиваются с зеркала сайта. Так же, сборки разделены на категории через разделитель "-" (тире).

downloadClient 1.7.10 "Vanila" # Скачка чистых версии
downloadClient 1.12.2-forge "HiTech" # Скачка версии с forge
downloadClient 1.14.4-fabric "Fabric" # Скачка fabric версии (доступно с 1.14.х+)

Эти команды так же автоматически сделают файл профиля в директории profiles. Пример файла profile.cfg:

version: "x.x.x"; # Версия клиента
assetIndex: "x.x.x"; # Индекс ресурсов (имя файла в indexes), 1.7.10+

# Runtime-dependent params
dir: "XXXXX"; # Директория клиента
assetDir: "XXXXX"; # Директория ресурсов

# Client params
sortIndex: 0; # Индекс для сортировки профилей в списке
title: "XXXXX"; # Заголовок профиля в лаунчере
serverAddress: "server.tld"; # Имя сервера для автозахода
serverPort: 25565; # Порт сервера для автозахода

# Updater and client watch service
updateFastCheck: true; # Менее надёжная, но намного более быстрая проверка файлов
update: []; # Файлы и директории, которые будут обновлены, но не будут проверяться во время игры
updateVerify: [ # Файлы и директории, которые должны быть обязательно проверены. \\ Нужно для экранизации точки (Regexp)
    "libraries", 
    "natives", 
    "mods",
    "minecraft\\.jar", 
    "forge\\.jar"
];
updateExclusions: [ # Исключения из файлов и директорий выше
    "mods/carpentersblocks",
    "mods/ic2",
    "mods/railcraft" # и т.д.
];

# Client launcher params
mainClass: "net.minecraft.launchwrapper.Launch"; # Главный класс клиента
classPath: [ "libraries", "minecraft.jar", "forge.jar" ]; # Classpath клиента
jvmArgs: [ # Дополнительные аргументы JVM
    "-Dfml.ignorePatchDiscrepancies=true", # Игнорировать различия в патчах
    "-Dfml.ignoreInvalidMinecraftCertificates=true", # Игнорировать отсутствие сертификатов
    "-Dorg.lwjgl.opengl.Display.allowSoftwareOpenGL=true" # (Не)обладатели драйверов на видеокарту тоже смогут играть
];
clientArgs: [ # Дополнительные аргументы клиента
    "--tweakClass", "cpw.mods.fml.common.launcher.FMLTweaker" # Если используете Forge
];

Синхронизация (см. ниже) сделается автоматически, отдельно набирать команду не требуется

Синхронизация директорий updates и profiles

Для обеспечения высокой производительности, лаунчсервер кэширует содержимое директорий updates и profiles. При внесении изменений в эти директории, лаунчсервер о них не осведомлён, и при следующем обновлении скорее всего будет ошибка. Для того чтобы синхронизировать содержимое этих директорий, существует две команды - syncUpdates и syncProfiles:

syncUpdates # Синхронизирует содержимое директории updates
syncProfiles # Синхронизирует содержимое директории profiles
syncAll # Синхронизировать обе директории (+1.3.0)

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

Сборка и использование, настройка сервера

Перед сборкой рекомендуется настроить стандартный интерфейс лаунчера в файле runtime/config.js:

var config = {
    dir: "kj-launcher", // Директория, в которой лаунчер будет хранить файлы (%user.home%/dir)
    title: "KeeperJerry's Launcher", // Заголовок окна лаунчера
    icons: [ "favicon.png" ], // Путь к иконкам лаунчера (относительно runtime)

    // Настройка окна авторизации
    newsURL: "http://launcher-sashok724.keeperjerry.ru/", // URL новостей, которые будут показаны в главном окне
    linkText: "Ссылка на зеркало", // Текст ссылки под кнопкой "Авторизация"
    linkURL: new java.net.URL("http://mirror.keeperjerry.ru/launcher/v1/"), // URL ссылки под кнопкой "Авторизация"

    // Стандартные значения настроек
    settingsMagic: 0xBEEF, // Древняя магия, не трогать
    autoLoginDefault: false, // Автологин
    fullScreenDefault: false, // Полный экран
    ramDefault: 1024, // Количество памяти

    // Имена директорий с JRE, если не знаете, зачем это нужно - не трогайте
    jreMustdie32Dir: "jre-8u131-win32", jreMustdie64Dir: "jre-8u131-win64",
    jreLinux32Dir: "jre-8u131-linux32", jreLinux64Dir: "jre-8u131-linux64",
    jreMacOSXDir: "jre-8u131-macosx", jreUnknownDir: "jre-8u131-unknown"
}

Настройки находятся только в этой части файла, остальная часть используется самим лаунчером и менять её не нужно!

Сборка лаунчера

Для сборки лаунчера существует команда build. Она автоматически упакует runtime, запишет Launcher.jar, соберёт Launcher.exe (если включена интеграция с Launch4J), и автоматически их синхронизирует. Данная команда используется после модификации директории runtime:

build # Собирает Launcher.jar и Launcher.exe

Сразу после сборки, лаунчер можно отправлять игрокам. Если сайт и лаунчсервер на одной VDS, можно сделать symlink на лаунчер с сайта:

ln -s "/home/user/launchserver/Launcher.jar" "/var/www/html/Launcher.jar"
ln -s "/home/user/launchserver/Launcher.exe" "/var/www/html/Launcher.exe"

Сборка сервера

На данный момент поддерживаются MCPC 1.5.2, Cauldron 1.6.4, Cauldron 1.7.2, KCauldron 1.7.10, Thermos 1.7.10, Spigot 1.8.8, Spigot 1.9.4, Spigot 1.10.2, Spigot 1.11.2, Spigot 1.12.2 и PaperSpigot 1.15.2. Патчи на авторизацию в них уже добавлены, и всё, что Вам требуется сделать, это заменить Launcher.jar. Если вы не можете найти нужное ядро - посмотрите на зеркале, возможно там вы найдете нужную сборку.

Сборка сервера BungeeCord

Доступны патченные серверы BungeeCord (1.8.9-1.12.2, #8d49424), его legacy-версия (1.7.2-1.8.9, #219819b), Waterfall (1.8.9-1.12.2, #4c87152), Waterfall-Old (1.7.2-1.9.4, #f62f290). Патчи на авторизацию в них уже добавлены, и всё, что Вам требуется сделать, это заменить Launcher.jar. Не забудьте включить ip-forwarding и bungeecord в файлах config.yml и spigot.yml, соответственно. На серверы, стоящие ЗА BungeeCord патчи НЕ ставятся и online-mode НЕ включается. Желательно поставить server-ip на localhost

Часто задаваемые вопросы (FAQ)

Q: Сколько стоит лаунчер? Как мне его купить? Будет ли техподдержка?

A: Этот лаунчер - OpenSource проект, соответственно, Вы можете скачивать, использовать и распространять его бесплатно. Но техническую поддержку по вопросам установки и настройки лаунчера от разработчика можно написать автору зеркала. Напишите разработчику для получения всех необходимых инструкций. Приблизительное время работы техподдержки: 9:00-23:00 по московскому времени. VK: keeperjerry.

Q: У кого можно заказать вёрстку дизайна?

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

Q: Возможно ли добавление недостающего функционала в лаунчер?

A: Возможно. Для того чтобы заказать нужный Вам функционал, напишите разработчику лаунчера. Разработка напрямую зависит от сложности добавляемого функционала.

Q: Поддерживаются ли Послотовые/Игровые/Shared-хостинги?

A: Если на них можно запускать сторонние Java-приложения, то да, но найти такой Послотовый/Игровой/Shared-хостинг - большая удача. Лаунчер гарантированно поддерживает любые VDS и Dedicated-серверы с возможностью установки Java 8 и открытым 7240 портом.

Q: У меня ошибка! Что мне делать?

A: Во-первых, нужно посмотреть что собственно за ошибка. Если ошибка в лаунчере, запустите его через cmd, там обязательно она будет. Может так же помочь JVM-опция -Dlauncher.debug=true, которая выведет более подробную информацию о действиях лаунчера. После сбора информации об ошибке, напишите в техподдержку. После этого ждите ответа и устранения ошибки.

Топ часто встречающихся ошибок

  1. java.net.BindException: Address already in use - Вы пытаетесь запустить второй лаунчсервер на одном и том же порту.
  2. Key Modulus Mismatch - Вы поменяли ключи лаунчсервера (Файлы public.key и private.key).
  3. Serverside not accepted this connection - Смотрите вывод лаунчсервера для определения причины.
  4. Не видно скинов других игроков - Включите online-mode в server.properties
  5. Любая ошибка при обновлении клиента - см. Раздел "Синхронизация директорий updates и profiles".

Что-то типа changelog

Добавленный функционал:

* Версии:
- По факту теперь все, но нужны сборки на зеркале...

* authHandler:
- mysql-8
- mariadb
- postgresql
- json
- sqlite

* authProvider:
- sqlite
- postgresql
- json
- mysql-bcrypt
- mysql-8
- mysql-8-bcrypt
- mariadb
- mariadb-bcrypt

* Команды:
- syncAll

* Улучшения:
- Кастомные настройки Launch4J (сборка exe)
- Лимит на авторизацию от брута
- Настройка своего зеркала
- Буферизация потоков (ускорение скачивания)
- Можно ставить свое название файла лаунчера
- Авто-проверка новых версии лаунчера
- Автообновление новых версии профилей Minecraft / Выпилили проверку версии (by JCat)
- Некоторые дополнения для нормальной работы под MacOS (by xmssss)
- Новая встроенная Java (8u282)
- Автодописывание команд на TAB как в Bash (by JCat)

В разработке: (2.0.0.0)

(Приведенныениже ниже функции могут поменятся!)

* Улучшения:
- Gradle (заебал, Захар, только отьебись от меня)
- Кастомный Proguard (случайная кодировка классов под проект)
- Свой API и патченые ядра серверов (Эмуляция mojang для ленивых, придется мне хранить uuid & sessions)
- Реализация сокета (RSocket под вопросом)
- Сбор статистики железа (аналог snooper для публичной статистики железа)

Тестируется: (1.7.3.1)

* authHandler:
- mojang
- authlib

* Улучшения:
- Своя система API (аналог Mojang)

Попросили/в планах:

* Улучшения:
- Gradle (захар уже даже пихает исходники 4 гравита, потому что его заебали просить портировать модули на сашка...)
- Автообновление новых версии профилей Minecraft
- Другая реализация сокета (WebSoket, RSocket или свой API?)
- Другая реализация конфига (в JSON?)
- Обновление дизайна (без WinFrame)
- Опциональные моды
- Новый дизайн
- HWID (Отдельная репа)

* authProvider:
- postgresql-argon2
- sqlite-argon2

Чего точно не будет:

* Улучшения:
- Улучшенная система HWID (бесполезная система, больше проблем)
- Автообновление на новые версии LaunchServer (не будем трогать древнее зло в продакшене у людей)
- Модули (Я лучше пихну этот функционал в лаунчер напрямую)
- Двухфакторная авторизация (вы это серьезно? в лаунчер... защиту...)