@echo off chcp 65001 >nul setlocal title Мультиверс - установщик rem Установщик клиента «Мультиверс» для Windows 10/11. rem Запускать можно сколько угодно раз: сначала он проверяет, что уже rem стоит (по именам И размерам файлов), и качает архив ТОЛЬКО если rem чего-то не хватает или файл битый. set "URL=https://multigame.kudabra.us/downloads/multiverse-client.zip" set "CACHE=%TEMP%\multiverse-client.zip" set "LOCAL=%~dp0multiverse-client.zip" set "MC=%APPDATA%\.minecraft" set "VER=neoforge-21.1.248" set "NEED=23" set "NEEDLIB=243" set "SKINURL=https://multigame.kudabra.us/skins/{USERNAME}.png" setlocal EnableDelayedExpansion echo. echo ============================================================ echo. echo М У Л Ь Т И В Е Р С - установщик [Windows] echo. echo Minecraft 1.21.1 + NeoForge 21.1.248 echo 23 модов echo (включая скины, карту мира и оружейный мод Point Blank) echo. echo ============================================================ echo. echo Привет. Сейчас я проверю, что уже стоит, и доставлю недостающее. echo Ничего нажимать не надо - просто подожди. echo. echo Папка установки: !MC! echo. if not exist "!MC!" mkdir "!MC!" if not exist "!MC!\mods" mkdir "!MC!\mods" rem ================= 1. Что уже стоит ================= echo [1/5] Проверяю, что уже установлено... call :scan call :report_scan rem ================= 2. Чужие моды в сторонку ================= call :cleanforeign rem ================= 3. Нужен ли архив ================= set "NEEDZIP=0" if !MMISS! GTR 0 set "NEEDZIP=1" if !MBAD! GTR 0 set "NEEDZIP=1" if !VMISS! GTR 0 set "NEEDZIP=1" if !LIBHAVE! LSS !NEEDLIB! set "NEEDZIP=1" if "!NEEDZIP!"=="0" ( echo [2/5] Все !NEED! модов на месте и целые - архив качать не нужно. goto :skins ) set "SKIPLOCAL=0" set "PASS=0" :repair set /a PASS+=1 call :getzip if not defined SRC ( if "!DLERR!"=="notools" goto :notools if "!DLERR!"=="nospace" goto :nospace goto :dlfail ) echo. echo [3/5] Распаковываю недостающее... tar -xf "!SRC!" -C "!MC!" if errorlevel 1 ( echo Архив не распаковался - похоже, он битый. call :dropsrc if !PASS! LSS 2 goto :repair goto :badzip ) call :scan set "STILLBAD=0" if !MMISS! GTR 0 set "STILLBAD=1" if !MBAD! GTR 0 set "STILLBAD=1" if !VMISS! GTR 0 set "STILLBAD=1" if !LIBHAVE! LSS !NEEDLIB! set "STILLBAD=1" if "!STILLBAD!"=="1" ( echo После распаковки всё ещё не всё на месте - архив был неполный. call :dropsrc if !PASS! LSS 2 goto :repair goto :incomplete ) rem архив из TEMP больше не нужен, свой (рядом со скриптом) не трогаем if "!KEEP!"=="0" del "!CACHE!" >nul 2>nul rem ================= 4. Настройки скинов ================= :skins echo [4/5] Проверяю настройки скинов... call :checkskin if "!CSLOK!"=="1" ( echo скины настроены правильно ) else ( call :writeskin call :checkskin if "!CSLOK!"=="1" ( echo настройки скинов восстановлены ) else ( echo ВНИМАНИЕ: не удалось записать настройки скинов ) ) rem ================= 5. Раскладка по каталогам TLauncher ================= echo [5/5] Раскладываю моды по игровым каталогам TLauncher... set /a EXTRA=0 for %%D in ("versions\!VER!" "!VER!") do call :fanout "%%~D" if !EXTRA! EQU 0 echo (дополнительных каталогов нет - всё в основном) call :scan echo. echo ============================================================ echo. echo ГОТОВО. Всё установилось. Модов: !MOK! из !NEED! echo. echo ============================================================ echo. if "!FFAIL!"=="1" ( echo НО: чужой мод остался в папке mods, убрать его не вышло: echo !FFLIST! echo Закрой игру и лаунчер и запусти установщик ещё раз, echo иначе игра может упасть на старте. echo. ) echo Что дальше: echo. echo 1. Открой TLauncher. echo. echo 2. В списке версий выбери: !VER! echo Не видно - включи показ установленных версий echo или перезапусти TLauncher. echo. echo 3. Совет для ноутбука: в настройках TLauncher, шестерёнка, echo выдели игре 4 ГБ памяти - с модами заметно плавнее. echo. echo 4. Жми "Играть". ПЕРВЫЙ запуск дольше обычного: TLauncher echo сам докачает ваниль 1.21.1, звуки и текстуры. Дай доделать. echo. echo 5. В игре: Сетевая игра -^> Добавить сервер, адрес: echo. echo multiverse.kudabra.us echo. echo ------------------------------------------------------------ echo ОРУЖИЕ echo ------------------------------------------------------------ echo В сборку входит оружейный мод Point Blank: винтовки, echo пистолеты, снайперки, дробовики, патроны и прицелы. echo Оружие не выдаётся само - оно крафтится на верстаке мода echo (Arms Dealer Workstation). Мод GeckoLib рядом с ним - echo служебная библиотека анимаций, она нужна для работы оружия. echo. echo ------------------------------------------------------------ echo КАРТА И МИНИКАРТА echo ------------------------------------------------------------ echo В сборку входят Xaero's Minimap и Xaero's World Map: echo миникарта в углу экрана и полноэкранная карта мира, echo которая рисуется сама, пока ты ходишь по миру. echo Клавиши по умолчанию: echo M - открыть полноэкранную карту мира echo B - поставить точку (waypoint) там, где стоишь echo U - список точек (Open Waypoint Screen) echo Y - настройки миникарты echo Z - увеличить миникарту (пока держишь клавишу) echo Num + - быстрая точка, без окошка echo Всё это меняется в Настройки -^> Управление, разделы echo "Xaero's Minimap" и "Xaero's World Map". echo Точки лагерей NPC вбивать руками не надо: напиши в чат echo "Войс, где лагеря" - он пришлёт их прямо в чат, и точка echo добавляется одним кликом по сообщению. echo. echo ------------------------------------------------------------ echo СКИНЫ echo ------------------------------------------------------------ echo В сборку входит поддержка скинов (мод CustomSkinLoader). echo Свой скин загружаешь на сайте https://multigame.kudabra.us echo в разделе "Профиль" - там же и превью. Скин виден тебе и echo другим игрокам с клиентом Мультиверса. После смены скина echo перезайди на сервер или подожди пару минут. echo. echo ------------------------------------------------------------ echo ЕСЛИ НЕ ПУСКАЕТ НА СЕРВЕР (пишет про "каналы модов") echo ------------------------------------------------------------ echo Ошибка вида "Канал мода ... отсутствует на стороне клиента" echo значит, что игра читает ДРУГУЮ папку mods. echo. echo * В окне ошибки нажми кнопку "Папка с модами" - откроется echo тот каталог, который игра использует на самом деле. echo В нём должно быть !NEED! jar-файлов. echo. echo * Если папка пустая или файлов меньше - скопируй туда все echo jar-файлы вот отсюда: echo !MC!\mods echo. echo * Либо выключи в настройках версии TLauncher галочку echo "Отдельная папка/директория" и запусти установщик ещё раз. echo. echo Установщик можно запускать сколько угодно раз: он проверяет echo каждый мод по размеру и молча доставляет только то, чего echo не хватает. Если всё на месте - ничего не качает. echo. echo Увидимся в Мультиверсе. echo ------------------------------------------------------------ pause exit /b 0 rem ==================== ошибки ==================== :notools echo ------------------------------------------------------------ echo На этом компьютере нет curl.exe или tar.exe. echo Они входят в Windows 10 и 11 - поставь обновления Windows, echo либо скачай архив вручную и распакуй его сам: echo !URL! echo в папку !MC! echo Подробнее - в инструкции: echo https://multigame.kudabra.us/downloads/INSTRUKCIYA-WIN.txt goto :fail :nospace echo ------------------------------------------------------------ echo МАЛО МЕСТА НА ДИСКЕ: свободно !FREE! МБ, нужно 1200 МБ. echo Освободи место и запусти установщик ещё раз. goto :fail :dlfail echo. echo ------------------------------------------------------------ echo НЕ ПОЛУЧИЛОСЬ СКАЧАТЬ АРХИВ. Что можно сделать: echo * проверь, что интернет вообще работает; echo * если включён VPN - попробуй выключить, и наоборот; echo * запусти установщик ещё раз - он ПРОДОЛЖИТ загрузку echo с места обрыва, а не с нуля; echo * скачай архив браузером по ссылке echo !URL! echo положи его РЯДОМ с этим установщиком и запусти снова - echo он возьмёт готовый файл и качать не будет. goto :fail :badzip echo ------------------------------------------------------------ echo Архив повреждён или не распаковался. echo Запусти установщик ещё раз - он скачает архив заново. goto :fail :incomplete echo ------------------------------------------------------------ echo Что-то встало не полностью. if defined MISSLIST echo Не хватает: !MISSLIST! if defined BADLIST echo Битые файлы: !BADLIST! echo Запусти установщик ещё раз - он перепишет всё поверх. goto :fail :fail echo. pause exit /b 1 rem ==================== подпрограммы ==================== rem ---- полная инвентаризация установки ---- :scan set /a MOK=0, MMISS=0, MBAD=0, VMISS=0 set "MISSLIST=" set "BADLIST=" set "OURS=" rem === MANIFEST BEGIN (генерируется build-zip.ps1, не править руками) === call :chk cristellib.jar 583525 call :chk customskinloader.jar 218215 call :chk dungeonsarise.jar 11842679 call :chk dungeons-taverns.jar 24859622 call :chk easy_npc.jar 2704420 call :chk easy_npc_bundle.jar 25214 call :chk easy_npc_config_ui.jar 1064049 call :chk explorerscompass.jar 174668 call :chk geckolib.jar 630584 call :chk lithostitched.jar 852541 call :chk lostcities.jar 1385359 call :chk moogs-lib.jar 336607 call :chk moogs-voyager.jar 1796857 call :chk pointblank.jar 17553459 call :chk repurposed.jar 8245469 call :chk terralith.jar 2814865 call :chk townsandtowers.jar 3597353 call :chk xaerominimap.jar 2185409 call :chk xaeroworldmap.jar 1418918 call :chk yung-dungeons.jar 782160 call :chk yung-mineshafts.jar 493967 call :chk yungs-api.jar 388678 call :chk yung-strongholds.jar 461244 rem === MANIFEST END === rem ВАЖНО: в call-строку нельзя подставлять !MC! - call разбирает строку rem второй раз, и восклицательный знак в имени пользователя съедается. rem Поэтому подпрограммам передаём путь ОТНОСИТЕЛЬНО !MC!. call :chkv "versions\!VER!\!VER!.json" call :chkv "versions\!VER!\!VER!.jar" call :chkv "versions\!VER!\TLauncherAdditional.json" set "LIBHAVE=0" for /f %%A in ('dir /s /b /a-d "!MC!\libraries" 2^>nul ^| find /c /v ""') do set "LIBHAVE=%%A" goto :eof rem ---- один мод: есть и нужного размера? ---- :chk set "OURS=!OURS!|%~1|" set "F=!MC!\mods\%~1" if not exist "!F!" ( set /a MMISS+=1 set "MISSLIST=!MISSLIST! %~1" goto :eof ) set "SZ=0" for %%A in ("!F!") do set "SZ=%%~zA" if "!SZ!"=="%~2" ( set /a MOK+=1 ) else ( set /a MBAD+=1 set "BADLIST=!BADLIST! %~1" ) goto :eof rem ---- файл версии: проверяем только наличие (json правит сам TLauncher) ---- :chkv if not exist "!MC!\%~1" set /a VMISS+=1 goto :eof :report_scan echo моды: !MOK! из !NEED! целых if !MMISS! GTR 0 echo не хватает:!MISSLIST! if !MBAD! GTR 0 echo битые: !BADLIST! echo библиотеки: !LIBHAVE! из !NEEDLIB! if !VMISS! GTR 0 echo файлы версии !VER!: не хватает !VMISS! goto :eof rem ---- чужие моды уезжают в mods_backup_*, наши остаются ---- :cleanforeign set "BK=" set "FCNT=0" set "FFAIL=0" set "FFLIST=" for /f "delims=" %%F in ('dir /b /a-d "!MC!\mods\*.jar" 2^>nul') do call :onejar "%%~nxF" if not defined BK goto :eof if !FCNT! GTR 0 ( echo Чужие моды - !FCNT! шт. - переложены в резервную папку: echo !BK! echo Они никуда не делись, но игру больше не ломают. ) else ( rmdir "!BK!" >nul 2>nul ) if "!FFAIL!"=="1" ( echo ВНИМАНИЕ: чужие моды убрать НЕ удалось - закрой игру и лаунчер echo и запусти установщик ещё раз, иначе игра может упасть: echo !FFLIST! ) goto :eof :onejar set "T=!OURS:|%~1|=!" if not "!T!"=="!OURS!" goto :eof if not defined BK ( set "BK=!MC!\mods_backup_!RANDOM!!RANDOM!" mkdir "!BK!" >nul 2>nul ) move /y "!MC!\mods\%~1" "!BK!\" >nul 2>nul if exist "!MC!\mods\%~1" ( set "FFAIL=1" set "FFLIST=!FFLIST! %~1" ) else ( set /a FCNT+=1 ) goto :eof rem ---- где взять архив ---- :getzip set "SRC=" set "KEEP=1" set "DLERR=" if "!SKIPLOCAL!"=="0" ( if defined MV_ZIP if exist "!MV_ZIP!" ( echo Использую указанный архив: !MV_ZIP! set "SRC=!MV_ZIP!" goto :eof ) if exist "!LOCAL!" ( echo Нашёл архив рядом с установщиком - использую его, качать не буду. set "SRC=!LOCAL!" goto :eof ) ) if exist "!CACHE!" ( tar -tf "!CACHE!" >nul 2>nul if not errorlevel 1 ( echo Нашёл уже скачанный архив с прошлого раза - использую его. set "SRC=!CACHE!" set "KEEP=0" goto :eof ) del "!CACHE!" >nul 2>nul ) call :download if exist "!CACHE!" ( set "SRC=!CACHE!" set "KEEP=0" ) goto :eof rem ---- выбросить негодный источник, чтобы вторая попытка взяла другой ---- :dropsrc if "!KEEP!"=="0" ( del "!CACHE!" >nul 2>nul ) else ( set "SKIPLOCAL=1" ) set "SRC=" goto :eof rem ---- скачивание ---- rem Ошибки НЕ прыгают на метки: из подпрограммы это сломало бы exit /b. rem Вместо этого выставляем DLERR и возвращаемся - решает главный поток. :download set "DLERR=" where curl.exe >nul 2>nul if errorlevel 1 set "DLERR=notools" where tar.exe >nul 2>nul if errorlevel 1 set "DLERR=notools" if defined DLERR goto :eof set "FREE=" for /f %%A in ('powershell -NoProfile -Command "[math]::Floor((Get-PSDrive $env:APPDATA.Substring(0,1)).Free/1MB)"') do set "FREE=%%A" if defined FREE if !FREE! LSS 1200 ( set "DLERR=nospace" goto :eof ) echo. echo [2/5] Качаю клиент, это ~384 МБ. Самая долгая часть, echo на медленном интернете может занять 10-30 минут. echo Если связь оборвётся - продолжу с того же места. echo. set /a TRIES=0 :dl set /a TRIES+=1 curl.exe -L --fail -C - --progress-bar -o "!CACHE!" "!URL!" if not errorlevel 1 goto :eof if !TRIES! GEQ 3 goto :eof echo. echo ...обрыв. Докачиваю - попытка !TRIES! из 3 timeout /t 3 >nul 2>nul goto :dl rem ---- настройки скинов ---- :checkskin set "CSLOK=0" if not exist "!MC!\CustomSkinLoader\CustomSkinLoader.json" goto :eof findstr /c:"!SKINURL!" "!MC!\CustomSkinLoader\CustomSkinLoader.json" >nul 2>nul if not errorlevel 1 set "CSLOK=1" goto :eof rem ---- пишем конфиг скинов сами: из-за него качать 380 МБ незачем ---- :writeskin if not exist "!MC!\CustomSkinLoader" mkdir "!MC!\CustomSkinLoader" >nul 2>nul set "CFG=!MC!\CustomSkinLoader\CustomSkinLoader.json" >"!CFG!" echo { >>"!CFG!" echo "version": "15.0.1", >>"!CFG!" echo "buildNumber": 40, >>"!CFG!" echo "loadlist": [ >>"!CFG!" echo { >>"!CFG!" echo "name": "Multiverse", >>"!CFG!" echo "type": "Legacy", >>"!CFG!" echo "checkPNG": false, >>"!CFG!" echo "skin": "!SKINURL!", >>"!CFG!" echo "model": "auto" >>"!CFG!" echo }, >>"!CFG!" echo { >>"!CFG!" echo "name": "GameProfile", >>"!CFG!" echo "type": "GameProfile" >>"!CFG!" echo }, >>"!CFG!" echo { >>"!CFG!" echo "name": "LocalSkin", >>"!CFG!" echo "type": "Legacy", >>"!CFG!" echo "checkPNG": false, >>"!CFG!" echo "skin": "LocalSkin/skins/{USERNAME}.png", >>"!CFG!" echo "model": "auto", >>"!CFG!" echo "cape": "LocalSkin/capes/{USERNAME}.png", >>"!CFG!" echo "elytra": "LocalSkin/elytras/{USERNAME}.png" >>"!CFG!" echo }, >>"!CFG!" echo { >>"!CFG!" echo "name": "Mojang", >>"!CFG!" echo "type": "MojangAPI", >>"!CFG!" echo "apiRoot": "https://api.mojang.com/", >>"!CFG!" echo "sessionRoot": "https://sessionserver.mojang.com/" >>"!CFG!" echo }, >>"!CFG!" echo { >>"!CFG!" echo "name": "OptiFine", >>"!CFG!" echo "type": "Legacy", >>"!CFG!" echo "checkPNG": false, >>"!CFG!" echo "model": "auto", >>"!CFG!" echo "cape": "https://optifine.net/capes/{USERNAME}.png" >>"!CFG!" echo } >>"!CFG!" echo ], >>"!CFG!" echo "enableTransparentSkin": true, >>"!CFG!" echo "forceLoadAllTextures": true, >>"!CFG!" echo "enableCape": true, >>"!CFG!" echo "threadPoolSize": 8, >>"!CFG!" echo "enableLogStdOut": false, >>"!CFG!" echo "cacheExpiry": 30, >>"!CFG!" echo "forceUpdateSkull": false, >>"!CFG!" echo "enableLocalProfileCache": false, >>"!CFG!" echo "enableCacheAutoClean": true, >>"!CFG!" echo "forceDisableCache": false >>"!CFG!" echo } goto :eof rem ---- копия модов и настроек скинов в отдельный игровой каталог ---- :fanout set "CAND=!MC!\%~1" if /i "!CAND!"=="!MC!" goto :eof if not exist "!CAND!\" goto :eof if not exist "!CAND!\mods\" mkdir "!CAND!\mods" >nul 2>nul if not exist "!CAND!\CustomSkinLoader\" mkdir "!CAND!\CustomSkinLoader" >nul 2>nul copy /y "!MC!\mods\*.jar" "!CAND!\mods\" >nul 2>nul copy /y "!MC!\CustomSkinLoader\*.json" "!CAND!\CustomSkinLoader\" >nul 2>nul set /a CN=0 for %%F in ("!CAND!\mods\*.jar") do set /a CN+=1 echo + !CAND! ^(jar: !CN!^) set /a EXTRA+=1 goto :eof