#!/bin/bash
apt update
apt install -y jq curl
mkdir -p /mnt/server
mkdir -p /mnt/server/mods
cd /mnt/server
if [[ "${SF_MC_VERSION}" == *-* ]]; then
echo -e "Using specific SpongeForge version: ${SF_MC_VERSION}"
SF_VERSION=${SF_MC_VERSION}
else
echo -e "Fetching recommended SpongeForge version for Minecraft ${SF_MC_VERSION}"
API_URL="https://dl-api-new.spongepowered.org/api/v2/groups/org.spongepowered/artifacts/spongeforge/latest?tags=minecraft:${SF_MC_VERSION}&recommended=true"
SF_VERSION=$(curl -s ${API_URL} | jq -r '.coordinates.version // empty') || true
if [[ -z "${SF_VERSION}" ]]; then
echo -e "Attempting to fetch latest SpongeForge version for Minecraft ${SF_MC_VERSION}"
API_URL="https://dl-api-new.spongepowered.org/api/v2/groups/org.spongepowered/artifacts/spongeforge/latest?tags=minecraft:${SF_MC_VERSION}&recommended=false"
SF_VERSION=$(curl -s ${API_URL} | jq -r '.coordinates.version // empty') || true
fi
if [[ -z "${SF_VERSION}" ]]; then
echo -e "Error: Failed to retrieve SpongeForge version for Minecraft ${SF_MC_VERSION}"
exit 1
fi
echo -e "Found SpongeForge version: ${SF_VERSION}"
fi
MC_VERSION=${SF_VERSION%%-*}
SF_BASE_URL="https://repo.spongepowered.org/repository/maven-releases"
if [[ "${MC_VERSION}" == "1.12.2" || $(printf '%s\n' "$MC_VERSION" "1.12" | sort -V | head -n1) == "$MC_VERSION" ]]; then
SF_BASE_URL="https://repo.spongepowered.org/repository/legacy-transfer"
fi
if [[ $(printf '%s\n' "$MC_VERSION" "1.16.5" | sort -V | tail -n1) == "$MC_VERSION" || "${MC_VERSION}" == "1.21.4" ]]; then
SF_DL_LINK="${SF_BASE_URL}/org/spongepowered/spongeforge/${SF_VERSION}/spongeforge-${SF_VERSION}-universal.jar"
else
SF_DL_LINK="${SF_BASE_URL}/org/spongepowered/spongeforge/${SF_VERSION}/spongeforge-${SF_VERSION}.jar"
fi
echo -e "Downloading SpongeForge: ${SF_DL_LINK}"
curl -L --retry 5 --retry-delay 5 -o /mnt/server/mods/spongeforge-${SF_VERSION}.jar ${SF_DL_LINK} || {
echo -e "Error: SpongeForge download failed. Attempted URL: ${SF_DL_LINK}"
exit 1
}
declare -A FORGE_VERSIONS=(
["1.12.2"]="14.23.5.2838"
["1.12.1"]="14.22.1.2480"
["1.11.2"]="13.20.1.2476"
["1.10.2"]="12.18.3.2477"
["1.9.4"]="12.17.0.1968"
["1.8.9"]="11.15.1.1890-1.8.9"
)
if [[ -n "${FORGE_VERSIONS[${MC_VERSION}]}" ]]; then
FORGE_VERSION=${FORGE_VERSIONS[${MC_VERSION}]}
else
IFS='-' read -ra VERSION_PARTS <<< "$SF_VERSION"
FORGE_VERSION=${VERSION_PARTS[1]:-${VERSION_PARTS[2]}}
fi
if printf '%s\n' "$MC_VERSION" "1.17" | sort -V | tail -n1 | grep -q "$MC_VERSION"; then
echo -e "Using unix_args.txt for versions 1.17 and above."
ln -sf libraries/net/minecraftforge/forge/${MC_VERSION}-${FORGE_VERSION}/unix_args.txt unix_args.txt
fi
echo -e "Downloading Forge for Minecraft ${MC_VERSION}"
FORGE_DL_LINK="https://maven.minecraftforge.net/net/minecraftforge/forge/${MC_VERSION}-${FORGE_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}-installer.jar"
echo -e "Forge download URL: ${FORGE_DL_LINK}"
curl -L --retry 5 --retry-delay 5 -o installer.jar ${FORGE_DL_LINK} || {
echo -e "Error: Failed to download Forge installer. URL attempted: ${FORGE_DL_LINK}"
exit 1
}
if ! java -jar installer.jar --installServer; then
echo -e "Error: Invalid or corrupt Forge installer. URL: ${FORGE_DL_LINK}"
exit 1
fi
rm installer.jar
SERVER_JAR_PATH=$(find . -type f -name "forge-*-universal.jar" | head -n 1)
if [[ -f "$SERVER_JAR_PATH" ]]; then
echo -e "Found Forge universal JAR: $SERVER_JAR_PATH"
cp "$SERVER_JAR_PATH" server.jar
cp "$SERVER_JAR_PATH" "${SERVER_JAR_PATH}.backup"
else
echo -e "Error: Universal Forge JAR not found. Installation failed."
exit 1
fi
echo -e "SpongeForge installation complete."