package com.slprojects.slcraftplugin.commandes; import com.slprojects.slcraftplugin.Main; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.block.Biome; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Objects; import java.util.Random; import static java.lang.Math.abs; public class wildCommand implements CommandExecutor { // Variables private final Main plugin; public wildCommand(Main plugin){ // On récupère la classe parente pour les paramètres this.plugin = plugin; } @Override @SuppressWarnings("unchecked") public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { // On vérifie que la commande a bien été lancée par un joueur if (sender instanceof Player) { Player player = (Player) sender; // On vérifie qu'il n'a pas déjà lancé la commande wild if(!plugin.checkActiveUserForWildCommand(player.getUniqueId())){ plugin.getServer().getConsoleSender().sendMessage("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé"); player.sendMessage("§cVous devez attendre 5s avant de relancer la commande."); return true; } plugin.getServer().getConsoleSender().sendMessage("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.GREEN+"accepté"); // on récupère la liste des biomes exclus List<String> excludedBiomes; excludedBiomes = (List<String>) plugin.getConfig().getList("excluded-biomes"); player.sendMessage("§6Téléportation vers une coordonnée aléatoire."); // On défini le radius de téléportation Random r = new Random(); int low = plugin.getConfig().getInt("max-range")*(-1); int high = plugin.getConfig().getInt("max-range"); // Tant qu'on a un biome non souhaite, on va regérer les coordonnées boolean flag=true; int x=0, z=0, y=0; while(flag){ flag=false; x = r.nextInt(high-low) + low; z = r.nextInt(high-low) + low; y = Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world")))).getHighestBlockYAt(x, z); y++; // On incrémente la pos Y pour éviter que le joueur se retrouve dans le sol for (String excludedBiome : Objects.requireNonNull(excludedBiomes)) { try{ Biome.valueOf(excludedBiome.toUpperCase()); if (Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world")))).getBiome(x, y, z).equals(Biome.valueOf(excludedBiome.toUpperCase()))) { flag = true; } }catch(Exception ignored){} } } // On téléporte le joueur Location loc = new Location(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world"))), x, y, z, 0, 0); player.teleport(loc); int maxVal = Math.max(abs(x), abs(z)); if(maxVal <= 10000){ player.sendMessage("§7§oVous êtes sur un biome généré en 1.16"); }else if(maxVal <= 14500){ player.sendMessage("§7§oVous êtes sur un biome généré en 1.17"); }else{ player.sendMessage("§7§oVous êtes sur un biome généré en 1.18"); } // Vu qu'il y a un sleep et que ça bloque le thread, on va exécuter la fonction dans un thread Runnable runnableRemoveActiveUser = () -> { // On retire le joueur de la liste des utilisateurs en attente plugin.removeActiveUserForWildCommand(player.getUniqueId()); }; new Thread(runnableRemoveActiveUser).start(); } return true; } }