142 lines
6.3 KiB
PowerShell
142 lines
6.3 KiB
PowerShell
#!/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 | 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 | 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 (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 | ConvertFrom-Json
|
||
$profileName = "basicmods-$game_version"
|
||
$json.profiles.$profileName = @{
|
||
created = $now
|
||
gameDir = $install_dir
|
||
icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAANcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAtRXhpdjIiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDo3ODAxODgwOC0yY2E5LTQyMDItYmYwMy00Yjc0MTIxNmQ4NDAiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODQwYzk3MjEtZThiYi00YWFhLTkyNTAtMGY5NDFhNmFiMDU0IgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NzJhNDcxMjEtMzA0Ny00ZmVlLWFhYzktZTJmM2M4MTE5Y2U1IgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjMuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MTE4ODIwNTExNDIzIgogICBHSU1QOlZlcnNpb249IjMuMC40IgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjU6MDk6MTdUMTg6MTk6MjIrMDQ6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1OjA5OjE3VDE4OjE5OjIyKzA0OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzhmZDcxMTMtYTcxMi00ZWM3LWFhMWItYTFmZjBmN2U3NWJiIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHSU1QIDMuMC40IChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMTdUMTg6MjA6MjArMDQ6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K"
|
||
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 | ConvertTo-Json -Depth 100 | Set-Content $tmpfile
|
||
Move-Item $tmpfile $profileFile -Force
|
||
|
||
Write-Host ""
|
||
Write-Host ""
|
||
T "DONE"
|