Configuration

Main sections

SectionPurpose
settingsRequest expiry, per-target cooldown, teleport countdown and movement/damage cancellation.
networknone, velocity or redis network mode; proxy/backend identity and Redis connection.
databaseSQLite or MySQL storage for player preferences.
messages-displayChoose which message keys go to chat or action bar.
request-guiConfirmation inventory layout, materials, region display and dynamic server materials.
soundsRequest, accept/deny, countdown, teleport and error sounds.
messagesAll player-facing text and placeholders.

Default config

yaml
license-key: "AP-XXXX-XXXX-XXXX-XXXX"

# ============================================================
#  TPA Configuration
#  Color formats supported in all messages:
#    - Legacy:   &a, &c, &l, etc.
#    - HEX:      &#RRGGBB  or  #RRGGBB
# ============================================================

# General request settings
settings:
  # How long (in seconds) a TPA request stays valid before expiring.
  request-expire-seconds: 60

  # Cooldown (in seconds) before a player can send another request to the SAME target.
  # Cooldowns are tracked per-target: you may have a cooldown with PlayerA but still
  # send a request to PlayerB immediately.
  cooldown-seconds: 30

  # Teleport countdown / warmup (in seconds) before the player is actually teleported.
  # Set to 0 to teleport instantly.
  countdown-seconds: 5

  # If true, the countdown is cancelled when the teleporting player moves.
  cancel-on-move: true

  # If true, the countdown is cancelled when the teleporting player takes damage.
  cancel-on-damage: true

# Cross-server messaging mode.
#   redis    -> Uses Redis pub/sub. Supports any number of backend servers across proxies.
#   velocity -> Uses Velocity/BungeeCord plugin messaging. Single proxy only, no Redis needed.
#   none     -> Single server only. No cross-server teleports.
network:
  mode: none
  debug: false
  proxy-host: "" # Enter this only if you use multi-proxy
  proxy-port: 25565
 # This server's unique backend name (from velocity.toml)
  server-name: ""
  redis:
    host: "127.0.0.1"
    port: 6379
    username: "default"
    password: ""
    use-ssl: false
    channel-prefix: "tpa:"

# Player preference + persistence storage.
database:
  # Storage type: sqlite or mysql
  type: sqlite

  # SQLite file (relative to the plugin folder). Used only when type=sqlite.
  sqlite-file: "tpa.db"

  # MySQL settings. Used only when type=mysql.
  mysql:
    host: ""
    port: 3306
    database: "tpa"
    username: ""
    password: ""
    # Extra JDBC properties.
    properties: "useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf8"
    pool-size: 10

# Message display options. Content is shared between chat and action bar.
messages-display:
  # Send messages to chat.
  chat: true
  # Send messages to the action bar.
  action-bar: true
  # Message keys that should display in action bar instead of chat.
  action-bar-message-keys:
    - accepted-sender
    - accepted-target
    - denied-sender
    - denied-target
    - countdown
    - teleporting
    - teleport-cancelled-move
    - teleport-cancelled-damage
    - teleport-success

request-gui:
  enabled: true
  title: "&8ᴄᴏɴғɪʀᴍ ʀᴇǫᴜᴇsᴛ"
  size: 27
  items:
    accept:
      slot: 16
      material: "LIME_STAINED_GLASS_PANE"
      name: "&#00FF07ᴄᴏɴғɪʀᴍ"
      lore:
        - "&7Confirm request from &#00A2FF{sender}"
    decline:
      slot: 10
      material: "RED_STAINED_GLASS_PANE"
      name: "&#FF0000ᴄᴀɴᴄᴇʟ"
      lore:
        - "&7Cancel request from &#00A2FF{sender}"
    player-head:
      slot: 13
      material: "PLAYER_HEAD"
      name: "#00FF8Dᴘʟᴀʏᴇʀ"
      lore:
        - "&7{sender}"
    server:
      slot: 14
      material: "FEATHER"
      name: "&#00FF8Dʀᴇɢɪᴏɴ"
      lore:
        - "&7{server}"
        - "&7Ping: (&#00FFA2{ping}ms&7)"
      dynamic-material: # Uses only the item mentioned in the above "material: "FEATHER""
        enabled: false
        by-server: # Separate material by server
          enabled: true
          materials:
            lobby: "COMPASS"
            survival-eu: "BLUE_CONCRETE"
            survival-asia: "YELLOW_CONCRETE"
        by-region: # Detects servers with keywords "asia,as,apac,sg,sea,jp,kr,in,europe,eu,eur,de,fr,uk,nl,pl,it,es,northamerica,north-america,na,us,usa,ca,canada,southamerica,south-america,sa,br,brazil,ar,latam,oceania,oce,oc,au,australia,nz,newzealand,africa,af,za,southafrica,ng,eg,middleeast,middle-east,me,uae,saudi,qa,tr" and displays regions by them
          enabled: true
          materials:
            asia: "YELLOW_CONCRETE"
            europe: "BLUE_CONCRETE"
            north-america: "RED_CONCRETE"
            south-america: "LIME_CONCRETE"
            oceania: "CYAN_CONCRETE"
            africa: "ORANGE_CONCRETE"
            middle-east: "PURPLE_CONCRETE"
      region-display: # Means {server} shows a clean region name like Asia/Europe (if detected), and false means it shows the raw server name.
        enabled: true
    location:
      slot: 12
      name: "&#00FF8Dʟᴏᴄᴀᴛɪᴏɴ"
      lore:
        - "&7{location}"
      material-overworld: "GRASS_BLOCK"
      material-nether: "NETHERRACK"
      material-end: "END_STONE"

# Sound settings. Each sound uses a Bukkit Sound enum name.
# Set 'enabled' to false to disable all sounds globally.
sounds:
  enabled: true
  request-sent:
    sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
    volume: 1.0
    pitch: 1.0
  request-received:
    sound: "BLOCK_NOTE_BLOCK_PLING"
    volume: 1.0
    pitch: 1.2
  accepted:
    sound: "ENTITY_PLAYER_LEVELUP"
    volume: 1.0
    pitch: 1.0
  denied:
    sound: "ENTITY_VILLAGER_NO"
    volume: 1.0
    pitch: 1.0
  cancelled:
    sound: "ENTITY_VILLAGER_NO"
    volume: 1.0
    pitch: 1.0
  countdown-tick:
    sound: "BLOCK_NOTE_BLOCK_HAT"
    volume: 1.0
    pitch: 1.0
  teleport:
    sound: "ENTITY_ENDERMAN_TELEPORT"
    volume: 1.0
    pitch: 1.0
  error:
    sound: "ENTITY_VILLAGER_NO"
    volume: 1.0
    pitch: 1.0

# All user-facing messages. Use {placeholders} where shown.
messages:
  prefix: ""
  no-permission: "&cYou don't have permission to do that."
  player-only: "&cThis command can only be used by players."
  player-not-found: "&cPlayer {player} was not found."
  cannot-tpa-self: "&cYou cannot send a teleport request to yourself."
  usage-tpa: "&7Usage: &f/tpa <player>"
  usage-tpahere: "&7Usage: &f/tpahere <player>"

  # Sending / receiving
  request-sent: "&7Teleport request sent to &#00A2FF{target}"
  request-sent-here: "&7Request sent to &#00A2FF{target} &7to teleport to you"
  request-received: "&#00A2FF{sender} &7wants to teleport to you. Type &#22FF00/tpaccept &7or &#FF0000/tpdeny"
  request-received-here: "&#00A2FF{sender} &7wants you to teleport to them. Type &#22FF00/tpaccept &7or &#FF0000/tpdeny"
  request-received-clickable: "#00A2FF[ACCEPT] &8| &#FF0000[DENY]"
  request-hover-accept: "&aClick to accept the request from &#00A2FF{sender}"
  request-hover-deny: "&cClick to deny the request from &#00A2FF{sender}"

  # Cooldown / state
  cooldown: "&cYou must wait {seconds}s before sending another request to {target}"
  target-toggled-off: "&c{target} is not accepting teleport requests right now."
  target-toggled-here-off: "&f{target} &cis not accepting tpahere requests right now."
  already-has-request: "&cYou already have a pending request to {target}."
  auto-accepted: "&#00A2FF{target} &7accepted your teleport request."

  # Accept / deny / cancel
  accepted-sender: "&#00A2FF{target} &7accepted your teleport request."
  accepted-target: "&7You accepted the teleport request from &#00A2FF{sender}&a."
  denied-sender: "&c{target} denied your teleport request."
  denied-target: "&cYou denied the teleport request from {sender}."
  cancelled-sender: "&cYou cancelled your teleport request to {target}."
  cancelled-target: "&c{sender} cancelled their teleport request."
  no-pending-incoming: "&cYou have no pending teleport requests."
  no-pending-outgoing: "&cYou have no outgoing teleport request to cancel."
  request-expired-sender: "&cYour teleport request to {target} has expired."
  request-expired-target: "&cThe teleport request from {sender} has expired."
  multiple-requests: "&7You have multiple requests. Specify a player: &#00A2FF/tpaccept <player>"

  # Countdown / teleport
  countdown: "&7Teleporting in &#00A2FF{seconds}s"
  teleporting: "&7Teleporting now!"
  teleport-cancelled-move: "&cTeleport cancelled because you moved."
  teleport-cancelled-damage: "&cTeleport cancelled because you took damage."
  teleport-success: "&7Teleported to &#00A2FF{target}&7."
  target-offline: "&cThat player is no longer online."

  # Toggles
  toggletpa-on: "&aYou will now receive teleport requests."
  toggletpa-off: "&cYou will no longer receive teleport requests."
  toggletpahere-on: "&aYou will now receive tpahere requests."
  toggletpahere-off: "&cYou will no longer receive tpahere requests."
  tpauto-on: "&aYou will now automatically accept teleport requests."
  tpauto-off: "&cYou will no longer automatically accept teleport requests."

  # List
  tplist-header: "&7&lPending Requests:"
  tplist-incoming: "&7 - Incoming from &#00A2FF{player} &#00FFA2({type})"
  tplist-outgoing: "&7 - Outgoing to &#00A2FF{player} &#00FFA2({type})"
  tplist-empty: "&cYou have no pending requests."

  # Admin
  reloaded: "&aTPA configuration reloaded."