Bukkit Code Fragen

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

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. MrPyro13
    Offline

    MrPyro13

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

    ich habe gerade angefangen Bukkit-Programmierung zu erlernen und habe nun folgenden Code auf einem YouTube Tutorial abgepinselt und habe dazu zwei kleine Fragen:

    Hier der Code:
    Code (Text):
    1.  
    2. package de.mrpyro13.tutorial;
    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.entity.Player;
    9.  
    10. public class HealCommand implements CommandExecutor {
    11.  
    12.     @Override
    13.     public boolean onCommand(CommandSender cs, Command cmd, String label, String[] args) {
    14.         Player p = null;
    15.         if (args.length == 0) {
    16.             if (cs instanceof Player) {
    17.                 p = (Player) cs;
    18.             } else {
    19.                 cs.sendMessage("$cDu kannst dich als Konsole nicht heilen");
    20.                 return true;
    21.             }
    22.         } else {
    23.             String name = args[0];
    24.             p = Bukkit.getPlayer(name);
    25.         }
    26.         if (p==null) {
    27.             cs.sendMessage("§cDer Spieler ist nicht online!");
    28.             return true;
    29.         }
    30.        
    31.         p.setHealth(20);
    32.         if (p != cs) {
    33.         cs.sendMessage("§aDu hastn " + p.getName() + " geheilt" );
    34.         p.sendMessage("§aDu wurdest von " + cs.getName() + " geheilt" );
    35.         } else {
    36.             p.sendMessage("§aDu hast dich geheilt");
    37.         }
    38.         return true;
    39.     }
    40.    
    41.  
    42. }
    43.  

    Frage 1: Muss das (Player) da stehen oder reicht p = cs; ?
    Frage 2: Was sagt diese Zeile aus bzw ist diese notwendig?
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    1. Ja muss es, denn das Plugin kennt den cs ja nur als CommandSender.

    2. Diese Zeile holt sich das nullte Argument, das den args beim befehl übergeben wurde.

    z.B.

    /heal Maja

    Dann ist Maja das nullte Argument. Und ja, die muss da stehen, wenn du jemand anderen heilen möchtest.
    Ich würde aber anstatt else noch einmal else if abfragen, ob die Argumentenlänge 1 ist.
     
    #2
  3. Crafter213
    Offline

    Crafter213

    Registriert seit:
    9. August 2012
    Beiträge:
    353
    Code (Text):
    1. CommandSender cs
    cs ist also nicht vom Typ Spieler, sondern vom Typ "CommandSender".
    Ein CommandSender kann z.B. auch die Konsole sein, wenn der Command dort eingegeben wurde.
    Da die Konsole aber z.B. keine Position in der Welt hat und auch nicht teleportiert werden kann, ist dies so auch nicht mit CommandSendern möglich. Auch kann die Konsole nicht sterben und hat keine Lebensanzeige ;)

    Code (Text):
    1.  
    2. if (cs instanceof Player){
    3.   p = (Player) cs;
    4. }
    5.  
    Das prüft, ob der Command von einem Spieler gestartet wurde.
    (Player) cs castet dann; aus dem "CommandSender" wird ein "Player"-Objekt. So kannst du nun auch auf den Spieler an sich zugreifen
    und ihn teleportieren oder z.B. auch das Inventar verändern. Oder ihn halt heilen.


    Code (Text):
    1. String name = args[0];
    Direkt notwendig ists nicht, aber evtl. schöner und übersichtlicher:
    Ein String "name" wird erstellt; den zu benutzen ist übersichtlicher als immer args[0] zu schreiben.

    args[0] ist das erste Argument, das dem Command übergeben wurde.
    Argumente sind alle Eingaben nach dem Command und durch leerzeichen getrennt:
    /command [arg0] [arg1] [arg2] [...]
    Es können quasi unbegrenzt viele Argumente übergeben werden, auch kein einziges.
    Prüfe immer mit args.length, wie viele Argumente da sind.
     
    #3
  4. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ich denke, dass ich es verstanden habe:

    Code (Text):
    1.  
    2. else {
    3.             String name = args[0];
    4.             p = Bukkit.getPlayer(name);
    5. }
    6.  
    Der String NAME (zB MrPyro13) wird als Argument 0 gesetzt. Dann wird der Variable p ,der Spieler von dem Argument 0, zugeschrieben.
    Wobei der Spieler von dem String NAME herausgefunden wurde...

    Ich habe den String name nicht den (name) zugeordnet *facepalm*
     
    #4
  5. best_ronsuper
    Offline

    best_ronsuper

    Registriert seit:
    8. August 2013
    Beiträge:
    16
    Minecraft:
    best_ronsuper
    Pass auf dass du überall § benutz ;) oder du lässt dir die & übersetzten, was aber eig. Sinnlos ist da du direkt § benutzen kannst ;)
     
    #5
  6. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    @best_ronsuper
    Ja, danke ;D

    Noch mal eine Frage:
    Wie erstelle ich ein Subcommand in einer extra Klasse? Also zB /meinplugin help oder /meinplugin heal. Ist das möglich?
    Ich habe mir vorgenommen, für jeden Befehl und Subbefehl eine eigene Klasse zu erstellen.
     
    #6
  7. Yellowphoenix18
    Offline

    Yellowphoenix18

    Registriert seit:
    26. März 2013
    Beiträge:
    267
    Ort:
    Niedersachsen
    Minecraft:
    YellowPhoenix18
    Ja,das ist eigentlich nicht schwer.
    Hier einmal ein Code:
    if (cmd.getName().equalsIgnoreCase("gm")) {
    if (p.hasPermission("ucx.gamemode")) {

    if (args.length == 0) {

    p.sendMessage("Welcher Gamemode??");
    }
    if (args.length == 1) {
    if (args[0].equalsIgnoreCase("1")) {

    p.performCommand("gamemode 1");
    p.sendMessage("Dein GameMode wurde geändert");
    }
    if (args[0].equalsIgnoreCase("0")) {

    p.performCommand("gamemode 0");
    p.sendMessage("Dein GameMode wurde geändert");
    }

    }
    }
    }

    So,hier siehst du nun,als erstes den HauptCommand,danach die Permission und dannach if (args.length == 0) {,hier wird überprüft,wie viele Argumente der Befehl hat,in diesem Fall 1,daher fehlt aber noch ein Argument und es wird eine Frage gestellt.Später kommt Die Argumenten-Länge 2,dort wird dann immer nach dem zweiten Argument geguckt beim ersten Punkt "1",somit muss der Befehl /gm 1 eingegeben werden und der Teil wird ausgeführt.Um diesen Befehl nun zu setzen musst du nur den HauptCommand(Hier "gm") in die plugin.yml eintragen.

    Ich hoffe ich konnte helfen,mfg YellowPhoenix18
     
    #7
  8. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ich weiß nicht so ganz...
    Gehen wir von einem SurvivalGames Plugin etc. aus. Es gibt /sg start, /sg stop und /sg vote (als Beispiel)
    Nun möchte ich den /sg start Befehl in einer eigenen Klasse den /sg stop Befehl in einer eigenen Klasse und den /sg vote Befehl in einer eigenen Klasse.
     
    #8
  9. Crafter213
    Offline

    Crafter213

    Registriert seit:
    9. August 2012
    Beiträge:
    353
    Du hast natürlich die Möglichkeit, ein Package für den Command und viele eigene Klassen zu nutzen... das würde ch aber nciht machen.
    Eine Klasse pro "echtem" Command ist gaanz gut; Subcommands gehen da recht gut ebenfalls rein.
    Ich habs so gelöst (Auszug):

    Code (Text):
    1.  
    2. {
    3.     @Override
    4.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    5.        
    6.         if(!sender.hasPermission(cmd.getPermission())) {
    7.             sender.sendMessage("No Permission");
    8.             return true;
    9.         }
    10.         if(args.length < 1) {
    11.             sender.sendMessage("Usage:");
    12.             sender.sendMessage("  /haupt - Show help");
    13.             sender.sendMessage("  /haupt [Command; Params] - Commands:");
    14.             sender.sendMessage("    sub1 - Bla");
    15.             sender.sendMessage("    sub2 <weitere Params> - Blub");
    16.             return true;
    17.         }
    18.        
    19.        
    20.         if(args[0].equalsIgnoreCase("sub1")) {
    21.             haupt_sub1(sender);
    22.             return true;
    23.         }
    24.         if(args[0].equalsIgnoreCase("sub2")) {
    25.             Castle_sub2(sender, args);
    26.             return true;
    27.         }        
    28.        
    29.         sender.sendMessage("Unknown Subcommand!");
    30.         return true;
    31.     }
    32.    
    33.     void haupt_sub1(CommandSender sender) {
    34.         if(!sender.hasPermission("PluginName.haupt.sub1")) {
    35.             sender.sendMessage("No permission");
    36.             return;
    37.         }
    38.         [...]
    39.         return;
    40.     }
    41.     void haupt_sub2(CommandSender sender, String[] args) {
    42.         if(!sender.hasPermission("Pluginname.haupt.sub2")) {
    43.             sender.sendMessage("No permission");
    44.             return;
    45.         }
    46.         if(args.length < [Anzahl der benötigten Parameter]) {
    47.             sender.sendMessage("Usage: [...]");
    48.             return;
    49.         }
    50.         [...]
    51.         return;
    52.     }
    53.  
    54. }
    55.  
     
    #9
  10. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ok, das mit den Subcommands habe ich so halbwegs gecheckt ;)
    Doch was ich nicht verstehen will, ist die Übernahme einer 2. Person bei zB /heal anderer_User .

    Das geht doch mit:
    Code (Text):
    1.  
    2. Player p = null; <--- Definiert die Variable leer
    3. p = (Player) cs <--- Legt fest, dass die Variable p ein Spieler sein muss (als CommandSender)
    4. String name = args[0]; <--- Definiert das Argument 0 als Zeichenkette/String NAME
    5. p = Bukkit.getPlayer(name); <--- ?????
    6.  
    Und hier mein Code dazu (Schicke einfach mal den ganzen Command-Code):
    Code (Text):
    1.  
    2. package de.mrpyro13.myplugin;
    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.command.ConsoleCommandSender;
    9. import org.bukkit.entity.Player;
    10.  
    11. public class MyPlugin_Command implements CommandExecutor {
    12.  
    13.     @Override
    14.     public boolean onCommand(CommandSender cs, Command cmd, String label, String[] args) {
    15.         if (args.length == 0) {
    16.             cs.sendMessage("§6Willkommen " + cs.getName() + "§6, bei der myPlugin-Information");
    17.             cs.sendMessage("§aName    : myPlugin");
    18.             cs.sendMessage("§aAutor   : MrPyro13");
    19.             cs.sendMessage("§aVersion : v0.1");
    20.             return true;
    21.         } else if (args.length == 1) {
    22.             if (args[0].equalsIgnoreCase("help")) {
    23.                 cs.sendMessage("§6myPlugin Befehle");
    24.                 cs.sendMessage("§a/myplugin     " + " §6- " + "§aInformationen zum Plugin");
    25.                 cs.sendMessage("§a/myplugin help" + " §6- " + "§aBefehlsliste des Plugins");
    26.                 cs.sendMessage("§a/myplugin message [Spieler]" + " §6- " + "§aSende eine Test-Nachricht");
    27.                 return true;
    28.             } else if (args[0].equalsIgnoreCase("heal")) {
    29.                 if (args.length == 1) {
    30.                     if (cs instanceof ConsoleCommandSender) {
    31.                         cs.sendMessage("§cFehler: Dieser Befehl ist nur fuer Spieler!");
    32.                         return true;
    33.                     }
    34.                     Player p = null;
    35.                     p = (Player) cs;
    36.                     p.setHealth(20.0);
    37.                     p.sendMessage("§aDu hast dich geheilt!");
    38.                     return true;
    39.                 }
    40.                 if (args.length == 2) {
    41.                     Player p = null;
    42.                     p = (Player) cs;
    43.                     String name = args[1];
    44.                     p = Bukkit.getPlayer(name);
    45.                     if (p != cs) {
    46.                         p.setHealth(20.0);
    47.                         cs.sendMessage("§aDu hastn " + p.getName() + " geheilt" );
    48.                         p.sendMessage("§aDu wurdest von " + cs.getName() + " geheilt" );
    49.                         return true;
    50.                         } else {
    51.                             p.setHealth(20.0);
    52.                             p.sendMessage("§aDu hast dich geheilt");
    53.                             return true;
    54.                         }
    55.                                                                        
    56.                 }
    57.                                                                                                        
    58.             }
    59.         }
    60.        
    61.         cs.sendMessage("§cFehler! Nutze /myplugin help um alle Befehle zu sehen");
    62.         return true;
    63.     }
    64.  
    65. }
    66.  
    67.  

    Das Selbstheilung funktioniert, jedoch die Fremdheilung geht nicht. Da kommt die allerletzte Nachricht:

     
    #10
  11. Crafter213
    Offline

    Crafter213

    Registriert seit:
    9. August 2012
    Beiträge:
    353
    Code (Text):
    1. p = (Player) cs <--- Legt fest, dass die Variable p ein Spieler sein muss (als CommandSender)
    Nein.
    Das gibt die dir den Spieler zu cs
    Bsp: MCPlayer nutzt den Command, dann ist cs= MCPlayer_ABER_vomTypCommandSender
    (Player) cs -> das gibt dir wieder MCPlayer; also den, der den Command aufruft

    Code (Text):
    1. String name = args[0]; <--- Definiert das Argument 0 als Zeichenkette/String NAME
    Nein; Argument Nr. 0 wird hier nicht definiert, sondern aufgerufen.
    "name" wird als String deklariert (Typ = String) und mit agrs[0] definiert; in "name" steht also das Gleiche wie in "agrs[0]"

    Code (Text):
    1. p = Bukkit.getPlayer(name); <--- ?????
    Das sollte so funktionieren.
    Danach noch
    Code (Text):
    1.  
    2. if(p == null) {
    3.     cs.sendMessage("Error getting Player " + name);
    4.     return true;
    5. }
    6.  
     
    #11
  12. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    So... Alles geht, außer dieser Abschnitt.

    Code (Text):
    1.  
    2. else if (args.length == 2) {
    3.                     Player p = null;
    4.                     String name = args[1];
    5.                     p = Bukkit.getPlayer(name);
    6.                     cs.sendMessage("Du hast");
    7.                     return true;
    8.                 } else {
    9.                     cs.sendMessage("§cFehler! Nutze /myplugin help um alle Befehle zu sehen");
    10.                     return true;
    11.                
    12.  
     
    #12
  13. Crafter213
    Offline

    Crafter213

    Registriert seit:
    9. August 2012
    Beiträge:
    353
    p.setHealth(20);
     
    #13
    1 Person gefällt das.
  14. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Dieser Abschnitt (oben) wird ja übersprungen...
    Der nimmt dann nur noch diese Zeile und fertig:

    Code (Text):
    1.  
    2. cs.sendMessage("§cFehler! Nutze /myplugin help um alle Befehle zu sehen");
    3. return true;
    4.  

    //EDIT: Kann geschlossen werden. Der Code ist mir zu unübersichtlich, ich starte das kleine "Projekt" morgen nochmal neu.
     
    #14
Status des Themas:
Es sind keine weiteren Antworten möglich.