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"
 |