Configuration Résolu Java : Runnable

Alex Fatta

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

J'ai encoooore un problème en Java xDD

Cette fois-ci, c'est un runnable qui m'en fait voir de toutes les couleurs. Je souhaite simplement faire un Scoreboard dans lequel il y aurait un timer qui tournerait sans s'arrêter.

Au début, j'avais crée une autre class qui était chargé de s'occuper du Runnable. Sans succès. J'ai donc mis le code qui s'occupe du Runnable dans la class main, et le scoreboard dans la class qui gère le join des joueurs.

Pour toujours compliquer un peu, je souhaite que le timer tourne uniquement si une variable est sur true.

Voici la class main :
PHP:
package fr.alexfatta.fallenkingdoms;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

import fr.alexfatta.fallenkingdoms.managers.damageTeamManager;
import fr.alexfatta.fallenkingdoms.managers.gameManager;
import fr.alexfatta.fallenkingdoms.managers.teamManager;

public class main extends JavaPlugin implements Listener{
   
    private static ArrayList<Player> Blue = new ArrayList<Player>();
    private static ArrayList<Player> Red = new ArrayList<Player>();
    private static ArrayList<Player> Yellow = new ArrayList<Player>();
    private static ArrayList<Player> Green = new ArrayList<Player>();
    private static ArrayList<Player> Purple = new ArrayList<Player>();
   
    private static String gamePrefix = ChatColor.GRAY + "[" + ChatColor.RED + "FallenKingdoms" + ChatColor.GRAY + "] ";
    private static String argument = ChatColor.RED + "Erreur : ce n'est pas le bon argument !";
   
    static int jour = 1;
    static int timeMinute = 0;
    static int timeSecond = 0;
   
     @Override
    public void onEnable() {
         getLogger().info("Plugin de FallenKingdoms actif !");
         getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         getServer().getPluginManager().registerEvents(new damageTeamManager(), this);
         getServer().getPluginManager().registerEvents(this, this);
         getCommand("fkteam").setExecutor(new teamManager());
         getCommand("fk").setExecutor(new gameManager());
       
    }
   
     @Override
    public void onDisable() {
         getLogger().info("Plugin de FallenKingdoms inactif !");
    }

     int timer = 1;
   
     public void runnable(Player player){
         Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
           
            @Override
            public void run() {
                for(Player pls : Bukkit.getOnlinePlayers()){
                    playerJoinListener.loadSB(pls);
                }
                if(gameManager.isStatuts()){ //compteur du temps et des jours
                    timeSecond++;
                   
                    if(timeSecond==60){
                        timeMinute++;
                        timeSecond = 0;
                   
                        if(timeMinute==1 && timeSecond==30){
                            Bukkit.broadcastMessage(ChatColor.GRAY + "Le soleil est sur le point de se lever...");
                       
                        }else if(timeMinute==2){
                            jour++;
                            Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.AQUA + "Jour " + jour + ChatColor.AQUA + " !");
                        }
                    }
                }else {
                    playerJoinListener.loadSB(player);
                }
               
                timer--; // Timer et refresh auto du ScoreBoard
                if(timer==0){
                    timer = 1;
                    playerJoinListener.loadSB(player);
                }
               
            }
        }, 20, 20);
     }

    public static String getArgument() {
        return argument;
    }

    public void setArgument(String argument) {
        main.argument = argument;
    }

    public static String getGamePrefix() {
        return gamePrefix;
    }

    public void setGamePrefix(String gamePrefix) {
        main.gamePrefix = gamePrefix;
    }

    public static ArrayList<Player> getBlue() {
        return Blue;
    }

    public static void setBlue(ArrayList<Player> blue) {
        Blue = blue;
    }

    public static ArrayList<Player> getRed() {
        return Red;
    }

    public static void setRed(ArrayList<Player> red) {
        Red = red;
    }

    public static ArrayList<Player> getYellow() {
        return Yellow;
    }

    public static void setYellow(ArrayList<Player> yellow) {
        Yellow = yellow;
    }

    public static ArrayList<Player> getGreen() {
        return Green;
    }

    public static void setGreen(ArrayList<Player> green) {
        Green = green;
    }

    public static ArrayList<Player> getPurple() {
        return Purple;
    }

    public static void setPurple(ArrayList<Player> purple) {
        Purple = purple;
    }
   
}

La class playerJoinEvent (qui contient donc le ScoreBoard) :
PHP:
package fr.alexfatta.fallenkingdoms;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

public class playerJoinListener implements Listener{
   
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        Player p = event.getPlayer();
        event.setJoinMessage(main.getGamePrefix() + ChatColor.YELLOW + p.getName() + ChatColor.GRAY + " à rejoint la partie !");
        loadSB(p);
    }
   
    @EventHandler
    public void onPlayerLeave(PlayerKickEvent pke){
        Player player = pke.getPlayer();
        pke.setLeaveMessage(main.getGamePrefix() + ChatColor.YELLOW + player.getName() + ChatColor.GRAY + " à quitté la partie !");
        for(Player plo : Bukkit.getOnlinePlayers()){
             loadSB(plo);
         }
    }

   
     public static void loadSB(Player p){
       
         ScoreboardManager manager = Bukkit.getScoreboardManager();
         Scoreboard board = manager.getNewScoreboard();
         Objective objective = board.registerNewObjective("Points", "dummy");
       
         objective.setDisplaySlot(DisplaySlot.SIDEBAR);
         objective.setDisplayName(main.getGamePrefix());
       
         int joueur = Bukkit.getOnlinePlayers().size();
       
         Score score1 = objective.getScore(ChatColor.AQUA + "Joueurs : " + joueur);
         score1.setScore(4);
         Score score2 = objective.getScore(" ");
         score2.setScore(3);
         Score score3 = objective.getScore(ChatColor.AQUA + "Jour : " + main.jour);
         score3.setScore(2);
         Score score4 = objective.getScore(ChatColor.AQUA + "Temps : " + ChatColor.GOLD + main.timeMinute + ":" + main.timeSecond);
         score4.setScore(1);
       
         for(Player pls : Bukkit.getOnlinePlayers()){
             pls.setScoreboard(board);
         }
     }
}

Voici ! Et c'est là que je suis bloqué. Je ne sais pas comment initialiser la méthode runnable (que ce soit dans le main ou dans playerJoinEvent, il sort les mêmes erreurs.

Je me tourne donc vers vous en espérant que vous pourrez m'aider :p @Detobel36

AlexFatta
 
Je ne vois pas bien ce qui ne va pas avec le Runnable.

Pour toujours compliquer un peu, je souhaite que le timer tourne uniquement si une variable est sur true.

il ne suffirait pas de rajouter
Code:
if(bool)
    return;
au début de la méthode run() ?
 
Bonsoir !

Merci de ta réponse, cela étant ça ne change rien. Voici donc ce que ça donne (rien de plus hormis le return; xD) :
PHP:
     public void runnable(Player player){
         Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            
            @Override
            public void run() {
                for(Player pls : Bukkit.getOnlinePlayers()){
                    playerJoinListener.loadSB(pls);
                }
                if(gameManager.isStatuts()){ //compteur du temps et des jours
                    timeSecond++;
                    
                    if(timeSecond==60){
                        timeMinute++;
                        timeSecond = 0;
                    
                        if(timeMinute==1 && timeSecond==30){
                            Bukkit.broadcastMessage(ChatColor.GRAY + "Le soleil est sur le point de se lever...");
                        
                        }else if(timeMinute==2){
                            jour++;
                            Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.AQUA + "Jour " + jour + ChatColor.AQUA + " !");
                        }
                    }
                return;
                }else {
                    playerJoinListener.loadSB(player);
                }
                
                timer--; // Timer et refresh auto du ScoreBoard
                if(timer==0){
                    timer = 1;
                    playerJoinListener.loadSB(player);
                }
                
            }
        }, 20, 20);
     }

En fait, quand je fais /fk start, ça met la variable "statuts" sur true. Et donc c'est ce que je veux, si statuts == true ou if(statuts){}, et bien ça lance le timer, et quand je fais /fk pause, statuts se remet en false et je voudrai que le timer se mettent en pause. Un compteur quoi xD (Bon après j'ai un /fk stop mais la ça remet les variables à zéro donc facile à coder), mais sinon, je ne comprends pas pourquoi le code ne fonctionne pas, pour ça que je suis ici :p

Juste si besoin, voici le /fk start :
PHP:
    private static boolean statuts = false;
    private World world;

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(label.equalsIgnoreCase("fk") && sender instanceof Player){
            Player player = (Player) sender;
            
            if(args.length == 0){
                player.sendMessage(main.getGamePrefix() + main.getArgument());
            }else if(args.length >= 1){
                if(args[0].equalsIgnoreCase("start")){
                    if(!statuts){
                        world = player.getWorld();
                        world.setTime(0);
                        Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " vient de lancer la partie !");
                        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "gamerule doDaylightCycle true");
                        statuts = true;
                    }else {
                        player.sendMessage(statutsMessage + ChatColor.YELLOW + args[0] + ChatColor.RED + " !");
                        player.sendMessage(main.getGamePrefix() + ChatColor.RED + "Etat de la partie : " + ChatColor.GREEN + isStatuts());
                    }
                
                }

Voilà voilà ! Toutes réponse ou proposition est la bienvenue, si vous avez des idées, tout est bon à prendre :p

AlexFatta
 
Bonjour !

statuts*
Et oui je le fais :
PHP:
}else if(args[0].equalsIgnoreCase("pause")){
                    if(statuts){
                        Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.YELLOW + " vient de mettre la partie en pause !");
                        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "gamerule doDaylightCycle false");
                        statuts = false;
                    }else {
                        player.sendMessage(statutsMessage + ChatColor.YELLOW + args[0] + "/stop" + ChatColor.RED + " !");
                        player.sendMessage(main.getGamePrefix() + ChatColor.RED + "Etat de la partie : " + ChatColor.RED + isStatuts());
                    }

Je ne comprends pas :/

Des idées ?

AlexFatta
 
Oui d'accord je modifierai xD Mais tu as des idées pour le fait que ça ne fonctionne pas ? :p

AlexFatta
 
Alors sur ce point là, tu me poses une colle j'avoue

D'ailleurs tu dis qu'il sort des erreurs, quelles sont elles ?

Il me semble que tu n'appelles jamais la méthode runnnable, tu peux confirmer ?
De plus, cette méthode ne devrait pas avoir de paramètres.
 
Et bien justement je pense aussi que c'est de là que vient le problème. J'ai essayé de mettre main.runnable(); et aussi main.runnable(player); et dans tous les cas il me demande de mettre la méthode runnable sur static (ce qui est compréhensible) et quand je le fais Il me dit que le "this" de "Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {" ne peut pas être inséré pour une méthode "static".

La class "main" (aussi la principale :p ) qui contient le runnable (la class et l'action) :
PHP:
package fr.alexfatta.fallenkingdoms;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

import fr.alexfatta.fallenkingdoms.managers.damageTeamManager;
import fr.alexfatta.fallenkingdoms.managers.gameManager;
import fr.alexfatta.fallenkingdoms.managers.teamManager;

public class main extends JavaPlugin implements Listener{
    
    private static ArrayList<Player> Blue = new ArrayList<Player>();
    private static ArrayList<Player> Red = new ArrayList<Player>();
    private static ArrayList<Player> Yellow = new ArrayList<Player>();
    private static ArrayList<Player> Green = new ArrayList<Player>();
    private static ArrayList<Player> Purple = new ArrayList<Player>();
    
    private static String gamePrefix = ChatColor.GRAY + "[" + ChatColor.RED + "FallenKingdoms" + ChatColor.GRAY + "] ";
    private static String argument = ChatColor.RED + "Erreur : ce n'est pas le bon argument !";
    

    
     @Override
    public void onEnable() {
         getLogger().info("Plugin de FallenKingdoms actif !");
         getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         getServer().getPluginManager().registerEvents(new damageTeamManager(), this);
         getServer().getPluginManager().registerEvents(this, this);
         getCommand("fkteam").setExecutor(new teamManager());
         getCommand("fk").setExecutor(new gameManager());
        
    }
    
     @Override
    public void onDisable() {
         getLogger().info("Plugin de FallenKingdoms inactif !");
    }

    private static int timer = 1;
    private static int jour = 1;
    private static int timeMinute = 0;
    private static int timeSecond = 0;
    
     public static void runnable(Player player){
         Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            
            @Override
            public void run() {
                for(Player pls : Bukkit.getOnlinePlayers()){
                    playerJoinListener.loadSB(pls);
                }
                if(gameManager.isStatuts()){ //compteur du temps et des jours
                    setTimeSecond(getTimeSecond() + 1);
                    playerJoinListener.loadSB(player);
                    if(getTimeSecond()==60){
                        setTimeMinute(getTimeMinute() + 1);
                        setTimeSecond(0);
                        playerJoinListener.loadSB(player);
                    
                        if(getTimeMinute()==1 && getTimeSecond()==30){
                            Bukkit.broadcastMessage(ChatColor.GRAY + "Le soleil est sur le point de se lever...");
                            playerJoinListener.loadSB(player);
                        
                        }else if(getTimeMinute()==2){
                            setJour(getJour() + 1);
                            Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.AQUA + "Jour " + getJour() + ChatColor.AQUA + " !");
                            playerJoinListener.loadSB(player);
                        }
                    return;
                    }
                }else {
                    playerJoinListener.loadSB(player);
                }
                
                timer--; // Timer et refresh auto du ScoreBoard
                if(timer==0){
                    timer = 1;
                    playerJoinListener.loadSB(player);
                }
                
            }
        }, 20, 20);
     }

    public static String getArgument() {
        return argument;
    }

    public void setArgument(String argument) {
        main.argument = argument;
    }

    public static String getGamePrefix() {
        return gamePrefix;
    }

    public void setGamePrefix(String gamePrefix) {
        main.gamePrefix = gamePrefix;
    }

    public static ArrayList<Player> getBlue() {
        return Blue;
    }

    public static void setBlue(ArrayList<Player> blue) {
        Blue = blue;
    }

    public static ArrayList<Player> getRed() {
        return Red;
    }

    public static void setRed(ArrayList<Player> red) {
        Red = red;
    }

    public static ArrayList<Player> getYellow() {
        return Yellow;
    }

    public static void setYellow(ArrayList<Player> yellow) {
        Yellow = yellow;
    }

    public static ArrayList<Player> getGreen() {
        return Green;
    }

    public static void setGreen(ArrayList<Player> green) {
        Green = green;
    }

    public static ArrayList<Player> getPurple() {
        return Purple;
    }

    public static void setPurple(ArrayList<Player> purple) {
        Purple = purple;
    }

    public static int getJour() {
        return jour;
    }

    public static void setJour(int jour) {
        main.jour = jour;
    }

    public static int getTimeMinute() {
        return timeMinute;
    }

    public static void setTimeMinute(int timeMinute) {
        main.timeMinute = timeMinute;
    }

    public static int getTimeSecond() {
        return timeSecond;
    }

    public static void setTimeSecond(int timeSecond) {
        main.timeSecond = timeSecond;
    }
    
}

Si ça peut t'aider ^^ Une idée pour le "this" ?

AlexFatta
 
Alors pour le "problème du this", tu peux rajouter un field
Code:
private static main INSTANCE;

tu l'initialise dans onEnable
Code:
INSTANCE = this;

et au lieu du this, tu mets
Code:
INSTANCE