From e3d5307eeb2e53799299d38791ef2d963f555cb9 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Sat, 11 Dec 2021 21:00:05 +0200 Subject: [PATCH 01/64] fix(pmpp): version fetching Use update.pmmp.io API for latest version fetching allowing users to choose pm3 or pm4. closes #1459 --- .../pocketmine_mp/egg-pocketmine-m-p.json | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json b/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json index 04b5eda6..03831b55 100644 --- a/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json +++ b/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-11-18T21:36:31+00:00", + "exported_at": "2021-12-11T18:55:18+00:00", "name": "PocketmineMP", "author": "info@swisscrafting.ch", "description": "Pocketmine Egg\r\nby onekintaro from swisscrafting.ch\r\nwith the nice help from #eggs Channel on Pterodactyl-Discord :)", @@ -22,29 +22,20 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n# This is already installed in our Script container image. Leaving it here for future reference | apt install -y curl jq\r\n\r\ncd \/mnt\/server\r\n\r\n## get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\nDOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n\r\n## this is a simple script to validate a download url actually exists\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\"]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else \r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"performing curl -sSL ${DOWNLOAD_LINK}\"\r\ncurl -sSL ${DOWNLOAD_LINK} > PocketMine-MP.phar\r\n\r\necho -e \"\\n downloading latest php build from pocketmine from https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\"\r\ncurl -sSL -o php.binary.tar.gz https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\r\n\r\nif [ ! -f server.properties ]; then\r\n echo -e \"\\n downloading default server.properties\"\r\n curl -sSL https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/pocketmine_mp\/server.properties > server.properties\r\nfi\r\n\r\necho -e \"\\n unpacking php binaries\"\r\ntar -xzvf php.binary.tar.gz\r\n\r\necho -e \"\\n removing php packages\"\r\nrm -rf \/mnt\/server\/php.binary.tar.gz\r\n\r\necho -e \"\\n configuring PHP extensions library directory\"\r\nEXTENSION_DIR=$(find \"bin\" -name *debug-zts*)\r\ngrep -q '^extension_dir' bin\/php7\/bin\/php.ini && sed -i'bak' \"s{^extension_dir=.*{extension_dir=\\\"$EXTENSION_DIR\\\"{\" bin\/php7\/bin\/php.ini || echo \"extension_dir=\\\"$EXTENSION_DIR\\\"\" >> bin\/php7\/bin\/php.ini\r\n\r\necho -e \"\\n creating files and folders\"\r\ntouch banned-ips.txt banned-players.txt ops.txt white-list.txt server.log\r\nmkdir -p players worlds plugins resource_packs", + "script": "#!\/bin\/bash\r\n\r\n# This is already installed in our Script container image. Leaving it here for future reference | apt install -y curl jq\r\n\r\ncd \/mnt\/server\r\n\r\n# Restrict versions to latest pm3 and pm4 for now.\r\nif [[ \"${VERSION}\" == \"pm4\" ]] || [[ \"${VERSION}\" == \"\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=stable | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 4 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelif [[ \"${VERSION}\" == \"pm3\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=pm3 | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 4 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelse\r\n echo -e \"Unknown version ${VERSION}\"\r\n exit 1\r\nfi\r\n\r\necho -e \"\\n downloading latest php build from PocketMine https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\"\r\ncurl -sSL -o php.binary.tar.gz https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\r\n\r\nif [[ ! -f server.properties ]]; then\r\n echo -e \"\\n downloading default server.properties\"\r\n curl -sSL https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/pocketmine_mp\/server.properties >server.properties\r\nfi\r\n\r\necho -e \"\\n unpacking php binaries\"\r\ntar -xzvf php.binary.tar.gz\r\n\r\necho -e \"\\n removing php packages\"\r\nrm -rf \/mnt\/server\/php.binary.tar.gz\r\n\r\necho -e \"\\n configuring PHP extensions library directory\"\r\nEXTENSION_DIR=$(find \"bin\" -name *debug-zts*)\r\ngrep -q '^extension_dir' bin\/php7\/bin\/php.ini && sed -i'bak' \"s{^extension_dir=.*{extension_dir=\\\"$EXTENSION_DIR\\\"{\" bin\/php7\/bin\/php.ini || echo \"extension_dir=\\\"$EXTENSION_DIR\\\"\" >>bin\/php7\/bin\/php.ini\r\n\r\necho -e \"\\n creating files and folders\"\r\ntouch banned-ips.txt banned-players.txt ops.txt white-list.txt server.log\r\nmkdir -p players worlds plugins resource_packs\r\n\r\necho -e \"\\n\\nInstall script completed. Enjoy!\"", "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, "variables": [ { - "name": "Github Package", - "description": "", - "env_variable": "GITHUB_PACKAGE", - "default_value": "pmmp\/PocketMine-MP", - "user_viewable": false, - "user_editable": false, - "rules": "required|string|max:20" - }, - { - "name": "Match", - "description": "", - "env_variable": "MATCH", - "default_value": "PocketMine-MP.phar", - "user_viewable": false, - "user_editable": false, - "rules": "required|string|max:20" + "name": "Version to install [pm3 or pm4]", + "description": "Latest PocketMine version to install. Valid options: pm4 and pm3", + "env_variable": "VERSION", + "default_value": "pm4", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:pm3,pm4" } ] } \ No newline at end of file From ecc721a48d0422594e556cdc7d2aaf2df6d243f4 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Sat, 11 Dec 2021 21:53:39 +0200 Subject: [PATCH 02/64] chore: correct pm3 install message --- .../minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json b/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json index 03831b55..aebd5da2 100644 --- a/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json +++ b/game_eggs/minecraft/bedrock/pocketmine_mp/egg-pocketmine-m-p.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-11T18:55:18+00:00", + "exported_at": "2021-12-11T19:52:34+00:00", "name": "PocketmineMP", "author": "info@swisscrafting.ch", "description": "Pocketmine Egg\r\nby onekintaro from swisscrafting.ch\r\nwith the nice help from #eggs Channel on Pterodactyl-Discord :)", @@ -22,7 +22,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n# This is already installed in our Script container image. Leaving it here for future reference | apt install -y curl jq\r\n\r\ncd \/mnt\/server\r\n\r\n# Restrict versions to latest pm3 and pm4 for now.\r\nif [[ \"${VERSION}\" == \"pm4\" ]] || [[ \"${VERSION}\" == \"\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=stable | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 4 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelif [[ \"${VERSION}\" == \"pm3\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=pm3 | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 4 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelse\r\n echo -e \"Unknown version ${VERSION}\"\r\n exit 1\r\nfi\r\n\r\necho -e \"\\n downloading latest php build from PocketMine https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\"\r\ncurl -sSL -o php.binary.tar.gz https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\r\n\r\nif [[ ! -f server.properties ]]; then\r\n echo -e \"\\n downloading default server.properties\"\r\n curl -sSL https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/pocketmine_mp\/server.properties >server.properties\r\nfi\r\n\r\necho -e \"\\n unpacking php binaries\"\r\ntar -xzvf php.binary.tar.gz\r\n\r\necho -e \"\\n removing php packages\"\r\nrm -rf \/mnt\/server\/php.binary.tar.gz\r\n\r\necho -e \"\\n configuring PHP extensions library directory\"\r\nEXTENSION_DIR=$(find \"bin\" -name *debug-zts*)\r\ngrep -q '^extension_dir' bin\/php7\/bin\/php.ini && sed -i'bak' \"s{^extension_dir=.*{extension_dir=\\\"$EXTENSION_DIR\\\"{\" bin\/php7\/bin\/php.ini || echo \"extension_dir=\\\"$EXTENSION_DIR\\\"\" >>bin\/php7\/bin\/php.ini\r\n\r\necho -e \"\\n creating files and folders\"\r\ntouch banned-ips.txt banned-players.txt ops.txt white-list.txt server.log\r\nmkdir -p players worlds plugins resource_packs\r\n\r\necho -e \"\\n\\nInstall script completed. Enjoy!\"", + "script": "#!\/bin\/bash\r\n\r\n# This is already installed in our Script container image. Leaving it here for future reference | apt install -y curl jq\r\n\r\ncd \/mnt\/server\r\n\r\n# Restrict versions to latest pm3 and pm4 for now.\r\nif [[ \"${VERSION}\" == \"pm4\" ]] || [[ \"${VERSION}\" == \"\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=stable | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 4 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelif [[ \"${VERSION}\" == \"pm3\" ]]; then\r\n DOWNLOAD_LINK=$(curl -ssL https:\/\/update.pmmp.io\/api?channel=pm3 | grep 'download_url' | cut -d '\"' -f 4)\r\n echo -e \"Downloading latest PocketMine 3 from ${DOWNLOAD_LINK}\"\r\n curl -ssL \"${DOWNLOAD_LINK}\" -o PocketMine-MP.phar\r\nelse\r\n echo -e \"Unknown version ${VERSION}\"\r\n exit 1\r\nfi\r\n\r\necho -e \"\\n downloading latest php build from PocketMine https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\"\r\ncurl -sSL -o php.binary.tar.gz https:\/\/jenkins.pmmp.io\/job\/PHP-8.0-Aggregate\/lastStableBuild\/artifact\/PHP-8.0-Linux-x86_64.tar.gz\r\n\r\nif [[ ! -f server.properties ]]; then\r\n echo -e \"\\n downloading default server.properties\"\r\n curl -sSL https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/pocketmine_mp\/server.properties >server.properties\r\nfi\r\n\r\necho -e \"\\n unpacking php binaries\"\r\ntar -xzvf php.binary.tar.gz\r\n\r\necho -e \"\\n removing php packages\"\r\nrm -rf \/mnt\/server\/php.binary.tar.gz\r\n\r\necho -e \"\\n configuring PHP extensions library directory\"\r\nEXTENSION_DIR=$(find \"bin\" -name *debug-zts*)\r\ngrep -q '^extension_dir' bin\/php7\/bin\/php.ini && sed -i'bak' \"s{^extension_dir=.*{extension_dir=\\\"$EXTENSION_DIR\\\"{\" bin\/php7\/bin\/php.ini || echo \"extension_dir=\\\"$EXTENSION_DIR\\\"\" >>bin\/php7\/bin\/php.ini\r\n\r\necho -e \"\\n creating files and folders\"\r\ntouch banned-ips.txt banned-players.txt ops.txt white-list.txt server.log\r\nmkdir -p players worlds plugins resource_packs\r\n\r\necho -e \"\\n\\nInstall script completed. Enjoy!\"", "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } @@ -30,7 +30,7 @@ "variables": [ { "name": "Version to install [pm3 or pm4]", - "description": "Latest PocketMine version to install. Valid options: pm4 and pm3", + "description": "Latest PocketMine version to install. Valid options: pm3 and pm4", "env_variable": "VERSION", "default_value": "pm4", "user_viewable": true, From b0e58312e34bd11244c6bb10d8e09b12a08348f1 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Sun, 12 Dec 2021 01:07:15 +0200 Subject: [PATCH 03/64] forge: clean up and add more debugging clean up the code and add more debugging steps for easier troubleshooting when someone reports issues Easy to view diff: --- .../minecraft/java/forge/forge/egg-forge-enhanced.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json b/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json index 51a5f38e..bcec803e 100644 --- a/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json +++ b/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-02T16:23:24+00:00", + "exported_at": "2021-12-11T23:06:46+00:00", "name": "Forge Enhanced", "author": "parker@parkervcp.com", "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.", @@ -19,7 +19,7 @@ "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], - "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true $( [ ! -f unix_args.txt ] && printf %s \"-jar {{SERVER_JARFILE}}\" || printf %s \"@unix_args.txt\" )", + "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar {{SERVER_JARFILE}}\" || 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}", @@ -28,7 +28,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl jq\r\n\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\n# Remove spaces from the version number to avoid issues with curl\r\nFORGE_VERSION=\"$(echo \"$FORGE_VERSION\" | tr -d ' ')\"\r\nMC_VERSION=\"$(echo \"$MC_VERSION\" | tr -d ' ')\"\r\n\r\nif [ ! -z ${FORGE_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/${FORGE_VERSION}\/forge-${FORGE_VERSION}\r\n FORGE_JAR=forge-${FORGE_VERSION}*.jar\r\nelse\r\n JSON_DATA=$(curl -sSL https:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/promotions_slim.json)\r\n\r\n if [ \"${MC_VERSION}\" == \"latest\" ] || [ \"${MC_VERSION}\" == \"\" ] ; then\r\n echo -e \"getting latest version of forge.\"\r\n 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)\r\n \tBUILD_TYPE=latest\r\n fi\r\n\r\n if [ \"${BUILD_TYPE}\" != \"recommended\" ] && [ \"${BUILD_TYPE}\" != \"latest\" ]; then\r\n BUILD_TYPE=recommended\r\n fi\r\n\r\n echo -e \"minecraft version: ${MC_VERSION}\"\r\n echo -e \"build type: ${BUILD_TYPE}\"\r\n\r\n ## some variables for getting versions and things\r\n\tFILE_SITE=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/\r\n 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))')\r\n\r\n ## locating the forge version\r\n if [ \"${VERSION_KEY}\" == \"\" ] && [ \"${BUILD_TYPE}\" == \"recommended\" ]; then\r\n echo -e \"dropping back to latest from recommended due to there not being a recommended version of forge for the mc version requested.\"\r\n 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\"))')\r\n fi\r\n\r\n ## Error if the mc version set wasn't valid.\r\n if [ \"${VERSION_KEY}\" == \"\" ] || [ \"${VERSION_KEY}\" == \"null\" ]; then\r\n \techo -e \"The install failed because there is no valid version of forge for the version of minecraft selected.\"\r\n \texit 1\r\n fi\r\n\r\n FORGE_VERSION=$(echo -e ${JSON_DATA} | jq -r --arg VERSION_KEY \"$VERSION_KEY\" '.promos | .[$VERSION_KEY]')\r\n\r\n if [ \"${MC_VERSION}\" == \"1.7.10\" ] || [ \"${MC_VERSION}\" == \"1.8.9\" ]; then\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}.jar\r\n if [ \"${MC_VERSION}\" == \"1.7.10\" ]; then\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}-universal.jar\r\n fi\r\n else\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}.jar\r\n fi\r\nfi\r\n\r\n\r\n#Adding .jar when not eding by SERVER_JARFILE\r\nif [[ ! $SERVER_JARFILE = *\\.jar ]]; then\r\n SERVER_JARFILE=\"$SERVER_JARFILE.jar\"\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Downloading forge version ${FORGE_VERSION}\"\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\n\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then\r\n if curl --output \/dev\/null --silent --head --fail ${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\nelse\r\n echo -e \"no download link provided. Exiting now\"\r\n exit 3\r\nfi\r\n\r\ncurl -s -o installer.jar -sS ${DOWNLOAD_LINK}-installer.jar\r\n\r\n\r\n#Checking if downloaded jars exist\r\nif [ ! -f .\/installer.jar ]; then\r\n echo \"!!! Error by downloading forge version ${FORGE_VERSION} !!!\"\r\n exit\r\nfi\r\n\r\n# Delete args file to support downgrading to versions below 1.17\r\nif [ -f unix_args.txt ]; then\r\n rm unix_args.txt\r\n exit\r\nfi\r\n\r\n\r\n#Installing server\r\necho -e \"Installing forge server.\\n\"\r\njava -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n\r\nif [[ $MC_VERSION =~ ^1\\.(17|18|19|20|21|22|23) || $MC_VERSION == \"latest\" || $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) || $FORGE_VERSION == \"latest\" ]]; then\r\n # Create a symlink for 1.17+ Forge args\r\n ln -sf libraries\/net\/minecraftforge\/forge\/*\/unix_args.txt unix_args.txt\r\n else\r\n # For versions below 1.17 that ship with jar delete installer.jar\r\n mv $FORGE_JAR $SERVER_JARFILE\r\n echo -e \"Deleting installer.jar file.\\n\"\r\n rm -rf installer.jar\r\nfi", + "script": "#!\/bin\/bash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl jq\r\n\r\nif [[ ! -d \/mnt\/server ]]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\n# Remove spaces from the version number to avoid issues with curl\r\nFORGE_VERSION=\"$(echo \"$FORGE_VERSION\" | tr -d ' ')\"\r\nMC_VERSION=\"$(echo \"$MC_VERSION\" | tr -d ' ')\"\r\n\r\nif [[ ! -z ${FORGE_VERSION} ]]; then\r\n DOWNLOAD_LINK=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/${FORGE_VERSION}\/forge-${FORGE_VERSION}\r\n FORGE_JAR=forge-${FORGE_VERSION}*.jar\r\nelse\r\n JSON_DATA=$(curl -sSL https:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/promotions_slim.json)\r\n\r\n if [[ \"${MC_VERSION}\" == \"latest\" ]] || [[ \"${MC_VERSION}\" == \"\" ]]; then\r\n echo -e \"getting latest version of forge.\"\r\n 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)\r\n BUILD_TYPE=latest\r\n fi\r\n\r\n if [[ \"${BUILD_TYPE}\" != \"recommended\" ]] && [[ \"${BUILD_TYPE}\" != \"latest\" ]]; then\r\n BUILD_TYPE=recommended\r\n fi\r\n\r\n echo -e \"minecraft version: ${MC_VERSION}\"\r\n echo -e \"build type: ${BUILD_TYPE}\"\r\n\r\n ## some variables for getting versions and things\r\n FILE_SITE=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/\r\n 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))')\r\n\r\n ## locating the forge version\r\n if [[ \"${VERSION_KEY}\" == \"\" ]] && [[ \"${BUILD_TYPE}\" == \"recommended\" ]]; then\r\n echo -e \"dropping back to latest from recommended due to there not being a recommended version of forge for the mc version requested.\"\r\n 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\"))')\r\n fi\r\n\r\n ## Error if the mc version set wasn't valid.\r\n if [ \"${VERSION_KEY}\" == \"\" ] || [ \"${VERSION_KEY}\" == \"null\" ]; then\r\n echo -e \"The install failed because there is no valid version of forge for the version of minecraft selected.\"\r\n exit 1\r\n fi\r\n\r\n FORGE_VERSION=$(echo -e ${JSON_DATA} | jq -r --arg VERSION_KEY \"$VERSION_KEY\" '.promos | .[$VERSION_KEY]')\r\n\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" ]] || [[ \"${MC_VERSION}\" == \"1.8.9\" ]]; then\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}.jar\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" ]]; then\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}-universal.jar\r\n fi\r\n else\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}.jar\r\n fi\r\nfi\r\n\r\n#Adding .jar when not eding by SERVER_JARFILE\r\nif [[ ! $SERVER_JARFILE = *\\.jar ]]; then\r\n SERVER_JARFILE=\"$SERVER_JARFILE.jar\"\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Downloading forge version ${FORGE_VERSION}\"\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\n\r\nif [[ ! -z \"${DOWNLOAD_LINK}\" ]]; then\r\n if curl --output \/dev\/null --silent --head --fail ${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\nelse\r\n echo -e \"no download link provided. Exiting now\"\r\n exit 3\r\nfi\r\n\r\ncurl -s -o installer.jar -sS ${DOWNLOAD_LINK}-installer.jar\r\n\r\n#Checking if downloaded jars exist\r\nif [[ ! -f .\/installer.jar ]]; then\r\n echo \"!!! Error downloading forge version ${FORGE_VERSION} !!!\"\r\n exit\r\nfi\r\n\r\nfunction unix_args {\r\n echo -e \"Detected Forge 1.17 or newer version. Setting up forge unix args.\"\r\n ln -sf libraries\/net\/minecraftforge\/forge\/*\/unix_args.txt unix_args.txt\r\n}\r\n\r\n# Delete args to support downgrading\/upgrading\r\nrm -rf libraries\/net\/minecraftforge\/forge\r\nrm unix_args.txt\r\n\r\n#Installing server\r\necho -e \"Installing forge server.\\n\"\r\njava -jar installer.jar --installServer || { echo -e \"install failed using Forge version ${FORGE_VERSION} and Minecraft version ${MINECRAFT_VERSION}\"; exit 4; }\r\n\r\n# Check if we need a symlink for 1.17+ Forge JPMS args\r\nif [[ $MC_VERSION =~ ^1\\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\r\n unix_args\r\n\r\n# Check if someone has set MC to latest but overwrote it with older Forge version, otherwise we would have false positives\r\nelif [[ $MC_VERSION == \"latest\" && $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\r\n unix_args\r\nelse\r\n # For versions below 1.17 that ship with jar\r\n mv $FORGE_JAR $SERVER_JARFILE\r\nfi\r\n\r\necho -e \"Deleting installer.jar file.\\n\"\r\nrm -rf installer.jar", "container": "openjdk:8-jdk-slim", "entrypoint": "bash" } @@ -68,7 +68,7 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string|max:20" + "rules": "nullable|string|max:25" } ] } \ No newline at end of file From b952823ced4b832a0d7e43962d24d85b10fba0b4 Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 14:34:08 -0800 Subject: [PATCH 04/64] This should be boolean not bool bool is not in https://laravel.com/docs/5.7/validation#available-validation-rules --- bots/discord/discord.js/egg-discord-js-generic.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bots/discord/discord.js/egg-discord-js-generic.json b/bots/discord/discord.js/egg-discord-js-generic.json index 673356ba..3085b663 100644 --- a/bots/discord/discord.js/egg-discord-js-generic.json +++ b/bots/discord/discord.js/egg-discord-js-generic.json @@ -57,7 +57,7 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" }, { "name": "Auto Update", @@ -114,4 +114,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} From 9251d7532f3a8cffe36cddfb7ae06c7efab7dad5 Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:31:47 -0800 Subject: [PATCH 05/64] Changed bool to boolean --- game_eggs/steamcmd_servers/starbound/egg-starbound.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/steamcmd_servers/starbound/egg-starbound.json b/game_eggs/steamcmd_servers/starbound/egg-starbound.json index 3375688e..eb27a8a0 100644 --- a/game_eggs/steamcmd_servers/starbound/egg-starbound.json +++ b/game_eggs/steamcmd_servers/starbound/egg-starbound.json @@ -71,7 +71,7 @@ "default_value": "1", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" }, { "name": "Use Workshop content", @@ -80,7 +80,7 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" } ] -} \ No newline at end of file +} From 4433fad412d590c6edab72d666340dec2b6c90e5 Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:32:34 -0800 Subject: [PATCH 06/64] Changed bool to boolean --- bots/discord/lua/luvit/egg-luvit-generic.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bots/discord/lua/luvit/egg-luvit-generic.json b/bots/discord/lua/luvit/egg-luvit-generic.json index ecdb6564..3a6fdd58 100644 --- a/bots/discord/lua/luvit/egg-luvit-generic.json +++ b/bots/discord/lua/luvit/egg-luvit-generic.json @@ -62,7 +62,7 @@ "default_value": "0", "user_viewable": true, "user_editable": false, - "rules": "required|bool" + "rules": "required|boolean" }, { "name": "Git Branch", @@ -92,4 +92,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} From 78973b0c8a36941ef6f250a65b3457030e82266b Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:33:10 -0800 Subject: [PATCH 07/64] Changed bool to boolean --- bots/discord/nodemon.js/egg-nodemon.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bots/discord/nodemon.js/egg-nodemon.json b/bots/discord/nodemon.js/egg-nodemon.json index 337f24f2..6a903e3a 100644 --- a/bots/discord/nodemon.js/egg-nodemon.json +++ b/bots/discord/nodemon.js/egg-nodemon.json @@ -55,7 +55,7 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" }, { "name": "Auto Update", From 245d38467072b66a3af45b3cb7ca07683a186638 Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:34:01 -0800 Subject: [PATCH 08/64] Changed bool to boolean --- bots/discord/deno/egg-deno-generic.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bots/discord/deno/egg-deno-generic.json b/bots/discord/deno/egg-deno-generic.json index f42053d8..826be65d 100644 --- a/bots/discord/deno/egg-deno-generic.json +++ b/bots/discord/deno/egg-deno-generic.json @@ -62,7 +62,7 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" }, { "name": "Git Branch", @@ -83,4 +83,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From 83249b54e7ba7b94d8ce02581f58c3309bbd899a Mon Sep 17 00:00:00 2001 From: Mrxbox98 <29240392+mrxbox98@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:34:31 -0800 Subject: [PATCH 09/64] Changed bool to boolean --- game_eggs/gta/fivem/egg-five-m.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/gta/fivem/egg-five-m.json b/game_eggs/gta/fivem/egg-five-m.json index 9f7614c3..70efae68 100644 --- a/game_eggs/gta/fivem/egg-five-m.json +++ b/game_eggs/gta/fivem/egg-five-m.json @@ -98,7 +98,7 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|bool" + "rules": "required|boolean" } ] } From dc93cedbd885688664db90b443b303ec16d91bb1 Mon Sep 17 00:00:00 2001 From: Sebastian Pietschner <32213671+sebasptsch@users.noreply.github.com> Date: Mon, 13 Dec 2021 11:55:36 +1100 Subject: [PATCH 10/64] feat: Dynamica Egg (#1466) --- CONTRIBUTING.md | 18 ++++---- README.md | 1 + bots/discord/dynamica/README.md | 5 +++ bots/discord/dynamica/egg-dynamica.json | 59 +++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 bots/discord/dynamica/README.md create mode 100644 bots/discord/dynamica/egg-dynamica.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc795afc..c28c9d5f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,35 +3,37 @@ ## General rules 1. Keep it simple. - We don't need 8 miles of install script. + We don't need 8 miles of install script. 2. Keep it Small. - Only use what is absolutely needed. + Only use what is absolutely needed. 3. Try to stay in the stock containers. - If you need something in a container, open a PR in [my yolks repo](https://github.com/parkervcp/yolks) where I can review and pull it up to the main repo. In addition, there is a larger quantity of [images here](https://github.com/parkervcp/images) for you to use that have not been migrated to Yolks yet. + If you need something in a container, open a PR in [my yolks repo](https://github.com/parkervcp/yolks) where I can review and pull it up to the main repo. In addition, there is a larger quantity of [images here](https://github.com/parkervcp/images) for you to use that have not been migrated to Yolks yet. 4. Don't be afraid to submit PR's to the egg repo. - I don't bite. I will work with you on the egg and the required things to run it. + I don't bite. I will work with you on the egg and the required things to run it. ## Step 1. + #### Be aware of the pterodactyl install process. The Pterodactyl install process is fairly simple once you know. - + 1. Spin up install container This uses a volume mount on /mnt/server for the server files. This can pull or set up all that is needed to run the server. It is regularly used to just download the files required. Such as server files and configs. - + 2. Stop install container - + 3. Start a new container with the server files in /home/container This is where the server is actually run. Any dependencies installed during the install process are gone. The container that is started should have everything you need. ## Step 2. + #### Testing Make sure your install process is rock solid as I will be testing eggs before they ever hit my repo. @@ -39,8 +41,8 @@ Make sure your install process is rock solid as I will be testing eggs before th I will make suggestions and changes at will. This is to maintain a clean repo that others can pull and be fully aware of what is being done. - ## Step 3. + #### Make a branch and do your work in there. I have been getting messy PR's due to people always PRing from their master branch. Please make a seperate branch and PR from there. diff --git a/README.md b/README.md index f9ac72fe..3747d4a3 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ If you are reading this it looks like you are looking to add an egg to your serv * [discord.java](bots/discord/discord.java) Java generic * [discord.js](bots/discord/discord.js) Node JS generic * [discord.py](bots/discord/discord.py) Python generic +* [Dynamica](/bots/discord/dynamica) Node JS * [fragbot](/bots/discord/fragbot) Golang * [JMusicBot](/bots/discord/jmusicbot) Java * [nodemon.js](bots/discord/nodemon.js) Nodemon JS generic diff --git a/bots/discord/dynamica/README.md b/bots/discord/dynamica/README.md new file mode 100644 index 00000000..ef2e45e4 --- /dev/null +++ b/bots/discord/dynamica/README.md @@ -0,0 +1,5 @@ +# Dynamica + +### Their [Github](https://github.com/dynamicabot/dynamica) + +This is a discord bot for dynamically managing voice channels. diff --git a/bots/discord/dynamica/egg-dynamica.json b/bots/discord/dynamica/egg-dynamica.json new file mode 100644 index 00000000..185beb40 --- /dev/null +++ b/bots/discord/dynamica/egg-dynamica.json @@ -0,0 +1,59 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2021-12-13T10:34:52+11:00", + "name": "Dynamica", + "author": "sebastian.pietschner@gmail.com", + "description": "The dynamica discord bot", + "features": null, + "images": [ + "ghcr.io\/parkervcp\/yolks:nodejs_16" + ], + "file_denylist": [], + "startup": "yarn deploy && yarn prisma migrate deploy && yarn start", + "config": { + "files": "{}", + "startup": "{\r\n \"done\": \"Ready! Logged in as \"\r\n}", + "logs": "{}", + "stop": "^C" + }, + "scripts": { + "installation": { + "script": "apt-get update\r\napt-get install openssl git -y -qq\r\ncd \/mnt\/server\r\nif [[ -d .git\/ ]]; then\r\n git pull\r\nelse\r\n git clone https:\/\/github.com\/dynamicabot\/dynamica.git .;\r\nfi;\r\nyarn install --frozen-lockfile", + "container": "node:lts-buster-slim", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "Database Path", + "description": "The path in which to create the sqlite database.", + "env_variable": "DATABASE_URL", + "default_value": "file:\/home\/container\/dynamica\/db.sqlite", + "user_viewable": true, + "user_editable": false, + "rules": "required|string" + }, + { + "name": "Token", + "description": "The token for the discord bot.", + "env_variable": "TOKEN", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "required|string" + }, + { + "name": "Client ID", + "description": "The client ID of your discord bot.", + "env_variable": "CLIENT_ID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|size:18" + } + ] +} \ No newline at end of file From 29e610ba80b3ba8f9cd53a33b756ca0fb5347cae Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Mon, 13 Dec 2021 05:10:49 +0200 Subject: [PATCH 11/64] feat(7d2d): allow specifying telnet password Allows specifying telnet password and using it. Old version would not start if someone specifies password in the config --- .../7_days_to_die/egg-7-days-to-die.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json index f0e44222..39e8aa55 100644 --- a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json +++ b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-07T16:16:58+00:00", + "exported_at": "2021-12-13T03:08:36+00:00", "name": "7 Days To Die", "author": "kristoffer.norman@bahnhof.se", "description": "7 days to die server", @@ -13,7 +13,7 @@ "ghcr.io\/parkervcp\/games:source" ], "file_denylist": [], - "startup": ".\/7DaysToDieServer.x86_64 -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated -ServerPort=${SERVER_PORT} -ServerMaxPlayerCount=${MAX_PLAYERS} -GameDifficulty=${GAME_DIFFICULTY} -ControlPanelEnabled=false -TelnetEnabled=true -TelnetPort=8081 -logfile logs\/latest.log & echo -e \"Checking on telnet connection\" && until nc -z -v -w5 127.0.0.1 8081; do echo \"Waiting for telnet connection...\"; sleep 5; done && telnet -E 127.0.0.1 8081", + "startup": ".\/7DaysToDieServer.x86_64 -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated -ServerPort=${SERVER_PORT} -ServerMaxPlayerCount=${MAX_PLAYERS} -GameDifficulty=${GAME_DIFFICULTY} -ControlPanelEnabled=false -TelnetEnabled=true -TelnetPort=8081 -TelnetPassword=${PASSWORD} -logfile logs\/latest.log & echo -e \"Checking on telnet connection\" && until nc -z -v -w5 127.0.0.1 8081; do echo \"Waiting for telnet connection...\"; sleep 5; done && $( [[ -z ${PASSWORD} ]] && printf %s \"telnet -E 127.0.0.1 8081\" || printf %s \"rcon -t telnet -a 127.0.0.1:8081 -p {{PASSWORD}}\" )", "config": { "files": "{}", "startup": "{\r\n \"done\": \"Connected with 7DTD server\"\r\n}", @@ -81,6 +81,15 @@ "user_viewable": true, "user_editable": true, "rules": "nullable|string|max:20" + }, + { + "name": "Telnet Password", + "description": "Telnet listens on a local interface by default without a password. However, you can specify if you wish to expose it.", + "env_variable": "PASSWORD", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|string|max:30" } ] } \ No newline at end of file From 9f86fb510539479271b213eb109f985b77db7db3 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Mon, 13 Dec 2021 05:14:17 +0200 Subject: [PATCH 12/64] chore: more detailed telnet variable description --- game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json index 39e8aa55..0a9652b8 100644 --- a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json +++ b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json @@ -84,7 +84,7 @@ }, { "name": "Telnet Password", - "description": "Telnet listens on a local interface by default without a password. However, you can specify if you wish to expose it.", + "description": "Telnet listens on a local interface by default without a password. However, you can specify a password if you wish to expose telnet.", "env_variable": "PASSWORD", "default_value": "", "user_viewable": true, From def99684aacbfe137f730abbe448911457b184a8 Mon Sep 17 00:00:00 2001 From: Northwave Date: Mon, 13 Dec 2021 23:09:32 +0100 Subject: [PATCH 13/64] Update README.md default port correction --- game_eggs/steamcmd_servers/dont_starve/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/steamcmd_servers/dont_starve/README.md b/game_eggs/steamcmd_servers/dont_starve/README.md index 7d8d6e36..00bb2aa1 100644 --- a/game_eggs/steamcmd_servers/dont_starve/README.md +++ b/game_eggs/steamcmd_servers/dont_starve/README.md @@ -15,6 +15,6 @@ Don't Starve Together only requires a single port to run. The default is 10999 | Port | default | |---------|---------| -| Game | 10998 | +| Game | 10999 | #### Mods/Plugins may require ports to be added to the server. From c576673f88a2f2edd28beb10fae1651c0b639041 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Tue, 14 Dec 2021 17:15:45 +0100 Subject: [PATCH 14/64] clean sogeBot update process (#1449) Backup database and clean up folders on reinstall to minimize unwanted errors for npm modules --- bots/twitch/sogebot/egg-soge-bot.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bots/twitch/sogebot/egg-soge-bot.json b/bots/twitch/sogebot/egg-soge-bot.json index a80e9212..8a989269 100644 --- a/bots/twitch/sogebot/egg-soge-bot.json +++ b/bots/twitch/sogebot/egg-soge-bot.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-07T12:36:17+00:00", + "exported_at": "2021-12-13T15:19:16+01:00", "name": "SogeBot", "author": "info@goover.de", "description": "sogeBot - Free Twitch Bot built on Node.js https:\/\/sogebot.xyz\/", @@ -22,8 +22,8 @@ }, "scripts": { "installation": { - "script": "#\/bin\/bash\r\napt -y update\r\napt install -y curl unzip sqlite jq wget python3 build-essential\r\nexport NODE_OPTIONS=--max-old-space-size=8192\r\nMATCH=sogeBot\r\ncd \/mnt\/server\r\n\r\nrm -fR dest\r\nrm -fR public\r\n\r\n## get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/sogebot\/sogeBot\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/sogebot\/sogeBot\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_LINK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\necho -e \"Downloading from $DOWNLOAD_LINK\"\r\nwget -N $DOWNLOAD_LINK\r\nunzip -o $MATCH-*.zip\r\nrm -fR $MATCH-*.zip\r\n\r\necho \"Installing dependencies, this will take some time so sit back and relax...\"\r\n\/usr\/local\/bin\/npm ci 2>&1 | tee npmlog.txt\r\n\r\necho -e \"install completed\"\r\nexit 0", - "container": "node:16-buster-slim", + "script": "#\/bin\/bash\r\n# Installscript for sogeBot | Author: info@goover.de\r\n\r\nexport DEBIAN_FRONTEND=noninteractive\r\n\r\napt -y update\r\napt install -y curl unzip sqlite3 jq wget python3 build-essential ca-certificates\r\n\r\nexport NODE_OPTIONS=--max-old-space-size=8192\r\nchown -R root:root \/mnt\r\nMATCH=sogeBot\r\ncd \/mnt\/server\r\n\r\n#Backup database & config\r\nmkdir -p .backup\r\ncp -f .env \/mnt\/server\/.backup\r\ncp -f sogebot.db \/mnt\/server\/.backup\r\n\r\n#delete old dir's to prevent errors on update\r\nrm -fR dest\r\nrm -fR public\r\nrm -fR node-modules\r\nrm -fR tools\r\n\r\n## get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/sogebot\/sogeBot\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/sogebot\/sogeBot\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_LINK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\necho -e \"Downloading from $DOWNLOAD_LINK\"\r\nwget -N $DOWNLOAD_LINK\r\nunzip -o $MATCH-*.zip\r\nrm -fR $MATCH-*.zip\r\n\r\necho \"--------------------------------------------------------------------------\"\r\necho \"Installing dependencies, this will take some time so sit back and relax...\"\r\necho \"IGNORE WARNINGS. THESE ARE NOT ERRORS !!!\"\r\necho \"--------------------------------------------------------------------------\"\r\n\r\nnpm ci 2>&1 | tee npmlog.txt\r\n\r\necho -e \"install completed\"\r\nexit 0", + "container": "node:16-bullseye-slim", "entrypoint": "bash" } }, @@ -38,4 +38,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file From 97be6b0f2b0ec124ec0b80f705d82e491443a4e0 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 14 Dec 2021 13:19:37 -0500 Subject: [PATCH 15/64] chore: change Java image order to the newest version as default (#1453) --- .../minecraft/java/airplane/egg-airplane.json | 9 ++- .../minecraft/java/fabric/egg-fabric.json | 10 +-- .../minecraft/java/mohist/egg-mohist.json | 74 ------------------- game_eggs/minecraft/java/paper/egg-paper.json | 10 +-- .../minecraft/java/purpur/egg-purpur.json | 8 +- .../minecraft/java/spigot/egg-spigot.json | 8 +- .../spongevanilla/egg-sponge-vanilla.json | 10 +-- .../minecraft/java/tuinity/egg-tuinity.json | 10 +-- .../java/vanillacord/egg-vanilla-cord.json | 12 +-- .../bedrock/waterdog_pe/egg-waterdog-p-e.json | 10 +-- .../cross_platform/waterdog/egg-waterdog.json | 10 +-- .../proxy/java/flamecord/egg-flamecord.json | 10 +-- .../proxy/java/travertine/egg-travertine.json | 10 +-- .../proxy/java/waterfall/egg-waterfall.json | 10 +-- 14 files changed, 64 insertions(+), 137 deletions(-) delete mode 100644 game_eggs/minecraft/java/mohist/egg-mohist.json diff --git a/game_eggs/minecraft/java/airplane/egg-airplane.json b/game_eggs/minecraft/java/airplane/egg-airplane.json index 14b4d2ef..20c90383 100644 --- a/game_eggs/minecraft/java/airplane/egg-airplane.json +++ b/game_eggs/minecraft/java/airplane/egg-airplane.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-25T09:45:04+02:00", + "exported_at": "2021-12-09T13:31:17-05:00", "name": "Airplane", "author": "info@ttr3.eu", "description": "A stable, optimized and fast Paper fork.\r\nhttps:\/\/github.com\/TECHNOVE\/Airplane", @@ -13,9 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_16", "ghcr.io\/pterodactyl\/yolks:java_17", - "ghcr.io\/pterodactyl\/yolks:java_11" + "ghcr.io\/pterodactyl\/yolks:java_16", + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -61,4 +62,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/java/fabric/egg-fabric.json b/game_eggs/minecraft/java/fabric/egg-fabric.json index fe349871..064fd7c0 100644 --- a/game_eggs/minecraft/java/fabric/egg-fabric.json +++ b/game_eggs/minecraft/java/fabric/egg-fabric.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-11-06T19:02:28+00:00", + "exported_at": "2021-12-09T13:31:08-05:00", "name": "Fabric", "author": "accounts@bofanodes.io", "description": "Fabric is a modular modding toolchain targeting Minecraft 1.14 and above, including snapshots.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", @@ -71,4 +71,4 @@ "rules": "required|string|between:3,15" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/java/mohist/egg-mohist.json b/game_eggs/minecraft/java/mohist/egg-mohist.json deleted file mode 100644 index d2f5c960..00000000 --- a/game_eggs/minecraft/java/mohist/egg-mohist.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", - "meta": { - "version": "PTDL_v1", - "update_url": null - }, - "exported_at": "2021-06-14T21:28:24+03:00", - "name": "Mohist", - "author": "alex.chang-lam@protonmail.com", - "description": "Spigot fork with performance optimizations.", - "features": [ - "eula", - "java_version" - ], - "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", - "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" - ], - "file_denylist": [], - "startup": "java -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}} pause", - "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 }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \",\r\n \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# Mohist Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl\r\n\r\n#Go into main direction\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nif [ ! -z ${BUILD_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_VERSION}\/download\r\nelse\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_TYPE}\/download\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\necho -e \"Downloading build version ${BUILD_VERSION}\"\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}-server.jar; then\r\n echo -e \"Download link is valid.\"\r\n else\r\n echo -e \"Link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\ncurl -s -o server.jar -sS ${DOWNLOAD_LINK}\r\n\r\n#Checking if downloaded jars exist\r\nif [ ! -f .\/server.jar ]; then\r\n echo \"!!! Error downloading build version ${BUILD_VERSION} !!!\"\r\n exit\r\nfi", - "container": "debian:buster-slim", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Server Jar File", - "description": "The name of the jarfile to run the server with.", - "env_variable": "SERVER_JARFILE", - "default_value": "server.jar", - "user_viewable": false, - "user_editable": false, - "rules": "required|string|max:20" - }, - { - "name": "Minecraft Version", - "description": "The version of Minecraft to download.", - "env_variable": "MC_VERSION", - "default_value": "1.16.5", - "user_viewable": true, - "user_editable": true, - "rules": "required|string|max:20" - }, - { - "name": "Build Number", - "description": "Optional: \r\nThe build number for the Mohist release. Overrides Build Type.", - "env_variable": "BUILD_VERSION", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|string|max:20" - }, - { - "name": "Build Type", - "description": "The type of server jar to download from Mohist.\r\n\r\nValid types are \"recommended\" and \"latest\".", - "env_variable": "BUILD_TYPE", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": "required|string|max:20" - } - ] -} diff --git a/game_eggs/minecraft/java/paper/egg-paper.json b/game_eggs/minecraft/java/paper/egg-paper.json index 1ad1196a..b5717965 100644 --- a/game_eggs/minecraft/java/paper/egg-paper.json +++ b/game_eggs/minecraft/java/paper/egg-paper.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:03:08+03:00", + "exported_at": "2021-12-09T13:30:53-05:00", "name": "Paper", "author": "parker@pterodactyl.io", "description": "High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -71,4 +71,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/java/purpur/egg-purpur.json b/game_eggs/minecraft/java/purpur/egg-purpur.json index 7e0bc1ed..84849ad5 100644 --- a/game_eggs/minecraft/java/purpur/egg-purpur.json +++ b/game_eggs/minecraft/java/purpur/egg-purpur.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-07T02:27:26+00:00", + "exported_at": "2021-12-09T13:30:47-05:00", "name": "Purpur", "author": "purpur@birdflop.com", "description": "Fork of Paper and Tuinity providing new configuration options.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", diff --git a/game_eggs/minecraft/java/spigot/egg-spigot.json b/game_eggs/minecraft/java/spigot/egg-spigot.json index 76ce9ba7..d1e5985a 100644 --- a/game_eggs/minecraft/java/spigot/egg-spigot.json +++ b/game_eggs/minecraft/java/spigot/egg-spigot.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-11-27T05:14:42+00:00", + "exported_at": "2021-12-09T13:30:38-05:00", "name": "Spigot", "author": "support@pterodactyl.io", "description": "Spigot is the most widely-used modded Minecraft server software in the world. It powers many of the top Minecraft server networks around to ensure they can cope with their huge player base and ensure the satisfaction of their players. Spigot works by reducing and eliminating many causes of lag, as well as adding in handy features and settings that help make your job of server administration easier.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", diff --git a/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json b/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json index 8729d985..630e8042 100644 --- a/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json +++ b/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:04:30+03:00", + "exported_at": "2021-12-09T13:30:32-05:00", "name": "SpongeVanilla", "author": "parker@parkervcp.com", "description": "SpongeVanilla is the implementation of the Sponge API on top of Vanilla Minecraft.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", @@ -53,4 +53,4 @@ "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/java/tuinity/egg-tuinity.json b/game_eggs/minecraft/java/tuinity/egg-tuinity.json index 866f95a6..4434352b 100644 --- a/game_eggs/minecraft/java/tuinity/egg-tuinity.json +++ b/game_eggs/minecraft/java/tuinity/egg-tuinity.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:12:43+03:00", + "exported_at": "2021-12-09T13:30:24-05:00", "name": "Tuinity", "author": "unknown@unknown.com", "description": "Fork of Paper aimed at improving server performance at high playercounts.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -44,4 +44,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json b/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json index eb2ce8b1..adc6266f 100644 --- a/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json +++ b/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:24:21+03:00", + "exported_at": "2021-12-09T13:30:15-05:00", "name": "VanillaCord", "author": "support@pterodactyl.io", "description": "Minecraft is a game about placing blocks and going on adventures. Explore randomly generated worlds and build amazing things from the simplest of homes to the grandest of castles. Play in Creative Mode with unlimited resources or mine deep in Survival Mode, crafting weapons and armor to fend off dangerous mobs. Do all this alone or with friends.\r\n\r\nVanillaCord adds support for BungeeCord's ip_forward setting.", @@ -13,17 +13,17 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", "config": { "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"enable-query\": \"true\",\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 \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}", - "logs": "{\r\n \"custom\": false,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "logs": "{}", "stop": "stop" }, "scripts": { @@ -53,4 +53,4 @@ "rules": "required|string|between:3,15" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json b/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json index 2825f7db..2fbfcbb7 100644 --- a/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json +++ b/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-09-20T15:28:45+09:00", + "exported_at": "2021-12-09T13:32:23-05:00", "name": "Waterdog PE", "author": "parker@pterodactyl.io", "description": "Brand new proxy server for Minecraft: Bedrock Edition", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Dterminal.ansi=true -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", @@ -53,4 +53,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json b/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json index 119629cc..1964dda3 100644 --- a/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json +++ b/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:14:07+03:00", + "exported_at": "2021-12-09T13:32:14-05:00", "name": "Waterdog", "author": "parker@pterodactyl.io", "description": "Waterdog is fork of the well-known Waterfall, which is a fork of the well-known BungeeCord, server teleportation suite.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", @@ -53,4 +53,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json b/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json index 8e0e431b..aa279f1c 100644 --- a/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json +++ b/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:31:08+03:00", + "exported_at": "2021-12-09T13:32:08-05:00", "name": "Flamecord", "author": "admin@softwarenoob.com", "description": "FlameCord is a patch for Travertine to fix possible exploits and add useful functionalities. FlameCord aims to fix Netty related exploits to keep your server safe from attacks.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -53,4 +53,4 @@ "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json b/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json index e2e7a1f2..5c4042cc 100644 --- a/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json +++ b/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:31:40+03:00", + "exported_at": "2021-12-09T13:32:03-05:00", "name": "Travertine", "author": "parker@parkervcp.com", "description": "Travertine is a fork of Waterfall with 1.7 protocol support. Waterfall is a fork of the well-known BungeeCord server teleportation suite.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -71,4 +71,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file diff --git a/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json b/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json index 94597a3d..01612883 100644 --- a/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json +++ b/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:15:40+03:00", + "exported_at": "2021-12-09T13:31:54-05:00", "name": "Waterfall", "author": "hostmaster@waterfallgaming.net", "description": "Waterfall is a fork of the well-known BungeeCord server teleportation suite.", @@ -13,10 +13,10 @@ "java_version" ], "images": [ - "ghcr.io\/pterodactyl\/yolks:java_8", - "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_17", "ghcr.io\/pterodactyl\/yolks:java_16", - "ghcr.io\/pterodactyl\/yolks:java_17" + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_8" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", @@ -71,4 +71,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file From 8e5ff8fec982abbcfc8a6b281db8fe21d935ca63 Mon Sep 17 00:00:00 2001 From: MrRazamataz <56600481+MrRazamataz@users.noreply.github.com> Date: Wed, 15 Dec 2021 17:54:33 +0000 Subject: [PATCH 16/64] fix nukkit download --- game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json b/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json index aefd6814..fb458c33 100644 --- a/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json +++ b/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json @@ -4,25 +4,29 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T03:55:04+03:00", + "exported_at": "2021-12-15T12:51:36-05:00", "name": "Nukkit", "author": "parker@parkervcp.com", - "description": "Nukkit is a Nuclear-Powered Server Software For Minecraft: Pocket Edition\r\n\r\nhttps:\/\/nukkit.io\/", + "description": "Nukkit is a Nuclear-Powered Server Software For Minecraft: Pocket Edition\r\n\r\nhttps:\/\/cloudburst.org\/", "features": null, "images": [ - "quay.io\/pterodactyl\/core:java-glibc" + "quay.io\/pterodactyl\/core:java-glibc", + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_16", + "ghcr.io\/pterodactyl\/yolks:java_8", + "ghcr.io\/pterodactyl\/yolks:java_17" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", "config": { "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"enable-query\": \"true\",\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 \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}", + "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", "logs": "{\r\n \"custom\": false,\r\n \"location\": \"logs\/latest.log\"\r\n}", "stop": "stop" }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# Nukkit Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add --no-cache curl openssl\r\n\r\ncd \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n wget ${MODIFIED_DOWNLOAD} -O ${SERVER_JARFILE}\r\nelif [ -z \"${NUKKIT_VERSION}\" ] || [ \"${NUKKIT_VERSION}\" == \"latest\" ]; then\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/lastSuccessfulBuild\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nelse\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/${NUKKIT_VERSION}\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nfi\r\n\r\nif [ ! -f nukkit.yml ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/nukkit.yml\r\nfi\r\n\r\nif [ ! -f server.properties ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/server.properties\r\nfi", + "script": "#!\/bin\/ash\r\n# Nukkit Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add --no-cache curl openssl\r\n\r\ncd \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n wget ${MODIFIED_DOWNLOAD} -O ${SERVER_JARFILE}\r\nelif [ -z \"${NUKKIT_VERSION}\" ] || [ \"${NUKKIT_VERSION}\" == \"latest\" ]; then\r\n wget https:\/\/repo.opencollab.dev\/artifactory\/maven-snapshots\/cn\/nukkit\/nukkit\/1.0-SNAPSHOT\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nelse\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/${NUKKIT_VERSION}\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nfi\r\n\r\nif [ ! -f nukkit.yml ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/nukkit.yml\r\nfi\r\n\r\nif [ ! -f server.properties ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/server.properties\r\nfi\r\necho -e \"Install completed!\"", "container": "alpine:3.10", "entrypoint": "ash" } From 26fbc6ed8309b9c975abf48bb9d8cef9112c1961 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Thu, 16 Dec 2021 15:19:49 +0100 Subject: [PATCH 17/64] Update Wine generic to use yolk Images (#1478) --- game_eggs/wine/generic/egg-wine-generic.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/game_eggs/wine/generic/egg-wine-generic.json b/game_eggs/wine/generic/egg-wine-generic.json index d331311e..188fdd45 100644 --- a/game_eggs/wine/generic/egg-wine-generic.json +++ b/game_eggs/wine/generic/egg-wine-generic.json @@ -4,14 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-04-28T02:09:55+00:00", + "exported_at": "2021-12-16T15:06:26+01:00", "name": "Wine Generic", "author": "parker@parkervcp.com", "description": "a generic egg to run servers with wine", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5", - "quay.io\/parkervcp\/pterodactyl-images:debian_wine-4" + "ghcr.io\/parkervcp\/yolks:wine_latest" ], "file_denylist": [], "startup": "wine {{SERVER_EXECUTABLE}}", @@ -24,7 +23,7 @@ "scripts": { "installation": { "script": "#!\/bin\/bash\r\n# The wine generic server installer\r\n# This will just pull a download link and unpack it in directory if specified.\r\n\r\napt update -y\r\napt install -y curl file unzip\r\n\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir -p \/mnt\/server\/\r\nfi\r\n\r\ncd \/mnt\/server\/\r\n\r\n# if an install dir is set then make it and change to it.\r\nif [ ! -z ${INSTALL_DIR} ]; then\r\n mkdir -p ${INSTALL_DIR}\r\n cd ${INSTALL_DIR}\r\nfi\r\n\r\n# validate server link\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else \r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\n# unpack servver files\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\n\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2 \r\nfi", - "container": "debian:buster-slim", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, From 3bcc7c95132cecbc4b7325f9dc9f18f731888c69 Mon Sep 17 00:00:00 2001 From: MrRazamataz <56600481+MrRazamataz@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:33:34 +0000 Subject: [PATCH 18/64] fix the download url and name --- game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json b/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json index fb458c33..afb85499 100644 --- a/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json +++ b/game_eggs/minecraft/bedrock/nukkit/egg-nukkit.json @@ -4,10 +4,10 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-15T12:51:36-05:00", + "exported_at": "2021-12-16T13:31:45-05:00", "name": "Nukkit", "author": "parker@parkervcp.com", - "description": "Nukkit is a Nuclear-Powered Server Software For Minecraft: Pocket Edition\r\n\r\nhttps:\/\/cloudburst.org\/", + "description": "Nukkit is a Nuclear-Powered Server Software For Minecraft: Pocket Edition\r\n\r\nhttps:\/\/cloudburstmc.org", "features": null, "images": [ "quay.io\/pterodactyl\/core:java-glibc", @@ -26,7 +26,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# Nukkit Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add --no-cache curl openssl\r\n\r\ncd \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n wget ${MODIFIED_DOWNLOAD} -O ${SERVER_JARFILE}\r\nelif [ -z \"${NUKKIT_VERSION}\" ] || [ \"${NUKKIT_VERSION}\" == \"latest\" ]; then\r\n wget https:\/\/repo.opencollab.dev\/artifactory\/maven-snapshots\/cn\/nukkit\/nukkit\/1.0-SNAPSHOT\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nelse\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/${NUKKIT_VERSION}\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nfi\r\n\r\nif [ ! -f nukkit.yml ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/nukkit.yml\r\nfi\r\n\r\nif [ ! -f server.properties ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/server.properties\r\nfi\r\necho -e \"Install completed!\"", + "script": "#!\/bin\/ash\r\n# Nukkit Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add --no-cache curl openssl\r\n\r\ncd \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n wget ${MODIFIED_DOWNLOAD} -O ${SERVER_JARFILE}\r\nelif [ -z \"${NUKKIT_VERSION}\" ] || [ \"${NUKKIT_VERSION}\" == \"latest\" ]; then\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/lastSuccessfulBuild\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nelse\r\n wget https:\/\/ci.opencollab.dev\/job\/NukkitX\/job\/Nukkit\/job\/master\/${NUKKIT_VERSION}\/artifact\/target\/nukkit-1.0-SNAPSHOT.jar -O ${SERVER_JARFILE}\r\nfi\r\n\r\nif [ ! -f nukkit.yml ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/nukkit.yml\r\nfi\r\n\r\nif [ ! -f server.properties ]; then\r\n wget https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/minecraft\/bedrock\/nukkit\/server.properties\r\nfi\r\n\r\necho -s \"Install completed!\"", "container": "alpine:3.10", "entrypoint": "ash" } @@ -43,7 +43,7 @@ }, { "name": "Download Path", - "description": "A URL to use to download Spigot rather than building it on the server. This is not user viewable. Use {{DL_VERSION}}<\/code> in the URL to automatically insert the assigned version into the URL. If you do not enter a URL Spigot will build directly in the container (this will fail on low memory containers).", + "description": "A URL to use to download Nukkit rather than building it on the server. This is not user viewable. Use {{DL_VERSION}}<\/code> in the URL to automatically insert the assigned version into the URL. If you do not enter a URL Spigot will build directly in the container (this will fail on low memory containers).", "env_variable": "DL_PATH", "default_value": "", "user_viewable": false, @@ -60,4 +60,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From a8bf0335b38cf960b00bf5e3a0c1f38338580d27 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Fri, 17 Dec 2021 11:25:22 +0200 Subject: [PATCH 19/64] fix: code server download url Fix download url, update Docker images to Yolks and change stop signal. --- software/code-server/egg-code--server.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/software/code-server/egg-code--server.json b/software/code-server/egg-code--server.json index 18f9d9f7..2dca08e9 100644 --- a/software/code-server/egg-code--server.json +++ b/software/code-server/egg-code--server.json @@ -4,13 +4,16 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-05-03T21:06:19+03:00", + "exported_at": "2021-12-17T09:23:57+00:00", "name": "Code-Server", "author": "mario.franze@gmail.com", "description": "Run VS Code on any machine anywhere and access it in the browser.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:debian_nodejs-14" + "ghcr.io\/parkervcp\/yolks:nodejs_17", + "ghcr.io\/parkervcp\/yolks:nodejs_16", + "ghcr.io\/parkervcp\/yolks:nodejs_14", + "ghcr.io\/parkervcp\/yolks:nodejs_12" ], "file_denylist": [], "startup": "sh .local\/lib\/code-server-{{VERSION}}\/bin\/code-server", @@ -18,11 +21,11 @@ "files": "{\r\n \".config\/code-server\/config.yaml\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"password\": \"password: {{server.build.env.PASSWORD}}\",\r\n \"bind-addr\": \"bind-addr: 0.0.0.0:{{server.build.default.port}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"HTTP server listening on\"\r\n}", "logs": "{}", - "stop": "^C" + "stop": "^^C" }, "scripts": { "installation": { - "script": "apt update\r\napt install -y curl jq\r\nMATCH=linux-amd64\r\n\r\n# Create initial directories\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\n# Create needed directories\r\nmkdir -p \/mnt\/server\/.local\/lib \/mnt\/server\/.local\/bin \/mnt\/server\/.config\/code-server \/mnt\/server\/projects\r\n\r\n# Change permission of projects directory so it can be accessed by code-server\r\nchmod 777 \/mnt\/server\/projects\r\ntouch \"\/mnt\/server\/projects\/PLACE YOUR PROJECTS HERE\"\r\n\r\n# Check for available versions. Defaults to latest if no valid version is found.\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/cdr\/code-server\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/cdr\/code-server\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"v${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# Download the given Version and extract it\r\necho \"Downloading $DOWNLOAD_URL\"\r\ncurl -fL $DOWNLOAD_URL | tar -C \/mnt\/server\/.local\/lib -xz\r\nmv \/mnt\/server\/.local\/lib\/code-server-*linux-amd64 \/mnt\/server\/.local\/lib\/code-server-${VERSION}\r\n\r\n\r\nPATH=\"\/mnt\/server\/.local\/bin:$PATH\"\r\necho \"password: changeme\r\nbind-addr: 0.0.0.0\r\nauth: password\r\ncert: false\" > \/mnt\/server\/.config\/code-server\/config.yaml\r\n\r\necho \"Install complete\"", + "script": "apt update\r\napt install -y curl jq\r\nMATCH=linux-amd64\r\n\r\n# Create initial directories\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\n# Create needed directories\r\nmkdir -p \/mnt\/server\/.local\/lib \/mnt\/server\/.local\/bin \/mnt\/server\/.config\/code-server \/mnt\/server\/projects\r\n\r\n# Change permission of projects directory so it can be accessed by code-server\r\nchmod 777 \/mnt\/server\/projects\r\ntouch \"\/mnt\/server\/projects\/PLACE YOUR PROJECTS HERE\"\r\n\r\n# Check for available versions. Defaults to latest if no valid version is found.\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/coder\/code-server\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/coder\/code-server\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"v${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# Download the given Version and extract it\r\necho \"Downloading $DOWNLOAD_URL\"\r\ncurl -fL $DOWNLOAD_URL | tar -C \/mnt\/server\/.local\/lib -xz\r\nmv \/mnt\/server\/.local\/lib\/code-server-*linux-amd64 \/mnt\/server\/.local\/lib\/code-server-${VERSION}\r\n\r\n\r\nPATH=\"\/mnt\/server\/.local\/bin:$PATH\"\r\necho \"password: changeme\r\nbind-addr: 0.0.0.0\r\nauth: password\r\ncert: false\" > \/mnt\/server\/.config\/code-server\/config.yaml\r\n\r\necho \"Install complete\"", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -47,4 +50,4 @@ "rules": "string|max:20" } ] -} +} \ No newline at end of file From 6e38e1d9e59ae266e0fc66f9fc16730720c11ea5 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Fri, 17 Dec 2021 13:18:38 +0200 Subject: [PATCH 20/64] fix: magma support for newer versions Rewrite the egg to support dev and stable versions, together with newer +1.16 installers. Does not rely on their own API latest fetching, because it picks latest Github release that can include old pre-releases. --- game_eggs/minecraft/java/magma/egg-magma.json | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/game_eggs/minecraft/java/magma/egg-magma.json b/game_eggs/minecraft/java/magma/egg-magma.json index 879f7eec..b39b27fc 100644 --- a/game_eggs/minecraft/java/magma/egg-magma.json +++ b/game_eggs/minecraft/java/magma/egg-magma.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:28:39+03:00", + "exported_at": "2021-12-17T11:15:48+00:00", "name": "Magma", "author": "support@pterodactyl.io", "description": "Magma is most powerful Forge server providing you with Forge mods and Bukkit Plugins using Spigot and Paper for Performance Optimization and Stability.", @@ -15,21 +15,20 @@ "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", "ghcr.io\/pterodactyl\/yolks:java_11", - "ghcr.io\/pterodactyl\/yolks:java_16", "ghcr.io\/pterodactyl\/yolks:java_17" ], "file_denylist": [], "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", "config": { "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"enable-query\": \"true\",\r\n \"server-port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \",\r\n \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}", - "logs": "{\r\n \"custom\": false,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", + "logs": "{}", "stop": "stop" }, "scripts": { "installation": { - "script": "apt update\r\napt install -y curl\r\n\r\nif [ ! -d \/mnt\/server\/ ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\/\r\n\r\nif [ ! -z ${MC_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/api.magmafoundation.org\/api\/resources\/magma\/${MC_VERSION}\/dev\/latest\/download\r\nelse\r\n DOWNLOAD_LINK=https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12.2\/dev\/latest\/download\r\nfi\r\n\r\necho -e \"Download URL is ${DOWNLOAD_LINK}\"\r\n\r\n## validate download link\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ] ; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_LINK}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_LINK}\r\n else \r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\n## mv old server files\r\nif [ -f ${SERVER_JARFILE} ]; then\r\n echo -e \"moving old server.jar\"\r\n mv ${SERVER_JARFILE} ${SERVER_JARFILE}.old\r\nfi\r\n\r\n## download files\r\necho -e \"running: curl -sSL -o ${SERVER_JARFILE} ${DOWNLOAD_LINK}\"\r\ncurl -s -o ${SERVER_JARFILE} -sSL ${DOWNLOAD_LINK}\r\n\r\necho -e \"Install Complete\"", - "container": "debian:buster-slim", + "script": "apt update\r\napt install -y curl jq\r\n\r\nif [[ ! -d \/mnt\/server ]]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\/\r\n\r\n# get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.16.5\/${BRANCH}\/latest\")\r\nOLD_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n\r\nif [[ -z \"${MC_VERSION}\" ]] || [[ \"${MC_VERSION}\" == \"latest\" ]]; then\r\n echo -e \"Version not set. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\n\r\nelif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/${MC_VERSION}\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${CUSTOM_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\nelif [[ \"${MC_VERSION}\" == \"1.12\" ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i server.jar)\r\nelse\r\n # Try to locate version by exact tag name. This will most likely always fail, because the tag names are in a weird format. Leaving it here just in case someone wants to fetch exact tag releases.\r\n VERSION_CHECK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .tag_name')\r\n if [[ \"${MC_VERSION}\" == \"${VERSION_CHECK}\" ]]; then\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .assets[].browser_download_url' | grep -i installer.jar)\r\n else\r\n echo -e \"Specified ${MC_VERSION} version not found. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# validate download link\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then\r\n echo -e \"Validating downlaod link\"\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_LINK}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_LINK}\r\n else\r\n echo -e \"Download URL ${DOWNLOAD_LINK} is invalid. Terminating install.\"\r\n exit 2\r\n fi\r\nfi\r\n\r\nfunction downloadMagma {\r\n echo -e \"running: curl -sSL -o installer.jar ${DOWNLOAD_LINK}\"\r\n curl -sSL -o installer.jar -sSL ${DOWNLOAD_LINK}\r\n}\r\n\r\nif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]] || [[ -z \"${MC_VERSION}\" ]]; then\r\n downloadMagma\r\n echo -e \"1.16.5 or newer version detected. Running installer\"\r\n java -jar installer.jar --installServer || { echo -e \"install failed\" exit 4; }\r\n mv forge-*.jar $SERVER_JARFILE\r\n echo -e \"Deleting installer.jar file.\\n\"\r\n rm -rf *installer.jar\r\nelse\r\n downloadMagma\r\n echo -e \"Older magma version detected. Skipping installer\"\r\n mv installer.jar $SERVER_JARFILE\r\nfi\r\n\r\necho -e \"Install Complete\"", + "container": "openjdk:8-jdk-slim", "entrypoint": "bash" } }, @@ -39,18 +38,27 @@ "description": "The name of the server jarfile to run the server with.", "env_variable": "SERVER_JARFILE", "default_value": "server.jar", - "user_viewable": false, + "user_viewable": true, "user_editable": false, "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/" }, { "name": "Minecraft Version", - "description": "Optional.\r\n\r\nSpecify vanilla version other than default 1.12.2.", + "description": "Optional.\r\n\r\nSpecify the version to install, such as 1.16 or 1.12. Leave empty or set latest to install latest", "env_variable": "MC_VERSION", - "default_value": "", + "default_value": "latest", "user_viewable": true, "user_editable": true, "rules": "nullable|string|max:20" + }, + { + "name": "Branch [dev or stable]", + "description": "Branch to install. Valid options: dev or stable", + "env_variable": "BRANCH", + "default_value": "dev", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:dev,stable" } ] -} +} \ No newline at end of file From 044ff5c44772efa638217704636ed2557cd0d1ca Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Fri, 17 Dec 2021 13:23:28 +0200 Subject: [PATCH 21/64] fix: add Mohist egg back Mohist was by mistake removed in #1453 PR --- .../minecraft/java/mohist/egg-mohist.json | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 game_eggs/minecraft/java/mohist/egg-mohist.json diff --git a/game_eggs/minecraft/java/mohist/egg-mohist.json b/game_eggs/minecraft/java/mohist/egg-mohist.json new file mode 100644 index 00000000..d2f5c960 --- /dev/null +++ b/game_eggs/minecraft/java/mohist/egg-mohist.json @@ -0,0 +1,74 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2021-06-14T21:28:24+03:00", + "name": "Mohist", + "author": "alex.chang-lam@protonmail.com", + "description": "Spigot fork with performance optimizations.", + "features": [ + "eula", + "java_version" + ], + "images": [ + "ghcr.io\/pterodactyl\/yolks:java_8", + "ghcr.io\/pterodactyl\/yolks:java_11", + "ghcr.io\/pterodactyl\/yolks:java_16", + "ghcr.io\/pterodactyl\/yolks:java_17" + ], + "file_denylist": [], + "startup": "java -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}} pause", + "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 }\r\n }\r\n}", + "startup": "{\r\n \"done\": \")! For help, type \",\r\n \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}", + "logs": "{}", + "stop": "stop" + }, + "scripts": { + "installation": { + "script": "#!\/bin\/bash\r\n# Mohist Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl\r\n\r\n#Go into main direction\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nif [ ! -z ${BUILD_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_VERSION}\/download\r\nelse\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_TYPE}\/download\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\necho -e \"Downloading build version ${BUILD_VERSION}\"\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}-server.jar; then\r\n echo -e \"Download link is valid.\"\r\n else\r\n echo -e \"Link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\ncurl -s -o server.jar -sS ${DOWNLOAD_LINK}\r\n\r\n#Checking if downloaded jars exist\r\nif [ ! -f .\/server.jar ]; then\r\n echo \"!!! Error downloading build version ${BUILD_VERSION} !!!\"\r\n exit\r\nfi", + "container": "debian:buster-slim", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "Server Jar File", + "description": "The name of the jarfile to run the server with.", + "env_variable": "SERVER_JARFILE", + "default_value": "server.jar", + "user_viewable": false, + "user_editable": false, + "rules": "required|string|max:20" + }, + { + "name": "Minecraft Version", + "description": "The version of Minecraft to download.", + "env_variable": "MC_VERSION", + "default_value": "1.16.5", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:20" + }, + { + "name": "Build Number", + "description": "Optional: \r\nThe build number for the Mohist release. Overrides Build Type.", + "env_variable": "BUILD_VERSION", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|string|max:20" + }, + { + "name": "Build Type", + "description": "The type of server jar to download from Mohist.\r\n\r\nValid types are \"recommended\" and \"latest\".", + "env_variable": "BUILD_TYPE", + "default_value": "latest", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:20" + } + ] +} From b7eab9d717f95001d4e9ea6cdadac2e25a331d90 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Sat, 18 Dec 2021 17:41:17 +0100 Subject: [PATCH 22/64] Add Left 4 Dead and Left 4 Dead 2 --- README.md | 2 + game_eggs/README.md | 2 + game_eggs/steamcmd_servers/README.md | 6 +++ .../steamcmd_servers/left4dead/README.md | 16 ++++++ .../left4dead/egg-left4dead.json | 50 +++++++++++++++++++ .../steamcmd_servers/left4dead_2/README.md | 16 ++++++ .../left4dead_2/egg-left4dead_2.json | 50 +++++++++++++++++++ 7 files changed, 142 insertions(+) create mode 100644 game_eggs/steamcmd_servers/left4dead/README.md create mode 100644 game_eggs/steamcmd_servers/left4dead/egg-left4dead.json create mode 100644 game_eggs/steamcmd_servers/left4dead_2/README.md create mode 100644 game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json diff --git a/README.md b/README.md index 3747d4a3..914202d6 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,8 @@ If you are reading this it looks like you are looking to add an egg to your serv * [Hurtworld](game_eggs/steamcmd_servers/hurtworld) * [Insurgency: Sandstorm](game_eggs/steamcmd_servers/insurgency_sandstorm) * [Killing Floor 2](game_eggs/steamcmd_servers/killing_floor_2) +* [Left 4 Dead](game_eggs/steamcdm_servers/left4dead) +* [Left 4 Dead 2](game_eggs/steamcdm_servers/left4dead_2) * [Modiverse](game_eggs/steamcmd_servers/modiverse) * [Mordhau](game_eggs/steamcmd_servers/mordhau) * [No More Room in Hell](game_eggs/steamcmd_servers/nmrih) diff --git a/game_eggs/README.md b/game_eggs/README.md index 8516677e..f13204fb 100644 --- a/game_eggs/README.md +++ b/game_eggs/README.md @@ -111,6 +111,8 @@ * [Hurtworld](steamcmd_servers/hurtworld) * [Insurgency: Sandstorm](steamcmd_servers/insurgency_sandstorm) * [Killing Floor 2](steamcmd_servers/killing_floor_2) +* [Left 4 Dead](steamcmd_servers/left4dead) +* [Left 4 Dead 2](steamcmd_servers/left4dead_2) * [Modiverse](steamcmd_servers/modiverse) * [Mordhau](steamcmd_servers/mordhau) * [No More Room in Hell](steamcmd_servers/nmrih) diff --git a/game_eggs/steamcmd_servers/README.md b/game_eggs/steamcmd_servers/README.md index f65d36e1..94cf2db6 100644 --- a/game_eggs/steamcmd_servers/README.md +++ b/game_eggs/steamcmd_servers/README.md @@ -50,6 +50,12 @@ This is a collection of servers that use SteamCMD to install. ## Killing Floor 2 [Killing Floor 2](killing_floor_2) +## Left 4 Dead +[Left 4 Dead](left4dead) + +## Left 4 Dead 2 +[Left 4 Dead](left4dead_2) + ## Modiverse [Modiverse](modiverse) diff --git a/game_eggs/steamcmd_servers/left4dead/README.md b/game_eggs/steamcmd_servers/left4dead/README.md new file mode 100644 index 00000000..b4b7b611 --- /dev/null +++ b/game_eggs/steamcmd_servers/left4dead/README.md @@ -0,0 +1,16 @@ +# Left 4 Dead + +## From their [Website](https://www.l4d.com/) + +Set in the immediate aftermath of the zombie apocalypse, L4D's survival co-op mode lets you blast a path through the infected in four unique “movies,” guiding your survivors across the rooftops of an abandoned metropolis, through rural ghost towns and pitch-black forests in your quest to escape a devastated Ground Zero crawling with infected enemies. Each "movie" is comprised of five large maps, and can be played by one to four human players, with an emphasis on team-based strategy and objectives. + +### Server Ports + +L4D servers require 1 port to be open. The port can be safely changed to any other. + +| Port | default | +|-----------|---------| +| Game/rcon | 27015 | + +## Steam Download [SteamStore](https://store.steampowered.com/app/500/Left_4_Dead/) + diff --git a/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json new file mode 100644 index 00000000..a538ca27 --- /dev/null +++ b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json @@ -0,0 +1,50 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2021-10-13T19:07:48+02:00", + "name": "Left 4 Dead", + "author": "pterodactyl@mazoyer.eu", + "description": "An outbreak of a highly contagious pathogen nicknamed the \"Green Flu\" begins in Pennsylvania. Two weeks after the first infection, four immune survivors, Bill, Zoey, Louis, and Francis make their way out of the city of Fairfield, only to discover that the infection is creating dangerous mutations in some of its hosts.", + "features": null, + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], + "startup": ".\/srcds_run -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", + "config": { + "files": "{}", + "startup": "{\r\n \"done\": \"Connection to Steam servers successful.\",\r\n \"userInteraction\": []\r\n}", + "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "stop": "quit" + }, + "scripts": { + "installation": { + "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", + "container": "debian:bullseye", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "Game ID", + "description": "The ID corresponding to the game to download and run using SRCDS.", + "env_variable": "SRCDS_APPID", + "default_value": "222840", + "user_viewable": true, + "user_editable": false, + "rules": "required|regex:\/^(222840)$\/" + }, + { + "name": "Default Map", + "description": "Default map used when starting the server.", + "env_variable": "SRCDS_MAP", + "default_value": "l4d_hospital01_apartment", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:40" + } + ] +} \ No newline at end of file diff --git a/game_eggs/steamcmd_servers/left4dead_2/README.md b/game_eggs/steamcmd_servers/left4dead_2/README.md new file mode 100644 index 00000000..affe440f --- /dev/null +++ b/game_eggs/steamcmd_servers/left4dead_2/README.md @@ -0,0 +1,16 @@ +# Left 4 Dead 2 + +## From their [Website](https://www.l4d.com/) + +Set in the zombie apocalypse, Left 4 Dead 2 (L4D2) is the highly anticipated sequel to the award-winning Left 4 Dead, the #1 co-op game of 2008. + +### Server Ports + +L4D 2 servers require 1 port to be open. The port can be safely changed to any other. + +| Port | default | +|-----------|---------| +| Game/rcon | 27015 | + +## Steam Download [SteamStore](https://store.steampowered.com/app/550/Left_4_Dead_2/) + diff --git a/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json new file mode 100644 index 00000000..6cc95d36 --- /dev/null +++ b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json @@ -0,0 +1,50 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2021-10-13T23:28:59+02:00", + "name": "Left 4 Dead 2", + "author": "pterodactyl@mazoyer.eu", + "description": "Left 4 Dead 2 is set in the aftermath of a worldwide pandemic of a disease nicknamed the \"Green Flu\", which rapidly transforms humans into zombie-like creatures and mutated forms that demonstrate extreme aggression towards non-infected beings. A few humans are immune to the disease, while some of those who are infected have no symptoms. The Civil Emergency and Defense Agency (CEDA) and the U.S. military create safe zones to attempt to evacuate as many survivors as possible.", + "features": null, + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], + "startup": ".\/srcds_run -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", + "config": { + "files": "{}", + "startup": "{\r\n \"done\": \"Connection to Steam servers successful.\",\r\n \"userInteraction\": []\r\n}", + "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "stop": "quit" + }, + "scripts": { + "installation": { + "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", + "container": "debian:bullseye", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "Game ID", + "description": "The ID corresponding to the game to download and run using SRCDS.", + "env_variable": "SRCDS_APPID", + "default_value": "222860", + "user_viewable": true, + "user_editable": false, + "rules": "required|regex:\/^(222860)$\/" + }, + { + "name": "Default Map", + "description": "Default map used when starting the server.", + "env_variable": "SRCDS_MAP", + "default_value": "c1m1_hotel", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:40" + } + ] +} \ No newline at end of file From b90ff3e6e82c7ff11e852b5d68205791d8517267 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Sat, 18 Dec 2021 19:01:28 +0100 Subject: [PATCH 23/64] Use proper docker images --- game_eggs/steamcmd_servers/left4dead/egg-left4dead.json | 6 +++--- game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json index a538ca27..ae16efa9 100644 --- a/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json +++ b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json @@ -10,7 +10,7 @@ "description": "An outbreak of a highly contagious pathogen nicknamed the \"Green Flu\" begins in Pennsylvania. Two weeks after the first infection, four immune survivors, Bill, Zoey, Louis, and Francis make their way out of the city of Fairfield, only to discover that the infection is creating dangerous mutations in some of its hosts.", "features": null, "images": [ - "quay.io\/pterodactyl\/core:source" + "ghcr.io\/parkervcp\/games:source" ], "file_denylist": [], "startup": ".\/srcds_run -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", @@ -23,7 +23,7 @@ "scripts": { "installation": { "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", - "container": "debian:bullseye", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, @@ -47,4 +47,4 @@ "rules": "required|string|max:40" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json index 6cc95d36..8c2ef2e3 100644 --- a/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json +++ b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json @@ -10,7 +10,7 @@ "description": "Left 4 Dead 2 is set in the aftermath of a worldwide pandemic of a disease nicknamed the \"Green Flu\", which rapidly transforms humans into zombie-like creatures and mutated forms that demonstrate extreme aggression towards non-infected beings. A few humans are immune to the disease, while some of those who are infected have no symptoms. The Civil Emergency and Defense Agency (CEDA) and the U.S. military create safe zones to attempt to evacuate as many survivors as possible.", "features": null, "images": [ - "quay.io\/pterodactyl\/core:source" + "ghcr.io\/parkervcp\/games:source" ], "file_denylist": [], "startup": ".\/srcds_run -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", @@ -23,7 +23,7 @@ "scripts": { "installation": { "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", - "container": "debian:bullseye", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, @@ -47,4 +47,4 @@ "rules": "required|string|max:40" } ] -} \ No newline at end of file +} From 96f963db1be19657d101e90040c2ad060dac3ab5 Mon Sep 17 00:00:00 2001 From: Encode42 Date: Sat, 18 Dec 2021 22:13:56 -0500 Subject: [PATCH 24/64] Update Purpur egg description (#1488) --- game_eggs/minecraft/java/purpur/egg-purpur.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/minecraft/java/purpur/egg-purpur.json b/game_eggs/minecraft/java/purpur/egg-purpur.json index 84849ad5..808bdd90 100644 --- a/game_eggs/minecraft/java/purpur/egg-purpur.json +++ b/game_eggs/minecraft/java/purpur/egg-purpur.json @@ -4,10 +4,10 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-09T13:30:47-05:00", + "exported_at": "2021-12-18T19:20:26-05:00", "name": "Purpur", "author": "purpur@birdflop.com", - "description": "Fork of Paper and Tuinity providing new configuration options.", + "description": "A drop-in replacement for Paper servers designed for configurability, and new fun and exciting gameplay features.", "features": [ "eula", "java_version" From d45ffa37d3e70847036a91f983c8740aff6d4d95 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Wed, 22 Dec 2021 11:12:44 +0200 Subject: [PATCH 25/64] fix: beamng glibc requirements Update Docker images and rewrite beamng to use github release grabber allowing to specify versions. --- game_eggs/beamng/beammp/beammp.json | 16 ++++++++-------- game_eggs/beamng/kissmp/egg-kissmp.json | 14 +++++++++----- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/game_eggs/beamng/beammp/beammp.json b/game_eggs/beamng/beammp/beammp.json index 0837acd6..83c088a5 100644 --- a/game_eggs/beamng/beammp/beammp.json +++ b/game_eggs/beamng/beammp/beammp.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-04-17T15:17:54-04:00", + "exported_at": "2021-12-22T09:10:34+00:00", "name": "BeamMP Servers", "author": "noah@noahserver.online", "description": "This is the server for the multiplayer mod BeamMP for the game BeamNG.drive. The server is the point throug which all clients communicate. You can write lua mods for the server, detailed instructions on the BeamMP Wiki.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/BeamMP-Server", @@ -22,19 +22,19 @@ }, "scripts": { "installation": { - "script": "cd \/mnt\/server\r\n\r\nrm -f BeamMP-Server\r\n\r\napt update -y\r\napt install -y curl\r\ncurl -LJO https:\/\/github.com\/BeamMP\/BeamMP-Server\/releases\/download\/${VERSION}\/BeamMP-Server-linux\r\nmv BeamMP-Server-linux BeamMP-Server\r\nchmod +x BeamMP-Server\r\n\r\necho \"# This is the BeamMP Server Configuration File v0.60\r\nDebug = false # true or false to enable debug console output\r\nPrivate = true # Private?\r\nPort = 30814 # Port to run the server on UDP and TCP\r\nCars = 1 # Max cars for every player\r\nMaxPlayers = 10 # Maximum Amount of Clients\r\nMap = \\\"\/levels\/gridmap\/info.json\\\" # Default Map\r\nName = \\\"BeamMP New Server\\\" # Server Name\r\nDesc = \\\"BeamMP Default Description\\\" # Server Description\r\nuse = \\\"Resources\\\" # Resource file name\r\nAuthKey = \\\"\\\" # Auth Key\" > Server.cfg", - "container": "debian:buster-slim", + "script": "mkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nrm -f BeamMP-Server\r\n\r\n## get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/BeamMP\/BeamMP-Server\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/BeamMP\/BeamMP-Server\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n echo -e \"Using latest version\"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i Server-linux)\r\nelse\r\n echo -e \"Chosen version :${VERSION}. Verifying version from releases\"\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i Server-linux)\r\n else\r\n echo -e \"No valid versions found. Defaulting to the latest release\"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_URL} -o BeamMP-Server\"\r\ncurl -L ${DOWNLOAD_URL} -o BeamMP-Server\r\nchmod +x BeamMP-Server\r\n\r\necho \"# This is the BeamMP Server Configuration File v0.60\r\nDebug = false # true or false to enable debug console output\r\nPrivate = true # Private?\r\nPort = 30814 # Port to run the server on UDP and TCP\r\nCars = 1 # Max cars for every player\r\nMaxPlayers = 10 # Maximum Amount of Clients\r\nMap = \\\"\/levels\/gridmap\/info.json\\\" # Default Map\r\nName = \\\"BeamMP New Server\\\" # Server Name\r\nDesc = \\\"BeamMP Default Description\\\" # Server Description\r\nuse = \\\"Resources\\\" # Resource file name\r\nAuthKey = \\\"\\\" # Auth Key\" > Server.cfg", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, "variables": [ { - "name": "Version", - "description": "Github Server Version, to see all versions visit https:\/\/github.com\/BeamMP\/BeamMP-Server\/releases", + "name": "Version to install", + "description": "Latest or invalid versions would default to latest. See all versions visit https:\/\/github.com\/BeamMP\/BeamMP-Server\/releases", "env_variable": "VERSION", - "default_value": "v2.0.3", + "default_value": "latest", "user_viewable": true, - "user_editable": false, + "user_editable": true, "rules": "required|string|max:32" }, { diff --git a/game_eggs/beamng/kissmp/egg-kissmp.json b/game_eggs/beamng/kissmp/egg-kissmp.json index 5fa42529..b1f82bde 100644 --- a/game_eggs/beamng/kissmp/egg-kissmp.json +++ b/game_eggs/beamng/kissmp/egg-kissmp.json @@ -1,18 +1,22 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2021-02-15T20:05:24+00:00", + "exported_at": "2021-12-22T09:08:37+00:00", "name": "KissMP Server", "author": "me@weilbyte.dev", "description": "Server for the KISS Multiplayer BeamNG.drive mod", "features": null, - "image": "quay.io\/parkervcp\/pterodactyl-images:base_debian", + "images": [ + "ghcr.io\/parkervcp\/yolks:debian" + ], + "file_denylist": [], "startup": ".\/kissmp-server", "config": { "files": "{\r\n \"config.json\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Server is running!\",\r\n \"userInteraction\": []\r\n}", + "startup": "{\r\n \"done\": \"Server is running!\"\r\n}", "logs": "{}", "stop": "^C" }, @@ -24,4 +28,4 @@ } }, "variables": [] -} \ No newline at end of file +} From 1005f7e95110b4297083c792852842a24e0db7d5 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Thu, 23 Dec 2021 09:48:34 +0100 Subject: [PATCH 26/64] Add telnet variable to 7d2d (#1495) * added Telnet Variable --- .../7_days_to_die/egg-7-days-to-die.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json index 0a9652b8..b1e3a7f6 100644 --- a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json +++ b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-13T03:08:36+00:00", + "exported_at": "2021-12-22T12:58:29+01:00", "name": "7 Days To Die", "author": "kristoffer.norman@bahnhof.se", "description": "7 days to die server", @@ -13,7 +13,7 @@ "ghcr.io\/parkervcp\/games:source" ], "file_denylist": [], - "startup": ".\/7DaysToDieServer.x86_64 -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated -ServerPort=${SERVER_PORT} -ServerMaxPlayerCount=${MAX_PLAYERS} -GameDifficulty=${GAME_DIFFICULTY} -ControlPanelEnabled=false -TelnetEnabled=true -TelnetPort=8081 -TelnetPassword=${PASSWORD} -logfile logs\/latest.log & echo -e \"Checking on telnet connection\" && until nc -z -v -w5 127.0.0.1 8081; do echo \"Waiting for telnet connection...\"; sleep 5; done && $( [[ -z ${PASSWORD} ]] && printf %s \"telnet -E 127.0.0.1 8081\" || printf %s \"rcon -t telnet -a 127.0.0.1:8081 -p {{PASSWORD}}\" )", + "startup": ".\/7DaysToDieServer.x86_64 -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated -ServerPort=${SERVER_PORT} -ServerMaxPlayerCount=${MAX_PLAYERS} -GameDifficulty=${GAME_DIFFICULTY} -ControlPanelEnabled=false -TelnetEnabled=true -TelnetPort=${TELNET_PORT} -TelnetPassword=${PASSWORD} -logfile logs\/latest.log & echo -e \"Checking on telnet connection\" && until nc -z -v -w5 127.0.0.1 ${TELNET_PORT}; do echo \"Waiting for telnet connection...\"; sleep 5; done && $( [[ -z ${PASSWORD} ]] && printf %s \"telnet -E 127.0.0.1 ${TELNET_PORT}\" || printf %s \"rcon -t telnet -a 127.0.0.1:${TELNET_PORT} -p {{PASSWORD}}\" )", "config": { "files": "{}", "startup": "{\r\n \"done\": \"Connected with 7DTD server\"\r\n}", @@ -90,6 +90,15 @@ "user_viewable": true, "user_editable": true, "rules": "nullable|string|max:30" + }, + { + "name": "Telnet Port", + "description": "", + "env_variable": "TELNET_PORT", + "default_value": "8081", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From 6df3bc32d7beb58b03ba362be7a314b9ff0f4538 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 29 Dec 2021 09:45:04 -0500 Subject: [PATCH 27/64] Update Project Zomboid Egg to support beta versions (#1475) Co-authored-by: softwarenoob --- .../project_zomboid/egg-project-zomboid.json | 66 ++++++++++++++----- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json index 92910441..ff70d030 100644 --- a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json +++ b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json @@ -1,24 +1,29 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-06-06T11:23:23-07:00", + "exported_at": "2021-12-29T14:38:26+00:00", "name": "Project Zomboid", "author": "iamkubi@gmail.com", "description": "Project Zomboid is an open world survival horror video game in alpha stage development by British and Canadian independent developer, The Indie Stone. The game is set in a post apocalyptic, zombie infested world where the player is challenged to survive for as long as possible before inevitably dying.", - "image": "quay.io\/pterodactyl\/core:source", - "startup": "\/home\/container\/start-server.sh -port {{SERVER_PORT}} -steamport1 {{STEAM_PORT}} -servername \\\"{{SERVER_NAME}}\\\" -adminusername {{ADMIN_USER}} -adminpassword \"{{ADMIN_PASSWORD}}\"", + "features": null, + "images": [ + "ghcr.io\/pterodactyl\/games:source" + ], + "file_denylist": [], + "startup": "\/home\/container\/start-server.sh -port {{SERVER_PORT}} -steamport1 {{STEAM_PORT}} -cachedir=\/home\/container\/.cache -servername \\\"{{SERVER_NAME}}\\\" -adminusername {{ADMIN_USER}} -adminpassword \"{{ADMIN_PASSWORD}}\"", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"SERVER STARTED\",\r\n \"userInteraction\": []\r\n}", + "startup": "{\r\n \"done\": \"SERVER STARTED\"\r\n}", "logs": "{}", "stop": "^C" }, "scripts": { "installation": { - "script": "apt update\r\napt -y --no-install-recommends install curl unzip lib32gcc1 ca-certificates\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\nmkdir -p \/mnt\/server\/steam\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steam\r\ncd \/mnt\/server\/steam\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update 380870 +quit\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v \/mnt\/server\/steam\/linux32\/steamclient.so \/mnt\/server\/.steam\/sdk32\/steamclient.so", - "container": "debian:buster-slim", + "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'ghcr.io\/parkervcp\/installers:debian'\r\n\r\n##\r\n#\r\n# Variables\r\n# STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n# WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n# SRCDS_APPID - steam app id found here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Servers_List\r\n# SRCDS_BETAID - beta branch of a steam app. Leave blank to install normal branch\r\n# SRCDS_BETAPASS - password for a beta branch should one be required during private or closed testing phases.. Leave blank for no password.\r\n# INSTALL_FLAGS - Any additional SteamCMD flags to pass during install.. Keep in mind that steamcmd auto update process in the docker image might overwrite or ignore these when it performs update on server boot.\r\n# AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n#\r\n\r\n\r\n## just in case someone removed the defaults.\r\nif [[ \"${STEAM_USER}\" == \"\" ]] || [[ \"${STEAM_PASS}\" == \"\" ]]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s \"-beta ${SRCDS_BETAID}\" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s \"-betapassword ${SRCDS_BETAPASS}\" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, @@ -28,8 +33,8 @@ "description": "Name of the server", "env_variable": "SERVER_NAME", "default_value": "Project Zomboid Server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:64" }, { @@ -37,8 +42,8 @@ "description": "Username for the admin account", "env_variable": "ADMIN_USER", "default_value": "admin", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:20" }, { @@ -46,8 +51,8 @@ "description": "Password for the admin account", "env_variable": "ADMIN_PASSWORD", "default_value": "password", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:32" }, { @@ -55,8 +60,8 @@ "description": "Sets the SteamPort1 option", "env_variable": "STEAM_PORT", "default_value": "8766", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|string|max:20" }, { @@ -64,8 +69,35 @@ "description": "Maximum players to allow", "env_variable": "MAX_PLAYERS", "default_value": "10", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, + "rules": "required|string|max:20" + }, + { + "name": "PZ Steam App ID", + "description": "PZ Steam App ID", + "env_variable": "SRCDS_APPID", + "default_value": "380870", + "user_viewable": false, + "user_editable": false, + "rules": "required|string|max:20" + }, + { + "name": "Steam Beta Branch [requires reinstall]", + "description": "Beta branch to install, such as b41multiplayer. Leave blank to install normal branch", + "env_variable": "SRCDS_BETAID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|string|max:64" + }, + { + "name": "Steam Auto Update", + "description": "Enable or disable auto-update on startup. 0 to disable and 1 to enable.", + "env_variable": "AUTO_UPDATE", + "default_value": "0", + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:20" } ] From f2a4cb7b77f863bb203c2d105be812e815be03bf Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Wed, 29 Dec 2021 17:24:20 +0200 Subject: [PATCH 28/64] require install logs for bug reports --- .github/ISSUE_TEMPLATE/bug-report.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 5bb78cc2..66b2f85f 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -72,9 +72,20 @@ body: Step 3 Receive error X or Y validations: required: true - - type: textarea - id: logs + - type: input + id: install-logs attributes: - label: Relevant log output - description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. - render: shell + label: Install logs + description: | + Run the command below on the SSH terminal of your Wings machine and provide the link to logs. + + **If using Pterodactyl 1.x or newer:** + + `tail -n 100 $(ls -Alrt /var/log/pterodactyl/install/*.log | tail -1 | sed 's/ */ /g' | cut -s -d' ' -f9) | nc pteropaste.com 99` + **If using legacy Pterodactyl 0.7:** + + `tail -n 100 $(ls -Alrt /srv/daemon/config/servers/*/install.log | tail -1 | sed 's/ */ /g' | cut -s -d' ' -f9) | nc pteropaste.com 99` + placeholder: | + https://pteropaste.com/exampleLogs + validations: + required: true \ No newline at end of file From b1b6d55ee49d127ca4f534a25fbcdcc496b44150 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Wed, 29 Dec 2021 17:35:40 +0200 Subject: [PATCH 29/64] (bug-reports): drop support for 0.7 --- .github/ISSUE_TEMPLATE/bug-report.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 66b2f85f..e17866da 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -79,12 +79,7 @@ body: description: | Run the command below on the SSH terminal of your Wings machine and provide the link to logs. - **If using Pterodactyl 1.x or newer:** - `tail -n 100 $(ls -Alrt /var/log/pterodactyl/install/*.log | tail -1 | sed 's/ */ /g' | cut -s -d' ' -f9) | nc pteropaste.com 99` - **If using legacy Pterodactyl 0.7:** - - `tail -n 100 $(ls -Alrt /srv/daemon/config/servers/*/install.log | tail -1 | sed 's/ */ /g' | cut -s -d' ' -f9) | nc pteropaste.com 99` placeholder: | https://pteropaste.com/exampleLogs validations: From 5e66ccde54630dcd808d27a61c68b569af154980 Mon Sep 17 00:00:00 2001 From: Toasty Date: Sat, 1 Jan 2022 12:58:12 -0600 Subject: [PATCH 30/64] Update stop command for Project Zomboid Using ^C forces the server closes and doesn't let it save; quit saves then closes it gracefully --- .../steamcmd_servers/project_zomboid/egg-project-zomboid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json index ff70d030..4ecec781 100644 --- a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json +++ b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json @@ -18,7 +18,7 @@ "files": "{}", "startup": "{\r\n \"done\": \"SERVER STARTED\"\r\n}", "logs": "{}", - "stop": "^C" + "stop": "quit" }, "scripts": { "installation": { From a62842e25d3125a86fcc2c7bc002959d90263e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mich=C3=A6l?= <37770229+Michael-xT@users.noreply.github.com> Date: Sat, 1 Jan 2022 22:59:33 +0200 Subject: [PATCH 31/64] Updated Stop command Updated Stop command in order to stop it gracefully --- game_eggs/gta/altv/egg-alt--v.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/gta/altv/egg-alt--v.json b/game_eggs/gta/altv/egg-alt--v.json index cd2acfca..5052a307 100644 --- a/game_eggs/gta/altv/egg-alt--v.json +++ b/game_eggs/gta/altv/egg-alt--v.json @@ -18,7 +18,7 @@ "files": "{\r\n \"server.cfg\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"host:\": \"host: 0.0.0.0\",\r\n \"port:\": \"port: {{server.build.default.port}}\",\r\n \"password:\": \"password: {{server.build.env.PASSWORD}}\",\r\n \"description:\": \"description: {{server.build.env.SERVER_DESC}}\"\r\n }\r\n },\r\n \"update.cfg\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"branch\": \"{{server.build.env.BUILD}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Server started\"\r\n}", "logs": "{}", - "stop": "^C" + "stop": "quit" }, "scripts": { "installation": { From 966e93372839e7671e26e7feb8e952e9fce54540 Mon Sep 17 00:00:00 2001 From: ICon Date: Sun, 2 Jan 2022 13:20:39 -0700 Subject: [PATCH 32/64] Modified Factorio Egg for better start script --- game_eggs/factorio/factorio/egg-factorio.json | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/game_eggs/factorio/factorio/egg-factorio.json b/game_eggs/factorio/factorio/egg-factorio.json index a3462ccc..48b933f4 100644 --- a/game_eggs/factorio/factorio/egg-factorio.json +++ b/game_eggs/factorio/factorio/egg-factorio.json @@ -3,21 +3,25 @@ "meta": { "version": "PTDL_v1" }, - "exported_at": "2020-06-26T12:55:32-04:00", + "exported_at": "2022-01-02T14:45:19-05:00", "name": "Factorio", "author": "parker@parkervcp.com", "description": "The vanilla Factorio server.\r\n\r\nhttps:\/\/www.factorio.com\/", - "image": "quay.io\/parkervcp\/pterodactyl-images:base_debian", - "startup": ".\/bin\/x64\/factorio --port {{SERVER_PORT}} --server-settings data\/server-settings.json --start-server {{SAVE_NAME}}.zip", + "features": null, + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:base_debian" + ], + "file_denylist": [], + "startup": "if [ ! -f \".\/saves\/{{SAVE_NAME}}.zip\" ]; then .\/bin\/x64\/factorio --create .\/saves\/{{SAVE_NAME}}.zip --map-gen-settings data\/map-gen-settings.json --map-settings data\/map-settings.json; fi;\r\n .\/bin\/x64\/factorio --port {{SERVER_PORT}} --server-settings data\/server-settings.json --start-server saves\/{{SAVE_NAME}}.zip", "config": { "files": "{\r\n \"data\/server-settings.json\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"name\": \"{{server.build.env.SERVER_NAME}}\",\r\n \"description\": \"{{server.build.env.SERVER_DESC}}\",\r\n \"max_players\": \"{{server.build.env.MAX_SLOTS}}\",\r\n \"username\": \"{{server.build.env.SERVER_USERNAME}}\",\r\n \"token\": \"{{server.build.env.SERVER_TOKEN}}\",\r\n \"autosave_interval\": \"{{server.build.env.SAVE_INTERVAL}}\",\r\n \"autosave_slots\": \"{{server.build.env.SAVE_SLOTS}}\",\r\n \"afk_autokick_interval\": \"{{server.build.env.AFK_KICK}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Hosting game at\",\r\n \"userInteraction\": []\r\n}", + "startup": "{\r\n \"done\": \"Hosting game at\"\r\n}", "logs": "{\r\n \"custom\": false,\r\n \"location\": \"factorio-current.log\"\r\n}", "stop": "\/quit" }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# Factorio Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update \r\napt install -y curl tar xz-utils jq\r\n\r\nVERSION_JSON=$(curl -sSL https:\/\/factorio.com\/api\/latest-releases)\r\n\r\nlatest_stable=$(echo $VERSION_JSON | jq -r '.stable.headless')\r\nlatest_experimental=$(echo $VERSION_JSON | jq -r '.experimental.headless')\r\n\r\nif [ -z \"${FACTORIO_VERSION}\" ] || [ \"${FACTORIO_VERSION}\" == \"latest\" ]; then\r\n DL_VERSION=$latest_stable\r\nelif [ \"${FACTORIO_VERSION}\" == \"experimental\" ]; then\r\n DL_VERSION=$latest_experimental\r\nelse\r\n DL_VERSION=${FACTORIO_VERSION}\r\nfi\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\necho -e \"\\n running 'curl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}' \\n\"\r\n\r\ncurl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}\r\n\r\ntar -xf factorio-${DL_VERSION} --strip-components=1 -C \/mnt\/server\r\n\r\nrm factorio-${DL_VERSION}\r\n\r\nif [ -e data\/map-gen-settings.json ]; then\r\n echo \"map-gen exists\"\r\nelse\r\n echo \"copying map-gen default settings\"\r\n mv data\/map-gen-settings.example.json data\/map-gen-settings.json\r\nfi\r\n\r\nif [ -e data\/server-settings.json ]; then\r\n echo \"server settings exists\"\r\nelse\r\n echo \"copying server default settings\"\r\n mv data\/server-settings.example.json data\/server-settings.json\r\nfi\r\n\r\nif [ -e map-settings.json ]; then\r\n echo \"map settings exists\"\r\nelse\r\n echo \"copying map default settings\"\r\n mv data\/map-settings.example.json data\/map-settings.json\r\nfi\r\n\r\nif [ -e ${SAVE_NAME}.zip ]; then\r\n echo \"save file exists\"\r\nelse\r\n .\/bin\/x64\/factorio --create ${SAVE_NAME}\r\n chmod o+w ${SAVE_NAME}.zip\r\nfi", + "script": "#!\/bin\/bash\r\n# Factorio Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update \r\napt install -y curl tar xz-utils jq\r\n\r\nVERSION_JSON=$(curl -sSL https:\/\/factorio.com\/api\/latest-releases)\r\n\r\nlatest_stable=$(echo $VERSION_JSON | jq -r '.stable.headless')\r\nlatest_experimental=$(echo $VERSION_JSON | jq -r '.experimental.headless')\r\n\r\nif [ -z \"${FACTORIO_VERSION}\" ] || [ \"${FACTORIO_VERSION}\" == \"latest\" ]; then\r\n DL_VERSION=$latest_stable\r\nelif [ \"${FACTORIO_VERSION}\" == \"experimental\" ]; then\r\n DL_VERSION=$latest_experimental\r\nelse\r\n DL_VERSION=${FACTORIO_VERSION}\r\nfi\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\necho -e \"\\n running 'curl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}' \\n\"\r\n\r\ncurl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}\r\n\r\ntar -xf factorio-${DL_VERSION} --strip-components=1 -C \/mnt\/server\r\n\r\nrm factorio-${DL_VERSION}\r\n\r\nif [ -e data\/map-gen-settings.json ]; then\r\n echo \"map-gen exists\"\r\nelse\r\n echo \"copying map-gen default settings\"\r\n mv data\/map-gen-settings.example.json data\/map-gen-settings.json\r\nfi\r\n\r\nif [ -e data\/server-settings.json ]; then\r\n echo \"server settings exists\"\r\nelse\r\n echo \"copying server default settings\"\r\n mv data\/server-settings.example.json data\/server-settings.json\r\nfi\r\n\r\nif [ -e map-settings.json ]; then\r\n echo \"map settings exists\"\r\nelse\r\n echo \"copying map default settings\"\r\n mv data\/map-settings.example.json data\/map-settings.json\r\nfi\r\n\r\nif [ -e .\/saves\/${SAVE_NAME}.zip ]; then\r\n echo \"save file exists\"\r\nelse\r\n .\/bin\/x64\/factorio --create .\/saves\/${SAVE_NAME} --map-gen-settings data\/map-gen-settings.json --map-settings data\/map-settings.json\r\n chmod o+w .\/saves\/${SAVE_NAME}.zip\r\nfi", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -28,8 +32,8 @@ "description": "Which version of Factorio to install and use.", "env_variable": "FACTORIO_VERSION", "default_value": "latest", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|between:3,12" }, { @@ -37,8 +41,8 @@ "description": "Total number of slots to allow on the server.", "env_variable": "MAX_SLOTS", "default_value": "20", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|numeric|digits_between:1,3" }, { @@ -46,8 +50,8 @@ "description": "The save name for the server.", "env_variable": "SAVE_NAME", "default_value": "gamesave", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "alpha_dash|between:1,100" }, { @@ -55,8 +59,8 @@ "description": "Your factorio.com token, it is required for your server to be visible in the public server list.", "env_variable": "SERVER_TOKEN", "default_value": "undefined", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "alpha_num|max:100" }, { @@ -64,8 +68,8 @@ "description": "Name of the game as it will appear in the game listing", "env_variable": "SERVER_NAME", "default_value": "Factorio Server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:100" }, { @@ -73,8 +77,8 @@ "description": "Description of the game that will appear in the listing.", "env_variable": "SERVER_DESC", "default_value": "Description", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:200" }, { @@ -82,8 +86,8 @@ "description": "Username used for the server", "env_variable": "SERVER_USERNAME", "default_value": "unnamed", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:40" }, { @@ -91,8 +95,8 @@ "description": "Time between auto saves specified in minutes", "env_variable": "SAVE_INTERVAL", "default_value": "10", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric|digits_between:1,3" }, { @@ -100,8 +104,8 @@ "description": "The number of auto saves to keep.", "env_variable": "SAVE_SLOTS", "default_value": "5", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric|digits_between:1,3" }, { @@ -109,8 +113,8 @@ "description": "Time specified in minutes to kick AFK players.\r\n0 is off", "env_variable": "AFK_KICK", "default_value": "0", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric|digits_between:1,3" } ] From 9e53660dbca52acc16a78b4b2cb553ac4a8a359f Mon Sep 17 00:00:00 2001 From: ICon Date: Sun, 2 Jan 2022 20:47:25 -0700 Subject: [PATCH 33/64] Changed quay repository to ghcr.io --- game_eggs/factorio/factorio/egg-factorio.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/game_eggs/factorio/factorio/egg-factorio.json b/game_eggs/factorio/factorio/egg-factorio.json index 48b933f4..cebe8601 100644 --- a/game_eggs/factorio/factorio/egg-factorio.json +++ b/game_eggs/factorio/factorio/egg-factorio.json @@ -1,15 +1,16 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2022-01-02T14:45:19-05:00", - "name": "Factorio", + "exported_at": "2022-01-02T22:43:37-05:00", + "name": "Factorio Test", "author": "parker@parkervcp.com", "description": "The vanilla Factorio server.\r\n\r\nhttps:\/\/www.factorio.com\/", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": "if [ ! -f \".\/saves\/{{SAVE_NAME}}.zip\" ]; then .\/bin\/x64\/factorio --create .\/saves\/{{SAVE_NAME}}.zip --map-gen-settings data\/map-gen-settings.json --map-settings data\/map-settings.json; fi;\r\n .\/bin\/x64\/factorio --port {{SERVER_PORT}} --server-settings data\/server-settings.json --start-server saves\/{{SAVE_NAME}}.zip", @@ -22,7 +23,7 @@ "scripts": { "installation": { "script": "#!\/bin\/bash\r\n# Factorio Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update \r\napt install -y curl tar xz-utils jq\r\n\r\nVERSION_JSON=$(curl -sSL https:\/\/factorio.com\/api\/latest-releases)\r\n\r\nlatest_stable=$(echo $VERSION_JSON | jq -r '.stable.headless')\r\nlatest_experimental=$(echo $VERSION_JSON | jq -r '.experimental.headless')\r\n\r\nif [ -z \"${FACTORIO_VERSION}\" ] || [ \"${FACTORIO_VERSION}\" == \"latest\" ]; then\r\n DL_VERSION=$latest_stable\r\nelif [ \"${FACTORIO_VERSION}\" == \"experimental\" ]; then\r\n DL_VERSION=$latest_experimental\r\nelse\r\n DL_VERSION=${FACTORIO_VERSION}\r\nfi\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\necho -e \"\\n running 'curl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}' \\n\"\r\n\r\ncurl -sL https:\/\/www.factorio.com\/get-download\/${DL_VERSION}\/headless\/linux64 -o factorio-${DL_VERSION}\r\n\r\ntar -xf factorio-${DL_VERSION} --strip-components=1 -C \/mnt\/server\r\n\r\nrm factorio-${DL_VERSION}\r\n\r\nif [ -e data\/map-gen-settings.json ]; then\r\n echo \"map-gen exists\"\r\nelse\r\n echo \"copying map-gen default settings\"\r\n mv data\/map-gen-settings.example.json data\/map-gen-settings.json\r\nfi\r\n\r\nif [ -e data\/server-settings.json ]; then\r\n echo \"server settings exists\"\r\nelse\r\n echo \"copying server default settings\"\r\n mv data\/server-settings.example.json data\/server-settings.json\r\nfi\r\n\r\nif [ -e map-settings.json ]; then\r\n echo \"map settings exists\"\r\nelse\r\n echo \"copying map default settings\"\r\n mv data\/map-settings.example.json data\/map-settings.json\r\nfi\r\n\r\nif [ -e .\/saves\/${SAVE_NAME}.zip ]; then\r\n echo \"save file exists\"\r\nelse\r\n .\/bin\/x64\/factorio --create .\/saves\/${SAVE_NAME} --map-gen-settings data\/map-gen-settings.json --map-settings data\/map-settings.json\r\n chmod o+w .\/saves\/${SAVE_NAME}.zip\r\nfi", - "container": "debian:buster-slim", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, From e40d9f21dbda9270136f5f57e46dbd709fdb717b Mon Sep 17 00:00:00 2001 From: ICon Date: Sun, 2 Jan 2022 20:48:49 -0700 Subject: [PATCH 34/64] Fixed Name Mistake --- game_eggs/factorio/factorio/egg-factorio.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/factorio/factorio/egg-factorio.json b/game_eggs/factorio/factorio/egg-factorio.json index cebe8601..7f29aaf2 100644 --- a/game_eggs/factorio/factorio/egg-factorio.json +++ b/game_eggs/factorio/factorio/egg-factorio.json @@ -5,7 +5,7 @@ "update_url": null }, "exported_at": "2022-01-02T22:43:37-05:00", - "name": "Factorio Test", + "name": "Factorio", "author": "parker@parkervcp.com", "description": "The vanilla Factorio server.\r\n\r\nhttps:\/\/www.factorio.com\/", "features": null, From affd90f9a2a1890bf59b13bc4daf1158d075134d Mon Sep 17 00:00:00 2001 From: rexracer1998 Date: Sun, 9 Jan 2022 23:37:42 +0100 Subject: [PATCH 35/64] Changing the stop action of FiveM egg On line 21, I've changed "^C" to "quit" in order to stop the server because SIGINT doesn't work in this case. --- game_eggs/gta/fivem/egg-five-m.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/gta/fivem/egg-five-m.json b/game_eggs/gta/fivem/egg-five-m.json index 70efae68..ad473a26 100644 --- a/game_eggs/gta/fivem/egg-five-m.json +++ b/game_eggs/gta/fivem/egg-five-m.json @@ -18,7 +18,7 @@ "files": "{\r\n \"server.cfg\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"endpoint_add_tcp\": \"endpoint_add_tcp \\\"0.0.0.0:{{server.build.default.port}}\\\"\",\r\n \"endpoint_add_udp\": \"endpoint_add_udp \\\"0.0.0.0:{{server.build.default.port}}\\\"\",\r\n \"sv_hostname\": \"sv_hostname \\\"{{server.build.env.SERVER_HOSTNAME}}\\\"\",\r\n \"set sv_licenseKey\": \"set sv_licenseKey {{server.build.env.FIVEM_LICENSE}}\",\r\n \"set steam_webApiKey\": \"set steam_webApiKey {{server.build.env.STEAM_WEBAPIKEY}}\",\r\n \"sv_maxclients\": \"sv_maxclients {{server.build.env.MAX_PLAYERS}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"succeeded. Welcome!\"\r\n}", "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", - "stop": "^C" + "stop": "quit" }, "scripts": { "installation": { From d75d4b1482618ad7b82492859de61ea9f81991cc Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Mon, 10 Jan 2022 18:31:00 +0100 Subject: [PATCH 36/64] fix(haste-server): Update Github URL to match the new owner of Hastebin (#1520) --- software/haste-server/egg-haste-server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/software/haste-server/egg-haste-server.json b/software/haste-server/egg-haste-server.json index d913ef5c..bcccbe80 100644 --- a/software/haste-server/egg-haste-server.json +++ b/software/haste-server/egg-haste-server.json @@ -21,7 +21,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\napt update\r\napt install -y git curl\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\ngit clone https:\/\/github.com\/seejohnrun\/haste-server\r\ncd haste-server\r\nmv * \/mnt\/server\r\ncd ..\r\nrm -rf haste-server\r\nnpm install\r\n\r\nexit 0", + "script": "#!\/bin\/bash\r\n\r\napt update\r\napt install -y git curl\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\ngit clone https:\/\/github.com\/toptal\/haste-server\r\ncd haste-server\r\nmv * \/mnt\/server\r\ncd ..\r\nrm -rf haste-server\r\nnpm install\r\n\r\nexit 0", "container": "node:12-buster-slim", "entrypoint": "bash" } From 398478cedac82064a06b9960c15e1519b693ae78 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Tue, 11 Jan 2022 16:09:26 +0200 Subject: [PATCH 37/64] fix(magma): version detection for latest Add check for latest `[[ "${MC_VERSION}" == "latest" ]]`. Previously, it was only checking for exact versions or empty value, and I completely forgot to test latest. Resolves #1516 --- game_eggs/minecraft/java/magma/egg-magma.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/minecraft/java/magma/egg-magma.json b/game_eggs/minecraft/java/magma/egg-magma.json index b39b27fc..527dc9b7 100644 --- a/game_eggs/minecraft/java/magma/egg-magma.json +++ b/game_eggs/minecraft/java/magma/egg-magma.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-12-17T11:15:48+00:00", + "exported_at": "2022-01-11T09:07:47-05:00", "name": "Magma", "author": "support@pterodactyl.io", "description": "Magma is most powerful Forge server providing you with Forge mods and Bukkit Plugins using Spigot and Paper for Performance Optimization and Stability.", @@ -27,7 +27,7 @@ }, "scripts": { "installation": { - "script": "apt update\r\napt install -y curl jq\r\n\r\nif [[ ! -d \/mnt\/server ]]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\/\r\n\r\n# get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.16.5\/${BRANCH}\/latest\")\r\nOLD_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n\r\nif [[ -z \"${MC_VERSION}\" ]] || [[ \"${MC_VERSION}\" == \"latest\" ]]; then\r\n echo -e \"Version not set. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\n\r\nelif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/${MC_VERSION}\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${CUSTOM_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\nelif [[ \"${MC_VERSION}\" == \"1.12\" ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i server.jar)\r\nelse\r\n # Try to locate version by exact tag name. This will most likely always fail, because the tag names are in a weird format. Leaving it here just in case someone wants to fetch exact tag releases.\r\n VERSION_CHECK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .tag_name')\r\n if [[ \"${MC_VERSION}\" == \"${VERSION_CHECK}\" ]]; then\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .assets[].browser_download_url' | grep -i installer.jar)\r\n else\r\n echo -e \"Specified ${MC_VERSION} version not found. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# validate download link\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then\r\n echo -e \"Validating downlaod link\"\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_LINK}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_LINK}\r\n else\r\n echo -e \"Download URL ${DOWNLOAD_LINK} is invalid. Terminating install.\"\r\n exit 2\r\n fi\r\nfi\r\n\r\nfunction downloadMagma {\r\n echo -e \"running: curl -sSL -o installer.jar ${DOWNLOAD_LINK}\"\r\n curl -sSL -o installer.jar -sSL ${DOWNLOAD_LINK}\r\n}\r\n\r\nif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]] || [[ -z \"${MC_VERSION}\" ]]; then\r\n downloadMagma\r\n echo -e \"1.16.5 or newer version detected. Running installer\"\r\n java -jar installer.jar --installServer || { echo -e \"install failed\" exit 4; }\r\n mv forge-*.jar $SERVER_JARFILE\r\n echo -e \"Deleting installer.jar file.\\n\"\r\n rm -rf *installer.jar\r\nelse\r\n downloadMagma\r\n echo -e \"Older magma version detected. Skipping installer\"\r\n mv installer.jar $SERVER_JARFILE\r\nfi\r\n\r\necho -e \"Install Complete\"", + "script": "apt update\r\napt install -y curl jq\r\n\r\nif [[ ! -d \/mnt\/server ]]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\/\r\n\r\n# get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.16.5\/${BRANCH}\/latest\")\r\nOLD_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n\r\nif [[ -z \"${MC_VERSION}\" ]] || [[ \"${MC_VERSION}\" == \"latest\" ]]; then\r\n echo -e \"Version not set. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\n\r\nelif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/${MC_VERSION}\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${CUSTOM_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i installer.jar)\r\nelif [[ \"${MC_VERSION}\" == \"1.12\" ]]; then\r\n CUSTOM_JSON=$(curl --silent \"https:\/\/api.magmafoundation.org\/api\/resources\/magma\/1.12\/${BRANCH}\/latest\")\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i server.jar)\r\nelse\r\n # Try to locate version by exact tag name. This will most likely always fail, because the tag names are in a weird format. Leaving it here just in case someone wants to fetch exact tag releases.\r\n VERSION_CHECK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .tag_name')\r\n if [[ \"${MC_VERSION}\" == \"${VERSION_CHECK}\" ]]; then\r\n DOWNLOAD_LINK=$(echo ${OLD_JSON} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.[] | select(.tag_name==$MC_VERSION) | .assets[].browser_download_url' | grep -i installer.jar)\r\n else\r\n echo -e \"Specified ${MC_VERSION} version not found. Defaulting to latest\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# validate download link\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then\r\n echo -e \"Validating downlaod link\"\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_LINK}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_LINK}\r\n else\r\n echo -e \"Download URL ${DOWNLOAD_LINK} is invalid. Terminating install.\"\r\n exit 2\r\n fi\r\nfi\r\n\r\nfunction downloadMagma {\r\n echo -e \"running: curl -sSL -o installer.jar ${DOWNLOAD_LINK}\"\r\n curl -sSL -o installer.jar -sSL ${DOWNLOAD_LINK}\r\n}\r\n\r\nif [[ $MC_VERSION =~ ^1\\.(16|17|18|19|20|21|22|23) ]] || [[ -z \"${MC_VERSION}\" ]] || [[ \"${MC_VERSION}\" == \"latest\" ]] ; then\r\n downloadMagma\r\n echo -e \"1.16.5 or newer version detected. Running installer\"\r\n java -jar installer.jar --installServer || { echo -e \"install failed\" exit 4; }\r\n mv forge-*.jar $SERVER_JARFILE\r\n echo -e \"Deleting installer.jar file.\\n\"\r\n rm -rf *installer.jar\r\nelse\r\n downloadMagma\r\n echo -e \"Older magma version detected. Skipping installer\"\r\n mv installer.jar $SERVER_JARFILE\r\nfi\r\n\r\necho -e \"Install Complete\"", "container": "openjdk:8-jdk-slim", "entrypoint": "bash" } From a54784311b4340853457a640e69d28bf1f44e72c Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Tue, 11 Jan 2022 16:28:20 +0200 Subject: [PATCH 38/64] fix(redm): version fetching and use changelogs for latest Fixes version fetching due to it trying to match invalid href tag Fixes defaulting to latest if invalid version is provided Change latest recommended build fetching to use their changelogs resolves #1515 --- game_eggs/rdr/redm/egg-red-m.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/rdr/redm/egg-red-m.json b/game_eggs/rdr/redm/egg-red-m.json index 9bfeef23..00ae8338 100644 --- a/game_eggs/rdr/redm/egg-red-m.json +++ b/game_eggs/rdr/redm/egg-red-m.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T04:16:45+03:00", + "exported_at": "2022-01-11T09:25:22-05:00", "name": "RedM", "author": "parker@parkervcp.com", "description": "A new RedM egg for the latest builds due to recent changes in RedM", @@ -22,7 +22,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# CFx Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add openssl tar xz curl wget git file --no-cache\r\n\r\nmkdir -p \/mnt\/server\/resources \/mnt\/server\/logs\/\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/ \r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\n\r\nif [ \"${CFX_VERSION}\" == \"latest\" ] || [ -z ${CFX_VERSION} ] ; then\r\n LATEST_RECOMMENDED=$(echo -e \"${RELEASE_PAGE}\" | grep \"LATEST RECOMMENDED\" -B1 | grep -Eo 'href=\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1')\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${LATEST_RECOMMENDED})\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo 'href=\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${CFX_VERSION})\r\n if [ \"${VERSION_LINK}\" == \"\" ]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exeting\"\r\n exit 2 \r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"server config file exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >> server.cfg\r\nfi\r\n\r\necho \"install complete\"", + "script": "#!\/bin\/ash\r\n# CFx Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add openssl tar xz curl wget git file --no-cache jq\r\n\r\nmkdir -p \/mnt\/server\/resources \/mnt\/server\/logs\/\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/ \r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\n\r\nif [[ \"${CFX_VERSION}\" == \"latest\" ]] || [[ -z ${CFX_VERSION} ]] ; then\r\n\tRELEASE_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\tDOWNLOAD_LINK=$(echo $RELEASE_PAGE | jq -r '.latest_download')\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo '\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${CFX_VERSION})\r\n if [[ \"${VERSION_LINK}\" == \"\" ]]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n RELEASE_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\t DOWNLOAD_LINK=$(echo $RELEASE_PAGE | jq -r '.latest_download')\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2 \r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"server config file exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >> server.cfg\r\nfi\r\n\r\necho \"install complete\"", "container": "alpine:3.10", "entrypoint": "ash" } @@ -66,7 +66,7 @@ }, { "name": "CFX version", - "description": "The CFX Server version that is to be installed.\r\n\r\nan example is `1383-e5ea040353ce1b8bc86e37982bf5d888938e3096`\r\n\r\nYou can the latest version from here - https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/", + "description": "The CFX Server version that is to be installed. Invalid versions will default to latest.\r\n\r\nan example is `1383-e5ea040353ce1b8bc86e37982bf5d888938e3096`\r\n\r\nYou can the latest version from here - https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/", "env_variable": "CFX_VERSION", "default_value": "latest", "user_viewable": true, From a00f7564955aaed8e638ba8cbc08e2d66232d66b Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Tue, 11 Jan 2022 17:02:38 +0200 Subject: [PATCH 39/64] chore: cleanup the install script --- game_eggs/rdr/redm/egg-red-m.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/rdr/redm/egg-red-m.json b/game_eggs/rdr/redm/egg-red-m.json index 00ae8338..656ebe77 100644 --- a/game_eggs/rdr/redm/egg-red-m.json +++ b/game_eggs/rdr/redm/egg-red-m.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2022-01-11T09:25:22-05:00", + "exported_at": "2022-01-11T10:01:29-05:00", "name": "RedM", "author": "parker@parkervcp.com", "description": "A new RedM egg for the latest builds due to recent changes in RedM", @@ -22,7 +22,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# CFx Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add openssl tar xz curl wget git file --no-cache jq\r\n\r\nmkdir -p \/mnt\/server\/resources \/mnt\/server\/logs\/\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/ \r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\n\r\nif [[ \"${CFX_VERSION}\" == \"latest\" ]] || [[ -z ${CFX_VERSION} ]] ; then\r\n\tRELEASE_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\tDOWNLOAD_LINK=$(echo $RELEASE_PAGE | jq -r '.latest_download')\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo '\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${CFX_VERSION})\r\n if [[ \"${VERSION_LINK}\" == \"\" ]]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n RELEASE_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\t DOWNLOAD_LINK=$(echo $RELEASE_PAGE | jq -r '.latest_download')\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2 \r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"server config file exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >> server.cfg\r\nfi\r\n\r\necho \"install complete\"", + "script": "#!\/bin\/ash\r\n# CFx Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add openssl tar xz curl wget git file --no-cache jq\r\n\r\nmkdir -p \/mnt\/server\/resources \/mnt\/server\/logs\/\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/\r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\nCHANGELOGS_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\r\nif [[ \"${CFX_VERSION}\" == \"latest\" ]] || [[ -z ${CFX_VERSION} ]]; then\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.latest_download')\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo '\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${CFX_VERSION})\r\n if [[ \"${VERSION_LINK}\" == \"\" ]]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.latest_download')\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2\r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"server config file exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >>server.cfg\r\nfi\r\n\r\necho \"install complete\"", "container": "alpine:3.10", "entrypoint": "ash" } From 88426265fa964ec337099f3dd093bc147eec3355 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Tue, 11 Jan 2022 16:15:19 +0100 Subject: [PATCH 40/64] add/Craftopia --- README.md | 1 + game_eggs/README.md | 5 +- game_eggs/steamcmd_servers/README.md | 5 +- .../steamcmd_servers/craftopia/README.md | 11 ++++ .../craftopia/egg-craftopia.json | 59 +++++++++++++++++++ 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 game_eggs/steamcmd_servers/craftopia/README.md create mode 100644 game_eggs/steamcmd_servers/craftopia/egg-craftopia.json diff --git a/README.md b/README.md index 3747d4a3..14ad9405 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ If you are reading this it looks like you are looking to add an egg to your serv * [Barotrauma](game_eggs/steamcmd_servers/barotrauma) * [Citadel: Forged with Fire](game_eggs/steamcmd_servers/citadel) * [Conan Exiles](game_eggs/steamcmd_servers/conan_exiles) +* [Craftopia](game_eggs/steamcmd_servers/craftopia) * [Cryofall](game_eggs/steamcmd_servers/cryofall) * [Don't Starve Together](game_eggs/steamcmd_servers/dont_starve) * [ECO](game_eggs/steamcmd_servers/eco) diff --git a/game_eggs/README.md b/game_eggs/README.md index 8516677e..34766b4d 100644 --- a/game_eggs/README.md +++ b/game_eggs/README.md @@ -10,8 +10,6 @@ [ClassiCube](game_eggs/classicube) * [MCGalaxy](game_eggs/classicube/mcgalaxy) -[Cryofall](cryofall/cryofall) - [Call of Duty 4X](cod/cod4x) [ET Legacy](enemy_territory/etlegacy) @@ -103,6 +101,8 @@ * [Barotrauma](steamcmd_servers/barotrauma) * [Citadel: Forged with Fire](steamcmd_servers/citadel) * [Conan Exiles](steamcmd_servers/conan_exiles) +* [Craftopia](steamcmd_servers/craftopia) +* [CryoFall](steamcmd_servers/cryofall) * [Don't Starve Together](steamcmd_servers/dont_starve) * [ECO](steamcmd_servers/eco) * [Fistful of Frags](steamcmd_servers/fof) @@ -128,6 +128,7 @@ * [Satisfactory](steamcmd_servers/satisfactory) * [SCP: Secret Laboratory](steamcmd_servers/scpsl) * [dedicated](steamcmd_servers/scpsl/dedicated) + * [exiled](steamcmd_servers/scpsl/exiled) * [multiadmin](steamcmd_servers/scpsl/multiadmin) * [Soldat](steamcmd_servers/soldat) * [Space Engineers](steamcmd_servers/space_engineers) diff --git a/game_eggs/steamcmd_servers/README.md b/game_eggs/steamcmd_servers/README.md index f65d36e1..da261d9d 100644 --- a/game_eggs/steamcmd_servers/README.md +++ b/game_eggs/steamcmd_servers/README.md @@ -26,8 +26,11 @@ This is a collection of servers that use SteamCMD to install. ## Conan Exiles [Conan Exiles](conan_exiles) +## Craftopia +[Craftopia](craftopia) + ## CryoFall -* [Cryofall](cryofall) +[Cryofall](cryofall) ## Don't Starve Together [Don't Starve Together](dont_starve) diff --git a/game_eggs/steamcmd_servers/craftopia/README.md b/game_eggs/steamcmd_servers/craftopia/README.md new file mode 100644 index 00000000..5bf1200a --- /dev/null +++ b/game_eggs/steamcmd_servers/craftopia/README.md @@ -0,0 +1,11 @@ +# Craftopia + +Craftopia is the brand new crafting game we made by combining excellent features of various existing crafting games. + +## Server Ports + +Craftopia requires 1 port to run. + +| Port | default | +|-------------|---------| +| Game | 27015 | diff --git a/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json b/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json new file mode 100644 index 00000000..f1fd8187 --- /dev/null +++ b/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json @@ -0,0 +1,59 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2022-01-11T16:08:26+01:00", + "name": "Craftopia", + "author": "info@goover.de", + "description": "Craftopia is the brand new multiplayer survival action game made in Japan. We combined many features we find enjoyable, such as hunting, farming, hack-and-slash, building, automation to develop this game.", + "features": null, + "images": [ + "ghcr.io\/parkervcp\/games:source" + ], + "file_denylist": [], + "startup": ".\/Craftopia.x86_64", + "config": { + "files": "{\r\n \"ServerSetting.ini\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"name=\": \"name={{server.build.env.WORLD_NAME}}\",\r\n \"port=\": \"port={{server.build.default.port}}\"\r\n }\r\n }\r\n}", + "startup": "{\r\n \"done\": \"World is loaded!\"\r\n}", + "logs": "{}", + "stop": "^^C" + }, + "scripts": { + "installation": { + "script": "#!\/bin\/bash\r\n#SRCDS_APPID - steam app id found here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Servers_List\r\n# AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n#\r\n \r\n# Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [[ \"${STEAM_USER}\" == \"\" ]] || [[ \"${STEAM_PASS}\" == \"\" ]]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s \"-beta ${SRCDS_BETAID}\" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s \"-betapassword ${SRCDS_BETAPASS}\" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", + "container": "ghcr.io\/parkervcp\/installers:debian", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "SRCDS_APPID", + "description": "", + "env_variable": "SRCDS_APPID", + "default_value": "1670340", + "user_viewable": false, + "user_editable": false, + "rules": "required|string|max:20" + }, + { + "name": "Auto Update", + "description": "", + "env_variable": "AUTO_UPDATE", + "default_value": "1", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:20" + }, + { + "name": "World Name", + "description": "", + "env_variable": "WORLD_NAME", + "default_value": "Pterodactyl Server", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:50" + } + ] +} \ No newline at end of file From cac4388a34c4e519f818adfccc390ae13d2f25a1 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Tue, 11 Jan 2022 17:18:12 +0200 Subject: [PATCH 41/64] feat(fivem): default to latest on invalid versions and use changelogs for latest Change latest recommended build fetching to use their changelogs page and default to latest when invalid version is provided. --- game_eggs/gta/fivem/egg-five-m.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/gta/fivem/egg-five-m.json b/game_eggs/gta/fivem/egg-five-m.json index 70efae68..efed8314 100644 --- a/game_eggs/gta/fivem/egg-five-m.json +++ b/game_eggs/gta/fivem/egg-five-m.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T03:50:53+03:00", + "exported_at": "2022-01-11T10:14:56-05:00", "name": "FiveM", "author": "parker@parkervcp.com", "description": "A new FiveM egg for the latest builds due to recent changes in FiveM", @@ -22,7 +22,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# FiveM Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update -y\r\napt install -y tar xz-utils curl git file\r\n\r\nmkdir -p \/mnt\/server\/resources\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/ \r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\n\r\nif [ \"${FIVEM_VERSION}\" == \"latest\" ] || [ -z ${FIVEM_VERSION} ] ; then\r\n LATEST_RECOMMENDED=$(echo -e \"${RELEASE_PAGE}\" | grep \"LATEST RECOMMENDED\" -B1 | grep -Eo '\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep -P '\\d{4}-\\S{40}\\\/fx\\.tar\\.xz')\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${LATEST_RECOMMENDED})\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo 'href=\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${FIVEM_VERSION})\r\n if [ \"${VERSION_LINK}\" == \"\" ]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2 \r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"server config file exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >> server.cfg\r\nfi\r\n\r\nmkdir logs\/\r\n\r\necho \"install complete\"", + "script": "#!\/bin\/ash\r\n# FiveM Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update -y\r\napt install -y tar xz-utils curl git file jq\r\n\r\nmkdir -p \/mnt\/server\/resources\r\n\r\ncd \/mnt\/server\r\n\r\necho \"updating citizenfx resource files\"\r\ngit clone https:\/\/github.com\/citizenfx\/cfx-server-data.git \/tmp\r\ncp -Rf \/tmp\/resources\/* resources\/\r\n\r\nRELEASE_PAGE=$(curl -sSL https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/)\r\nCHANGELOGS_PAGE=$(curl -sSL https:\/\/changelogs-live.fivem.net\/api\/changelog\/versions\/linux\/server)\r\n\r\nif [[ \"${FIVEM_VERSION}\" == \"latest\" ]] || [[ -z ${FIVEM_VERSION} ]]; then\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.latest_download')\r\nelse\r\n VERSION_LINK=$(echo -e \"${RELEASE_PAGE}\" | grep -Eo '\".*\/*.tar.xz\"' | grep -Eo '\".*\"' | sed 's\/\\\"\/\/g' | sed 's\/\\.\\\/\/\/1' | grep ${CFX_VERSION})\r\n if [[ \"${VERSION_LINK}\" == \"\" ]]; then\r\n echo -e \"defaulting to latest as the version requested was invalid.\"\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.latest_download')\r\n else\r\n DOWNLOAD_LINK=$(echo https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/${VERSION_LINK})\r\n fi\r\nfi\r\n\r\nif [ ! -z \"${DOWNLOAD_URL}\" ]; then\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e \"link is valid. setting download link to ${DOWNLOAD_URL}\"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e \"link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\necho -e \"Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\"\r\n\r\ncurl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*\/}\r\n\r\necho \"Extracting fivem files\"\r\n\r\nFILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*\/} | cut -d',' -f2 | cut -d' ' -f2)\r\nif [ \"$FILETYPE\" == \"gzip\" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"Zip\" ]; then\r\n unzip ${DOWNLOAD_LINK##*\/}\r\nelif [ \"$FILETYPE\" == \"XZ\" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*\/}\r\nelse\r\n echo -e \"unknown filetype. Exiting\"\r\n exit 2\r\nfi\r\n\r\nrm -rf ${DOWNLOAD_LINK##*\/} run.sh\r\n\r\nif [ -e server.cfg ]; then\r\n echo \"Skipping downloading default server config file as one already exists\"\r\nelse\r\n echo \"Downloading default fivem config\"\r\n curl https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/gta\/fivem\/server.cfg >>server.cfg\r\nfi\r\n\r\nmkdir -p logs\/\r\n\r\necho \"install complete\"", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -57,7 +57,7 @@ }, { "name": "fivem version", - "description": "The fivem version that is to be installed.\r\n\r\nan example is `1383-e5ea040353ce1b8bc86e37982bf5d888938e3096`\r\n\r\nYou can get the latest version from here - https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/", + "description": "The fivem version that is to be installed. Invalid versions will default to latest.\r\n\r\nAn example is `1383-e5ea040353ce1b8bc86e37982bf5d888938e3096`\r\n\r\nYou can get the latest version from here - https:\/\/runtime.fivem.net\/artifacts\/fivem\/build_proot_linux\/master\/", "env_variable": "FIVEM_VERSION", "default_value": "latest", "user_viewable": true, From e7378cb54256ac0d8ec8c89f2a991f37b0f7d1c0 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Tue, 11 Jan 2022 20:52:48 -0800 Subject: [PATCH 42/64] Initial commit - Updated README's - Added OpenRCT2 directory and related files. --- README.md | 1 + game_eggs/README.md | 1 + game_eggs/tycoon_games/README.md | 9 + game_eggs/tycoon_games/openrct2/README.md | 87 ++++++++ .../tycoon_games/openrct2/egg-openrct2.json | 194 ++++++++++++++++++ game_eggs/tycoon_games/openrct2/save.sv6 | Bin 0 -> 320751 bytes 6 files changed, 292 insertions(+) create mode 100644 game_eggs/tycoon_games/README.md create mode 100644 game_eggs/tycoon_games/openrct2/README.md create mode 100644 game_eggs/tycoon_games/openrct2/egg-openrct2.json create mode 100644 game_eggs/tycoon_games/openrct2/save.sv6 diff --git a/README.md b/README.md index 914202d6..05a44857 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,7 @@ If you are reading this it looks like you are looking to add an egg to your serv * [TShock](game_eggs/terraria/tshock) [Tycoon Games](game_eggs/tycoon_games) +* [OpenRCT2](game_eggs/tycoon_games/openrct2) * [OpenTTD](game_eggs/tycoon_games/openttd) [Veloren](game_eggs/veloren) diff --git a/game_eggs/README.md b/game_eggs/README.md index f13204fb..5d23a69d 100644 --- a/game_eggs/README.md +++ b/game_eggs/README.md @@ -155,6 +155,7 @@ * [TShock](terraria/tshock) [Tycoon Games](tycoon_games) +* [OpenRCT2](tycoon_games/openrct2) * [OpenTTD](tycoon_games/openttd) [Unreal Engine](unreal_engine) diff --git a/game_eggs/tycoon_games/README.md b/game_eggs/tycoon_games/README.md new file mode 100644 index 00000000..cee33a2c --- /dev/null +++ b/game_eggs/tycoon_games/README.md @@ -0,0 +1,9 @@ +# Tycoon Game Servers + +This is a collection of Tycoon game servers, that are typically open-source re-implementations of classic Tycoon titles. + +## Roller Coaster Tycoon 2 +[OpenRCT2](openrct2) + +## Transport Tycoon Deluxe +[OpenTTD](openttd) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md new file mode 100644 index 00000000..97b75edc --- /dev/null +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -0,0 +1,87 @@ +# OpenRCT2 + +___ +### Authors / Contributors + + + + + + + + +
+ +
Red-Thirten +
+
+ 💻 + 🔨 +
+ +
parkervcp +
+
+ 💻 + 💡 +
+ +
janisozaur +
+
+ 💻 + 💡 +
+ + + +___ +### Game Description +From OpenRCT2's [Website](https://openrct2.org/): +> OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2 (RCT2), expanding the game with new features, fixing bugs and raising game limits. The gameplay revolves around building and maintaining an amusement park containing attractions, shops and facilities. The player must try to make a profit and maintain a good park reputation whilst keeping the guests happy. OpenRCT2 allows for both scenario and sandbox play. Scenarios require the player to complete a certain objective in a set time limit whilst sandbox allows the player to build a more flexible park with optionally no restrictions or finance. +___ +### Server Ports +| Port | Default (TCP) | +|---------|---------| +| Game | 11753 | + +___ +### Installation/System Requirements + +| | Minimum | +|---------|---------| +| Processor | Recent x86/64 (AMD/Intel) processor. No ARM support. | +| RAM | 4096 MiB | +| Storage | 80 MB | +| RCT2 Files | **Not required** | + +___ +### Save Files +Save files and autosaves are located in this directory: +``` +/home/container/ServerData/save/ +``` +If the "Load Latest Autosave" startup variable is enabled, and the `autosave/` directory exists, the server will load the latest autosave instead of the specified Save File. +___ +### Console Commands +As of OpenRCT2 v0.3.5.1, entering commands via Pterodactyl do nothing. Hopefully this will be resolved in a future OpenRCT2 update. +___ +### Becoming an Admin on the Server +Unfortunately, because console commands currently do not register, becoming the first admin on the server takes some steps, listed below: +1. Ensure the "Log Server Actions" startup variable is set to "true". +2. Start the server and join it with the client you want to make an admin. +3. Open `ServerData/serverlogs//.txt` and copy the SHA1 hash next to your client's username (note the username as well). +4. Then, open `ServerData/users.json`. Paste the hash into the "hash" value, and change the "name" value to your client's username. +5. Reboot the server, re-join it, and you should be an admin! + +After becoming an admin, you can use the in-game users management window to add additional admins (or groups) more easily if you wish. +___ +### Known Issues +The following are known issues that are unique to running OpenRCT2 on Pterodactyl, but likely can only be fixed by further development/updates from OpenRCT2. +- Only building from source from the `develop` branch currently yields a package that is bootable. This will no longer be true for any OpenRCT2 releases after v.0.3.5.1. +- Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. +- You may rarely run into the server crashing on start due to a "Floating point exception(core dumped)" error. If this occurs to you, please help with OpenRCT2 development by doing the following: + 1. Add the following to the beginning of your server's startup command: `SEGFAULT_SIGNALS=fpe LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so ` + 2. Start the server. If it boots normally, nothing will print. If it crashes, it will print a stack trace to the console. + 3. If a crash occurs, copy the entire stack trace, and save it to a log sharing website (like [Hastebin](https://www.hastebin.com)). + 4. [Open a new Bug Report Issue with OpenRCT2](https://github.com/OpenRCT2/OpenRCT2/issues/new?assignees=&labels=bug&template=bug_report.yaml) and share your logs with them. diff --git a/game_eggs/tycoon_games/openrct2/egg-openrct2.json b/game_eggs/tycoon_games/openrct2/egg-openrct2.json new file mode 100644 index 00000000..f46484ac --- /dev/null +++ b/game_eggs/tycoon_games/openrct2/egg-openrct2.json @@ -0,0 +1,194 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "meta": { + "version": "PTDL_v1", + "update_url": null + }, + "exported_at": "2022-01-12T02:53:49+00:00", + "name": "OpenRCT2 (In Dev)", + "author": "rehlmgaming@gmail.com", + "description": "OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2 (RCT2), expanding the game with new features, fixing bugs and raising game limits.", + "features": null, + "images": [ + "ghcr.io\/parkervcp\/yolks:debian" + ], + "file_denylist": [], + "startup": ".\/OpenRCT2\/openrct2-cli --version && .\/OpenRCT2\/openrct2-cli host $(if [ {{LOAD_AUTOSAVE}} ] && [ -d ServerData\/save\/autosave\/ ]; then find ServerData\/save\/autosave\/ | sort -r | head -1; else printf {{SAVE_URI}}; fi) --port {{SERVER_PORT}} --user-data-path \/home\/container\/ServerData\/", + "config": { + "files": "{\r\n \"Data\/config.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"general.autosave\": \"{{server.build.env.AUTOSAVE_INTERVAL}}\",\r\n \"general.autosave_amount\": \"{{server.build.env.AUTOSAVE_AMOUNT}}\",\r\n \"network.player_name\": \"\\\"{{server.build.env.SERVER_PLAYER_NAME}}\\\"\",\r\n \"network.default_port\": \"{{server.build.default.port}}\",\r\n \"network.default_password\": \"\\\"{{server.build.env.SERVER_PASSWORD}}\\\"\",\r\n \"network.advertise\": \"{{server.build.env.SERVER_ADVERTISE}}\",\r\n \"network.maxplayers\": \"{{server.build.env.MAX_PLAYERS}}\",\r\n \"network.server_name\": \"\\\"{{server.build.env.SERVER_NAME}}\\\"\",\r\n \"network.server_description\": \"\\\"{{server.build.env.SERVER_DESCRIPTION}}\\\"\",\r\n \"network.server_greeting\": \"\\\"{{server.build.env.SERVER_GREETING}}\\\"\",\r\n \"network.provider_name\": \"\\\"{{server.build.env.PROVIDER_NAME}}\\\"\",\r\n \"network.provider_email\": \"\\\"{{server.build.env.PROVIDER_EMAIL}}\\\"\",\r\n \"network.provider_website\": \"\\\"{{server.build.env.PROVIDER_WEBSITE}}\\\"\",\r\n \"network.log_chat\": \"{{server.build.env.LOG_CHAT}}\",\r\n \"network.log_server_actions\": \"{{server.build.env.LOG_SERVER_ACTIONS}}\",\r\n \"network.pause_server_if_no_clients\": \"{{server.build.env.PAUSE_NO_CLIENTS}}\"\r\n }\r\n }\r\n}", + "startup": "{\r\n \"done\": \"Listening for clients on\"\r\n}", + "logs": "{}", + "stop": "^C^C" + }, + "scripts": { + "installation": { + "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/11\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64\"\r\n#DEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/tree\/master\/game_eggs\/tycoon_games\/openrct2\/save.sv6\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/tree\/master\/game_eggs\/tycoon_games\/openrct2\/save.sv6\"\r\n\r\n## OpenRCT Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d \/mnt\/server\/OpenRCT2 ] && rm -rf \/mnt\/server\/OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n\t# Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n cd \/tmp\r\n\t# Clone the branch and check if successful\r\n\tgit clone --branch ${VERSION} https:\/\/github.com\/${GITHUB_PACKAGE} && cd OpenRCT2 || { echo -e '\\nFailed to clone \"${VERSION}\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n' && exit 1 }\r\n\tmkdir build && cd build\r\n\t# Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n\tcmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n\techo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\"\r\n\t# Build OpenRCT2\r\n\tDESTDIR=. make install\r\n\t# Check if build was successful\r\n\tcd usr\/local || { echo -e \"\\nFailed to successfully build OpenRCT2!\\n\" && exit 1 }\r\n\t# Make executable-ready package by moving compiled files to the correct locations\r\n\tmkdir -p \/mnt\/server\/OpenRCT2\/data\r\n\tmv bin\/* \/mnt\/server\/OpenRCT2\/\r\n\tmv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n\tmv share\/doc \/mnt\/server\/OpenRCT2\/\r\n\tcd \/mnt\/server\r\n\techo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n echo -e '\\nInstalling\/Updating OpenRCT2 from release tag \"${VERSION}\"...\\n'\r\n\t# Get required packages\r\n apt install -y curl jq\r\n cd \/mnt\/server\r\n\t# This is a simple script to use the GitHub API for release versions.\r\n\t# This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n\t# This supports using oauth\/personal access tokens via GITHUB_USER and GITHUB_OAUTH_TOKEN (both are required).\r\n\t# If you are getting hit with GitHub API limit issues then you need to have the user and token set.\r\n\tif [ -z \"${GITHUB_USER}\" ] && [ -z \"${GITHUB_OAUTH_TOKEN}\" ] ; then\r\n\t\techo -e \"\\nUsing anonymous GitHub API call.\"\r\n\telse\r\n\t\techo -e \"\\nGitHub user and OAuth token set.\"\r\n\t\talias curl='curl -u ${GITHUB_USER}:${GITHUB_OAUTH_TOKEN} '\r\n\tfi\r\n\r\n\t# Get release info and download links\r\n\tLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n\tRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n\tif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n\t\tDOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n\telse\r\n\t\tVERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n\t\tif [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n\t\t\tDOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n\t\telse\r\n\t\t\techo -e \"\\tDefaulting to latest release...\"\r\n\t\t\tDOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n\t\tfi\r\n\tfi\r\n\t# Download and unpackage the release\r\n\tif [ curl -L ${DOWNLOAD_URL} | tar -xzv ]; then\r\n\t\techo -e \"\\nDownload of OpenRCT release successful!\"\r\n\telse\r\n\t\techo -e '\\nFailed to download release tag \"${VERSION}\" from https:\/\/github.com\/${GITHUB_PACKAGE}\\n' && exit 1\r\n\tfi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.sv6 if missing\r\nif [ ! -f save.sv6 ]; then\r\n\techo -e \"Downloading default save.sv6 file from ${DEFAULT_SAVE}\"\r\n\tcurl -sSL ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", + "container": "debian:bullseye-slim", + "entrypoint": "\/bin\/bash" + } + }, + "variables": [ + { + "name": "Save File", + "description": "Save file (.sv4 \/ .sv6 \/ .park) to load. Can be a file path or can be a webhosted file URL. An existing save file must be specified; the server cannot generate a new scenario\/save from scratch.", + "env_variable": "SAVE_URI", + "default_value": "ServerData\/save\/save.sv6", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|min:5" + }, + { + "name": "OpenRCT2 Version", + "description": "The release tag (version) of OpenRCT2 to download and install from their official Github (ie. \"v0.3.5.1\"). Use \"latest\" to download the latest release, or \"develop\" to build from the latest source (takes longer to install but is the most up to date).", + "env_variable": "VERSION", + "default_value": "develop", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|min:1" + }, + { + "name": "Server Player Name", + "description": "The server appears as a player in the player list. This is the name it will have.", + "env_variable": "SERVER_PLAYER_NAME", + "default_value": "Server", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Server Password", + "description": "Password requested by the server for clients to connect. Admins do not have to enter password to join. Leave empty for no password.", + "env_variable": "SERVER_PASSWORD", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Advertise Server", + "description": "If set to \"false\", the server will not be advertised in the master server list, and clients must manually connect.", + "env_variable": "SERVER_ADVERTISE", + "default_value": "true", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:true,false" + }, + { + "name": "Max Players", + "description": "Maximum players allowed to connect to the server.", + "env_variable": "MAX_PLAYERS", + "default_value": "16", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|min:0" + }, + { + "name": "Server Name", + "description": "Name of the server that appears in the server list.", + "env_variable": "SERVER_NAME", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Server Description", + "description": "Description of the server that appears when hovering over the server in the server list.", + "env_variable": "SERVER_DESCRIPTION", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Server Greeting", + "description": "The \"Message of the Day\" that gets sent to all clients who join.", + "env_variable": "SERVER_GREETING", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Provider Name", + "description": "Server provider name that appears in server information window.", + "env_variable": "PROVIDER_NAME", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Server Provider E-Mail", + "description": "Server provider e-mail that appears in server information window.", + "env_variable": "PROVIDER_EMAIL", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Server Provider Website", + "description": "Server provider website that appears in server information window.", + "env_variable": "PROVIDER_WEBSITE", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "Log Chat", + "description": "Set to \"true\" if you would like in-game chat logged to file in Data\/chatlogs.", + "env_variable": "LOG_CHAT", + "default_value": "false", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:true,false" + }, + { + "name": "Log Server Actions", + "description": "Set to \"true\" if you would like in-game actions logged to file in Data\/serverlogs.", + "env_variable": "LOG_SERVER_ACTIONS", + "default_value": "false", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:true,false" + }, + { + "name": "Pause Server If No Clients", + "description": "Set to \"true\" to have the server pause simulation if no clients are on the server.", + "env_variable": "PAUSE_NO_CLIENTS", + "default_value": "false", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:true,false" + }, + { + "name": "Autosave Interval", + "description": "0 = Every 1 min, 1 = Every 5 min, 2 = Every 15 min, 3 = Every 30 min, 4 = Every hour, 5 = Never", + "env_variable": "AUTOSAVE_INTERVAL", + "default_value": "1", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|between:0,5" + }, + { + "name": "Autosaves To Keep", + "description": "Number of autosaves to keep before rolling over and deleting the oldest one. Set to 0 to disable autosaving.", + "env_variable": "AUTOSAVE_AMOUNT", + "default_value": "10", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|min:0" + }, + { + "name": "Load Latest Autosave", + "description": "Will load the latest autosave (assuming one is present) *instead* of the Save File when the server is started. Useful for loading the latest progress of a park after a reboot. Set to \"0\" to \"lock\" progress of the park, and always load the original Save File on start up.", + "env_variable": "LOAD_AUTOSAVE", + "default_value": "1", + "user_viewable": true, + "user_editable": true, + "rules": "required|boolean" + } + ] +} \ No newline at end of file diff --git a/game_eggs/tycoon_games/openrct2/save.sv6 b/game_eggs/tycoon_games/openrct2/save.sv6 new file mode 100644 index 0000000000000000000000000000000000000000..42aa2c047f5b4b56ad683e20441942dce84a8096 GIT binary patch literal 320751 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

bhH$cEK*wdd2|-f@zC*v6h4pcV7&ZTq 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%0DT#vyc_wKgO67o6)<(*u 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 ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>u ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>u ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w{w ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{>fUcf3jBVpJM%!{?z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSRL>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSS) z)%vGvwf-5_KkaY*GuHX{xBl7Mt$!x0eP5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; 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 q4Qq1r Date: Wed, 12 Jan 2022 01:06:02 -0800 Subject: [PATCH 43/64] Bug Fixes & Cleanup - Cleaned up egg file in general - Fixed / cleaned up startup command (autosave bash in particular) - Fixed typo in Configuration Files config - Fixed multiple formatting and runtime bugs in the install script - Updated default save file from .sv6 to the newer .park format --- game_eggs/tycoon_games/openrct2/README.md | 1 + .../tycoon_games/openrct2/egg-openrct2.json | 107 +++++++++--------- game_eggs/tycoon_games/openrct2/save.park | Bin 0 -> 73489 bytes game_eggs/tycoon_games/openrct2/save.sv6 | Bin 320751 -> 0 bytes 4 files changed, 54 insertions(+), 54 deletions(-) create mode 100644 game_eggs/tycoon_games/openrct2/save.park delete mode 100644 game_eggs/tycoon_games/openrct2/save.sv6 diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 97b75edc..337d0513 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -79,6 +79,7 @@ ___ ### Known Issues The following are known issues that are unique to running OpenRCT2 on Pterodactyl, but likely can only be fixed by further development/updates from OpenRCT2. - Only building from source from the `develop` branch currently yields a package that is bootable. This will no longer be true for any OpenRCT2 releases after v.0.3.5.1. + - This also means that clients joining the server must be on the latest develop branch as well. - Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. - You may rarely run into the server crashing on start due to a "Floating point exception(core dumped)" error. If this occurs to you, please help with OpenRCT2 development by doing the following: 1. Add the following to the beginning of your server's startup command: `SEGFAULT_SIGNALS=fpe LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so ` diff --git a/game_eggs/tycoon_games/openrct2/egg-openrct2.json b/game_eggs/tycoon_games/openrct2/egg-openrct2.json index f46484ac..fee0e2a4 100644 --- a/game_eggs/tycoon_games/openrct2/egg-openrct2.json +++ b/game_eggs/tycoon_games/openrct2/egg-openrct2.json @@ -1,11 +1,10 @@ { - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", + "_comment": "Pterodactyl OpenRCT2 Egg ~ Red-Thirten and parkervcp ~ 2022-01-12", "meta": { "version": "PTDL_v1", "update_url": null }, - "exported_at": "2022-01-12T02:53:49+00:00", - "name": "OpenRCT2 (In Dev)", + "name": "OpenRCT2", "author": "rehlmgaming@gmail.com", "description": "OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2 (RCT2), expanding the game with new features, fixing bugs and raising game limits.", "features": null, @@ -13,16 +12,16 @@ "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], - "startup": ".\/OpenRCT2\/openrct2-cli --version && .\/OpenRCT2\/openrct2-cli host $(if [ {{LOAD_AUTOSAVE}} ] && [ -d ServerData\/save\/autosave\/ ]; then find ServerData\/save\/autosave\/ | sort -r | head -1; else printf {{SAVE_URI}}; fi) --port {{SERVER_PORT}} --user-data-path \/home\/container\/ServerData\/", + "startup": ".\/OpenRCT2\/openrct2-cli --version && .\/OpenRCT2\/openrct2-cli host $(if {{LOAD_AUTOSAVE}} && [ -d ServerData\/save\/autosave\/ ]; then find ServerData\/save\/autosave\/ | sort -r | head -1; else echo \"{{SAVE_URI}}\"; fi) --port {{SERVER_PORT}} --user-data-path \/home\/container\/ServerData\/", "config": { - "files": "{\r\n \"Data\/config.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"general.autosave\": \"{{server.build.env.AUTOSAVE_INTERVAL}}\",\r\n \"general.autosave_amount\": \"{{server.build.env.AUTOSAVE_AMOUNT}}\",\r\n \"network.player_name\": \"\\\"{{server.build.env.SERVER_PLAYER_NAME}}\\\"\",\r\n \"network.default_port\": \"{{server.build.default.port}}\",\r\n \"network.default_password\": \"\\\"{{server.build.env.SERVER_PASSWORD}}\\\"\",\r\n \"network.advertise\": \"{{server.build.env.SERVER_ADVERTISE}}\",\r\n \"network.maxplayers\": \"{{server.build.env.MAX_PLAYERS}}\",\r\n \"network.server_name\": \"\\\"{{server.build.env.SERVER_NAME}}\\\"\",\r\n \"network.server_description\": \"\\\"{{server.build.env.SERVER_DESCRIPTION}}\\\"\",\r\n \"network.server_greeting\": \"\\\"{{server.build.env.SERVER_GREETING}}\\\"\",\r\n \"network.provider_name\": \"\\\"{{server.build.env.PROVIDER_NAME}}\\\"\",\r\n \"network.provider_email\": \"\\\"{{server.build.env.PROVIDER_EMAIL}}\\\"\",\r\n \"network.provider_website\": \"\\\"{{server.build.env.PROVIDER_WEBSITE}}\\\"\",\r\n \"network.log_chat\": \"{{server.build.env.LOG_CHAT}}\",\r\n \"network.log_server_actions\": \"{{server.build.env.LOG_SERVER_ACTIONS}}\",\r\n \"network.pause_server_if_no_clients\": \"{{server.build.env.PAUSE_NO_CLIENTS}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"ServerData\/config.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"general.autosave\": \"{{server.build.env.AUTOSAVE_INTERVAL}}\",\r\n \"general.autosave_amount\": \"{{server.build.env.AUTOSAVE_AMOUNT}}\",\r\n \"network.player_name\": \"\\\"{{server.build.env.SERVER_PLAYER_NAME}}\\\"\",\r\n \"network.default_port\": \"{{server.build.default.port}}\",\r\n \"network.default_password\": \"\\\"{{server.build.env.SERVER_PASSWORD}}\\\"\",\r\n \"network.advertise\": \"{{server.build.env.SERVER_ADVERTISE}}\",\r\n \"network.maxplayers\": \"{{server.build.env.MAX_PLAYERS}}\",\r\n \"network.server_name\": \"\\\"{{server.build.env.SERVER_NAME}}\\\"\",\r\n \"network.server_description\": \"\\\"{{server.build.env.SERVER_DESCRIPTION}}\\\"\",\r\n \"network.server_greeting\": \"\\\"{{server.build.env.SERVER_GREETING}}\\\"\",\r\n \"network.provider_name\": \"\\\"{{server.build.env.PROVIDER_NAME}}\\\"\",\r\n \"network.provider_email\": \"\\\"{{server.build.env.PROVIDER_EMAIL}}\\\"\",\r\n \"network.provider_website\": \"\\\"{{server.build.env.PROVIDER_WEBSITE}}\\\"\",\r\n \"network.log_chat\": \"{{server.build.env.LOG_CHAT}}\",\r\n \"network.log_server_actions\": \"{{server.build.env.LOG_SERVER_ACTIONS}}\",\r\n \"network.pause_server_if_no_clients\": \"{{server.build.env.PAUSE_NO_CLIENTS}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Listening for clients on\"\r\n}", "logs": "{}", "stop": "^C^C" }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/11\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64\"\r\n#DEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/tree\/master\/game_eggs\/tycoon_games\/openrct2\/save.sv6\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/tree\/master\/game_eggs\/tycoon_games\/openrct2\/save.sv6\"\r\n\r\n## OpenRCT Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d \/mnt\/server\/OpenRCT2 ] && rm -rf \/mnt\/server\/OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n\t# Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n cd \/tmp\r\n\t# Clone the branch and check if successful\r\n\tgit clone --branch ${VERSION} https:\/\/github.com\/${GITHUB_PACKAGE} && cd OpenRCT2 || { echo -e '\\nFailed to clone \"${VERSION}\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n' && exit 1 }\r\n\tmkdir build && cd build\r\n\t# Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n\tcmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n\techo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\"\r\n\t# Build OpenRCT2\r\n\tDESTDIR=. make install\r\n\t# Check if build was successful\r\n\tcd usr\/local || { echo -e \"\\nFailed to successfully build OpenRCT2!\\n\" && exit 1 }\r\n\t# Make executable-ready package by moving compiled files to the correct locations\r\n\tmkdir -p \/mnt\/server\/OpenRCT2\/data\r\n\tmv bin\/* \/mnt\/server\/OpenRCT2\/\r\n\tmv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n\tmv share\/doc \/mnt\/server\/OpenRCT2\/\r\n\tcd \/mnt\/server\r\n\techo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n echo -e '\\nInstalling\/Updating OpenRCT2 from release tag \"${VERSION}\"...\\n'\r\n\t# Get required packages\r\n apt install -y curl jq\r\n cd \/mnt\/server\r\n\t# This is a simple script to use the GitHub API for release versions.\r\n\t# This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n\t# This supports using oauth\/personal access tokens via GITHUB_USER and GITHUB_OAUTH_TOKEN (both are required).\r\n\t# If you are getting hit with GitHub API limit issues then you need to have the user and token set.\r\n\tif [ -z \"${GITHUB_USER}\" ] && [ -z \"${GITHUB_OAUTH_TOKEN}\" ] ; then\r\n\t\techo -e \"\\nUsing anonymous GitHub API call.\"\r\n\telse\r\n\t\techo -e \"\\nGitHub user and OAuth token set.\"\r\n\t\talias curl='curl -u ${GITHUB_USER}:${GITHUB_OAUTH_TOKEN} '\r\n\tfi\r\n\r\n\t# Get release info and download links\r\n\tLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n\tRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n\tif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n\t\tDOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n\telse\r\n\t\tVERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n\t\tif [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n\t\t\tDOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n\t\telse\r\n\t\t\techo -e \"\\tDefaulting to latest release...\"\r\n\t\t\tDOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n\t\tfi\r\n\tfi\r\n\t# Download and unpackage the release\r\n\tif [ curl -L ${DOWNLOAD_URL} | tar -xzv ]; then\r\n\t\techo -e \"\\nDownload of OpenRCT release successful!\"\r\n\telse\r\n\t\techo -e '\\nFailed to download release tag \"${VERSION}\" from https:\/\/github.com\/${GITHUB_PACKAGE}\\n' && exit 1\r\n\tfi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.sv6 if missing\r\nif [ ! -f save.sv6 ]; then\r\n\techo -e \"Downloading default save.sv6 file from ${DEFAULT_SAVE}\"\r\n\tcurl -sSL ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", + "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/12\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64.tar.gz\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/blob\/master\/game_eggs\/tycoon_games\/openrct2\/save.park\"\r\n\r\n## OpenRCT2 Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\ncd \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d OpenRCT2 ] && rm -rf OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n # Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n # Setup temp directory for building and move to it\r\n [ -d temp ] && rm -rf temp\r\n mkdir temp && cd temp\r\n # Clone the branch and check if successful\r\n git clone --branch \"${VERSION}\" https:\/\/github.com\/${GITHUB_PACKAGE}\r\n if [ ! -d OpenRCT2 ]; then\r\n echo -e \"\\nFailed to clone \\\"${VERSION}\\\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n\"\r\n exit 1\r\n fi\r\n cd OpenRCT2\r\n mkdir build && cd build\r\n # Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n echo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\\n\"\r\n # Build OpenRCT2\r\n DESTDIR=. make install\r\n # Check if build was successful and move to it\r\n if [ ! -d usr\/local ]; then\r\n echo -e \"\\nFailed to successfully build OpenRCT2!\\n\"\r\n exit 1\r\n fi\r\n cd usr\/local\r\n # Make executable-ready package by moving compiled files to the correct locations\r\n mkdir -p \/mnt\/server\/OpenRCT2\/data\r\n mv bin\/* \/mnt\/server\/OpenRCT2\/\r\n mv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n mv share\/doc \/mnt\/server\/OpenRCT2\/\r\n cd \/mnt\/server\r\n rm -rf temp # Clean up temp building directory\r\n echo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n # Get required packages\r\n apt install -y curl jq\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from release tag \\\"${VERSION}\\\"...\\n\"\r\n # This is a simple script to use the GitHub API for release versions.\r\n # This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n # Get release info and download links\r\n LATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n RELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n if [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n # Download and unpackage the release\r\n curl -L ${DOWNLOAD_URL} | tar -xzv\r\n # Check if it was successful\r\n if [ -d OpenRCT2 ]; then\r\n echo -e \"\\nDownload of OpenRCT2 release successful!\"\r\n else\r\n echo -e \"\\nFailed to download\/unpack file: ${DOWNLOAD_URL}\\n\"\r\n exit 1\r\n fi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.sv6 if missing\r\nif [ ! -f save.sv6 ]; then\r\n echo -e \"Downloading default save.sv6 file from ${DEFAULT_SAVE}\"\r\n curl -sSLO ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", "container": "debian:bullseye-slim", "entrypoint": "\/bin\/bash" } @@ -32,28 +31,46 @@ "name": "Save File", "description": "Save file (.sv4 \/ .sv6 \/ .park) to load. Can be a file path or can be a webhosted file URL. An existing save file must be specified; the server cannot generate a new scenario\/save from scratch.", "env_variable": "SAVE_URI", - "default_value": "ServerData\/save\/save.sv6", + "default_value": "ServerData\/save\/save.park", "user_viewable": true, "user_editable": true, "rules": "required|string|min:5" }, { - "name": "OpenRCT2 Version", - "description": "The release tag (version) of OpenRCT2 to download and install from their official Github (ie. \"v0.3.5.1\"). Use \"latest\" to download the latest release, or \"develop\" to build from the latest source (takes longer to install but is the most up to date).", - "env_variable": "VERSION", - "default_value": "develop", + "name": "Load Latest Autosave", + "description": "Will load the latest autosave (assuming one is present) *instead* of the Save File when the server is started. Useful for loading the latest progress of a park after a reboot. Set to \"false\" to \"lock\" progress of the park, and always load the original Save File on start up.", + "env_variable": "LOAD_AUTOSAVE", + "default_value": "true", "user_viewable": true, "user_editable": true, - "rules": "required|string|min:1" + "rules": "required|string|in:true,false" }, { - "name": "Server Player Name", - "description": "The server appears as a player in the player list. This is the name it will have.", - "env_variable": "SERVER_PLAYER_NAME", - "default_value": "Server", + "name": "Autosave Interval", + "description": "0 = Every 1 min, 1 = Every 5 min, 2 = Every 15 min, 3 = Every 30 min, 4 = Every hour, 5 = Never", + "env_variable": "AUTOSAVE_INTERVAL", + "default_value": "1", "user_viewable": true, "user_editable": true, - "rules": "string|nullable" + "rules": "required|integer|between:0,5" + }, + { + "name": "Autosaves To Keep", + "description": "Number of autosaves to keep before rolling over and deleting the oldest one. Set to 0 to disable autosaving.", + "env_variable": "AUTOSAVE_AMOUNT", + "default_value": "10", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|min:0" + }, + { + "name": "Max Players", + "description": "Maximum players allowed to connect to the server.", + "env_variable": "MAX_PLAYERS", + "default_value": "16", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|min:0" }, { "name": "Server Password", @@ -74,13 +91,13 @@ "rules": "required|string|in:true,false" }, { - "name": "Max Players", - "description": "Maximum players allowed to connect to the server.", - "env_variable": "MAX_PLAYERS", - "default_value": "16", + "name": "Pause Server If No Clients", + "description": "Set to \"true\" to have the server pause simulation if no clients are on the server.", + "env_variable": "PAUSE_NO_CLIENTS", + "default_value": "false", "user_viewable": true, "user_editable": true, - "rules": "required|integer|min:0" + "rules": "required|string|in:true,false" }, { "name": "Server Name", @@ -100,6 +117,15 @@ "user_editable": true, "rules": "string|nullable" }, + { + "name": "Server Player Name", + "description": "The server appears as a player in the player list. This is the name it will have.", + "env_variable": "SERVER_PLAYER_NAME", + "default_value": "Server", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, { "name": "Server Greeting", "description": "The \"Message of the Day\" that gets sent to all clients who join.", @@ -155,40 +181,13 @@ "rules": "required|string|in:true,false" }, { - "name": "Pause Server If No Clients", - "description": "Set to \"true\" to have the server pause simulation if no clients are on the server.", - "env_variable": "PAUSE_NO_CLIENTS", - "default_value": "false", + "name": "OpenRCT2 Version", + "description": "The release tag (version) of OpenRCT2 to download and install from their official Github (ie. \"v0.3.5.1\"). Use \"latest\" to download the latest release, or \"develop\" to build from the latest source (takes longer to install but is the most up to date).", + "env_variable": "VERSION", + "default_value": "develop", "user_viewable": true, "user_editable": true, - "rules": "required|string|in:true,false" - }, - { - "name": "Autosave Interval", - "description": "0 = Every 1 min, 1 = Every 5 min, 2 = Every 15 min, 3 = Every 30 min, 4 = Every hour, 5 = Never", - "env_variable": "AUTOSAVE_INTERVAL", - "default_value": "1", - "user_viewable": true, - "user_editable": true, - "rules": "required|integer|between:0,5" - }, - { - "name": "Autosaves To Keep", - "description": "Number of autosaves to keep before rolling over and deleting the oldest one. Set to 0 to disable autosaving.", - "env_variable": "AUTOSAVE_AMOUNT", - "default_value": "10", - "user_viewable": true, - "user_editable": true, - "rules": "required|integer|min:0" - }, - { - "name": "Load Latest Autosave", - "description": "Will load the latest autosave (assuming one is present) *instead* of the Save File when the server is started. Useful for loading the latest progress of a park after a reboot. Set to \"0\" to \"lock\" progress of the park, and always load the original Save File on start up.", - "env_variable": "LOAD_AUTOSAVE", - "default_value": "1", - "user_viewable": true, - "user_editable": true, - "rules": "required|boolean" + "rules": "required|string|min:1" } ] } \ No newline at end of file diff --git a/game_eggs/tycoon_games/openrct2/save.park b/game_eggs/tycoon_games/openrct2/save.park new file mode 100644 index 0000000000000000000000000000000000000000..a634de47a640f124fdba544e93f1f97972d049d0 GIT binary patch literal 73489 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

    bhH$cEK*wdd2|-f@zC*v6h4pcV7&ZTq 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%0DT#vyc_wKgO67o6)<(*u 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 ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>u ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>u ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~O zu>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og# z{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{)w{w ziLm~Ou>Og#{)w>uiLm~Ou>Og#{)w>uiLm~Ou>Og#{>fUcf3jBVpJM%!{?z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ= z>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@ki zp9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r z3hSQ=>z@kip9<@r3hSRL>z@kip9<@r3hSQ=>z@kip9<@r3hSQ=>z@kip9<@r3hSS) z)%vGvwf-5_KkaY*GuHX{xBl7Mt$!x0eP5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; znXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwu zu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_ z{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1;nXvwuu>P5_{+Y1; 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 q4Qq1r Date: Wed, 12 Jan 2022 01:21:53 -0800 Subject: [PATCH 44/64] Update README.md --- game_eggs/tycoon_games/openrct2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 337d0513..9137ebf8 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -1,5 +1,5 @@ # OpenRCT2 - +***Note:** OpenRCT2 only recently (Jan. 2022) updated to support non-interactive Docker environments, and development is ongoing to improve it. Please understand future updates may be unstable, or this Egg may update in the future to accommodate changes.* ___ ### Authors / Contributors From 3d4b512abc47291eb6fa377263e3a5680692049d Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Wed, 12 Jan 2022 15:07:53 -0800 Subject: [PATCH 45/64] Fix minor README errors --- game_eggs/tycoon_games/openrct2/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 9137ebf8..1c6d5b57 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -51,7 +51,7 @@ ___ | | Minimum | |---------|---------| | Processor | Recent x86/64 (AMD/Intel) processor. No ARM support. | -| RAM | 4096 MiB | +| RAM | 256-512 MiB (depends on # of clients & park size) | | Storage | 80 MB | | RCT2 Files | **Not required** | @@ -70,7 +70,7 @@ ___ Unfortunately, because console commands currently do not register, becoming the first admin on the server takes some steps, listed below: 1. Ensure the "Log Server Actions" startup variable is set to "true". 2. Start the server and join it with the client you want to make an admin. -3. Open `ServerData/serverlogs//.txt` and copy the SHA1 hash next to your client's username (note the username as well). +3. Open `ServerData/serverlogs//.txt` and copy the SHA1 hash next to your client's username (note the username as well). 4. Then, open `ServerData/users.json`. Paste the hash into the "hash" value, and change the "name" value to your client's username. 5. Reboot the server, re-join it, and you should be an admin! @@ -79,10 +79,10 @@ ___ ### Known Issues The following are known issues that are unique to running OpenRCT2 on Pterodactyl, but likely can only be fixed by further development/updates from OpenRCT2. - Only building from source from the `develop` branch currently yields a package that is bootable. This will no longer be true for any OpenRCT2 releases after v.0.3.5.1. - - This also means that clients joining the server must be on the latest develop branch as well. + - This also means that clients joining the server must be on the latest `develop` branch as well. - Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. - You may rarely run into the server crashing on start due to a "Floating point exception(core dumped)" error. If this occurs to you, please help with OpenRCT2 development by doing the following: 1. Add the following to the beginning of your server's startup command: `SEGFAULT_SIGNALS=fpe LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so ` - 2. Start the server. If it boots normally, nothing will print. If it crashes, it will print a stack trace to the console. + 2. Start the server. If it boots normally, nothing extra will print. If it crashes, it will print a stack trace to the console. 3. If a crash occurs, copy the entire stack trace, and save it to a log sharing website (like [Hastebin](https://www.hastebin.com)). 4. [Open a new Bug Report Issue with OpenRCT2](https://github.com/OpenRCT2/OpenRCT2/issues/new?assignees=&labels=bug&template=bug_report.yaml) and share your logs with them. From 003c1ae215690a550c4c6a4ff103fca5b4908152 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Wed, 12 Jan 2022 15:33:53 -0800 Subject: [PATCH 46/64] Fix minor startup script bug regarding default save - Default save file was referenced as the old `.sv6` file in some places, when it should be `.park`. --- game_eggs/tycoon_games/openrct2/egg-openrct2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/tycoon_games/openrct2/egg-openrct2.json b/game_eggs/tycoon_games/openrct2/egg-openrct2.json index fee0e2a4..32201ecb 100644 --- a/game_eggs/tycoon_games/openrct2/egg-openrct2.json +++ b/game_eggs/tycoon_games/openrct2/egg-openrct2.json @@ -21,7 +21,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/12\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64.tar.gz\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/blob\/master\/game_eggs\/tycoon_games\/openrct2\/save.park\"\r\n\r\n## OpenRCT2 Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\ncd \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d OpenRCT2 ] && rm -rf OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n # Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n # Setup temp directory for building and move to it\r\n [ -d temp ] && rm -rf temp\r\n mkdir temp && cd temp\r\n # Clone the branch and check if successful\r\n git clone --branch \"${VERSION}\" https:\/\/github.com\/${GITHUB_PACKAGE}\r\n if [ ! -d OpenRCT2 ]; then\r\n echo -e \"\\nFailed to clone \\\"${VERSION}\\\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n\"\r\n exit 1\r\n fi\r\n cd OpenRCT2\r\n mkdir build && cd build\r\n # Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n echo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\\n\"\r\n # Build OpenRCT2\r\n DESTDIR=. make install\r\n # Check if build was successful and move to it\r\n if [ ! -d usr\/local ]; then\r\n echo -e \"\\nFailed to successfully build OpenRCT2!\\n\"\r\n exit 1\r\n fi\r\n cd usr\/local\r\n # Make executable-ready package by moving compiled files to the correct locations\r\n mkdir -p \/mnt\/server\/OpenRCT2\/data\r\n mv bin\/* \/mnt\/server\/OpenRCT2\/\r\n mv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n mv share\/doc \/mnt\/server\/OpenRCT2\/\r\n cd \/mnt\/server\r\n rm -rf temp # Clean up temp building directory\r\n echo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n # Get required packages\r\n apt install -y curl jq\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from release tag \\\"${VERSION}\\\"...\\n\"\r\n # This is a simple script to use the GitHub API for release versions.\r\n # This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n # Get release info and download links\r\n LATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n RELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n if [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n # Download and unpackage the release\r\n curl -L ${DOWNLOAD_URL} | tar -xzv\r\n # Check if it was successful\r\n if [ -d OpenRCT2 ]; then\r\n echo -e \"\\nDownload of OpenRCT2 release successful!\"\r\n else\r\n echo -e \"\\nFailed to download\/unpack file: ${DOWNLOAD_URL}\\n\"\r\n exit 1\r\n fi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.sv6 if missing\r\nif [ ! -f save.sv6 ]; then\r\n echo -e \"Downloading default save.sv6 file from ${DEFAULT_SAVE}\"\r\n curl -sSLO ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", + "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/12\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64.tar.gz\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/blob\/master\/game_eggs\/tycoon_games\/openrct2\/save.park\"\r\n\r\n## OpenRCT2 Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\ncd \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d OpenRCT2 ] && rm -rf OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n # Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n # Setup temp directory for building and move to it\r\n [ -d temp ] && rm -rf temp\r\n mkdir temp && cd temp\r\n # Clone the branch and check if successful\r\n git clone --branch \"${VERSION}\" https:\/\/github.com\/${GITHUB_PACKAGE}\r\n if [ ! -d OpenRCT2 ]; then\r\n echo -e \"\\nFailed to clone \\\"${VERSION}\\\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n\"\r\n exit 1\r\n fi\r\n cd OpenRCT2\r\n mkdir build && cd build\r\n # Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n echo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\\n\"\r\n # Build OpenRCT2\r\n DESTDIR=. make install\r\n # Check if build was successful and move to it\r\n if [ ! -d usr\/local ]; then\r\n echo -e \"\\nFailed to successfully build OpenRCT2!\\n\"\r\n exit 1\r\n fi\r\n cd usr\/local\r\n # Make executable-ready package by moving compiled files to the correct locations\r\n mkdir -p \/mnt\/server\/OpenRCT2\/data\r\n mv bin\/* \/mnt\/server\/OpenRCT2\/\r\n mv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n mv share\/doc \/mnt\/server\/OpenRCT2\/\r\n cd \/mnt\/server\r\n rm -rf temp # Clean up temp building directory\r\n echo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n # Get required packages\r\n apt install -y curl jq\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from release tag \\\"${VERSION}\\\"...\\n\"\r\n # This is a simple script to use the GitHub API for release versions.\r\n # This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n # Get release info and download links\r\n LATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n RELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n if [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n # Download and unpackage the release\r\n curl -L ${DOWNLOAD_URL} | tar -xzv\r\n # Check if it was successful\r\n if [ -d OpenRCT2 ]; then\r\n echo -e \"\\nDownload of OpenRCT2 release successful!\"\r\n else\r\n echo -e \"\\nFailed to download\/unpack file: ${DOWNLOAD_URL}\\n\"\r\n exit 1\r\n fi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.park if missing\r\nif [ ! -f save.park ]; then\r\n echo -e \"Downloading default save.park file from ${DEFAULT_SAVE}\"\r\n curl -sSLO ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", "container": "debian:bullseye-slim", "entrypoint": "\/bin\/bash" } From 08c55cfaed0bd762830741325201b48cc64ee8ad Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Wed, 12 Jan 2022 16:26:01 -0800 Subject: [PATCH 47/64] Fix broken default save URL in installation script --- game_eggs/tycoon_games/openrct2/egg-openrct2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/tycoon_games/openrct2/egg-openrct2.json b/game_eggs/tycoon_games/openrct2/egg-openrct2.json index 32201ecb..76bcdd18 100644 --- a/game_eggs/tycoon_games/openrct2/egg-openrct2.json +++ b/game_eggs/tycoon_games/openrct2/egg-openrct2.json @@ -21,7 +21,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/12\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64.tar.gz\"\r\nDEFAULT_SAVE=\"https:\/\/github.com\/parkervcp\/eggs\/blob\/master\/game_eggs\/tycoon_games\/openrct2\/save.park\"\r\n\r\n## OpenRCT2 Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\ncd \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d OpenRCT2 ] && rm -rf OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n # Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n # Setup temp directory for building and move to it\r\n [ -d temp ] && rm -rf temp\r\n mkdir temp && cd temp\r\n # Clone the branch and check if successful\r\n git clone --branch \"${VERSION}\" https:\/\/github.com\/${GITHUB_PACKAGE}\r\n if [ ! -d OpenRCT2 ]; then\r\n echo -e \"\\nFailed to clone \\\"${VERSION}\\\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n\"\r\n exit 1\r\n fi\r\n cd OpenRCT2\r\n mkdir build && cd build\r\n # Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n echo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\\n\"\r\n # Build OpenRCT2\r\n DESTDIR=. make install\r\n # Check if build was successful and move to it\r\n if [ ! -d usr\/local ]; then\r\n echo -e \"\\nFailed to successfully build OpenRCT2!\\n\"\r\n exit 1\r\n fi\r\n cd usr\/local\r\n # Make executable-ready package by moving compiled files to the correct locations\r\n mkdir -p \/mnt\/server\/OpenRCT2\/data\r\n mv bin\/* \/mnt\/server\/OpenRCT2\/\r\n mv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n mv share\/doc \/mnt\/server\/OpenRCT2\/\r\n cd \/mnt\/server\r\n rm -rf temp # Clean up temp building directory\r\n echo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n # Get required packages\r\n apt install -y curl jq\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from release tag \\\"${VERSION}\\\"...\\n\"\r\n # This is a simple script to use the GitHub API for release versions.\r\n # This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n # Get release info and download links\r\n LATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n RELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n if [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n # Download and unpackage the release\r\n curl -L ${DOWNLOAD_URL} | tar -xzv\r\n # Check if it was successful\r\n if [ -d OpenRCT2 ]; then\r\n echo -e \"\\nDownload of OpenRCT2 release successful!\"\r\n else\r\n echo -e \"\\nFailed to download\/unpack file: ${DOWNLOAD_URL}\\n\"\r\n exit 1\r\n fi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.park if missing\r\nif [ ! -f save.park ]; then\r\n echo -e \"Downloading default save.park file from ${DEFAULT_SAVE}\"\r\n curl -sSLO ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", + "script": "#!\/bin\/bash\r\n\r\n## File: Pterodactyl OpenRCT2 Egg - egg-openrct2.json\r\n## Authors: David Wolfe (Red-Thirten), parkervcp\r\n## Date: 2022\/01\/12\r\n## License: MIT License\r\n\r\nGITHUB_PACKAGE=\"OpenRCT2\/OpenRCT2\"\r\nMATCH=\"linux-bullseye-x86_64.tar.gz\"\r\nDEFAULT_SAVE=\"https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/game_eggs\/tycoon_games\/openrct2\/save.park\"\r\n\r\n## OpenRCT2 Install\r\napt -y update\r\n[ ! -d \/mnt\/server ] && mkdir \/mnt\/server\r\ncd \/mnt\/server\r\n# Remove existing installation if present\r\n[ -d OpenRCT2 ] && rm -rf OpenRCT2\r\n\r\n# Determine if installing from source or from release\r\nif [ \"${VERSION}\" == \"develop\" ]; then\r\n # Get required packages\r\n apt -y install curl git make cmake gcc build-essential libicu-dev pkg-config libcurl4-openssl-dev libcrypto++-dev libpng-dev libssl-dev libzip-dev duktape-dev nlohmann-json3-dev\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from source...\\n\"\r\n # Setup temp directory for building and move to it\r\n [ -d temp ] && rm -rf temp\r\n mkdir temp && cd temp\r\n # Clone the branch and check if successful\r\n git clone --branch \"${VERSION}\" https:\/\/github.com\/${GITHUB_PACKAGE}\r\n if [ ! -d OpenRCT2 ]; then\r\n echo -e \"\\nFailed to clone \\\"${VERSION}\\\" branch from https:\/\/github.com\/${GITHUB_PACKAGE}\\n\"\r\n exit 1\r\n fi\r\n cd OpenRCT2\r\n mkdir build && cd build\r\n # Prepare CMake files for a lightweight and CLI-only build of OpenRCT2, using the appropriate flags\r\n cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=\"-g -gz\" -DDISABLE_TTF=ON -DDISABLE_GOOGLE_BENCHMARK=ON -DDISABLE_DISCORD_RPC=ON -DDISABLE_GUI=ON\r\n echo -e \"\\nBuilding OpenRCT2 package from source...\\n\\tThis process can take quite some time. Grab a coffee :)\\n\"\r\n # Build OpenRCT2\r\n DESTDIR=. make install\r\n # Check if build was successful and move to it\r\n if [ ! -d usr\/local ]; then\r\n echo -e \"\\nFailed to successfully build OpenRCT2!\\n\"\r\n exit 1\r\n fi\r\n cd usr\/local\r\n # Make executable-ready package by moving compiled files to the correct locations\r\n mkdir -p \/mnt\/server\/OpenRCT2\/data\r\n mv bin\/* \/mnt\/server\/OpenRCT2\/\r\n mv share\/openrct2\/* share\/openrct2-cli\/* \/mnt\/server\/OpenRCT2\/data\/\r\n mv share\/doc \/mnt\/server\/OpenRCT2\/\r\n cd \/mnt\/server\r\n rm -rf temp # Clean up temp building directory\r\n echo -e \"\\nBuild of OpenRCT2 package complete!\"\r\nelse\r\n # Get required packages\r\n apt install -y curl jq\r\n echo -e \"\\nInstalling\/Updating OpenRCT2 from release tag \\\"${VERSION}\\\"...\\n\"\r\n # This is a simple script to use the GitHub API for release versions.\r\n # This requires the egg has a variable for GITHUB_PACKAGE, VERSION and MATCH (MATCH is to match the filename in some way).\r\n # Get release info and download links\r\n LATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\n RELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\n if [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n # Download and unpackage the release\r\n curl -L ${DOWNLOAD_URL} | tar -xzv\r\n # Check if it was successful\r\n if [ -d OpenRCT2 ]; then\r\n echo -e \"\\nDownload of OpenRCT2 release successful!\"\r\n else\r\n echo -e \"\\nFailed to download\/unpack file: ${DOWNLOAD_URL}\\n\"\r\n exit 1\r\n fi\r\nfi\r\n\r\n## OpenRCT2 Setup\r\n# Setup ServerData\/save directory\r\n[ ! -d ServerData\/save ] && mkdir -p ServerData\/save\r\ncd ServerData\/save\r\n# Download default save.park if missing\r\nif [ ! -f save.park ]; then\r\n echo -e \"Downloading default save.park file from ${DEFAULT_SAVE}\"\r\n curl -sSLO ${DEFAULT_SAVE}\r\nfi\r\n\r\necho -e \"\\nOpenRCT2 Successfully Installed!\"", "container": "debian:bullseye-slim", "entrypoint": "\/bin\/bash" } From 45da38ccaaf815cf2de9e7d5daf35ac627d2f3a0 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Fri, 14 Jan 2022 12:01:38 +0100 Subject: [PATCH 48/64] Fix mohist download url & make jar file viewable (#1530) --- game_eggs/minecraft/java/mohist/egg-mohist.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/minecraft/java/mohist/egg-mohist.json b/game_eggs/minecraft/java/mohist/egg-mohist.json index d2f5c960..2502a66f 100644 --- a/game_eggs/minecraft/java/mohist/egg-mohist.json +++ b/game_eggs/minecraft/java/mohist/egg-mohist.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:28:24+03:00", + "exported_at": "2022-01-14T09:54:36+01:00", "name": "Mohist", "author": "alex.chang-lam@protonmail.com", "description": "Spigot fork with performance optimizations.", @@ -28,7 +28,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# Mohist Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl\r\n\r\n#Go into main direction\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nif [ ! -z ${BUILD_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_VERSION}\/download\r\nelse\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_TYPE}\/download\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\necho -e \"Downloading build version ${BUILD_VERSION}\"\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then \r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}-server.jar; then\r\n echo -e \"Download link is valid.\"\r\n else\r\n echo -e \"Link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\ncurl -s -o server.jar -sS ${DOWNLOAD_LINK}\r\n\r\n#Checking if downloaded jars exist\r\nif [ ! -f .\/server.jar ]; then\r\n echo \"!!! Error downloading build version ${BUILD_VERSION} !!!\"\r\n exit\r\nfi", + "script": "#!\/bin\/bash\r\n# Mohist Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl\r\n\r\n#Go into main direction\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nif [ ! -z ${BUILD_VERSION} ]; then\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_VERSION}\/download\r\nelse\r\n DOWNLOAD_LINK=https:\/\/mohistmc.com\/api\/${MC_VERSION}\/${BUILD_TYPE}\/download\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\necho -e \"Downloading build version ${BUILD_VERSION}\"\r\nif [ ! -z \"${DOWNLOAD_LINK}\" ]; then \r\n if curl --output \/dev\/null --silent --fail ${DOWNLOAD_LINK}; then\r\n echo -e \"Download link is valid.\"\r\n else\r\n echo -e \"Link is invalid closing out\"\r\n exit 2\r\n fi\r\nfi\r\n\r\ncurl -s -o server.jar -sS ${DOWNLOAD_LINK}\r\n\r\n#Checking if downloaded jars exist\r\nif [ ! -f .\/server.jar ]; then\r\n echo \"!!! Error downloading build version ${BUILD_VERSION} !!!\"\r\n exit\r\nfi", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -39,7 +39,7 @@ "description": "The name of the jarfile to run the server with.", "env_variable": "SERVER_JARFILE", "default_value": "server.jar", - "user_viewable": false, + "user_viewable": true, "user_editable": false, "rules": "required|string|max:20" }, From 68327020b21469138b7fd58335445ac5276ca426 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Fri, 14 Jan 2022 16:44:52 +0100 Subject: [PATCH 49/64] Avorion - Fixed SRCDS_APPID --- game_eggs/steamcmd_servers/avorion/egg-avorion.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/steamcmd_servers/avorion/egg-avorion.json b/game_eggs/steamcmd_servers/avorion/egg-avorion.json index fff7445e..6f5b28b6 100644 --- a/game_eggs/steamcmd_servers/avorion/egg-avorion.json +++ b/game_eggs/steamcmd_servers/avorion/egg-avorion.json @@ -130,7 +130,7 @@ { "name": "Steam App ID", "description": "", - "env_variable": "APP_ID", + "env_variable": "SRCDS_APPID", "default_value": "565060", "user_viewable": false, "user_editable": false, @@ -182,4 +182,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From ba28ba11288603b927a853a34a052351089d5822 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Mon, 17 Jan 2022 15:03:38 -0800 Subject: [PATCH 50/64] Update "Save File" variable to support .sv4/.sv6 save files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Janiszewski --- game_eggs/tycoon_games/openrct2/egg-openrct2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/tycoon_games/openrct2/egg-openrct2.json b/game_eggs/tycoon_games/openrct2/egg-openrct2.json index 76bcdd18..ed070f1a 100644 --- a/game_eggs/tycoon_games/openrct2/egg-openrct2.json +++ b/game_eggs/tycoon_games/openrct2/egg-openrct2.json @@ -34,7 +34,7 @@ "default_value": "ServerData\/save\/save.park", "user_viewable": true, "user_editable": true, - "rules": "required|string|min:5" + "rules": "required|string|min:4" }, { "name": "Load Latest Autosave", From 7dcbd35e5a0517cb45746464733822d15e43ed67 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Mon, 17 Jan 2022 15:36:50 -0800 Subject: [PATCH 51/64] README corrections - Fixed OpenRCT2 project's website to be correct. - Added note to minimum disk space requirement that building from source *may* require a tad more memory than the base game server needs to run. - Clarified that console commands currently do not work due to a Pterodactyl issue and not a OpenRCT2 one. - Added GitHub issue reference to password known issue. --- game_eggs/tycoon_games/openrct2/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 1c6d5b57..722216ae 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -37,7 +37,7 @@ ___ ___ ### Game Description -From OpenRCT2's [Website](https://openrct2.org/): +From OpenRCT2's [Website](https://openrct2.io/): > OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2 (RCT2), expanding the game with new features, fixing bugs and raising game limits. The gameplay revolves around building and maintaining an amusement park containing attractions, shops and facilities. The player must try to make a profit and maintain a good park reputation whilst keeping the guests happy. OpenRCT2 allows for both scenario and sandbox play. Scenarios require the player to complete a certain objective in a set time limit whilst sandbox allows the player to build a more flexible park with optionally no restrictions or finance. ___ ### Server Ports @@ -52,7 +52,7 @@ ___ |---------|---------| | Processor | Recent x86/64 (AMD/Intel) processor. No ARM support. | | RAM | 256-512 MiB (depends on # of clients & park size) | -| Storage | 80 MB | +| Storage | 80 MB (*may require more if building from source*) | | RCT2 Files | **Not required** | ___ @@ -64,7 +64,7 @@ Save files and autosaves are located in this directory: If the "Load Latest Autosave" startup variable is enabled, and the `autosave/` directory exists, the server will load the latest autosave instead of the specified Save File. ___ ### Console Commands -As of OpenRCT2 v0.3.5.1, entering commands via Pterodactyl do nothing. Hopefully this will be resolved in a future OpenRCT2 update. +Until support for console commands to interactive programs gets added to Pterodactyl, entering commands via the panel's console do nothing (reference issue pterodactyl/panel#3712). ___ ### Becoming an Admin on the Server Unfortunately, because console commands currently do not register, becoming the first admin on the server takes some steps, listed below: @@ -80,7 +80,7 @@ ___ The following are known issues that are unique to running OpenRCT2 on Pterodactyl, but likely can only be fixed by further development/updates from OpenRCT2. - Only building from source from the `develop` branch currently yields a package that is bootable. This will no longer be true for any OpenRCT2 releases after v.0.3.5.1. - This also means that clients joining the server must be on the latest `develop` branch as well. -- Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. +- Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. (OpenRCT2/OpenRCT2#16396) - You may rarely run into the server crashing on start due to a "Floating point exception(core dumped)" error. If this occurs to you, please help with OpenRCT2 development by doing the following: 1. Add the following to the beginning of your server's startup command: `SEGFAULT_SIGNALS=fpe LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so ` 2. Start the server. If it boots normally, nothing extra will print. If it crashes, it will print a stack trace to the console. From 45e100270c8a91c5cd1ce715ab667c154dd9ff1e Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Mon, 17 Jan 2022 15:48:23 -0800 Subject: [PATCH 52/64] Fix issue reference links in README Didn't know GitHub wouldn't parse the issue links in the README like it does in discussions... --- game_eggs/tycoon_games/openrct2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 722216ae..2a270b4b 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -64,7 +64,7 @@ Save files and autosaves are located in this directory: If the "Load Latest Autosave" startup variable is enabled, and the `autosave/` directory exists, the server will load the latest autosave instead of the specified Save File. ___ ### Console Commands -Until support for console commands to interactive programs gets added to Pterodactyl, entering commands via the panel's console do nothing (reference issue pterodactyl/panel#3712). +Until support for console commands to interactive programs gets added to Pterodactyl, entering commands via the panel's console do nothing (reference issue [pterodactyl/panel#3712](https://github.com/pterodactyl/panel/issues/3712)). ___ ### Becoming an Admin on the Server Unfortunately, because console commands currently do not register, becoming the first admin on the server takes some steps, listed below: @@ -80,7 +80,7 @@ ___ The following are known issues that are unique to running OpenRCT2 on Pterodactyl, but likely can only be fixed by further development/updates from OpenRCT2. - Only building from source from the `develop` branch currently yields a package that is bootable. This will no longer be true for any OpenRCT2 releases after v.0.3.5.1. - This also means that clients joining the server must be on the latest `develop` branch as well. -- Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. (OpenRCT2/OpenRCT2#16396) +- Configuring a password on the server disallows non-admin clients from entering in a password in their client to connect; it just disconnects them. Admin clients can still join normally. (reference issue [OpenRCT2/OpenRCT2#16396](https://github.com/OpenRCT2/OpenRCT2/issues/16396)) - You may rarely run into the server crashing on start due to a "Floating point exception(core dumped)" error. If this occurs to you, please help with OpenRCT2 development by doing the following: 1. Add the following to the beginning of your server's startup command: `SEGFAULT_SIGNALS=fpe LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so ` 2. Start the server. If it boots normally, nothing extra will print. If it crashes, it will print a stack trace to the console. From aa1340350313530d317bb996d93d4e0200c44583 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Thu, 20 Jan 2022 19:43:40 +0200 Subject: [PATCH 53/64] feat: pid_limit egg feature to MC eggs Other eggs might benefit from this as well, but for now will stick with MC that are known to spawn a lot of processes when modded. --- .../minecraft/bedrock/bedrock/egg-vanilla-bedrock.json | 6 ++++-- game_eggs/minecraft/java/airplane/egg-airplane.json | 5 +++-- game_eggs/minecraft/java/fabric/egg-fabric.json | 5 +++-- .../forge/curseforge-generic/egg-curseforge-generic.json | 3 ++- .../minecraft/java/forge/forge/egg-forge-enhanced.json | 5 +++-- .../minecraft/java/ftb/egg-ftb-modpacksch-server.json | 3 ++- game_eggs/minecraft/java/krypton/egg-krypton.json | 3 ++- game_eggs/minecraft/java/magma/egg-magma.json | 5 +++-- game_eggs/minecraft/java/mohist/egg-mohist.json | 3 ++- game_eggs/minecraft/java/nanolimbo/egg-nano-limbo.json | 8 ++++++-- game_eggs/minecraft/java/paper/egg-paper.json | 5 +++-- game_eggs/minecraft/java/purpur/egg-purpur.json | 5 +++-- game_eggs/minecraft/java/spigot/egg-spigot.json | 5 +++-- .../minecraft/java/spongeforge/egg-sponge-forge.json | 3 ++- .../minecraft/java/spongevanilla/egg-sponge-vanilla.json | 5 +++-- game_eggs/minecraft/java/tuinity/egg-tuinity.json | 5 +++-- .../minecraft/java/vanillacord/egg-vanilla-cord.json | 5 +++-- .../proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json | 5 +++-- .../proxy/cross_platform/waterdog/egg-waterdog.json | 5 +++-- .../minecraft/proxy/java/flamecord/egg-flamecord.json | 5 +++-- .../minecraft/proxy/java/travertine/egg-travertine.json | 5 +++-- .../proxy/java/typhoonlimbo/egg-typhoon-limbo.json | 4 +++- game_eggs/minecraft/proxy/java/velocity/egg-velocity.json | 3 ++- game_eggs/minecraft/proxy/java/viaaas/egg-v-i-aaa-s.json | 3 ++- .../minecraft/proxy/java/waterfall/egg-waterfall.json | 5 +++-- 25 files changed, 72 insertions(+), 42 deletions(-) diff --git a/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json b/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json index 31507ac9..30d6d85e 100644 --- a/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json +++ b/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json @@ -8,7 +8,9 @@ "name": "Vanilla Bedrock", "author": "parker@parkervcp.com", "description": "Bedrock Edition (also known as the Bedrock Version, Bedrock Codebase, Bedrock Engine or just Bedrock) refers to the multi-platform family of editions of Minecraft developed by Mojang AB, Microsoft Studios, 4J Studios, and SkyBox Labs. Prior to this term, as the engine originated with Pocket Edition, this entire product family was referred to as \"Pocket Edition\", \"MCPE\", or \"Pocket\/Windows 10 Edition\".", - "features": null, + "features": [ + "pid_limit" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:base_debian" ], @@ -83,4 +85,4 @@ "rules": "required|string|in:true,false" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/airplane/egg-airplane.json b/game_eggs/minecraft/java/airplane/egg-airplane.json index 20c90383..764a8679 100644 --- a/game_eggs/minecraft/java/airplane/egg-airplane.json +++ b/game_eggs/minecraft/java/airplane/egg-airplane.json @@ -10,7 +10,8 @@ "description": "A stable, optimized and fast Paper fork.\r\nhttps:\/\/github.com\/TECHNOVE\/Airplane", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -62,4 +63,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/fabric/egg-fabric.json b/game_eggs/minecraft/java/fabric/egg-fabric.json index 064fd7c0..8aaa9342 100644 --- a/game_eggs/minecraft/java/fabric/egg-fabric.json +++ b/game_eggs/minecraft/java/fabric/egg-fabric.json @@ -10,7 +10,8 @@ "description": "Fabric is a modular modding toolchain targeting Minecraft 1.14 and above, including snapshots.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -71,4 +72,4 @@ "rules": "required|string|between:3,15" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json b/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json index 50a67d53..61f2c92c 100644 --- a/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json +++ b/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json @@ -10,7 +10,8 @@ "description": "A generic egg for a forge modpack", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", diff --git a/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json b/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json index bcec803e..5038cae9 100644 --- a/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json +++ b/game_eggs/minecraft/java/forge/forge/egg-forge-enhanced.json @@ -10,7 +10,8 @@ "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.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -71,4 +72,4 @@ "rules": "nullable|string|max:25" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/ftb/egg-ftb-modpacksch-server.json b/game_eggs/minecraft/java/ftb/egg-ftb-modpacksch-server.json index 20d983be..ad59555a 100644 --- a/game_eggs/minecraft/java/ftb/egg-ftb-modpacksch-server.json +++ b/game_eggs/minecraft/java/ftb/egg-ftb-modpacksch-server.json @@ -10,7 +10,8 @@ "description": "Since the release of the FTB APP, FTB modpacks are now distributed through modpacks.ch. This egg was developed for support for modpacks that are distributed through this.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", diff --git a/game_eggs/minecraft/java/krypton/egg-krypton.json b/game_eggs/minecraft/java/krypton/egg-krypton.json index 258262fd..eed82973 100644 --- a/game_eggs/minecraft/java/krypton/egg-krypton.json +++ b/game_eggs/minecraft/java/krypton/egg-krypton.json @@ -10,7 +10,8 @@ "description": "A fast, lightweight Minecraft server written in Kotlin", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", diff --git a/game_eggs/minecraft/java/magma/egg-magma.json b/game_eggs/minecraft/java/magma/egg-magma.json index 527dc9b7..49e63930 100644 --- a/game_eggs/minecraft/java/magma/egg-magma.json +++ b/game_eggs/minecraft/java/magma/egg-magma.json @@ -10,7 +10,8 @@ "description": "Magma is most powerful Forge server providing you with Forge mods and Bukkit Plugins using Spigot and Paper for Performance Optimization and Stability.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", @@ -61,4 +62,4 @@ "rules": "required|string|in:dev,stable" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/mohist/egg-mohist.json b/game_eggs/minecraft/java/mohist/egg-mohist.json index 2502a66f..1dd2339b 100644 --- a/game_eggs/minecraft/java/mohist/egg-mohist.json +++ b/game_eggs/minecraft/java/mohist/egg-mohist.json @@ -10,7 +10,8 @@ "description": "Spigot fork with performance optimizations.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", diff --git a/game_eggs/minecraft/java/nanolimbo/egg-nano-limbo.json b/game_eggs/minecraft/java/nanolimbo/egg-nano-limbo.json index d851618f..92fa577f 100644 --- a/game_eggs/minecraft/java/nanolimbo/egg-nano-limbo.json +++ b/game_eggs/minecraft/java/nanolimbo/egg-nano-limbo.json @@ -8,7 +8,11 @@ "name": "NanoLimbo", "author": "mail@wuffy.eu", "description": "This is lightweight minecraft limbo server, written on Java with Netty. The main goal of the project is maximum simplicity with a minimum number of sent and processed packets. This limbo is empty, there are no ability to set schematic building since this is not necessary. You can send useful information in chat or BossBar.\r\n\r\nNo plugins, no logs. The server is fully clear. It only able keep a lot of players while the main server is down.", - "features": null, + "features": [ + "eula", + "java_version", + "pid_limit" + ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8" ], @@ -56,4 +60,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/paper/egg-paper.json b/game_eggs/minecraft/java/paper/egg-paper.json index b5717965..bbb9de1b 100644 --- a/game_eggs/minecraft/java/paper/egg-paper.json +++ b/game_eggs/minecraft/java/paper/egg-paper.json @@ -10,7 +10,8 @@ "description": "High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -71,4 +72,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/purpur/egg-purpur.json b/game_eggs/minecraft/java/purpur/egg-purpur.json index 808bdd90..579bda6d 100644 --- a/game_eggs/minecraft/java/purpur/egg-purpur.json +++ b/game_eggs/minecraft/java/purpur/egg-purpur.json @@ -10,7 +10,8 @@ "description": "A drop-in replacement for Paper servers designed for configurability, and new fun and exciting gameplay features.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -62,4 +63,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/spigot/egg-spigot.json b/game_eggs/minecraft/java/spigot/egg-spigot.json index d1e5985a..ac81e7a3 100644 --- a/game_eggs/minecraft/java/spigot/egg-spigot.json +++ b/game_eggs/minecraft/java/spigot/egg-spigot.json @@ -10,7 +10,8 @@ "description": "Spigot is the most widely-used modded Minecraft server software in the world. It powers many of the top Minecraft server networks around to ensure they can cope with their huge player base and ensure the satisfaction of their players. Spigot works by reducing and eliminating many causes of lag, as well as adding in handy features and settings that help make your job of server administration easier.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -62,4 +63,4 @@ "rules": "required|string|between:3,10" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/spongeforge/egg-sponge-forge.json b/game_eggs/minecraft/java/spongeforge/egg-sponge-forge.json index 8924dba4..a6fae67b 100644 --- a/game_eggs/minecraft/java/spongeforge/egg-sponge-forge.json +++ b/game_eggs/minecraft/java/spongeforge/egg-sponge-forge.json @@ -10,7 +10,8 @@ "description": "A community-driven open source Minecraft: Java Edition modding platform.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_8", diff --git a/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json b/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json index 630e8042..c6d9449b 100644 --- a/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json +++ b/game_eggs/minecraft/java/spongevanilla/egg-sponge-vanilla.json @@ -10,7 +10,8 @@ "description": "SpongeVanilla is the implementation of the Sponge API on top of Vanilla Minecraft.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -53,4 +54,4 @@ "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/tuinity/egg-tuinity.json b/game_eggs/minecraft/java/tuinity/egg-tuinity.json index 4434352b..e8af6c52 100644 --- a/game_eggs/minecraft/java/tuinity/egg-tuinity.json +++ b/game_eggs/minecraft/java/tuinity/egg-tuinity.json @@ -10,7 +10,8 @@ "description": "Fork of Paper aimed at improving server performance at high playercounts.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -44,4 +45,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json b/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json index adc6266f..8cd9f85c 100644 --- a/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json +++ b/game_eggs/minecraft/java/vanillacord/egg-vanilla-cord.json @@ -10,7 +10,8 @@ "description": "Minecraft is a game about placing blocks and going on adventures. Explore randomly generated worlds and build amazing things from the simplest of homes to the grandest of castles. Play in Creative Mode with unlimited resources or mine deep in Survival Mode, crafting weapons and armor to fend off dangerous mobs. Do all this alone or with friends.\r\n\r\nVanillaCord adds support for BungeeCord's ip_forward setting.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -53,4 +54,4 @@ "rules": "required|string|between:3,15" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json b/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json index 2fbfcbb7..834cdc6c 100644 --- a/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json +++ b/game_eggs/minecraft/proxy/bedrock/waterdog_pe/egg-waterdog-p-e.json @@ -10,7 +10,8 @@ "description": "Brand new proxy server for Minecraft: Bedrock Edition", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -53,4 +54,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json b/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json index 1964dda3..154d2e09 100644 --- a/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json +++ b/game_eggs/minecraft/proxy/cross_platform/waterdog/egg-waterdog.json @@ -10,7 +10,8 @@ "description": "Waterdog is fork of the well-known Waterfall, which is a fork of the well-known BungeeCord, server teleportation suite.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -53,4 +54,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json b/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json index aa279f1c..e80e7b72 100644 --- a/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json +++ b/game_eggs/minecraft/proxy/java/flamecord/egg-flamecord.json @@ -10,7 +10,8 @@ "description": "FlameCord is a patch for Travertine to fix possible exploits and add useful functionalities. FlameCord aims to fix Netty related exploits to keep your server safe from attacks.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -53,4 +54,4 @@ "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json b/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json index 5c4042cc..9e25d5ea 100644 --- a/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json +++ b/game_eggs/minecraft/proxy/java/travertine/egg-travertine.json @@ -10,7 +10,8 @@ "description": "Travertine is a fork of Waterfall with 1.7 protocol support. Waterfall is a fork of the well-known BungeeCord server teleportation suite.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -71,4 +72,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/proxy/java/typhoonlimbo/egg-typhoon-limbo.json b/game_eggs/minecraft/proxy/java/typhoonlimbo/egg-typhoon-limbo.json index 5695c710..e1c7fb1d 100644 --- a/game_eggs/minecraft/proxy/java/typhoonlimbo/egg-typhoon-limbo.json +++ b/game_eggs/minecraft/proxy/java/typhoonlimbo/egg-typhoon-limbo.json @@ -8,7 +8,9 @@ "name": "TyphoonLimbo", "author": "parker@parkervcp.com", "description": "Lightweight minecraft limbo server", - "features": null, + "features": [ + "pid_limit" + ], "images": [ "ghcr.io\/parkervcp\/yolks:debian" ], diff --git a/game_eggs/minecraft/proxy/java/velocity/egg-velocity.json b/game_eggs/minecraft/proxy/java/velocity/egg-velocity.json index b9643632..6d818780 100644 --- a/game_eggs/minecraft/proxy/java/velocity/egg-velocity.json +++ b/game_eggs/minecraft/proxy/java/velocity/egg-velocity.json @@ -10,7 +10,8 @@ "description": "Velocity is a Minecraft server proxy with unparalleled server support, scalability, and flexibility.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", diff --git a/game_eggs/minecraft/proxy/java/viaaas/egg-v-i-aaa-s.json b/game_eggs/minecraft/proxy/java/viaaas/egg-v-i-aaa-s.json index 976deac7..7530a027 100644 --- a/game_eggs/minecraft/proxy/java/viaaas/egg-v-i-aaa-s.json +++ b/game_eggs/minecraft/proxy/java/viaaas/egg-v-i-aaa-s.json @@ -10,7 +10,8 @@ "description": "VIAaaS - ViaVersion as a Service - Standalone ViaVersion proxy", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", diff --git a/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json b/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json index 01612883..4d7fc579 100644 --- a/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json +++ b/game_eggs/minecraft/proxy/java/waterfall/egg-waterfall.json @@ -10,7 +10,8 @@ "description": "Waterfall is a fork of the well-known BungeeCord server teleportation suite.", "features": [ "eula", - "java_version" + "java_version", + "pid_limit" ], "images": [ "ghcr.io\/pterodactyl\/yolks:java_17", @@ -71,4 +72,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From 777174781c554faa5ddb8a849669025dfd491f12 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Thu, 20 Jan 2022 20:09:13 +0200 Subject: [PATCH 54/64] feat: add steam_disk_space egg feature to SteamCMD eggs A new egg feature modal was introduced in Panel v1.7.0 triggering when server has run out of disk space to provide more user-friendly instructions to both admins and normal users. This is unique to SteamCMD specific errors. --- .../7_days_to_die/egg-7-days-to-die.json | 4 +- .../egg-ark--survival-evolved.json | 6 +- .../arma/arma3/egg-arma3.json | 6 +- .../assetto_corsa/egg-assetto-corsa.json | 6 +- .../steamcmd_servers/avorion/egg-avorion.json | 4 +- .../barotrauma/egg-barotrauma.json | 6 +- .../citadel/egg-citadel-forged-with-fire.json | 6 +- .../conan_exiles/egg-conan-exiles.json | 17 +++-- .../craftopia/egg-craftopia.json | 6 +- .../cryofall/egg-cryo-fall.json | 6 +- .../egg-don-t-starve-together.json | 6 +- game_eggs/steamcmd_servers/eco/egg-eco.json | 6 +- game_eggs/steamcmd_servers/fof/egg-fof.json | 4 +- .../egg-custom-h-l-d-s-engine-game.json | 35 ++++++----- .../holdfast/egg-holdfast-na-w.json | 19 ++++-- .../hurtworld/egg-hurtworld.json | 35 ++++++----- .../egg-insurgency--sandstorm.json | 6 +- .../killing_floor_2/egg-killing-floor2.json | 4 +- .../left4dead/egg-left4dead.json | 4 +- .../left4dead_2/egg-left4dead_2.json | 4 +- .../modiverse/egg-modiverse.json | 4 +- .../mordhau/egg-mordhau-wine.json | 6 +- .../steamcmd_servers/mordhau/egg-mordhau.json | 4 +- .../steamcmd_servers/nmrih/egg-nmrih.json | 4 +- .../steamcmd_servers/onset/egg-onset.json | 29 +++++---- .../pavlov_vr/egg-pavlov-v-r.json | 6 +- .../pixark/egg-pix-a-r-k.json | 6 +- .../post_scriptum/egg-post-scriptum.json | 4 +- .../project_zomboid/egg-project-zomboid.json | 6 +- .../quake_live/egg-quake-live.json | 6 +- .../rising_world/egg-rising-world.json | 6 +- .../risk_of_rain_2/egg-risk-of-rain2.json | 6 +- .../rust/rust_autowipe/egg-rust-autowipe.json | 4 +- .../rust/rust_staging/egg-rust-staging.json | 4 +- .../satisfactory/egg-satisfactory.json | 4 +- .../scpsl/dedicated/egg-scpsl.json | 4 +- .../scpsl/exiled/egg-s-c-p--s-l--exiled.json | 4 +- ...s-c-p--secret-laboratory--multi-admin.json | 6 +- .../steamcmd_servers/soldat/egg-soldat.json | 19 ++++-- .../space_engineers/egg-space-engineers.json | 6 +- .../steamcmd_servers/squad/egg-squad.json | 63 ++++++++++--------- .../starbound/egg-starbound.json | 4 +- .../stationeers/egg-stationeers.json | 47 ++++++++------ .../egg-stormworks--build-and-rescue.json | 15 +++-- .../subnautica_nitrox_mod/egg-subnautica.json | 6 +- .../svencoop/egg-sven-co-op.json | 43 +++++++------ .../egg-team-fortress-2-classic.json | 17 +++-- .../the_forest/egg-the-forest.json | 6 +- .../tower_unite/egg-tower-unite.json | 35 ++++++----- .../unturned/egg-unturned.json | 33 ++++++---- .../valheim_plus/egg-valheim-plus-mod.json | 6 +- .../valheim/valheim_vanilla/egg-valheim.json | 6 +- 52 files changed, 389 insertions(+), 220 deletions(-) diff --git a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json index b1e3a7f6..81309ccc 100644 --- a/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json +++ b/game_eggs/steamcmd_servers/7_days_to_die/egg-7-days-to-die.json @@ -8,7 +8,9 @@ "name": "7 Days To Die", "author": "kristoffer.norman@bahnhof.se", "description": "7 days to die server", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], diff --git a/game_eggs/steamcmd_servers/ark_survival_evolved/egg-ark--survival-evolved.json b/game_eggs/steamcmd_servers/ark_survival_evolved/egg-ark--survival-evolved.json index eb40fa9d..51c0c553 100644 --- a/game_eggs/steamcmd_servers/ark_survival_evolved/egg-ark--survival-evolved.json +++ b/game_eggs/steamcmd_servers/ark_survival_evolved/egg-ark--survival-evolved.json @@ -8,7 +8,9 @@ "name": "Ark: Survival Evolved", "author": "dev@shepper.fr", "description": "As a man or woman stranded, naked, freezing, and starving on the unforgiving shores of a mysterious island called ARK, use your skill and cunning to kill or tame and ride the plethora of leviathan dinosaurs and other primeval creatures roaming the land. Hunt, harvest resources, craft items, grow crops, research technologies, and build shelters to withstand the elements and store valuables, all while teaming up with (or preying upon) hundreds of other players to survive, dominate... and escape! \u2014 Gamepedia: ARK", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -119,4 +121,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/arma/arma3/egg-arma3.json b/game_eggs/steamcmd_servers/arma/arma3/egg-arma3.json index 80c66e54..9c72ea16 100644 --- a/game_eggs/steamcmd_servers/arma/arma3/egg-arma3.json +++ b/game_eggs/steamcmd_servers/arma/arma3/egg-arma3.json @@ -8,7 +8,9 @@ "name": "Arma 3", "author": "rehlmgaming@gmail.com", "description": "Experience true combat gameplay in a massive military sandbox. Deploying a wide variety of single- and multiplayer content, over 20 vehicles and 40 weapons, and limitless opportunities for content creation, this is the PC's premier military game. Authentic, diverse, open - Arma 3 sends you to war.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:arma3" ], @@ -236,4 +238,4 @@ "rules": "required|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/assetto_corsa/egg-assetto-corsa.json b/game_eggs/steamcmd_servers/assetto_corsa/egg-assetto-corsa.json index 5046c263..905a4c08 100644 --- a/game_eggs/steamcmd_servers/assetto_corsa/egg-assetto-corsa.json +++ b/game_eggs/steamcmd_servers/assetto_corsa/egg-assetto-corsa.json @@ -8,7 +8,9 @@ "name": "Assetto Corsa", "author": "admin@softwarenoob.com", "description": "Assetto Corsa (Italian for \"Race Setup\") is a sim racing video game developed by the Italian video game developer Kunos Simulazioni. It is designed with an emphasis on a realistic racing experience with support for extensive customization and moddability", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -119,4 +121,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/avorion/egg-avorion.json b/game_eggs/steamcmd_servers/avorion/egg-avorion.json index 6f5b28b6..4c0206bb 100644 --- a/game_eggs/steamcmd_servers/avorion/egg-avorion.json +++ b/game_eggs/steamcmd_servers/avorion/egg-avorion.json @@ -8,7 +8,9 @@ "name": "Avorion", "author": "iamkubi@gmail.com", "description": "A procedural co-op space sandbox where players can build their own space ships out of dynamically scalable blocks. Fight epic space battles, explore, mine, trade, wage wars and build your own empire to save your galaxy from being torn apart by an unknown enemy.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], diff --git a/game_eggs/steamcmd_servers/barotrauma/egg-barotrauma.json b/game_eggs/steamcmd_servers/barotrauma/egg-barotrauma.json index c72a2666..4cc6a1f7 100644 --- a/game_eggs/steamcmd_servers/barotrauma/egg-barotrauma.json +++ b/game_eggs/steamcmd_servers/barotrauma/egg-barotrauma.json @@ -8,7 +8,9 @@ "name": "Barotrauma", "author": "admin@softwarenoob.com", "description": "Barotrauma is a 2D co-op survival horror submarine simulator, inspired by games like FTL: Faster Than Light, Rimworld, Dwarf Fortress and Space Station 13. It\u2019s a Sci-Fi game that combines ragdoll physics and alien sea monsters with teamwork and existential fear.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -47,4 +49,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/citadel/egg-citadel-forged-with-fire.json b/game_eggs/steamcmd_servers/citadel/egg-citadel-forged-with-fire.json index d2b94ae1..1c294c12 100644 --- a/game_eggs/steamcmd_servers/citadel/egg-citadel-forged-with-fire.json +++ b/game_eggs/steamcmd_servers/citadel/egg-citadel-forged-with-fire.json @@ -8,7 +8,9 @@ "name": "Citadel: Forged with Fire", "author": "info@goover.de", "description": "Citadel: Forged With Fire is a massive online sandbox RPG set in the mystical world of Ignus. Featuring magic, spellcasting, building, exploring and crafting as you fight to make a name for yourself and achieve notoriety across the land.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -65,4 +67,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/conan_exiles/egg-conan-exiles.json b/game_eggs/steamcmd_servers/conan_exiles/egg-conan-exiles.json index f7fc3df2..4618f5ba 100644 --- a/game_eggs/steamcmd_servers/conan_exiles/egg-conan-exiles.json +++ b/game_eggs/steamcmd_servers/conan_exiles/egg-conan-exiles.json @@ -1,13 +1,20 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-10-24T11:25:01+00:00", + "exported_at": "2022-01-20T12:47:23-05:00", "name": "Conan Exiles", "author": "brycea@terrahost.cloud", "description": "Conan Exiles is an open-world survival game set in the brutal lands of Conan the Barbarian. Survive in a savage world, build your kingdom, and dominate your enemies in brutal combat and epic warfare.", - "image": "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5" + ], + "file_denylist": [], "startup": "xvfb-run --auto-servernum wine \/home\/container\/ConanSandboxServer.exe -console -log -Port={{SERVER_PORT}} -QueryPort={{QUERY_PORT}}", "config": { "files": "{}", @@ -17,7 +24,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +@sSteamCmdForcePlatformType windows +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", + "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +@sSteamCmdForcePlatformType windows +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -69,4 +76,4 @@ "rules": "required|numeric|max:65535" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json b/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json index f1fd8187..5a24cf53 100644 --- a/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json +++ b/game_eggs/steamcmd_servers/craftopia/egg-craftopia.json @@ -8,7 +8,9 @@ "name": "Craftopia", "author": "info@goover.de", "description": "Craftopia is the brand new multiplayer survival action game made in Japan. We combined many features we find enjoyable, such as hunting, farming, hack-and-slash, building, automation to develop this game.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -56,4 +58,4 @@ "rules": "required|string|max:50" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/cryofall/egg-cryo-fall.json b/game_eggs/steamcmd_servers/cryofall/egg-cryo-fall.json index a780101a..9d7ea870 100644 --- a/game_eggs/steamcmd_servers/cryofall/egg-cryo-fall.json +++ b/game_eggs/steamcmd_servers/cryofall/egg-cryo-fall.json @@ -8,7 +8,9 @@ "name": "CryoFall", "author": "contact@zennodes.dk", "description": "NOTE: For now you have to change SettingsServer.xml under CryoFall_Server_v(Version)_NetCore\/Data\/SettingsServer.xml\r\n\r\nCryoFall is a sci-fi multiplayer colony simulation survival game set on a forgotten planet in a distant future.\r\n\r\nJoin the vast world of CryoFall together with other survivors to rebuild your civilization from scratch. Start with primitive technology and simple tools and use them to progress towards modern industrial might and even beyond, eventually reaching space-age technology only seen in science fiction.\r\n\r\nCryoFall can be played either as a relaxed PvE experience with no competition or as a brutal and unforgiving PvP. Make your choice and join one of many available servers with different game modes or host your own and invite your friends to join you!\r\n\r\nBuild your house or a large base together with other players. Dig wells and create farms to sustain basic needs. Build vehicles to explore the world faster. Establish basics of science, all the way from medicine and chemistry to fuel creation and even lithium extraction to create electronic devices. Cook food or prepare drinks to sell them from vending machines in your store.\r\n\r\nBuild factories to produce on an industrial scale: Weapons and defense systems, bionic implants to augment yourself, even large war machines and artillery guns to use against the biggest of opponents", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/yolks:dotnet_5" ], @@ -38,4 +40,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/dont_starve/egg-don-t-starve-together.json b/game_eggs/steamcmd_servers/dont_starve/egg-don-t-starve-together.json index fac6f1a4..7ac34fcf 100644 --- a/game_eggs/steamcmd_servers/dont_starve/egg-don-t-starve-together.json +++ b/game_eggs/steamcmd_servers/dont_starve/egg-don-t-starve-together.json @@ -8,7 +8,9 @@ "name": "Don't Starve Together", "author": "parker@parkervcp.com", "description": "Don\u2019t Starve Together is an uncompromising wilderness survival game full of science and magic.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_source" ], @@ -110,4 +112,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/eco/egg-eco.json b/game_eggs/steamcmd_servers/eco/egg-eco.json index 85ffcfbf..2427f1c6 100644 --- a/game_eggs/steamcmd_servers/eco/egg-eco.json +++ b/game_eggs/steamcmd_servers/eco/egg-eco.json @@ -8,7 +8,9 @@ "name": "Eco", "author": "info@goover.de", "description": "Eco is an online world from Strange Loop Games where players must build civilization using resources from an ecosystem that can be damaged and destroyed. The world of Eco is an incredibly reactive one, and whatever any player does in the world affects the underlying ecosystem.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_dotnet-5" ], @@ -92,4 +94,4 @@ "rules": "required|string|max:50" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/fof/egg-fof.json b/game_eggs/steamcmd_servers/fof/egg-fof.json index 1ad65cd8..f6a74f04 100644 --- a/game_eggs/steamcmd_servers/fof/egg-fof.json +++ b/game_eggs/steamcmd_servers/fof/egg-fof.json @@ -8,7 +8,9 @@ "name": "Fof", "author": "avalongamecs@gmail.com", "description": "Fistful of Frags", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:source" ], diff --git a/game_eggs/steamcmd_servers/hlds_server/egg-custom-h-l-d-s-engine-game.json b/game_eggs/steamcmd_servers/hlds_server/egg-custom-h-l-d-s-engine-game.json index 173dc848..3d6c6251 100644 --- a/game_eggs/steamcmd_servers/hlds_server/egg-custom-h-l-d-s-engine-game.json +++ b/game_eggs/steamcmd_servers/hlds_server/egg-custom-h-l-d-s-engine-game.json @@ -1,23 +1,30 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2019-06-28T20:41:35-04:00", + "exported_at": "2022-01-20T12:52:11-05:00", "name": "Custom HLDS Engine Game", "author": "parker@parkervcp.com", "description": "This option allows modifying the startup arguments and other details to run a custom HLDS based game on the panel.", - "image": "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source" + ], + "file_denylist": [], "startup": ".\/hlds_run -console -game {{HLDS_GAME}} -port {{SERVER_PORT}} -sport {{VAC_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"Connection to Steam servers successful\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Connection to Steam servers successful\"\r\n}", + "logs": "{}", "stop": "quit" }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} +app_set_config 90 mod ${HLDS_GAME} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", + "script": "#!\/bin\/bash\r\n# SRCDS Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login anonymous +app_update ${SRCDS_APPID} +app_set_config 90 mod ${HLDS_GAME} +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so", "container": "ubuntu:18.04", "entrypoint": "bash" } @@ -28,8 +35,8 @@ "description": "The ID corresponding to the game to download and run using HLDS.\r\n\r\nThe HLDS server ID is 90. This should not be changed.", "env_variable": "SRCDS_APPID", "default_value": "90", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|numeric|digits_between:1,6" }, { @@ -37,8 +44,8 @@ "description": "The name corresponding to the game to download and run using HLDS.\r\n\r\nall the HLDS server names are here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Server_Name_Enumeration", "env_variable": "HLDS_GAME", "default_value": "cstrike", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|alpha_dash|between:1,100" }, { @@ -46,8 +53,8 @@ "description": "The default map for the server.", "env_variable": "SRCDS_MAP", "default_value": "de_dust2", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|alpha_dash" }, { @@ -55,8 +62,8 @@ "description": "Specifies the VAC port the server should use. Default is 26900.", "env_variable": "VAC_PORT", "default_value": "26900", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|numeric|digits_between:1,5" } ] diff --git a/game_eggs/steamcmd_servers/holdfast/egg-holdfast-na-w.json b/game_eggs/steamcmd_servers/holdfast/egg-holdfast-na-w.json index f04c4fcd..a774cddc 100644 --- a/game_eggs/steamcmd_servers/holdfast/egg-holdfast-na-w.json +++ b/game_eggs/steamcmd_servers/holdfast/egg-holdfast-na-w.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-10-18T19:13:53-04:00", + "exported_at": "2022-01-20T12:53:50-05:00", "name": "Holdfast NaW", "author": "ankit@bmghosting.com", "description": "Holdfast: Nations at War", - "image": "bmghosting\/pterodactyl-holdfast", + "features": [ + "steam_disk_space" + ], + "images": [ + "bmghosting\/pterodactyl-holdfast" + ], + "file_denylist": [], "startup": "\".\/holdfastnaw-dedicated\/Holdfast NaW\" -startserver -batchmode -nographics -screen-width 320 -screen-height 240 -screen-quality Fastest -framerate {{FPSMAX}} --serverheadless -serverConfigFilePath holdfastnaw-dedicated\/configs\/{{SERVER_CONFIG_PATH}} -logFile holdfastnaw-dedicated\/logs_output\/output_{{SERVER_CONFIG_PATH}} -logArchivesDirectory holdfastnaw-dedicated\/{{SERVER_LOG_ARCHIVE_PATH}}\/ -adminCommandsLogFilePath holdfastnaw-dedicated\/logs_adminactions\/admin_{{SERVER_CONFIG_PATH}} -playersLogFilePath holdfastnaw-dedicated\/logs_playerlogin\/players_{{SERVER_CONFIG_PATH}} -scoreboardLogFilePath holdfastnaw-dedicated\/logs_score\/scorelog_{{SERVER_CONFIG_PATH}} -chatLogFilePath holdfastnaw-dedicated\/logs_chat\/chatlog_{{SERVER_CONFIG_PATH}} -workshopDataPath holdfastnaw-dedicated\/workshop -micSpammersPlayersFilePath holdfastnaw-dedicated\/micspammers.txt -mutedVoipPlayersFilePath holdfastnaw-dedicated\/mutedplayersvoip.txt -mutedChatPlayersFilePath holdfastnaw-dedicated\/mutedplayerschat.txt -bannedPlayersFilePath holdfastnaw-dedicated\/bannedplayers.txt -p {{SERVER_PORT}} -l \"94.130.66.231\" -o 7101", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"STEAMAPPS_INTERFACE_VERSION008\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"STEAMAPPS_INTERFACE_VERSION008\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { @@ -141,4 +148,4 @@ "rules": "nullable|string|max:100" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/hurtworld/egg-hurtworld.json b/game_eggs/steamcmd_servers/hurtworld/egg-hurtworld.json index 135369c1..37d3c695 100644 --- a/game_eggs/steamcmd_servers/hurtworld/egg-hurtworld.json +++ b/game_eggs/steamcmd_servers/hurtworld/egg-hurtworld.json @@ -1,23 +1,30 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-04-16T20:41:27-04:00", + "exported_at": "2022-01-20T12:55:06-05:00", "name": "Hurtworld", "author": "brycea@terrahost.cloud", "description": "Hurtworld is a hardcore multiplayer survival FPS with a focus on deep survival progression that doesn't become trivial once you establish some basic needs. Built for hardcore gamers, Hurtworld aims to punish.", - "image": "quay.io\/parkervcp\/pterodactyl-images:debian_source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:debian_source" + ], + "file_denylist": [], "startup": ".\/Hurtworld.x86_64 -batchmode -nographics -exec \"host {{SERVER_PORT}};queryport {{QUERY_PORT}};maxplayers {{MAX_PLAYERS}};servername {{HOSTNAME}};creativemode ${CREATIVE_MODE};${ADMINS}\" -logfile $1", "config": { "files": "{}", "startup": "{\r\n \"done\": \"orphaned items\"\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", + "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", "container": "debian:buster-slim", "entrypoint": "bash" } @@ -28,8 +35,8 @@ "description": "The ID corresponding to the game to download and run using SRCDS.", "env_variable": "SRCDS_APPID", "default_value": "405100", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|regex:\/^(405100)$\/" }, { @@ -37,8 +44,8 @@ "description": "Server Query Default Port", "env_variable": "QUERY_PORT", "default_value": "13871", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|string" }, { @@ -46,8 +53,8 @@ "description": "Max players allowed on the server at one time.", "env_variable": "MAX_PLAYERS", "default_value": "60", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:60" }, { @@ -55,9 +62,9 @@ "description": "The name of your server in the public server list.", "env_variable": "HOSTNAME", "default_value": "A Hurtworld Server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:50" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/insurgency_sandstorm/egg-insurgency--sandstorm.json b/game_eggs/steamcmd_servers/insurgency_sandstorm/egg-insurgency--sandstorm.json index 966e11fb..724c0989 100644 --- a/game_eggs/steamcmd_servers/insurgency_sandstorm/egg-insurgency--sandstorm.json +++ b/game_eggs/steamcmd_servers/insurgency_sandstorm/egg-insurgency--sandstorm.json @@ -8,7 +8,9 @@ "name": "Insurgency: Sandstorm", "author": "brycea@terrahost.cloud", "description": "Insurgency: Sandstorm is a team-based, tactical FPS based on lethal close quarters combat and objective-oriented multiplayer gameplay. Experience the intensity of modern combat where skill is rewarded, and teamwork wins the fight.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], @@ -92,4 +94,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/killing_floor_2/egg-killing-floor2.json b/game_eggs/steamcmd_servers/killing_floor_2/egg-killing-floor2.json index e7072f68..bdc08e4d 100644 --- a/game_eggs/steamcmd_servers/killing_floor_2/egg-killing-floor2.json +++ b/game_eggs/steamcmd_servers/killing_floor_2/egg-killing-floor2.json @@ -8,7 +8,9 @@ "name": "Killing Floor 2", "author": "parker@parkervcp.com", "description": "In KILLING FLOOR 2, players descend into continental Europe after it has been overrun by horrific, murderous clones called Zeds that were created by the corporation Horzine. The Zed outbreak caused by Horzine Biotech\u2019s failed experiments has quickly spread with unstoppable momentum, paralyzing the European Union. Only a month ago, the first Zed outbreak from the original KILLING FLOOR ripped through London; now the specimen clones are everywhere.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_source" ], diff --git a/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json index ae16efa9..c465949f 100644 --- a/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json +++ b/game_eggs/steamcmd_servers/left4dead/egg-left4dead.json @@ -8,7 +8,9 @@ "name": "Left 4 Dead", "author": "pterodactyl@mazoyer.eu", "description": "An outbreak of a highly contagious pathogen nicknamed the \"Green Flu\" begins in Pennsylvania. Two weeks after the first infection, four immune survivors, Bill, Zoey, Louis, and Francis make their way out of the city of Fairfield, only to discover that the infection is creating dangerous mutations in some of its hosts.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], diff --git a/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json index 8c2ef2e3..4034580b 100644 --- a/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json +++ b/game_eggs/steamcmd_servers/left4dead_2/egg-left4dead_2.json @@ -8,7 +8,9 @@ "name": "Left 4 Dead 2", "author": "pterodactyl@mazoyer.eu", "description": "Left 4 Dead 2 is set in the aftermath of a worldwide pandemic of a disease nicknamed the \"Green Flu\", which rapidly transforms humans into zombie-like creatures and mutated forms that demonstrate extreme aggression towards non-infected beings. A few humans are immune to the disease, while some of those who are infected have no symptoms. The Civil Emergency and Defense Agency (CEDA) and the U.S. military create safe zones to attempt to evacuate as many survivors as possible.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], diff --git a/game_eggs/steamcmd_servers/modiverse/egg-modiverse.json b/game_eggs/steamcmd_servers/modiverse/egg-modiverse.json index 2c74f9cc..d141ee19 100644 --- a/game_eggs/steamcmd_servers/modiverse/egg-modiverse.json +++ b/game_eggs/steamcmd_servers/modiverse/egg-modiverse.json @@ -8,7 +8,9 @@ "name": "Modiverse", "author": "admin@softwarenoob.com", "description": "Modiverse provides a sandbox environment with the ability to create and play mods such as TTT, Deathrun, FortWars, RP, and more! Use the many sandbox tools to build complex worlds with props, lights, thrusters, wheels, and much much more!", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source" ], diff --git a/game_eggs/steamcmd_servers/mordhau/egg-mordhau-wine.json b/game_eggs/steamcmd_servers/mordhau/egg-mordhau-wine.json index 5cdc11fb..184da24f 100644 --- a/game_eggs/steamcmd_servers/mordhau/egg-mordhau-wine.json +++ b/game_eggs/steamcmd_servers/mordhau/egg-mordhau-wine.json @@ -8,7 +8,9 @@ "name": "Mordhau Wine", "author": "parker@parkervcp.com", "description": "Mordhau is a multiplayer medieval hack 'n slash video game, developed by Slovenian independent studio Triternion, with a prominent aspect of skill-based competitive play and customization.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_wine" ], @@ -128,4 +130,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/mordhau/egg-mordhau.json b/game_eggs/steamcmd_servers/mordhau/egg-mordhau.json index 2af72a7a..521870db 100644 --- a/game_eggs/steamcmd_servers/mordhau/egg-mordhau.json +++ b/game_eggs/steamcmd_servers/mordhau/egg-mordhau.json @@ -8,7 +8,9 @@ "name": "Mordhau", "author": "trey@chazx.cc", "description": "Mordhau is a multiplayer medieval hack 'n slash video game, developed by Slovenian independent studio Triternion, with a prominent aspect of skill-based competitive play and customization.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:game_mordhau" ], diff --git a/game_eggs/steamcmd_servers/nmrih/egg-nmrih.json b/game_eggs/steamcmd_servers/nmrih/egg-nmrih.json index 2da69396..8a53664b 100644 --- a/game_eggs/steamcmd_servers/nmrih/egg-nmrih.json +++ b/game_eggs/steamcmd_servers/nmrih/egg-nmrih.json @@ -8,7 +8,9 @@ "name": "nmrih", "author": "avalongamecs@gmail.com", "description": "No More Room In Hell", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:source" ], diff --git a/game_eggs/steamcmd_servers/onset/egg-onset.json b/game_eggs/steamcmd_servers/onset/egg-onset.json index 5bdd099a..8fea938e 100644 --- a/game_eggs/steamcmd_servers/onset/egg-onset.json +++ b/game_eggs/steamcmd_servers/onset/egg-onset.json @@ -1,17 +1,24 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2019-12-12T18:56:28-05:00", + "exported_at": "2022-01-20T12:56:32-05:00", "name": "Onset", "author": "parker@parkervcp.com", "description": "Onset is an open world multiplayer sandbox without predefined goals. Create and host your very own experience in Onset using scripting functions. Whether that is Roleplay, Cops and Robbers or classic Freeroam. Or just enjoy the different gamemodes created by other players.", - "image": "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source" + ], + "file_denylist": [], "startup": ".\/OnsetServer --noinput", "config": { - "files": "{\r\n \"server_config.json\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"ipaddress\": \"0.0.0.0\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"servername\": \"{{server.build.env.SERVER_NAME}}\",\r\n \"password\":\"{{server.build.env.SERVER_PASSWORD}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Entering simulation\",\r\n \"userInteraction\": []\r\n}", + "files": "{\r\n \"server_config.json\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"ipaddress\": \"0.0.0.0\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"servername\": \"{{server.build.env.SERVER_NAME}}\",\r\n \"password\": \"{{server.build.env.SERVER_PASSWORD}}\"\r\n }\r\n }\r\n}", + "startup": "{\r\n \"done\": \"Entering simulation\"\r\n}", "logs": "{}", "stop": "^C" }, @@ -28,8 +35,8 @@ "description": "ARK steam app id for auto updates. Leave blank to avoid auto update.", "env_variable": "SRCDS_APPID", "default_value": "1204170", - "user_viewable": 1, - "user_editable": 0, + "user_viewable": true, + "user_editable": false, "rules": "required|string|max:20" }, { @@ -37,8 +44,8 @@ "description": "required to load server libraries.", "env_variable": "LD_LIBRARY_PATH", "default_value": ".", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string|max:20" }, { @@ -46,8 +53,8 @@ "description": "This flag will auto update the server on restart. (default is 1) \r\n\r\nSet to 1 to update\r\nSet to 0 to no update", "env_variable": "AUTO_UPDATE", "default_value": "1", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:20" } ] diff --git a/game_eggs/steamcmd_servers/pavlov_vr/egg-pavlov-v-r.json b/game_eggs/steamcmd_servers/pavlov_vr/egg-pavlov-v-r.json index 73f96dc7..8a51b857 100644 --- a/game_eggs/steamcmd_servers/pavlov_vr/egg-pavlov-v-r.json +++ b/game_eggs/steamcmd_servers/pavlov_vr/egg-pavlov-v-r.json @@ -8,7 +8,9 @@ "name": "Pavlov VR", "author": "admin@devil.wtf", "description": "Pavlov VR is a multiplayer shooter in VR with heavy focus on community features. Realistic reloading features and fast paced combat as part of the core experience. Play the #1 most popular VR shooter on PC today.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_source" ], @@ -74,4 +76,4 @@ "rules": "required|boolean" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/pixark/egg-pix-a-r-k.json b/game_eggs/steamcmd_servers/pixark/egg-pix-a-r-k.json index d6aa04e8..9c93cc3d 100644 --- a/game_eggs/steamcmd_servers/pixark/egg-pix-a-r-k.json +++ b/game_eggs/steamcmd_servers/pixark/egg-pix-a-r-k.json @@ -8,7 +8,9 @@ "name": "PixARK", "author": "hello@venatus.digital", "description": "A simple Docker container with Wine to run PixARK using Pterodactyl Panel", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:ubuntu_wine-source" ], @@ -109,4 +111,4 @@ "rules": "required|string|max:30" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/post_scriptum/egg-post-scriptum.json b/game_eggs/steamcmd_servers/post_scriptum/egg-post-scriptum.json index c31662aa..df3b95df 100644 --- a/game_eggs/steamcmd_servers/post_scriptum/egg-post-scriptum.json +++ b/game_eggs/steamcmd_servers/post_scriptum/egg-post-scriptum.json @@ -8,7 +8,9 @@ "name": "Post Scriptum", "author": "admin@softwarenoob.com", "description": "Post Scriptum is a WW2-themed first-person tactical shooter that provides an authentic WWII combat experience. Focusing on historical accuracy, large-scale battles, and a challenging battlefield demands an intense need for cohesion, communication, and teamwork.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:source" ], diff --git a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json index 4ecec781..946d9747 100644 --- a/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json +++ b/game_eggs/steamcmd_servers/project_zomboid/egg-project-zomboid.json @@ -8,7 +8,9 @@ "name": "Project Zomboid", "author": "iamkubi@gmail.com", "description": "Project Zomboid is an open world survival horror video game in alpha stage development by British and Canadian independent developer, The Indie Stone. The game is set in a post apocalyptic, zombie infested world where the player is challenged to survive for as long as possible before inevitably dying.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/pterodactyl\/games:source" ], @@ -101,4 +103,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/quake_live/egg-quake-live.json b/game_eggs/steamcmd_servers/quake_live/egg-quake-live.json index 07e4dc75..a74a28d0 100644 --- a/game_eggs/steamcmd_servers/quake_live/egg-quake-live.json +++ b/game_eggs/steamcmd_servers/quake_live/egg-quake-live.json @@ -7,7 +7,9 @@ "name": "Quake Live", "author": "patz.michael@gmail.com", "description": "Quake Live is a first-person shooter video game by id Software. It is an updated version of Quake III Arena that was originally designed as a free-to-play game launched via a web browser plug-in. On September 17, 2014, the game was re-launched as a standalone title on Steam.", - "features": null, + "features": [ + "steam_disk_space" + ], "image": "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source", "startup": ".\/qzeroded.x64 +set net_port \"{{SERVER_PORT}}\" +set sv_hostname \"{{SERVER_NAME}}\" +set sv_serverType \"{{SERVER_TYPE}}\" +set g_password \"{{PASSWORD}}\" +sv_fps \"{{FPS}}\"", "config": { @@ -70,4 +72,4 @@ "rules": "required|numeric" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/rising_world/egg-rising-world.json b/game_eggs/steamcmd_servers/rising_world/egg-rising-world.json index a347d7fe..c0943eb7 100644 --- a/game_eggs/steamcmd_servers/rising_world/egg-rising-world.json +++ b/game_eggs/steamcmd_servers/rising_world/egg-rising-world.json @@ -8,7 +8,9 @@ "name": "Rising World", "author": "info@goover.de", "description": "Rising World is a voxel based open-world sandbox game, featuring a procedurally generated world, playable in single and multi-player.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:java" ], @@ -92,4 +94,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/risk_of_rain_2/egg-risk-of-rain2.json b/game_eggs/steamcmd_servers/risk_of_rain_2/egg-risk-of-rain2.json index 664e617e..cc578645 100644 --- a/game_eggs/steamcmd_servers/risk_of_rain_2/egg-risk-of-rain2.json +++ b/game_eggs/steamcmd_servers/risk_of_rain_2/egg-risk-of-rain2.json @@ -8,7 +8,9 @@ "name": "Risk of Rain 2", "author": "alex.chang-lam@protonmail.com", "description": "Risk of Rain 2 dedicated server.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5" ], @@ -83,4 +85,4 @@ "rules": "required|numeric" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/rust/rust_autowipe/egg-rust-autowipe.json b/game_eggs/steamcmd_servers/rust/rust_autowipe/egg-rust-autowipe.json index 0e2e2f9d..20c9d92d 100644 --- a/game_eggs/steamcmd_servers/rust/rust_autowipe/egg-rust-autowipe.json +++ b/game_eggs/steamcmd_servers/rust/rust_autowipe/egg-rust-autowipe.json @@ -8,7 +8,9 @@ "name": "Rust Autowipe", "author": "support@pterodactyl.io", "description": "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:rust" ], diff --git a/game_eggs/steamcmd_servers/rust/rust_staging/egg-rust-staging.json b/game_eggs/steamcmd_servers/rust/rust_staging/egg-rust-staging.json index fb2a13c7..5f1b6642 100644 --- a/game_eggs/steamcmd_servers/rust/rust_staging/egg-rust-staging.json +++ b/game_eggs/steamcmd_servers/rust/rust_staging/egg-rust-staging.json @@ -8,7 +8,9 @@ "name": "Rust Staging", "author": "root@smc.li", "description": "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:rust" ], diff --git a/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json b/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json index a8d64c18..3d8f7889 100644 --- a/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json +++ b/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json @@ -7,7 +7,9 @@ "name": "Satisfactory", "author": "rehlmgaming@gmail.com", "description": "Satisfactory is a first-person open-world factory building game with a dash of exploration and combat. Play alone or with friends, explore an alien planet, create multi-story factories, and enter conveyor belt heaven!", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/games:source" ], diff --git a/game_eggs/steamcmd_servers/scpsl/dedicated/egg-scpsl.json b/game_eggs/steamcmd_servers/scpsl/dedicated/egg-scpsl.json index 08d6502c..d6f12f63 100644 --- a/game_eggs/steamcmd_servers/scpsl/dedicated/egg-scpsl.json +++ b/game_eggs/steamcmd_servers/scpsl/dedicated/egg-scpsl.json @@ -8,7 +8,9 @@ "name": "SCP:SL", "author": "info@goover.de", "description": "Egg for SCP: Secret Laboratory Dedicated Linux Server", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/yolks:mono_latest" ], diff --git a/game_eggs/steamcmd_servers/scpsl/exiled/egg-s-c-p--s-l--exiled.json b/game_eggs/steamcmd_servers/scpsl/exiled/egg-s-c-p--s-l--exiled.json index 75433fac..efe895ce 100644 --- a/game_eggs/steamcmd_servers/scpsl/exiled/egg-s-c-p--s-l--exiled.json +++ b/game_eggs/steamcmd_servers/scpsl/exiled/egg-s-c-p--s-l--exiled.json @@ -8,7 +8,9 @@ "name": "SCP:SL - Exiled", "author": "info@goover.de", "description": "Egg for SCP: Secret Laboratory Dedicated Linux Server with Exiled Plugin Framework", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/yolks:mono_latest" ], diff --git a/game_eggs/steamcmd_servers/scpsl/multiadmin/egg-s-c-p--secret-laboratory--multi-admin.json b/game_eggs/steamcmd_servers/scpsl/multiadmin/egg-s-c-p--secret-laboratory--multi-admin.json index 75239ecb..e422fd4b 100644 --- a/game_eggs/steamcmd_servers/scpsl/multiadmin/egg-s-c-p--secret-laboratory--multi-admin.json +++ b/game_eggs/steamcmd_servers/scpsl/multiadmin/egg-s-c-p--secret-laboratory--multi-admin.json @@ -8,7 +8,9 @@ "name": "SCP: Secret Laboratory - MultiAdmin", "author": "info@goover.de", "description": "The latest vanilla version of SCP:SL running through MultiAdmin for compatibility. LocalAdmin does not work. No SMod2.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/yolks:mono_latest" ], @@ -47,4 +49,4 @@ "rules": "required|integer" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/soldat/egg-soldat.json b/game_eggs/steamcmd_servers/soldat/egg-soldat.json index 2da42877..235aaa83 100644 --- a/game_eggs/steamcmd_servers/soldat/egg-soldat.json +++ b/game_eggs/steamcmd_servers/soldat/egg-soldat.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-10-06T16:59:53+02:00", + "exported_at": "2022-01-20T12:58:19-05:00", "name": "Soldat", "author": "info@goover.de", "description": "Soldat is a unique 2D (side-view) multiplayer action game. It has been influenced by the best of games such as Liero, Worms, Quake, and Counter-Strike and provides a fast-paced gaming experience with tons of blood and flesh. Soldiers fight against each other in 2D battle arenas using a deadly arsenal of military weapons, across 7 default game modes. It features 18 different weapons and 60 maps to frag away on, with full support for user created content.\r\n\r\nSteam: https:\/\/store.steampowered.com\/app\/638490\/Soldat\/", - "image": "quay.io\/parkervcp\/pterodactyl-images:base_debian", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:base_debian" + ], + "file_denylist": [], "startup": ".\/soldatserver", "config": { "files": "{\r\n \"soldat.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"NETWORK.Port\": \"{{server.build.default.port}}\",\r\n \"NETWORK.Max_Players\": \"{{server.build.env.MAX_PLAYERS}}\",\r\n \"NETWORK.Game_Password\": \"{{server.build.env.SRV_PWD}}\",\r\n \"NETWORK.Admin_Password\": \"{{server.build.env.ADMIN_PASSWD}}\",\r\n \"NETWORK.Server_Name\": \"{{server.build.env.SRV_NAME}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Done\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Done\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { @@ -69,4 +76,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/space_engineers/egg-space-engineers.json b/game_eggs/steamcmd_servers/space_engineers/egg-space-engineers.json index 40697ed3..c0cac4fa 100644 --- a/game_eggs/steamcmd_servers/space_engineers/egg-space-engineers.json +++ b/game_eggs/steamcmd_servers/space_engineers/egg-space-engineers.json @@ -8,7 +8,9 @@ "name": "Space Engineers", "author": "tueye@tuworld.de", "description": "Space Engineers is a voxel-based sandbox game set in space and on planets.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5" ], @@ -164,4 +166,4 @@ "rules": "required|string|in:1" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/squad/egg-squad.json b/game_eggs/steamcmd_servers/squad/egg-squad.json index 51a36b6b..51264aac 100644 --- a/game_eggs/steamcmd_servers/squad/egg-squad.json +++ b/game_eggs/steamcmd_servers/squad/egg-squad.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2019-10-08T08:47:08-04:00", + "exported_at": "2022-01-20T12:59:49-05:00", "name": "Squad", "author": "brycea@terrahost.cloud", "description": "Squad is a 50 vs 50 multiplayer first-person shooter that aims to capture combat realism through communication and teamplay. Major features include vehicle-based combined arms gameplay, large scale environments, base building, and integrated positional VoIP for proximity talking & radio.", - "image": "quay.io\/pterodactyl\/core:source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], "startup": "\/home\/container\/SquadGame\/Binaries\/Linux\/SquadGameServer SquadGame Port={{SERVER_PORT}} QueryPort={{QUERY_PORT}}", "config": { "files": "{\r\n \"SquadGame\/ServerConfig\/Server.cfg\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"ServerName\": \"ServerName=\\\"{{server.build.env.servername}}\\\"\",\r\n \"MaxPlayers\": \"MaxPlayers={{server.build.env.maxplayers}}\",\r\n \"AllowTeamChanges\": \"AllowTeamChanges={{server.build.env.allowteamchange}}\",\r\n \"ShouldAdvertise\": \"ShouldAdvertise={{server.build.env.advertise}}\",\r\n \"NumReservedSlots\": \"NumReservedSlots={{server.build.env.reservedslots}}\",\r\n \"PreventTeamChangeIfUnbalanced\": \"PreventTeamChangeIfUnbalanced={{server.build.env.ptciu}}\",\r\n \"EnforceTeamBalance\": \"EnforceTeamBalance={{server.build.env.teambal}}\",\r\n \"RecordDemos\": \"RecordDemos={{server.build.env.recorddemos}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Engine Initialization\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": false,\r\n \"location\": \"latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Engine Initialization\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { @@ -28,8 +35,8 @@ "description": "Query port for your Squad server.", "env_variable": "QUERY_PORT", "default_value": "27165", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric" }, { @@ -37,8 +44,8 @@ "description": "this is needed for some reason", "env_variable": "LD_LIBRARY_PATH", "default_value": "\/home\/container\/linux64\/", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string" }, { @@ -46,8 +53,8 @@ "description": "The ID corresponding to the game to download and run using SRCDS.", "env_variable": "SRCDS_APPID", "default_value": "403240", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string|max:20" }, { @@ -55,8 +62,8 @@ "description": "The name for the server in the server list", "env_variable": "servername", "default_value": "Squad Server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:30" }, { @@ -64,8 +71,8 @@ "description": "Sets the maximum number of players.", "env_variable": "maxplayers", "default_value": "80", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required" }, { @@ -73,8 +80,8 @@ "description": "Allow players to change teams ( true \/ false )", "env_variable": "allowteamchange", "default_value": "true", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -82,8 +89,8 @@ "description": "Have the server report to the public server list ( true \/ false )", "env_variable": "advertise", "default_value": "true", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -91,8 +98,8 @@ "description": "The number of reserved slots for admins \/ mods", "env_variable": "reservedslots", "default_value": "0", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -100,8 +107,8 @@ "description": "This will prevent players from changing teams if they're already unbalanced ( true \/ false )", "env_variable": "ptciu", "default_value": "true", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -109,8 +116,8 @@ "description": "This will FORCE team balance if the teams are too uneven ( true \/ false )", "env_variable": "teambal", "default_value": "true", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -118,9 +125,9 @@ "description": "This will record demos of the players ( true \/ false )", "env_variable": "recorddemos", "default_value": "true", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/starbound/egg-starbound.json b/game_eggs/steamcmd_servers/starbound/egg-starbound.json index eb27a8a0..6a890b4d 100644 --- a/game_eggs/steamcmd_servers/starbound/egg-starbound.json +++ b/game_eggs/steamcmd_servers/starbound/egg-starbound.json @@ -8,7 +8,9 @@ "name": "Starbound", "author": "parker@parkervcp.com", "description": "Starbound takes place in a two-dimensional, procedurally generated universe which the player is able to explore in order to obtain new weapons, armor, and items, and to visit towns and villages inhabited by various intelligent lifeforms.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:ubuntu_source" ], diff --git a/game_eggs/steamcmd_servers/stationeers/egg-stationeers.json b/game_eggs/steamcmd_servers/stationeers/egg-stationeers.json index 3d498438..321ca2a6 100644 --- a/game_eggs/steamcmd_servers/stationeers/egg-stationeers.json +++ b/game_eggs/steamcmd_servers/stationeers/egg-stationeers.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-08-04T20:01:04-07:00", + "exported_at": "2022-01-20T13:00:48-05:00", "name": "Stationeers", "author": "sysadmin@whiteshield.ch", "description": "Stationeers Server\r\n\r\ndefault.ini will be created once you start game. Command parameters override default.ini parameters\r\nDon't forget to change the RCON Password !!\r\n\r\nRemote Administrator:\r\nYou can send commands on web browser.\r\nLink : http:\/\/[dedicated server address]:[GamePort]\r\n\r\nDedicated Server Wiki ==> https:\/\/stationeers-wiki.com\/Dedicated_Server_Guide\r\n\r\nStopping the server don't save the game, for manual save use the Remote Administrator.", - "image": "quay.io\/pterodactyl\/core:source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], "startup": ".\/rocketstation_DedicatedServer.x86_64 -batchmode -nographics -autostart -autosaveinterval={{SAVE_INTERVAL}} -clearallinterval={{CLEAR_INTERVAL}} -worldtype={{SERVER_MAP}} -worldname={{SAVE_NAME}} -loadworld={{SAVE_NAME}} -basedirectory=\/home\/container -updateport={{UPDATE_PORT}} -gameport={{GAME_PORT}}", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"Dedicated Server Started\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Dedicated Server Started\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { @@ -28,8 +35,8 @@ "description": "Available Maps: Moon, Mars, Europa, Vulcan, Space, Mimas, Loulan", "env_variable": "SERVER_MAP", "default_value": "Moon", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:20" }, { @@ -37,8 +44,8 @@ "description": "Sets the server\u2019s auto-save interval in seconds.", "env_variable": "SAVE_INTERVAL", "default_value": "300", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|integer" }, { @@ -46,8 +53,8 @@ "description": "Clear disconnected player interval in seconds", "env_variable": "CLEAR_INTERVAL", "default_value": "86400", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|integer" }, { @@ -55,8 +62,8 @@ "description": "Name of the save of your world.\r\nAuto save & auto load worlds on server startup.", "env_variable": "SAVE_NAME", "default_value": "stationeers_1", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:20" }, { @@ -64,8 +71,8 @@ "description": "UDP port for game. Avoid to set 27015-27020. It's steam's local server query ports.", "env_variable": "GAME_PORT", "default_value": "27500", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|integer" }, { @@ -73,8 +80,8 @@ "description": "UDP port for steam query must be between 27015-27020.", "env_variable": "UPDATE_PORT", "default_value": "27015", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|integer" }, { @@ -82,9 +89,9 @@ "description": "Required for automatic updates.", "env_variable": "SRCDS_APPID", "default_value": "600760", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/stormworks/egg-stormworks--build-and-rescue.json b/game_eggs/steamcmd_servers/stormworks/egg-stormworks--build-and-rescue.json index 8bba45e2..9cb54ceb 100644 --- a/game_eggs/steamcmd_servers/stormworks/egg-stormworks--build-and-rescue.json +++ b/game_eggs/steamcmd_servers/stormworks/egg-stormworks--build-and-rescue.json @@ -1,13 +1,20 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-10-27T03:09:48+00:00", + "exported_at": "2022-01-20T13:01:27-05:00", "name": "Stormworks: Build and Rescue", "author": "iamkubi@gmail.com", "description": "Join a world where you design, create and pilot your own air sea rescue service. Release your inner hero as you battle fierce storms out at sea to rescue those in need.", - "image": "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:debian_wine-5" + ], + "file_denylist": [], "startup": "xvfb-run wine server.exe +server_dir \/home\/container", "config": { "files": "{}", @@ -33,4 +40,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/subnautica_nitrox_mod/egg-subnautica.json b/game_eggs/steamcmd_servers/subnautica_nitrox_mod/egg-subnautica.json index 77c00477..446b9485 100644 --- a/game_eggs/steamcmd_servers/subnautica_nitrox_mod/egg-subnautica.json +++ b/game_eggs/steamcmd_servers/subnautica_nitrox_mod/egg-subnautica.json @@ -8,7 +8,9 @@ "name": "Subnautica", "author": "tueye@tuworld.de", "description": "Subnautica is an open world survival action-adventure video game developed and published by Unknown Worlds Entertainment. In it, players are free to explore the ocean on an alien planet, known as planet 4546B, after their spaceship, the Aurora, crashes on the planet's surface.\r\n\r\nNote: NitroxMod version >=1.5.0.0 is required", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/pterodactyl\/core:mono" ], @@ -146,4 +148,4 @@ "rules": "required|string|in:PROTOBUF,JSON" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/svencoop/egg-sven-co-op.json b/game_eggs/steamcmd_servers/svencoop/egg-sven-co-op.json index c341b5a7..07374e03 100644 --- a/game_eggs/steamcmd_servers/svencoop/egg-sven-co-op.json +++ b/game_eggs/steamcmd_servers/svencoop/egg-sven-co-op.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2019-11-14T21:43:14+01:00", + "exported_at": "2022-01-20T13:02:23-05:00", "name": "Sven Co-op", "author": "pteroducktyl@yildri.nl", "description": "Sven Co-op is a co-operative game originally based around Valve Software's Half-Life. In this game players must work together against computer controlled enemies and solve puzzles as a team.", - "image": "quay.io\/pterodactyl\/core:source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], "startup": ".\/svends_run -console -port {{SERVER_PORT}} +maxplayers {{SC_PLAYERS}} +map {{SC_MAP}} +ip 0.0.0.0 -strictportbind -norestart", "config": { "files": "{\r\n \"svencoop\/server.cfg\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"hostname\": \"hostname \\\"{{env.SC_NAME}}\\\"\",\r\n \"sv_password\": \"sv_password \\\"{{env.SC_PASSWORD}}\\\"\",\r\n \"\/\/sv_password\": \"sv_password \\\"{{env.SC_PASSWORD}}\\\"\",\r\n \"sv_region\": \"sv_region {{env.SC_REGION}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Connection to Steam servers successful.\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Connection to Steam servers successful.\"\r\n}", + "logs": "{}", "stop": "quit" }, "scripts": { @@ -28,8 +35,8 @@ "description": "The default map for the server.", "env_variable": "SC_MAP", "default_value": "svencoop1", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string" }, { @@ -37,8 +44,8 @@ "description": "The maximum amount of players that can play on the server at once.", "env_variable": "SC_PLAYERS", "default_value": "12", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric|between:2,32" }, { @@ -46,8 +53,8 @@ "description": "The name your server will appear as on the in Sven Co-op in-game server list.", "env_variable": "SC_NAME", "default_value": "Sven Co-op server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:40" }, { @@ -55,8 +62,8 @@ "description": "Password required to join the server. Leave blank to disable.", "env_variable": "SC_PASSWORD", "default_value": "", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "nullable|string|max:20" }, { @@ -64,8 +71,8 @@ "description": "The region your server is in. This is used in Steam's server browser, so players can look for servers near by. This does not restrict players from connecting to your server.\r\n\r\n-1: Do not list server in the server browser.\r\n0: USA east coast.\r\n1: USA west coast.\r\n2: South America (continent)\r\n3: Europe.\r\n4: Asia.\r\n5: Australia (continent, aka Oceania)\r\n6: Middle East.\r\n7: Africa.\r\n255: International.", "env_variable": "SC_REGION", "default_value": "255", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|numeric|between:-1,255" }, { @@ -73,9 +80,9 @@ "description": "Required for game to update on server restart. Do not modify this.", "env_variable": "SRCDS_APPID", "default_value": "276060", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string|max:20" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/team_fortress_2_classic/egg-team-fortress-2-classic.json b/game_eggs/steamcmd_servers/team_fortress_2_classic/egg-team-fortress-2-classic.json index 3679525f..73df31e8 100644 --- a/game_eggs/steamcmd_servers/team_fortress_2_classic/egg-team-fortress-2-classic.json +++ b/game_eggs/steamcmd_servers/team_fortress_2_classic/egg-team-fortress-2-classic.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-10-13T15:32:28+01:00", + "exported_at": "2022-01-20T13:03:12-05:00", "name": "Team Fortress 2 Classic", "author": "eggs@scattergun.io", "description": "Team Fortress 2 Classic is a free mod of the 2007 game Team Fortress 2, developed by Eminoma and utilizing the Source engine.", - "image": "quay.io\/parkervcp\/pterodactyl-images:debian_base", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:debian_base" + ], + "file_denylist": [], "startup": ".\/srcds_run -game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip {{SERVER_IP}} -strictportbind -norestart -debug +maxplayers {{MAXPLAYERS}}", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"gameserver Steam ID\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"gameserver Steam ID\"\r\n}", + "logs": "{}", "stop": "quit" }, "scripts": { diff --git a/game_eggs/steamcmd_servers/the_forest/egg-the-forest.json b/game_eggs/steamcmd_servers/the_forest/egg-the-forest.json index 1fff9c86..23b736c0 100644 --- a/game_eggs/steamcmd_servers/the_forest/egg-the-forest.json +++ b/game_eggs/steamcmd_servers/the_forest/egg-the-forest.json @@ -8,7 +8,9 @@ "name": "The Forest", "author": "admin@softwarenoob.com", "description": "As the lone survivor of a passenger jet crash, you find yourself in a mysterious forest battling to stay alive against a society of cannibalistic mutants. Build, explore, survive in this terrifying first-person survival horror simulator.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "ghcr.io\/parkervcp\/yolks:wine_latest" ], @@ -137,4 +139,4 @@ "rules": "required|boolean" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/tower_unite/egg-tower-unite.json b/game_eggs/steamcmd_servers/tower_unite/egg-tower-unite.json index 43f7687b..733cba6c 100644 --- a/game_eggs/steamcmd_servers/tower_unite/egg-tower-unite.json +++ b/game_eggs/steamcmd_servers/tower_unite/egg-tower-unite.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2019-02-08T01:46:57+01:00", + "exported_at": "2022-01-20T13:03:59-05:00", "name": "Tower Unite", "author": "teamwuffy@gmail.com", "description": "Tower Unite\r\n\r\nDefault Port: 7778\r\nDefault Query Port: 27016\r\n\r\nConfig Path: Tower\/Saved\/Config\/TowerServer.ini", - "image": "quay.io\/pterodactyl\/core:source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/pterodactyl\/core:source" + ], + "file_denylist": [], "startup": ".\/Tower\/Binaries\/Linux\/TowerServer-Linux-Shipping -log -Port={{SERVER_PORT}} -MULTIHOME=0.0.0.0 -TowerServerINI=..\/..\/Saved\/Config\/TowerServer.ini", "config": { "files": "{\r\n \"Tower\/Saved\/Config\/TowerServer.ini\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"MaxPlayers\": \"{{server.build.env.SERVER_MAX_PLAYER}}\",\r\n \"ServerTitle\": \"{{server.build.env.SERVER_TITLE}}\",\r\n \"SteamLoginToken\": \"{{server.build.env.STEAM_LOGIN_TOKEN}}\",\r\n \"AdminSteamID\": \"{{server.build.env.STEAM_ADMIN_ID}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Match State Changed from EnteringMap to WaitingToStart\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Match State Changed from EnteringMap to WaitingToStart\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { @@ -28,8 +35,8 @@ "description": "Login and generate a token for the app-id: 394690\r\nhttps:\/\/steamcommunity.com\/dev\/managegameservers", "env_variable": "STEAM_LOGIN_TOKEN", "default_value": "", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:100" }, { @@ -37,8 +44,8 @@ "description": "Note that your admin id is only a number!", "env_variable": "STEAM_ADMIN_ID", "default_value": "", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|integer|max:76561202255233023" }, { @@ -46,8 +53,8 @@ "description": "", "env_variable": "SERVER_TITLE", "default_value": "Tower Unite Server", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "required|string|max:512" }, { @@ -55,9 +62,9 @@ "description": "", "env_variable": "SERVER_MAX_PLAYER", "default_value": "40", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|integer|max:512" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/unturned/egg-unturned.json b/game_eggs/steamcmd_servers/unturned/egg-unturned.json index aa20570f..8f4ad1b2 100644 --- a/game_eggs/steamcmd_servers/unturned/egg-unturned.json +++ b/game_eggs/steamcmd_servers/unturned/egg-unturned.json @@ -1,18 +1,25 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1" + "version": "PTDL_v1", + "update_url": null }, - "exported_at": "2020-07-12T22:04:47-04:00", + "exported_at": "2022-01-20T13:04:52-05:00", "name": "Unturned", "author": "parker@parkervcp.com", "description": "Vanilla Unturned with the included RockerMod.", - "image": "quay.io\/parkervcp\/pterodactyl-images:debian_source", + "features": [ + "steam_disk_space" + ], + "images": [ + "quay.io\/parkervcp\/pterodactyl-images:debian_source" + ], + "file_denylist": [], "startup": ".\/Unturned_Headless.x86_64 -batchmode -nographics -bind 0.0.0.0 -port {{SERVER_PORT}}", "config": { "files": "{}", - "startup": "{\r\n \"done\": \"Loading level: 100%\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"latest.log\"\r\n}", + "startup": "{\r\n \"done\": \"Loading level: 100%\"\r\n}", + "logs": "{}", "stop": "shutdown" }, "scripts": { @@ -28,8 +35,8 @@ "description": "Steam App ID require for install and startup update", "env_variable": "SRCDS_APPID", "default_value": "1110390", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string|max:20" }, { @@ -37,8 +44,8 @@ "description": "This is needed to load specific libraries", "env_variable": "LD_LIBRARY_PATH", "default_value": ".\/Unturned_Headless_Data\/Plugins\/x86_64\/", - "user_viewable": 0, - "user_editable": 0, + "user_viewable": false, + "user_editable": false, "rules": "required|string" }, { @@ -46,8 +53,8 @@ "description": "Should be left blank for anon user", "env_variable": "STEAM_USER", "default_value": "", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "nullable|string" }, { @@ -55,8 +62,8 @@ "description": "", "env_variable": "STEAM_PASS", "default_value": "", - "user_viewable": 1, - "user_editable": 1, + "user_viewable": true, + "user_editable": true, "rules": "nullable|string" } ] diff --git a/game_eggs/steamcmd_servers/valheim/valheim_plus/egg-valheim-plus-mod.json b/game_eggs/steamcmd_servers/valheim/valheim_plus/egg-valheim-plus-mod.json index dd2290b5..cd0f888e 100644 --- a/game_eggs/steamcmd_servers/valheim/valheim_plus/egg-valheim-plus-mod.json +++ b/game_eggs/steamcmd_servers/valheim/valheim_plus/egg-valheim-plus-mod.json @@ -8,7 +8,9 @@ "name": "Valheim Plus Mod", "author": "info@goover.de", "description": "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_source" ], @@ -137,4 +139,4 @@ "rules": "required|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json index d6162120..e3754ee9 100644 --- a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json +++ b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json @@ -8,7 +8,9 @@ "name": "Valheim", "author": "magi1053@outlook.com", "description": "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture.", - "features": null, + "features": [ + "steam_disk_space" + ], "images": [ "quay.io\/parkervcp\/pterodactyl-images:debian_source" ], @@ -100,4 +102,4 @@ "rules": "required|string|max:20" } ] -} \ No newline at end of file +} From 28c587a918dea245713369f0a47980aace856052 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Sat, 22 Jan 2022 12:48:15 +0200 Subject: [PATCH 55/64] feat: use Yolks base image for multiarch support Changes to Yolks base image for multiarch support of AMD64 and ARM64. --- bots/discord/deno/egg-deno-generic.json | 4 ++-- bots/discord/lua/luvit/egg-luvit-generic.json | 4 ++-- .../factorio-modupdate/egg-factorio-modupdate.json | 11 ++++++----- .../bedrock/bedrock/egg-vanilla-bedrock.json | 6 +++--- game_eggs/rdr/redm/egg-red-m.json | 6 +++--- game_eggs/teeworlds/egg-teeworlds.json | 6 +++--- game_eggs/terraria/vanilla/egg-terraria-vanilla.json | 6 +++--- monitoring/prometheus/egg-prometheus.json | 4 ++-- software/grafana/egg-grafana.json | 4 ++-- 9 files changed, 26 insertions(+), 25 deletions(-) diff --git a/bots/discord/deno/egg-deno-generic.json b/bots/discord/deno/egg-deno-generic.json index 826be65d..be652454 100644 --- a/bots/discord/deno/egg-deno-generic.json +++ b/bots/discord/deno/egg-deno-generic.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-03-30T00:48:40+00:00", + "exported_at": "2022-01-22T05:40:17-05:00", "name": "Deno Generic", "author": "parker@parkervcp.com", "description": "A generic egg to run deno code.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/deno run {{JS_FILE}}", diff --git a/bots/discord/lua/luvit/egg-luvit-generic.json b/bots/discord/lua/luvit/egg-luvit-generic.json index 3a6fdd58..99a651dd 100644 --- a/bots/discord/lua/luvit/egg-luvit-generic.json +++ b/bots/discord/lua/luvit/egg-luvit-generic.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-03-30T02:11:23+00:00", + "exported_at": "2022-01-22T05:40:57-05:00", "name": "luvit generic", "author": "parker@parkervcp.com", "description": "A generic luvit egg This will clone a git repo for a bot. It defaults to master if no branch is specified.\r\n\r\nSupports the discordia lua framework.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/luvit {{LUA_FILE}}", diff --git a/game_eggs/factorio/factorio-modupdate/egg-factorio-modupdate.json b/game_eggs/factorio/factorio-modupdate/egg-factorio-modupdate.json index ea6f7d1a..12d63f3e 100644 --- a/game_eggs/factorio/factorio-modupdate/egg-factorio-modupdate.json +++ b/game_eggs/factorio/factorio-modupdate/egg-factorio-modupdate.json @@ -4,19 +4,20 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-01-15T16:32:57+01:00", + "exported_at": "2022-01-22T05:41:57-05:00", "name": "Factorio-ModUpdate", "author": "tueye@tuworld.de", "description": "The vanilla Factorio server. With automatic Mod Updates after ReInstall.\r\n\r\nhttps:\/\/www.factorio.com\/", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], + "file_denylist": [], "startup": ".\/bin\/x64\/factorio --port {{SERVER_PORT}} --server-settings data\/server-settings.json --start-server {{SAVE_NAME}}.zip", "config": { "files": "{\r\n \"data\/server-settings.json\": {\r\n \"parser\": \"json\",\r\n \"find\": {\r\n \"name\": \"{{server.build.env.SERVER_NAME}}\",\r\n \"description\": \"{{server.build.env.SERVER_DESC}}\",\r\n \"max_players\": \"{{server.build.env.MAX_SLOTS}}\",\r\n \"username\": \"{{server.build.env.SERVER_USERNAME}}\",\r\n \"token\": \"{{server.build.env.SERVER_TOKEN}}\",\r\n \"autosave_interval\": \"{{server.build.env.SAVE_INTERVAL}}\",\r\n \"autosave_slots\": \"{{server.build.env.SAVE_SLOTS}}\",\r\n \"afk_autokick_interval\": \"{{server.build.env.AFK_KICK}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Hosting game at\",\r\n \"userInteraction\": []\r\n}", - "logs": "{\r\n \"custom\": false,\r\n \"location\": \"factorio-current.log\"\r\n}", + "startup": "{\r\n \"done\": \"Hosting game at\"\r\n}", + "logs": "{}", "stop": "\/quit" }, "scripts": { @@ -118,4 +119,4 @@ "rules": "required|numeric|digits_between:1,3" } ] -} \ No newline at end of file +} diff --git a/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json b/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json index 31507ac9..b16a0f1e 100644 --- a/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json +++ b/game_eggs/minecraft/bedrock/bedrock/egg-vanilla-bedrock.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-04T00:38:57+03:00", + "exported_at": "2022-01-22T05:42:40-05:00", "name": "Vanilla Bedrock", "author": "parker@parkervcp.com", "description": "Bedrock Edition (also known as the Bedrock Version, Bedrock Codebase, Bedrock Engine or just Bedrock) refers to the multi-platform family of editions of Minecraft developed by Mojang AB, Microsoft Studios, 4J Studios, and SkyBox Labs. Prior to this term, as the engine originated with Pocket Edition, this entire product family was referred to as \"Pocket Edition\", \"MCPE\", or \"Pocket\/Windows 10 Edition\".", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/bedrock_server", @@ -83,4 +83,4 @@ "rules": "required|string|in:true,false" } ] -} \ No newline at end of file +} diff --git a/game_eggs/rdr/redm/egg-red-m.json b/game_eggs/rdr/redm/egg-red-m.json index 656ebe77..95a784b3 100644 --- a/game_eggs/rdr/redm/egg-red-m.json +++ b/game_eggs/rdr/redm/egg-red-m.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2022-01-11T10:01:29-05:00", + "exported_at": "2022-01-22T05:43:25-05:00", "name": "RedM", "author": "parker@parkervcp.com", "description": "A new RedM egg for the latest builds due to recent changes in RedM", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": "$(pwd)\/alpine\/opt\/cfx-server\/ld-musl-x86_64.so.1 --library-path \"$(pwd)\/alpine\/usr\/lib\/v8\/:$(pwd)\/alpine\/lib\/:$(pwd)\/alpine\/usr\/lib\/\" -- $(pwd)\/alpine\/opt\/cfx-server\/FXServer +set citizen_dir $(pwd)\/alpine\/opt\/cfx-server\/citizen\/ +set sv_licenseKey {{CFX_LICENSE}} +set steam_webApiKey {{STEAM_WEBAPIKEY}} +set sv_maxplayers {{MAX_PLAYERS}} +exec server.cfg +set gamename rdr3", @@ -83,4 +83,4 @@ "rules": "string|nullable" } ] -} \ No newline at end of file +} diff --git a/game_eggs/teeworlds/egg-teeworlds.json b/game_eggs/teeworlds/egg-teeworlds.json index d90bfae1..e7239504 100644 --- a/game_eggs/teeworlds/egg-teeworlds.json +++ b/game_eggs/teeworlds/egg-teeworlds.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-02T03:45:27+03:00", + "exported_at": "2022-01-22T05:44:04-05:00", "name": "Teeworlds", "author": "parker@parkervcp.com", "description": "Teeworlds is a free online multiplayer game, available for all major operating systems. Battle with up to 16 players in a variety of game modes, including Team Deathmatch and Capture The Flag. You can even design your own maps!", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/teeworlds_srv", @@ -47,4 +47,4 @@ "rules": "nullable|string" } ] -} \ No newline at end of file +} diff --git a/game_eggs/terraria/vanilla/egg-terraria-vanilla.json b/game_eggs/terraria/vanilla/egg-terraria-vanilla.json index ebeb0706..fd32d73a 100644 --- a/game_eggs/terraria/vanilla/egg-terraria-vanilla.json +++ b/game_eggs/terraria/vanilla/egg-terraria-vanilla.json @@ -4,19 +4,19 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-11-29T09:48:58+01:00", + "exported_at": "2022-01-22T05:44:42-05:00", "name": "Terraria Vanilla", "author": "iamkubi@gmail.com", "description": "Dig, fight, explore, build! Nothing is impossible in this action-packed adventure game.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/TerrariaServer.bin.x86_64 -config serverconfig.txt", "config": { "files": "{\r\n \"serverconfig.txt\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"worldpath\": \"\/home\/container\/saves\/Worlds\",\r\n \"worldname\": \"{{server.build.env.WORLD_NAME}}\",\r\n \"world\": \"\/home\/container\/saves\/Worlds\/{{server.build.env.WORLD_NAME}}.wld\",\r\n \"difficulty\": \"{{server.build.env.WORLD_DIFFICULTY}}\",\r\n \"autocreate\": \"{{server.build.env.WORLD_SIZE}}\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"maxplayers\": \"{{server.build.env.MAX_PLAYERS}}\",\r\n \"motd\": \"{{server.build.env.SERVER_MOTD}}\"\r\n }\r\n }\r\n}", - "startup": "{\"done\": \"Type 'help' for a list of commands\"}", + "startup": "{\r\n \"done\": \"Type 'help' for a list of commands\"\r\n}", "logs": "{}", "stop": "exit" }, diff --git a/monitoring/prometheus/egg-prometheus.json b/monitoring/prometheus/egg-prometheus.json index af98fd18..3376353b 100644 --- a/monitoring/prometheus/egg-prometheus.json +++ b/monitoring/prometheus/egg-prometheus.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-07T19:53:13+02:00", + "exported_at": "2022-01-22T05:45:16-05:00", "name": "Prometheus", "author": "p.zarrad@outlook.de", "description": "The Prometheus monitoring system and time series database.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/prometheus --web.listen-address=0.0.0.0:{{SERVER_PORT}} --config.file=\/home\/container\/prometheus.yml --storage.tsdb.path=\/home\/container\/data --web.console.templates=\/home\/container\/consoles --web.console.libraries=\/home\/container\/console_libraries --web.config.file=\/home\/container\/prometheus.web.yml", diff --git a/software/grafana/egg-grafana.json b/software/grafana/egg-grafana.json index 6b2312d4..d60ddf7f 100644 --- a/software/grafana/egg-grafana.json +++ b/software/grafana/egg-grafana.json @@ -4,13 +4,13 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-07-06T23:52:45+02:00", + "exported_at": "2022-01-22T05:46:01-05:00", "name": "Grafana", "author": "p.zarrad@outlook.de", "description": "The open and composable observability and data visualization platform.\r\nVisualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:base_debian" + "ghcr.io\/parkervcp\/yolks:debian" ], "file_denylist": [], "startup": ".\/bin\/grafana-server web", From 3835c3d3f64e4a0aded0cb1e9264b0d63285aaff Mon Sep 17 00:00:00 2001 From: Aestas <86505839+AestasLonewolf@users.noreply.github.com> Date: Mon, 24 Jan 2022 03:23:39 +0100 Subject: [PATCH 56/64] [curseforge-generic] Fix curl not accepting URLs with brackets (#1541) Co-authored-by: Aaron --- .../forge/curseforge-generic/egg-curseforge-generic.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json b/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json index 50a67d53..94b55207 100644 --- a/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json +++ b/game_eggs/minecraft/java/forge/curseforge-generic/egg-curseforge-generic.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-06-14T21:29:22+03:00", + "exported_at": "2022-01-24T02:52:47+01:00", "name": "Curseforge Generic", "author": "parker@parkervcp.com", "description": "A generic egg for a forge modpack", @@ -28,7 +28,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir -p \/mnt\/server\r\nfi\r\n\r\nfunction install_required {\r\n apt update\r\n apt install -y curl jq unzip dos2unix\r\n}\r\n\r\nfunction get_download {\r\n # get json data to work with\r\n echo -e \"Curling the json for the modpack\"\r\n echo -e \"running: curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\"\r\n JSON_DATA=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID})\r\n\r\n # if no modpack version is set or is set to latest\r\n if [ -z ${MODPACK_VERSION} ] || [ \"${MODPACK_VERSION}\" = \"latest\" ]; then\r\n echo -e \"Getting latest download url\"\r\n # parse data to get the download url\r\n FILE_ID=$(echo -e ${JSON_DATA} | jq -r .defaultFileId)\r\n echo -e \"File ID is: ${FILE_ID}\"\r\n if [ \"$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .isServerPack\")\" == \"false\" ] && [ \"$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .serverPackFileId\")\" != \"null\" ]; then\r\n FILE_ID=$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .serverPackFileId\")\r\n DOWNLOAD_URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/file\/${FILE_ID}\/download-url)\r\n else\r\n DOWNLOAD_URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/file\/${FILE_ID}\/download-url)\r\n fi\r\n echo -e \"Download url set to ${DOWNLOAD_URL}\"\r\n else\r\n echo -e \"Looking for download url for version ${MODPACK_VERSION}\"\r\n # parse files for version match\r\n FILES_JSON_DATA=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/files)\r\n # get element number to get the exact location in the json\r\n FILES_JSON_ELEMENT=$(echo -e ${FILES_JSON_DATA} | jq --arg VERSION \"${MODPACK_VERSION}\" '.[] | select(.displayName) | .displayName | contains($VERSION)' | grep -n true | cut -f1 -d: | tail -1)\r\n # if there wasn't a match default to latest\r\n if [ ! -z ${FILES_JSON_ELEMENT} ]; then\r\n echo -e \"No matching version found\"\r\n echo -e \"defaulting to latest\"\r\n DOWNLOAD_URL=$(echo -e ${FILES_JSON_DATA} | jq --arg ELEMENT \"${FILES_JSON_ELEMENT}\" '.[$ELEMENT|tonumber-1] | .downloadUrl')\r\n else\r\n echo -e \"Version match found\"\r\n DOWNLOAD_URL=$(echo -e ${JSON_DATA} | jq -r .latestFiles[0].downloadUrl)\r\n echo -e \"Download url set to ${DOWNLOAD_URL}\"\r\n fi\r\n fi\r\n ## download modpack files\r\n cd \/mnt\/server\r\n echo \"Executing curl -L ${DOWNLOAD_URL} -o server.zip\"\r\n curl -L \"${DOWNLOAD_URL}\" -o server.zip\r\n unzip -o server.zip\r\n rm -rf server.zip\r\n}\r\n\r\nfunction forge_install {\r\n echo -e \"\\nInstalling forge server using the installer jar file.\\n\"\r\n if [ -f \/mnt\/server\/*installer.jar ]; then\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n else\r\n echo \"No forge installer found moving on.\"\r\n fi\r\n mv FTBServer.jar server.jar\r\n}\r\n\r\nfunction forge_cleanup {\r\n echo -e \"\\nDeleting installer jar file and cleaning up.\\n\"\r\n rm -rf *installer.jar\r\n if [ ! -f \/mnt\/server\/*universal.jar ]; then\r\n mv -v \/mnt\/server\/*\/* \/mnt\/server\/\r\n if [ ! -f \/mnt\/server\/*universal.jar ]; then\r\n mv forge*.jar server.jar\r\n else\r\n mv *universal.jar server.jar \r\n fi\r\n else\r\n mv *universal.jar server.jar\r\n fi\r\n}\r\n\r\nfunction json_download_prework {\r\n mkdir -p \/mnt\/server\/mods\r\n cd \/mnt\/server\/mods\r\n}\r\n\r\nfunction json_download_mods {\r\n MANIFEST=\/mnt\/server\/manifest.json\r\n for mod in $(jq -c '.files[]' ${MANIFEST} ); do\r\n projID=$(echo $mod | jq -r \".projectID\")\r\n fileID=$(echo $mod | jq -r \".fileID\")\r\n URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${projID}\/file\/${fileID}\/download-url)\r\n # this is saving everything as \/mnt\/server\/mods\/download\r\n echo \"Mod direct url: ${URL}\"\r\n curl -JLO \"${URL}\"\r\n done\r\n}\r\n\r\nfunction json_download_forge {\r\n cd \/mnt\/server\r\n FORGE=$(jq -r '.minecraft.modLoaders[0].id' \/mnt\/server\/manifest.json | cut -d '-' -f2)\r\n MCVER=$(jq -r '.minecraft.version' \/mnt\/server\/manifest.json)\r\n\tif [ ${MCVER} == \"1.7.10\" ] || [ ${MCVER} == \"1.8.9\" ]; then\r\n\t\tFORGE=\"${FORGE}-${MCVER}\"\r\n\tfi\r\n FORGE_VERSION=\"${MCVER}-${FORGE}\"\r\n FORGE_DOWNLOAD=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\r\n \r\n echo -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\n echo -e \"Download link is $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION\"\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o universal.jar\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n mv *universal.jar server.jar\r\n rm installer.jar\r\n}\r\n\r\nfunction json_download_overrides {\r\n if [ -d \/mnt\/server\/overrides ]; then\r\n mv \/mnt\/server\/overrides\/mods\/* \/mnt\/server\/mods\/\r\n rmdir \/mnt\/server\/overrides\/mods\r\n mv \/mnt\/server\/overrides\/* \/mnt\/server\r\n rmdir \/mnt\/server\/overrides\r\n fi\r\n}\r\n\r\nfunction cfg_download_forge {\r\n dos2unix settings.cfg # In case the pack was distributed with Windows-style line endings in the cfg file\r\n MCVER=`grep 'MCVER' settings.cfg | sed 's\/;\/\/g' | cut -d '=' -f 2-`\r\n FORGE=`grep 'FORGEVER' settings.cfg | sed 's\/;\/\/g' | cut -d '=' -f 2-`\r\n\r\n\tif [ ${MCVER} == \"1.7.10\" ] || [ ${MCVER} == \"1.8.9\" ]; then\r\n\t\tFORGE=\"${FORGE}-${MCVER}\"\r\n\tfi\r\n \r\n FORGE_VERSION=\"${MCVER}-${FORGE}\"\r\n echo -e ${FORGE_VERSION}\r\n FORGE_DOWNLOAD=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\r\n \r\n echo -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\n echo -e \"Download link is $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION\"\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o universal.jar\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n mv *universal.jar server.jar\r\n rm installer.jar\r\n}\r\n\r\nfunction ftb_install {\r\n chmod +x \/mnt\/server\/settings.sh \r\n . \/mnt\/server\/settings.sh \r\n curl https:\/\/s3.amazonaws.com\/Minecraft.Download\/versions\/${MCVER}\/minecraft_server.${MCVER}.jar -o ${JARFILE} \r\n curl https:\/\/libraries.minecraft.net\/${LAUNCHWRAPPER} -o \/mnt\/server\/libraries\/${LAUNCHWRAPPER}\r\n}\r\n\r\ninstall_required\r\nget_download\r\n\r\nif [ -f \/mnt\/server\/manifest.json ]; then\r\n json_download_prework\r\n json_download_mods\r\n json_download_overrides\r\n json_download_forge\r\nelif [ -f \/mnt\/server\/settings.cfg ]; then\r\n cfg_download_forge\r\nelif [ -f \/mnt\/server\/version.json ]; then\r\n if [ \"$(cat \/mnt\/server\/version.json | jq -r '.packID | contains(\"FTB\")')\" == \"true\" ]; then\r\n ftb_install\r\n fi\r\nelse\r\n forge_install\r\n forge_cleanup\r\nfi\r\necho -e \"\\n\\nInstall completed succesfully, enjoy!\"", + "script": "#!\/bin\/bash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir -p \/mnt\/server\r\nfi\r\n\r\nfunction install_required {\r\n apt update\r\n apt install -y curl jq unzip dos2unix\r\n}\r\n\r\nfunction get_download {\r\n # get json data to work with\r\n echo -e \"Curling the json for the modpack\"\r\n echo -e \"running: curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\"\r\n JSON_DATA=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID})\r\n\r\n # if no modpack version is set or is set to latest\r\n if [ -z ${MODPACK_VERSION} ] || [ \"${MODPACK_VERSION}\" = \"latest\" ]; then\r\n echo -e \"Getting latest download url\"\r\n # parse data to get the download url\r\n FILE_ID=$(echo -e ${JSON_DATA} | jq -r .defaultFileId)\r\n echo -e \"File ID is: ${FILE_ID}\"\r\n if [ \"$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .isServerPack\")\" == \"false\" ] && [ \"$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .serverPackFileId\")\" != \"null\" ]; then\r\n FILE_ID=$(echo -e ${JSON_DATA} | jq -r --arg FILE_ID \"$FILE_ID\" \".latestFiles[] | select(.id==$FILE_ID) | .serverPackFileId\")\r\n DOWNLOAD_URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/file\/${FILE_ID}\/download-url)\r\n else\r\n DOWNLOAD_URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/file\/${FILE_ID}\/download-url)\r\n fi\r\n echo -e \"Download url set to ${DOWNLOAD_URL}\"\r\n else\r\n echo -e \"Looking for download url for version ${MODPACK_VERSION}\"\r\n # parse files for version match\r\n FILES_JSON_DATA=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${MODPACK_ID}\/files)\r\n # get element number to get the exact location in the json\r\n FILES_JSON_ELEMENT=$(echo -e ${FILES_JSON_DATA} | jq --arg VERSION \"${MODPACK_VERSION}\" '.[] | select(.displayName) | .displayName | contains($VERSION)' | grep -n true | cut -f1 -d: | tail -1)\r\n # if there wasn't a match default to latest\r\n if [ ! -z ${FILES_JSON_ELEMENT} ]; then\r\n echo -e \"No matching version found\"\r\n echo -e \"defaulting to latest\"\r\n DOWNLOAD_URL=$(echo -e ${FILES_JSON_DATA} | jq --arg ELEMENT \"${FILES_JSON_ELEMENT}\" '.[$ELEMENT|tonumber-1] | .downloadUrl')\r\n else\r\n echo -e \"Version match found\"\r\n DOWNLOAD_URL=$(echo -e ${JSON_DATA} | jq -r .latestFiles[0].downloadUrl)\r\n echo -e \"Download url set to ${DOWNLOAD_URL}\"\r\n fi\r\n fi\r\n ## download modpack files\r\n cd \/mnt\/server\r\n echo \"Executing curl -L ${DOWNLOAD_URL} -o server.zip\"\r\n curl -L -g \"${DOWNLOAD_URL}\" -o server.zip\r\n unzip -o server.zip\r\n rm -rf server.zip\r\n}\r\n\r\nfunction forge_install {\r\n echo -e \"\\nInstalling forge server using the installer jar file.\\n\"\r\n if [ -f \/mnt\/server\/*installer.jar ]; then\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n else\r\n echo \"No forge installer found moving on.\"\r\n fi\r\n mv FTBServer.jar server.jar\r\n}\r\n\r\nfunction forge_cleanup {\r\n echo -e \"\\nDeleting installer jar file and cleaning up.\\n\"\r\n rm -rf *installer.jar\r\n if [ ! -f \/mnt\/server\/*universal.jar ]; then\r\n mv -v \/mnt\/server\/*\/* \/mnt\/server\/\r\n if [ ! -f \/mnt\/server\/*universal.jar ]; then\r\n mv forge*.jar server.jar\r\n else\r\n mv *universal.jar server.jar \r\n fi\r\n else\r\n mv *universal.jar server.jar\r\n fi\r\n}\r\n\r\nfunction json_download_prework {\r\n mkdir -p \/mnt\/server\/mods\r\n cd \/mnt\/server\/mods\r\n}\r\n\r\nfunction json_download_mods {\r\n MANIFEST=\/mnt\/server\/manifest.json\r\n for mod in $(jq -c '.files[]' ${MANIFEST} ); do\r\n projID=$(echo $mod | jq -r \".projectID\")\r\n fileID=$(echo $mod | jq -r \".fileID\")\r\n URL=$(curl -sSL https:\/\/addons-ecs.forgesvc.net\/api\/v2\/addon\/${projID}\/file\/${fileID}\/download-url)\r\n # this is saving everything as \/mnt\/server\/mods\/download\r\n echo \"Mod direct url: ${URL}\"\r\n curl -JLO \"${URL}\"\r\n done\r\n}\r\n\r\nfunction json_download_forge {\r\n cd \/mnt\/server\r\n FORGE=$(jq -r '.minecraft.modLoaders[0].id' \/mnt\/server\/manifest.json | cut -d '-' -f2)\r\n MCVER=$(jq -r '.minecraft.version' \/mnt\/server\/manifest.json)\r\n\tif [ ${MCVER} == \"1.7.10\" ] || [ ${MCVER} == \"1.8.9\" ]; then\r\n\t\tFORGE=\"${FORGE}-${MCVER}\"\r\n\tfi\r\n FORGE_VERSION=\"${MCVER}-${FORGE}\"\r\n FORGE_DOWNLOAD=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\r\n \r\n echo -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\n echo -e \"Download link is $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION\"\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o universal.jar\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n mv *universal.jar server.jar\r\n rm installer.jar\r\n}\r\n\r\nfunction json_download_overrides {\r\n if [ -d \/mnt\/server\/overrides ]; then\r\n mv \/mnt\/server\/overrides\/mods\/* \/mnt\/server\/mods\/\r\n rmdir \/mnt\/server\/overrides\/mods\r\n mv \/mnt\/server\/overrides\/* \/mnt\/server\r\n rmdir \/mnt\/server\/overrides\r\n fi\r\n}\r\n\r\nfunction cfg_download_forge {\r\n dos2unix settings.cfg # In case the pack was distributed with Windows-style line endings in the cfg file\r\n MCVER=`grep 'MCVER' settings.cfg | sed 's\/;\/\/g' | cut -d '=' -f 2-`\r\n FORGE=`grep 'FORGEVER' settings.cfg | sed 's\/;\/\/g' | cut -d '=' -f 2-`\r\n\r\n\tif [ ${MCVER} == \"1.7.10\" ] || [ ${MCVER} == \"1.8.9\" ]; then\r\n\t\tFORGE=\"${FORGE}-${MCVER}\"\r\n\tfi\r\n \r\n FORGE_VERSION=\"${MCVER}-${FORGE}\"\r\n echo -e ${FORGE_VERSION}\r\n FORGE_DOWNLOAD=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\r\n \r\n echo -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\n echo -e \"Download link is $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION\"\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\n curl -sS $FORGE_DOWNLOAD\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o universal.jar\r\n java -jar installer.jar --installServer || { echo -e \"install failed\"; exit 4; }\r\n mv *universal.jar server.jar\r\n rm installer.jar\r\n}\r\n\r\nfunction ftb_install {\r\n chmod +x \/mnt\/server\/settings.sh \r\n . \/mnt\/server\/settings.sh \r\n curl https:\/\/s3.amazonaws.com\/Minecraft.Download\/versions\/${MCVER}\/minecraft_server.${MCVER}.jar -o ${JARFILE} \r\n curl https:\/\/libraries.minecraft.net\/${LAUNCHWRAPPER} -o \/mnt\/server\/libraries\/${LAUNCHWRAPPER}\r\n}\r\n\r\ninstall_required\r\nget_download\r\n\r\nif [ -f \/mnt\/server\/manifest.json ]; then\r\n json_download_prework\r\n json_download_mods\r\n json_download_overrides\r\n json_download_forge\r\nelif [ -f \/mnt\/server\/settings.cfg ]; then\r\n cfg_download_forge\r\nelif [ -f \/mnt\/server\/version.json ]; then\r\n if [ \"$(cat \/mnt\/server\/version.json | jq -r '.packID | contains(\"FTB\")')\" == \"true\" ]; then\r\n ftb_install\r\n fi\r\nelse\r\n forge_install\r\n forge_cleanup\r\nfi\r\necho -e \"\\n\\nInstall completed succesfully, enjoy!\"", "container": "openjdk:8-jdk-slim", "entrypoint": "bash" } @@ -53,4 +53,4 @@ "rules": "required|string|max:20" } ] -} +} \ No newline at end of file From f0e1eaa6a31d06cb8064a310135c1d4f12383eee Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Mon, 24 Jan 2022 13:38:22 -0800 Subject: [PATCH 57/64] Update processor support in README Updated minimum processor requirement to mention that multiarch is now supported on the updated image. --- game_eggs/tycoon_games/openrct2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game_eggs/tycoon_games/openrct2/README.md b/game_eggs/tycoon_games/openrct2/README.md index 2a270b4b..b0dbaf98 100644 --- a/game_eggs/tycoon_games/openrct2/README.md +++ b/game_eggs/tycoon_games/openrct2/README.md @@ -50,7 +50,7 @@ ___ | | Minimum | |---------|---------| -| Processor | Recent x86/64 (AMD/Intel) processor. No ARM support. | +| Processor | Multiarch is supported for most modern processors | | RAM | 256-512 MiB (depends on # of clients & park size) | | Storage | 80 MB (*may require more if building from source*) | | RCT2 Files | **Not required** | From 7e95ab25ab56fce1d9fa2e212137d03af74b9f88 Mon Sep 17 00:00:00 2001 From: Crispy <34707863+JackCrispy@users.noreply.github.com> Date: Thu, 3 Feb 2022 21:40:10 +1100 Subject: [PATCH 58/64] Ts3: Fix a typo (#1546) scalabilty -> scalability --- stock_eggs/voice-servers/egg-teamspeak3-server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_eggs/voice-servers/egg-teamspeak3-server.json b/stock_eggs/voice-servers/egg-teamspeak3-server.json index cb88e0e3..6dfb4184 100644 --- a/stock_eggs/voice-servers/egg-teamspeak3-server.json +++ b/stock_eggs/voice-servers/egg-teamspeak3-server.json @@ -7,7 +7,7 @@ "exported_at": "2021-04-27T20:49:27+01:00", "name": "Teamspeak3 Server", "author": "support@pterodactyl.io", - "description": "VoIP software designed with security in mind, featuring crystal clear voice quality, endless customization options, and scalabilty up to thousands of simultaneous users.", + "description": "VoIP software designed with security in mind, featuring crystal clear voice quality, endless customization options, and scalability up to thousands of simultaneous users.", "features": null, "images": [ "quay.io\/parkervcp\/pterodactyl-images:base_debian" From 0389eacd43c2d32013edb0587f6a00e3d6098cb3 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Sun, 6 Feb 2022 18:25:17 +0100 Subject: [PATCH 59/64] update install image to ghcr --- software/code-server/egg-code--server.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/software/code-server/egg-code--server.json b/software/code-server/egg-code--server.json index 2dca08e9..8820b7eb 100644 --- a/software/code-server/egg-code--server.json +++ b/software/code-server/egg-code--server.json @@ -26,7 +26,7 @@ "scripts": { "installation": { "script": "apt update\r\napt install -y curl jq\r\nMATCH=linux-amd64\r\n\r\n# Create initial directories\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\n# Create needed directories\r\nmkdir -p \/mnt\/server\/.local\/lib \/mnt\/server\/.local\/bin \/mnt\/server\/.config\/code-server \/mnt\/server\/projects\r\n\r\n# Change permission of projects directory so it can be accessed by code-server\r\nchmod 777 \/mnt\/server\/projects\r\ntouch \"\/mnt\/server\/projects\/PLACE YOUR PROJECTS HERE\"\r\n\r\n# Check for available versions. Defaults to latest if no valid version is found.\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/coder\/code-server\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/coder\/code-server\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"v${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION \"v${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\n# Download the given Version and extract it\r\necho \"Downloading $DOWNLOAD_URL\"\r\ncurl -fL $DOWNLOAD_URL | tar -C \/mnt\/server\/.local\/lib -xz\r\nmv \/mnt\/server\/.local\/lib\/code-server-*linux-amd64 \/mnt\/server\/.local\/lib\/code-server-${VERSION}\r\n\r\n\r\nPATH=\"\/mnt\/server\/.local\/bin:$PATH\"\r\necho \"password: changeme\r\nbind-addr: 0.0.0.0\r\nauth: password\r\ncert: false\" > \/mnt\/server\/.config\/code-server\/config.yaml\r\n\r\necho \"Install complete\"", - "container": "debian:buster-slim", + "container": "ghcr.io/parkervcp/installers:debian", "entrypoint": "bash" } }, @@ -50,4 +50,4 @@ "rules": "string|max:20" } ] -} \ No newline at end of file +} From 09234ee19672565ce4d816621d1c3cc74483176f Mon Sep 17 00:00:00 2001 From: gOOvER Date: Fri, 18 Feb 2022 11:34:27 +0100 Subject: [PATCH 60/64] update/valheim - add betabranch --- .../valheim/valheim_vanilla/egg-valheim.json | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json index e3754ee9..6bd507aa 100644 --- a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json +++ b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json @@ -4,7 +4,7 @@ "version": "PTDL_v1", "update_url": null }, - "exported_at": "2021-02-17T16:43:58+01:00", + "exported_at": "2022-02-18T11:17:53+01:00", "name": "Valheim", "author": "magi1053@outlook.com", "description": "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture.", @@ -12,8 +12,9 @@ "steam_disk_space" ], "images": [ - "quay.io\/parkervcp\/pterodactyl-images:debian_source" + "ghcr.io\/parkervcp\/games:source" ], + "file_denylist": [], "startup": ".\/valheim_server.x86_64 -nographics -batchmode -name \"{{SERVER_NAME}}\" -port {{SERVER_PORT}} -world \"{{WORLD}}\" -password \"{{PASSWORD}}\" > >(sed -uE \"{{FILTER}}\") & trap \"{{STOP}}\" 15; wait $!", "config": { "files": "{}", @@ -23,8 +24,8 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n# Valheim Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\napt -y update\r\napt -y --no-install-recommends --no-install-suggests install curl lib32gcc1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "debian:buster-slim", + "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'ghcr.io\/parkervcp\/installers:debian'\r\n\r\n##\r\n#\r\n# Variables\r\n# STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n# WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n# SRCDS_APPID - steam app id found here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Servers_List\r\n# SRCDS_BETAID - beta branch of a steam app. Leave blank to install normal branch\r\n# SRCDS_BETAPASS - password for a beta branch should one be required during private or closed testing phases.. Leave blank for no password.\r\n# INSTALL_FLAGS - Any additional SteamCMD flags to pass during install.. Keep in mind that steamcmd auto update process in the docker image might overwrite or ignore these when it performs update on server boot.\r\n# AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n#\r\n ##\r\n\r\n# Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n\r\n## just in case someone removed the defaults.\r\nif [[ \"${STEAM_USER}\" == \"\" ]] || [[ \"${STEAM_PASS}\" == \"\" ]]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s \"-beta ${SRCDS_BETAID}\" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s \"-betapassword ${SRCDS_BETAPASS}\" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", + "container": "ghcr.io\/parkervcp\/installers:debian", "entrypoint": "bash" } }, @@ -99,7 +100,25 @@ "default_value": "1", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:20" + "rules": "boolean" + }, + { + "name": "Beta Branch", + "description": "", + "env_variable": "SRCDS_BETAID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "max:30" + }, + { + "name": "Betapassword", + "description": "", + "env_variable": "SRCDS_BETAPASS", + "default_value": "", + "user_viewable": false, + "user_editable": false, + "rules": "max:30" } ] -} +} \ No newline at end of file From 27fa7b41159284c981fe6a31162cb091ae734aba Mon Sep 17 00:00:00 2001 From: gOOvER Date: Fri, 18 Feb 2022 11:40:15 +0100 Subject: [PATCH 61/64] small fix --- .../steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json index 6bd507aa..32bbf258 100644 --- a/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json +++ b/game_eggs/steamcmd_servers/valheim/valheim_vanilla/egg-valheim.json @@ -116,8 +116,8 @@ "description": "", "env_variable": "SRCDS_BETAPASS", "default_value": "", - "user_viewable": false, - "user_editable": false, + "user_viewable": true, + "user_editable": true, "rules": "max:30" } ] From ffdba65340b4a9aa367110fae69146db6363f8b6 Mon Sep 17 00:00:00 2001 From: SebiAi Date: Fri, 18 Feb 2022 15:18:34 +0100 Subject: [PATCH 62/64] Changed docker image to use java 16 --- bots/discord/jmusicbot/egg-j-music-bot.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bots/discord/jmusicbot/egg-j-music-bot.json b/bots/discord/jmusicbot/egg-j-music-bot.json index 84d3ee81..96da03ca 100644 --- a/bots/discord/jmusicbot/egg-j-music-bot.json +++ b/bots/discord/jmusicbot/egg-j-music-bot.json @@ -9,7 +9,7 @@ "description": "A Discord music bot that's easy to set up and run yourself!", "features": null, "images": [ - "ghcr.io\/parkervcp\/yolks:java_8" + "ghcr.io\/pterodactyl\/yolks:java_16" ], "file_denylist": [], "startup": "java -Dnogui=true -jar JMusicBot.jar", From 4b9827e8b6376325fbe44e374db57edb3e9bb16d Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Sat, 19 Feb 2022 13:18:52 +0100 Subject: [PATCH 63/64] update/veloren - removed -b flag, because it's not part of startup --- game_eggs/veloren/egg-veloren.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game_eggs/veloren/egg-veloren.json b/game_eggs/veloren/egg-veloren.json index 689fb7be..d4bda0d7 100644 --- a/game_eggs/veloren/egg-veloren.json +++ b/game_eggs/veloren/egg-veloren.json @@ -13,7 +13,7 @@ "quay.io\/parkervcp\/pterodactyl-images:base_debian" ], "file_denylist": [], - "startup": ".\/veloren-server-cli -b", + "startup": ".\/veloren-server-cli", "config": { "files": "{\r\n \"userdata\/server\/server_config\/settings.ron\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \" gameserver_address\": \" gameserver_address: \\\"0.0.0.0:{{server.build.default.port}}\\\",\",\r\n\t \" server_name\": \" server_name: \\\"{{server.build.env.SERVER_NAME}}\\\",\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Server is ready to accept connections\"\r\n}", @@ -28,4 +28,4 @@ } }, "variables": [] -} \ No newline at end of file +} From d907c6aab312d9f0cbed97ba46eaabe3dd37911f Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Sat, 19 Feb 2022 13:57:35 +0100 Subject: [PATCH 64/64] update/haste-server - switch to ghcr --- software/haste-server/egg-haste-server.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/software/haste-server/egg-haste-server.json b/software/haste-server/egg-haste-server.json index bcccbe80..bc805f14 100644 --- a/software/haste-server/egg-haste-server.json +++ b/software/haste-server/egg-haste-server.json @@ -10,7 +10,7 @@ "description": "Haste is an open-source pastebin software written in node.js, which is easily installable in any network. It can be backed by either redis or filesystem, and has a very easy adapter interface for other stores. A publicly available version can be found at hastebin.com", "features": null, "images": [ - "quay.io\/parkervcp\/pterodactyl-images:debian_nodejs-12" + "ghcr.io/parkervcp/yolks:nodejs_12" ], "startup": "npm start", "config": { @@ -22,7 +22,7 @@ "scripts": { "installation": { "script": "#!\/bin\/bash\r\n\r\napt update\r\napt install -y git curl\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\ngit clone https:\/\/github.com\/toptal\/haste-server\r\ncd haste-server\r\nmv * \/mnt\/server\r\ncd ..\r\nrm -rf haste-server\r\nnpm install\r\n\r\nexit 0", - "container": "node:12-buster-slim", + "container": "node:12-bullseye-slim", "entrypoint": "bash" } },