C
描述
用于CurseForge模组包的通用egg文件。
16 浏览
1 下载
2026-06-30
更新于 1 天前
预设配置详情
CurseForge 通用
这是一个用于 CurseForge 整合包的通用模板
你需要提供一个整合包的项目ID。例如,All the Mods 8 - ATM8 的项目ID是 520914。
该ID可以在整合包页面的右侧边栏 关于项目 部分找到。
你也可以选择指定一个文件ID。如果不指定文件ID,将使用最新版本。
例如,All the Mods 8 - ATM8 版本 1.0.17 的服务端包文件ID是 4504876。
该ID可以在整合包页面中点击所需文件后,从URL末尾复制(即 /files/ 后面的数字)。
脚本会根据整合包自动设置 Forge、Fabric 或 Quilt。
你必须指定一个 CurseForge API 密钥。
你可以通过此处创建开发者账户,然后点击"API 密钥"选项卡来获取API密钥。
服务器端口
Minecraft 服务器需要一个端口用于访问(默认25565),但插件可能需要为服务器启用额外端口。
| 端口 | 默认值 |
|---|---|
| 游戏 | 25565 |
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_8
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_11
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_16
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_17
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_21
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_25
java $([[ -f user_jvm_args.txt ]] && printf %s "@user_jvm_args.txt") -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true $([[ ! -f unix_args.txt ]] && printf %s "-jar `cat .serverjar`" || printf %s "@unix_args.txt")
| 变量名 | 变量 | 描述 | 默认值 | 规则 | 可查看 | 可编辑 |
|---|---|---|---|---|---|---|
| 模组包项目ID | PROJECT_ID |
整合包页面中来自CurseForge网站的整合包项目ID,如果从上传的server.zip文件安装则填写'zip'。 例如,https://www.curseforge.com/minecraft/modpacks/bofa-mods 的项目ID是375152 | |
required|string
必填 字符串
|
||
| 模组包文件ID | VERSION_ID |
属于模组包特定版本的文件ID。可以是主文件,也可以是服务器包关联的文件ID。 如果未提供,脚本将尝试获取最新的服务器包或客户端包。 | latest |
string
字符串
|
||
| CurseForge API 密钥 | API_KEY |
使用此egg需要CurseForge API密钥。该密钥对服务器所有者不可见。您可以在此处获取API密钥:https://console.curseforge.com | |
required|string|max:60
必填 字符串 最大 60
|
镜像
registry.cn-shanghai.aliyuncs.com/pterodactyl-images/installers:java_8
入口
bash
#!/bin/bash
# shellcheck disable=SC2155
#
# CurseForge Installation Script
#
# Server Files: /mnt/server
: "${SERVER_DIR:=/mnt/server}"
: "${PROJECT_ID:=}"
: "${VERSION_ID:=}"
: "${API_KEY:=}"
if [[ ! -d $SERVER_DIR ]]; then
mkdir -p "$SERVER_DIR"
fi
if ! cd "$SERVER_DIR"; then
echo -e "Failed to change directory to ${SERVER_DIR}"
exit 1
fi
function install_required {
echo -e "Installing required packages..."
echo -e "\tRunning apt update"
apt update > /dev/null 2>&1 || { echo "apt update failed!"; exit 1; }
echo -e "\tRunning apt install"
apt install -y wget jq unzip > /dev/null 2>&1 || { echo "apt install failed!"; exit 1; }
}
CURSEFORGE_API_URL="https://api.curseforge.com/v1/mods/"
CURSEFORGE_API_HEADERS=("--header=Accept: application/json" "--header=x-api-key: ${API_KEY}")
function get_download {
echo -e "Retrieving CurseForge project information..."
local PROJECT_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}" -O -)
local PROJECT_TITLE=$(echo "$PROJECT_DATA" | jq -r '.data.name // empty')
if [[ -z "${PROJECT_DATA}" ]]; then
echo -e "\tERROR: Failed to retrieve project data for project id '${PROJECT_ID}'"
exit 1
fi
local IS_SERVER_PACK=false
if [[ -z "${VERSION_ID}" || "${VERSION_ID}" == "latest" ]]; then
echo -e "\tNo file ID specified, using latest file"
VERSION_ID=$(echo "$PROJECT_DATA" | jq -r '.data.mainFileId // empty')
local VERSION_SERVER_PACK="$(echo -e "${PROJECT_DATA}" | jq -r --arg VERSION_ID "$VERSION_ID" '.data.latestFiles[] | select(.id|tostring==$VERSION_ID) | .isServerPack')"
local VERSION_SERVER_ID="$(echo -e "${PROJECT_DATA}" | jq -r --arg VERSION_ID "$VERSION_ID" '.data.latestFiles[] | select(.id|tostring==$VERSION_ID) | .serverPackFileId')"
if [[ "${VERSION_SERVER_PACK}" == "false" && -n "${VERSION_SERVER_ID}" ]]; then
echo -e "\tFound server pack file id '${VERSION_SERVER_ID}'"
VERSION_ID=$VERSION_SERVER_ID
IS_SERVER_PACK=true
elif [[ "${VERSION_SERVER_PACK}" == "true" ]]; then
IS_SERVER_PACK=true
fi
else
echo -e "\tChecking if provided file id '${VERSION_ID}' exists"
local FILE_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}" -O -)
if [[ -z "${FILE_DATA}" ]]; then
echo -e "\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'"
exit 1
fi
IS_SERVER_PACK=$(echo -e "${FILE_DATA}" | jq -r '.data.isServerPack // "false"')
if [[ "${IS_SERVER_PACK}" == "false" ]]; then
local VERSION_SERVER_PACK="$(echo -e "${FILE_DATA}" | jq -r '.data.serverPackFileId // empty')"
if [[ -n "${VERSION_SERVER_PACK}" ]]; then
echo -e "\tFound server pack file id '${VERSION_SERVER_PACK}'"
VERSION_ID=$VERSION_SERVER_PACK
IS_SERVER_PACK=true
fi
else
IS_SERVER_PACK=true
fi
fi
# Check if version id is unset or empty string
if [[ -z "${VERSION_ID}" ]]; then
echo -e "\tERROR: No file id found for project '${PROJECT_TITLE}'"
exit 1
fi
if [[ "${IS_SERVER_PACK}" == "false" ]]; then
echo -e "\tWARNING: File id '${VERSION_ID}' is not a server pack, attempting to use client files"
fi
# get json data to work with
echo -e "\tRetrieving version information for '${VERSION_ID}'"
local JSON_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}/download-url" -O -)
if [[ -z "${JSON_DATA}" ]]; then
echo -e "\tERROR: Failed to retrieve file data for file id '${VERSION_ID}'"
exit 1
fi
echo -e "\tParsing CurseForge pack download url"
local DOWNLOAD_URL=$(echo -e "$JSON_DATA" | jq -r '.data // empty')
if [[ -z "${DOWNLOAD_URL}" ]]; then
echo -e "\tERROR: No download url found for file ${VERSION_ID}"
exit 1
fi
# download modpack files
echo -e "\tDownloading ${DOWNLOAD_URL}"
if ! wget -q "${DOWNLOAD_URL}" -O server.zip; then
echo -e "Download failed!"
exit 1
fi
}
function get_loader {
echo -e "Retrieving loader information..."
local PROJECT_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}" -O -)
local PROJECT_TITLE=$(echo "$PROJECT_DATA" | jq -r '.data.name // empty')
if [[ -z "${PROJECT_DATA}" ]]; then
echo -e "\tERROR: Failed to retrieve project data for project id '${PROJECT_ID}'"
exit 1
fi
local FILE_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}" -O -)
if [[ -z "${FILE_DATA}" ]]; then
echo -e "\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'"
exit 1
fi
local IS_SERVER_PACK=$(echo -e "${FILE_DATA}" | jq -r '.data.isServerPack // "false"')
local CLIENT_VERSION_ID;
if [[ "${IS_SERVER_PACK}" == "true" ]]; then
CLIENT_VERSION_ID="$(echo -e "${FILE_DATA}" | jq -r '.data.parentProjectFileId // empty')"
else
CLIENT_VERSION_ID=$VERSION_ID
fi
if [[ -z "${CLIENT_VERSION_ID}" ]]; then
echo -e "\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'"
exit 1
fi
echo -e "\tRetrieving file information for '${CLIENT_VERSION_ID}'"
local JSON_DATA=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${PROJECT_ID}/files/${CLIENT_VERSION_ID}/download-url" -O -)
echo -e "\tParsing CurseForge pack download url"
local DOWNLOAD_URL=$(echo -e "$JSON_DATA" | jq -r '.data // empty')
if [[ -z "${DOWNLOAD_URL}" ]]; then
echo -e "\tERROR: No download url found for file id ${CLIENT_VERSION_ID}"
exit 1
fi
# download modpack files
echo -e "\tDownloading ${DOWNLOAD_URL}"
wget -q "${DOWNLOAD_URL}" -O client.zip
echo -e "\tUnpacking client manifest"
unzip -jo client.zip manifest.json -d "${SERVER_DIR}"
mv "${SERVER_DIR}/manifest.json" "${SERVER_DIR}/client.manifest.json" # rename to avoid conflicts with main manifest
rm -rf client.zip
echo -e "\tParsing client manifest"
local MANIFEST="${SERVER_DIR}/client.manifest.json"
LOADER_ID=$(jq -r '.minecraft.modLoaders[]? | select(.primary == true) | .id' "${MANIFEST}")
LOADER_NAME=$(echo "${LOADER_ID}" | cut -d'-' -f1)
LOADER_VERSION=$(echo "${LOADER_ID}" | cut -d'-' -f2)
if [[ -z "${LOADER_NAME}" || -z "${LOADER_VERSION}" ]]; then
echo -e "\tERROR: No loader found in client manifest!"
exit 1
fi
MINECRAFT_VERSION=$(jq -r '.minecraft.version // empty' "${MANIFEST}")
if [[ -z "${MINECRAFT_VERSION}" ]]; then
echo -e "\tERROR: No minecraft version found in client manifest!"
exit 1
fi
echo -e "\tFound loader ${LOADER_NAME} ${LOADER_VERSION} for Minecraft ${MINECRAFT_VERSION}"
}
function unzip-strip() (
set -u
local archive=$1
local destdir=${2:-}
shift; shift || :
echo -e "\tUnpacking ${archive} to ${destdir}"
echo -e "\tCreating temporary directory"
local tmpdir=/mnt/server/tmp
if ! mkdir -p "${tmpdir}"; then
echo -e "\tERROR: mkdir failed to create temporary directory"
return 1
fi
trap 'rm -rf -- "$tmpdir"' EXIT
echo -e "\tUnpacking archive"
if ! unzip -q "$archive" -d "$tmpdir"; then
echo -e "\tERROR: unzip failed to unpack archive"
return 1
fi
echo -e "\tSetting glob settings"
shopt -s dotglob
echo -e "\tCleaning up directory structure"
local files=("$tmpdir"/*) name i=1
if (( ${#files[@]} == 1 )) && [[ -d "${files[0]}" ]]; then
name=$(basename "${files[0]}")
files=("$tmpdir"/*/*)
else
name=$(basename "$archive"); name=${archive%.*}
files=("$tmpdir"/*)
fi
if [[ -z "$destdir" ]]; then
destdir=./"$name"
fi
while [[ -f "$destdir" ]]; do
destdir=${destdir}-$((i++));
done
echo -e "\tCopying files to ${destdir}"
mkdir -p "$destdir"
cp -ar "$@" -t "$destdir" -- "${files[@]}"
rm -rf "$tmpdir"
)
function unpack_zip {
echo -e "Unpacking server files..."
unzip-strip server.zip "${SERVER_DIR}"
rm -rf server.zip
}
function json_download_mods {
echo "Downloading mods..."
local MANIFEST="${SERVER_DIR}/manifest.json"
jq -c '.files[]? | select(.required == true) | {project: .projectID, file: .fileID}' "${MANIFEST}" | while read -r mod; do
local MOD_PROJECT_ID=$(echo "${mod}" | jq -r '.project // empty')
local MOD_FILE_ID=$(echo "${mod}" | jq -r '.file // empty')
if [[ -z "${MOD_PROJECT_ID}" || -z "${MOD_FILE_ID}" ]]; then
echo -e "\tERROR: Failed to parse project id or file id for mod '${mod}'"
exit 1
fi
local FILE_URL=$(wget -q "${CURSEFORGE_API_HEADERS[@]}" "${CURSEFORGE_API_URL}${MOD_PROJECT_ID}/files/${MOD_FILE_ID}/download-url" -O - | jq -r '.data // empty')
if [[ -z "${FILE_URL}" ]]; then
echo -e "\tERROR: No download url found for mod ${MOD_PROJECT_ID} ${MOD_FILE_ID}"
continue
fi
echo -e "\tDownloading ${FILE_URL}"
if ! wget -q -nc "${FILE_URL}" -P "${SERVER_DIR}/mods"; then
echo -e "\tERROR: Failed to download mod ${MOD_PROJECT_ID} ${MOD_FILE_ID}"
exit 1
fi
done
}
function json_download_overrides {
echo "Copying overrides..."
if [[ -d "${SERVER_DIR}/overrides" ]]; then
cp -r "${SERVER_DIR}/overrides/"* "${SERVER_DIR}"
rm -r "${SERVER_DIR}/overrides"
fi
}
FORGE_INSTALLER_URL="https://maven.minecraftforge.net/net/minecraftforge/forge/"
function json_download_forge {
echo "Downloading Forge..."
local MC_VERSION=$MINECRAFT_VERSION
local FORGE_VERSION=$LOADER_VERSION
FORGE_VERSION="${MC_VERSION}-${FORGE_VERSION}"
if [[ "${MC_VERSION}" == "1.7.10" || "${MC_VERSION}" == "1.8.9" ]]; then
FORGE_VERSION="${FORGE_VERSION}-${MC_VERSION}"
fi
local FORGE_JAR="forge-${FORGE_VERSION}.jar"
if [[ "${MC_VERSION}" == "1.7.10" ]]; then
FORGE_JAR="forge-${FORGE_VERSION}-universal.jar"
fi
local FORGE_URL="${FORGE_INSTALLER_URL}${FORGE_VERSION}/forge-${FORGE_VERSION}"
echo -e "\tUsing Forge ${FORGE_VERSION} from ${FORGE_URL}"
local FORGE_INSTALLER="${FORGE_URL}-installer.jar"
echo -e "\tDownloading Forge Installer ${FORGE_VERSION} from ${FORGE_INSTALLER}"
if ! wget -q -O forge-installer.jar "${FORGE_INSTALLER}"; then
echo -e "\tERROR: Failed to download Forge Installer ${FORGE_VERSION}"
exit 1
fi
# Remove old Forge files so we can safely update
rm -rf libraries/net/minecraftforge/forge/
rm -f unix_args.txt
echo -e "\tInstalling Forge Server ${FORGE_VERSION}"
if ! java -jar forge-installer.jar --installServer > /dev/null 2>&1; then
echo -e "\tERROR: Failed to install Forge Server ${FORGE_VERSION}"
exit 1
fi
if [[ $MC_VERSION =~ ^1\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\.(17|18|19|20|21|22|23) ]]; then
echo -e "\tDetected Forge 1.17 or newer version. Setting up Forge Unix arguments"
ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt
else
mv "$FORGE_JAR" forge-server-launch.jar
echo "forge-server-launch.jar" > ".serverjar"
fi
rm -f forge-installer.jar
}
FABRIC_INSTALLER_URL="https://meta.fabricmc.net/v2/versions/installer"
function json_download_fabric {
echo "Downloading Fabric..."
local MC_VERSION=$MINECRAFT_VERSION
local FABRIC_VERSION=$LOADER_VERSION
local INSTALLER_JSON=$(wget -q -O - ${FABRIC_INSTALLER_URL} )
local INSTALLER_VERSION=$(echo "$INSTALLER_JSON" | jq -r '.[0].version // empty')
local INSTALLER_URL=$(echo "$INSTALLER_JSON" | jq -r '.[0].url // empty')
if [[ -z "${INSTALLER_VERSION}" ]]; then
echo -e "\tERROR: No Fabric installer version found"
exit 1
fi
if [[ -z "${INSTALLER_URL}" ]]; then
echo -e "\tERROR: No Fabric installer url found"
exit 1
fi
echo -e "\tDownloading Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}"
if ! wget -q -O fabric-installer.jar "${INSTALLER_URL}"; then
echo -e "\tERROR: Failed to download Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo -e "\tInstalling Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
if ! java -jar fabric-installer.jar server -mcversion "${MC_VERSION}" -loader "${FABRIC_VERSION}" -downloadMinecraft; then
echo -e "\tERROR: Failed to install Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo "fabric-server-launch.jar" > ".serverjar"
rm -f fabric-installer.jar
}
QUILT_INSTALLER_URL="https://meta.quiltmc.org/v3/versions/installer"
function json_download_quilt {
echo "Downloading Quilt..."
local MC_VERSION=$MINECRAFT_VERSION
local QUILT_VERSION=$LOADER_VERSION
local INSTALLER_JSON=$(wget -q -O - ${QUILT_INSTALLER_URL} )
local INSTALLER_VERSION=$(echo "$INSTALLER_JSON" | jq -r '.[0].version // empty')
local INSTALLER_URL=$(echo "$INSTALLER_JSON" | jq -r '.[0].url // empty')
if [[ -z "${INSTALLER_VERSION}" ]]; then
echo -e "\tERROR: No Quilt installer version found"
exit 1
fi
if [[ -z "${INSTALLER_URL}" ]]; then
echo -e "\tERROR: No Quilt installer URL found"
exit 1
fi
echo -e "\tDownloading Quilt Installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}"
if ! wget -q -O quilt-installer.jar "${INSTALLER_URL}"; then
echo -e "\tERROR: Failed to download Quilt Installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo -e "\tInstalling Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
if ! java -jar quilt-installer.jar install server "${MC_VERSION}" "${QUILT_VERSION}" --download-server --install-dir=./; then
echo -e "\tERROR: Failed to install Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})"
exit 1
fi
echo "quilt-server-launch.jar" > ".serverjar"
rm quilt-installer.jar
}
NEOFORGE_DOWNLOAD_URL="https://maven.neoforged.net/releases/net/neoforged/"
function json_download_neoforge {
echo "Downloading neoforge"
local MC_VERSION=$MINECRAFT_VERSION
local NEOFORGE_VERSION=$LOADER_VERSION
if [[ ! -z ${NEOFORGE_VERSION} ]]; then
# The 1.20.1 release lives in a different repository and is called "forge" instead of "neoforge"
if [[ "${NEOFORGE_VERSION}" =~ "1.20.1-" ]]; then
DOWNLOAD_LINK=$NEOFORGE_DOWNLOAD_URL/forge/${NEOFORGE_VERSION}/forge-${NEOFORGE_VERSION}
ARTIFACT_NAME="forge"
else
DOWNLOAD_LINK=$NEOFORGE_DOWNLOAD_URL/neoforge/${NEOFORGE_VERSION}/neoforge-${NEOFORGE_VERSION}
ARTIFACT_NAME="neoforge"
fi
else
echo "No Neoforge version specified in manifest"
exit 1
fi
echo "Downloading NeoForge version ${NEOFORGE_VERSION}"
echo "Download link is ${DOWNLOAD_LINK}"
# Check if the download link we generated is valid
if [[ ! -z "${DOWNLOAD_LINK}" ]]; then
if wget -q --spider ${DOWNLOAD_LINK}-installer.jar; then
echo -e "Installer jar download link is valid."
else
echo -e "Link is invalid. Exiting now"
exit 2
fi
else
echo -e "No download link provided. Exiting now"
exit 3
fi
# If so, go ahead and download the installer
wget -O installer.jar ${DOWNLOAD_LINK}-installer.jar
if [[ ! -f ./installer.jar ]]; then
echo "!!! Error downloading NeoForge version ${NEOFORGE_VERSION} !!!"
exit 4
fi
# Delete args to support downgrading/upgrading
rm -rf libraries/net/neoforged/${ARTIFACT_NAME}
rm unix_args.txt
# Installing server
echo -e "Installing NeoForge server.
"
java -jar installer.jar --installServer || {
echo -e "
Install failed using NeoForge version ${NEOFORGE_VERSION} and Minecraft version ${MINECRAFT_VERSION}."
echo -n "Should you be using unlimited memory value of 0, make sure to increase the default install resource limits in the Wings"
echo "config or specify exact allocated memory in the server Build Configuration instead of 0!"
echo "Otherwise, the NeoForge installer will not have enough memory.";
exit 5;
}
# Symlink the startup arguments to the server directory
ln -sf libraries/net/neoforged/${ARTIFACT_NAME}/*/unix_args.txt unix_args.txt
# And finally clean up
echo -e "Deleting installer.jar file.
"
rm -rf installer.jar
}
install_required
if [[ -z "${PROJECT_ID}" ]]; then
echo "ERROR: You must specify a PROJECT_ID environment variable!"
exit 1
fi
if [[ ! "${PROJECT_ID}" = "zip" ]]; then
get_download
fi
get_loader
unpack_zip
if [[ -f "${SERVER_DIR}/manifest.json" ]]; then
echo "Found manifest.json, installing mods"
json_download_mods
json_download_overrides
fi
if [[ -f "${SERVER_DIR}/client.manifest.json" ]]; then
MANIFEST="${SERVER_DIR}/client.manifest.json"
echo -e "
Loader name: ${LOADER_NAME}"
if [[ $LOADER_NAME == "forge" ]]; then
json_download_forge
fi
if [[ $LOADER_NAME == "fabric" ]]; then
json_download_fabric
fi
if [[ $LOADER_NAME == "neoforge" ]]; then
json_download_neoforge
fi
if [[ $LOADER_NAME == "quilt" ]]; then
json_download_quilt
fi
fi
echo -e "
Install completed succesfully, enjoy!"
{
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
"meta": {
"version": "PTDL_v2",
"update_url": "https://eggs.pterodactyl.top/eggs/152/download/egg-curseforge-generic.json"
},
"exported_at": "2025-05-27T11:05:16-07:00",
"name": "CurseForge Generic",
"author": "contact@chromozone.dev",
"description": "用于CurseForge模组包的通用egg文件。",
"features": [
"eula",
"java_version",
"pid_limit"
],
"docker_images": {
"Java 8": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_8",
"Java 11": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_11",
"Java 16": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_16",
"Java 17": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_17",
"Java 21": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_21",
"Java 25": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/yolks:java_25"
},
"file_denylist": [],
"startup": "java $([[ -f user_jvm_args.txt ]] && printf %s \"@user_jvm_args.txt\") -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true $([[ ! -f unix_args.txt ]] && printf %s \"-jar `cat .serverjar`\" || printf %s \"@unix_args.txt\")",
"config": {
"files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}",
"startup": "{\r\n \"done\": \")! For help, type \"\r\n}",
"logs": "{}",
"stop": "stop"
},
"scripts": {
"installation": {
"script": "#!/bin/bash\r\n# shellcheck disable=SC2155\r\n#\r\n# CurseForge Installation Script\r\n#\r\n# Server Files: /mnt/server\r\n\r\n: \"${SERVER_DIR:=/mnt/server}\"\r\n: \"${PROJECT_ID:=}\"\r\n: \"${VERSION_ID:=}\"\r\n: \"${API_KEY:=}\"\r\n\r\nif [[ ! -d $SERVER_DIR ]]; then\r\n mkdir -p \"$SERVER_DIR\"\r\nfi\r\n\r\nif ! cd \"$SERVER_DIR\"; then\r\n echo -e \"Failed to change directory to ${SERVER_DIR}\"\r\n exit 1\r\nfi\r\n\r\nfunction install_required {\r\n echo -e \"Installing required packages...\"\r\n echo -e \"\\tRunning apt update\"\r\n apt update > /dev/null 2>&1 || { echo \"apt update failed!\"; exit 1; }\r\n echo -e \"\\tRunning apt install\"\r\n apt install -y wget jq unzip > /dev/null 2>&1 || { echo \"apt install failed!\"; exit 1; }\r\n}\r\n\r\nCURSEFORGE_API_URL=\"https://api.curseforge.com/v1/mods/\"\r\nCURSEFORGE_API_HEADERS=(\"--header=Accept: application/json\" \"--header=x-api-key: ${API_KEY}\")\r\n\r\nfunction get_download {\r\n echo -e \"Retrieving CurseForge project information...\"\r\n local PROJECT_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}\" -O -)\r\n local PROJECT_TITLE=$(echo \"$PROJECT_DATA\" | jq -r '.data.name // empty')\r\n\r\n if [[ -z \"${PROJECT_DATA}\" ]]; then\r\n echo -e \"\\tERROR: Failed to retrieve project data for project id '${PROJECT_ID}'\"\r\n exit 1\r\n fi\r\n\r\n local IS_SERVER_PACK=false\r\n\r\n if [[ -z \"${VERSION_ID}\" || \"${VERSION_ID}\" == \"latest\" ]]; then\r\n echo -e \"\\tNo file ID specified, using latest file\"\r\n VERSION_ID=$(echo \"$PROJECT_DATA\" | jq -r '.data.mainFileId // empty')\r\n\r\n local VERSION_SERVER_PACK=\"$(echo -e \"${PROJECT_DATA}\" | jq -r --arg VERSION_ID \"$VERSION_ID\" '.data.latestFiles[] | select(.id|tostring==$VERSION_ID) | .isServerPack')\"\r\n local VERSION_SERVER_ID=\"$(echo -e \"${PROJECT_DATA}\" | jq -r --arg VERSION_ID \"$VERSION_ID\" '.data.latestFiles[] | select(.id|tostring==$VERSION_ID) | .serverPackFileId')\"\r\n\r\n if [[ \"${VERSION_SERVER_PACK}\" == \"false\" && -n \"${VERSION_SERVER_ID}\" ]]; then\r\n echo -e \"\\tFound server pack file id '${VERSION_SERVER_ID}'\"\r\n VERSION_ID=$VERSION_SERVER_ID\r\n IS_SERVER_PACK=true\r\n elif [[ \"${VERSION_SERVER_PACK}\" == \"true\" ]]; then\r\n IS_SERVER_PACK=true\r\n fi\r\n else\r\n echo -e \"\\tChecking if provided file id '${VERSION_ID}' exists\"\r\n\r\n local FILE_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}\" -O -)\r\n\r\n if [[ -z \"${FILE_DATA}\" ]]; then\r\n echo -e \"\\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'\"\r\n exit 1\r\n fi\r\n\r\n IS_SERVER_PACK=$(echo -e \"${FILE_DATA}\" | jq -r '.data.isServerPack // \"false\"')\r\n\r\n if [[ \"${IS_SERVER_PACK}\" == \"false\" ]]; then\r\n local VERSION_SERVER_PACK=\"$(echo -e \"${FILE_DATA}\" | jq -r '.data.serverPackFileId // empty')\"\r\n if [[ -n \"${VERSION_SERVER_PACK}\" ]]; then\r\n echo -e \"\\tFound server pack file id '${VERSION_SERVER_PACK}'\"\r\n VERSION_ID=$VERSION_SERVER_PACK\r\n IS_SERVER_PACK=true\r\n fi\r\n else\r\n IS_SERVER_PACK=true\r\n fi\r\n fi\r\n\r\n # Check if version id is unset or empty string\r\n if [[ -z \"${VERSION_ID}\" ]]; then\r\n echo -e \"\\tERROR: No file id found for project '${PROJECT_TITLE}'\"\r\n exit 1\r\n fi\r\n\r\n if [[ \"${IS_SERVER_PACK}\" == \"false\" ]]; then\r\n echo -e \"\\tWARNING: File id '${VERSION_ID}' is not a server pack, attempting to use client files\"\r\n fi\r\n\r\n # get json data to work with\r\n echo -e \"\\tRetrieving version information for '${VERSION_ID}'\"\r\n local JSON_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}/download-url\" -O -)\r\n\r\n if [[ -z \"${JSON_DATA}\" ]]; then\r\n echo -e \"\\tERROR: Failed to retrieve file data for file id '${VERSION_ID}'\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tParsing CurseForge pack download url\"\r\n\r\n local DOWNLOAD_URL=$(echo -e \"$JSON_DATA\" | jq -r '.data // empty')\r\n if [[ -z \"${DOWNLOAD_URL}\" ]]; then\r\n echo -e \"\\tERROR: No download url found for file ${VERSION_ID}\"\r\n exit 1\r\n fi\r\n\r\n # download modpack files\r\n echo -e \"\\tDownloading ${DOWNLOAD_URL}\"\r\n if ! wget -q \"${DOWNLOAD_URL}\" -O server.zip; then\r\n echo -e \"Download failed!\"\r\n exit 1\r\n fi\r\n}\r\n\r\nfunction get_loader {\r\n echo -e \"Retrieving loader information...\"\r\n\r\n local PROJECT_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}\" -O -)\r\n local PROJECT_TITLE=$(echo \"$PROJECT_DATA\" | jq -r '.data.name // empty')\r\n if [[ -z \"${PROJECT_DATA}\" ]]; then\r\n echo -e \"\\tERROR: Failed to retrieve project data for project id '${PROJECT_ID}'\"\r\n exit 1\r\n fi\r\n\r\n local FILE_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}/files/${VERSION_ID}\" -O -)\r\n\r\n if [[ -z \"${FILE_DATA}\" ]]; then\r\n echo -e \"\\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'\"\r\n exit 1\r\n fi\r\n\r\n local IS_SERVER_PACK=$(echo -e \"${FILE_DATA}\" | jq -r '.data.isServerPack // \"false\"')\r\n local CLIENT_VERSION_ID;\r\n\r\n if [[ \"${IS_SERVER_PACK}\" == \"true\" ]]; then\r\n CLIENT_VERSION_ID=\"$(echo -e \"${FILE_DATA}\" | jq -r '.data.parentProjectFileId // empty')\"\r\n else\r\n CLIENT_VERSION_ID=$VERSION_ID\r\n fi\r\n\r\n if [[ -z \"${CLIENT_VERSION_ID}\" ]]; then\r\n echo -e \"\\tERROR: File id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tRetrieving file information for '${CLIENT_VERSION_ID}'\"\r\n local JSON_DATA=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${PROJECT_ID}/files/${CLIENT_VERSION_ID}/download-url\" -O -)\r\n\r\n echo -e \"\\tParsing CurseForge pack download url\"\r\n\r\n local DOWNLOAD_URL=$(echo -e \"$JSON_DATA\" | jq -r '.data // empty')\r\n\r\n if [[ -z \"${DOWNLOAD_URL}\" ]]; then\r\n echo -e \"\\tERROR: No download url found for file id ${CLIENT_VERSION_ID}\"\r\n exit 1\r\n fi\r\n\r\n # download modpack files\r\n echo -e \"\\tDownloading ${DOWNLOAD_URL}\"\r\n wget -q \"${DOWNLOAD_URL}\" -O client.zip\r\n\r\n echo -e \"\\tUnpacking client manifest\"\r\n unzip -jo client.zip manifest.json -d \"${SERVER_DIR}\"\r\n mv \"${SERVER_DIR}/manifest.json\" \"${SERVER_DIR}/client.manifest.json\" # rename to avoid conflicts with main manifest\r\n rm -rf client.zip\r\n\r\n echo -e \"\\tParsing client manifest\"\r\n local MANIFEST=\"${SERVER_DIR}/client.manifest.json\"\r\n\r\n LOADER_ID=$(jq -r '.minecraft.modLoaders[]? | select(.primary == true) | .id' \"${MANIFEST}\")\r\n LOADER_NAME=$(echo \"${LOADER_ID}\" | cut -d'-' -f1)\r\n LOADER_VERSION=$(echo \"${LOADER_ID}\" | cut -d'-' -f2)\r\n\r\n if [[ -z \"${LOADER_NAME}\" || -z \"${LOADER_VERSION}\" ]]; then\r\n echo -e \"\\tERROR: No loader found in client manifest!\"\r\n exit 1\r\n fi\r\n\r\n MINECRAFT_VERSION=$(jq -r '.minecraft.version // empty' \"${MANIFEST}\")\r\n\r\n if [[ -z \"${MINECRAFT_VERSION}\" ]]; then\r\n echo -e \"\\tERROR: No minecraft version found in client manifest!\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tFound loader ${LOADER_NAME} ${LOADER_VERSION} for Minecraft ${MINECRAFT_VERSION}\"\r\n}\r\n\r\nfunction unzip-strip() (\r\n set -u\r\n\r\n local archive=$1\r\n local destdir=${2:-}\r\n shift; shift || :\r\n echo -e \"\\tUnpacking ${archive} to ${destdir}\"\r\n\r\n echo -e \"\\tCreating temporary directory\"\r\n local tmpdir=/mnt/server/tmp\r\n if ! mkdir -p \"${tmpdir}\"; then\r\n echo -e \"\\tERROR: mkdir failed to create temporary directory\"\r\n return 1\r\n fi\r\n\r\n trap 'rm -rf -- \"$tmpdir\"' EXIT\r\n\r\n echo -e \"\\tUnpacking archive\"\r\n\r\n if ! unzip -q \"$archive\" -d \"$tmpdir\"; then\r\n echo -e \"\\tERROR: unzip failed to unpack archive\"\r\n return 1\r\n fi\r\n\r\n echo -e \"\\tSetting glob settings\"\r\n\r\n shopt -s dotglob\r\n\r\n echo -e \"\\tCleaning up directory structure\"\r\n\r\n local files=(\"$tmpdir\"/*) name i=1\r\n\r\n if (( ${#files[@]} == 1 )) && [[ -d \"${files[0]}\" ]]; then\r\n name=$(basename \"${files[0]}\")\r\n files=(\"$tmpdir\"/*/*)\r\n else\r\n name=$(basename \"$archive\"); name=${archive%.*}\r\n files=(\"$tmpdir\"/*)\r\n fi\r\n\r\n if [[ -z \"$destdir\" ]]; then\r\n destdir=./\"$name\"\r\n fi\r\n\r\n while [[ -f \"$destdir\" ]]; do\r\n destdir=${destdir}-$((i++));\r\n done\r\n\r\n echo -e \"\\tCopying files to ${destdir}\"\r\n\r\n mkdir -p \"$destdir\"\r\n cp -ar \"$@\" -t \"$destdir\" -- \"${files[@]}\"\r\n rm -rf \"$tmpdir\"\r\n)\r\n\r\nfunction unpack_zip {\r\n echo -e \"Unpacking server files...\"\r\n unzip-strip server.zip \"${SERVER_DIR}\"\r\n rm -rf server.zip\r\n}\r\n\r\nfunction json_download_mods {\r\n echo \"Downloading mods...\"\r\n\r\n local MANIFEST=\"${SERVER_DIR}/manifest.json\"\r\n jq -c '.files[]? | select(.required == true) | {project: .projectID, file: .fileID}' \"${MANIFEST}\" | while read -r mod; do\r\n local MOD_PROJECT_ID=$(echo \"${mod}\" | jq -r '.project // empty')\r\n local MOD_FILE_ID=$(echo \"${mod}\" | jq -r '.file // empty')\r\n\r\n if [[ -z \"${MOD_PROJECT_ID}\" || -z \"${MOD_FILE_ID}\" ]]; then\r\n echo -e \"\\tERROR: Failed to parse project id or file id for mod '${mod}'\"\r\n exit 1\r\n fi\r\n\r\n local FILE_URL=$(wget -q \"${CURSEFORGE_API_HEADERS[@]}\" \"${CURSEFORGE_API_URL}${MOD_PROJECT_ID}/files/${MOD_FILE_ID}/download-url\" -O - | jq -r '.data // empty')\r\n\r\n if [[ -z \"${FILE_URL}\" ]]; then\r\n echo -e \"\\tERROR: No download url found for mod ${MOD_PROJECT_ID} ${MOD_FILE_ID}\"\r\n continue\r\n fi\r\n\r\n echo -e \"\\tDownloading ${FILE_URL}\"\r\n\r\n if ! wget -q -nc \"${FILE_URL}\" -P \"${SERVER_DIR}/mods\"; then\r\n echo -e \"\\tERROR: Failed to download mod ${MOD_PROJECT_ID} ${MOD_FILE_ID}\"\r\n exit 1\r\n fi\r\n done\r\n}\r\n\r\nfunction json_download_overrides {\r\n echo \"Copying overrides...\"\r\n if [[ -d \"${SERVER_DIR}/overrides\" ]]; then\r\n cp -r \"${SERVER_DIR}/overrides/\"* \"${SERVER_DIR}\"\r\n rm -r \"${SERVER_DIR}/overrides\"\r\n fi\r\n}\r\n\r\nFORGE_INSTALLER_URL=\"https://maven.minecraftforge.net/net/minecraftforge/forge/\"\r\n\r\nfunction json_download_forge {\r\n echo \"Downloading Forge...\"\r\n\r\n local MC_VERSION=$MINECRAFT_VERSION\r\n local FORGE_VERSION=$LOADER_VERSION\r\n\r\n FORGE_VERSION=\"${MC_VERSION}-${FORGE_VERSION}\"\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" || \"${MC_VERSION}\" == \"1.8.9\" ]]; then\r\n FORGE_VERSION=\"${FORGE_VERSION}-${MC_VERSION}\"\r\n fi\r\n\r\n local FORGE_JAR=\"forge-${FORGE_VERSION}.jar\"\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" ]]; then\r\n FORGE_JAR=\"forge-${FORGE_VERSION}-universal.jar\"\r\n fi\r\n\r\n local FORGE_URL=\"${FORGE_INSTALLER_URL}${FORGE_VERSION}/forge-${FORGE_VERSION}\"\r\n\r\n echo -e \"\\tUsing Forge ${FORGE_VERSION} from ${FORGE_URL}\"\r\n\r\n local FORGE_INSTALLER=\"${FORGE_URL}-installer.jar\"\r\n echo -e \"\\tDownloading Forge Installer ${FORGE_VERSION} from ${FORGE_INSTALLER}\"\r\n\r\n if ! wget -q -O forge-installer.jar \"${FORGE_INSTALLER}\"; then\r\n echo -e \"\\tERROR: Failed to download Forge Installer ${FORGE_VERSION}\"\r\n exit 1\r\n fi\r\n\r\n # Remove old Forge files so we can safely update\r\n rm -rf libraries/net/minecraftforge/forge/\r\n rm -f unix_args.txt\r\n\r\n echo -e \"\\tInstalling Forge Server ${FORGE_VERSION}\"\r\n if ! java -jar forge-installer.jar --installServer > /dev/null 2>&1; then\r\n echo -e \"\\tERROR: Failed to install Forge Server ${FORGE_VERSION}\"\r\n exit 1\r\n fi\r\n\r\n if [[ $MC_VERSION =~ ^1\\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\r\n echo -e \"\\tDetected Forge 1.17 or newer version. Setting up Forge Unix arguments\"\r\n ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt\r\n else\r\n mv \"$FORGE_JAR\" forge-server-launch.jar\r\n echo \"forge-server-launch.jar\" > \".serverjar\"\r\n fi\r\n\r\n rm -f forge-installer.jar\r\n}\r\n\r\nFABRIC_INSTALLER_URL=\"https://meta.fabricmc.net/v2/versions/installer\"\r\n\r\nfunction json_download_fabric {\r\n echo \"Downloading Fabric...\"\r\n\r\n local MC_VERSION=$MINECRAFT_VERSION\r\n local FABRIC_VERSION=$LOADER_VERSION\r\n\r\n local INSTALLER_JSON=$(wget -q -O - ${FABRIC_INSTALLER_URL} )\r\n local INSTALLER_VERSION=$(echo \"$INSTALLER_JSON\" | jq -r '.[0].version // empty')\r\n local INSTALLER_URL=$(echo \"$INSTALLER_JSON\" | jq -r '.[0].url // empty')\r\n\r\n if [[ -z \"${INSTALLER_VERSION}\" ]]; then\r\n echo -e \"\\tERROR: No Fabric installer version found\"\r\n exit 1\r\n fi\r\n\r\n if [[ -z \"${INSTALLER_URL}\" ]]; then\r\n echo -e \"\\tERROR: No Fabric installer url found\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tDownloading Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}\"\r\n\r\n if ! wget -q -O fabric-installer.jar \"${INSTALLER_URL}\"; then\r\n echo -e \"\\tERROR: Failed to download Fabric Installer ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tInstalling Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})\"\r\n if ! java -jar fabric-installer.jar server -mcversion \"${MC_VERSION}\" -loader \"${FABRIC_VERSION}\" -downloadMinecraft; then\r\n echo -e \"\\tERROR: Failed to install Fabric Server ${MC_VERSION}-${FABRIC_VERSION} (${INSTALLER_VERSION})\"\r\n exit 1\r\n fi\r\n\r\n echo \"fabric-server-launch.jar\" > \".serverjar\"\r\n\r\n rm -f fabric-installer.jar\r\n}\r\n\r\nQUILT_INSTALLER_URL=\"https://meta.quiltmc.org/v3/versions/installer\"\r\n\r\nfunction json_download_quilt {\r\n echo \"Downloading Quilt...\"\r\n\r\n local MC_VERSION=$MINECRAFT_VERSION\r\n local QUILT_VERSION=$LOADER_VERSION\r\n\r\n local INSTALLER_JSON=$(wget -q -O - ${QUILT_INSTALLER_URL} )\r\n local INSTALLER_VERSION=$(echo \"$INSTALLER_JSON\" | jq -r '.[0].version // empty')\r\n local INSTALLER_URL=$(echo \"$INSTALLER_JSON\" | jq -r '.[0].url // empty')\r\n\r\n if [[ -z \"${INSTALLER_VERSION}\" ]]; then\r\n echo -e \"\\tERROR: No Quilt installer version found\"\r\n exit 1\r\n fi\r\n\r\n if [[ -z \"${INSTALLER_URL}\" ]]; then\r\n echo -e \"\\tERROR: No Quilt installer URL found\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tDownloading Quilt Installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION}) from ${INSTALLER_URL}\"\r\n\r\n if ! wget -q -O quilt-installer.jar \"${INSTALLER_URL}\"; then\r\n echo -e \"\\tERROR: Failed to download Quilt Installer ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})\"\r\n exit 1\r\n fi\r\n\r\n echo -e \"\\tInstalling Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})\"\r\n if ! java -jar quilt-installer.jar install server \"${MC_VERSION}\" \"${QUILT_VERSION}\" --download-server --install-dir=./; then\r\n echo -e \"\\tERROR: Failed to install Quilt Server ${MC_VERSION}-${QUILT_VERSION} (${INSTALLER_VERSION})\"\r\n exit 1\r\n fi\r\n\r\n echo \"quilt-server-launch.jar\" > \".serverjar\"\r\n\r\n rm quilt-installer.jar\r\n}\r\n\r\nNEOFORGE_DOWNLOAD_URL=\"https://maven.neoforged.net/releases/net/neoforged/\"\r\n\r\nfunction json_download_neoforge {\r\n echo \"Downloading neoforge\"\r\n \r\n local MC_VERSION=$MINECRAFT_VERSION\r\n local NEOFORGE_VERSION=$LOADER_VERSION\r\n \r\n if [[ ! -z ${NEOFORGE_VERSION} ]]; then\r\n # The 1.20.1 release lives in a different repository and is called \"forge\" instead of \"neoforge\"\r\n if [[ \"${NEOFORGE_VERSION}\" =~ \"1.20.1-\" ]]; then\r\n DOWNLOAD_LINK=$NEOFORGE_DOWNLOAD_URL/forge/${NEOFORGE_VERSION}/forge-${NEOFORGE_VERSION}\r\n ARTIFACT_NAME=\"forge\"\r\n else\r\n DOWNLOAD_LINK=$NEOFORGE_DOWNLOAD_URL/neoforge/${NEOFORGE_VERSION}/neoforge-${NEOFORGE_VERSION}\r\n ARTIFACT_NAME=\"neoforge\"\r\n fi\r\n else\r\n echo \"No Neoforge version specified in manifest\"\r\n exit 1\r\n fi\r\n \r\n echo \"Downloading NeoForge version ${NEOFORGE_VERSION}\"\r\n echo \"Download link is ${DOWNLOAD_LINK}\"\r\n\r\n # Check if the download link we generated is valid\r\n if [[ ! -z \"${DOWNLOAD_LINK}\" ]]; then\r\n if wget -q --spider ${DOWNLOAD_LINK}-installer.jar; then\r\n echo -e \"Installer jar download link is valid.\"\r\n else\r\n echo -e \"Link is invalid. Exiting now\"\r\n exit 2\r\n fi\r\n else\r\n echo -e \"No download link provided. Exiting now\"\r\n exit 3\r\n fi\r\n \r\n # If so, go ahead and download the installer\r\n wget -O installer.jar ${DOWNLOAD_LINK}-installer.jar\r\n \r\n if [[ ! -f ./installer.jar ]]; then\r\n echo \"!!! Error downloading NeoForge version ${NEOFORGE_VERSION} !!!\"\r\n exit 4\r\n fi\r\n \r\n # Delete args to support downgrading/upgrading\r\n rm -rf libraries/net/neoforged/${ARTIFACT_NAME}\r\n rm unix_args.txt\r\n\r\n # Installing server\r\n echo -e \"Installing NeoForge server.\\n\"\r\n java -jar installer.jar --installServer || {\r\n echo -e \"\\nInstall failed using NeoForge version ${NEOFORGE_VERSION} and Minecraft version ${MINECRAFT_VERSION}.\"\r\n echo -n \"Should you be using unlimited memory value of 0, make sure to increase the default install resource limits in the Wings\"\r\n echo \"config or specify exact allocated memory in the server Build Configuration instead of 0!\"\r\n echo \"Otherwise, the NeoForge installer will not have enough memory.\";\r\n exit 5;\r\n }\r\n\r\n # Symlink the startup arguments to the server directory\r\n ln -sf libraries/net/neoforged/${ARTIFACT_NAME}/*/unix_args.txt unix_args.txt\r\n\r\n # And finally clean up\r\n echo -e \"Deleting installer.jar file.\\n\"\r\n rm -rf installer.jar\r\n}\r\n\r\ninstall_required\r\n\r\nif [[ -z \"${PROJECT_ID}\" ]]; then\r\n echo \"ERROR: You must specify a PROJECT_ID environment variable!\"\r\n exit 1\r\nfi\r\n\r\nif [[ ! \"${PROJECT_ID}\" = \"zip\" ]]; then\r\n\tget_download\r\nfi\r\n\r\nget_loader\r\nunpack_zip\r\n\r\nif [[ -f \"${SERVER_DIR}/manifest.json\" ]]; then\r\n echo \"Found manifest.json, installing mods\"\r\n json_download_mods\r\n json_download_overrides\r\nfi\r\n\r\nif [[ -f \"${SERVER_DIR}/client.manifest.json\" ]]; then\r\n MANIFEST=\"${SERVER_DIR}/client.manifest.json\"\r\n echo -e \"\\nLoader name: ${LOADER_NAME}\"\r\n\r\n if [[ $LOADER_NAME == \"forge\" ]]; then\r\n json_download_forge\r\n fi\r\n\r\n if [[ $LOADER_NAME == \"fabric\" ]]; then\r\n json_download_fabric\r\n fi\r\n \r\n if [[ $LOADER_NAME == \"neoforge\" ]]; then\r\n json_download_neoforge\r\n fi\r\n\r\n if [[ $LOADER_NAME == \"quilt\" ]]; then\r\n json_download_quilt\r\n fi\r\nfi\r\n\r\necho -e \"\\nInstall completed succesfully, enjoy!\"",
"container": "registry.cn-shanghai.aliyuncs.com/pterodactyl-images/installers:java_8",
"entrypoint": "bash"
}
},
"variables": [
{
"name": "模组包项目ID",
"description": "整合包页面中来自CurseForge网站的整合包项目ID,如果从上传的server.zip文件安装则填写'zip'。\n\n例如,https://www.curseforge.com/minecraft/modpacks/bofa-mods 的项目ID是375152",
"env_variable": "PROJECT_ID",
"default_value": "",
"user_viewable": true,
"user_editable": true,
"rules": "required|string",
"field_type": "text"
},
{
"name": "模组包文件ID",
"description": "属于模组包特定版本的文件ID。可以是主文件,也可以是服务器包关联的文件ID。\n\n如果未提供,脚本将尝试获取最新的服务器包或客户端包。",
"env_variable": "VERSION_ID",
"default_value": "latest",
"user_viewable": true,
"user_editable": true,
"rules": "string",
"field_type": "text"
},
{
"name": "CurseForge API 密钥",
"description": "使用此egg需要CurseForge API密钥。该密钥对服务器所有者不可见。您可以在此处获取API密钥:https://console.curseforge.com",
"env_variable": "API_KEY",
"default_value": "",
"user_viewable": false,
"user_editable": false,
"rules": "required|string|max:60",
"field_type": "text"
}
]
}附属文件
暂无附属文件
提交历史
Fork 关系
查看关系图暂无 Fork,成为第一个 Fork 的人吧!
统计
16
浏览
1
下载
0
星标
0
复刻
作者
飒
飒爽师叔
UID: 1
279 预设
·
2026-06