{"meta":{"slug":"pterodactyl-modrinth-generic","name":"Pterodactyl Modrinth Generic","category":"java","source":"pelican","owner":"pelican-eggs","repo":"minecraft","branch":"main","path":"java/modrinth/egg-pterodactyl-modrinth-generic.json","rawUrl":"https://raw.githubusercontent.com/pelican-eggs/minecraft/main/java/modrinth/egg-pterodactyl-modrinth-generic.json","indexedAt":1792246788483},"egg":{"_comment":"DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO","meta":{"version":"PTDL_v2","update_url":"https://raw.githubusercontent.com/pelican-eggs/minecraft/refs/heads/main/java/modrinth/egg-pterodactyl-modrinth-generic.json"},"exported_at":"2025-01-13T09:44:32+00:00","name":"Modrinth Generic","author":"contact@chromozone.dev","description":"A generic egg for a Modrinth modpack.","features":["eula","java_version","pid_limit"],"docker_images":{"Java 8":"ghcr.io/pelican-eggs/yolks:java_8","Java 11":"ghcr.io/pelican-eggs/yolks:java_11","Java 16":"ghcr.io/pelican-eggs/yolks:java_16","Java 17":"ghcr.io/pelican-eggs/yolks:java_17","Java 21":"ghcr.io/pelican-eggs/yolks:java_21","Java 25":"ghcr.io/pelican-eggs/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}","logs":"{}","startup":"{\r\n    \"done\": \")! For help, type \"\r\n}","stop":"stop"},"scripts":{"installation":{"script":"#!/bin/bash\r\n# shellcheck disable=SC2155\r\n#\r\n# Modrinth 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\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\r\n    echo -e \"\\tRunning apt update\"\r\n    if ! apt update > /dev/null 2>&1; then\r\n        echo -e \"\\tERROR: apt update failed!\"\r\n        exit 1\r\n    fi\r\n\r\n    echo -e \"\\tRunning apt install\"\r\n    if ! apt install -y wget jq unzip dos2unix > /dev/null 2>&1; then\r\n        echo -e \"\\tERROR: apt install failed!\"\r\n        exit 1\r\n    fi\r\n}\r\n\r\nMODRINTH_API_URL=\"https://api.modrinth.com/v2\"\r\n\r\nfunction get_download {\r\n    echo -e \"Retrieving Modrinth project information...\"\r\n    local PROJECT_DATA=$(wget -q \"${MODRINTH_API_URL}/project/${PROJECT_ID}\" -O -)\r\n    local PROJECT_TITLE=$(echo \"$PROJECT_DATA\" | jq -r '.title // empty')\r\n    local PROJECT_SUPPORTED=$(echo \"$PROJECT_DATA\" | jq -r '.\"server_side\" // 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    if [[ \"${PROJECT_SUPPORTED}\" == \"unsupported\" ]]; then\r\n        echo -e \"\\tWARNING: The project '${PROJECT_TITLE}' is listed as unsupported for server use. Continuing anyway...\"\r\n    fi\r\n\r\n    if [[ -z \"${VERSION_ID}\" || \"${VERSION_ID}\" == \"latest\" ]]; then\r\n        echo -e \"\\tNo version ID specified, using latest version\"\r\n        VERSION_ID=$(echo \"$PROJECT_DATA\" | jq -r '.versions[-1] // empty')\r\n    else\r\n        echo -e \"\\tChecking if provided version id '${VERSION_ID}' exists\"\r\n        if [[ $(echo \"$PROJECT_DATA\" | jq -r --arg VERSION_ID \"$VERSION_ID\" '.versions[]? | select(. == $VERSION_ID)') != \"${VERSION_ID}\" ]]; then\r\n            echo -e \"\\tERROR: Version id '${VERSION_ID}' not found for project '${PROJECT_TITLE}'\"\r\n            exit 1\r\n        fi\r\n    fi\r\n\r\n    if [[ -z \"${VERSION_ID}\" ]]; then\r\n        echo -e \"\\tERROR: No version id found for project '${PROJECT_TITLE}'\"\r\n        exit 1\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 \"${MODRINTH_API_URL}/version/${VERSION_ID}\" -O -)\r\n\r\n    if [[ -z \"${JSON_DATA}\" ]]; then\r\n        echo -e \"\\tERROR: Failed to retrieve version data for version id '${VERSION_ID}'\"\r\n        exit 1\r\n    fi\r\n\r\n    echo -e \"\\tParsing Modrinth pack download url\"\r\n\r\n    local DOWNLOAD_URL=$(echo \"$JSON_DATA\" | jq -r '.files[]? | select(.primary == true) | .url')\r\n\r\n    if [[ -z \"${DOWNLOAD_URL}\" ]]; then\r\n        echo -e \"\\tERROR: No download url found for version ${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 \"\\tERROR: Failed to download modpack files!\"\r\n        exit 1\r\n    fi\r\n}\r\n\r\nfunction unpack_zip {\r\n    unzip -o server.zip\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}/modrinth.index.json\"\r\n    jq -c '.files[]? | select(.env.server == \"required\") | {name: .path, url: .downloads[0]}' \"${MANIFEST}\" | while read -r mod; do\r\n        local FILE_URL=$(echo \"${mod}\" | jq -r '.url // empty')\r\n        local FILE_NAME=$(echo \"${mod}\" | jq -r '.name // empty')\r\n\r\n        if [[ -z \"${FILE_URL}\" ]]; then\r\n            echo -e \"\\tERROR: No download url found for mod '${mod}'\"\r\n            exit 1\r\n        fi\r\n\r\n        echo -e \"\\tDownloading ${FILE_URL}\"\r\n        \r\n        if ! wget -q \"${FILE_URL}\" -P \"${SERVER_DIR}/mods\"; then\r\n            echo -e \"\\tERROR: Failed to download mod '${FILE_NAME}'\"\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        echo -e \"\\tCopying shared overrides\"\r\n        chmod -R 755 \"${SERVER_DIR}/overrides/\"*\r\n        cp -r \"${SERVER_DIR}/overrides/\"* \"${SERVER_DIR}\"\r\n        rm -r \"${SERVER_DIR}/overrides\"\r\n    fi\r\n\r\n    if [[ -d \"${SERVER_DIR}/server-overrides\" ]]; then\r\n        echo -e \"\\tCopying server overrides\"\r\n        chmod -R 755 \"${SERVER_DIR}/server-overrides/\"*\r\n        cp -r \"${SERVER_DIR}/server-overrides/\"* \"${SERVER_DIR}\"\r\n        rm -r \"${SERVER_DIR}/server-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 MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\r\n\r\n    local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\r\n    local FORGE_VERSION=$(jq -r '.dependencies.forge // empty' \"${MANIFEST}\")\r\n\r\n    if [[ -z \"${MC_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Minecraft version found in manifest '${MANIFEST}'\"\r\n        exit 1\r\n    fi\r\n\r\n    if [[ -z \"${FORGE_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Forge version found in manifest '${MANIFEST}'\"\r\n        exit 1\r\n    fi\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    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 MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\r\n\r\n    local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\r\n    local FABRIC_VERSION=$(jq -r '.dependencies.\"fabric-loader\" // empty' \"${MANIFEST}\")\r\n\r\n    if [[ -z \"${MC_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Minecraft version found in manifest '${MANIFEST}'\"\r\n        exit 1\r\n    fi\r\n\r\n    if [[ -z \"${FABRIC_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Fabric version found in manifest '${MANIFEST}'\"\r\n        exit 1\r\n    fi\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 in manifest!\"\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 in manifest!\"\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 MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\r\n\r\n    local MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\r\n    local QUILT_VERSION=$(jq -r '.dependencies.\"quilt-loader\" // empty' \"${MANIFEST}\")\r\n\r\n    if [[ -z \"${MC_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Minecraft version found in manifest!\"\r\n        exit 1\r\n    fi\r\n\r\n    if [[ -z \"${QUILT_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Quilt version found in manifest!\"\r\n        exit 1\r\n    fi\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_JSON}\" ]]; then\r\n        echo -e \"\\tERROR: Failed to retrieve Quilt installer information from manifest!\"\r\n        exit 1\r\n    fi\r\n\r\n    if [[ -z \"${INSTALLER_VERSION}\" ]]; then\r\n        echo -e \"\\tERROR: No Quilt installer version found in manifest!\"\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 in manifest!\"\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\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\n\tunpack_zip\r\nelse\r\n\tunpack_zip\r\nfi\r\n\r\nif [[ -f \"${SERVER_DIR}/modrinth.index.json\" ]]; then\r\n    echo \"Found modrinth.index.json, installing mods\"\r\n    json_download_mods\r\n    json_download_overrides\r\nfi\r\n\r\nif [[ -f \"${SERVER_DIR}/modrinth.index.json\" ]]; then\r\n    MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\r\n\r\n    if [[ $(jq -r '.dependencies.forge' \"${MANIFEST}\") != \"null\" ]]; then\r\n        json_download_forge\r\n    fi\r\n\r\n    if [[ $(jq -r '.dependencies.\"fabric-loader\"' \"${MANIFEST}\") != \"null\" ]]; then\r\n        json_download_fabric\r\n    fi\r\n\r\n    if [[ $(jq -r '.dependencies.\"quilt-loader\"' \"${MANIFEST}\") != \"null\" ]]; then\r\n        json_download_quilt\r\n    fi\r\nfi\r\n\r\necho -e \"\\nInstall completed succesfully, enjoy!\"","container":"ghcr.io/pelican-eggs/installers:java_17","entrypoint":"bash"}},"variables":[{"name":"Modpack Project ID","description":"This is the modpack project ID from the Modrinth site.\r\n\r\nFor example, the project ID of 'https://modrinth.com/modpack/fabulously-optimized/' is 1KVo5zza","env_variable":"PROJECT_ID","default_value":"","user_viewable":true,"user_editable":true,"rules":"required|string|max:8","field_type":"text"},{"name":"Modpack Version ID","description":"This is the modpack version ID from the Modrinth site.\r\n\r\nFor example, the version ID of 'https://modrinth.com/modpack/fabulously-optimized/version/4.7.4' is P9wA6exe","env_variable":"VERSION_ID","default_value":"latest","user_viewable":true,"user_editable":true,"rules":"string|max:8","field_type":"text"}]},"readme":"# Modrinth Generic\n\n## This is a generic egg for Modrinth modpacks\n\nYou will need to give it a modpack project ID. The project ID for [Extreme Optimization!](https://modrinth.com/modpack/extreme-optimization!) is `1oIpaoJo` for example.\nThis can be found on the modpack page in the `Technical information` section in the left sidebar.\n\nYou can also optionally specify a version ID. If you do not specify a version ID, the latest version will be used. The version ID for [Extreme Optimization!](https://modrinth.com/modpack/extreme-optimization!) version 1.12.2For2.0 is `SyMW2FDv` for example. This can be found on the modpack page by clicking the version number in the `Versions` section.\n\nThe script will automatically setup of Forge, Fabric, or Quilt depending on the modpack.\n\n## Server Ports\n\nThe minecraft server requires a single port for access (default 25565) but plugins may require extra ports to enabled for the server.\n\n| Port  | default |\n|-------|---------|\n| Game  | 25565   |\n"}