_comment: 'DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL'
meta:
  version: PLCN_v3
  update_url: 'https://github.com/pelican-dev/panel/raw/main/database/Seeders/eggs/minecraft/egg-forge-minecraft.yaml'
exported_at: '2025-12-09T21:55:23+00:00'
name: 'Forge Minecraft'
author: panel@example.com
uuid: ed072427-f209-4603-875c-f540c6dd5a65
description: |-
  Minecraft Forge Server. Minecraft Forge is a modding API (Application Programming Interface), which
  makes it easier to create mods, and also make sure mods are compatible with each other.
image: 'data:image/jpeg;base64,[encoded data, 9384 characters]'
tags:
  - minecraft
features:
  - eula
  - java_version
  - pid_limit
docker_images:
  'Java 21': 'ghcr.io/pelican-eggs/yolks:java_21'
  'Java 17': 'ghcr.io/pelican-eggs/yolks:java_17'
  'Java 16': 'ghcr.io/pelican-eggs/yolks:java_16'
  'Java 11': 'ghcr.io/pelican-eggs/yolks:java_11'
  'Java 8': 'ghcr.io/pelican-eggs/yolks:java_8'
file_denylist: {  }
startup_commands:
  Default: 'java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[  ! -f unix_args.txt ]] && printf %s "-jar {{SERVER_JARFILE}}" || printf %s "@unix_args.txt" )'
config:
  files:
    server.properties:
      parser: properties
      find:
        server-ip: ''
        server-port: '{{server.allocations.default.port}}'
        query.port: '{{server.allocations.default.port}}'
  startup:
    done: ')! For help, type '
  logs: {  }
  stop: stop
scripts:
  installation:
    script: |-
      #!/bin/bash
      # Forge Installation Script
      #
      # Server Files: /mnt/server
      apt update
      apt install -y curl jq

      if [[ ! -d /mnt/server ]]; then
        mkdir /mnt/server
      fi

      cd /mnt/server

      # Remove spaces from the version number to avoid issues with curl
      FORGE_VERSION="$(echo "$FORGE_VERSION" | tr -d ' ')"
      MC_VERSION="$(echo "$MC_VERSION" | tr -d ' ')"

      if [[ ! -z ${FORGE_VERSION} ]]; then
        DOWNLOAD_LINK=https://maven.minecraftforge.net/net/minecraftforge/forge/${FORGE_VERSION}/forge-${FORGE_VERSION}
        FORGE_JAR=forge-${FORGE_VERSION}*.jar
      else
        JSON_DATA=$(curl -sSL https://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json)

        if [[ "${MC_VERSION}" == "latest" ]] || [[ "${MC_VERSION}" == "" ]]; then
          echo -e "getting latest version of forge."
          MC_VERSION=$(echo -e ${JSON_DATA} | jq -r '.promos | del(."latest-1.7.10") | del(."1.7.10-latest-1.7.10") | to_entries[] | .key | select(contains("latest")) | split("-")[0]' | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -1)
          BUILD_TYPE=latest
        fi

        if [[ "${BUILD_TYPE}" != "recommended" ]] && [[ "${BUILD_TYPE}" != "latest" ]]; then
          BUILD_TYPE=recommended
        fi

        echo -e "minecraft version: ${MC_VERSION}"
        echo -e "build type: ${BUILD_TYPE}"

        ## some variables for getting versions and things
        FILE_SITE=https://maven.minecraftforge.net/net/minecraftforge/forge/
        VERSION_KEY=$(echo -e ${JSON_DATA} | jq -r --arg MC_VERSION "${MC_VERSION}" --arg BUILD_TYPE "${BUILD_TYPE}" '.promos | del(."latest-1.7.10") | del(."1.7.10-latest-1.7.10") | to_entries[] | .key | select(contains($MC_VERSION)) | select(contains($BUILD_TYPE))')

        ## locating the forge version
        if [[ "${VERSION_KEY}" == "" ]] && [[ "${BUILD_TYPE}" == "recommended" ]]; then
          echo -e "dropping back to latest from recommended due to there not being a recommended version of forge for the mc version requested."
          VERSION_KEY=$(echo -e ${JSON_DATA} | jq -r --arg MC_VERSION "${MC_VERSION}" '.promos | del(."latest-1.7.10") | del(."1.7.10-latest-1.7.10") | to_entries[] | .key | select(contains($MC_VERSION)) | select(contains("latest"))')
        fi

        ## Error if the mc version set wasn't valid.
        if [ "${VERSION_KEY}" == "" ] || [ "${VERSION_KEY}" == "null" ]; then
          echo -e "The install failed because there is no valid version of forge for the version of minecraft selected."
          exit 1
        fi

        FORGE_VERSION=$(echo -e ${JSON_DATA} | jq -r --arg VERSION_KEY "$VERSION_KEY" '.promos | .[$VERSION_KEY]')

        if [[ "${MC_VERSION}" == "1.7.10" ]] || [[ "${MC_VERSION}" == "1.8.9" ]]; then
          DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}
          FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}.jar
          if [[ "${MC_VERSION}" == "1.7.10" ]]; then
            FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}-universal.jar
          fi
        else
          DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}
          FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}.jar
        fi
      fi

      #Adding .jar when not eding by SERVER_JARFILE
      if [[ ! $SERVER_JARFILE = *\.jar ]]; then
        SERVER_JARFILE="$SERVER_JARFILE.jar"
      fi

      #Downloading jars
      echo -e "Downloading forge version ${FORGE_VERSION}"
      echo -e "Download link is ${DOWNLOAD_LINK}"

      if [[ ! -z "${DOWNLOAD_LINK}" ]]; then
        if curl --output /dev/null --silent --head --fail ${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

      curl -s -o installer.jar -sS ${DOWNLOAD_LINK}-installer.jar

      #Checking if downloaded jars exist
      if [[ ! -f ./installer.jar ]]; then
        echo "!!! Error downloading forge version ${FORGE_VERSION} !!!"
        exit
      fi

      function  unix_args {
        echo -e "Detected Forge 1.17 or newer version. Setting up forge unix args."
        ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt
      }

      # Delete args to support downgrading/upgrading
      rm -rf libraries/net/minecraftforge/forge
      rm unix_args.txt

      #Installing server
      echo -e "Installing forge server.
      "
      java -jar installer.jar --installServer || { echo -e "
      Install failed using Forge version ${FORGE_VERSION} and Minecraft version ${MINECRAFT_VERSION}.
      Should you be using unlimited memory value of 0, make sure to increase the default install resource limits in the Daemon config or specify exact allocated memory in the server Build Configuration instead of 0! 
      Otherwise, the Forge installer will not have enough memory."; exit 4; }

      # Check if we need a symlink for 1.17+ Forge JPMS args
      if [[ $MC_VERSION =~ ^1\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\.(17|18|19|20|21|22|23) ]]; then
        unix_args

      # Check if someone has set MC to latest but overwrote it with older Forge version, otherwise we would have false positives
      elif [[ $MC_VERSION == "latest" && $FORGE_VERSION =~ ^1\.(17|18|19|20|21|22|23) ]]; then
        unix_args
      else
        # For versions below 1.17 that ship with jar
        mv $FORGE_JAR $SERVER_JARFILE
      fi

      echo -e "Deleting installer.jar file.
      "
      rm -rf installer.jar
      echo -e "Installation process is completed"
    container: 'ghcr.io/pelican-eggs/installers:java_8'
    entrypoint: bash
variables:
  -
    name: 'Build Type'
    description: "The type of server jar to download from forge.\r\n\r\nValid types are \"recommended\" and \"latest\"."
    env_variable: BUILD_TYPE
    default_value: recommended
    user_viewable: true
    user_editable: true
    rules:
      - required
      - string
      - 'in:recommended,latest'
    sort: 3
  -
    name: 'Forge Version'
    description: "The full exact version.\r\n\r\nEx. 1.15.2-31.2.4\r\n\r\nOverrides MC_VERSION and BUILD_TYPE. If it fails to download the server files it will fail to\ninstall."
    env_variable: FORGE_VERSION
    default_value: ''
    user_viewable: true
    user_editable: true
    rules:
      - nullable
      - 'regex:/^[0-9\.\-]+$/'
    sort: 4
  -
    name: 'Minecraft Version'
    description: "The version of minecraft you want to install for.\r\n\r\nLeaving latest will install the latest recommended version."
    env_variable: MC_VERSION
    default_value: latest
    user_viewable: true
    user_editable: true
    rules:
      - required
      - string
      - 'max:9'
    sort: 2
  -
    name: 'Server Jar File'
    description: 'The name of the Jarfile to use when running Forge version below 1.17.'
    env_variable: SERVER_JARFILE
    default_value: server.jar
    user_viewable: true
    user_editable: true
    rules:
      - required
      - 'regex:/^([\w\d._-]+)(\.jar)$/'
    sort: 1
