summaryrefslogtreecommitdiff
path: root/minecraft/mclauncher
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-06-06 17:27:05 -0400
committerFreya Murphy <freya@freyacat.org>2024-06-06 17:27:05 -0400
commitdc940d4afeb531b75615c0b552ad0eed8f866644 (patch)
treeab1e51eb2004467fe2bd248f488a1d92fd528d74 /minecraft/mclauncher
downloadimages-dc940d4afeb531b75615c0b552ad0eed8f866644.tar.gz
images-dc940d4afeb531b75615c0b552ad0eed8f866644.tar.bz2
images-dc940d4afeb531b75615c0b552ad0eed8f866644.zip
initial
Diffstat (limited to 'minecraft/mclauncher')
-rw-r--r--minecraft/mclauncher259
1 files changed, 259 insertions, 0 deletions
diff --git a/minecraft/mclauncher b/minecraft/mclauncher
new file mode 100644
index 0000000..721b48f
--- /dev/null
+++ b/minecraft/mclauncher
@@ -0,0 +1,259 @@
+#!/bin/sh
+
+set -e
+
+#
+# DEFAULT VARIABLE GENERATORS
+#
+
+jvm_args() {
+ MEMORY="${MEMORY:-1G}"
+ printf -- "-Xms$MEMORY -Xmx$MEMORY "
+ printf -- "-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 "
+ printf -- "-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch "
+ printf -- "-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M "
+ printf -- "-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 "
+ printf -- "-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 "
+ printf -- "-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem "
+ printf -- "-XX:MaxTenuringThreshold=1 "
+}
+
+#
+# ENV VARS
+#
+
+SERVER_DIR="$(realpath ${MC_DIR:-./server})"
+JVMARGS=${JVMARGS:-$(jvm_args)}
+
+#
+# PREDEFINE VARS
+#
+
+MCLAUNCHER_INFO=""
+MCLAUNCHER_BINARY=""
+MCLAUNCHER_QUIET=1
+
+#
+# HELPERS
+#
+
+error() {
+ printf '\x1b[31m[ERROR]\t\x1b[0m%s\n' "$*" > /dev/stderr
+ exit 1;
+}
+
+log() {
+ if [ "$MCLAUNCHER_QUIET" -eq 0 ]; then
+ printf '\x1b[0m[LOG]\t%s\n' "$*" > /dev/stderr
+ fi
+}
+
+step() {
+ if [ "$MCLAUNCHER_QUIET" -eq 0 ]; then
+ printf '\x1b[36m[STEP]\t\x1b[0m%s\n' "$*" > /dev/stderr
+ fi
+}
+
+get_key() {
+ echo "$MCLAUNCHER_INFO" | grep "$1=" | awk -F '=' '{ print $2 }'
+}
+
+#
+# INFO STEP
+# gets the up to date information from mcjar
+#
+
+info_step() {
+ step "info"
+
+ # getting latest info from mcjar
+ MCLAUNCHER_INFO="$(mcjar -a)"
+
+ [ "$MCLAUNCHER_QUIET" -eq 1 ] || echo "$MCLAUNCHER_INFO";
+}
+
+#
+# BINARY STEP
+# attempts to find the current binary installed on the system
+#
+
+binary_step_forge() {
+ jar_name="$(get_key "JAR_NAME")"
+ jar_prefix="${jar_name%-installer.jar}"
+ suffixs="$(echo ".jar;-shim.jar;-universal.jar" | tr ";" "\n")"
+
+ IFS=$'\n'
+ for suffix in $suffixs; do
+ if [ -f "$SERVER_DIR/$jar_prefix$suffix" ]; then
+ MCLAUNCHER_BINARY="$jar_prefix$suffix"
+ return;
+ fi
+ done
+}
+
+binary_step_default() {
+ jar_name="$(get_key "JAR_NAME")"
+ if [ -f "$SERVER_DIR/$jar_name" ]; then
+ MCLAUNCHER_BINARY="$jar_name"
+ fi
+}
+
+binary_step() {
+ step "binary"
+
+ MCLAUNCHER_BINARY=""
+ type="$(get_key "MC_TYPE")"
+ case "$type" in
+ "forge")
+ binary_step_forge
+ ;;
+ *)
+ binary_step_default
+ ;;
+ esac
+
+ if [ "$MCLAUNCHER_BINARY" != "" ]; then
+ log "found binary '$MCLAUNCHER_BINARY'"
+ else
+ log "could not locate binary... will download"
+ fi
+}
+
+#
+# DOWNLOAD STEP
+# download the binary if it needs to needs updated
+#
+
+download_step() {
+ step "download"
+
+ if [ "$MCLAUNCHER_BINARY" != "" ]; then
+ log "jar is up to date... skipping"
+ return;
+ fi
+
+ # clean up old files
+ rm -f "$SERVER_DIR"/*.jar
+ rm -f "$SERVER_DIR"/*.jar.log
+ rm -f "$SERVER_DIR"/*.bat
+ rm -f "$SERVER_DIR/run.sh"
+
+ # update the jar
+ log "jar is out of date... updating"
+ jar_url="$(get_key "JAR_URL")"
+ jar_name="$(get_key "JAR_NAME")"
+ log "downloading '$jar_url'"
+ wget -q "$jar_url" -O "$SERVER_DIR/$jar_name"
+ MCLAUNCHER_BINARY="$jar_name"
+}
+
+#
+# INSTALL STEP
+# some mc types need an extra install step to setup the server files before running
+#
+
+install_step_forge() {
+ log "installing forge server"
+ jar_name="$(get_key "JAR_NAME")"
+ java -jar "$SERVER_DIR/$jar_name" --installServer
+
+ binary_step_forge
+ if [ "$MCLAUNCHER_BINARY" = "" ]; then
+ error "could not locate forge binary"
+ fi
+}
+
+install_step() {
+ step "install"
+
+ type="$(get_key "MC_TYPE")"
+ case "$type" in
+ "forge")
+ install_step_forge
+ ;;
+ *)
+ log "install step not needed for '$type'"
+ ;;
+ esac
+}
+
+#
+# EXECUTE STEP
+# run the thing!!!!!!
+#
+
+execute_step_default() {
+ jar_name="$(get_key "JAR_NAME")"
+ exec java $JVMARGS -jar "$SERVER_DIR/$jar_name" nogui
+}
+
+execute_step_forge() {
+ if [ -f "$SERVER_DIR/run.sh" ]; then
+ echo "$JVMARGS" > "$SERVER_DIR/user_jvm_args.txt"
+ chmod +x "$SERVER_DIR/run.sh"
+ exec "$SERVER_DIR/run.sh" nogui
+ else
+ exec java $JVMARGS -jar "$SERVER_DIR/$MCLAUNCHER_BINARY" nogui
+ fi
+}
+
+execute_step() {
+ step "execute"
+
+ echo "eula=true" > "$SERVER_DIR/eula.txt"
+
+ type="$(get_key "MC_TYPE")"
+ case "$type" in
+ "forge")
+ execute_step_forge
+ ;;
+ *)
+ execute_step_default
+ ;;
+ esac
+}
+
+chk_command() {
+ if ! command -v "$1" > /dev/null; then
+ >&2 echo "error: command '$1' could not be found"
+ exit 1
+ fi
+}
+
+help() {
+ printf "usage: mclauncher [options]\n\n"
+ printf "options:\n"
+ printf "\t-h\tshow this message\n"
+ printf "\t-l\tshow logging (verbose)\n\n"
+ printf "environment:\n"
+ printf "\tsee 'mcjar -h' for environment\n"
+}
+
+chk_command mcjar
+chk_command java
+chk_command awk
+chk_command getopts
+
+while getopts "hl" arg 2>/dev/null; do
+ case "$arg" in
+ h)
+ help
+ exit 0
+ ;;
+ l)
+ MCLAUNCHER_QUIET=0
+ ;;
+ ?)
+ error "unknown option"
+ ;;
+ esac;
+done;
+
+mkdir -p "$SERVER_DIR"
+cd "$SERVER_DIR"
+
+info_step
+binary_step
+download_step
+install_step
+execute_step