Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Лаунчер [Delphi] [C_Core 1.1] [1.6.x + ] API | Мониторинг | 3 лаунчера

NC22

Старожил
Пользователь
Баллы
153
Имя в Minecraft
NC22
API для создания лаунчера [ исходники на Delphi, ООП ]

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

Скомпоновал в одну тему, чтобы флуда было меньше. С общей темой Delphi исходники.

Необходимый набор для сборки:
  • Delphi 6.0 , 7.0 ( начиная с версии 1.1 XE )
  • Библиотека Abbrevia 5.0 (работа с zip архивами, никаких дополнительных dll )
  • Для версии Delphi 6.0 и ниже INDY 9.0.18
Возможности "из коробки":
  • Авторизация по протоколам оригинального лаунчера\сервера
  • Обработка внештатных ситуаций
  • Обновление клиента по списку файлов ( поддерживаются zip архивы)
  • Игровые настройки
  • Скачивание/загрузка локального файла авто настройки
  • Сохранение/загрузка файла настроек ( поддержка шифрования данных )
  • Проверка подлинности файлов по MD5-хэшу как перед скачиванием так и при запуске игры
  • Авто поиск директории игры и Java
Дополнительно : Мониторинг серверов (загрузка прямо из файла servers.dat)
  • Почему лаунчер качает клиент каждый раз хотя он скачан?
К любому загружаемому файлу на сервере должна быть пара - файл с тем же названием и расширением md5 например windows_natives.jar.md5
содержащий контрольную сумму md5 для этого файла. Генератор контрольной суммы прикложен к сообщению.

В функции DownloadFile это строка Download.hash := DownloadMD5(fname + '.md5');
​
  • Какое функциональное предназначение параметра в структуре настроек
- Distr_list ?

Options.webOptions.Distr := 'http://s3.amazonaws.com/MinecraftDownload/'; // Сервер - поставщик
Options.webOptions.Distr_list := 'minecraft.jar|jinput.jar|lwjgl.jar|lwjgl_util.jar|windows_natives.jar'; // Выкачиваемые файлы с сервера-поставщика

- GameBuild ?

Оригинальный лаунчер сохраняет в папку с игрой файл с текущей параметром GameBuild, по нему проверяет нужно ли перекачивать игру или нет.
Здесь же этот параметр передается в рамках совместимости со скриптом авторизации webMCR и прочих.

- PassBase ?

Если включен режим шифрования используется мастер-ключ шифрования конфиг файла и всех параметров в памяти лаунчера
(т.е. через программу-взломщик найти и подменить параметр непосредственно в лаунчере не получится, если в настройках задан ключ шифрования).
Но основные параметры естественно в любом случае можно раскрыть при должном желании, это просто защита от дурака, не более.
​
  • Почему не расспаковывает zip файл?
Рекомендуется использовать архивы без сжатия.​

  • По какому протоколу проходит взаимодействие с сервером авторизации?
Протокол соответствует протоколу авторизации MC ниже версии 1.6, а именно

Лаунчер отправляет POST запрос на адресс указанный в webOptions.Login ( например http://s3.amazonaws.com/login/ )

C параметрами

(string) user,
(string) password,
(int) version

Ответ сервера - текстовая строка;

Ответ сервера информирующий об успешной авторизации:

GAME_BUILD:depricated:USER_NAME:SESSION_ID:

где SESSION_ID - идентификатор сессии без префикса token:
depricated - ранее ключ для загрузки файлов с сервера, ныне игнорируемая лаунчером информация
USER_NAME - имя пользователя авторизовавшегося под заданным идентификатором (соответствует POST (string) user)

Ответ информирующий об ошибке:

Old vesion или Bad login

Далее соответсвующий идентификатор сессии и имя пользователя передается запускаемому minecraft-клиенту
​

  1. Генерация настроек:
    • ссылка на страницу новостей
    • ссылка на страницу авторизации
    • ссылка на страницу регистрации
    • ссылка на папку обновлений
    • ссылка на файл авто настройки
    • список файлов для обновления
    • версия клиента
    • код шифрования
    • триггер запрета изменения настроек ( часть настроек будет доступна только самому ядру, до пользовательского интерфейса они дойдут в виде завуалированной строки )
    • ...
  2. Настройки по умолчанию на конкретный сервер, необходимы только данные для авторизации.
  3. Сброс настроек до настроек по умолчанию
  4. Загрузка файла авто настроек с удаленного сервера. ( синхронизируется версия клиента, ссылка на страницу авторизации и д.р. )
  5. Загрузка локального файла настроек.
  6. Загрузка файла с удаленного сервера с проверкой по md5 необходимости загрузки.
  7. Правила приема файлов: Проверка существующих файлов по md5-хэшу ( описана ниже ) ; Если файл был загружен то для любых файлов копирование в папку bin; для ZIP архивов разархивирование в папку игры; для архива windows_natives.jar разархивирование в подпапку bin\natives;
  8. Загрузка списка файлов по правилам описанным выше.
  9. Проверка установлена ли игра, по ряду ключевых файлов. (Windows)
  10. Сохранение настроек в файл.
  11. Возможность шифрования настроек подключения как в памяти программы так и при сохранении данных в файл.
  12. Запуск игры с проверкой подлинности minecraft.jar по MD5.
  13. Авторизация по протоколам оригинального лаунчера\сервера. Совместимо с webMCR
  14. События для синхронизации интерфейса:
  • Процесс разархивирования zip архива
  • Процесс загрузки файла ( возможность реализовать процентное отображение )
  • Неизвестный ответ от сервера
  • Протокол лаунчера устарел ( ошибка возникает при неудачном чтении файла автонастроек \ настроек )
  • Ответ сервера - Oldversion
  • Сервер авторизации недоступен
  • Ответ сервера - BadLogin
Проверка подлинности файла по MD5-хэшу:

Если файлы не требуют обновления, соответственно они не закачиваются повторно.
(в папке обновлений на сервере, вместе с обновляемым файлом должен быть расположен файл _ИМЯ_ОБНОВЛЯЕМОГО_ФАЙЛА_.md5 в котором содержится MD5-хэш этого файла)
Это самый оптимальный способ проверки.
( если же заставлять сервер каждый раз генерировать MD5 хэш через PHP файл, то это лишний повод для DDOSа т.к. подсчет MD5 для файлов большого размера это весьма ресурсоемкий процесс )

Файлы API
c_core.pas - Основной набор функций
c_query.pas - Функция для мониторинга сервера
c_crypt.pas - шифрование. Реализация тривиальная, взята с просторов.
MD5.pas - набор функций для генерации MD5-хэша, автор Angus Johnson

В архиве c_core_10 три лаунчера и API [ папка c_core ]
Консольный лаунчер, минимальный вариант реализации, в исходных файлах все по максимуму прокомментировано.
2.png
Лаунчер с оконным интерфейсом. Мультиклиентный. Максимально раскрыт функционал C_Core . Т.к. разрабатывался вместе с API. Есть доступ ко всем настройкам через формы. Требует наличия библиотеки BussinesSkinForm
3.png1.png
Аналогично с оконным интерфейсом. Одноклиентный. Совмещен с мониторингом серверов ( c_query ), мониторинг не требует никаких дополнительных скриптов на стороне сервера и реализован по принципу внутриигрового, грузит список из servers.dat
4.png
По размеру файла лаунчера можно уложится в 1 мегабайт и меньше. С upxом еще меньше.

Все исходные файлы одним архивом: C_CORE 1.0 | C_CORE 1.1 ( только в версии под Delphi XE )

Скомпилированные лаунчеры consoleML | ML1998 | TinyLauncher ( + пример файла настроек для сервера с webMCR, загружать через меню настройки )

Генератор MD5 хэша ( можете и сами такой собрать, благо функций достаточно)
 

Вложения:

  • c_core10.zip
    c_core10.zip
    Размер файла
    119,3 КБ
    Просмотров
    409
  • Md5Check.zip
    Md5Check.zip
    Размер файла
    99,7 КБ
    Просмотров
    193
  • tinyLauncher.zip
    tinyLauncher.zip
    Размер файла
    713,6 КБ
    Просмотров
    549
Последнее редактирование:
[C_Core 1.0] API для создания лаунчера [ исходники на Delphi, ООП ]

Открываю исходники ядра, мониторинга серверов ( есть пример загрузки списка серверов через servers.dat) и трех лаунчеров, каждый со своими особенностями.

Скомпоновал в одну тему, чтобы флуда было меньше. С общей темой Delphi исходники.
А что мусора так много? Можно было и сократить это
 
@Russiablackbird, например
 
Ну вот. Теперь будет соблазн слизать отсюда пару десятков строчек кода :rolleyes:
 
Хм ну например вместо громадной функции Md5 можно было юзануть пакет из инди(один хер уже инди включён).
Да и антифриз это не дело.В потоках надо.
Путь до папки .appdata/roaming по другому определяется(тот же ShlObj CSIDL).
 
громадной функции Md5
Библиотека расчета MD5 ориентирована на работу с файлами и занимает 10 кб кода ( и то там есть пара неиспользуемых функций "прозапас") . Инди подключен частично, либы IdHashMessageDigest, idHash занимают гораздо больше, не вижу смысла их включать.
Да и антифриз это не дело. В потоках надо.
IdAntiFreeze не просто так же писали, по факту обычная "оживлялка" окна, больше и не надо. Но в качестве альтернативного варианта можно и в поток вогнать, и то зачем если единовременно требуется всего одно подключение? Вот кучу серверов мониторить через потоки вполне логичный выбор. А тут вроде и обсуждать не чего.
Путь до папки .appdata/roaming по другому определяется
Функция GetSysDir, поиск директории основан именно на ShlObj. Где конкретно вы смотрите?

@SwiftAdviser, @goul, Пользуйтесь и сами делитесь чем нибудь хоть иногда ;)
 
Функция GetSysDir, поиск директории основан именно на ShlObj. Где конкретно вы смотрите?
if (FileExists(tmp+'\.minecraft\bin\minecraft.jar')) then
Options.gOptions.Game := tmp+'\.minecraft\'
else if (FileExists(tmp+'\Roaming\.minecraft\bin\minecraft.jar')) then
Options.gOptions.Game := tmp+'\Roaming\.minecraft\';
 
@Russiablackbird, А теперь выше бери. tmp чему равно как думаешь?
просто у меня был случай что minecraft разместил себя на папку выше Roamingа, я решил проверять оба случая
 
@Russiablackbird, tmp := GetSysDir($001a); где $001a - CSIDL_APPDATA
 
@Russiablackbird, читай выше. Это поиски оригинальной папки майнкрафта. По умолчанию эти строчки программы вообще не выполняются. А ведется поиск и создание оригинальной папки игры.
 
@Russiablackbird, читай выше. Это поиски оригинальной папки майнкрафта. По умолчанию эти строчки программы вообще не выполняются. А ведется поиск и создание оригинальной папки игры.
А зачем они тогда нужны раз не выполняются?
 
@Russiablackbird, все зависит от твоих потребностей. Читай код. Create(PROG : string = 'TinyLauncher'; GameDirName : string = 'TWEBMCR'); Если строка GameDirName будет пустой то будет поиск папки офф клиента.
 

Поделиться этой страницей

Назад
Верх