{
  "_comment": "Adapted from pelican-eggs/games-standalone Pterodactyl TShock Egg. Fixed v6.2.1, public .NET 9 Yolk, Olares UID/GID 1000. No diagnostic plugin.",
  "meta": {
    "version": "PTDL_v2",
    "update_url": null
  },
  "exported_at": "2026-05-22T10:36:06+00:00",
  "name": "TShock 6.2.1 (Olares)",
  "author": "parker@parkervcp.com",
  "description": "Terraria 1.4.5.8 with TShock 6.2.1. Public .NET 9 runtime. World, configuration and plugins remain in the server volume.",
  "features": [],
  "docker_images": {
    "Dotnet 9": "beclab/parkervcp-yolks:sha256-cb0eb2542645dd54bd1c965cc0b7e71249b9f125f9812b21e1191abe7bf8e099"
  },
  "file_denylist": [],
  "startup": "export DOTNET_BUNDLE_EXTRACT_BASE_DIR=/home/container/.net; mkdir -p .net worlds tshock plugins; ./TShock.Server -ip 0.0.0.0 -port {{SERVER_PORT}} -maxplayers {{MAX_PLAYERS}} -world worlds/{{WORLD_NAME}}.wld -worldname {{WORLD_NAME}} -autocreate {{WORLD_SIZE}} -configpath /home/container/tshock -logpath /home/container/tshock/logs -crashdir /home/container/tshock/crashes -additionalplugins /home/container/plugins -noupnp",
  "config": {
    "files": "{}",
    "startup": "{\"done\":\"Server started\"}",
    "logs": "{}",
    "stop": "exit"
  },
  "scripts": {
    "installation": {
      "script": "#!/bin/bash\nset -euo pipefail\n# Fixed amd64 reproduction profile. Fail instead of falling back to latest.\ntest \"$TSHOCK_VERSION\" = \"v6.2.1\" || { echo \"This Egg requires v6.2.1\"; exit 1; }\ntest \"$(uname -m)\" = \"x86_64\" || { echo \"This verified profile targets amd64\"; exit 1; }\nmkdir -p /mnt/server\ncd /mnt/server\n# Preserve an existing installation: do not overwrite a world/configuration on reinstall.\ntest ! -e TShock.Server || { echo \"Existing installation: back up and upgrade explicitly\"; exit 1; }\nstage=$(mktemp -d /mnt/server/.tshock-install-XXXXXX)\ntrap 'rm -rf \"$stage\"' EXIT\ncurl --fail --location --retry 3 https://github.com/Pryaxis/TShock/releases/download/v6.2.1/TShock-6.2.1-for-Terraria-1.4.5.8-linux-x64-Release.zip -o \"$stage/TShock.zip\"\necho \"deb9189acbdbd2ee0f0a06fffe15358033859a4ba842b22f79a84bda68600105  $stage/TShock.zip\" | sha256sum -c -\nunzip -q \"$stage/TShock.zip\" -d \"$stage\"\ntar --no-same-owner -xf \"$stage/TShock-Beta-linux-x64-Release.tar\" -C /mnt/server\nchmod +x TShock.Server\nmkdir -p worlds tshock plugins .net\ntest -e tshock/config.json || printf '%s\\n' '{\"ServerPort\":30000,\"MaxSlots\":2,\"ReservedSlots\":0,\"RestApiEnabled\":false,\"BackupInterval\":0,\"AutoSave\":true}' > tshock/config.json\n# Installer-only ownership of newly unpacked files, never a runtime chown.\nfind /mnt/server -xdev -user root -exec chown 1000:1000 {} +\ntest -x TShock.Server\necho \"TShock 6.2.1 installation complete\"\n",
      "container": "beclab/parkervcp-installers:sha256-a4fbf7119883a179a47b5e5fa1a60e7e0925f9b2ccbaf0548cfb261705304056",
      "entrypoint": "/bin/bash"
    }
  },
  "variables": [
    {
      "name": "Max Players",
      "description": "The maximum number of players a server will hold.",
      "env_variable": "MAX_PLAYERS",
      "default_value": "2",
      "user_viewable": true,
      "user_editable": false,
      "rules": "required|numeric|digits_between:1,3",
      "field_type": "text"
    },
    {
      "name": "World Name",
      "description": "The name for the world file.",
      "env_variable": "WORLD_NAME",
      "default_value": "OlaresFriends",
      "user_viewable": true,
      "user_editable": true,
      "rules": "required|regex:/^[A-Za-z0-9_-]{1,20}$/",
      "field_type": "text"
    },
    {
      "name": "World Size",
      "description": "Defines the worlds size. 3 sizes 1 (small), 2 (medium), 3 (large).",
      "env_variable": "WORLD_SIZE",
      "default_value": "1",
      "user_viewable": true,
      "user_editable": false,
      "rules": "required|in:1,2,3",
      "field_type": "text"
    },
    {
      "name": "Tshock Version",
      "description": "Fixed TShock release; no fallback to latest.",
      "env_variable": "TSHOCK_VERSION",
      "default_value": "v6.2.1",
      "user_viewable": true,
      "user_editable": false,
      "rules": "required|in:v6.2.1",
      "field_type": "text"
    }
  ]
}
