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

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

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

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

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

curl -s https://launcher.sashok724.net/download/setup.sh | sh

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

java -Xmx256M -jar LaunchServer.jar

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

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

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

address: "localhost"; # Адрес VDS (IP или домен)
port: 7240; # Порт лаунчсервера

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

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

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

Способ reject

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

message: "Технические работы, приходите позже!"; # Сообщение, которое будет использовано в качестве ошибки

Способ file

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

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

Способ request

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

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

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

Способ mysql

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

address: "mysqlserver.tld"; # Адрес MySQL-сервера
port: 3306; # Порт MySQL-сервера (по умолчанию 3306)
username: "root"; # Имя пользователя MySQL-сервера
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% заменяются на имя
пользователя и пароль соответственно

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

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

auth "username" "password"

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

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

Обработчик textFile

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

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

Обработчик binaryFile

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

Обработчик mysql

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

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

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

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;

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

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

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

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

Не забудьте поменять textureProvider с mojang на request

Сборка EXE с помощью Launch4J

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

launch4J: true; # Включить сборку EXE через Launch4J

В случае возникновения ошибок на 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"

Эта команда так же автоматически создаст файл профиля в директории 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: [ # Исключения из файлов и директорий выше
    # ...
];

# 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

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

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

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

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

    // Настройка окна авторизации
    newsURL: "https://launcher.sashok724.net/", // URL новостей, которые будут показаны в главном окне
    linkText: "Бесплатные окна", // Текст ссылки под кнопкой "Авторизация"
    linkURL: new java.net.URL("http://bit.ly/1SP0Rl8"), // URL ссылки под кнопкой "Авторизация"

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

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

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

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

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

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

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

ln -s "/opt/launchserver/Launcher.jar" "/opt/webserver/Launcher.jar"
ln -s "/opt/launchserver/Launcher.exe" "/opt/webserver/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 и Sponge 1.12.2. Патчи на авторизацию в них уже добавлены, и всё, что Вам требуется сделать, это заменить Launcher.jar.

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

Доступны патченные серверы BungeeCord (1.8.9-1.13.2, #afef0ec), его legacy-версия (1.7.2-1.8.9, #219819b), Waterfall (1.8.9-1.13.2, #bea8aac), 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: Поддерживаются ли Послотовые/Игровые/Shared-хостинги?

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

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

  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".