EasyTPA
EasyTPA: A simple-to-use plugin for servers of all sizes.
Quick challenge
How far can you run before the mobs catch you?
Minecraft check
Confirm your run
Complete the quick check to get your code.
EasyTPA
EasyTPA
The EasyTPA for your mc server
---
English Description
> 💡 must This plugin is free for individuals. > If you are a business or generate revenue with this plugin, > you must contact me to obtain authorization.
✨ Features
- Clickable warps — `/tpa`, `/tpahere`, `/tpaccept`, `/tpdeny`, `/tpcancel`, `/tptoggle` - Clickable warps — `/home`, `/sethome`, `/delhome` with per-player limit and permission tiers - Clickable warps — `/warp`, `/setwarp`, `/delwarp`, `/warps` with per-player ownership and clickable list - Clickable warps — `/spawn`, `/setspawn` - Clickable warps — `/back` (previous position or configurable death location) - Clickable warps — `/rtp` (alias `/wild`) with async chunk loading - Clickable warps — `/tpreload` - Clickable warps configurable between two teleportations (bypassable via permission) - Clickable warps — teleportation is cancelled if the player moves - Clickable warps — requests expire automatically - Clickable warps — can be disabled for servers without a permissions plugin - Clickable warps — MiniMessage format, colors, hover, click - Clickable warps in chat with `/warps`
---
📦 Installation
1. Download `easytpa-1.0.0.jar` from the Releases 2. Place the file in your server's `plugins/` folder 3. Start (or restart) the server 4. Edit `plugins/EasyTPA/config.yml` and `messages.yml` to your needs 5. Reload with `/tpreload` (no restart needed)
> Required: Paper 1.21.4+ — Java 21+
---
⚙️ Configuration — `config.yml`
```yaml
false → everyone can use player commands without permission
true → checks permissions (compatible with LuckPerms and any Bukkit plugin)
permissions: false
Delay before teleportation (seconds). 0 to disable.
The player must not move, otherwise the teleportation is cancelled.
teleport-delay: 3
Duration (seconds) before a TPA request expires
tpa-timeout: 60
Global cooldown between two teleportations (seconds). 0 to disable.
Bypass with: teleport.cooldown.bypass
teleport-cooldown: 30
/back can bring back to death location if true
back-on-death: true
Maximum number of homes per player
If permissions: true, extendable via teleport.home.multiple.<number>
max-homes: 1
Maximum number of warps per player
max-warps: 5
Maximum radius (blocks) for /rtp
rtp-radius: 5000
Minimum radius (blocks) for /rtp (avoids spawn)
rtp-min-radius: 100
Maximum attempts to find a safe position for /rtp
rtp-max-attempts: 20
Message prefix (MiniMessage format)
messages-prefix: "<dark_gray>[<aqua>EasyTPA<dark_gray>]<reset> " ```
---
📋 Commands
| Command | Description | Required Permission | |---------|-------------|---------------------| | `/tpa <player>` | Request to teleport to a player | `teleport.tpa` | | `/tpahere <player>` | Request a player to come to you | `teleport.tpahere` | | `/tpaccept` | Accept a TPA request | `teleport.tpaccept` | | `/tpdeny` | Deny a TPA request | `teleport.tpdeny` | | `/tpcancel` | Cancel your pending request | `teleport.tpcancel` | | `/tptoggle` | Enable/disable receiving requests | `teleport.tptoggle` | | `/home [name]` | Teleport to a home | `teleport.home` | | `/sethome [name]` | Set a home at your position | `teleport.sethome` | | `/delhome [name]` | Delete a home | `teleport.delhome` | | `/warp <name>` | Teleport to a warp | `teleport.warp` | | `/setwarp <name>` | Create/edit a warp | `teleport.setwarp` | | `/delwarp <name>` | Delete a warp | Warp owner or admin | | `/warps` | List warps (clickable) | `teleport.warps` | | `/spawn` | Teleport to spawn | `teleport.spawn` | | `/setspawn` | Set the spawn | `teleport.admin` | | `/back` | Return to previous position | `teleport.back` | | `/rtp` or `/wild` | Safe random teleportation | `teleport.rtp` | | `/tpreload` | Reload the configuration | `teleport.admin` |
> If `permissions: false` in `config.yml`, all player commands are accessible without permission. Admin commands always require OP or `teleport.admin`.
---
🔒 Permissions
| Permission | Description | Default | |-----------|-------------|---------| | `teleport.tpa` | Use /tpa | `true` | | `teleport.tpahere` | Use /tpahere | `true` | | `teleport.tpaccept` | Use /tpaccept | `true` | | `teleport.tpdeny` | Use /tpdeny | `true` | | `teleport.tpcancel` | Use /tpcancel | `true` | | `teleport.tptoggle` | Use /tptoggle | `true` | | `teleport.home` | Use /home | `true` | | `teleport.sethome` | Use /sethome | `true` | | `teleport.delhome` | Use /delhome | `true` | | `teleport.warp` | Use /warp | `true` | | `teleport.warps` | Use /warps | `true` | | `teleport.setwarp` | Create/edit a warp | `op` | | `teleport.delwarp` | Delete any warp | `op` | | `teleport.spawn` | Use /spawn | `true` | | `teleport.back` | Use /back | `true` | | `teleport.rtp` | Use /rtp | `true` | | `teleport.cooldown.bypass` | Ignore teleportation cooldown | `op` | | `teleport.home.multiple.<n>` | Have up to `n` homes (e.g. `.5`, `.10`) | — | | `teleport.admin` | All admin permissions | `op` |
---
💬 Messages — `messages.yml`
All messages use Adventure's MiniMessage format. You can use colors, effects, clickable links, and more.
Available placeholders:
| Placeholder | Description | |------------|-------------| | `<player>` | A player's name | | `<home>` | A home name | | `<warp>` | A warp name | | `<delay>` | Delay in seconds | | `<max>` | Maximum limit | | `<remaining>` | Remaining seconds (cooldown) | | `<usage>` | Command syntax |
MiniMessage customization examples: ```yaml
Colors
teleport-success: "<green>Teleportation successful!"
Gradient color
tpa-sent: "<gradient:#55ff55:#00aa00>Request sent to <player></gradient>"
Bold text with emoji
teleport-pending: "<gold><bold>⏳ Teleporting in <delay>s... Don't move!</bold>"
Clickable link (already used for TPA buttons)
tpa-received-buttons: "<green><click:run_command:/tpaccept>[Accept]</click>" ```
---
🏗️ Building from source
Requirements: Java 21, Maven 3.8+
```bash git clone https://github.com/crafteria-dev/EasyTPA.git cd EasyTPA mvn package ```
The compiled JAR is located at `target/easytpa-1.0.0.jar`.
---
📁 Project structure
``` src/main/java/fr/easytpa/ ├── EasyTPA.java # Main class, initialization ├── commands/ # One file per command (17 commands) │ ├── TpaCommand.java │ ├── TpaHereCommand.java │ ├── TpAcceptCommand.java │ ├── TpDenyCommand.java │ ├── TpCancelCommand.java │ ├── TpToggleCommand.java │ ├── HomeCommand.java │ ├── SetHomeCommand.java │ ├── DelHomeCommand.java │ ├── WarpCommand.java │ ├── SetWarpCommand.java │ ├── DelWarpCommand.java │ ├── WarpsCommand.java │ ├── SpawnCommand.java │ ├── SetSpawnCommand.java │ ├── BackCommand.java │ ├── RtpCommand.java │ └── TpReloadCommand.java ├── managers/ # Business logic and persistence │ ├── ConfigManager.java # config.yml reader │ ├── MessageManager.java # MiniMessage + prefix │ ├── TpaManager.java # TPA requests, timeout, toggle │ ├── TeleportDelayManager.java # Delay, anti-movement, cooldown │ ├── CooldownManager.java # Global per-player cooldown │ ├── HomeManager.java # Homes (homes.yml) │ ├── WarpManager.java # Warps (warps.yml) │ ├── SpawnManager.java # Spawn (spawn.yml) │ └── BackManager.java # Previous position (in-memory) ├── listeners/ │ └── TeleportListener.java # PlayerMove, PlayerDeath, PlayerQuit └── utils/ ├── LocationUtils.java # YAML serialization, safety checks └── PermissionUtils.java # Player/admin permission checks
src/main/resources/ ├── plugin.yml # Command and permission declarations ├── config.yml # Main configuration └── messages.yml # Customizable messages ```
---
🔧 Internal workings
Teleportation flow
1. The command (e.g. `/home spawn`) calls `TeleportDelayManager.scheduleTeleport()` 2. The cooldown is checked — if active, a message is sent and the request is dropped 3. The anti-movement delay starts (`teleport-delay` seconds) 4. If the player moves → cancellation (`PlayerMoveEvent`) 5. Otherwise → `executeTeleport()`: saves the position for `/back`, calls `player.teleportAsync()` asynchronously 6. On success → the cooldown is updated, the callback sends the success message
Warp system
- Each warp stores the creator's UUID (`warps.yml`) - A player can only delete or overwrite their own warps - Admins (`teleport.admin` or OP) can manage all warps - The `max-warps` limit is per player (not global)
Random teleportation (/rtp)
- Generates coordinates within a ring between `rtp-min-radius` and `rtp-radius` - Uses `world.getChunkAtAsync()` to load chunks without blocking the server - Checks position safety (2 air blocks, solid ground, no magma/campfire) - Retries up to `rtp-max-attempts` times if the position is not safe
---
📜 License
This project is licensed under the Fair Core License (FCL).
- ✅ without authorization for personal use and non-commercial servers - ✅ Modification and redistribution of source code without authorization - ❌ without authorization (revenue generation) without authorization is prohibited
For any commercial inquiry, contact ZO3N on GitHub.
---
github.com/crafteria-dev/EasyTPA
French Description
> 💡 devez Ce plugin est gratuit pour les particuliers. > Si vous êtes une entreprise ou que vous générez des revenus avec ce plugin, > vous devez me contacter pour obtenir une autorisation.
✨ Fonctionnalités
- Warps cliquables — `/tpa`, `/tpahere`, `/tpaccept`, `/tpdeny`, `/tpcancel`, `/tptoggle` - Warps cliquables — `/home`, `/sethome`, `/delhome` avec limite par joueur et tiers de permissions - Warps cliquables — `/warp`, `/setwarp`, `/delwarp`, `/warps` avec propriété par joueur et liste cliquable - Warps cliquables — `/spawn`, `/setspawn` - Warps cliquables — `/back` (position précédente ou lieu de mort configurable) - Warps cliquables — `/rtp` (alias `/wild`) avec chargement async des chunks - Warps cliquables — `/tpreload` - Warps cliquables configurable entre deux téléportations (bypass par permission) - Warps cliquables — la téléportation est annulée si le joueur bouge - Warps cliquables configurable — les demandes expirent automatiquement - Warps cliquables — désactivable pour les serveurs sans plugin de perms - Warps cliquables — format MiniMessage, couleurs, hover, click - Warps cliquables dans le chat avec `/warps`
---
📦 Installation
1. Télécharger `easytpa-1.0.0.jar` depuis les Releases 2. Placer le fichier dans le dossier `plugins/` de votre serveur Paper 3. Démarrer (ou redémarrer) le serveur 4. Modifier `plugins/EasyTPA/config.yml` et `messages.yml` selon vos besoins 5. Recharger avec `/tpreload` (inutile de redémarrer)
> Requis : Paper 26.1.2+ — Java 25+
---
⚙️ Configuration — `config.yml`
```yaml
false → tout le monde peut utiliser les commandes joueur sans permission
true → vérifie les permissions (compatible LuckPerms et tout plugin Bukkit)
permissions: false
Délai avant téléportation (secondes). 0 pour désactiver.
Le joueur ne doit pas bouger, sinon la téléportation est annulée.
teleport-delay: 3
Durée (secondes) avant expiration d'une demande TPA
tpa-timeout: 60
Cooldown global entre deux téléportations (secondes). 0 pour désactiver.
Contourne avec : teleport.cooldown.bypass
teleport-cooldown: 30
/back peut ramener au lieu de mort si true
back-on-death: true
Nombre maximum de homes par joueur
Si permissions: true, extensible via teleport.home.multiple.<nombre>
max-homes: 1
Nombre maximum de warps par joueur
max-warps: 5
Rayon maximum (blocs) pour /rtp
rtp-radius: 5000
Rayon minimum (blocs) pour /rtp (évite le spawn)
rtp-min-radius: 100
Tentatives maximum pour trouver une position sûre pour /rtp
rtp-max-attempts: 20
Préfixe des messages (format MiniMessage)
messages-prefix: "<dark_gray>[<aqua>EasyTPA<dark_gray>]<reset> " ```
---
📋 Commandes
| Commande | Description | Permission requise | |----------|-------------|-------------------| | `/tpa <joueur>` | Demander à se téléporter à un joueur | `teleport.tpa` | | `/tpahere <joueur>` | Demander à un joueur de venir à vous | `teleport.tpahere` | | `/tpaccept` | Accepter une demande TPA | `teleport.tpaccept` | | `/tpdeny` | Refuser une demande TPA | `teleport.tpdeny` | | `/tpcancel` | Annuler votre demande en attente | `teleport.tpcancel` | | `/tptoggle` | Activer/désactiver la réception de demandes | `teleport.tptoggle` | | `/home [nom]` | Se téléporter à un home | `teleport.home` | | `/sethome [nom]` | Définir un home à votre position | `teleport.sethome` | | `/delhome [nom]` | Supprimer un home | `teleport.delhome` | | `/warp <nom>` | Se téléporter à un warp | `teleport.warp` | | `/setwarp <nom>` | Créer/modifier un warp | `teleport.setwarp` | | `/delwarp <nom>` | Supprimer un warp | Créateur du warp ou admin | | `/warps` | Lister les warps (cliquables) | `teleport.warps` | | `/spawn` | Se téléporter au spawn | `teleport.spawn` | | `/setspawn` | Définir le spawn | `teleport.admin` | | `/back` | Retourner à la position précédente | `teleport.back` | | `/rtp` ou `/wild` | Téléportation aléatoire sûre | `teleport.rtp` | | `/tpreload` | Recharger la configuration | `teleport.admin` |
> Si `permissions: false` dans `config.yml`, toutes les commandes joueur sont accessibles sans permission. Les commandes admin nécessitent toujours OP ou `teleport.admin`.
---
🔒 Permissions
| Permission | Description | Défaut | |-----------|-------------|--------| | `teleport.tpa` | Utiliser /tpa | `true` | | `teleport.tpahere` | Utiliser /tpahere | `true` | | `teleport.tpaccept` | Utiliser /tpaccept | `true` | | `teleport.tpdeny` | Utiliser /tpdeny | `true` | | `teleport.tpcancel` | Utiliser /tpcancel | `true` | | `teleport.tptoggle` | Utiliser /tptoggle | `true` | | `teleport.home` | Utiliser /home | `true` | | `teleport.sethome` | Utiliser /sethome | `true` | | `teleport.delhome` | Utiliser /delhome | `true` | | `teleport.warp` | Utiliser /warp | `true` | | `teleport.warps` | Utiliser /warps | `true` | | `teleport.setwarp` | Créer/modifier un warp | `op` | | `teleport.delwarp` | Supprimer n'importe quel warp | `op` | | `teleport.spawn` | Utiliser /spawn | `true` | | `teleport.back` | Utiliser /back | `true` | | `teleport.rtp` | Utiliser /rtp | `true` | | `teleport.cooldown.bypass` | Ignorer le cooldown de téléportation | `op` | | `teleport.home.multiple.<n>` | Avoir jusqu'à `n` homes (ex: `.5`, `.10`) | — | | `teleport.admin` | Toutes les permissions admin | `op` |
---
💬 Messages — `messages.yml`
Tous les messages utilisent le format MiniMessage d'Adventure. Vous pouvez utiliser des couleurs, effets, liens cliquables, etc.
Placeholders disponibles :
| Placeholder | Description | |------------|-------------| | `<player>` | Nom d'un joueur | | `<home>` | Nom d'un home | | `<warp>` | Nom d'un warp | | `<delay>` | Délai en secondes | | `<max>` | Limite maximale | | `<remaining>` | Secondes restantes (cooldown) | | `<usage>` | Syntaxe de la commande |
Exemples de personnalisation MiniMessage : ```yaml
Couleurs
teleport-success: "<green>Téléportation effectuée !"
Couleur dégradée
tpa-sent: "<gradient:#55ff55:#00aa00>Demande envoyée à <player></gradient>"
Texte en gras avec emoji
teleport-pending: "<gold><bold>⏳ Téléportation dans <delay>s... Ne bougez pas !</bold>"
Lien cliquable (déjà utilisé pour les boutons TPA)
tpa-received-buttons: "<green><click:run_command:/tpaccept>[Accepter]</click>" ```
---
🏗️ Compilation depuis les sources
Prérequis : Java 25, Maven 3.8+
```bash git clone https://github.com/crafteria-dev/EasyTPA.git cd EasyTPA mvn package ```
Le JAR compilé se trouve dans `target/easytpa-1.0.0.jar`.
---
📁 Structure du projet
``` src/main/java/fr/easytpa/ ├── EasyTPA.java # Classe principale, initialisation ├── commands/ # Un fichier par commande (17 commandes) │ ├── TpaCommand.java │ ├── TpaHereCommand.java │ ├── TpAcceptCommand.java │ ├── TpDenyCommand.java │ ├── TpCancelCommand.java │ ├── TpToggleCommand.java │ ├── HomeCommand.java │ ├── SetHomeCommand.java │ ├── DelHomeCommand.java │ ├── WarpCommand.java │ ├── SetWarpCommand.java │ ├── DelWarpCommand.java │ ├── WarpsCommand.java │ ├── SpawnCommand.java │ ├── SetSpawnCommand.java │ ├── BackCommand.java │ ├── RtpCommand.java │ └── TpReloadCommand.java ├── managers/ # Logique métier et persistance │ ├── ConfigManager.java # Lecture de config.yml │ ├── MessageManager.java # MiniMessage + préfixe │ ├── TpaManager.java # Demandes TPA, timeout, toggle │ ├── TeleportDelayManager.java # Délai, anti-mouvement, cooldown │ ├── CooldownManager.java # Cooldown global par joueur │ ├── HomeManager.java # Homes (homes.yml) │ ├── WarpManager.java # Warps (warps.yml) │ ├── SpawnManager.java # Spawn (spawn.yml) │ └── BackManager.java # Position précédente (mémoire) ├── listeners/ │ └── TeleportListener.java # PlayerMove, PlayerDeath, PlayerQuit └── utils/ ├── LocationUtils.java # Sérialisation YAML, vérification sécurité └── PermissionUtils.java # Vérification permissions joueur/admin
src/main/resources/ ├── plugin.yml # Déclaration commandes et permissions ├── config.yml # Configuration principale └── messages.yml # Messages personnalisables ```
---
🔧 Fonctionnement interne
Flux d'une téléportation
1. La commande (ex: `/home spawn`) appelle `TeleportDelayManager.scheduleTeleport()` 2. Le cooldown est vérifié — si actif, message et abandon 3. Le délai anti-mouvement démarre (`teleport-delay` secondes) 4. Si le joueur bouge → annulation (`PlayerMoveEvent`) 5. Sinon → `executeTeleport()` : sauvegarde la position pour `/back`, appel async `player.teleportAsync()` 6. En cas de succès → le cooldown est mis à jour, le callback envoie le message de succès
Système de warps
- Chaque warp enregistre l'UUID du créateur (`warps.yml`) - Un joueur ne peut supprimer ou écraser que ses propres warps - Les admins (`teleport.admin` ou OP) peuvent gérer tous les warps - La limite `max-warps` est par joueur (pas globale)
Téléportation aléatoire (/rtp)
- Génère des coordonnées dans un anneau entre `rtp-min-radius` et `rtp-radius` - Utilise `world.getChunkAtAsync()` pour charger les chunks sans bloquer le serveur - Vérifie la sécurité de la position (2 blocs d'air, sol solide, pas de magma/feu de camp) - Réessaie jusqu'à `rtp-max-attempts` fois si la position n'est pas sûre
---
📜 Licence
Ce projet est sous licence Fair Core License (FCL).
- ✅ Utilisation sans autorisation pour usage personnel et serveurs non commerciaux - ✅ Modification et redistribution du code source sans autorisation - ❌ Utilisation sans autorisation (génération de revenus) sans autorisation interdite
Pour toute demande commerciale, contactez ZO3N sur GitHub.
---
github.com/crafteria-dev/EasyTPA