minecraft-basicmods/install.ps1
2025-09-19 17:23:17 +04:00

142 lines
6.3 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 | 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"