ServerPlugin Komische Ausgabe (fehler in for Schleife?)

Dieses Thema im Forum "Programmierung" wurde erstellt von CodEr, 20. April 2014.

  1. CodEr
    Offline

    CodEr

    Registriert seit:
    20. April 2014
    Beiträge:
    8
    Hallo! Ich habe folgenden Code (ja in nur einer Klasse ;)):

    Code (Text):
    1.  
    2. package me.name.btfhelp;
    3.  
    4. import java.util.ArrayList;
    5. import java.util.HashMap;
    6.  
    7. import org.bukkit.Bukkit;
    8. import org.bukkit.Location;
    9. import org.bukkit.command.Command;
    10. import org.bukkit.command.CommandSender;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.plugin.java.JavaPlugin;
    13.  
    14. public class Main extends JavaPlugin{
    15.    
    16.     String pl = "§6[BTFHelp] ";
    17.     ArrayList<String> hilfen = new ArrayList<String>();
    18.     ArrayList<String> players = new ArrayList<String>();
    19.    
    20.     @Override
    21.     public void onEnable(){
    22.         System.out.println("[BTFHelp] Geladen");
    23.        
    24.     }
    25.    
    26.     @Override
    27.     public void onDisable(){
    28.         System.out.println("[BTFHelp] Deaktiviert");
    29.        
    30.     }
    31.    
    32.    
    33.     public boolean onCommand(CommandSender sender, Command cmd, String cmdlabel, String[] args){
    34.         Player p = (Player) sender;
    35.        
    36.         if(cmd.getName().equalsIgnoreCase("hilfe")){
    37.             if(p.hasPermission("BTFHelp.hilfe") || p.isOnline()){
    38.                 //CHANGE isOp
    39.                 if(args.length >= 1){
    40.                
    41.                     String allArguments = "";
    42.                    
    43.                      for(int i = 0; i < args.length; i++){
    44.                          
    45.                          allArguments += "§3" + args[i] + " ";
    46.                          
    47.                            
    48.                          
    49.                      }
    50.                      
    51.                      hilfen.add(allArguments);
    52.                      players.add(p.getName());
    53.                      
    54.                     p.sendMessage(pl + "§aTicket erstellt! Bitte warte auf hilfe! Wenn du offline gehst bekommst du eine Nachricht wenn dir jemand hilft! Mache dann §4/helpmail");
    55.                    
    56.                    
    57.                    
    58.                    
    59.                    
    60.                    
    61.                 }else{
    62.                     p.sendMessage(pl + "§cBenutze /hilfe [Was brauchst du?]");
    63.                    
    64.                 }
    65.                
    66.                
    67.             }else{
    68.                
    69.                 p.sendMessage("§6[BTFHelp]§c Du hast keine Rechte dazu!");
    70.                
    71.             }
    72.            
    73.            
    74.            
    75.             return true;
    76.         }
    77.        
    78.         if(cmd.getName().equalsIgnoreCase("helfen")){
    79.             if(p.hasPermission("BTFHelp.helfen") || p.isOp()){
    80.                 if(!hilfen.isEmpty() && !players.isEmpty()){
    81.                     Player need = Bukkit.getServer().getPlayer(players.get(0));
    82.                     String nhelp = hilfen.get(0);
    83.                     if(need.isOnline()){
    84.                         p.sendMessage(pl + "§aDu hilfst nun §3" + need.getName());
    85.                         p.sendMessage("§aSein Problem: §a" + nhelp);
    86.                         need.sendMessage(pl + "§aDer Supporter§3 " + p.getName() + " §awird sich um dich kümmern!");
    87.                        
    88.                         Location needl = need.getLocation();
    89.                         p.teleport(needl);
    90.                        
    91.                         hilfen.remove(hilfen.get(0));
    92.                         players.remove(players.get(0));
    93.                        
    94.                        
    95.                        
    96.                     }else{
    97.                         return false;
    98.                        
    99.                        
    100.                     }
    101.                    
    102.                    
    103.                    
    104.                 }else{
    105.                     p.sendMessage(pl + "§cNiemand braucht gerade Hilfe!");
    106.                    
    107.                 }
    108.                
    109.                
    110.                
    111.             }else{
    112.                
    113.                 p.sendMessage("§6[BTFHelp]§c Du hast keine Rechte dazu!");
    114.             }
    115.            
    116.             return true;
    117.            
    118.         }
    119.        
    120.        
    121.        
    122.        
    123.    
    124.        
    125.         return false;
    126.        
    127.     }
    128.    
    129.  
    130. }
    131.  
    132.  
    Wenn ich jetzt /helfen mache werde ich zu dem Spieler tpt und mir wird sein Problem angezeigt. Problem:

    Wenn der Spieler das Problem Bitte Hilfe hat dann sieht es bei /helfen so aus:

    1. Mal /helfen: der Spieler hast das Problem: Bitte
    2. Mal /helfen: der Spieler hat das Problem: Bitte Hilfe


    Warum wird beim ersten mal nur das erste Argument angezeigt? Ich denke das ist in der for-Schleife geregelt?

    Danke!



    Ps: Mache gerade ein Wett-coden wäre also nett wenn mir jemand hilft ;)
     
    #1
  2. games6471
    Offline

    games6471

    Zunächst ein paar Hinweise gegen zukünftige Fehler, die mir gerade auf die schnelle aufgefallen sind.

    1.Du solltest nicht auf bei einem Command den sender zu einem Player casten, es könnte nämlich auch ein Spieler sein, der diesen Befehl ausführt (Zeile 33).
    2. Wenn Bukkit kein Spieler findet, wird null zurückgegeben und kein Player Objekt, dass man mit .isOnline abfragen kann (Zeile 80). Also kann dies zu einer NullPointerException führen, da keine Null-Prüfung existiert.
    3. Wenn du schon den genauen Namen speicherst, kannst du gleich getPlayerExact aufrufen (Zeile 69), da dort nicht nach dem ähnlichsten Namen gesucht wird und du somit auch den wirklich richtigen Spieler findest.
    4. p.isOnline wird immer wahr zurückgegeben (Zeile 36), das bedeutet, dass der der Spieler gar nicht die Permission benötigt.
    5. Wenn der Spieler nicht online ist wird der Eintrag nicht von der Liste gelöscht und man wird somit immer wieder den selben Eintrag bekommen, bis der Spieler online UND man den Eintrag abruft (Zeile 90f.) Zusätzlich wird der Admin, Moderator, etc. nicht ordentlich informiert, wenn der Spieler offline ist.

    Kannst du mal genau posten, wie der Befehl ausgeführt wurde, um eine schnellere Fehleranalyse durchzuführen?
     
    #2
  3. CodEr
    Offline

    CodEr

    Registriert seit:
    20. April 2014
    Beiträge:
    8
    Wie meinst du "genau posten"?
     
    #3
  4. games6471
    Offline

    games6471

    Befehl:

    Code (Text):
    1. /bla eins zwei drei vier
     
    #4
  5. CodEr
    Offline

    CodEr

    Registriert seit:
    20. April 2014
    Beiträge:
    8
    /hilfe Ich brauche Hilfe
     
    #5
  6. games6471
    Offline

    games6471

    Funktioniert doch.
     
    #6
  7. CodEr
    Offline

    CodEr

    Registriert seit:
    20. April 2014
    Beiträge:
    8
    Das sieht aber so aus:

    /hilfe Ich brauche Hilfe


    --



    /helfen


    -> Ich


    --



    /helfen

    -> Ich brauche



    --



    /helfen

    -> Ich brauche Hilfe




    Komisch oder?
     
    #7
  8. games6471
    Offline

    games6471

    Ich hab den Befehl und die Klasse mit Copy-Paste eingefügt. Also bei mir funktioniert das.
     
    #8