Minecraft Bukkit Scheduler. ALLGEMEIN.

DanielsLPecke

Mitglied
Ich verstehe nicht warum das COUNTDOWN rot unterstrichen wird...

Java:
    int COUNTDOWN = 30;
                        int ID = Bukkit.getScheduler().scheduleSyncDelayedTask(Start.getPacManPlugin(), new Runnable(){

                            @Override
                            public void run() {

                                 Bukkit.getScheduler().scheduleSyncRepeatingTask(Start.getPacManPlugin(), new Runnable(){
                                  
                                    @Override
                                    public void run() {
                                         String msg = "&cNur noch: &6"+ COUNTDOWN +" &cSekunde(n)";
                                         String s1 = ChatColor.translateAlternateColorCodes('&', msg);
                                         IChatBaseComponent icbc = ChatSerializer.a("{\"text\": \"" + s1 + "\"}");
                                         PacketPlayOutChat bar = new PacketPlayOutChat(icbc, (byte)1);
                                         ((CraftPlayer)p).getHandle().playerConnection.sendPacket(bar);
COUNTDOWN
Java:
= COUNTDOWN-1;
                                         if(COUNTDOWN<1)Bukkit.getScheduler().cancelTask(ID);
                                         
                                    }
                                   
                                 }, 20, 20);
                            }
                              
                        },1);
 
Hallo, ich habe jetzt länger überlegen müssen, bis ich verstanden habe, dass COUNTDOWN mit zum Quellcode gehört. Nächste mal vielleicht ein wenig anders schreiben. ;-)

Die Fehlerausgabe besagt dies:
Local variable COUNTDOWN defined in an enclosing scope must be final or effectively final
Außerdem noch diesen Fehler:
The local variable ID may not have been initialized

Du kannst zwar die Variablen aus dem äußerem Bereich abfragen, aber nicht verändern. ID ist noch nicht initzialisiert, weil du ID "in sich selbst" aufrufen willst.

Ich arbeite lieber mit "runTaskAsynchronously", daher habe ich dir mal eine andere Lösung fertig gemacht, allerdings habe ich diese nicht getestet.
Code:
     BukkitTask taskId = Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable()
     {
       @Override
       public void run()
       {
         int COUNTDOWN = 30;
         while(COUNTDOWN > 0)
         {
           String msg = "&cNur noch: &6"+ COUNTDOWN +" &cSekunde(n)";
           String s1 = ChatColor.translateAlternateColorCodes('&', msg);
           IChatBaseComponent icbc = ChatSerializer.a("{\"text\": \"" + s1 + "\"}");
           PacketPlayOutChat bar = new PacketPlayOutChat(icbc, (byte)1);
        
           Bukkit.getScheduler().runTask(plugin, new Runnable()
           {
             @Override
             public void run()
             {
               ((CraftPlayer)p).getHandle().playerConnection.sendPacket(bar);
             }
           });
        
           try
           {
             Thread.sleep(1000);
           }
           catch (InterruptedException e)
           {
             e.printStackTrace();
           }
        
           COUNTDOWN--;
         }
       }
     });

Aktuell wird taskId noch nicht genutzt, allerdings kannst du eine mit kleinen Veränderungen es so gestalten, dass der Task von außen beendet werden kann.

Schönen Tag noch.
 

Zurück
Oben