[Résolu] Compte à rebours 1.14.4

benjimania74

Je dev comme un p'tit fou !
23 Décembre 2017
10
0
12
17
Bonjour, je dev un plugin Minecraft avec un compte à rebour mais celui ci ne fonctionne pas.

Je le créer sans erreur mais des qu'il faut l'executer dans un event (séparé du main mais relié) il ne fonctionne pas.:confused:

Ma classe principale (Main)
Code:
package fr.benjimania74.skycontest;

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public class main extends JavaPlugin {
	@Override
	public void onEnable() {
		System.out.println("Plugin allumé");
		getServer().getPluginManager().registerEvents(new EventforStart(), this);
	}
	public int task;
	public void startCountdown(final int i) {
		task = Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable(){

			@Override
			public void run() {
				int time = i;
				if(time != 0) {
					Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde(s)");
					time --;
					startCountdown(time);
				}
				if(time == 0) {
					Bukkit.broadcastMessage("§5C'est Partie !");
					Bukkit.getScheduler().cancelTask(task);
				}
			}
			
		},20);
	}
	@Override
	public void onDisable() {
		System.out.println("Plugin éteint");
	}
}

Mon Listener:
Code:
package fr.benjimania74.skycontest;


import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class EventforStart implements Listener {
	@EventHandler
	public void onJoin(PlayerJoinEvent event) {
		Player player = event.getPlayer();
		event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b! Nous sommes maintenant §c" + Bukkit.getOnlinePlayers().size() + " §bconnectés !");
		if(Bukkit.getOnlinePlayers().size() == 1) {
			//Execution compte à reboure
		}
	}
}

Merci de votre aide
 

Alexandre01Dev

Connu sous le pseudo alta ta01
11 Avril 2015
3
0
62
Bonjour , alors je te conseille de crée une instance et dans ton event d'executer le code ou que tu mets ton startCountdown en static et que tu l'execute en faisant simplement main.startCountdown(); dans ton listener

Code:
public class main extends JavaPlugin {
private static main instance;

public static void getInstance(){
return instance;
}
    @Override
    public void onEnable() {
                instance = this;
        System.out.println("Plugin allumé");
        getServer().getPluginManager().registerEvents(new EventforStart(), this);
    }
        public void startCountdown(final int i) {
             new BukkitRunnable(){

                @Override
                public void run() {
                    int time = i;
                    if(time != 0) {
                        Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde(s)");
                        time --;
                        startCountdown(time);
                    }
                    if(time == 0) {
                        Bukkit.broadcastMessage("§5C'est Partie !");
                        cancel();
                    }


            }
        }.runTaskLater(this , 20L);
    }
    @Override
    public void onDisable() {
        System.out.println("Plugin éteint");
    }
}

Ton Listener

Code:
public class EventforStart implements Listener {
    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b! Nous sommes maintenant §c" + Bukkit.getOnlinePlayers().size() + " §bconnectés !");
        if(Bukkit.getOnlinePlayers().size() == 1) {
            main.getInstance().startCountdown(int);
        }
    }


Bonjour, je dev un plugin Minecraft avec un compte à rebour mais celui ci ne fonctionne pas.

Je le créer sans erreur mais des qu'il faut l'executer dans un event (séparé du main mais relié) il ne fonctionne pas.:confused:

Ma classe principale (Main)
Code:
package fr.benjimania74.skycontest;

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public class main extends JavaPlugin {
    @Override
    public void onEnable() {
        System.out.println("Plugin allumé");
        getServer().getPluginManager().registerEvents(new EventforStart(), this);
    }
    public int task;
    public void startCountdown(final int i) {
        task = Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable(){

            @Override
            public void run() {
                int time = i;
                if(time != 0) {
                    Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde(s)");
                    time --;
                    startCountdown(time);
                }
                if(time == 0) {
                    Bukkit.broadcastMessage("§5C'est Partie !");
                    Bukkit.getScheduler().cancelTask(task);
                }
            }
          
        },20);
    }
    @Override
    public void onDisable() {
        System.out.println("Plugin éteint");
    }
}

Mon Listener:
Code:
package fr.benjimania74.skycontest;


import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class EventforStart implements Listener {
    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b! Nous sommes maintenant §c" + Bukkit.getOnlinePlayers().size() + " §bconnectés !");
        if(Bukkit.getOnlinePlayers().size() == 1) {
            //Execution compte à reboure
        }
    }
}

Merci de votre aide
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

@Alexandre01Dev Il vaut mieux éviter les "System.out" quand tu fais un plugin. Il y a un système de logger dans bukkit/spigot, autant l'utiliser ;)
Code:
Bukkit.getLogger().info("blalblal")

Heu pourquoi utiliser un "runTaskLater" et pas un "runTaskTimer" ?

Et au passage, avec le code actuelle, s'il y a un déco/reco d'un joueur, le timer se lance deux fois...


Cordialement,
Detobel36
 

benjimania74

Je dev comme un p'tit fou !
23 Décembre 2017
10
0
12
17
Bonjour Detobel36 dans ce cas c'est normale car il n'y aura plus le nombre de joueur nescessaire

Donc Alexandre a raison mais merci quand même
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Il est important de noter aussi que les class commencent normalement par une majuscule...

Code non testé:
PHP:
public class Main extends JavaPlugin implements Listener {

    private static int DEFAULT_COMPTEUR = 120; // En secondes

    private static Main instance;
    private BukkitRunnable compteurTask = null;


    public static void getInstance(){
        return instance;
    }

    @Override
    public void onEnable() {
        instance = this;
        getLogger().info("Plugin allumé");
        getServer().getPluginManager().registerEvents(this, this);
    }

    private void startCountdown(final int i) {
        compteurTask = new BukkitRunnable(){
                int timer = i;

                @Override
                public void run() {
                    if(time == 0) {
                        Bukkit.broadcastMessage("§5C'est Partie !");
                        compteurTask.cancel();
                        compteurTask = null;
                    } else {
                        Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde" + (time > 1 ? "s" : ""));
                    }
                    --timer;
                }
            }.runTaskTimer(this, 0L, 20L);
    }

    @Override
    public void onDisable() {
        getLogger().info("Plugin éteint");
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        final Player player = event.getPlayer();
        final int nbrJoueurs = Bukkit.getOnlinePlayers().size();
        event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b!" +
                "Nous sommes maintenant §c" + nbrJoueurs + " §bconnectés !");

        if(nbrJoueurs == 1 && compteurTask == null) {
            startCountdown(DEFAULT_COMPTEUR);
        }
    }

}
Il est fort possible qu'il y ai des fautes. Mais je pense que ça règle les quelques soucis que j'ai mentionné.


Cordialement,
Detobel36
 

benjimania74

Je dev comme un p'tit fou !
23 Décembre 2017
10
0
12
17
Hey rectification ! Le code fonctionne bien mais, le C'est partie ! se répète 2 foix et je n'arrive pas a arréter le compte à rebour si le nombre de joueur est inférieur à 1

Salut,

Il est important de noter aussi que les class commencent normalement par une majuscule...

Code non testé:
PHP:
public class Main extends JavaPlugin implements Listener {

    private static int DEFAULT_COMPTEUR = 120; // En secondes

    private static Main instance;
    private BukkitRunnable compteurTask = null;


    public static void getInstance(){
        return instance;
    }

    @Override
    public void onEnable() {
        instance = this;
        getLogger().info("Plugin allumé");
        getServer().getPluginManager().registerEvents(this, this);
    }

    private void startCountdown(final int i) {
        compteurTask = new BukkitRunnable(){
                int timer = i;

                @Override
                public void run() {
                    if(time == 0) {
                        Bukkit.broadcastMessage("§5C'est Partie !");
                        compteurTask.cancel();
                        compteurTask = null;
                    } else {
                        Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde" + (time > 1 ? "s" : ""));
                    }
                    --timer;
                }
            }.runTaskTimer(this, 0L, 20L);
    }

    @Override
    public void onDisable() {
        getLogger().info("Plugin éteint");
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        final Player player = event.getPlayer();
        final int nbrJoueurs = Bukkit.getOnlinePlayers().size();
        event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b!" +
                "Nous sommes maintenant §c" + nbrJoueurs + " §bconnectés !");

        if(nbrJoueurs == 1 && compteurTask == null) {
            startCountdown(DEFAULT_COMPTEUR);
        }
    }

}
Il est fort possible qu'il y ai des fautes. Mais je pense que ça règle les quelques soucis que j'ai mentionné.


Cordialement,
Detobel36

Le problème est que j'ai deux fichier distinc pour ne pas me mélangé pourais tu refaire avec 2 disctinc s'il te plait ?

Salut,

Il est important de noter aussi que les class commencent normalement par une majuscule...

Code non testé:
PHP:
public class Main extends JavaPlugin implements Listener {

    private static int DEFAULT_COMPTEUR = 120; // En secondes

    private static Main instance;
    private BukkitRunnable compteurTask = null;


    public static void getInstance(){
        return instance;
    }

    @Override
    public void onEnable() {
        instance = this;
        getLogger().info("Plugin allumé");
        getServer().getPluginManager().registerEvents(this, this);
    }

    private void startCountdown(final int i) {
        compteurTask = new BukkitRunnable(){
                int timer = i;

                @Override
                public void run() {
                    if(time == 0) {
                        Bukkit.broadcastMessage("§5C'est Partie !");
                        compteurTask.cancel();
                        compteurTask = null;
                    } else {
                        Bukkit.broadcastMessage("§cLancement du jeu dans §e" + time + "seconde" + (time > 1 ? "s" : ""));
                    }
                    --timer;
                }
            }.runTaskTimer(this, 0L, 20L);
    }

    @Override
    public void onDisable() {
        getLogger().info("Plugin éteint");
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        final Player player = event.getPlayer();
        final int nbrJoueurs = Bukkit.getOnlinePlayers().size();
        event.setJoinMessage("§b•Bonjour §c" + player.getName() + " §b!" +
                "Nous sommes maintenant §c" + nbrJoueurs + " §bconnectés !");

        if(nbrJoueurs == 1 && compteurTask == null) {
            startCountdown(DEFAULT_COMPTEUR);
        }
    }

}
Il est fort possible qu'il y ai des fautes. Mais je pense que ça règle les quelques soucis que j'ai mentionné.


Cordialement,
Detobel36

Mais, mon vrai probleme est de stoppé le compte à rebour quand un joueur quitte car il ne sont pas assez nombreux et que mon "C'est partie ! " ne se répète qu'une fous merci d'avance

Merci de votre aide !
J'ai fini par règler mon problème !

Pour le compte a rebour prenez chez Alexandre01 et dans
Code:
if(time != 0){
}
Rajouter une verif du nombre de joueur !

Et pour regler le beug de l'annonce pour dire C'est Partie mettez dans le if de la verification du nombre de Joueurs
Code:
if(time == 0) {
             time --;
}

Merci !
 
Dernière édition par un modérateur:

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Mais, mon vrai probleme est de stoppé le compte à rebour quand un joueur quitte car il ne sont pas assez nombreux et que mon "C'est partie ! " ne se répète qu'une fous merci d'avance
Et bien il suffit d'utiliser le listener... Tu écoutes si un joueur se déconnecte et tu appel juste la méthode:
Code:
compteurTask.cancel()

Le problème est que j'ai deux fichier distinc pour ne pas me mélangé pourais tu refaire avec 2 disctinc s'il te plait ?
La tructure ne change pas beaucoup... Ou est-ce-que tu bloque ?

Au passage, évite de faire des doubles postes... Le bouton "éditer" est la si tu as oublié qqch.



Cordialement,
Detobel36