Résolu Spigot, utilisation de bukkitRunnable ??

Booskap

Aventurier
7 Novembre 2019
10
3
3
25
Bonsoir,

Je débute en Java et j'aimerai savoir quel sont les différentes solution pour recuperer un personnage dans une classe n'implémentant pas de listener.

Je vous explique je créer un plugin de FFa assez personnaliser pour aider un petit serveur , donc il y'a un système de kits qu'il sélectionne dans une Ui d'inventaire, une fois sélectionner j'aimerai qu'il ce passe 5/10 seconde avant de changer de gamemode et qu'ils se fassent tp dans l'arène...

ps: j'ai souvent des problèmes de nullPointerExceptions avec les méthodes que j'ai essayé..

Voici le code, de la classe prenant l'event InventoryClickEvent :

Java:
case DIAMOND_SWORD:
                    p.getInventory().clear();
                 
                    if(p.getGameMode() == GameMode.SPECTATOR) {
                        TaskJoin timerj = new TaskJoin(main);
                        timerj.runTaskTimer(main, 0, 20);
                    }
                    p.setGameMode(GameMode.SURVIVAL);
                    Item helmet = new Item(Material.IRON_HELMET, 1, "§e§lCasque");
                    Item chestPlate = new Item(Material.IRON_CHESTPLATE, 1, "§e§lPlastron");
                    Item leggings = new Item(Material.IRON_LEGGINGS, 1, "§e§lLeggin");
                    Item boots = new Item(Material.IRON_BOOTS, 1, "§e§lBottes");
                    Item sword = new Item(Material.IRON_SWORD, 1, "§e§lEpee du guerrier");
                    Item gApple = new Item(Material.GOLDEN_APPLE, 6, "§e§lPomme d'or");
                 
                    p.getInventory().setHelmet(helmet.getItems());
                    p.getInventory().setChestplate(chestPlate.getItems());
                    p.getInventory().setLeggings(leggings.getItems());
                    p.getInventory().setBoots(boots.getItems());
                    p.getInventory().setItemInHand(sword.getItems());
                    p.getInventory().setItem(1, gApple.getItems());
                 
                    p.sendMessage("§7[§6Herozia§7]"+"§rSelection du kit §4§lGuerrier §ravec §a§osucces");
                 
                 
                 
                    break;
Et voici la classe du timer :
Java:
public class TaskJoin extends BukkitRunnable {

    private int timer = 5;
    private Main main;
    private OnJoinEvent onJoinEvent;
 
    public TaskJoin(Main main) {
        this.main = main;
    }

    @Override
    public void run() {
        Bukkit.broadcastMessage("t:"+timer);
        if(timer == 0) {
         
            cancel();
        }
        timer--;
    }

}

Merci d'avoir pris le temps de lire , j'attend vos réponses avec impatience !
 
Dernière édition:

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Tu n'as pas besoin d'extend ta class a BukkitRunnable. A partir du moment où tu as une instance de ta classe principale, tu peux exécuter ton runnable de la manière suivante :
Java:
public static void runnable(Player player){
        Bukkit.getScheduler().scheduleSyncRepeatingTask(TON_INSTANCE_DE_TA_CLASS_PRINCIPALE, new Runnable() {

            @Override
            public void run() {
               
                //Ton code qui s'éxecute toutes les secondes

                timer--;
            }
        }, 20, 20);
    }

AlexFatta

EDIT : tu dois créer une variable de type int (ici 'timer') qui prends la valeur par défaut de ton timer. Par exemple pour un timer de 1 min :
Java:
private int timer = 60;
 
  • J'aime
Reactions: Booskap

Booskap

Aventurier
7 Novembre 2019
10
3
3
25
D'accord , merci de t'as réponse.

Je vais essayé cette méthode et je reviens sur ce sujet je ne suis pas sûr d'avoir tout compris !

EDIT :

Tout fonctionne niquel et pour arretez le timer il suffit de rentrer cette ligne juste après la condition if :
Bukkit.getScheduler().cancelTask(task);

Voilà ce que ça donne chez moi :

Java:
public static void runnable(Player p) {
        task = Bukkit.getScheduler().scheduleSyncRepeatingTask(main, new Runnable() {
          
            @Override
            public void run() {
              
                p.sendMessage("timer+"s");

                if(timer == 0) {
                    Bukkit.getScheduler().cancelTask(task);
                    // code..
                  
                    // reset du timer si utilisé a nouveau
                    timer = 6;
                  
                }
              
                timer--;
            }

        }, 0, 20);
          
    }


Merci pour la solution AlexFatta
 
Dernière édition: