ServerPlugin Problem mit array

Dieses Thema im Forum "Programmierung" wurde erstellt von Vinnie, 24. August 2014.

  1. Vinnie
    Offline

    Vinnie

    Registriert seit:
    28. Juni 2014
    Beiträge:
    264
    Minecraft:
    Vinnie
    Hallo zusammen,

    ich erstelle und übe mich gerade an meinem ersten Plugin mit Hilfe des Tutorial von DeBukkit.
    Dort bin ich an dem Part, wo man ein array anlegen soll, hängen geblieben und komme nicht weiter.

    Der DeBukkit schreibt in seinem Tut. die Zeilen so:

    Code (Text):
    1.         //Kommando "hidden"
    2.         if(cmd.getName().equalsIgnoreCase("hidden"))
    3.         {
    4.             if(args.length > 1)
    5.             {
    6.                 return false;
    7.             }
    8.             if(args.length == 0)
    9.             {
    10.                 Player[] Ziel = getServer().getOnlinePlayers();
    11.                
    12.                 for(Player targetPlayer : Ziel)
    13.                 {
    14.                    
    15.                 }
    16.             }
    17.                
    18.         }
    Dies funktioniert bei mir aber nicht. Bei der Zeile: Player[] Ziel = getServer().getOnlinePlayers();
    wird folgende Fehlermeldung angezeigt:
    Type mismatch: cannot convert from Collection<capture#1-of ? extends Player> to
    Player[]

    Kann mir da jemand helfen?

    Vielen Dank im Vorraus

    Dakvain
     
    #1
  2. Sabbertran
    Offline

    Sabbertran

    Registriert seit:
    24. April 2012
    Beiträge:
    75
    Minecraft:
    Sabbertran
    Ohne Array könntest du das ganze so machen:

    Code (Text):
    1.  
    2. //Kommando "hidden"
    3. if(cmd.getName().equalsIgnoreCase("hidden"))
    4. {
    5. if(args.length > 1)
    6. {
    7. return false;
    8. }
    9. if(args.length == 0)
    10. {
    11.  
    12. for(Player targetPlayer : getServer().getOnlinePlayers())
    13. {
    14.  
    15. }
    16. }
    17.  
    18. }
    Sorry für die nicht vorhandene einrückung. Beim kopieren kommt die nicht mit :D
     
    #2
  3. Vinnie
    Offline

    Vinnie

    Registriert seit:
    28. Juni 2014
    Beiträge:
    264
    Minecraft:
    Vinnie
    Danke schonmal für die Antwort, ich weiß das es ebenfalls auch so funktioniert und habe dieses Verfahren vorher schon genutzt.
    Aber da nun im Tutorial ein array genutzt wird, und ich das auch gerne erlernen möchte, würde ich das gerne so machen. :)
    Zudem möchte ich gerne das Geheimnis lüften, warum das bei DeBukkit funktioniert und bei mir, mit dem selben Programm nicht.
     
    #3
  4. Genau deswegen lernt man nicht bei DeBukkit oder sonstigen 'selbsternannte' Experten, man lernt Java und guckt sich dann die JavaDoku an.
    Lässt auf eine relativ neue Version schließen, denn CraftBukkit ändert die Signatur. Steht dort ja auch. Eine Liste kann nicht zu einem Array umgewandelt werden. (Macht auch keinen Sinn)

    Bei Java 8 lässt sich daher die neuen Lamda ausdrücke Nutzen.

    Code (Text):
    1. // Gegeben Liste task mit einer Klasse, dessen Methode Handle einen String erwartet.
    2. tasks.forEach(h -> {
    3.                 h.handle("DoSomething")
    4. });
     
    #4
  5. Vinnie
    Offline

    Vinnie

    Registriert seit:
    28. Juni 2014
    Beiträge:
    264
    Minecraft:
    Vinnie
    Das ist mir bewusst, dass man nicht bei iwelchen selbsternannten Experten aus dem Internet alles richtig lernt. Aber wo kann ich denn Java richtig lernen?
    Gibt es da iwas, was du mir für ein Selbststudium empfehlen könntest?
     
    #5
  6. #6
    Vinnie und games6471 gefällt das.
  7. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938

    Java lernen, nicht Bukkit.

    Kauf dir Bücher, lies sie und dann, wenn du grundlegende Dinge in Java drauf hast, kannst du dich der Verwendung anderer Libraries, wie Bukkit, zuwenden.
     
    #7
  8. games6471
    Offline

    games6471

    Seit diesem commit, gibt es eine weitere getOnlinePlayer Methode. Diese gibt List<CraftPlayer> zurück. Die alte Methode wurde als ungültig markiert und existiert nicht mehr in der API (Bukkit), jedoch ist sie noch im im Server aus Kompatibilitätsgründen von alten Plugins noch vorhanden (Craftbukkit). Wenn du also Craftbukkit als dependency einsetzt oder eine etwas älter Bukkit API, dann kannst du die alte Methode ohne Probleme verwenden. Desweiteren gibt es auch schon einige Bibliotheken, die dieses Problem umgehen.

    Die neue Methode kannst dennoch nutzen und wird von Bukkit auch empfohlen. Du solltest dabei nicht vergessen, dass diese auf älteren Servern nicht verfügbar ist. Selbst bei einer For-Each-Schleife kann dies leicht passieren, obwohl man das gar nicht ahnt. Beispielcode:

    Code (Text):
    1.         for (Player player : Bukkit.getOnlinePlayers()) {
    2.             System.out.println(player);
    3.         }
    Obwohl man bei Betrachtung auf Source-Code kein Array oder Collection erkennen kann, verändert sich trotzdem der Bytecode (.class; compilierter Java code; die Jar ist ein Archiv, das aus diesen Dateien besteht)


    Code:
    stack=2, locals=3, args_size=1
    0: invokestatic #2 // Method org/bukkit/Bukkit.getOnlinePlayers:()Ljava/util/Collection;
    3: invokeinterface #3, 1 // InterfaceMethod java/util/Collection.iterator:()Ljava/util/Iterator;
    8: astore_1
    9: aload_1
    10: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
    15: ifeq 38
    18: aload_1
    19: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    24: checkcast #6 // class org/bukkit/entity/Player
    27: astore_2
    28: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
    31: aload_2
    32: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
    35: goto 9
    38: return

    Code:
    stack=2, locals=5, args_size=1
    0: invokestatic #2 // Method org/bukkit/Bukkit.getOnlinePlayers:()[Lorg/bukkit/entity/Player;
    3: astore_1
    4: aload_1
    5: arraylength
    6: istore_2
    7: iconst_0
    8: istore_3
    9: iload_3
    10: iload_2
    11: if_icmpge 33
    14: aload_1
    15: iload_3
    16: aaload
    17: astore 4
    19: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
    22: aload 4
    24: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
    27: iinc 3, 1
    30: goto 9
    33: return
     
    #8
  9. Vinnie
    Offline

    Vinnie

    Registriert seit:
    28. Juni 2014
    Beiträge:
    264
    Minecraft:
    Vinnie
    Vielen Dank, dann werde ich mich jetzt wohl mal dran setzen! :)

    Auch im Zeitalter der modernsten Computer und Maschinen kommt man wohl ohne lesen von Büchern nicht aus. :D

    Vielen Dank nochmal!
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Schau mal hier, wie viele Minecraftserver schon Java 1.8 benutzen. Sehr wenige. Es ist also nicht besonders hilfreich die Features von Java 8 zu benutzen :p
     
    #10