{"id":155576,"date":"2026-06-09T15:03:14","date_gmt":"2026-06-09T12:03:14","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/"},"modified":"2026-06-09T15:03:14","modified_gmt":"2026-06-09T12:03:14","slug":"theeasytpa","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/","title":{"rendered":"EasyTPA"},"content":{"rendered":"<p>![License: FCL](https:\/\/github.com\/Crafteria-dev\/EasyTPA\/blob\/main\/LICENSE)<br \/>\n![Paper](https:\/\/papermc.io)<br \/>\n![Java](https:\/\/openjdk.org)<br \/>\n![Version](https:\/\/github.com\/ZO3N\/EasyTPA\/releases)<\/p>\n<p># EasyTPA<br \/>\nThe EasyTPA for your mc server<\/p>\n<p>&#8212;<\/p>\n<p># English Description<\/p>\n<p>> \ud83d\udca1 **Commercial Use:** This plugin is free for individuals.<br \/>\n> If you are a business or generate revenue with this plugin,<br \/>\n> you **must** contact me to obtain authorization.<\/p>\n<p>## \u2728 Features<\/p>\n<p>&#8211; **Player teleportation** \u2014 `\/tpa`, `\/tpahere`, `\/tpaccept`, `\/tpdeny`, `\/tpcancel`, `\/tptoggle`<br \/>\n&#8211; **Homes** \u2014 `\/home`, `\/sethome`, `\/delhome` with per-player limit and permission tiers<br \/>\n&#8211; **Warps** \u2014 `\/warp`, `\/setwarp`, `\/delwarp`, `\/warps` with per-player ownership and clickable list<br \/>\n&#8211; **Spawn** \u2014 `\/spawn`, `\/setspawn`<br \/>\n&#8211; **Back** \u2014 `\/back` (previous position or configurable death location)<br \/>\n&#8211; **Random teleport** \u2014 `\/rtp` (alias `\/wild`) with async chunk loading<br \/>\n&#8211; **Reload** \u2014 `\/tpreload`<br \/>\n&#8211; **Global cooldown** configurable between two teleportations (bypassable via permission)<br \/>\n&#8211; **Anti-movement delay** \u2014 teleportation is cancelled if the player moves<br \/>\n&#8211; **Configurable TPA timeout** \u2014 requests expire automatically<br \/>\n&#8211; **Optional permission system** \u2014 can be disabled for servers without a permissions plugin<br \/>\n&#8211; **100% customizable messages** \u2014 MiniMessage format, colors, hover, click<br \/>\n&#8211; **Clickable warps** in chat with `\/warps`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udce6 Installation<\/p>\n<p>1. Download `easytpa-1.0.0.jar` from the Releases<br \/>\n2. Place the file in your server&#8217;s `plugins\/` folder<br \/>\n3. Start (or restart) the server<br \/>\n4. Edit `plugins\/EasyTPA\/config.yml` and `messages.yml` to your needs<br \/>\n5. Reload with `\/tpreload` (no restart needed)<\/p>\n<p>> **Required:** Paper 1.21.4+ \u2014 Java 21+<\/p>\n<p>&#8212;<\/p>\n<p>## \u2699\ufe0f Configuration \u2014 `config.yml`<\/p>\n<p>&#8220;`yaml<br \/>\n# false \u2192 everyone can use player commands without permission<br \/>\n# true  \u2192 checks permissions (compatible with LuckPerms and any Bukkit plugin)<br \/>\npermissions: false<\/p>\n<p># Delay before teleportation (seconds). 0 to disable.<br \/>\n# The player must not move, otherwise the teleportation is cancelled.<br \/>\nteleport-delay: 3<\/p>\n<p># Duration (seconds) before a TPA request expires<br \/>\ntpa-timeout: 60<\/p>\n<p># Global cooldown between two teleportations (seconds). 0 to disable.<br \/>\n# Bypass with: teleport.cooldown.bypass<br \/>\nteleport-cooldown: 30<\/p>\n<p># \/back can bring back to death location if true<br \/>\nback-on-death: true<\/p>\n<p># Maximum number of homes per player<br \/>\n# If permissions: true, extendable via teleport.home.multiple.<number><br \/>\nmax-homes: 1<\/p>\n<p># Maximum number of warps per player<br \/>\nmax-warps: 5<\/p>\n<p># Maximum radius (blocks) for \/rtp<br \/>\nrtp-radius: 5000<\/p>\n<p># Minimum radius (blocks) for \/rtp (avoids spawn)<br \/>\nrtp-min-radius: 100<\/p>\n<p># Maximum attempts to find a safe position for \/rtp<br \/>\nrtp-max-attempts: 20<\/p>\n<p># Message prefix (MiniMessage format)<br \/>\nmessages-prefix: &#8220;<dark_gray>[<aqua>EasyTPA<dark_gray>]<reset> &#8221;<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udccb Commands<\/p>\n<p>| Command | Description | Required Permission |<br \/>\n|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br \/>\n| `\/tpa <player>` | Request to teleport to a player | `teleport.tpa` |<br \/>\n| `\/tpahere <player>` | Request a player to come to you | `teleport.tpahere` |<br \/>\n| `\/tpaccept` | Accept a TPA request | `teleport.tpaccept` |<br \/>\n| `\/tpdeny` | Deny a TPA request | `teleport.tpdeny` |<br \/>\n| `\/tpcancel` | Cancel your pending request | `teleport.tpcancel` |<br \/>\n| `\/tptoggle` | Enable\/disable receiving requests | `teleport.tptoggle` |<br \/>\n| `\/home [name]` | Teleport to a home | `teleport.home` |<br \/>\n| `\/sethome [name]` | Set a home at your position | `teleport.sethome` |<br \/>\n| `\/delhome [name]` | Delete a home | `teleport.delhome` |<br \/>\n| `\/warp <name>` | Teleport to a warp | `teleport.warp` |<br \/>\n| `\/setwarp <name>` | Create\/edit a warp | `teleport.setwarp` |<br \/>\n| `\/delwarp <name>` | Delete a warp | Warp owner or admin |<br \/>\n| `\/warps` | List warps (clickable) | `teleport.warps` |<br \/>\n| `\/spawn` | Teleport to spawn | `teleport.spawn` |<br \/>\n| `\/setspawn` | Set the spawn | `teleport.admin` |<br \/>\n| `\/back` | Return to previous position | `teleport.back` |<br \/>\n| `\/rtp` or `\/wild` | Safe random teleportation | `teleport.rtp` |<br \/>\n| `\/tpreload` | Reload the configuration | `teleport.admin` |<\/p>\n<p>> If `permissions: false` in `config.yml`, all player commands are accessible without permission. Admin commands always require OP or `teleport.admin`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd12 Permissions<\/p>\n<p>| Permission | Description | Default |<br \/>\n|&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;|<br \/>\n| `teleport.tpa` | Use \/tpa | `true` |<br \/>\n| `teleport.tpahere` | Use \/tpahere | `true` |<br \/>\n| `teleport.tpaccept` | Use \/tpaccept | `true` |<br \/>\n| `teleport.tpdeny` | Use \/tpdeny | `true` |<br \/>\n| `teleport.tpcancel` | Use \/tpcancel | `true` |<br \/>\n| `teleport.tptoggle` | Use \/tptoggle | `true` |<br \/>\n| `teleport.home` | Use \/home | `true` |<br \/>\n| `teleport.sethome` | Use \/sethome | `true` |<br \/>\n| `teleport.delhome` | Use \/delhome | `true` |<br \/>\n| `teleport.warp` | Use \/warp | `true` |<br \/>\n| `teleport.warps` | Use \/warps | `true` |<br \/>\n| `teleport.setwarp` | Create\/edit a warp | `op` |<br \/>\n| `teleport.delwarp` | Delete any warp | `op` |<br \/>\n| `teleport.spawn` | Use \/spawn | `true` |<br \/>\n| `teleport.back` | Use \/back | `true` |<br \/>\n| `teleport.rtp` | Use \/rtp | `true` |<br \/>\n| `teleport.cooldown.bypass` | Ignore teleportation cooldown | `op` |<br \/>\n| `teleport.home.multiple.<n>` | Have up to `n` homes (e.g. `.5`, `.10`) | \u2014 |<br \/>\n| `teleport.admin` | All admin permissions | `op` |<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcac Messages \u2014 `messages.yml`<\/p>\n<p>All messages use Adventure&#8217;s **MiniMessage** format. You can use colors, effects, clickable links, and more.<\/p>\n<p>**Available placeholders:**<\/p>\n<p>| Placeholder | Description |<br \/>\n|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `<player>` | A player&#8217;s name |<br \/>\n| `<home>` | A home name |<br \/>\n| `<warp>` | A warp name |<br \/>\n| `<delay>` | Delay in seconds |<br \/>\n| `<max>` | Maximum limit |<br \/>\n| `<remaining>` | Remaining seconds (cooldown) |<br \/>\n| `<usage>` | Command syntax |<\/p>\n<p>**MiniMessage customization examples:**<br \/>\n&#8220;`yaml<br \/>\n# Colors<br \/>\nteleport-success: &#8220;<green>Teleportation successful!&#8221;<\/p>\n<p># Gradient color<br \/>\ntpa-sent: &#8220;<gradient:#55ff55:#00aa00>Request sent to <player><\/gradient>&#8221;<\/p>\n<p># Bold text with emoji<br \/>\nteleport-pending: &#8220;<gold><bold>\u23f3 Teleporting in <delay>s&#8230; Don&#8217;t move!<\/bold>&#8221;<\/p>\n<p># Clickable link (already used for TPA buttons)<br \/>\ntpa-received-buttons: &#8220;<green><click:run_command:\/tpaccept>[Accept]<\/click>&#8221;<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfd7\ufe0f Building from source<\/p>\n<p>**Requirements:** Java 21, Maven 3.8+<\/p>\n<p>&#8220;`bash<br \/>\ngit clone https:\/\/github.com\/crafteria-dev\/EasyTPA.git<br \/>\ncd EasyTPA<br \/>\nmvn package<br \/>\n&#8220;`<\/p>\n<p>The compiled JAR is located at `target\/easytpa-1.0.0.jar`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcc1 Project structure<\/p>\n<p>&#8220;`<br \/>\nsrc\/main\/java\/fr\/easytpa\/<br \/>\n\u251c\u2500\u2500 EasyTPA.java                    # Main class, initialization<br \/>\n\u251c\u2500\u2500 commands\/                       # One file per command (17 commands)<br \/>\n\u2502   \u251c\u2500\u2500 TpaCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpaHereCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpAcceptCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpDenyCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpCancelCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpToggleCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 HomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetHomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 DelHomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 WarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetWarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 DelWarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 WarpsCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SpawnCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetSpawnCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 BackCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 RtpCommand.java<br \/>\n\u2502   \u2514\u2500\u2500 TpReloadCommand.java<br \/>\n\u251c\u2500\u2500 managers\/                       # Business logic and persistence<br \/>\n\u2502   \u251c\u2500\u2500 ConfigManager.java          # config.yml reader<br \/>\n\u2502   \u251c\u2500\u2500 MessageManager.java         # MiniMessage + prefix<br \/>\n\u2502   \u251c\u2500\u2500 TpaManager.java             # TPA requests, timeout, toggle<br \/>\n\u2502   \u251c\u2500\u2500 TeleportDelayManager.java   # Delay, anti-movement, cooldown<br \/>\n\u2502   \u251c\u2500\u2500 CooldownManager.java        # Global per-player cooldown<br \/>\n\u2502   \u251c\u2500\u2500 HomeManager.java            # Homes (homes.yml)<br \/>\n\u2502   \u251c\u2500\u2500 WarpManager.java            # Warps (warps.yml)<br \/>\n\u2502   \u251c\u2500\u2500 SpawnManager.java           # Spawn (spawn.yml)<br \/>\n\u2502   \u2514\u2500\u2500 BackManager.java            # Previous position (in-memory)<br \/>\n\u251c\u2500\u2500 listeners\/<br \/>\n\u2502   \u2514\u2500\u2500 TeleportListener.java       # PlayerMove, PlayerDeath, PlayerQuit<br \/>\n\u2514\u2500\u2500 utils\/<br \/>\n    \u251c\u2500\u2500 LocationUtils.java          # YAML serialization, safety checks<br \/>\n    \u2514\u2500\u2500 PermissionUtils.java        # Player\/admin permission checks<\/p>\n<p>src\/main\/resources\/<br \/>\n\u251c\u2500\u2500 plugin.yml                      # Command and permission declarations<br \/>\n\u251c\u2500\u2500 config.yml                      # Main configuration<br \/>\n\u2514\u2500\u2500 messages.yml                    # Customizable messages<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd27 Internal workings<\/p>\n<p>### Teleportation flow<br \/>\n1. The command (e.g. `\/home spawn`) calls `TeleportDelayManager.scheduleTeleport()`<br \/>\n2. The cooldown is checked \u2014 if active, a message is sent and the request is dropped<br \/>\n3. The anti-movement delay starts (`teleport-delay` seconds)<br \/>\n4. If the player moves \u2192 cancellation (`PlayerMoveEvent`)<br \/>\n5. Otherwise \u2192 `executeTeleport()`: saves the position for `\/back`, calls `player.teleportAsync()` asynchronously<br \/>\n6. On success \u2192 the cooldown is updated, the callback sends the success message<\/p>\n<p>### Warp system<br \/>\n&#8211; Each warp stores the creator&#8217;s UUID (`warps.yml`)<br \/>\n&#8211; A player can only delete or overwrite their own warps<br \/>\n&#8211; Admins (`teleport.admin` or OP) can manage all warps<br \/>\n&#8211; The `max-warps` limit is per player (not global)<\/p>\n<p>### Random teleportation (\/rtp)<br \/>\n&#8211; Generates coordinates within a ring between `rtp-min-radius` and `rtp-radius`<br \/>\n&#8211; Uses `world.getChunkAtAsync()` to load chunks without blocking the server<br \/>\n&#8211; Checks position safety (2 air blocks, solid ground, no magma\/campfire)<br \/>\n&#8211; Retries up to `rtp-max-attempts` times if the position is not safe<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcdc License<\/p>\n<p>This project is licensed under the **Fair Core License (FCL)**.<\/p>\n<p>&#8211; \u2705 **Free** for personal use and non-commercial servers<br \/>\n&#8211; \u2705 Modification and redistribution of source code **with attribution**<br \/>\n&#8211; \u274c **Commercial use** (revenue generation) **without authorization** is prohibited<\/p>\n<p>For any commercial inquiry, contact **ZO3N** on GitHub.<\/p>\n<p>&#8212;<\/p>\n<div align=\"center\">\n  Made with \u2764\ufe0f by <strong>ZO3N<\/strong><br \/>\n  github.com\/crafteria-dev\/EasyTPA\n<\/div>\n<p># French Description<\/p>\n<p>> \ud83d\udca1 **Usage Commercial :** Ce plugin est gratuit pour les particuliers.<br \/>\n> Si vous \u00eates une entreprise ou que vous g\u00e9n\u00e9rez des revenus avec ce plugin,<br \/>\n> vous **devez** me contacter pour obtenir une autorisation.<\/p>\n<p>## \u2728 Fonctionnalit\u00e9s<\/p>\n<p>&#8211; **T\u00e9l\u00e9portation entre joueurs** \u2014 `\/tpa`, `\/tpahere`, `\/tpaccept`, `\/tpdeny`, `\/tpcancel`, `\/tptoggle`<br \/>\n&#8211; **Homes** \u2014 `\/home`, `\/sethome`, `\/delhome` avec limite par joueur et tiers de permissions<br \/>\n&#8211; **Warps** \u2014 `\/warp`, `\/setwarp`, `\/delwarp`, `\/warps` avec propri\u00e9t\u00e9 par joueur et liste cliquable<br \/>\n&#8211; **Spawn** \u2014 `\/spawn`, `\/setspawn`<br \/>\n&#8211; **Retour** \u2014 `\/back` (position pr\u00e9c\u00e9dente ou lieu de mort configurable)<br \/>\n&#8211; **T\u00e9l\u00e9portation al\u00e9atoire** \u2014 `\/rtp` (alias `\/wild`) avec chargement async des chunks<br \/>\n&#8211; **Rechargement** \u2014 `\/tpreload`<br \/>\n&#8211; **Cooldown global** configurable entre deux t\u00e9l\u00e9portations (bypass par permission)<br \/>\n&#8211; **D\u00e9lai anti-mouvement** \u2014 la t\u00e9l\u00e9portation est annul\u00e9e si le joueur bouge<br \/>\n&#8211; **Timeout TPA** configurable \u2014 les demandes expirent automatiquement<br \/>\n&#8211; **Syst\u00e8me de permissions optionnel** \u2014 d\u00e9sactivable pour les serveurs sans plugin de perms<br \/>\n&#8211; **Messages 100 % personnalisables** \u2014 format MiniMessage, couleurs, hover, click<br \/>\n&#8211; **Warps cliquables** dans le chat avec `\/warps`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udce6 Installation<\/p>\n<p>1. T\u00e9l\u00e9charger `easytpa-1.0.0.jar` depuis les Releases<br \/>\n2. Placer le fichier dans le dossier `plugins\/` de votre serveur Paper<br \/>\n3. D\u00e9marrer (ou red\u00e9marrer) le serveur<br \/>\n4. Modifier `plugins\/EasyTPA\/config.yml` et `messages.yml` selon vos besoins<br \/>\n5. Recharger avec `\/tpreload` (inutile de red\u00e9marrer)<\/p>\n<p>> **Requis :** Paper 26.1.2+ \u2014 Java 25+<\/p>\n<p>&#8212;<\/p>\n<p>## \u2699\ufe0f Configuration \u2014 `config.yml`<\/p>\n<p>&#8220;`yaml<br \/>\n# false \u2192 tout le monde peut utiliser les commandes joueur sans permission<br \/>\n# true  \u2192 v\u00e9rifie les permissions (compatible LuckPerms et tout plugin Bukkit)<br \/>\npermissions: false<\/p>\n<p># D\u00e9lai avant t\u00e9l\u00e9portation (secondes). 0 pour d\u00e9sactiver.<br \/>\n# Le joueur ne doit pas bouger, sinon la t\u00e9l\u00e9portation est annul\u00e9e.<br \/>\nteleport-delay: 3<\/p>\n<p># Dur\u00e9e (secondes) avant expiration d&#8217;une demande TPA<br \/>\ntpa-timeout: 60<\/p>\n<p># Cooldown global entre deux t\u00e9l\u00e9portations (secondes). 0 pour d\u00e9sactiver.<br \/>\n# Contourne avec : teleport.cooldown.bypass<br \/>\nteleport-cooldown: 30<\/p>\n<p># \/back peut ramener au lieu de mort si true<br \/>\nback-on-death: true<\/p>\n<p># Nombre maximum de homes par joueur<br \/>\n# Si permissions: true, extensible via teleport.home.multiple.<nombre><br \/>\nmax-homes: 1<\/p>\n<p># Nombre maximum de warps par joueur<br \/>\nmax-warps: 5<\/p>\n<p># Rayon maximum (blocs) pour \/rtp<br \/>\nrtp-radius: 5000<\/p>\n<p># Rayon minimum (blocs) pour \/rtp (\u00e9vite le spawn)<br \/>\nrtp-min-radius: 100<\/p>\n<p># Tentatives maximum pour trouver une position s\u00fbre pour \/rtp<br \/>\nrtp-max-attempts: 20<\/p>\n<p># Pr\u00e9fixe des messages (format MiniMessage)<br \/>\nmessages-prefix: &#8220;<dark_gray>[<aqua>EasyTPA<dark_gray>]<reset> &#8221;<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udccb Commandes<\/p>\n<p>| Commande | Description | Permission requise |<br \/>\n|&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `\/tpa <joueur>` | Demander \u00e0 se t\u00e9l\u00e9porter \u00e0 un joueur | `teleport.tpa` |<br \/>\n| `\/tpahere <joueur>` | Demander \u00e0 un joueur de venir \u00e0 vous | `teleport.tpahere` |<br \/>\n| `\/tpaccept` | Accepter une demande TPA | `teleport.tpaccept` |<br \/>\n| `\/tpdeny` | Refuser une demande TPA | `teleport.tpdeny` |<br \/>\n| `\/tpcancel` | Annuler votre demande en attente | `teleport.tpcancel` |<br \/>\n| `\/tptoggle` | Activer\/d\u00e9sactiver la r\u00e9ception de demandes | `teleport.tptoggle` |<br \/>\n| `\/home [nom]` | Se t\u00e9l\u00e9porter \u00e0 un home | `teleport.home` |<br \/>\n| `\/sethome [nom]` | D\u00e9finir un home \u00e0 votre position | `teleport.sethome` |<br \/>\n| `\/delhome [nom]` | Supprimer un home | `teleport.delhome` |<br \/>\n| `\/warp <nom>` | Se t\u00e9l\u00e9porter \u00e0 un warp | `teleport.warp` |<br \/>\n| `\/setwarp <nom>` | Cr\u00e9er\/modifier un warp | `teleport.setwarp` |<br \/>\n| `\/delwarp <nom>` | Supprimer un warp | Cr\u00e9ateur du warp ou admin |<br \/>\n| `\/warps` | Lister les warps (cliquables) | `teleport.warps` |<br \/>\n| `\/spawn` | Se t\u00e9l\u00e9porter au spawn | `teleport.spawn` |<br \/>\n| `\/setspawn` | D\u00e9finir le spawn | `teleport.admin` |<br \/>\n| `\/back` | Retourner \u00e0 la position pr\u00e9c\u00e9dente | `teleport.back` |<br \/>\n| `\/rtp` ou `\/wild` | T\u00e9l\u00e9portation al\u00e9atoire s\u00fbre | `teleport.rtp` |<br \/>\n| `\/tpreload` | Recharger la configuration | `teleport.admin` |<\/p>\n<p>> Si `permissions: false` dans `config.yml`, toutes les commandes joueur sont accessibles sans permission. Les commandes admin n\u00e9cessitent toujours OP ou `teleport.admin`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd12 Permissions<\/p>\n<p>| Permission | Description | D\u00e9faut |<br \/>\n|&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8211;|<br \/>\n| `teleport.tpa` | Utiliser \/tpa | `true` |<br \/>\n| `teleport.tpahere` | Utiliser \/tpahere | `true` |<br \/>\n| `teleport.tpaccept` | Utiliser \/tpaccept | `true` |<br \/>\n| `teleport.tpdeny` | Utiliser \/tpdeny | `true` |<br \/>\n| `teleport.tpcancel` | Utiliser \/tpcancel | `true` |<br \/>\n| `teleport.tptoggle` | Utiliser \/tptoggle | `true` |<br \/>\n| `teleport.home` | Utiliser \/home | `true` |<br \/>\n| `teleport.sethome` | Utiliser \/sethome | `true` |<br \/>\n| `teleport.delhome` | Utiliser \/delhome | `true` |<br \/>\n| `teleport.warp` | Utiliser \/warp | `true` |<br \/>\n| `teleport.warps` | Utiliser \/warps | `true` |<br \/>\n| `teleport.setwarp` | Cr\u00e9er\/modifier un warp | `op` |<br \/>\n| `teleport.delwarp` | Supprimer n&#8217;importe quel warp | `op` |<br \/>\n| `teleport.spawn` | Utiliser \/spawn | `true` |<br \/>\n| `teleport.back` | Utiliser \/back | `true` |<br \/>\n| `teleport.rtp` | Utiliser \/rtp | `true` |<br \/>\n| `teleport.cooldown.bypass` | Ignorer le cooldown de t\u00e9l\u00e9portation | `op` |<br \/>\n| `teleport.home.multiple.<n>` | Avoir jusqu&#8217;\u00e0 `n` homes (ex: `.5`, `.10`) | \u2014 |<br \/>\n| `teleport.admin` | Toutes les permissions admin | `op` |<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcac Messages \u2014 `messages.yml`<\/p>\n<p>Tous les messages utilisent le format **MiniMessage** d&#8217;Adventure. Vous pouvez utiliser des couleurs, effets, liens cliquables, etc.<\/p>\n<p>**Placeholders disponibles :**<\/p>\n<p>| Placeholder | Description |<br \/>\n|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `<player>` | Nom d&#8217;un joueur |<br \/>\n| `<home>` | Nom d&#8217;un home |<br \/>\n| `<warp>` | Nom d&#8217;un warp |<br \/>\n| `<delay>` | D\u00e9lai en secondes |<br \/>\n| `<max>` | Limite maximale |<br \/>\n| `<remaining>` | Secondes restantes (cooldown) |<br \/>\n| `<usage>` | Syntaxe de la commande |<\/p>\n<p>**Exemples de personnalisation MiniMessage :**<br \/>\n&#8220;`yaml<br \/>\n# Couleurs<br \/>\nteleport-success: &#8220;<green>T\u00e9l\u00e9portation effectu\u00e9e !&#8221;<\/p>\n<p># Couleur d\u00e9grad\u00e9e<br \/>\ntpa-sent: &#8220;<gradient:#55ff55:#00aa00>Demande envoy\u00e9e \u00e0 <player><\/gradient>&#8221;<\/p>\n<p># Texte en gras avec emoji<br \/>\nteleport-pending: &#8220;<gold><bold>\u23f3 T\u00e9l\u00e9portation dans <delay>s&#8230; Ne bougez pas !<\/bold>&#8221;<\/p>\n<p># Lien cliquable (d\u00e9j\u00e0 utilis\u00e9 pour les boutons TPA)<br \/>\ntpa-received-buttons: &#8220;<green><click:run_command:\/tpaccept>[Accepter]<\/click>&#8221;<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfd7\ufe0f Compilation depuis les sources<\/p>\n<p>**Pr\u00e9requis :** Java 25, Maven 3.8+<\/p>\n<p>&#8220;`bash<br \/>\ngit clone https:\/\/github.com\/crafteria-dev\/EasyTPA.git<br \/>\ncd EasyTPA<br \/>\nmvn package<br \/>\n&#8220;`<\/p>\n<p>Le JAR compil\u00e9 se trouve dans `target\/easytpa-1.0.0.jar`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcc1 Structure du projet<\/p>\n<p>&#8220;`<br \/>\nsrc\/main\/java\/fr\/easytpa\/<br \/>\n\u251c\u2500\u2500 EasyTPA.java                    # Classe principale, initialisation<br \/>\n\u251c\u2500\u2500 commands\/                       # Un fichier par commande (17 commandes)<br \/>\n\u2502   \u251c\u2500\u2500 TpaCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpaHereCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpAcceptCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpDenyCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpCancelCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 TpToggleCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 HomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetHomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 DelHomeCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 WarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetWarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 DelWarpCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 WarpsCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SpawnCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 SetSpawnCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 BackCommand.java<br \/>\n\u2502   \u251c\u2500\u2500 RtpCommand.java<br \/>\n\u2502   \u2514\u2500\u2500 TpReloadCommand.java<br \/>\n\u251c\u2500\u2500 managers\/                       # Logique m\u00e9tier et persistance<br \/>\n\u2502   \u251c\u2500\u2500 ConfigManager.java          # Lecture de config.yml<br \/>\n\u2502   \u251c\u2500\u2500 MessageManager.java         # MiniMessage + pr\u00e9fixe<br \/>\n\u2502   \u251c\u2500\u2500 TpaManager.java             # Demandes TPA, timeout, toggle<br \/>\n\u2502   \u251c\u2500\u2500 TeleportDelayManager.java   # D\u00e9lai, anti-mouvement, cooldown<br \/>\n\u2502   \u251c\u2500\u2500 CooldownManager.java        # Cooldown global par joueur<br \/>\n\u2502   \u251c\u2500\u2500 HomeManager.java            # Homes (homes.yml)<br \/>\n\u2502   \u251c\u2500\u2500 WarpManager.java            # Warps (warps.yml)<br \/>\n\u2502   \u251c\u2500\u2500 SpawnManager.java           # Spawn (spawn.yml)<br \/>\n\u2502   \u2514\u2500\u2500 BackManager.java            # Position pr\u00e9c\u00e9dente (m\u00e9moire)<br \/>\n\u251c\u2500\u2500 listeners\/<br \/>\n\u2502   \u2514\u2500\u2500 TeleportListener.java       # PlayerMove, PlayerDeath, PlayerQuit<br \/>\n\u2514\u2500\u2500 utils\/<br \/>\n    \u251c\u2500\u2500 LocationUtils.java          # S\u00e9rialisation YAML, v\u00e9rification s\u00e9curit\u00e9<br \/>\n    \u2514\u2500\u2500 PermissionUtils.java        # V\u00e9rification permissions joueur\/admin<\/p>\n<p>src\/main\/resources\/<br \/>\n\u251c\u2500\u2500 plugin.yml                      # D\u00e9claration commandes et permissions<br \/>\n\u251c\u2500\u2500 config.yml                      # Configuration principale<br \/>\n\u2514\u2500\u2500 messages.yml                    # Messages personnalisables<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd27 Fonctionnement interne<\/p>\n<p>### Flux d&#8217;une t\u00e9l\u00e9portation<br \/>\n1. La commande (ex: `\/home spawn`) appelle `TeleportDelayManager.scheduleTeleport()`<br \/>\n2. Le cooldown est v\u00e9rifi\u00e9 \u2014 si actif, message et abandon<br \/>\n3. Le d\u00e9lai anti-mouvement d\u00e9marre (`teleport-delay` secondes)<br \/>\n4. Si le joueur bouge \u2192 annulation (`PlayerMoveEvent`)<br \/>\n5. Sinon \u2192 `executeTeleport()` : sauvegarde la position pour `\/back`, appel async `player.teleportAsync()`<br \/>\n6. En cas de succ\u00e8s \u2192 le cooldown est mis \u00e0 jour, le callback envoie le message de succ\u00e8s<\/p>\n<p>### Syst\u00e8me de warps<br \/>\n&#8211; Chaque warp enregistre l&#8217;UUID du cr\u00e9ateur (`warps.yml`)<br \/>\n&#8211; Un joueur ne peut supprimer ou \u00e9craser que ses propres warps<br \/>\n&#8211; Les admins (`teleport.admin` ou OP) peuvent g\u00e9rer tous les warps<br \/>\n&#8211; La limite `max-warps` est par joueur (pas globale)<\/p>\n<p>### T\u00e9l\u00e9portation al\u00e9atoire (\/rtp)<br \/>\n&#8211; G\u00e9n\u00e8re des coordonn\u00e9es dans un anneau entre `rtp-min-radius` et `rtp-radius`<br \/>\n&#8211; Utilise `world.getChunkAtAsync()` pour charger les chunks sans bloquer le serveur<br \/>\n&#8211; V\u00e9rifie la s\u00e9curit\u00e9 de la position (2 blocs d&#8217;air, sol solide, pas de magma\/feu de camp)<br \/>\n&#8211; R\u00e9essaie jusqu&#8217;\u00e0 `rtp-max-attempts` fois si la position n&#8217;est pas s\u00fbre<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcdc Licence<\/p>\n<p>Ce projet est sous licence **Fair Core License (FCL)**.<\/p>\n<p>&#8211; \u2705 Utilisation **gratuite** pour usage personnel et serveurs non commerciaux<br \/>\n&#8211; \u2705 Modification et redistribution du code source **avec attribution**<br \/>\n&#8211; \u274c Utilisation **commerciale** (g\u00e9n\u00e9ration de revenus) **sans autorisation** interdite<\/p>\n<p>Pour toute demande commerciale, contactez **ZO3N** sur GitHub.<\/p>\n<p>&#8212;<\/p>\n<div align=\"center\">\n  Fait avec \u2764\ufe0f par <strong>ZO3N<\/strong><br \/>\n  github.com\/crafteria-dev\/EasyTPA\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>EasyTPA: A simple-to-use plugin for servers of all sizes.<\/p>\n","protected":false},"featured_media":155577,"template":"","meta":{"_minecraft_slug":"theeasytpa","_minecraft_project_id":"us5Ka1Dq","_minecraft_author":"ZO3N-Dev","_minecraft_license":"LicenseRef-FairCoreLicense-v1.0","_minecraft_downloads":9,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"theeasytpa.zip","_minecraft_size_bytes":126467,"_minecraft_version_count":1,"_minecraft_updated_at":"2026-05-15T23:12:41.430491Z","_minecraft_date_created":"2026-05-12T00:13:14.019051Z","_minecraft_date_modified":"2026-05-02T08:31:30.043933Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/theeasytpa","_minecraft_icon_attachment_id":155577,"_minecraft_imported_at":"2026-06-09T12:03:14+00:00","_minecraft_import_hash":"717c3b1f159a1f459cc368636e40f01b","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,89,126,127,867,129,123,869,92],"mod_loader":[130,132,134],"minecraft_version":[83,167,163],"class_list":["post-155576","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-game-mechanics","mod_category-management","mod_category-paper","mod_category-social","mod_category-spigot","mod_category-technology","mod_category-transportation","mod_category-utility","mod_loader-bukkit","mod_loader-paper","mod_loader-spigot","minecraft_version-26-1","minecraft_version-26-1-1","minecraft_version-26-1-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EasyTPA - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EasyTPA - Minecraft\" \/>\n<meta property=\"og:description\" content=\"EasyTPA: A simple-to-use plugin for servers of all sizes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/\",\"name\":\"EasyTPA - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp\",\"datePublished\":\"2026-06-09T12:03:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/theeasytpa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"EasyTPA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"EasyTPA - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/","og_locale":"en_US","og_type":"article","og_title":"EasyTPA - Minecraft","og_description":"EasyTPA: A simple-to-use plugin for servers of all sizes.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/","name":"EasyTPA - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp","datePublished":"2026-06-09T12:03:14+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/theeasytpa-icon-ef9c1ba614bfb14cd5c58e838a443ce45b2cabf5_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/theeasytpa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"EasyTPA"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/155576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/155577"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=155576"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=155576"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=155576"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=155576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}