le forum de MineStrator

Nous ne cherchons pas à être un forum, mais le forum de référence pour les administrateurs et joueurs de serveurs minecraft, la communauté a besoin de toi, alors n'hésite pas à t'inscrire et à participer à la vie du forum !

[Java] Créer un cooldown

Maxlego08

Membre
Bienvenue sur ce tutoriel qui va vous expliquer comment créer un système de cooldown en java.
Pour cela je vais vous montrer comment créer 2 class, un CooldownBuilder et TimerBuilder.


La première va servir au stockage des cooldowns et la deuxième va servir à les afficher
I] Création de CooldownBuilder.


Premièrement vous devez créer une HashMap qui va servir de stocker les cooldown de chaque joueurs.
Java:
public static HashMap<String, HashMap<UUID, Long>> cooldown = new HashMap<>();

Comme vous pouvez le voir il y a une autre HashMap dans la première, c'est pour tout simplement avec différents cooldown, donc un joueur peux être en cooldown pour l'objet A mais pas pour l'objet B.

Java:
public static void createCooldown(String cooldown) {

}

Comme vous pouvez le voir nous avons mis un String dans le constructeur pour tout simplement ajouter différents cooldown en fonction d'un nom avec un String, comme par exemple "randomTp" ou bien "pommeCheat", vous pouvez créer autant de cooldown que vous le souhaitez !
Il suffit d'ajouter de cooldown dans notre HasMap
Java:
public static void createCooldown(String cooldown) {
    if (cooldown.containsKey(s)) {
        throw new IllegalArgumentException("Ce cooldown existe déjà.");
    }

    cooldown.put(s, new HashMap<>());
}
Ici on vérifie si le cooldown existe déjà ou non pour éviter toutes erreurs.


Maintenant que nous avons créé le cooldown nous allons créer une méthode addCooldown().
Java:
public static void addCooldown(String s, Player joueur, int seconds) throws IOException {
    if (!cooldown.containsKey(s)) {
        throw new IllegalArgumentException(String.valueOf(s) + " n'existe pas.");
    }

    long next = System.currentTimeMillis() + seconds * 1000L;
    (cooldown.get(s)).put(joueur.getUniqueId(), Long.valueOf(next));
}
Ici, vous avez 3 paramètres, un String pour le type de cooldown, un Player pour mettre le joueur et un int pour le temps du cooldown (en secondes).
On vérifie ensuite si le type de cooldown existe, puis on transforme le temps en long. On récupère les millisecondes puis on multiplie par 1000 les secondes.
On ajoute ensuite dans la HashMap le joueur et le long.

Créons maintenant deux fonctions, une pour vérifier si le joueur est en cooldown et une autre pour récupérer le cooldown du joueur.

Commençons par la première fonction, isCooldown().
Java:
public static boolean isCooldown(String s, Player joueur) {
    return (cooldown.containsKey(s)) && ((cooldown.get(s)).containsKey(joueur.getUniqueId())) && (System.currentTimeMillis() <= ((Long) (cooldown.get(s)).get(joueur.getUniqueId())).longValue());
}
Ici nous faisons plusieurs vérification, en premier, on vérifie si le cooldown existe, ensuite on vérifie que la HashMap contient le joueur puis nous vérifions si les millisecondes sont inférieurs ou égales au cooldown du joueur, si cette dernière vérification est vrai alors le return sera un true.[/COLOR]

Passons maintenant à la deuxième fonction, getCooldownPlayerLong().
Java:
public static long getCooldownPlayerLong(String s, Player joueur) {
    return ((Long)(Cooldown.get(s)).get(joueur.getUniqueId())).longValue() - System.currentTimeMillis();
}
Ici nous récupérons tous simplement le cooldown du joueur en long.

Maintenant il vous suffit de mettre dans votre méthode principale la méthode pour créer un cooldown.

II] Création de TimerBuilder

Pour ici je vais directement vous donner toute la class
Java:
public class TimerBuilder {
    public static String getFormatLongHours(long temps) {
        long totalSecs = temps / 1000L;
        return String.format("%02d heure(s) %02d minute(s) %02d seconde(s)", new Object[]{Long.valueOf(totalSecs / 3600L), Long.valueOf(totalSecs % 3600L / 60L), Long.valueOf(totalSecs % 60L)});
    }

    public static String getFormatLongMinutes(long temps) {
        long totalSecs = temps / 1000L;
        return String.format("%02d minute(s) %02d seconde(s)", new Object[]{Long.valueOf(totalSecs % 3600L / 60L), Long.valueOf(totalSecs % 60L)});
    }

    public static String getFormatLongSecondes(long temps) {
        long totalSecs = temps / 1000L;
        return String.format("%02d seconde(s)", new Object[]{Long.valueOf(totalSecs % 60L)});
    }
}

Ici vous avez tous simplement 3 fonctions qui récupèrent le temps du joueur en un String.

III] Exemple d'utilisation.

Pour vous montrer comment utiliser ces deux builders je vais vous prendre en exemple un RandomTp.
Java:
public class CommandRtp extends VCommand {
    public CommandRtp() {
        super(null, true);
        this.getCommands().add("rtp");
        this.getCommands().add("randomtp");
        CooldownBuilder.createCooldown("Randomtp");
    }

    @Override
    protected CommandType runCommand(Main main, CommandSender sender, String... args) {
        if (CooldownBuilder.isCooldown("Randomtp", (Player) sender)) {
            sender.sendMessage(main.getArrow() + " §7Vous devez attendre§7: " + TimerBuilder.getFormatLongHours(CooldownBuilder.getCooldownPlayerLong("Randomtp", (Player) sender)));
            return CommandType.SUCCESS;
        }

        new BukkitRunnable() {
            int t = 5;
            Player p = (Player) sender;
            Location l = p.getLocation();

            @Override
            public void run() {

                if (l.getBlockX() == p.getLocation().getBlockX() &&
                        l.getBlockY() == p.getLocation().getBlockY() &&
                        l.getBlockZ() == p.getLocation().getBlockZ()) {
                    sender.sendMessage(main.getArrow() + " §7Téléportation aléatorie dans §a" + t + "§7 secondes.");

                } else {
                    cancel();
                    sender.sendMessage(main.getArrow() + " §7Vous ne devez pas bouger !");
                }

                if (t == 0) {
                    cancel();
                    Random random = new Random();
                    World world = Bukkit.getWorld("world");

                    try {
                        CooldownBuilder.addCooldown("Randomtp", p, 3600 * 2);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    int x = random.nextInt(1500 - -2500 + 1) + -2000;

                    if (x < 0) {
                        x = x - 500;
                    }

                    if (x > 0) {
                        x = x + 500;
                    }

                    int z = random.nextInt(1500 - -2500 + 1) + -2000;
                    if (z > 0) {

                        z = z + 500;
                    }

                    if (z < 0) {

                        z = z - 500;
                    }

                    int y = 64;

                    p.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 60, 60));
                    Location aleatoire = new Location(world, x, y, z);

                    while (aleatoire.getBlock().getType() != Material.AIR) {
                        y++;
                        aleatoire = new Location(world, x, y, z);
                    }

                    p.teleport(aleatoire);
                    sender.sendMessage(main.getArrow() + " §7Téléportation en §a" + aleatoire.getBlockX() + "§7, §a" + aleatoire.getBlockY() + "§7, §a" + aleatoire.getBlockZ());
                }
                t--;
            }
        }.runTaskTimer(main, 0L, 20L);

        return CommandType.SUCCESS;
    }

    @Override
    public String getPermission() {
        return null;
    }

    @Override
    public String getSyntax() {
        return null;
    }

    @Override
    public String getDescription() {
        return null;
    }
}

Donc je vous balance directement le code pour aller plus vite dans l'explication.
Premièrement la commande est différente du système de base mais ça ce n'est pas le but du tuto.


Comme vous pouvez le voir dans le constructeur de la class j'ai mis la fonction createCooldown pour enregistrer le cooldown "RandomTp".

Ensuite dans la commande je vérifie si le joueur est en cooldown avec le "RandomTp"
Si il est en cooldown alors je lui envoie un message avec l'utilisation de la fonction gerFormatLongHours de TimerBuilder.

Reprenons ce code
Java:
TimerBuilder.getFormatLongHours(CooldownBuilder.getCooldownPlayerLong("Randomtp", (Player)sender))
Cette fonction nous demande un long donc nous récupérons le long du joueur tout simplement.


Ensuite j'effectue la vérification pour la téléportation random, voir si le joueur bouge ou pas. Quand la téléportation se fait j'ajoute le joueur en cooldown. Il faut bien penser que le temps est en seconde ! Donc 3600 * 2 cela fait 2 heures !
Java:
try {
    CooldownBuilder.addCooldown("Randomtp", p, 3600 * 2);
} catch (IOException e) {
    e.printStackTrace();
}
Il faut mettre ça en try catch car nous avons mis la méthode addCooldown en throws IOException.


Voila je pense avoir tous montré dans ce tuto, je tiens à dire que ces deux builders ne sont pas de moi, un ami me l'a donné il y a plus d'un an et je ne sais pas vraiment qui l'a créé.
Pensez au petit like si ce petit tuto vous a aidé !






 
Dernière édition par un modérateur:

DocVander

Membre
Salut, désoler je vais te corriger sur certain point:
la méthode addCouldown ne peut pas throw IOException donc ça se sert a rien de la mettre et tu évite un try catch inutile, cette exception veut dire input output exception, elle est utiliser dans les accées aux stream.
Ensuite, c'est HashMap, pas HasMap.
 
Auteur
Auteur
Maxlego08

Maxlego08

Membre

Acenox

Membre
Me dire ça sert totalement à rien, je suis dysorthographique, je ne voie pas se genre de fautes.
Sachant qu'on est sur un forum, on n'est pas dans un cours d'orthographe, du moment que c'est lisible ;)
 

Iban_

Membre
C'était pas pour être méchant mais pour rendre la lecture de tes futur messages plus agréable pour tes lecteurs.
T'arrive à apprendre un langage informatique en autodidacte, je suis sûr qu'avec un peu de volonté t'arriverais à combler tes lacunes en français sans problème.
Puis il y a des astuces très simples pour ne pas faire ces fautes. Si ton prof de primaire ne te les a pas enseignés, tu en trouveras sur google^^
Par exemple quand tu vois un mot en -é, tu remplace dans ta tête par un autre verbe (exemple : Prendre) , si t'obtient "prendre" c'est l'infinitif(-er), alors que si t'obtient "pris", c'est le participe passé (-é(e)(s)).

Bref rien à voir avec le post, désolé de t'avoir dérangé.
 
Auteur
Auteur
Maxlego08

Maxlego08

Membre
C'était pas pour être méchant mais pour rendre la lecture de tes futur messages plus agréable pour tes lecteurs.
T'arrive à apprendre un langage informatique en autodidacte, je suis sûr qu'avec un peu de volonté t'arriverais à combler tes lacunes en français sans problème.
Puis il y a des astuces très simples pour ne pas faire ces fautes. Si ton prof de primaire ne te les a pas enseignés, tu en trouveras sur google^^
Par exemple quand tu vois un mot en -é, tu remplace dans ta tête par un autre verbe (exemple : Prendre) , si t'obtient "prendre" c'est l'infinitif(-er), alors que si t'obtient "pris", c'est le participe passé (-é(e)(s)).

Bref rien à voir avec le post, désolé de t'avoir dérangé.
pour le é, je fais avec mordre x), sinon j'ai jamais étais fan du français (et les profs non plus, genre mon ancienne prof de français ma écrit sur une copie "Vous n'y arriverais jamais", puis elle est morte (j'ai rien fais whalla))
Et je sais que je devrais essayer de faire quelque chose pour ça.
 

julfit

Membre
salut désoler de relancer se forum longtemp apres mais je vien de tomber dessu et j'ai deux trois souci dans le code j'ai des "s" qui pause probleme et un "Cooldown" aussi.

ps: mon plugin est en 1.16
 

Haut