diff --git a/install.ps1 b/install.ps1 index 264447e..290d8ec 100644 --- a/install.ps1 +++ b/install.ps1 @@ -1,162 +1,162 @@ -#!/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 "" +#!/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 + $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" \ No newline at end of file