Un chrono pour chaque joueur [AIDE]

Midey1901

Aventurier
9 Décembre 2022
3
0
1
20
Bonjour,

J'aimerais faire un système de chrono mais le chrono n'est pas partagé entre joueur et est propre à chacun (un peux comme le cooldown d'un /kit qui est unique au joueur).

Mon problème actuellement c'est que le même pour tous les joueurs.

Voici la classe + méthode qui me permet de compter :
public class Timer extends BukkitRunnable {
public static int time;
@Override
public void run() {
if(time <= 0) {
cancel();
}
time--;
}
}
La modification de time est faite dans d'autres classes/méthodes.
J'aimerais donc avoir 1 chrono pour chaque player.
J'utilise spigot.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Bonjour,

Veux-tu faire un compte à rebours qui exécute une action tous les certains temps ou mesurer le temps écoulé entre deux moments ?

Cordialement,
ShE3py
 

Midey1901

Aventurier
9 Décembre 2022
3
0
1
20
Bonjour,

Veux-tu faire un compte à rebours qui exécute une action tous les certains temps ou mesurer le temps écoulé entre deux moments ?

Cordialement,
ShE3py
Je voulais faire un compteur pour que les joueurs qui font certaines actions ne peuvent plus les faire pendant un certains temps, j'ai trouvé une vidéo qui explique assez bien comment faire mais merci quand même.
PS : pour ceux qui ont les mêmes soucis que moi chercher "NKRI & WINTZ cooldowns épisode 4" sur youtube vous trouverez (je sais pas si j'ai le droit de mettre des liens).
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Ça ne sert à rien d'utiliser le scheduler dans ce cas-là, tu dois utiliser une Map<UUID, Long> et mesurer le temps écoulé avec System.nanoTime() (et non System.currentTimeMillis(), qui elle n'est pas croissante).

Java:
private static final Map<UUID, Long> LAST_USE = new HashMap<>();
private static final int COOLDOWN = 5 * 1000000000 /* 1 ns */;

public static void doSomething(Player p) {
    final UUID playerId = p.getUniqueId();
   
    final long lastUse = LAST_USE.getOrDefault(playerId, 0);
    final long now = System.nanoTime();
   
    if((now - lastUse) < COOLDOWN) {
        p.sendMessage("§cAction en cooldown");
    }
    else {
        LAST_USE.put(playerId, now);
       
        // effectuer l'action
    }
}