#!/bin/sh set -e EXEC_NAME="$(basename -- "$0")" options="$(getopt -n "$EXEC_NAME" -s sh -o hvfdx -l help -l version -- "$@")" eval set -- "$options" SCREEN_OPTS= while :; do case "$1" in -h|--help) echo "Usage: $EXEC_NAME [-fdx] [MCA_NAME|MCA_JAR|MCA_DIR] [--] [INPUT]…" exit ;; -v|--version) echo "MCA 1.0.0" exit ;; -f) SCREEN_OPTS=Dm ;; -d) SCREEN_OPTS=d ;; -x) SCREEN_OPTS=x ;; --) shift break esac shift done MCA_NAME=$1 if [ -z "$MCA_NAME" ]; then MCA_DIR="$PWD" MCA_NAME="$(basename -- "$MCA_DIR")" elif echo "$MCA_NAME" | grep -qE '^\.{,2}/' && MCA_NAME="$(readlink -f -- "$MCA_NAME")"; then if [ -d "$MCA_NAME" ]; then MCA_DIR="$MCA_NAME" MCA_NAME="$(basename -- "$MCA_DIR")" else MCA_DIR="$(dirname -- "$MCA_NAME")" MCA_JAR="$MCA_NAME" MCA_NAME="$(basename -- "$MCA_DIR")" fi else MCA_DIR="$HOME/mca/$MCA_NAME" fi command -v screen > /dev/null || { echo "$EXEC_NAME: screen not found" >&2; exit 2; } if [ -n "$2" ]; then shift INPUT="$(echo "$*" | sed 's/"/\\\0/g')" screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null || { echo "$EXEC_NAME: no screen found" >&2 exit 2 } exit fi MCA_SCREENRC_FILE="/etc/mca/screenrc" [ -r "$MCA_SCREENRC_FILE" ] || { echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2; exit 2; } if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS "$MCA_NAME" > /dev/null 2>&1; then exit elif screen -S "$MCA_NAME" -X select . > /dev/null 2>&1; then echo "$EXEC_NAME: this screen has already been attached to someone" >&2 exit 2 fi [ -d "$MCA_DIR" ] || { echo "$EXEC_NAME: $MCA_DIR: not found" >&2; exit 2; } cd "$MCA_DIR" MCA_RC_FILE="$MCA_DIR/.mcarc" # this file is taken from a dynamic variable, so we cannot specify an explicit path to the file # shellcheck disable=SC1090 # `--` is supported in dash # shellcheck disable=SC2240 [ -e "$MCA_RC_FILE" ] && . -- "$MCA_RC_FILE" if [ -z "$PLATFORM" ]; then if [ -z "$MCA_JAR" ]; then MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 -type f -name \*.jar | head -1)" [ -z "$MCA_JAR" ] && { echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2 exit 2 } fi if [ -e "$MCA_JAR" ]; then PLATFORM="$(basename -- "$MCA_JAR")" PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | grep -oE '[a-z]+' | head -1)" else echo "$EXEC_NAME: $MCA_JAR: no such file" >&2 exit 2 fi else [ -z "$MCA_JAR" ] && MCA_JAR="$MCA_DIR/$PLATFORM.jar" [ ! -e "$MCA_JAR" ] && { echo "$EXEC_NAME: $MCA_JAR: no such file" >&2 exit 2 } fi [ -n "$JVM_FLAGS" ] && JVM_FLAGS="$JVM_FLAGS " JVM_FLAGS="$JVM_FLAGS-Dfile.encoding=UTF-8 -Djava.awt.headless=true" case "$PLATFORM" in bungee) ;; waterfall|velocity) [ "$PLATFORM" = "bungee" ] || JVM_FLAGS="$JVM_FLAGS -XX:+UseG1GC \ -XX:G1HeapRegionSize=4M \ -XX:+UnlockExperimentalVMOptions \ -XX:+ParallelRefProcEnabled \ -XX:+AlwaysPreTouch \ -DIReallyKnowWhatIAmDoingISwear=true" ;; minecraft|bukkit|craftbukkit|spigot|paper) JVM_FLAGS="$JVM_FLAGS -Dcom.mojang.eula.agree=true \ -DIReallyKnowWhatIAmDoingISwear=true" [ "$PLATFORM" = "paper" ] && JVM_FLAGS="$JVM_FLAGS -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" ;; custom) ;; *) echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: \ bungee, waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, paper, custom" >&2 exit 2 ;; esac [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ] && PATH="$JAVA_HOME/bin:$PATH" java -version > /dev/null 2>&1 || { echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2 exit 2 } [ -n "$MAX_MEMORY" ] && JVM_FLAGS="-Xmx$MAX_MEMORY $JVM_FLAGS" [ -n "$MIN_MEMORY" ] && JVM_FLAGS="-Xms$MIN_MEMORY $JVM_FLAGS" MCA_CMD="$(which java) -server $JVM_FLAGS -jar $MCA_JAR" # papermc prints uncolored text if the COLORTERM variable is set to `truecolor` export COLORTERM= # we don't quote $MCA_CMD because screen treats arguments after the second one as a command # shellcheck disable=SC2086 exec screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"S "$MCA_NAME" -- $MCA_CMD