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.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
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<>());
}
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));
}
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());
}
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();
}
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))
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();
}
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é !
Pensez au petit like si ce petit tuto vous a aidé !
Dernière édition par un modérateur: