เชธเช‚เชชเซ‚เชฐเซเชฃ Minecraft เชธเชฐเซเชตเชฐ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเซเช•เซเชฐเชฟเชชเซเชŸ

เชธเช‚เชชเซ‚เชฐเซเชฃ Minecraft เชธเชฐเซเชตเชฐ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเซเช•เซเชฐเชฟเชชเซเชŸ

เชฒเซ‡เช–เช•เชจเซ‡ เช† เชฐเชฎเชค เช–เซ‚เชฌ เชœ เช—เชฎเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เชชเซ‹เชคเซ‡ เชเช• เชจเชพเชจเช•เชกเชพ เชธเชฐเซเชตเชฐเชจเซ‹ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เช›เซ‡ โ€œเช•เซ‡เชตเชณ เชฎเชฟเชคเซเชฐเซ‹ เชฎเชพเชŸเซ‡โ€. เชเชฎเซ‡เชšเซเชฏเซ‹เชฐเซเชธเชฎเชพเช‚ เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เชธเชฐเซเชตเชฐ เชชเชฐเชจเซ€ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เชธเซเชงเชพเชฐเซ‡เชฒ เช›เซ‡, เช…เชจเซ‡ เช† เช…เชธเซเชฅเชฟเชฐเชคเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช•เซเชฐเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชชเชพเชตเชฐเชถเซ‡เชฒเชจเชพ เชฒเซ‡เช–เช• เชคเซ‡เชจเซ€ เชถเซ‡เชฐเซ€ เชชเชฐเชจเชพ เชธเซเชŸเซ‹เชฐเซเชธเชจเชพ เชธเซเชฅเชพเชจ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชœเชพเชฃเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡เชฃเซ‡ "Minecraft 2020 เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชธเซเช•เซเชฐเชฟเชชเซเชŸ" เชฎเชพเช‚ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชฎเชพเชŸเซ‡เชจเชพ เช†เชงเชพเชฐ เชคเชฐเซ€เช•เซ‡ เชธเชฎเชพเชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเซ‡เชตเชพ เช†เชชเซ€ เชนเชคเซ€ Ruvds เชฎเชพเชฐเซเช•เซ‡เชŸเชชเซเชฒเซ‡เชธ. เชชเชฐเช‚เชคเซ เชฌเชงเชพ เชธเซเชคเซเชฐเซ‹เชคเซ‹ เชฒเซ‡เช–เชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช›เซ‡. เชนเชตเซ‡, เช•เซเชฐเชฎเชฎเชพเช‚, เชคเซ‡ เชฌเชงเซเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚.

เช†เชฆเซ‡เชถเซ‹ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเช เช›เซ‡

เชตเซˆเช•เชฒเซเชชเชฟเช• เชฒเซ‹เช—เซ€เช‚เช—

เชเช• เชฆเชฟเชตเชธ, เชฅเซ‹เชกเชพ เชตเชงเซ เชฎเซ‹เชกเซเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชถเซ‹เชงเซเชฏเซเช‚ เช•เซ‡ เชธเชฐเซเชตเชฐ, เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เชฏเซเชฆเซเชงเชจเซ€ เช˜เซ‹เชทเชฃเชพ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช•เซเชฐเซ‡เชถ เชฅเชˆ เชฐเชนเซเชฏเซเช‚ เชนเชคเซเช‚. เชธเชฐเซเชตเชฐเซ‡ latest.log เช…เชฅเชตเชพ เชกเซ€เชฌเช—เชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เชฒเช–เซ€ เชจ เชนเชคเซ€, เช…เชจเซ‡ เช•เชจเซเชธเซ‹เชฒ, เชœเซ‡ เชธเชฟเชฆเซเชงเชพเช‚เชคเชฎเชพเช‚ เช† เชญเซ‚เชฒ เชฒเช–เซ€ เช…เชจเซ‡ เชฌเช‚เชง เชฅเชตเซ€ เชœเซ‹เชˆเช เชคเซ‡ เชฌเช‚เชง เชฅเชˆ เช—เชฏเซเช‚ เชนเชคเซเช‚.

เชœเซ‹ เชคเซ‡ เชฒเช–เชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ cmdlet เชธเชพเชฅเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒ เช›เซ‡ เชŸเซ€-เช“เชฌเซเชœเซ‡เช•เซเชŸ, เชœเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชเช• เชœ เชธเชฎเชฏเซ‡ เชซเชพเช‡เชฒ เช…เชจเซ‡ เช•เชจเซเชธเซ‹เชฒ เชชเชฐ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

.handler.ps1 | Tee-Object .StandardOutput.txt -Append

เช† เชฐเซ€เชคเซ‡, เชชเชพเชตเชฐเชถเซ‡เชฒ เชธเซเชŸเชพเชจเซเชกเชฐเซเชกเช†เช‰เชŸเชชเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฒเช–เชถเซ‡. เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚ เชชเซเชฐเชพเชฐเช‚เชญ-เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ StandardOutput เชจเซ‡ เชฌเชฆเชฒเซ‡ System.ComponentModel.Component เชชเชฐเชค เช•เชฐเชถเซ‡, เช…เชจเซ‡ -RedirectStandardOutput เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถเชตเชพเชจเซเช‚ เช…เชถเช•เซเชฏ เชฌเชจเชพเชตเชถเซ‡, เชœเซ‡ เช†เชชเชฃเซ‡ เชŸเชพเชณเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช.

เชฆเชฒเซ€เชฒเซ‹ เชถเชฐเซ‚ เช•เชฐเซ‹

เชฎเซ‹เชกเซเชธเชจเซ€ เชคเซ‡ เชœ เชœเซ‹เชกเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฒเซ‡เช–เช•เซ‡ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช•เซ‡ เชธเชฐเซเชตเชฐ เชชเชพเชธเซ‡ เชชเชฃ เชชเซ‚เชฐเชคเซ€ RAM เชจเชฅเซ€. เช…เชจเซ‡ เช† เชฎเชพเชŸเซ‡ เชฒเซ‹เช‚เชšเชจเซ€ เชฆเชฒเซ€เชฒเซ‹ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฆเชฐเซ‡เช• เชตเช–เชคเซ‡ เชคเซ‡เชจเซ‡ start.bat เชฎเชพเช‚ เชฌเชฆเชฒเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชœเซ‡เชจเซ‹ เชฆเชฐเซ‡เช• เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชซเช•เซเชค เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹.

เชœเซเชฏเชพเชฐเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒเชจเซ‡ "เชœเชธเซเชŸ เชฒเชพเช‡เช• เชงเซ€เชธ" เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชŸเซ€-เช“เชฌเซเชœเซ‡เช•เซเชŸ เชฎเชพเชคเซเชฐ เชธเซเชŸเชพเชจเซเชกเชฐเซเชกเช†เช‰เชŸเชชเซเชŸ เชตเชพเช‚เชšเซ‡ เช›เซ‡, เชคเชฎเชพเชฐเซ‡ เชฌเซ€เชœเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฌเชจเชพเชตเชตเซ€ เชชเชกเชถเซ‡. เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸ Minecraft เชฆเซเชตเชพเชฐเชพ เชœ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชšเชพเชฒเซ‹ เชฆเชฒเซ€เชฒเซ‹เชฅเซ€ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€เช.

เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เช…เช‚เชคเชฟเชฎ เช†เชณเชธเชฎเชพเช‚ เชตเซเชฏเชธเซเชค เชฐเชนเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‡ เชซเซเชฒเชพเชฏ เชชเชฐ เชฒเซ‹เชจเซเชš เชฆเชฒเซ€เชฒเซ‹ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชถเซ‹เชงเซ€เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช เชฌเชจเชพเชตเชŸ.

$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1

เชธเซ‰เชฐเซเชŸ-เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช…เชฎเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชธเซŒเชฅเซ€ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพ เชธเชพเชฅเซ‡ เชฒเชˆเชถเซเช‚, เชชเช›เซ€ เชญเชฒเซ‡ เชคเชฎเซ‡ เชคเซ‡เชฎเชพเช‚เชจเชพ เช•เซ‡เชŸเชฒเชพ เชฎเซ‚เช•เซ‹. เช…เช‚เชคเชฟเชฎ เช†เชณเชธ.

เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เชธเชฐเซเชตเชฐเชจเซ‡ เชฎเซ‡เชฎเชฐเซ€ เชธเซ‹เช‚เชชเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเชฟเชธเซเชŸเชฎ เชฎเซ‡เชฎเชฐเซ€เชจเซ‹ เชœเชฅเซเชฅเซ‹ เชฒเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชฐเช•เชฎ เชถเชฌเซเชฆเชฎเชพเชณเชพเชฎเชพเช‚ เชฒเช–เซ‹.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

เช†เชชเซ‹เช†เชช เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‹

เชฒเซ‡เช–เช•เซ‡ เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชจเซ€ .bat เชซเชพเชˆเชฒเซ‹ เชœเซ‹เชˆ เช›เซ‡, เชชเชฐเช‚เชคเซ เชธเชฐเซเชตเชฐ เช•เซ‡เชฎ เชฌเช‚เชง เชฅเชฏเซเช‚ เชคเซ‡ เช•เชพเชฐเชฃเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเซเช‚ เชจเชฅเซ€. เช† เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เช›เซ‡, เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชฎเซ‹เชก เชซเชพเช‡เชฒ เชฌเชฆเชฒเชตเชพเชจเซ€ เช…เชฅเชตเชพ เช•เช‚เชˆเช• เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชถเซเช‚?
เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชฏเซ‹เช—เซเชฏ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช. เชฒเซ‡เช–เช•เชจเซ‡ เช…เช—เชพเช‰ เชตเชฟเชšเชฟเชคเซเชฐ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชฎเชณเซ€ เช•เซ‡ เชœเซ‡เชฃเซ‡ เชธเชฐเซเชตเชฐ เชถเชพ เชฎเชพเชŸเซ‡ เชฌเช‚เชง เช•เชฐเซเชฏเซเช‚ เชคเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ เชธเชฐเซเชตเชฐเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚. เช…เชฎเซ‡ เชเช•เซเชเชฟเชŸเช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚. Java เชธเชซเชณเชคเชพ เชคเชฐเซ€เช•เซ‡ 0 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช…เชนเซ€เช‚เชฅเซ€ เชกเชพเชจเซเชธ เช•เชฐเซ€เชถเซเช‚.

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชเช• เชซเช‚เช•เซเชถเชจ เชฌเชจเชพเชตเซ€เช เชœเซ‡ เชธเชฐเซเชตเชฐ เชจเชฟเชทเซเชซเชณ เชœเชพเชฏ เชคเซ‹ เชคเซ‡เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชถเซ‡.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชธเชฐเซเชตเชฐ /stop เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚เชฅเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฌเช‚เชง เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเซ‚เชชเชฎเชพเช‚ เชฐเชนเซ‡เชถเซ‡.

เชœเซ‹ เช†เชชเชฃเซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซ€เช, เชคเซ‹ เชถเชฐเซ‚เช†เชคเชจเซ€ เชคเชพเชฐเซ€เช–, เชธเชฎเชพเชชเซเชคเชฟเชจเซ€ เชคเชพเชฐเซ€เช– เช…เชจเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชชเชฃ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเซเช‚ เชธเชฐเชธ เชฐเชนเซ‡เชถเซ‡.

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช†เชชเชฃเซ‡ เชธเซเชŸเชพเชฐเซเชŸ-เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชฒเช–เซ€เช เช›เซ€เช. เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

$global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

เช…เชจเซ‡ เชชเช›เซ€ เช…เชฎเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฒเช–เซ€เช เช›เซ€เช. เช† เชคเซ‡ เช›เซ‡ เชœเซ‡ เช…เชฎเชจเซ‡ เชšเชฒเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

$global:Process.StartTime
$global:Process.ExitCode	
$global:Process.ExitTime

เช† เชฌเชงเซเช‚ เชเชก-เช•เชจเซเชŸเซ‡เชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชจเซ‡ เชฅเซ‹เชกเซเช‚ เช•เซ‹เชฎเซเชฌเซ‡เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชจเซ‡ เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฎเชณเซ‡ เช›เซ‡, เช…เชจเซ‡ เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ handler.ps1 เช•เชนเซ€เช.

Add-Content -Value "Start time:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Exit code:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Exit time:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฌเชจเชพเชตเซ€เช เชœเซ‡ เชนเซ‡เชจเซเชกเชฒเชฐ เชฒเซ‹เชจเซเชš เช•เชฐเซ‡ เช›เซ‡.

เชธเชพเชšเซ‹ เชธเซเชŸเชพเชฐเซเชŸเช…เชช

เชฒเซ‡เช–เช• เชเช• เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ เชชเชพเชฅเชฎเชพเช‚เชฅเซ€ Minecraft เชจเชพ เชตเชฟเชตเชฟเชง เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡, เช…เชจเซ‡ เชšเซ‹เช•เซเช•เชธ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เชฒเซ‰เช—เซเชธ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชชเชฃ เชธเช•เซเชทเชฎ เชฅเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡.

เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชฒเซ‰เช— เช‡เชจ เชฅเชฏเซ‡เชฒเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เชฅเชตเซ€ เชœเซ‹เชˆเช. เช† เชกเซ‡เชธเซเช•เชŸเซ‹เชช เช…เชฅเชตเชพ WinRm เชฆเซเชตเชพเชฐเชพ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เชธเชฐเซเชตเชฐ เชธเชฟเชธเซเชŸเชฎ เชฏเซเชเชฐ เชคเชฐเซ€เช•เซ‡ เช…เชฅเชตเชพ เชคเซ‹ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชพเชตเซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เชฒเซ‹เช— เชˆเชจ เชจเชฅเซ€ เช•เชฐเชคเชพ, เชคเซ‹ Server.jar eula.txt เชตเชพเช‚เชšเซ€ เช…เชจเซ‡ เชถเชฐเซ‚ เชชเชฃ เช•เชฐเซ€ เชถเช•เชถเซ‡ เชจเชนเซ€เช‚.

เช…เชฎเซ‡ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชคเซเชฐเชฃ เชเชจเซเชŸเซเชฐเซ€ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เชฒเซ‰เช—เชฟเชจเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

เชคเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชจเชฅเซ€. เชฒเซ‰เช—เชฟเชจ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เช…เชนเซ€เช‚ เชธเชพเชฆเชพ เชฒเช–เชพเชฃเชฎเชพเช‚ เชฆเชฐเซเชถเชพเชตเซ‡เชฒ เช›เซ‡, เชคเซ‡เชฅเซ€ เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชเช• เช…เชฒเช— เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชจเซ€ เชชเชพเชธเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเซเชคเชฐเซ‡ เชเช•เซเชธเซ‡เชธ เชนเซ‹เชฏ, เช…เชฅเชตเชพ เชคเซ‡เชจเชพเชฅเซ€ เชชเชฃ เชตเชงเซ เชธเชพเช‚เช•เชกเชพ เชœเซ‚เชฅเชฎเชพเช‚. เช† เชฎเชพเชŸเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชธเช–เชค เชญเชฒเชพเชฎเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€.

เช…เชฎเซ‡ เช“เชŸเซ‹-เชฒเซ‹เช—เชฟเชจเชจเซ‡ เชธเซ‹เชฐเซเชŸ เช†เช‰เชŸ เช•เชฐเซเชฏเซเช‚. เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ เชเช• เชจเชตเซเช‚ เช•เชพเชฐเซเชฏ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช…เชฎเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชฎเชพเช‚เชฅเซ€ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซ€เชถเซเช‚, เชคเซ‡เชฅเซ€ เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชถเซ‡:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

เชฎเซ‹เชกเซเชฏเซเชฒ เชเชธเซ‡เชฎเซเชฌเชฒเซ€เช‚เช—

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€เช เชœเซ‡ เชชเช›เซ€เชฅเซ€ เชตเชพเชชเชฐเซ€ เชถเช•เชพเชฏ. เชคเซˆเชฏเชพเชฐ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฎเชพเชŸเซ‡เชจเชพ เชคเชฎเชพเชฎ เช•เซ‹เชก เช…เชนเซ€เช‚ เช›เซ‡, เช†เชฏเชพเชค เช•เชฐเซ‹ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹.

เชœเซ‹ เชคเชฎเซ‡ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชฅเซ€ เชชเชฐเซ‡เชถเชพเชจ เชจ เชฅเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹เชต เชคเซ‹ เชคเชฎเซ‡ เช‰เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‹ เช…เชฒเช—เชฅเซ€ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชธเซเชŸเชพเชฐเซเชŸ-Minecraft

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชเช• เชฎเซ‹เชกเซเชฏเซเชฒ เชฌเชจเชพเชตเซ€เช เชœเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพ เชธเชฟเชตเชพเชฏ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚ เชœเซ‡ เชฎเชพเชจเช• เช†เช‰เชŸเชชเซเชŸ เชธเชพเช‚เชญเชณเชถเซ‡ เช…เชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชถเซ‡.

เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚, เชคเซ‡ เชชเซ‚เช›เซ‡ เช›เซ‡ เช•เซ‡ เช•เชฏเชพ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚เชฅเซ€ เชฎเชพเช‡เชจเช•เซเชฐเชพเชซเซเชŸ เชฒเซ‹เช‚เชš เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชฒเซ‹เช— เช•เซเชฏเชพเช‚ เชฎเซ‚เช•เชตเซ‹.

Set-Location (Split-Path $MyInvocation.MyCommand.Path)
function Start-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $MinecraftPath
 
    )
    powershell.exe -file .handler.ps1 -type $type -MinecraftPath $MinecraftPath | Tee-Object $LogFile -Append
}
Export-ModuleMember -Function Start-Minecraft

เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เช† เชฐเซ€เชคเซ‡ Minecraft เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡:

Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ Handler.ps1 เชชเชฐ เช†เช—เชณ เชตเชงเซ€เช

เชœเซเชฏเชพเชฐเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเซเชตเซ€เช•เชพเชฐเซ€ เชถเช•เซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡, เช…เชฎเชพเชฐเซ‡ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชฌเซเชฒเซ‹เช•เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹, เชคเซ‡ Oracle Java เชšเชฒเชพเชตเซ‡ เช›เซ‡, เชœเซ‹ เชคเชฎเซ‡ เช•เซ‹เชˆ เช…เชฒเช— เชตเชฟเชคเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เชนเซ‹เชต เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเชจเซ‹ เชชเชพเชฅ เชฌเชฆเชฒเชตเซ‹ เชชเชกเชถเซ‡.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Starting godlike game server ============"
 
    $forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -first 1
 
    $ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
    $xmx = "-Xms" + $ram + "G"
    $global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
    
}
 
function Write-Log {
    Write-host "Start time:" $global:Process.StartTime
 
    Write-host "Exit code:" $global:Process.ExitCode
    
    Write-host "Exit time:" $global:Process.ExitTime
 
    Write-host "=============== Stopped godlike game server ============="
}
 
function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Restart-Minecraft
            Write-Log
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}
 
Get-MinecraftExitCode

เชจเซ‹เช‚เชงเชฃเซ€-Minecraft

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชตเซเชฏเชตเชนเชพเชฐเซ€เช• เชฐเซ€เชคเซ‡ Start-Minecraft เชœเซ‡เชตเซ€ เชœ เช›เซ‡, เชธเชฟเชตเชพเชฏ เช•เซ‡ เชคเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชจเชตเซเช‚ เช•เชพเชฐเซเชฏ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเซ‡ เช›เซ‡. เชธเชฎเชพเชจ เชฆเชฒเซ€เชฒเซ‹ เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพเชฎ, เชœเซ‹ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชจ เชนเซ‹เชฏ, เชคเซ‹ เชตเชฐเซเชคเชฎเชพเชจ เชเช• เชฒเซ‡ เช›เซ‡.

function Register-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]$Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$MinecraftPath,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$User,
 
        [Parameter(Mandatory)]
        [string]$TaskName = $env:USERNAME
    )
 
    $Trigger = New-ScheduledTaskTrigger -AtLogOn
    $arguments = "Start-Minecraft -Type $Type -LogFile $LogFile -MinecraftPath $MinecraftPath"
    $PS = New-ScheduledTaskAction -Execute "PowerShell" -Argument "-noexit -command $arguments"
    Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
    
}
 
Export-ModuleMember -Function Register-Minecraft

เชฐเชœเซ€เชธเซเชŸเชฐ-เช“เชŸเซ‹เชฒเซ‹เช—เซ‹เชจ

เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚, เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพเชฎ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‡ เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡. เชœเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพเชฎ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชจ เชนเซ‹เชฏ, เชคเซ‹ เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซเช‚ เชจเชพเชฎ เชตเชชเชฐเชพเชฏ เช›เซ‡.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Username for autologon")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="User password")]
        [ValidateNotNullOrEmpty()]
        $Password
    )
 
    $i = Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

Set-Autologon -Password "PlaintextPassword"

เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชฒเซ‡เช–เช• เชชเซ‹เชคเซ‡ เช† เชฌเชงเชพเชจเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. Windows เชชเชฐ เชธเชพเชฐเซเชตเชœเชจเชฟเช• Minecraft เชธเชฐเซเชตเชฐเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเชฎเชพเชตเชตเซเช‚. เชšเชพเชฒเซ‹ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชœ เชถเชฐเซ‚ เช•เชฐเซ€เช.

1. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹

$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword

2. เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹

เชคเชฎเซ‡ เช†เชจเชพ เชœเซ‡เชตเชพ เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"

เช…เชฅเชตเชพ เชฎเชพเชจเช• เชธเชพเชงเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. เช“เชŸเซ‹-เชฒเซ‹เช—เชฟเชจ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ เช…เชจเซ‡ เชฎเชถเซ€เชจ เชฐเซ€เชฌเซ‚เชŸ เช•เชฐเซ‹

Set-Autologon -Username "MinecraftServer" -Password "Qw3"

เชธเชฎเชพเชชเซเชคเชฟ

เชฒเซ‡เช–เช•เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเซ‹เชคเชพเชจเชพ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเซ€ เช›เซ‡, เชคเซ‡เชฅเซ€, เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเชพ เชธเซ‚เชšเชจเซ‹ เชธเชพเช‚เชญเชณเซ€เชจเซ‡ เชคเซ‡ เช–เซเชถ เชฅเชถเซ‡. เชฒเซ‡เช–เช• เช†เชถเชพ เชฐเชพเช–เซ‡ เช›เซ‡ เช•เซ‡ เช† เชคเชฎเชพเชฎ เช•เซ‹เชก เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เช‰เชชเชฏเซ‹เช—เซ€ เชนเชคเชพ, เช…เชจเซ‡ เชฒเซ‡เช– เชฐเชธเชชเซเชฐเชฆ เชนเชคเซ‹.

เชธเช‚เชชเซ‚เชฐเซเชฃ Minecraft เชธเชฐเซเชตเชฐ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเซเช•เซเชฐเชฟเชชเซเชŸ

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹