Как сделать лаунчер для игры
Перейти к содержимому

Как сделать лаунчер для игры

  • автор:

C# Как обновлять игру через лаунчер по отдельным файлам?

Я делаю лаунчер для игры на C# WPF. Смотря на обновление игр в Steam, лаунчер Crossout, World of Tanks, Samp и прочие лаунчеры таких больших игр. Я видел, что там обновление происходит не устанавливая каждый раз игру заново, а если удалил какой-то файл, то лаунчер это поймёт и восстановит. Игра залита в репозиторий GitHub. Я не понял, как делать нечто вроде клонирования и в итоге получил ссылку на скачивание всего репозитория как архив и из кода разархивирую. Встала проблема с обновлением. Я могу сделать отдельный репозиторий для патчей и туда просто закидывать изменённые файлы, а дальше распаковывать в игру, но мне кажется это провальным. Если я удалю файл, то без понятия как сделать так, чтобы это понял лаунчер. Подскажите способы реализовать то что нужно, либо куда копать.

Отслеживать
задан 28 окт 2022 в 12:01
11 4 4 бронзовых знака

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

28 окт 2022 в 12:13

Берете все файлы, делаете их «снимок» (сохраняя размер, md5 (или аналог), путь), сохраняете в файлик, далее уже на основе этих данных проверяете клиент игры, если файла нет, файл имеет другой размер, или у файла другой md5, то значит с этим файлом что-то не так, а значит надо его восстановить. Как? А зависит от вас, обычно есть сервер с файлами, от куда качается все, последнее время в моде p2p (торрент), где сервером является каждый игрок. Патчи по аналогии, ищите разницу между старой версией и новой, эту разницу и отправляете игрокам. Вот и вся логика.

28 окт 2022 в 13:28

Если git, то обновление командой git pull делается. Почитайте документацию по git, но выбор гита в качестве источника обновления — странный.

Как создать лаунчер для SAMP/CRMP, MTA, Arizona, Radmir

Как создать лаунчер для SAMP/CRMP, MTA, Arizona, Radmir

Шаг 2: Навигируйтесь к «Услуги» -> «Лаунчеры» -> «Создать новый».

Шаг 3: В появившемся окне выберите «Лаунчер для ПК (Windows)» и нажмите на этот текст. Затем отобразится лицензионное соглашение; пожалуйста, ознакомьтесь с ним. После этого поставьте галочку слева от текста «Я ознакомлен и согласен с условиями пользовательского соглашения» и нажмите «Далее».

Шаг 4: На этом этапе выберите тариф, нажав на кнопку «Не выбрано». Появится список доступных тарифов.

— Лаунчер для MTA San Andreas: Включает официальные клиенты MTA 1.5, 1.6, Custom, Unstable версии.
— Лаунчер для SAMP: Включает официальные версии SAMP 0.3.7 и CRMP 0.3e.

Выберите желаемую игру.

Шаг 5: Выберите опции и сборки игры.

Опции:
— Кастомизация: Позволяет настроить дизайн лаунчера, сделать его уникальным.
— Серверы на других хостингах: Данная опция позволяет использовать лаунчер с любым хостингом.
— Свои сборки игры: Позволяет создать и настроить собственную сборку игры под ваши цели и потребности.

Сборки игры:
Выберите необходимую вам сборку.

Шаг 6: Ниже вы увидите срок действия лицензии лаунчера. Выберите желаемый срок действия. Аренда лаунчера на более длительный срок экономически более выгодная. Если у вас есть промокод для лаунчера, нажмите «Есть промокод?» и введите его.

После этого нажмите «Оплатить», и откроется окно оплаты.

Шаг 7: После оплаты вам будет предложено настроить лаунчер. Нажмите на кнопку «Начать».

Шаг 8: Выберите сборку игры по своему выбору. Если вы выбрали опцию «Свои сборки игры», вы сможете настроить скачивание сборки позже.

Шаг 9: Следующим шагом будет выбор дизайна. На данный момент доступен только один базовый дизайн. Нажмите «Использовать дизайн».

Шаг 10: Все готово, вы заказали лаунчер. Для более тонкой настройки лаунчера, нажмите «Кастомизировать или поменять дизайн».

Свой лаунчер на основе батника

Свой лаунчер на основе батника

Лаунчер — программа для загрузки и запуска игры;
ОС — операционная система;
JRE — Java Runtime Environment, программное обеспечение для запуска Java приложений;
Ассеты — игровые ресурсы;
Нативы — библиотеки для выполнения Java приложения на определенной платформе (семейство ОС);
Гб — гигабайт (1024 мегабайта);
Мб — мегабайт (1024 килобайта);
ОЗУ — Оперативно Запоминающее Устройство, если проще, оперативная память;
JVM — Виртуальная Машина Java, среда выполнения Java приложения;
Токен — ключ доступа, используемый для авторизации на серверах игры(доступ к скинам и Realms)

Получение нужной информации о системе (разрядность JRE, семейство ОС);​
Аутентификация пользователя;​
Получение идентификатора пользователя и токена;​
Построение строки запуска;​
Выполнение строки запуска и скрытие лаунчера (для логирования возможных ошибок);​
Завершение процесса лаунчера после завершение процесса игры.​
1. Базовая строка запуска

Откроем обычный блокнот и созданим в удобном месте файл с расширением .bat. Теперь, закроем блокнот и откроем созданный файл с помощью программы Notepad++. Перед дальнейшим редактированием советую отключить авто преобразование в UTF-8. Для этого снимем в настройках эту галочку:

Screenshot_2.png

Для удобства будем использовать переменные. Для создания переменной используем запись типа set имя=значение . Создадим переменные с папками игры:

set dir=%AppData%\.minecraft set ast=%AppData%\.minecraft\assets set nat=%AppData%\.minecraft\natives set lib=%AppData%\.minecraft\libraries

Теперь построим базовую строку запуска:
javaw аргументы[I]jvm главный[/I]класс программные_аргументы
Первое слово указывает запускаемое приложение из системных переменных(устанавливаются с установкой JRE), потом идут все JVM аргументы, указывается главный класс и в конце программные аргументы.

1. 1. 1. Аргументы JVM. Куча

Куча — это та область оперативной памяти компьютера, которая может быть использована Java приложением. Её размер задается двумя аргументами. Один задает её начальный размер, а второй, максимальный. Также, важно отметить, что лучше делать её фиксированной, ибо когда приложению не хватает начального объема, оно увеличивает его на какое-то значение, вплоть до максимально, что часто вызывает подлагивание. Начальный размер определяется аргументом -Xms4G а максимальный -Xmx4G . Буква G обозначает гигабайты, M — мегабайты. Ещё можно также этот объём памяти зарезервировать в самой ОС с помощью аргумета -XX:+AlwaysPreTouch Получается мы делаем фиксированную кучу равной 4Гб ОЗУ и сразу же резервируем данный объём на уровне ОС. Теперь наша строка выглядит так:
javaw -Xms4G -Xmx4G -XX:+AlwaysPreTouch

1. 1. 2. Аргументы JVM. Сборщик мусора
Процент кучи под новые данные​
Процент кучи для резерва​
Максимальное время для сборки мусора​
Размер блоков, не больше 32М​

Также, для версий Minecraft 1.14+ и версий Java 11+ есть смысл попробовать новые сборщики мусора. Они работают совсем по другим принцыпам нежели ConcMark или G1 и могут обеспечить более эффективную очистку мусора с меньшим влиянием на FPS/TPS. Первый это -XX:+UseShenandoahGC , который по моим наблюдениям является достаточно эффективнее G1. Второй это -XX:+UseZGC , который является экспериментальным и его рекомендуется использовать с самыми новыми версиями Java. Он пока не показал себя намного эффективнее G1, но он скорее как «задел на будущее». Сами аргументы для активации этих сборщиков считаются экспериментальными, а значит без -XX:+UnlockExperimentalVMOptions не обойтись. Незабудьте, эти сборщики совсем другие нежели ConcMark или G1, так что при их ипользовании очистите остальные аргументы, которые могут касатся сборщиков мусора. Также, в последних версиях Oracle Java они могут быть вырезаны/деактивированы, поэтому можете попробовать Adopt Open JDK.

1. 2. Аргументы JVM. Дополнительно

Есть некоторые дополнительные аргументы, такие как указание названия лаунчера и его версии, указание версии и имени подсистемы DOS для управления файловой системой(иногда убирает проблему записи файлов сохранений):

-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe.heapdump — позволяет корректно записывать файлы дампов памяти при краше игры и адекватно переключатся игре на дискретную графику;
-Dos.name=»Windows 10″ — указание имени подсистемы DOS;
-Dos.version=10.0 — указание версии подсистемы DOS;
-Dminecraft.launcher.brand=my-best-launcher — название лаунчера;
-Dminecraft.launcher.version=2.0 — версия лаунчера;
-XX:+AggressiveOpts — использовать экспериментальные функции оптимизации.

Пример строки для Windows 10:

-Xms4G -Xmx4G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe.heapdump -Dos.name="Windows 10" -Dos.version=10.0 -Dminecraft.launcher.brand="console-minecraft-starter" -Dminecraft.launcher.version=2.5

1. 3. Аргументы JVM. Библиотеки

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

Файл конфигурации устанавливается аргументом -Dlog4j.configurationFile=»%ast%\log_configs\client-1.12.xml», но если у вас нету этого файла, просто не используйте этот аргумент. Он настраивает логирование и архивацию устаревших логов.

Путь к нативам указывается через -Djava.library.path=»%nat%». Но эти нативы нужно достать. Обычно, они хранятся в библиотеках игры и распаковываются во временную папку перед каждым запуском. Сами нативы это dll библиотеки от игрового движка LWJGL и нарратора(в новых версиях). Просто распакуйте их в папку C:\Users\пользователь\AppData\Roaming\.minecraft\natives а jar-ники с ними обычно находятся по путям libraries\com\mojang\text2speech\ и libraries\org\lwjgl . Вот нативы для версии игры 1.14.4:

Screenshot_1.png

А вот составление аргумента игровых библиотек займет наибольшее количество времени. Аргумент имеет вид -Cр «всепутибиблиотек». В скобках нужно указать через двоеточие пути ко всем jar-никам игры (их достаточно много). К примеру так: -Cp «%lib%\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;%lib%\com\google\guava\guava\21.0\guava-21.0.jar;. »
Вот полный вид аргумента для всех библиотек:

-cp "%lib%\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;%lib%\com\google\guava\guava\21.0\guava-21.0.jar;%lib%\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\brigadier\1.0.17\brigadier-1.0.17.jar;%lib%\com\mojang\datafixerupper\2.0.24\datafixerupper-2.0.24.jar;%lib%\com\mojang\javabridge\1.0.22\javabridge-1.0.22.jar;%lib%\com\mojang\patchy\1.1\patchy-1.1.jar;%lib%\com\mojang\text2speech\1.11.3\text2speech-1.11.3.jar;%lib%\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;%lib%\commons-io\commons-io\2.5\commons-io-2.5.jar;%lib%\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;%lib%\io\netty\netty-all\4.1.25.Final\netty-all-4.1.25.Final.jar;%lib%\it\unimi\dsi\fastutil\8.2.1\fastutil-8.2.1.jar;%lib%\net\java\dev\jna\jna\4.4.0\jna-4.4.0.jar;%lib%\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;%lib%\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;%lib%\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;%lib%\net\sf\jopt-simple\jopt-simple\5.0.3\jopt-simple-5.0.3.jar;%lib%\optifine\launchwrapper-of\2.1\launchwrapper-of-2.1.jar;%lib%\optifine\OptiFine\1.14.4_HD_U_F5\OptiFine-1.14.4_HD_U_F5.jar;%lib%\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;%lib%\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;%lib%\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;%lib%\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;%lib%\org\apache\logging\log4j\log4j-api\2.8.1\log4j-api-2.8.1.jar;%lib%\org\apache\logging\log4j\log4j-core\2.8.1\log4j-core-2.8.1.jar;%lib%\org\lwjgl\lwjgl\3.2.2\lwjgl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-glfw\3.2.2\lwjgl-glfw-3.2.2.jar;%lib%\org\lwjgl\lwjgl-jemalloc\3.2.2\lwjgl-jemalloc-3.2.2.jar;%lib%\org\lwjgl\lwjgl-openal\3.2.2\lwjgl-openal-3.2.2.jar;%lib%\org\lwjgl\lwjgl-opengl\3.2.2\lwjgl-opengl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-stb\3.2.2\lwjgl-stb-3.2.2.jar;%lib%\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;%lib%\net\minecraft\client\1.14.4-OptiFine_HD_U_F5\1.14.4-OptiFine_HD_U_F5.jar"

(может отличатся в зависимости от типа установки игры).

2. Главный класс

Главный класс, это как кнопка зажигания в машине, сам небольшой, но запускает все. Для чистой версии это net.minecraft.client.main.Main а для модифицированной (с OptiFine или Forge) это net.minecraft.launchwrapper.Launch .

3. Программные аргументы
—username никнейм
—version версия_игры
—gameDir папка_сохранений
—assetsDir папка_ассетов
—assetIndex индекс_ассетов (типа 1.14, 1.13, 1.12 и тд.)​
—uuid идентификатор_пользователя (если нету, указывайте null)​
—accessToken токен (если нету, указывайте null)​
—userType тип_пользователя (на что влияет не понятно, но надо)​
—versionType тип_версии (может влиять на надпись версии в главном меню игры)​

—tweakClass класс_твикер (в чистой версии не используется, а для OptiFine это optifine.OptiFineTweaker)​

javaw -Xms4G -Xmx4G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe.heapdump -Dos.name="Windows 10" -Dminecraft.launcher.brand="cms" -Dminecraft.launcher.version=2.3 -Dlog4j.configurationFile="%ast%\log_configs\client-1.12.xml" -Djava.library.path="%nat%" -cp "%lib%\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;%lib%\com\google\guava\guava\21.0\guava-21.0.jar;%lib%\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\brigadier\1.0.17\brigadier-1.0.17.jar;%lib%\com\mojang\datafixerupper\2.0.24\datafixerupper-2.0.24.jar;%lib%\com\mojang\javabridge\1.0.22\javabridge-1.0.22.jar;%lib%\com\mojang\patchy\1.1\patchy-1.1.jar;%lib%\com\mojang\text2speech\1.11.3\text2speech-1.11.3.jar;%lib%\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;%lib%\commons-io\commons-io\2.5\commons-io-2.5.jar;%lib%\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;%lib%\io\netty\netty-all\4.1.25.Final\netty-all-4.1.25.Final.jar;%lib%\it\unimi\dsi\fastutil\8.2.1\fastutil-8.2.1.jar;%lib%\net\java\dev\jna\jna\4.4.0\jna-4.4.0.jar;%lib%\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;%lib%\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;%lib%\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;%lib%\net\sf\jopt-simple\jopt-simple\5.0.3\jopt-simple-5.0.3.jar;%lib%\optifine\launchwrapper-of\2.1\launchwrapper-of-2.1.jar;%lib%\optifine\OptiFine\1.14.4_HD_U_F5\OptiFine-1.14.4_HD_U_F5.jar;%lib%\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;%lib%\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;%lib%\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;%lib%\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;%lib%\org\apache\logging\log4j\log4j-api\2.8.1\log4j-api-2.8.1.jar;%lib%\org\apache\logging\log4j\log4j-core\2.8.1\log4j-core-2.8.1.jar;%lib%\org\lwjgl\lwjgl\3.2.2\lwjgl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-glfw\3.2.2\lwjgl-glfw-3.2.2.jar;%lib%\org\lwjgl\lwjgl-jemalloc\3.2.2\lwjgl-jemalloc-3.2.2.jar;%lib%\org\lwjgl\lwjgl-openal\3.2.2\lwjgl-openal-3.2.2.jar;%lib%\org\lwjgl\lwjgl-opengl\3.2.2\lwjgl-opengl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-stb\3.2.2\lwjgl-stb-3.2.2.jar;%lib%\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;%lib%\net\minecraft\client\1.14.4-OptiFine_HD_U_F5\1.14.4-OptiFine_HD_U_F5.jar" net.minecraft.launchwrapper.Launch --username "%usr%" --version 1.14.4-OptiFine_HD_U_F5 --gameDir "%dir%" --assetsDir "%ast%" --assetIndex 1.14 --uuid null --accessToken null --userType mojang --versionType release --tweakClass optifine.OptiFineTweaker

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

4. Оформление батника

Можно сделать наш лаунчер более интерактивным и привлекательным.
Строка title Launcher установит имя окна с командами, запись @echo off отключит вывод команды (не её результат). Также, командой echo . вы можете выводить свои сообщения, а с помощью cls очищать их. Хотите оформление? Используйте color 0a чтобы задать цвет фона первой цифрой и цвет символов второй буквой. Для установки переменной вводом используйте запись типа set /p usr=^> (вот справка по кодам, тык)!

Также, можно сделать авто скрытие лаунчера после ввода нужных данных. Для этого нужна утилита CMDOW, которая позволяет управлять самим окном консоли. Узнать более подробно о её функционале и скачать её можно здесь. В скачанном архиве по пути bin\release понадобится сама утилита (да, вся утилита это один файл). Файл для удобства можно переместить в папку игры в папку bin к примеру. Для скрытия окна консоли используйте команду cmdow.exe @ /HID предварительно указав путь в переменных. Скрытие делайте до строки запуска, ибо в батнике одна строка выполняется только после конца работы той, что перед ней. А также рекомендуется, после выполнения строки запуска и выхода из игры (завершения работы строки запуска) завершить процесс cmd командой exit .

Важно! Для корректного отображения кириллицы установите кодировку батника на OEM-866!

Вот примерный вид после оформления:

Screenshot_3.png

@echo off color 0a title Minecraft Launcher set dir=%AppData%\.minecraft set bin=%AppData%\.minecraft\bin set run=%AppData%\.minecraft\runtime\bin set nat=%AppData%\.minecraft\natives set ast=%AppData%\.minecraft\assets set lib=%AppData%\.minecraft\libraries echo Какой никнейм желаете использовать? set /p usr=^> cls echo Сколько гигабайт ОЗУ желаете выделить игре? set /p ram=^> cls "%bin%\cmdow.exe" @ /HID "%run%\javaw.exe" -Xms%ram%G -Xmx%ram%G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe.heapdump -Dos.name="Windows 10" -Dminecraft.launcher.brand="cms" -Dminecraft.launcher.version=2.3 -Dlog4j.configurationFile="%ast%\log_configs\client-1.12.xml" -Djava.library.path="%nat%" -cp "%lib%\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;%lib%\com\google\guava\guava\21.0\guava-21.0.jar;%lib%\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;%lib%\com\mojang\brigadier\1.0.17\brigadier-1.0.17.jar;%lib%\com\mojang\datafixerupper\2.0.24\datafixerupper-2.0.24.jar;%lib%\com\mojang\javabridge\1.0.22\javabridge-1.0.22.jar;%lib%\com\mojang\patchy\1.1\patchy-1.1.jar;%lib%\com\mojang\text2speech\1.11.3\text2speech-1.11.3.jar;%lib%\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;%lib%\commons-io\commons-io\2.5\commons-io-2.5.jar;%lib%\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;%lib%\io\netty\netty-all\4.1.25.Final\netty-all-4.1.25.Final.jar;%lib%\it\unimi\dsi\fastutil\8.2.1\fastutil-8.2.1.jar;%lib%\net\java\dev\jna\jna\4.4.0\jna-4.4.0.jar;%lib%\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;%lib%\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;%lib%\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;%lib%\net\sf\jopt-simple\jopt-simple\5.0.3\jopt-simple-5.0.3.jar;%lib%\optifine\launchwrapper-of\2.1\launchwrapper-of-2.1.jar;%lib%\optifine\OptiFine\1.14.4_HD_U_F5\OptiFine-1.14.4_HD_U_F5.jar;%lib%\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;%lib%\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;%lib%\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;%lib%\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;%lib%\org\apache\logging\log4j\log4j-api\2.8.1\log4j-api-2.8.1.jar;%lib%\org\apache\logging\log4j\log4j-core\2.8.1\log4j-core-2.8.1.jar;%lib%\org\lwjgl\lwjgl\3.2.2\lwjgl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-glfw\3.2.2\lwjgl-glfw-3.2.2.jar;%lib%\org\lwjgl\lwjgl-jemalloc\3.2.2\lwjgl-jemalloc-3.2.2.jar;%lib%\org\lwjgl\lwjgl-openal\3.2.2\lwjgl-openal-3.2.2.jar;%lib%\org\lwjgl\lwjgl-opengl\3.2.2\lwjgl-opengl-3.2.2.jar;%lib%\org\lwjgl\lwjgl-stb\3.2.2\lwjgl-stb-3.2.2.jar;%lib%\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;%lib%\net\minecraft\client\1.14.4-OptiFine_HD_U_F5\1.14.4-OptiFine_HD_U_F5.jar" net.minecraft.launchwrapper.Launch --username "%usr%" --version 1.14.4-OptiFine_HD_U_F5 --gameDir "%dir%" --assetsDir "%ast%" --assetIndex 1.14 --uuid null --accessToken null --userType mojang --versionType release --tweakClass optifine.OptiFineTweaker del "%dir%\logs\*.gz" exit

(У вас может отличатся)

5. Компиляция в .exe

Возможно вы хотите не запукать какой-то там батник? Можем преобразовать его в обычный .exe с помощью программы Bat To Exe Converter. Можете скачать её здесь. Можете открыть свой батник, немного подредактировать и задать ему иконку или информацию о версии. Если увидите вместо русских надписей кракозябры, не волнуйтесь, после компиляции будет нормально. Когда завершили правки, просто нажмите на компиляцию и укажите путь сохранения и имя файла. Вуаля, теперь наш лаунчер — обычный исполняемый файл.

Автор WantaSanchez Скачивания 35 Просмотры 16,033 Первый выпуск 11 Май 2020 Обновление 25 Ноя 2020 Оценка 5.00 звёзд 1 оценок

Как создать лаунчер для CS: GO?

Меня конкретно интересует информация, как создать лаунчер и внедрить в него первый пункт. Какой нужен язык, как гуглить такую информацию, какие библиотеки нужны, нужен ли WInAPI, можно ли вообще на C# сделать такое добро. И вообще любые keywords, которые помогут найти инфу в сети.

  • Вопрос задан более трёх лет назад
  • 1863 просмотра

2 комментария

Оценить 2 комментария

Игроки на Линуксе будут очень рады.
Макс Максимов @maximka19 Автор вопроса
Решения вопроса 1

jamakasi666

Дмитрий Александров @jamakasi666
Просто IT’шник.

Все это делает стим. Заканчивайте пиратить игра и так копейки стоит.
А по факту чтобы такое сделать нужно примерно следующее:
1) Тут можно конечно извратиться но в абсолютно любом случае. Вам нужно будет писать плагин для сервера на с++ в котором каким либо образом осуществлять коннект с клиентом к примеру по сокетам. С клиентской стороны писать опять же писать плагин все также на с++ для игры и при этом отключать верефикацию сертификата или получить его у valve чтобы плагин заработал на клиенте. Промежуточное звено в виде веб сервера с простым скриптом и БД для хранения и верефикации токенов Дальше обвязывать все это друг с другом что то типа:
-запуск игры из лаунчера(получение токена от промежуточного сервера) и передача его в игру
-игра запустилась и приняла плагином движка этот токен, коннект к серверу и передача на него этого токена.
-клиент подключился к серверу и принял токен. Сервер делает верефикацию полученного токена от клиента на промежуточном сервере и по результату разрешает вход в игру или дисконектит с сервера.
2) Свой античит даже близко недостающий функционалом до VAC у вас не получится, на это во первых тратят огромные деньги, во вторых нет исходников игры чтобы понимать чем пользуется чит. В третьих сама ОС
антивирус забракует такую подозрительную активность от левого процесса в система посчитав ваш лаунчер вирусом.
3) Тут делать как угодно можно, начиная от скриншотов самим лаунчером, заканчивая тем что их может делать плагин движка.
4) Зависит от функционала.

Ответ написан более трёх лет назад
Нравится 7 8 комментариев
Макс Максимов @maximka19 Автор вопроса

Так в том-то и дело. Нужно создать что-то вроде FACEIT, куда будут подключаться игроки и играть за призы. А как аналогию я представлял больше iCCupLauncher. Спасибо за содержательный ответ, будем дальше копать.

jamakasi666

Дмитрий Александров @jamakasi666

Макс Максимов: тогда тут не лаунчер нужен а совсем иная система. К примеру как раньше был устроен tf2lobby.
1) Сайт на котором сделана аутентификация по Steam OpenID:
-игрок авторизуется на нем
-сайт получает информацию о игроке.
-игрок выбирает лобби и подбираются союзники\противники.
-после подбора игроков и выбора карты в БД сайта заносятся steamid игроков и имя лобби
-где то на vds запускается свободный сервер с заданным режимом\картой\настройками
-появляется ссылка на страничке по протоколу steam browser protocol вида «steam://connect/1.0.0.27:27015» при нажатии на которую запустится стим и нужная игра сразу с быстрым подключением на указанный сервер.
2) На игровых серверах стоит sourcemod плагин который:
-цепляется к БД сайта под своим уникальным ID.
-ждет игроков.
-при подключении игрока сверяет его steamid с тем который хранится в БД сайта конкретно для этого матча. Если совпадает то дает подключиться иначе дисконектит.
-по оканчании матча выгружает в БД сайта статистику игроков к их учеткам.
-сервер выключается.
-срабатывает скрипт который любым удобным способом выгружает в файловое хранилище сайта демку матча(причем необходимо не обычное демо а сурствшное) и прикрепляет ее к истории и статистике матча и игроков.

Дальше можно расширить этот алгоритм, к примеру по результатам матча которые пришли на сайт дать победителям награды и т.д.
В виде античита чаще всего используют сторонние готовые решения по типу ESL Anticheat и подобных. Заморачиваться со своим просто бессмысленно.

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

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

Макс Максимов @maximka19 Автор вопроса

Дмитрий Александров: вот это уже, кажется, более подходит. Всё равно нужна какое-то связное ПО, которое будет делать скриншот десктопа (незаметно от юзера) в рандомный момент и отправлять на сервер. Первоначально, именно для этого и требовался «лаунчер». Так как, WallHack намного сложнее отследить, чем, скажем, AIM и тд. P/S. Сам не играю CS, знаю только отдалённо.

jamakasi666

Дмитрий Александров @jamakasi666

Макс Максимов: открою секреты, это полностью бессмысленно т.к. большая часть приватных читов прекрасно обходят такие скриншоты и даже видеозахват экрана. Остаются только массовые бесплатные или дешевые читы но их как правило покупают школьники которые и так палятся визуально полностью на ура или блочатся ваком.
Добавлю еще то что опытного читера вообще огроменная проблема спалить, особенно если он зарабатывает таким способом. Так что вы хотите попытаться устроить банальную охоту на ведьм и ни к чему хорошему\удобному это не приведет.

Макс Максимов @maximka19 Автор вопроса
Дмитрий Александров: а какие варианты есть?

jamakasi666

Дмитрий Александров @jamakasi666

Макс Максимов: никаких, все пытаются но ни у кого не получается. Просто не существует способа отловить, тут банальная гонка вооружения. Античиты постоянно совершенствуют, читы аналогично совершенствуются чтобы не палиться.
Взять к примеру так популярный аимбот, в дешевых вариантах читов не заморачиваются и он палится всеми способами. Взять его усовершенствованную версию в виде автошота, он все также дает гигантское преимущество но при этом спалить человека с ним практически невозможно даже если стоять у него за спиной.
Берем в пример valve, у них есть VAC, у них есть ручная проверка командой разрабов,у них есть внутреигровые жалобы на читерство, у них есть внутреигровой «инспектор по демкам» которые раследуют сами игроки, есть кучи плагинов с доп античитами от самих серверодержателей, есть плагины на самих серверах со своими списками банов, сейчас вон уже и этого мало и делают детект человечности через нейросети. При этом число читеров никак не уменьшается.
Берем в пример blizzard. У них есть античит, у них также есть огромная команда которая занимается рассмотрением жалоб и проверки игроков, у них есть внутреигровые жалобы, у них есть огромный юр.отдел который судится с теми кто пишет читы. Они даже протолкнули(один из проталкивателей) в южной Корее закон о том что если пользователь читерил то ему дают реальные сроки на зоне и штрафы. И ничего не помогает, читеры как были так и остаются.
Пока читерство это прибыльный бизнес, будут существовать и читы и читеры. Я тебе даю гарантию на миллиард процентов что даже если ты будешь пытаться сделать свой античит и даже целой командой то ничего из этого не получится кроме огромнейшего гемороя со стороны обычных, честных пользователей что будет порождать много негодования со стороны игроков и их неохоту пользоваться всем этим.

Самый простой вариант это веди свою базу банов, попробуй договориться с крупной торговой площадкой ломанных акков и на неких взаимовыгодных условиях получить от них steamid этих акков чтобы поставить их на особый контроль в своей системе. Введи награду за поимку читеров по демкам для пользователей сервиса, реализуй некую доп аутентификацию пользователей для особых матчей(к примеру если там есть денежные вознаграждения и т.д.) например путем удержания самого вознаграждения на несколько дней пока будут изучены демки. Или же введи уровень доверия пользователей в сервисе, пусть после регистрации они должны будут отыграть некоторое количество матчей и получить доверие после проверки демок по ним тобой\командой\другими пользователями сервиса.

Макс Максимов @maximka19 Автор вопроса

Дмитрий Александров: содержательно, спасибо. Вчера думал насчёт вопроса про скриншоты.. есть wallhack, который не палится скриншотом?

jamakasi666

Дмитрий Александров @jamakasi666

Макс Максимов: полно, практически все приватники не палятся. Пользуются дичайшей популярностью у стримеров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *