mirror of
https://github.com/itzg/docker-minecraft-server
synced 2024-12-15 14:52:27 +00:00
126 lines
4.2 KiB
Bash
Executable file
126 lines
4.2 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# shellcheck source=start-utils
|
|
. "${SCRIPTS:-/}start-utils"
|
|
set -e
|
|
isDebugging && set -x
|
|
|
|
if [ "$TYPE" = "CURSEFORGE" ]; then
|
|
worldDest=$FTB_DIR/${LEVEL:-world}
|
|
else
|
|
worldDest=/data/${LEVEL:-world}
|
|
fi
|
|
|
|
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
|
if isTrue "${FORCE_WORLD_COPY}"; then
|
|
log "Removing existing world data in $worldDest ${worldDest}_nether ${worldDest}_the_end"
|
|
rm -rf "$worldDest" \
|
|
"${worldDest}_nether" \
|
|
"${worldDest}_the_end"
|
|
fi
|
|
|
|
if isURL "$WORLD"; then
|
|
log "Downloading world from $WORLD"
|
|
if ! get -o /tmp/world.bin "$WORLD"; then
|
|
log "ERROR: failed to download world from $WORLD"
|
|
exit 1
|
|
fi
|
|
WORLD=/tmp/world.bin
|
|
fi
|
|
|
|
if [ -f "$WORLD" ]; then
|
|
log "Extracting world"
|
|
|
|
# Stage contents so that the correct subdirectory can be picked off
|
|
mkdir -p /tmp/world-data
|
|
if ! extract "$WORLD" /tmp/world-data; then
|
|
log "ERROR extracting world from $WORLD"
|
|
exit 1
|
|
fi
|
|
|
|
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
|
|
|
if ! [[ $baseDirs ]]; then
|
|
log "ERROR world content is not valid since level.dat could not be found"
|
|
exit 2
|
|
fi
|
|
|
|
count=$(echo "$baseDirs" | wc -l)
|
|
if [[ $count -gt 1 ]]; then
|
|
baseDirsNoSpigotSuffix=$(echo "$baseDirs" | sed -re 's:(_nether|_the_end)/?$::' | sort -u)
|
|
if [ "$(echo "$baseDirsNoSpigotSuffix" | wc -l)" -eq 1 ]; then
|
|
baseDir="$baseDirsNoSpigotSuffix"
|
|
baseName=$(basename "$baseDir")
|
|
log "Found Spigot naming conventions, taking $baseName as main dimension"
|
|
else
|
|
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
|
baseName=$(basename "$baseDir")
|
|
log "WARN multiple levels found, picking: $baseName"
|
|
fi
|
|
elif [[ $count -gt 0 ]]; then
|
|
baseDir="$baseDirs"
|
|
else
|
|
log "ERROR invalid world content"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -d "${baseDir}_nether/DIM-1" ]; then
|
|
if [ -d "$baseDir/DIM-1" ]; then
|
|
log "WARN found Nether dimension in both $baseDir and ${baseDir}_nether, picking ${baseDir}_nether"
|
|
rm -r "$baseDir/DIM-1"
|
|
fi
|
|
fi
|
|
if [ -d "${baseDir}_the_end/DIM1" ]; then
|
|
if [ -d "$baseDir/DIM1" ]; then
|
|
log "WARN found End dimension in both $baseDir and ${baseDir}_the_end, picking ${baseDir}_the_end"
|
|
rm -r "$baseDir/DIM1"
|
|
fi
|
|
fi
|
|
|
|
log "Copying world..."
|
|
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
|
|
|
if [ "$FAMILY" = "SPIGOT" ]; then
|
|
if [ -d "${baseDir}_nether" ]; then
|
|
log "Copying Spigot Nether..."
|
|
rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
|
elif [ -d "$worldDest/DIM-1" ]; then
|
|
log "Moving Nether to Spigot location..."
|
|
mkdir -p "${worldDest}_nether"
|
|
mv -f "$worldDest/DIM-1" "${worldDest}_nether/"
|
|
fi
|
|
if [ -d "${baseDir}_the_end" ]; then
|
|
log "Copying Spigot End..."
|
|
rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
|
elif [ -d "$worldDest/DIM1" ]; then
|
|
log "Moving End to Spigot location..."
|
|
mkdir -p "${worldDest}_the_end"
|
|
mv -f "$worldDest/DIM1" "${worldDest}_the_end/"
|
|
fi
|
|
else
|
|
if [ -d "${baseDir}_nether/DIM-1" ]; then
|
|
log "Copying Spigot Nether to vanilla location..."
|
|
rsync --remove-source-files --recursive --delete "${baseDir}_nether/DIM-1" "${worldDest}/"
|
|
fi
|
|
if [ -d "${baseDir}_the_end/DIM1" ]; then
|
|
log "Copying Spigot End to vanilla location..."
|
|
rsync --remove-source-files --recursive --delete "${baseDir}_the_end/DIM1" "${worldDest}/"
|
|
fi
|
|
fi
|
|
elif [ -d "$WORLD" ]; then
|
|
log "Cloning world directory from $WORLD ..."
|
|
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
|
else
|
|
log "ERROR: world file/directory $WORLD is missing"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$FAMILY" = "SPIGOT" ]; then
|
|
# Reorganise if a Spigot server
|
|
log "Moving End and Nether maps to Spigot location"
|
|
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
|
[ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "${worldDest}_nether"
|
|
fi
|
|
fi
|
|
|
|
exec "${SCRIPTS:-/}start-setupDatapack" "$@"
|