minecraft-basicmods/install.ps1
2025-09-19 19:56:47 +04:00

162 lines
11 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env pwsh
$ErrorActionPreference = "Stop"
# --- Определяем пути ---
$SCRIPT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$LOCALES_DIR = Join-Path $SCRIPT_DIR "install_locales"
$PRESETS_DIR = Join-Path $SCRIPT_DIR "presets"
# --- Функция для получения перевода из JSON ---
function T($key) {
$jsonFile = Join-Path $LOCALES_DIR "$LOCALE.json"
if (Test-Path $jsonFile) {
$value = (Get-Content $jsonFile -Raw -Encoding utf8 | ConvertFrom-Json)."$key"
if (-not $value) { return }
$cols = $Host.UI.RawUI.WindowSize.Width
$value -split "(.{1,$cols})(?:\s+|$)" | ForEach-Object { if ($_ -ne "") { $_ } }
}
}
# --- Получаем список доступных локалей ---
$LANGUAGES = Get-ChildItem -Path $LOCALES_DIR -Filter *.json | ForEach-Object {
$_.BaseName
}
# --- Проверка наличия локалей ---
if ($LANGUAGES.Count -eq 0) {
Write-Output "No locales found in $LOCALES_DIR"
exit 1
}
# --- Выбор языка ---
Write-Output "Choose a language:"
for ($i=0; $i -lt $LANGUAGES.Count; $i++) {
Write-Output ("{0}) {1}" -f ($i+1), $LANGUAGES[$i])
}
do {
$sel = Read-Host "> "
if ([int]::TryParse($sel, [ref]$null) -and $sel -ge 1 -and $sel -le $LANGUAGES.Count) {
$LOCALE = $LANGUAGES[$sel-1]
Write-Output "You selected: $LOCALE"
break
} else {
Write-Output "Invalid selection. Please choose a number from the list."
}
} while ($true)
Write-Host ""
Write-Host ""
T "INFO"
$install_dir = (Get-Location).Path
$game_version = "1.21.1"
$fabric_version = "0.17.2"
$now = Get-Date -Format "yyyy-MM-ddTHH:mm:sszzz"
$tmpfile = New-TemporaryFile
# --- выбор пресета настроек ---
Write-Host ""
Write-Host ""
T "SELECT_PRESET"
# --- Сканируем пресеты ---
$PRESETS = @()
$OPTIONS = @()
Get-ChildItem -Path $PRESETS_DIR -Directory | ForEach-Object {
$name = $_.BaseName
$descFile = Join-Path $_.FullName "preset_info.json"
if (Test-Path $descFile) {
$json = Get-Content $descFile -Raw -Encoding utf8 | ConvertFrom-Json
$description = $json.$LOCALE
if (-not $description) { $description = $json.en_US }
} else {
$description = "No description"
}
$cols = $Host.UI.RawUI.WindowSize.Width
$line = " $name$description"
$OPTIONS += $line -split "(.{1,$cols})(?:\s+|$)" | Where-Object { $_ -ne "" }
$PRESETS += $name
}
# --- Выбор пресета ---
for ($i=0; $i -lt $PRESETS.Count; $i++) {
Write-Output ("{0}) {1}" -f ($i+1), $OPTIONS[$i])
}
do {
$sel = Read-Host "> "
if ([int]::TryParse($sel, [ref]$null) -and $sel -ge 1 -and $sel -le $PRESETS.Count) {
$preset = $PRESETS[$sel-1]
break
} else {
Write-Output "Invalid selection. Choose a number from the list."
}
} while ($true)
# --- Копирование файлов ---
Copy-Item -Path (Join-Path $PRESETS_DIR "$preset/options.txt") -Destination (Join-Path $SCRIPT_DIR "options.txt") -Force
Copy-Item -Path (Join-Path $PRESETS_DIR "$preset/config/*") -Destination (Join-Path $SCRIPT_DIR "config/") -Recurse -Force
$locale_lower = $LOCALE.ToLower()
(Get-Content -Encoding utf8 (Join-Path $SCRIPT_DIR "options.txt")) -replace '^lang:.*', "lang:$locale_lower" | Set-Content (Join-Path $SCRIPT_DIR "options.txt")
T "PRESET_INSTALLED"
# --- ввод RAM с валидацией ---
Write-Host ""
Write-Host ""
T "SELECT_RAM"
do {
$ram = Read-Host "> "
if ($ram -match '^[0-9]+[GgMm]$') {
T "VALID_RAM"
break
} else {
T "INVALID_RAM"
}
} while ($true)
# --- Редактирование launcher_profiles.json ---
$minecraftDir = Join-Path $env:APPDATA ".minecraft"
$profileFile = Join-Path $minecraftDir "launcher_profiles.json"
$json = Get-Content $profileFile -Raw -Encoding utf8 | ConvertFrom-Json
$profileName = "basicmods-$game_version"
# Если profiles не существует, создаём пустую хэштаблицу
if (-not $json.profiles) { $json.profiles = @{} }
# Преобразуем в хэштаблицу, если это PSObject
$profiles = @{}
foreach ($prop in $json.profiles.PSObject.Properties) {
$profiles[$prop.Name] = $prop.Value
}
# Добавляем новый профиль
$profiles[$profileName] = @{
created = $now
gameDir = $install_dir
icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAANcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAtRXhpdjIiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDo3ODAxODgwOC0yY2E5LTQyMDItYmYwMy00Yjc0MTIxNmQ4NDAiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODQwYzk3MjEtZThiYi00YWFhLTkyNTAtMGY5NDFhNmFiMDU0IgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NzJhNDcxMjEtMzA0Ny00ZmVlLWFhYzktZTJmM2M4MTE5Y2U1IgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjMuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MTE4ODIwNTExNDIzIgogICBHSU1QOlZlcnNpb249IjMuMC40IgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjU6MDk6MTdUMTg6MTk6MjIrMDQ6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1OjA5OjE3VDE4OjE5OjIyKzA0OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzhmZDcxMTMtYTcxMi00ZWM3LWFhMWItYTFmZjBmN2U3NWJiIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHSU1QIDMuMC40IChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMTdUMTg6MjA6MjArMDQ6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+5hgy8gAAAAFzUkdCAdnJLH8AAAAEZ0FNQQAAsY8L/GEFAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAJcEhZcwAACxMAAAsTAQCanBgAAAPwSURBVFjD7ZZPbJRVFMV/902nLS2UlrYKbWc6JSAKCxNdYFhQqlsJiVEXEKLxTwwuCUuMRo3IQrewMaIBXXRlcKGJRiQsIEiMITYGhU47OKUw7fzptJ2Z7/veccEGgraFaV1xtvfe887LO/feBw9RB/zuWdXL4VaSvG6exYrrja/oDZZaZw8q7DUOyCOB2QmOPTBPw/0WvMrbcsBnu46Al4GDsybwnOD4fQuxpR98wIPs851HQYZiEYZRSDsURviYdGjssAnpC465ZRPwCm95gE/6jprFbj+rOTAJE8jMtyedy497vJcQdihzGI/Xlxx3dRlnL29osjenyUReueS0NFhUYeO0tKsgDeVVTOWlZ/OaSRVVTBWl54qa7p/Wzd4pTSRy2sfrfjFj3qXQnW61O5OEGJ0u8cjGGJ2pmAoZD5GjlIHimBHhKF01j4O2lKN8XXT0N9C9KU46V7jncu50qy1qwjuTHJ7Ah5w5/zebuzvUu7HZwChlIq1NxChkImtLxhzOmJkI8Xh+upCVIlnkhCeyf+NdchcIqPoaI8GIeua3u7ErAdfyZYa29xgS7QkDwcxkwIXRLN57JNkv0a/qIWFagscXEWBcCi5hOLsylWNzRxe1IOT7c2l2PN7L2MSsalFoYRgxG85z2V9mm9uqkMAyXMPQg+8CAI8n/+R7VLd/RJEyl/Jpzjz2AqubGrl8bYpVq8xulIt8O/ejRn0ah/G7H6HwxIdkUx8gvK9LgBHR1Ozo7HKMPfMm57fsl49H/DmfoRLWdCr7Hdd9FkP2R/IghjGeepd4Y4MfSLYi5O7rCe7sgNumMRLrm7k6VmXNakdyfSv9/S26EBywuT8+NU9NWTJ2a+BjTCiTese6O5utvTVuclqA9z8E3OtUITnaVjewriNOqRyaRaJjXSOjWw8SHzlok33va+tAu11Jl61rbSPeR4zfCOnZ0AR4LdQBi5owxLg5VeHRria8l781VXWxuJHY0KD+vkb7uXyE7o5mm7xVZVNfK8XZgOlioK62Jpuaqixpzi/iAU+pHFELxfjNits00EIUiIlczSJ51qxpIPSemdkqkUGhFNDZ1mhSRL4cEOGtLgHDnLSrv+3gr7FZeroaKeQDJnMVre+KUyiEICjNhYQSpZkqiQ0tzMzVyOYqlNNDDPO1Lcs2fJn9As/TOy/KzFl5LmLblhZ+OJcj2dtKoVBlPvIElYhielAixjAn3bKu49tC9sphemrwolUCT3kmpBpBqVylND6EwxjmlC3rf0C7K7LTzXflvcQ+L7y1p85SSA9iwDBf3ZWjPXPevmlx1AM9P7fgLH2RvQvGtaeycj/i/5vnIR5ixfAP5P8t5wY5ZUAAAAAASUVORK5CYII="
javaArgs = "-Xmx$ram -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M"
lastUsed = $now
lastVersionId = "fabric-loader-$fabric_version-$game_version"
name = $profileName
type = "custom"
}
# Присваиваем обратно в JSON
$json.profiles = $profiles
# Сохраняем обратно в файл
$jsonString = $json | ConvertTo-Json -Depth 100
# Создаём UTF8 без BOM
$utf8NoBOM = New-Object System.Text.UTF8Encoding($false)
# Пишем файл
[System.IO.File]::WriteAllText($tmpFile, $jsonString, $utf8NoBOM)
Move-Item $tmpfile $profileFile -Force
Write-Host ""
Write-Host ""
T "DONE"