Skip to content

Instantly share code, notes, and snippets.

@SoyRA
Created August 13, 2021 18:20
Show Gist options
  • Save SoyRA/e716719fc297134105dad23beb715114 to your computer and use it in GitHub Desktop.
Save SoyRA/e716719fc297134105dad23beb715114 to your computer and use it in GitHub Desktop.
Todo sobre los .bat, .ps1 y .sh que he hecho para el Minecraft: Java Edition

MultiMC

  • Todo sobre los .bat, .ps1 y .sh que he hecho para el Minecraft: Java Edition.
  • Estos scripts te permiten convertir tu juego en portable, elegir en que lugar quieres que se instalen, tener la cantidad de .minecraft que quieras, etc.
    • El uso que yo le doy es, ni más ni menos, tener varios .minecraft para no arriesgarme a que algún mod rompa todo. :P

Aviso

  • Esto funciona para cualquier lanzador, no solo para SKlauncher.
  • Lo ideal es usar la Opción A, pero si el lanzador no lo soporta tendrías que usar la Opción B.
  • Todo está pensado como si has descargado el SKlauncher Universal (.jar), que le has cambiado al nombre a SKlauncher.jar y que tienes solamente Liberica Full JDK 8 instalado (con todas las opciones).

Directorio de Trabajo

:: .bat
@SETLOCAL ENABLEEXTENSIONS
@CD /D "%~dp0" || PAUSE && EXIT /B
# .ps1
$DIR = Split-Path -Parent $MyInvocation.MyCommand.Definition
cd "$DIR"; if (-not $?) {Pause; Exit}
# .sh
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd "$DIR" || { pause; exit; }
  • El Directorio de Trabajo al iniciar el archivo siempre será donde se encuentra el mismo.
    • Iniciar el archivo desde otro lugar (o incluso iniciarlo como administrador / root) no hará que cambie.

Opción A

Windows

  • --workDir "." : Se utiliza el directorio actual.
  • --workDir "Ejemplo\Carpeta" : Esta carpeta se encuentra en el directorio actual (ruta relativa).
    • Funciona pero el juego no puede iniciar, cabe destacar que la ruta es relativa al Lanzador y no al Directorio de Trabajo.
  • --workDir "C:\Juegos\Minecraft" : Ruta absoluta.
    • Se puede usar %CD% / $DIR como verás en el .bat / .ps1

Linux y macOS

  • --workDir "." : Se utiliza el directorio actual.
  • --workDir "Ejemplo/Carpeta" : Esta carpeta se encuentra en el directorio actual (ruta relativa).
    • Funciona pero el juego no puede iniciar, cabe destacar que la ruta es relativa al Lanzador y no al Directorio de Trabajo.
  • --workDir "/home/TuNombre/Juegos/Minecraft" : Ruta absoluta.
    • Se puede usar $DIR como verás en el .sh

Opción B

:: .bat
:: Se puede agregar \Ejemplo\Carpeta
SET APPDATA=%CD%

:: Crea la ruta absoluta si fuera necesario
:: 2>NUL es para que no diga nada
MKDIR "%APPDATA%" 2>NUL
# .ps1
# Se puede agregar \Ejemplo\Carpeta
$Env:APPDATA = "$DIR"

# Crea la ruta absoluta si fuera necesario
# $null es para que no diga nada
$null = New-Item -Path "$Env:APPDATA" -ItemType Directory -Force
# .sh
# Se puede agregar /Ejemplo/Carpeta
AppData="$DIR"

# Crea la ruta absoluta si fuera necesario
mkdir -p "$AppData"

# El equivalente al %APPDATA% en Windows
java -Duser.home="$AppData" -jar
  • El Lanzador utiliza la variable del sistema %APPDATA% (en el caso de Windows), entonces aquí lo que se hace es cambiar el valor de dicha variable usando una ruta absoluta (por eso %CD% / $DIR que representan el Directorio de Trabajo).

Java

Windows

:: .bat
:: Opción 1 : No especificas cual Java usar
SKlauncher.jar --workDir "%CD%"

:: Opción 2 : Utilizas el Java que tu quieras
:: javaw.exe no dice nada mientras que java.exe te mostrará mucho texto
"%JAVA_HOME%bin\javaw.exe" -jar SKlauncher.jar --workDir "%CD%"
# .ps1
# Opción 1 : No especificas cual Java usar
Start-Process -FilePath ".\SKlauncher.jar" -ArgumentList "--workDir `"$DIR`"" -Wait

# Opción 2 : Utilizas el Java que tu quieras
# javaw.exe no dice nada mientras que java.exe te mostrará mucho texto
Start-Process -FilePath "$($Env:JAVA_HOME)bin\javaw.exe" -ArgumentList "-jar .\SKlauncher.jar --workDir `"$DIR`"" -NoNewWindow -Wait

Linux y macOS

# .sh
# Opción 1 : No especificas cual Java usar
java -jar SKlauncher.jar --workDir "$DIR"

# Opción 2 : Utilizas el Java que tu quieras
# Linux https://askubuntu.com/a/772236
# macOS https://stackoverflow.com/a/15826712
"/usr/lib/jvm/bellsoft-java8-full-amd64/bin/java" -jar SKlauncher.jar --workDir "$DIR"

Créditos

  • ShellCheck : Además de verificar que todo esté bien, me dio sugerencias que pude implementar en el .bat y .ps1 (como usar cd "Ejemplo/" || exit, cosa que si cd falla se cierra todo).
  • Directorio de Trabajo en Linux y macOS : Aunque lo he modificado un poco, estas dos partes salen de ahí.
# Directorio de Trabajo
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd "$DIR" || { pause; exit; }

# Iniciar Java con esto
-Duser.home="$DIR"

Otros detalles

  • La idea es que sea fácil de editar, que el usuario solo tenga que copiar "2 líneas" y ya (nada de analizar como loco para agregar otro "Minecraft" a la lista).
  • La razón de usar function Pause {...} en vez de Pause en el .ps1 es para que sea compatible con Windows PowerShell 2.0 y para que sea como en los otros archivos: pulsar cualquier tecla en vez de solamente enter.
    • No funciona en el Windows PowerShell ISE y en el caso de los .sh es para que, en caso de iniciar sin Terminal, puedan ver la causa de que se detenga todo.
  • tput reset va perfecto para Linux mientras que printf '\e[3J' va perfecto para macOS.
  • El SKlauncher.desktop es como un acceso directo en Linux, te tocará editarlo porque las rutas son absolutas.
    • Si quieres que ejecute el .jar en vez del .sh, tendrías que usar algo como esto:
      PD: No estoy seguro como se crea un acceso directo (que puedas cambiarle el icono y esas cosas) en macOS.
[Desktop Entry]
Exec=java -jar SKlauncher.jar --workDir "/home/TuNombre/.minecraft/Cliente/Minecraft"
Path=/home/TuNombre/.minecraft
Terminal=false
@ECHO OFF
TITLE Minecraft: Java Edition
:: -------------------- Directorio de Trabajo ---------------------
@SETLOCAL ENABLEEXTENSIONS
@CD /D "%~dp0" || PAUSE && EXIT /B
:: ------------------------ Menú Principal ------------------------
:MainMenu
CLS
ECHO.
ECHO ////////////////////////////////////////////////////////////////
ECHO //// Minecraft: Java Edition ////
ECHO ////////////////////////////////////////////////////////////////
ECHO.
ECHO [ 0 ] MultiMC-Server.bat
ECHO [ 1 ] Minecraft
ECHO [ 2 ] TestCraft
ECHO.
SET /P SEL=Iniciar la Opcion
IF NOT %SEL%=="" SET SEL=%SEL:~0,1%
IF %SEL%==0 GOTO Opt0
IF %SEL%==1 GOTO Opt1
IF %SEL%==2 GOTO Opt2
GOTO MainMenu
:: --------------------------- Opción 0 ---------------------------
:Opt0
CMD /C MultiMC-Server.bat
EXIT /B
:: --------------------------- Opción 1 ---------------------------
:Opt1
CLS
ECHO.
ECHO # Minecraft
ECHO - El juego se esta iniciando (no cierres esta ventana).
ECHO.
ECHO.
SKlauncher.jar --workDir "%CD%\Cliente\Minecraft"
ECHO.
ECHO.
ECHO # Aviso
ECHO - El juego se ha detenido (ya puedes cerrar esta ventana).
ECHO.
PAUSE
EXIT /B
:: --------------------------- Opción 2 ---------------------------
:Opt2
CLS
ECHO.
ECHO # TestCraft
ECHO - El juego se esta iniciando (no cierres esta ventana).
ECHO.
ECHO.
SET APPDATA=%CD%\Cliente\TestCraft
MKDIR "%APPDATA%" 2>NUL
SKlauncher.jar
ECHO.
ECHO.
ECHO # Aviso
ECHO - El juego se ha detenido (ya puedes cerrar esta ventana).
ECHO.
PAUSE
EXIT /B
# ------------------------- Ignora Esto --------------------------
$Host.UI.RawUI.WindowTitle = "Minecraft: Java Edition"
function Pause {Write-Host -NoNewline "Presione una tecla para continuar . . ."; [void][System.Console]::ReadKey($true); Write-Host}
# -------------------- Directorio de Trabajo ---------------------
$DIR = Split-Path -Parent $MyInvocation.MyCommand.Definition
cd "$DIR"; if (-not $?) {Pause; Exit}
# ------------------------ Menú Principal ------------------------
$MainMenu = {
do {
clear
echo ""
echo "////////////////////////////////////////////////////////////////"
echo "//// Minecraft: Java Edition ////"
echo "////////////////////////////////////////////////////////////////"
echo ""
echo "[ 0 ] MultiMC-Server.ps1"
echo "[ 1 ] Minecraft"
echo "[ 2 ] TestCraft"
echo ""
$Sel = Read-Host "Iniciar la Opcion "
Switch ($Sel) {
0 {Opt0; $Key = 1; Break}
1 {Opt1; $Key = 1; Break}
2 {Opt2; $Key = 1; Break}
Default {$Key = 0; Break}
}
} while ($Key -eq 0)
}
# --------------------------- Opción 0 ---------------------------
function Opt0 {
.\MultiMC-Server.ps1
Exit
}
# --------------------------- Opción 1 ---------------------------
function Opt1 {
clear
echo ""
echo "# Minecraft"
echo "- El juego se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
Start-Process -FilePath ".\SKlauncher.jar" -ArgumentList "--workDir `"$DIR\Cliente\Minecraft`"" -Wait
echo ""
echo ""
echo "# Aviso"
echo "- El juego se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# --------------------------- Opción 2 ---------------------------
function Opt2 {
clear
echo ""
echo "# TestCraft"
echo "- El juego se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
$Env:APPDATA = "$DIR\Cliente\TestCraft"
$null = New-Item -Path "$Env:APPDATA" -ItemType Directory -Force
Start-Process -FilePath ".\SKlauncher.jar" -Wait
echo ""
echo ""
echo "# Aviso"
echo "- El juego se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# ------------------------- Ignora Esto --------------------------
& $MainMenu
Pause
Exit
#!/bin/bash
# ------------------------- Ignora Esto --------------------------
pause() { read -n 1 -s -r -p "Presione una tecla para continuar . . ."; echo ""; }
# -------------------- Directorio de Trabajo ---------------------
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd "$DIR" || { pause; exit; }
# ------------------------ Menú Principal ------------------------
MainMenu() {
tput reset && printf '\e[3J'
echo ""
echo "////////////////////////////////////////////////////////////////"
echo "//// Minecraft: Java Edition ////"
echo "////////////////////////////////////////////////////////////////"
echo ""
echo "[ 0 ] MultiMC-Server.sh"
echo "[ 1 ] Minecraft"
echo "[ 2 ] TestCraft"
echo ""
read -r -p "Iniciar la Opcion " sel
case $sel in
0)Opt0;;
1)Opt1;;
2)Opt2;;
*)MainMenu;;
esac
}
# --------------------------- Opción 0 ---------------------------
Opt0() {
bash MultiMC-Server-v2.sh
exit
}
# --------------------------- Opción 1 ---------------------------
Opt1() {
tput reset && printf '\e[3J'
echo ""
echo "# Minecraft"
echo "- El juego se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
java -jar SKlauncher.jar --workDir "$DIR/Cliente/Minecraft"
echo ""
echo ""
echo "# Aviso"
echo "- El juego se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# --------------------------- Opción 2 ---------------------------
Opt2() {
tput reset && printf '\e[3J'
echo ""
echo "# TestCraft"
echo "- El juego se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
AppData="$DIR/Cliente/TestCraft"
mkdir -p "$AppData"
java -Duser.home="$AppData" -jar SKlauncher.jar
echo ""
echo ""
echo "# Aviso"
echo "- El juego se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# ------------------------- Ignora Esto --------------------------
MainMenu
pause
exit
@ECHO OFF
TITLE Minecraft: Java Edition - Dedicated Server
:: -------------------- Directorio de Trabajo ---------------------
@SETLOCAL ENABLEEXTENSIONS
@CD /D "%~dp0" || PAUSE && EXIT /B
:: ------------------------ Menú Principal ------------------------
:MainMenu
CLS
ECHO.
ECHO ////////////////////////////////////////////////////////////////
ECHO //// Minecraft: Java Edition ////
ECHO //// Dedicated Server ////
ECHO ////////////////////////////////////////////////////////////////
ECHO.
ECHO [ 1 ] Release 1.17.1
ECHO [ 2 ] Release 1.16.5 (Paper)
ECHO.
SET /P SEL=Iniciar la Opcion
IF NOT %SEL%=="" SET SEL=%SEL:~0,1%
IF %SEL%==1 GOTO Opt1
IF %SEL%==2 GOTO Opt2
GOTO MainMenu
:: --------------------------- Opción 1 ---------------------------
:Opt1
CLS
ECHO.
ECHO # Release 1.17.1
ECHO - El servidor se esta iniciando (no cierres esta ventana).
ECHO.
ECHO.
CD "Servidor\R1171" || PAUSE && EXIT /B
java.exe -Xms1G -Xmx1G -jar minecraft_server.1.17.1.jar --nogui
ECHO.
ECHO.
ECHO # Aviso
ECHO - El servidor se ha detenido (ya puedes cerrar esta ventana).
ECHO.
PAUSE
EXIT /B
:: -------------- Opción 2 ---------------
:Opt2
CLS
ECHO.
ECHO # Release 1.16.5 (Paper)
ECHO - El servidor se esta iniciando (no cierres esta ventana).
ECHO.
ECHO.
CD "Servidor\R1165-Paper" || PAUSE && EXIT /B
"%JAVA_HOME%bin\java.exe" -Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -DIReallyKnowWhatIAmDoingISwear -jar paper-1.16.5-783.jar --nogui
:: Para no tener que actualizar Paper, usar esto : -DIReallyKnowWhatIAmDoingISwear
ECHO.
ECHO.
ECHO # Aviso
ECHO - El servidor se ha detenido (ya puedes cerrar esta ventana).
ECHO.
PAUSE
EXIT /B
# ------------------------- Ignora Esto --------------------------
$Host.UI.RawUI.WindowTitle = "Minecraft: Java Edition - Dedicated Server"
function Pause {Write-Host -NoNewline "Presione una tecla para continuar . . ."; [void][System.Console]::ReadKey($true); Write-Host}
# -------------------- Directorio de Trabajo ---------------------
$DIR = Split-Path -Parent $MyInvocation.MyCommand.Definition
cd "$DIR"; if (-not $?) {Pause; Exit}
# ------------------------ Menú Principal ------------------------
$MainMenu = {
do {
clear
echo ""
echo "////////////////////////////////////////////////////////////////"
echo "//// Minecraft: Java Edition ////"
echo "//// Dedicated Server ////"
echo "////////////////////////////////////////////////////////////////"
echo ""
echo "[ 1 ] Release 1.17.1"
echo "[ 2 ] Release 1.16.5 (Paper)"
echo ""
$Sel = Read-Host "Iniciar la Opcion "
Switch ($Sel) {
1 {Opt1; $Key = 1; Break}
2 {Opt2; $Key = 1; Break}
Default {$Key = 0; Break}
}
} while ($Key -eq 0)
}
# --------------------------- Opción 1 ---------------------------
function Opt1 {
clear
echo ""
echo "# Release 1.17.1"
echo "- El servidor se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
cd ".\Servidor\R1171\"; if (-not $?) {Pause; Exit}
Start-Process -FilePath "java.exe" -ArgumentList "-Xms1G -Xmx1G -jar .\minecraft_server.1.17.1.jar --nogui" -NoNewWindow -Wait
echo ""
echo ""
echo "# Aviso"
echo "- El servidor se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# --------------------------- Opción 2 ---------------------------
function Opt2 {
clear
echo ""
echo "# Release 1.16.5 (Paper)"
echo "- El servidor se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
cd ".\Servidor\R1165-Paper\"; if (-not $?) {Pause; Exit}
Start-Process -FilePath "$($Env:JAVA_HOME)bin\java.exe" -ArgumentList "-Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -DIReallyKnowWhatIAmDoingISwear -jar .\paper-1.16.5-783.jar --nogui" -NoNewWindow -Wait
# Para no tener que actualizar Paper, usar esto : -DIReallyKnowWhatIAmDoingISwear
echo ""
echo ""
echo "# Aviso"
echo "- El servidor se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# ------------------------- Ignora Esto --------------------------
& $MainMenu
cd "$DIR"; if (-not $?) {Pause; Exit}
Pause
Exit
#!/bin/bash
# ------------------------- Ignora Esto --------------------------
pause() { read -n 1 -s -r -p "Presione una tecla para continuar . . ."; echo ""; }
# -------------------- Directorio de Trabajo ---------------------
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd "$DIR" || { pause; exit; }
# ------------------------ Menú Principal ------------------------
MainMenu() {
tput reset && printf '\e[3J'
echo ""
echo "////////////////////////////////////////////////////////////////"
echo "//// Minecraft: Java Edition ////"
echo "//// Dedicated Server ////"
echo "////////////////////////////////////////////////////////////////"
echo ""
echo "[ 1 ] Release 1.17.1"
echo "[ 2 ] Release 1.16.5 (Paper)"
echo ""
read -r -p "Iniciar la Opcion " sel
case $sel in
1)Opt1;;
2)Opt2;;
*)MainMenu;;
esac
}
# --------------------------- Opción 1 ---------------------------
Opt1() {
tput reset && printf '\e[3J'
echo ""
echo "# Release 1.17.1"
echo "- El servidor se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
cd "Servidor/R1171/" || { pause; exit; }
java -Xms1G -Xmx1G -jar minecraft_server.1.17.1.jar --nogui
echo ""
echo ""
echo "# Aviso"
echo "- El servidor se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# --------------------------- Opción 2 ---------------------------
Opt2() {
tput reset && printf '\e[3J'
echo ""
echo "# Release 1.16.5 (Paper)"
echo "- El servidor se esta iniciando (no cierres esta ventana)."
echo ""
echo ""
cd "Servidor/R1165-Paper/" || { pause; exit; }
"/usr/lib/jvm/bellsoft-java8-full-amd64/bin/java" -Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -DIReallyKnowWhatIAmDoingISwear -jar paper-1.16.5-783.jar --nogui
# Para no tener que actualizar Paper, usar esto : -DIReallyKnowWhatIAmDoingISwear
echo ""
echo ""
echo "# Aviso"
echo "- El servidor se ha detenido (ya puedes cerrar esta ventana)."
echo ""
}
# ------------------------- Ignora Esto --------------------------
MainMenu
pause
exit
[Desktop Entry]
Type=Application
Version=1.0
Name=SKlauncher
GenericName=Minecraft Launcher
Comment=The Minecraft Launcher
Exec=/home/TuNombre/.minecraft/MultiMC-Client.sh
Icon=/home/TuNombre/.minecraft/Recursos/Minecraft.svg
Terminal=true
Categories=Game;Application;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment