# Project Zomboid — panel-native dedicated server module.
#
# Native Linux binary from SteamCMD app 380870. Java-heavy; the shipped
# start-server.sh wraps java with correct -cp and Dpzexe.* system props.
# Has Source-compatible RCON on port 27015 when enabled in server.ini.
#
# Reference: https://github.com/CubeCoders/AMPTemplates (ProjectZomboid.kvp)

id: project-zomboid
name: "Project Zomboid"
version: 0.1.0
authors:
  - panel contributors

supported_modes:
  - docker

runtime:
  docker:
    image: panel-project-zomboid:latest
    # Host networking -- container shares the host net namespace, so
    # any port the game/mod binds is directly on the LAN. AMP-like
    # model. Multi-instance safety comes from env-driven per-instance
    # ports (panel allocator + env: mapping on each ports entry).
    network_mode: host
    browseable_root: /game-saves
    browseable_roots:
      - name: "Saves & Configs"
        path: /game-saves
        hint: "Server configs + world saves under ~/Zomboid"
      - name: "Game Files"
        path: /game
        hint: "PZ install, binaries"
    env:
      SERVER_NAME: "panel"                   # used as name of server folder under ~/Zomboid/Server
      ADMIN_PASSWORD: "changeme"
      RCON_PASSWORD: "panel_rcon"
      MEMORY: "4096m"                        # JVM heap
      # Pre-declared so the agent's resolve.go filter lets panel-allocated
      # ports flow through to the container env. The entrypoint passes
      # -port/-udpport launch args AND enforces the matching ini keys;
      # without these the server binds the hardcoded 16261/16262/27015 and
      # ignores the panel allocation (breaks multi-instance + opnfwd).
      GAME_PORT: "16261"
      GAME_PORT_B: "16262"
      RCON_PORT: "27015"
    volumes:
      - { type: volume, name: "panel-$INSTANCE_ID-saves", container: "/game-saves" }
      - { type: volume, name: "panel-$INSTANCE_ID-game",  container: "/game" }
      - { target: "$DATA_PATH/logs", container: "/game-saves/logs" }

ports:
  - { name: game,  proto: udp, default: 16261, required: true, env: GAME_PORT }
  - { name: gameB, proto: udp, default: 16262, required: true, env: GAME_PORT_B }
  - { name: rcon,  proto: tcp, default: 27015, internal: true, env: RCON_PORT }

resources:
  min_ram_mb: 4096
  recommended_ram_mb: 8192

# Per-instance generated RCON secret. The agent generates a random
# 24-byte token at create time (pkg/module GenerateSecrets), which
# overrides the env default for RCON_PASSWORD below — so every instance
# gets a unique password. The weak env default only applies to
# containers launched outside the panel.
secrets:
  - name: RCON_PASSWORD
    description: "Project Zomboid RCON password — generated per instance"
    generated: true

rcon:
  adapter: source_rcon
  host_port: rcon
  auth: source_rcon_login
  password_secret: RCON_PASSWORD
  # Legacy fallback only (pre-generated-secret instances). New instances
  # always get the generated RCON_PASSWORD secret above.
  password_literal: "panel_rcon"
  commands:
    list: "players"
    save: "save"
    kick: "kickuser {player}"
    ban:  "banuser {player}"
    broadcast: "servermsg \"{msg}\""

state_sources:
  - type: rcon
    command: "players"
    every: 60s
    parse:
      kind: regex
      pattern: 'Players connected \((?P<count>\d+)\)'
      fields:
        players_online: count

events:
  join:
    pattern: "(?P<name>\\S+) connected with ip"
    kind: join
  leave:
    pattern: "(?P<name>\\S+) disconnected"
    kind: leave

update_providers:
  - id: stable
    kind: steamcmd
    app_id: "380870"
    install_path: /game

# --- Manifest-driven UI metadata (WI-07) --------------------------
# Consumed by the CONTROLLER/dashboard only (the controller loads its
# own ./modules copy at startup); the agent ignores these at runtime.
# ready_pattern is a JavaScript regex (slash-delimited when it needs
# flags) moved verbatim from the dashboard's READY_PATTERNS map.
# Confirmed on smoke boot 2026-07-14: 'LOG  : Network ... > *** SERVER STARTED ****'
ready_pattern: '/\*+ SERVER STARTED \*+/'
appearance:
  emoji: "🧟"
  grad: "linear-gradient(135deg,#6a4c1e,#b89040)"
  steam: "108600"
