diff --git a/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java b/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java index 086459f8b..9e886cadd 100644 --- a/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java +++ b/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java @@ -16,13 +16,13 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; import revxrsal.commands.annotation.Command; import revxrsal.commands.annotation.Cooldown; import revxrsal.commands.annotation.Description; import revxrsal.commands.bukkit.annotation.CommandPermission; import java.io.File; +import java.util.concurrent.ThreadLocalRandom; import static net.kyori.adventure.text.format.NamedTextColor.YELLOW; @@ -56,7 +56,7 @@ private void loadRTPConfig() { @Description("Permet de se téléporter à un endroit aléatoire") @CommandPermission("omc.commands.rtp") @DynamicCooldown( - group="player:rtp", + group = "player:rtp", messageKey = "command.utils.rtp.must_wait") @Cooldown(15) public void rtp(Player player) { @@ -66,57 +66,55 @@ public void rtp(Player player) { } private void rtpPlayer(Player player, int tries) { - new BukkitRunnable() { - @Override - public void run() { - if (tryRtp(player)) - return; - - if ((tries + 1) >= maxTries) { - // On a déjà mis le cooldown au début - player.sendActionBar(TranslationManager.translation("command.utils.rtp.fail")); - return; - } - - player.sendActionBar(TranslationManager.translation("command.utils.rtp.try", - Component.text(tries + 1), - Component.text(maxTries))); - - new BukkitRunnable() { - @Override - public void run() { - rtpPlayer(player, tries + 1); + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + int[] coords = generateRandomCoords(); + int chunkX = coords[0] >> 4; + int chunkZ = coords[1] >> 4; + + World world = player.getWorld(); + + world.getChunkAtAsync(chunkX, chunkZ).thenAccept(_ -> { + Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> { + Location loc = world.getHighestBlockAt(coords[0], coords[1]).getLocation(); + + if (isSafe(loc)) { + loc.add(0.5, 1, 0.5); + tpPlayer(player, loc); + return; } - }.runTaskLaterAsynchronously(OMCPlugin.getInstance(), 20); - } - }.runTaskAsynchronously(OMCPlugin.getInstance()); - } + int nextTry = tries + 1; + if (nextTry >= maxTries) { + // On a déjà mis le cooldown au début + player.sendActionBar(TranslationManager.translation("command.utils.rtp.fail")); + return; + } - public boolean tryRtp(Player player) { - Location loc = generateRandomLocation(player.getWorld()); - if (isSafe(loc)) { - loc.add(0.5, 1, 0.5); - tpPlayer(player, loc); - return true; - } else { - return false; - } - } + player.sendActionBar(TranslationManager.translation("command.utils.rtp.try", + Component.text(nextTry), + Component.text(maxTries))); - public boolean isSafe(Location loc) { - return loc.getBlock().isSolid() && loc.getBlockY() > 50; + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), + () -> rtpPlayer(player, nextTry), 20L); + }); + }); + }); } - public Location generateRandomLocation(World world) { - int radius = (int) (Math.random() * (maxRadius - minRadius + 1)) + minRadius; - float angle = (float) (Math.random() * 2 * Math.PI); + private int[] generateRandomCoords() { + ThreadLocalRandom random = ThreadLocalRandom.current(); + int radius = random.nextInt(minRadius, maxRadius + 1); + double angle = random.nextDouble() * 2 * Math.PI; int x = (int) (Math.cos(angle) * radius); int z = (int) (Math.sin(angle) * radius); - return world.getHighestBlockAt(x, z).getLocation(); + return new int[]{x, z}; + } + + private boolean isSafe(Location loc) { + return loc.getBlock().isSolid() && loc.getBlockY() > 50; } - public void tpPlayer(Player player, Location loc) { + private void tpPlayer(Player player, Location loc) { PlayerUtils.sendFadeTitleTeleport(player, loc); MessagesManager.sendMessage(player, TranslationManager.translation("command.utils.rtp.success", Component.text(loc.getBlockX()).color(YELLOW), @@ -127,5 +125,4 @@ public void tpPlayer(Player player, Location loc) { DynamicCooldownManager.use(player.getUniqueId(), "player:rtp", rtpCooldown * 1000L) ); } - }