mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2024-06-07 19:40:43 +00:00
b23fb93366
rm -f $SERVER was a bad idea, as it deletes the server file regardless of whether wget is able to download a new one. If you keep a copy of spigot_server in the server directory, wget will fail if it's unable to pull the file and it wont delete what you already have.
333 lines
8.2 KiB
Bash
Executable File
333 lines
8.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
umask 002
|
|
|
|
if [ ! -e /data/eula.txt ]; then
|
|
if [ "$EULA" != "" ]; then
|
|
echo "# Generated via Docker on $(date)" > eula.txt
|
|
echo "eula=$EULA" >> eula.txt
|
|
else
|
|
echo ""
|
|
echo "Please accept the Minecraft EULA at"
|
|
echo " https://account.mojang.com/documents/minecraft_eula"
|
|
echo "by adding the following immediately after 'docker run':"
|
|
echo " -e EULA=TRUE"
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo "Checking version information."
|
|
case "X$VERSION" in
|
|
X|XLATEST|Xlatest)
|
|
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.release)'`
|
|
;;
|
|
XSNAPSHOT|Xsnapshot)
|
|
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.snapshot)'`
|
|
;;
|
|
X[1-9]*)
|
|
VANILLA_VERSION=$VERSION
|
|
;;
|
|
*)
|
|
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.release)'`
|
|
;;
|
|
esac
|
|
|
|
cd /data
|
|
|
|
echo "Checking type information."
|
|
case "$TYPE" in
|
|
*BUKKIT|*bukkit|SPIGOT|spigot)
|
|
TYPE=SPIGOT
|
|
case "$TYPE" in
|
|
*BUKKIT|*bukkit)
|
|
echo "Downloading latest CraftBukkit $VANILLA_VERSION server ..."
|
|
SERVER=craftbukkit_server.jar
|
|
;;
|
|
*)
|
|
echo "Downloading latest Spigot $VANILLA_VERSION server ..."
|
|
SERVER=spigot_server.jar
|
|
;;
|
|
esac
|
|
case $VANILLA_VERSION in
|
|
1.8*)
|
|
URL=/spigot18/$SERVER
|
|
;;
|
|
1.9*)
|
|
URL=/spigot19/$SERVER
|
|
;;
|
|
*)
|
|
echo "That version of $SERVER is not available."
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
#BAD Idea
|
|
#rm -f $SERVER
|
|
wget -q https://getspigot.org$URL
|
|
|
|
;;
|
|
|
|
FORGE|forge)
|
|
TYPE=FORGE
|
|
norm=$VANILLA_VERSION
|
|
|
|
echo "Checking Forge version information."
|
|
case $FORGEVERSION in
|
|
RECOMMENDED)
|
|
FORGE_VERSION=`wget -O - http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json | jsawk -n "out(this.promos['$norm-recommended'])"`
|
|
;;
|
|
|
|
*)
|
|
FORGE_VERSION=$FORGEVERSION
|
|
;;
|
|
esac
|
|
|
|
# URL format changed for 1.7.10 from 10.13.2.1300
|
|
sorted=$((echo $FORGE_VERSION; echo 10.13.2.1300) | sort -V | head -1)
|
|
if [[ $norm == '1.7.10' && $sorted == '10.13.2.1300' ]]; then
|
|
# if $FORGEVERSION >= 10.13.2.1300
|
|
normForgeVersion="$norm-$FORGE_VERSION-$norm"
|
|
else
|
|
normForgeVersion="$norm-$FORGE_VERSION"
|
|
fi
|
|
|
|
FORGE_INSTALLER="forge-$normForgeVersion-installer.jar"
|
|
SERVER="forge-$normForgeVersion-universal.jar"
|
|
|
|
if [ ! -e "$SERVER" ]; then
|
|
echo "Downloading $FORGE_INSTALLER ..."
|
|
wget -q http://files.minecraftforge.net/maven/net/minecraftforge/forge/$normForgeVersion/$FORGE_INSTALLER
|
|
echo "Installing $SERVER"
|
|
java -jar $FORGE_INSTALLER --installServer
|
|
fi
|
|
;;
|
|
|
|
VANILLA|vanilla)
|
|
SERVER="minecraft_server.$VANILLA_VERSION.jar"
|
|
|
|
if [ ! -e $SERVER ]; then
|
|
echo "Downloading $SERVER ..."
|
|
wget -q https://s3.amazonaws.com/Minecraft.Download/versions/$VANILLA_VERSION/$SERVER
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
echo "Invalid type: '$TYPE'"
|
|
echo "Must be: VANILLA, FORGE, SPIGOT"
|
|
exit 1
|
|
;;
|
|
|
|
esac
|
|
|
|
# If supplied with a URL for a world, download it and unpack
|
|
if [[ "$WORLD" ]]; then
|
|
case "X$WORLD" in
|
|
X[Hh][Tt][Tt][Pp]*)
|
|
echo "Downloading world via HTTP"
|
|
echo "$WORLD"
|
|
wget -q -O - "$WORLD" > /data/world.zip
|
|
echo "Unzipping word"
|
|
unzip -q /data/world.zip
|
|
rm -f /data/world.zip
|
|
if [ ! -d /data/world ]; then
|
|
echo World directory not found
|
|
for i in /data/*/level.dat; do
|
|
if [ -f "$i" ]; then
|
|
d=`dirname "$i"`
|
|
echo Renaming world directory from $d
|
|
mv -f "$d" /data/world
|
|
fi
|
|
done
|
|
fi
|
|
if [ "$TYPE" = "SPIGOT" ]; then
|
|
# Reorganise if a Spigot server
|
|
echo "Moving End and Nether maps to Spigot location"
|
|
[ -d "/data/world/DIM1" ] && mv -f "/data/world/DIM1" "/data/world_the_end"
|
|
[ -d "/data/world/DIM-1" ] && mv -f "/data/world/DIM-1" "/data/world_nether"
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
|
|
if [[ "$MODPACK" ]]; then
|
|
case "X$MODPACK" in
|
|
X[Hh][Tt][Tt][Pp]*[Zz][iI][pP])
|
|
echo "Downloading mod/plugin pack via HTTP"
|
|
echo "$MODPACK"
|
|
wget -q -O /tmp/modpack.zip "$MODPACK"
|
|
if [ "$TYPE" = "SPIGOT" ]; then
|
|
mkdir -p /data/plugins
|
|
unzip -d /data/plugins /tmp/modpack.zip
|
|
else
|
|
mkdir -p /data/mods
|
|
unzip -d /data/mods /tmp/modpack.zip
|
|
fi
|
|
rm -f /tmp/modpack.zip
|
|
;;
|
|
*)
|
|
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ ! -e server.properties ]; then
|
|
cp /tmp/server.properties .
|
|
|
|
if [ -n "$WHITELIST" ]; then
|
|
sed -i "/whitelist\s*=/ c whitelist=true" /data/server.properties
|
|
sed -i "/white-list\s*=/ c white-list=true" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$MOTD" ]; then
|
|
sed -i "/motd\s*=/ c motd=$MOTD" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$LEVEL" ]; then
|
|
sed -i "/level-name\s*=/ c level-name=$LEVEL" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$SEED" ]; then
|
|
sed -i "/level-seed\s*=/ c level-seed=$SEED" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$PVP" ]; then
|
|
sed -i "/pvp\s*=/ c pvp=$PVP" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$LEVEL_TYPE" ]; then
|
|
# normalize to uppercase
|
|
LEVEL_TYPE=${LEVEL_TYPE^^}
|
|
# check for valid values and only then set
|
|
case $LEVEL_TYPE in
|
|
DEFAULT|FLAT|LARGEBIOMES|AMPLIFIED|CUSTOMIZED)
|
|
sed -i "/level-type\s*=/ c level-type=$LEVEL_TYPE" /data/server.properties
|
|
;;
|
|
*)
|
|
echo "Invalid LEVEL_TYPE: $LEVEL_TYPE"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ -n "$GENERATOR_SETTINGS" ]; then
|
|
sed -i "/generator-settings\s*=/ c generator-settings=$GENERATOR_SETTINGS" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$DIFFICULTY" ]; then
|
|
case $DIFFICULTY in
|
|
peaceful|0)
|
|
DIFFICULTY=0
|
|
;;
|
|
easy|1)
|
|
DIFFICULTY=1
|
|
;;
|
|
normal|2)
|
|
DIFFICULTY=2
|
|
;;
|
|
hard|3)
|
|
DIFFICULTY=3
|
|
;;
|
|
*)
|
|
echo "DIFFICULTY must be peaceful, easy, normal, or hard."
|
|
exit 1
|
|
;;
|
|
esac
|
|
sed -i "/difficulty\s*=/ c difficulty=$DIFFICULTY" /data/server.properties
|
|
fi
|
|
|
|
if [ -n "$MODE" ]; then
|
|
case ${MODE,,?} in
|
|
0|1|2|3)
|
|
;;
|
|
s*)
|
|
MODE=0
|
|
;;
|
|
c*)
|
|
MODE=1
|
|
;;
|
|
a*)
|
|
MODE=2
|
|
;;
|
|
s*)
|
|
MODE=3
|
|
;;
|
|
*)
|
|
echo "ERROR: Invalid game mode: $MODE"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
sed -i "/gamemode\s*=/ c gamemode=$MODE" /data/server.properties
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ -n "$OPS" -a ! -e ops.txt.converted ]; then
|
|
echo $OPS | awk -v RS=, '{print}' >> ops.txt
|
|
fi
|
|
|
|
if [ -n "$WHITELIST" -a ! -e white-list.txt.converted ]; then
|
|
echo $WHITELIST | awk -v RS=, '{print}' >> white-list.txt
|
|
fi
|
|
|
|
if [ -n "$ICON" -a ! -e server-icon.png ]; then
|
|
echo "Using server icon from $ICON..."
|
|
# Not sure what it is yet...call it "img"
|
|
wget -q -O /tmp/icon.img $ICON
|
|
specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
|
|
if [ "$specs" = "PNG 64x64" ]; then
|
|
mv /tmp/icon.img /data/server-icon.png
|
|
else
|
|
echo "Converting image to 64x64 PNG..."
|
|
convert /tmp/icon.img -resize 64x64! /data/server-icon.png
|
|
fi
|
|
fi
|
|
|
|
# Make sure files exist to avoid errors
|
|
if [ ! -e banned-players.json ]; then
|
|
echo '' > banned-players.json
|
|
fi
|
|
if [ ! -e banned-ips.json ]; then
|
|
echo '' > banned-ips.json
|
|
fi
|
|
|
|
# If any modules have been provided, copy them over
|
|
[ -d /data/mods ] || mkdir /data/mods
|
|
for m in /mods/*.jar
|
|
do
|
|
if [ -f "$m" ]; then
|
|
echo Copying mod `basename "$m"`
|
|
cp -f "$m" /data/mods
|
|
fi
|
|
done
|
|
[ -d /data/config ] || mkdir /data/config
|
|
for c in /config/*
|
|
do
|
|
if [ -f "$c" ]; then
|
|
echo Copying configuration `basename "$c"`
|
|
cp -rf "$c" /data/config
|
|
fi
|
|
done
|
|
|
|
if [ "$TYPE" = "SPIGOT" ]; then
|
|
echo Copying any Bukkit plugins over
|
|
if [ -d /plugins ]; then
|
|
cp -r /plugins /data
|
|
fi
|
|
fi
|
|
|
|
# If we have a bootstrap.txt file... feed that in to the server stdin
|
|
if [ -f /data/bootstrap.txt ];
|
|
then
|
|
exec java $JVM_OPTS -jar $SERVER < /data/bootstrap.txt
|
|
else
|
|
exec java $JVM_OPTS -jar $SERVER
|
|
fi
|
|
|
|
exec java $JVM_OPTS -jar $SERVER
|