diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java index 023443147788d34ddb2e5a89ca68ed233776f85b..4ad6029f51652421c164e123a2494b02ebabb26e 100644 --- a/src/main/java/com/slprojects/slcraftplugin/Main.java +++ b/src/main/java/com/slprojects/slcraftplugin/Main.java @@ -59,7 +59,7 @@ public final class Main extends JavaPlugin implements Listener { // On initialise les listeners getServer().getPluginManager().registerEvents(this, this); } else { - getServer().getConsoleSender().sendMessage(ChatColor.RED+"[\"+ this.getName() +\"] PlaceholderAPI n'est pas accessible!"); + getServer().getConsoleSender().sendMessage(ChatColor.RED+"["+ this.getName() +"] PlaceholderAPI n'est pas accessible!"); getServer().getPluginManager().disablePlugin(this); } @@ -89,12 +89,11 @@ public final class Main extends JavaPlugin implements Listener { // On initialise la base de donnée initDatabase(); - wildCommandActiveUsers = new ArrayList<>(); wildCommand wildCommand = new wildCommand(this); - Objects.requireNonNull(getCommand("wild")).setExecutor(wildCommand); + getCommand("wild").setExecutor(wildCommand); linkCodeCommand linkCodeCommand = new linkCodeCommand(this); - Objects.requireNonNull(getCommand("getLinkCode")).setExecutor(linkCodeCommand); + getCommand("getLinkCode").setExecutor(linkCodeCommand); internalWebServer.startServer(this); @@ -268,26 +267,6 @@ public final class Main extends JavaPlugin implements Listener { sendMessageToDiscord(message, "SL-Craft"); } - // Propre à la commande wild: évite les spams de la commande - public boolean checkActiveUserForWildCommand(UUID playerUuid){ - if(wildCommandActiveUsers.contains(playerUuid)){ - return false; - }else{ - wildCommandActiveUsers.add(playerUuid); - return true; - } - } - public void removeActiveUserForWildCommand(UUID playerUuid){ - if(wildCommandActiveUsers.contains(playerUuid)){ - try { - TimeUnit.SECONDS.sleep(5); - } catch (InterruptedException e) { - e.printStackTrace(); - } - wildCommandActiveUsers.remove(playerUuid); - } - } - public Connection bddOpenConn() { // si mot de passe avec des caractère spéciaux Connection conn=null; try { @@ -310,11 +289,26 @@ public final class Main extends JavaPlugin implements Listener { private void updateConfig(){ getLogger().info("Vérification du fichier de configuration..."); - // On va vérifier si l'on dispose de la nouvelle variable du port du serveur web + // 1.6.0 if(!config.contains("server-type")){ getLogger().info("Ajout de la variable serverType dans le fichier de configuration..."); config.set("server-type", "dev"); + saveConfig(); + reloadConfig(); + } + + if(config.contains("wild") && (config.contains("excluded-biomes") && config.contains("world") && config.contains("max-range"))){ + getLogger().info("Mise à jour des paramètres concernant la commande /wild"); + + config.set("wild.excluded-biomes", config.get("excluded-biomes")); + config.set("wild.world", config.get("world")); + config.set("wild.max-range", config.get("max-range")); + + config.set("excluded-biomes", null); + config.set("world", null); + config.set("max-range", null); + config.options().copyDefaults(true); saveConfig(); reloadConfig(); diff --git a/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java b/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java index c36e6f6f2fdf4371a60bfe335ba956af0408a805..e20b4f4f1e3e0c5467a0596c0263ba55582c6b7d 100644 --- a/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java +++ b/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java @@ -9,22 +9,39 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.Objects; -import java.util.Random; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; import static java.lang.Math.abs; public class wildCommand implements CommandExecutor { + // Variables private final Main plugin; + private List<UUID> wildUsersIndexes; + private List<LocalDateTime> wildUsersLastAsked; + private List<Integer> wildUsersAskNum; + private List<Location> wildUsersStartLocation; + private final int usageCooldown; + private final int usagePerDay; public wildCommand(Main plugin){ // On récupère la classe parente pour les paramètres this.plugin = plugin; + wildUsersIndexes = new ArrayList<>(); + wildUsersLastAsked = new ArrayList<>(); + wildUsersAskNum = new ArrayList<>(); + wildUsersStartLocation = new ArrayList<>(); + usageCooldown = plugin.getConfig().getInt("wild.usage-cooldown"); + usagePerDay = plugin.getConfig().getInt("wild.usage-per-day"); + + plugin.getServer().getConsoleSender().sendMessage("Instance de wild."); } @Override @@ -33,8 +50,35 @@ public class wildCommand implements CommandExecutor { // On vérifie que la commande a bien été lancée par un joueur if (sender instanceof Player) { Player player = (Player) sender; + UUID playerUUID = player.getUniqueId(); + int playerIndex; + LocalDateTime dateTimeNow = LocalDateTime.now(); + + if(wildUsersIndexes.contains(playerUUID)){ + playerIndex = wildUsersIndexes.indexOf(playerUUID); + + if(abs(ChronoUnit.SECONDS.between(wildUsersLastAsked.get(playerIndex), dateTimeNow)) > usageCooldown){ + if(wildUsersAskNum.get(playerIndex) < usagePerDay){ + wildUsersLastAsked.set(playerIndex, dateTimeNow); + wildUsersStartLocation.set(playerIndex, player.getLocation()); + askForTeleport(player); + }else{ + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé"); + player.sendMessage("§cVous n'avez le droit qu'à §n"+usagePerDay+"§r§c téléportations aléatoires par jour."); + } + }else{ + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] 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 §n"+usageCooldown+"s§r§c avant de relancer la commande."); + } + }else{ + wildUsersIndexes.add(playerUUID); + wildUsersLastAsked.add(dateTimeNow); + wildUsersAskNum.add(0); + wildUsersStartLocation.add(player.getLocation()); + askForTeleport(player); + } - // On vérifie qu'il n'a pas déjà lancé la commande wild + /*// On vérifie qu'il n'a pas déjà lancé la commande wild dans les n dernières secondes 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."); @@ -44,14 +88,14 @@ public class wildCommand implements CommandExecutor { // on récupère la liste des biomes exclus List<String> excludedBiomes; - excludedBiomes = (List<String>) plugin.getConfig().getList("excluded-biomes"); + excludedBiomes = (List<String>) plugin.getConfig().getList("wild.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"); + int low = plugin.getConfig().getInt("wild.max-range")*(-1); + int high = plugin.getConfig().getInt("wild.max-range"); // Tant qu'on a un biome non souhaite, on va regérer les coordonnées boolean flag=true; @@ -60,13 +104,13 @@ public class wildCommand implements CommandExecutor { 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 = Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("wild.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()))) { + if (Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("wild.world")))).getBiome(x, y, z).equals(Biome.valueOf(excludedBiome.toUpperCase()))) { flag = true; } }catch(Exception ignored){} @@ -74,7 +118,7 @@ public class wildCommand implements CommandExecutor { } // On téléporte le joueur - Location loc = new Location(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world"))), x, y, z, 0, 0); + Location loc = new Location(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("wild.world"))), x, y, z, 0, 0); player.teleport(loc); int maxVal = Math.max(abs(x), abs(z)); @@ -93,8 +137,81 @@ public class wildCommand implements CommandExecutor { plugin.removeActiveUserForWildCommand(player.getUniqueId()); }; - new Thread(runnableRemoveActiveUser).start(); + new Thread(runnableRemoveActiveUser).start();*/ } return true; } + + private void askForTeleport(Player player){ + int playerIndex = wildUsersIndexes.indexOf(player.getUniqueId()); + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.GREEN+"accepté"); + player.sendMessage("Vous allez être téléporté dans §c" + plugin.getConfig().getInt("wild.move-cooldown") + "s§r, ne bougez pas."); + int delayInTicks = plugin.getConfig().getInt("wild.move-cooldown") * 20; + + new BukkitRunnable() { + @Override + public void run(){ + Location oldPlayerLocation = wildUsersStartLocation.get(playerIndex); + Location newPlayerLocation = player.getLocation(); + + if((oldPlayerLocation.getX() != newPlayerLocation.getX()) && (oldPlayerLocation.getY() != newPlayerLocation.getY()) && (oldPlayerLocation.getZ() != newPlayerLocation.getZ())){ + player.sendMessage("§cVous avez bougé, téléportation annulée."); + // Date bidon pour annuler le cooldown (c'est ma date de naissance :D) + wildUsersLastAsked.set(playerIndex, LocalDateTime.parse("2001-12-11 12:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + }else{ + teleportPlayer(player, playerIndex); + } + } + }.runTaskLater(plugin, delayInTicks); + } + + private void teleportPlayer(Player player, int playerIndex){ + wildUsersAskNum.set(playerIndex, wildUsersAskNum.get(playerIndex)+1); + + // on récupère la liste des biomes exclus + List<String> excludedBiomes; + excludedBiomes = (List<String>) plugin.getConfig().getList("wild.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("wild.max-range")*(-1); + int high = plugin.getConfig().getInt("wild.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 = Bukkit.getWorld(plugin.getConfig().getString("wild.world")).getHighestBlockYAt(x, z); + y++; // On incrémente la pos Y pour éviter que le joueur se retrouve dans le sol + + for (String excludedBiome : excludedBiomes) { + // Biomes non reconnus ou supprimés (deep warm ocean) + try{ + Biome.valueOf(excludedBiome.toUpperCase()); + if (Bukkit.getWorld(plugin.getConfig().getString("wild.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(plugin.getConfig().getString("wild.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"); + } + } } diff --git a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java index 8612aa21f497867c70ea25361cbb3c0f0e7cc0ab..2d9480d447a7c1275569d7874408b116e1a04912 100644 --- a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java +++ b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java @@ -18,8 +18,8 @@ public class internalWebServer { public static void startServer(Main plugin){ int serverPort = plugin.getConfig().getInt("internal-webserver-port"); - plugin.getServer().getConsoleSender().sendMessage("Lancement du serveur web intégré sur le port " + ChatColor.GOLD + serverPort); - plugin.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "Attention! Le serveur ne fonctionne pas avec les requêtes https!"); + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Lancement du serveur web intégré sur le port " + ChatColor.GOLD + serverPort); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "["+ plugin.getName() +"] Attention! Le serveur ne fonctionne pas avec les requêtes https!"); // On fait un thread pour écouter le port Runnable serverThread = () -> { try { @@ -113,7 +113,7 @@ public class internalWebServer { client.close(); // Close the socket itself } } catch (IOException e) { - plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Erreur lors de l'écoute du port " + ChatColor.GOLD + serverPort); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'écoute du port " + ChatColor.GOLD + serverPort); e.printStackTrace(); // On va logger le message sur discord @@ -125,7 +125,7 @@ public class internalWebServer { urlString = plugin.getConfig().getString("discordBot-api-url") + "mc/error/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20"); relaunchListener(plugin); } catch (UnsupportedEncodingException ex) { - plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)"); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)"); ex.printStackTrace(); } plugin.getHttp(urlString); @@ -137,7 +137,7 @@ public class internalWebServer { new Thread(serverThread).start(); } - //TODO: Vérifier l'utilité de cette fonction + // TODO: Vérifier l'utilité de cette fonction public static void relaunchListener(Main plugin) { // On relance la fonction avec une latence startServer(plugin); diff --git a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java index 4dcd682f601f47ad1f6531123d701da6cb55e31f..1331726580461f1e04260cb55f9863a23153eb94 100644 --- a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java +++ b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java @@ -61,7 +61,7 @@ public class savePlayerData { try { con.close(); } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnQuit(Player player)"); + plugin.getLogger().warning("Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnQuit(Player player)"); e.printStackTrace(); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 237af8a1f79988d42ca1d63ff56a4355a6c0f1fe..545d91fc007eab14046124467cc1264d1eac5bc4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,19 +1,22 @@ # /wild -excluded-biomes: - - cold_ocean - - deep_cold_ocean - - deep_frozen_ocean - - deep_lukewarm_ocean - - deep_ocean - - deep_warm_ocean - - frozen_ocean - - frozen_river - - lukewarm_ocean - - ocean - - river - - warm_ocean -world: survie -max-range: 20000 #14500 -> 1.17, 10000 -> 1.16 +wild: + excluded-biomes: + - cold_ocean + - deep_cold_ocean + - deep_frozen_ocean + - deep_lukewarm_ocean + - deep_ocean + - frozen_ocean + - frozen_river + - lukewarm_ocean + - ocean + - river + - warm_ocean + world: survie + max-range: 20000 #14500 -> 1.17, 10000 -> 1.16 + usage-cooldown: 30 + move-cooldown: 5 + usage-per-day: 5 # Configuration de la base de donnée database: