#!/bin/bash . ${SCRIPTS:-/}start-utils : ${SERVER_PROPERTIES:=/data/server.properties} # FUNCTIONS function setServerProp { local prop=$1 local var=$2 if [ -n "$var" ]; then # normalize booleans case ${var^^} in TRUE|FALSE) var=${var,,} ;; esac if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}" sed -i "/^${prop}\s*=/ c ${prop}=${var//\\/\\\\}" "$SERVER_PROPERTIES" else log "Adding ${prop} with '${var}' in ${SERVER_PROPERTIES}" echo "${prop}=${var//\\/\\\\}" >> "$SERVER_PROPERTIES" fi else isDebugging && log "Skip setting ${prop}" fi } function customizeServerProps { if [ -n "$WHITELIST" ] || isTrue ${ENABLE_WHITELIST:-false}; then log "Creating whitelist" setServerProp "whitelist" "true" setServerProp "white-list" "true" else log "Disabling whitelist" setServerProp "whitelist" "false" setServerProp "white-list" "false" fi # If not provided, generate a reasonable default message-of-the-day, # which shows up in the server listing in the client if [ -z "$MOTD" ]; then # snapshot is the odd case where we have to look at version to identify that label if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then label=SNAPSHOT else label=${ORIGINAL_TYPE} fi # Convert label to title-case label=${label,,} label=${label^} MOTD="A ${label} Minecraft Server powered by Docker" fi setServerProp "server-name" "$SERVER_NAME" setServerProp "server-ip" "$SERVER_IP" setServerProp "server-port" "$SERVER_PORT" setServerProp "motd" "$MOTD" setServerProp "allow-nether" "$ALLOW_NETHER" setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS" setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK" setServerProp "spawn-animals" "$SPAWN_ANIMALS" setServerProp "spawn-monsters" "$SPAWN_MONSTERS" setServerProp "spawn-npcs" "$SPAWN_NPCS" setServerProp "spawn-protection" "$SPAWN_PROTECTION" setServerProp "generate-structures" "$GENERATE_STRUCTURES" setServerProp "view-distance" "$VIEW_DISTANCE" setServerProp "hardcore" "$HARDCORE" setServerProp "snooper-enabled" "$SNOOPER_ENABLED" setServerProp "max-build-height" "$MAX_BUILD_HEIGHT" setServerProp "force-gamemode" "$FORCE_GAMEMODE" setServerProp "max-tick-time" "$MAX_TICK_TIME" setServerProp "enable-query" "$ENABLE_QUERY" setServerProp "query.port" "$QUERY_PORT" setServerProp "enable-rcon" "$ENABLE_RCON" setServerProp "rcon.password" "$RCON_PASSWORD" setServerProp "rcon.port" "$RCON_PORT" setServerProp "max-players" "$MAX_PLAYERS" setServerProp "max-world-size" "$MAX_WORLD_SIZE" setServerProp "level-name" "$LEVEL" setServerProp "level-seed" "$SEED" setServerProp "pvp" "${PVP}" setServerProp "generator-settings" "$GENERATOR_SETTINGS" setServerProp "online-mode" "$ONLINE_MODE" setServerProp "allow-flight" "$ALLOW_FLIGHT" setServerProp "level-type" "${LEVEL_TYPE^^}" setServerProp "resource-pack" "$RESOURCE_PACK" setServerProp "resource-pack-sha1" "$RESOURCE_PACK_SHA1" setServerProp "player-idle-timeout" "$PLAYER_IDLE_TIMEOUT" setServerProp "broadcast-console-to-ops" "$BROADCAST_CONSOLE_TO_OPS" setServerProp "broadcast-rcon-to-ops" "$BROADCAST_RCON_TO_OPS" setServerProp "enable-jmx-monitoring" "$ENABLE_JMX" setServerProp "sync-chunk-writes" "$SYNC_CHUNK_WRITES" setServerProp "enable-status" "$ENABLE_STATUS" setServerProp "entity-broadcast-range-percentage" "$ENTITY_BROADCAST_RANGE_PERCENTAGE" setServerProp "function-permission-level" "$FUNCTION_PERMISSION_LEVEL" setServerProp "network-compression-threshold" "$NETWORK_COMPRESSION_THRESHOLD" setServerProp "op-permission-level" "$OP_PERMISSION_LEVEL" setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS" setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT" setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST" if [ -n "$DIFFICULTY" ]; then case $DIFFICULTY in peaceful|0) if versionLessThan 1.13; then DIFFICULTY=0 else DIFFICULTY=peaceful fi ;; easy|1) if versionLessThan 1.13; then DIFFICULTY=1 else DIFFICULTY=easy fi ;; normal|2) if versionLessThan 1.13; then DIFFICULTY=2 else DIFFICULTY=normal fi ;; hard|3) if versionLessThan 1.13; then DIFFICULTY=3 else DIFFICULTY=hard fi ;; *) log "DIFFICULTY must be peaceful, easy, normal, or hard." exit 1 ;; esac setServerProp "difficulty" "$DIFFICULTY" fi if [ -n "$MODE" ]; then log "Setting mode" MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' ) case $MODE_LC in su*|0) if versionLessThan 1.13; then MODE=0 else MODE=survival fi ;; c*|1) if versionLessThan 1.13; then MODE=1 else MODE=creative fi ;; a*|2) if versionLessThan 1.13; then MODE=2 else MODE=adventure fi ;; sp*|3) if versionLessThan 1.13; then MODE=3 else MODE=spectator fi ;; *) log "ERROR: Invalid game mode: $MODE" exit 1 ;; esac setServerProp "gamemode" "$MODE" fi } # Deploy server.properties file if [[ ${TYPE} == "CURSEFORGE" ]]; then export SERVER_PROPERTIES="${FTB_DIR}/server.properties" log "detected FTB, changing properties path to ${SERVER_PROPERTIES}" fi if [ ! -e "$SERVER_PROPERTIES" ]; then log "Creating server.properties in ${SERVER_PROPERTIES}" cp /tmp/server.properties "$SERVER_PROPERTIES" customizeServerProps elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then case ${OVERRIDE_SERVER_PROPERTIES^^} in TRUE|1) customizeServerProps ;; *) log "server.properties already created, skipping" ;; esac else log "server.properties already created, skipping" fi if isTrue "${ENABLE_AUTOPAUSE}"; then current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' ) if (( $current_max_tick > 0 && $current_max_tick < 86400000 )); then log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled." log "Warning (cont): Autopause functionality resuming the process might trigger the Watchdog and restart the server completely." log "Warning (cont): Set the max-tick-time property to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)." fi fi if isDebugging; then log "DEBUG Dumping server.properties" cat "${SERVER_PROPERTIES}" fi exec ${SCRIPTS:-/}start-finalSetupEnvVariables $@