ServerPlugin Countdown Fehler

Dieses Thema im Forum "Programmierung" wurde erstellt von MrPyro13, 23. August 2014.

  1. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Hallo,

    kannst mir jemand sagen, was an diesem Code falsch ist?

    Code (Text):
    1.  
    2. package de.mrpyro13.ImpComs;
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.command.Command;
    5. import org.bukkit.command.CommandExecutor;
    6. import org.bukkit.command.CommandSender;
    7. import org.bukkit.plugin.Plugin;
    8. public class iCountdown_Command implements CommandExecutor {
    9. @Override
    10. public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
    11. //SCRIPT ANFANG
    12. int countdown;
    13. sender.sendMessage("§aDer Countdown wurde gestartet");
    14. countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable() {
    15. int x;
    16. int high = 11;
    17. @Override
    18. public void run() {
    19. if(high != 0) {
    20. high--;
    21. sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
    22. } else {
    23. sender.sendMessage("§aCountdown vorbei");
    24. Bukkit.getScheduler().cancelTask(countdown);
    25. }
    26. }
    27. }, 0, 20);
    28. //SCRIPT ENDE
    29. return true;
    30. }
    31. }
    32.  
    Hier wird das countdown angestrichen, man soll die Variable oben (int countdown) final(en)

    Final ich es wird in diesem Abschnitt das countdown angestrichen:
     
    #1
  2. games6471
    Offline

    games6471

    Ein kleiner Hinweis. Du kannst nicht einfach ein CommandExecutor zu Plugin casten.
    Code (Text):
    1. Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable()
     
    #2
  3. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Schreibe ich aber nur das this, dann wird der scheduleSyncRepeatingTask unterstrichen :/
     
    #3
  4. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Du musst daran denken, deine mainclass da zu uebergeben und keine x-beliebige. Erzeuge eine neue Instanz deiner mainclass im Konstruktor. Diese kannst du dann uebergeben.
     
    #4
  5. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Und das ging nochmal wie? :confused:
     
    #5
  6. games6471
    Offline

    games6471

    Du kannst die Plugininstanz wie folgt über dem Konstruktor übergeben:

    http://wiki.bukkit.org/Plugin_Tutorial#Using_a_separate_CommandExecutor_class

    Code (Text):
    1. public class MyPluginCommandExecutor implements CommandExecutor {
    2.     private final MyPlugin plugin;
    3.  
    4.     public MyPluginCommandExecutor(MyPlugin plugin) {
    5.         this.plugin = plugin; // Store the plugin in situations where you need it.
    6.     }
    Und bei der Erstellung einer Instanz (new ...) dieser Klasse die Hauptklasse übergeben. Das bedeutet new blabla(instance) Also in der Hauptklasse (JavaPlugin) mit this.

    Code (Text):
    1. new MyPluginCommandExecutor(this)
     
    #6
  7. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    In der Klasse mit dem Scheduler:

    Code (Text):
    1.  
    2. private <namedermain> inst;
    3.  
    4. public <namederklasse>(<Namedermain> plugin){
    5.     this.inst = plugin;
    6. }
    7.  
    Und dann dem Scheduler "inst" uebergeben.

    In der Mainklasse machste dann:

    Code (Text):
    1.  
    2. new <namederschedulerklasse>(this);
    3.  
    Versuch aber erst, den simn zu verstehen und es dann zu kopieren!:)
     
    #7
  8. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Das funktioniert jetzt. Jedoch geht das mit dem countdown nicht

    Code (Text):
    1.  
    2. package de.mrpyro13.ImpComs;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.command.Command;
    6. import org.bukkit.command.CommandExecutor;
    7. import org.bukkit.command.CommandSender;
    8. import org.bukkit.plugin.Plugin;
    9.  
    10. public class iCountdown_Command implements CommandExecutor {
    11.  
    12.     private Main inst;
    13.  
    14.     public iCountdown_Command(Main plugin){
    15.         this.inst = plugin;
    16.     }
    17.  
    18.     @Override
    19.     public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
    20.         //SCRIPT ANFANG
    21.    
    22.         int countdown;
    23.         sender.sendMessage("§aDer Countdown wurde gestartet");
    24.         countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask(inst, new Runnable() {
    25.             int x;
    26.             int high = 11;
    27.             @Override
    28.             public void run() {
    29.                 if(high != 0) {
    30.                     high--;
    31.                     sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
    32.                 } else {
    33.                     sender.sendMessage("§aCountdown vorbei");
    34.                     Bukkit.getScheduler().cancelTask(countdown);
    35.                 }
    36.             }
    37.         }, 0, 20);
    38.    
    39.         //SCRIPT ENDE
    40.         return true;
    41.     }
    42.  
    43. }
    44.  
    Das was ich rot markiert habe, buggt: Ich fahre über den Fehler, als Problemlösung kommt das:
    Dann ist es immernoch rot markiert und es kommt als Problemlösung das:
    Jetzt ist das rot markierte richtig, aber das grün markierte wird rot unterstrichen und möchte das final weg haben.
    Langsam drehe ich durch :(

    @xXSasukeXx und @games6471
    Programmierst ihr auch in extra Klassen oder eher in der Main?
     
    #8
  9. games6471
    Offline

    games6471

    Einfache Alternative:

    Code (Text):
    1. new BukkitRunnable() {
    2.             int x;
    3.             int high = 11;
    4.  
    5.             @Override
    6.             public void run() {
    7.                 if (high != 0) {
    8.                     high--;
    9.                     sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
    10.                 } else {
    11.                     sender.sendMessage("§aCountdown vorbei");
    12.                     this.cancel();
    13.                 }
    14.             }
    15.         }.runTaskTimer(inst, 0, 20);
    Man sollte seinen Programmcode logisch in verschiedene Klassen unterteilen und nicht alles in eine Klasse stopfen. Das verbessert deutlich die Übersichtlichkeit und viele weitere Dinge.
     
    #9
  10. TheBlackIPs
    Offline

    TheBlackIPs

    Registriert seit:
    12. März 2014
    Beiträge:
    5
    Wenn du keine weitere Verwendung für sie hast, könntest du die Variablen "countdown" und "x" einfach löschen... Momentan werden sie jedenfalls nicht benutzt.
     
    #10
  11. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Du solltest auf jeden Fall extra Klassen benutzen, dafür ist Java da.
     
    #11
  12. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ich nutze auch extra Klassen ^^
     
    #12