Скрипти беҳтарин барои оғози сервери Майнкрафт

Скрипти беҳтарин барои оғози сервери Майнкрафт

Муаллиф бозиро хеле дӯст медорад ва худи ӯ маъмури сервери хурди "танҳо барои дӯстон" мебошад. Тавре ки маъмулан дар байни ҳаводорон аст, ҳама чиз дар сервер моддӣ аст, ва ин боиси ноустувории ва, дар натиҷа, садамаҳо. Азбаски муаллифи Powershell аз ҷойгиршавии мағозаҳо дар кӯчаи худ беҳтар медонад, ӯ тасмим гирифт, ки "Беҳтарин скрипт барои оғози Minecraft 2020" Ҳамон скрипт ҳамчун асос барои қолаб дар Бозори Ruvds. Аммо ҳамаи манбаъҳо аллакай дар мақола ҳастанд. Акнун, ба тартиб, ҳамааш чӣ гуна анҷом дода шуд.

Фармонҳое, ки ба мо лозиманд

Сабти алтернативӣ

Як рӯз, пас аз насб кардани якчанд модули дигар, ман фаҳмидам, ки сервер, аз афташ, бидуни эълони ҷанг шикаст мехӯрад. Сервер дар latest.log ё дар debug хато нанавишт ва консоле, ки дар назария бояд ин хаторо навишт ва қатъ мешуд, баста шуд.

Агар ӯ нахоҳад нависад, ба ӯ лозим нест. Мо Powershell бо cmdlet дорем Ти-объект, ки объектро гирифта, дар як вақт ба файл ва ба консол мебарорад.

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

Ҳамин тавр, Powershell StandardOutput -ро гирифта, ба файл менависад. Кӯшиш накунед, ки истифода баред Оғоз - Равандзеро он ба ҷои StandardOutput System.ComponentModel.Component-ро бармегардонад ва -RedirectStandardOutput ворид шудан ба консолро ғайриимкон месозад, ки мо мехоҳем аз он канорагирӣ кунем.

Аргументҳоро оғоз кунед

Пас аз насб кардани ҳамон ҷуфт модулҳо, муаллиф пай бурд, ки сервер низ RAM кофӣ надорад. Ва ин тағир додани далелҳои оғозро талаб мекунад. Ба ҷои иваз кардани онҳо ҳар дафъа дар start.bat, ки ҳама аз он истифода мебаранд, танҳо ин скриптро истифода баред.

Азбаски Tee-Object танҳо StandardOutput-ро мехонад, вақте ки файли иҷрошаванда "Ҳамин тавр" ном дорад, шумо бояд скрипти дигар созед. Ин скриптро худи Minecraft оғоз мекунад. Биёед бо далелҳо оғоз кунем.

Барои он ки дар оянда ба танбалии ниҳоӣ роҳ ёбад, скрипт бояд далелҳои оғозёбиро дар парвоз ҷамъ кунад. Барои ин, биёед аз ҷустуҷӯи версияи охирин оғоз кунем Пора додан.

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

Бо истифода аз sort-object, мо ҳамеша объекти дорои адади калонтаринро мегирем, новобаста аз он ки шумо чандтои онҳоро дар он ҷо гузоштаед. Танбалии ниҳоӣ.

Акнун шумо бояд хотираро ба сервер таъин кунед. Барои ин миқдори хотираи системаро гирифта, миқдори онро дар сатр нависед.

$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 маъмулан аз консоли худ хомӯш шавад, дар ҳалқа боқӣ мемонад.

Агар мо тасмим гирем, ки ҳама чизро автоматӣ кунем, он гоҳ хуб мебуд, ки санаи оғоз, санаи анҷомёбӣ ва инчунин сабаби анҷомро ҷамъоварӣ кунем.

Барои ин мо натиҷаи Start-Process-ро ба тағирёбанда менависем. Дар скрипт чунин менамояд:

$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

Ҳамаи инро бо истифода аз Add-Content ба файл илова кардан мумкин аст. Онро каме шона карда, мо ин скриптро мегирем ва биёед онро 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

Ин бехатар нест. Логин ва парол дар ин ҷо бо матни оддӣ нишон дода шудаанд, аз ин рӯ барои оғоз кардани сервер шумо бояд корбари алоҳидаеро эҷод кунед, ки дар сатҳи корбар ё дар гурӯҳи боз ҳам тангтар дастрасӣ дорад. Барои ин истифодаи маъмури стандартӣ қатъиян тавсия дода намешавад.

Мо воридшавии автоматиро тартиб додем. Акнун шумо бояд вазифаи навро барои сервер сабт кунед. Мо фармонро аз Powershell иҷро мекунем, аз ин рӯ он чунин хоҳад буд:

$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

Бақайдгирӣ - Майнкрафт

Скрипт амалан бо 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. Биёед аз ибтидо оғоз кунем.

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"

Натиҷа

Муаллиф сценарияро, аз ҷумла барои худаш таҳия кардааст, аз ин рӯ, ӯ бо хушнудӣ пешниҳодҳои шуморо оид ба такмили сценарий гӯш мекунад. Муаллиф умедвор аст, ки ҳамаи ин рамз барои шумо ҳадди аққал муфид буд ва мақола ҷолиб буд.

Скрипти беҳтарин барои оғози сервери Майнкрафт

Манбаъ: will.com

Илова Эзоҳ