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

Лаунчер написан на 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.
Вопреки всем ожиданиям, сервис начал набирать актуальность. Однако мне пришлось его увести на тех.работы (уйти от PHP, закончить realms и т.д.).
Когда сервис будет готов - я оглашу это публично.

Особенности серверов (обновлено)

Я постарался, чтобы данный сервис максимально облегчил процесс установки серверов. Вручную привязать к сервису можно абсолютно любое ядро! (достаточно скачать authlib-injector). Далее, нужно просто положить его в папку с игровым сервером (допустим это будет paper.jar) и запустить следующую команду:

java -javaagent:authlib-injector.jar=minesocial.net -jar paper.jar [Временно отключен]

Так же, по такому же принципу можно привязать сервера к сервису Ely.By:

java -javaagent:authlib-injector.jar=ely.by -jar paper.jar

Данная система не должна вызвать каких-либо затруднений в привязке к системе. Authlib-injector автоматически пропатчит ваше ядро.


Настройка 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 (не будем трогать древнее зло в продакшене у людей)
- Модули (Я лучше пихну этот функционал в лаунчер напрямую)
- Двухфакторная авторизация (вы это серьезно? в лаунчер... защиту...)