Error bei selbstprogrammiertem Java Plugin

Dieses Thema im Forum "Server Plugins" wurde erstellt von Nils070697, 27. Juli 2012.

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

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Hey Leute ich habe mich nun an das programmieren von eigenen Plugins gesetzt doch nun taucht plötzlich ein mir unerklärlicher Fehler auf.
    Eclipse zeigt weder Errors noch Warnungen an...
    Ich hoffe ihr könnt mir helfen!

    Datein:
    SimpleArmor.java
    Code (Text):
    1. package me.Nils070697.SimpleArmor;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.command.Command;
    5. import org.bukkit.command.CommandSender;
    6. import org.bukkit.entity.Player;
    7. import org.bukkit.inventory.ItemStack;
    8. import org.bukkit.plugin.PluginDescriptionFile;
    9. import org.bukkit.plugin.PluginManager;
    10. import org.bukkit.plugin.java.JavaPlugin;
    11.  
    12. public class SimpleArmor extends JavaPlugin{
    13.    
    14.     PluginManager manager = this.getServer().getPluginManager();
    15.  
    16.     @Override
    17.     public void onDisable() {
    18.        
    19.         PluginDescriptionFile descFile = this.getDescription();
    20.         System.out.println("[" + descFile.getName() + "]" + descFile.getName() + "wurde deaktiviert");
    21.    
    22.     }
    23.    
    24.     @Override
    25.     public void onEnable() {
    26.        
    27.         PluginDescriptionFile descFile = this.getDescription();
    28.         System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde aktiviert");
    29.         System.out.println("[" + descFile.getName() + "] Version: " + descFile.getVersion());
    30.         System.out.println("[" + descFile.getName() + "] Programmiert von " + descFile.getAuthors());
    31.    
    32.     }
    33.    
    34.     public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args){
    35.         PluginDescriptionFile descFile = this.getDescription();
    36.         boolean erfolg = false;
    37.        
    38.         Player p = (Player)sender;
    39.        
    40.         // Kommando "/armor"
    41.         if(cmd.getName().equalsIgnoreCase("armor")){
    42.             if(args.length == 0){
    43.                
    44.                 // Diaruessi
    45.                 p.getInventory().setHelmet(new ItemStack(310));
    46.                 p.getInventory().setChestplate(new ItemStack(311));
    47.                 p.getInventory().setLeggings(new ItemStack(312));
    48.                 p.getInventory().setBoots(new ItemStack(313));
    49.                 // Diaschwert
    50.                 p.getInventory().addItem(new ItemStack(276, 1));
    51.                
    52.                 p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + "Du hast eine Diamantenruestung und ein Diamantenschwert bekommen!");
    53.                 erfolg = true;
    54.                
    55.             }
    56.             else {
    57.                
    58.                 erfolg = false;
    59.                
    60.             }
    61.            
    62.         }
    63.            
    64.             // Kommando "/SimpleArmor"
    65.             if(cmd.getName().equalsIgnoreCase("SimpleArmor")){
    66.                 if(args.length == 0){
    67.                    
    68.                     p.sendMessage(ChatColor.AQUA + "----------" + ChatColor.RED + "SimpleArmor Kommandoliste" + ChatColor.AQUA + "----------");
    69.                     p.sendMessage(ChatColor.RED + "/armor" + ChatColor.AQUA + "  Gibt dir eine Diamantenrüstung und ein Diamantenschwert.");
    70.                    
    71.                     erfolg = true;
    72.                    
    73.                 }
    74.                 else {
    75.                    
    76.                     erfolg = false;
    77.                
    78.                 }
    79.            
    80.             }
    81.        
    82.         return erfolg;
    83.     }
    84.    
    85.  
    86.    
    87. }
    88.  

    Plugin.yml:
    Code (Text):
    1. name: SimpleArmor
    2. version: 1.0
    3. main: me.Nils070697.SimpleArmor.SimpleArmor
    4. author: Nils070697
    5. website: maggicraft.de.gg
    6. commands:
    7.      SimpleArmor:
    8.           description: Zeigt alle Befehle
    9.           usage: /<command>
    10.      armor:
    11.           description: Gibt Ruestung
    12.           usage: /<command>
    13.  

    Fehlerlog:
    Code (Text):
    1. 15:47:29 [SCHWERWIEGEND] Could not load 'plugins\SimpleArmor.jar' in folder 'plu
    2. gins'
    3. org.bukkit.plugin.InvalidPluginException: java.lang.NullPointerException
    4.         at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.j
    5. ava:149)
    6.         at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.
    7. java:305)
    8.         at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager
    9. .java:230)
    10.         at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:213)
    11.         at org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:189)
    12.         at net.minecraft.server.ServerConfigurationManager.<init>(ServerConfigur
    13. ationManager.java:53)
    14.         at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:166)
    15.         at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:432)
    16.         at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
    17. Caused by: java.lang.NullPointerException
    18.         at me.Nils070697.SimpleArmor.SimpleArmor.<init>(SimpleArmor.java:14)
    19.         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    20.  
    21.         at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    22.  
    23.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
    24. rce)
    25.         at java.lang.reflect.Constructor.newInstance(Unknown Source)
    26.         at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.j
    27. ava:145)
    28.         ... 8 more
     
    #1
  2. Könnte vielleicht hierran liegen:
    PluginManager manager = this.getServer().getPluginManager();

    Weil das Plugin selber noch nicht geladen wurde? Ich bevorzuge Bukkit.getPluginManager();
     
    #2
  3. Janomine
    Offline

    Janomine

    Registriert seit:
    22. Dezember 2011
    Beiträge:
    24
    Mach das return erfolg weg und ersetze es durch return true oder return false

    Und das getdescription nach command booelean ist auch falsch.

    Das gehört wenn dann beim onenable teil dazu.

    Ich entschuldige mich für die rechtschreibefehler grund dafür ist das ich am movilgerät sitze
     
    #3
  4. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Hm ich habe das PluginManager manager = this.getServer().getPluginManager(); einfach weggelassen jetzt gehts...

    Kann geclosed werden, danke
     
    #4
  5. Benni1000
    Offline

    Benni1000 Ehem. Teammitglied

    Registriert seit:
    4. Mai 2012
    Beiträge:
    1.408
    Das mit dem erfolg=true oder false, hab ich jetzt schon das zweite mal gesehen.
    Wer verbreitet bitte so einen Schwachsinn?
    Nicht das es nicht funktionieren würde, aber es ist einfach unnötig, wenn man einfach return true; oder return false; machen kann.

    Und das hier:
    Code (Text):
    1. if(args.length == 0){
    Ist nicht sehr benutzerfreundlich, warum sollte der command nicht funktionieren, wenn jemand was an das command anhängt?
     
    #5
  6. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Ich finde das mit dem Erfolg eigentlich ganz praktisch o_O.

    Und das wegen der Argumentlänge weil ich noch Argumente einbinden will...
     
    #6
  7. ChristianG
    Online

    ChristianG

    @Benni
    Das mit dem erfolg=false und so weiter hat der YouTuber DeBukkit verbreitet...
    Er hat dies aber mal in einem späteren Video berichtigt, aber in den erstrn Video hat er es so erklärt...
     
    #7
  8. Du solltest trotzdem auch eine Ausgabe für invalide Argumente machen etcpp.
    Die methode mit Erfolg ist valide, jedoch wird dann die ganze Methode noch weiter ausgeführt. Ein
    return true; oder ein return false; beendet automatisch die Funktion und es wird direkt weiterverarbeitet. (In deinem Fall kein Problem, aber trotzdem erwähnenswert)
     
    #8
  9. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Ich habe das mit den Variablen bei Bool Funktionen aus meinem Programmierstil in C++ übernommen, doch warum ich mir das mal angewöhnt hatte weiß ich nicht ;)
    Doch natürlich habt ihr recht, nach dem Befehl kann ja kein weiterer kommen...
     
    #9
  10. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    So ich warte jetzt nochmal mit einem neuen Problem auf und zwar funktioniert das Command Armor nicht wie ich es mir vorstelle.

    Man soll /armor gefolgt von dem Rüstungstyp eingeben können um dann die entsprechenden Items bekommen zu kommen.
    Deswegen war meine Idee, das 1. Argument mit den jeweiligen Strings zu vergleichen, doch bei mir springt der über alle if und else if drüber bis hinunter zum else und gibt den Error aus. (Die Stelle ist im Quellcode farbig markiert...)




    SimpleArmor.jar
    Code (Text):
    1. package me.Nils070697.SimpleArmor;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.command.Command;
    5. import org.bukkit.command.CommandSender;
    6. import org.bukkit.entity.Player;
    7. import org.bukkit.inventory.ItemStack;
    8. import org.bukkit.plugin.PluginDescriptionFile;
    9. import org.bukkit.plugin.java.JavaPlugin;
    10.  
    11. public class SimpleArmor extends JavaPlugin{
    12.    
    13.  
    14.     @Override
    15.     public void onDisable() {
    16.        
    17.         PluginDescriptionFile descFile = this.getDescription();
    18.         System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde deaktiviert");
    19.    
    20.     }
    21.    
    22.     @Override
    23.     public void onEnable() {
    24.         loadConfig();
    25.        
    26.         PluginDescriptionFile descFile = this.getDescription();
    27.         System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde aktiviert");
    28.         System.out.println("[" + descFile.getName() + "] Version: " + descFile.getVersion());
    29.         System.out.println("[" + descFile.getName() + "] Programmiert von " + descFile.getAuthors());
    30.    
    31.     }
    32.    
    33.     public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args){
    34.         PluginDescriptionFile descFile = this.getDescription();
    35.        
    36.         Player p = (Player)sender;
    37.        
    38.         // Kommando "/armor"
    39.         if(cmd.getName().equalsIgnoreCase("armor")){
    40.             if(args.length == 0){
    41.                
    42.  
    43.                
    44.                 String Error = this.getConfig().getString("Config.messages.Error");
    45.                 p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
    46.                
    47.                 return false;
    48.                
    49.             }
    50.            
    51.             [color=#ff0000]if(args.length == 1){
    52.                
    53.                 Integer Helm;
    54.                 Integer Chest;
    55.                 Integer Leg;
    56.                 Integer Boot;
    57.                 Integer Sword;
    58.                
    59.                 if(args[0] == "Leather"){
    60.                    
    61.                     Helm = 298;
    62.                     Chest = 299;
    63.                     Leg = 300;
    64.                     Boot = 301;
    65.                     Sword = 272;
    66.                                        
    67.                 }
    68.                 else if(args[0] == "Chain"){
    69.                    
    70.                     Helm = 302;
    71.                     Chest = 303;
    72.                     Leg = 304;
    73.                     Boot = 305;
    74.                     Sword = 267;
    75.                                        
    76.                 }
    77.                 else if(args[0] == "Iron"){
    78.                    
    79.                     Helm = 306;
    80.                     Chest = 307;
    81.                     Leg = 308;
    82.                     Boot = 309;
    83.                     Sword = 267;
    84.                                        
    85.                 }
    86.                 else if(args[0] == "Gold"){
    87.                    
    88.                     Helm = 314;
    89.                     Chest = 315;
    90.                     Leg = 316;
    91.                     Boot = 317;
    92.                     Sword = 283;
    93.                                        
    94.                 }
    95.                 else if(args[0] == "Diamond"){
    96.                    
    97.                     Helm = 310;
    98.                     Chest = 311;
    99.                     Leg = 312;
    100.                     Boot = 313;
    101.                     Sword = 276;
    102.                                        
    103.                 }
    104.                 else{
    105.                    
    106.                     String Error = this.getConfig().getString("Config.messages.Error");
    107.                     p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
    108.                    
    109.                     return false;
    110.                    
    111.                 }[/color]
    112.                
    113.                 GiveArmor(p,Helm,Chest,Leg,Boot,Sword);
    114.                
    115.                 String cArmor = this.getConfig().getString("Config.messages.Armor");
    116.                 p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + cArmor);
    117.                
    118.                 return true;
    119.                
    120.             }
    121.        
    122.             if(args.length <1){
    123.                
    124.                 String Error = this.getConfig().getString("Config.messages.Error");
    125.                 p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
    126.                
    127.                 return false;
    128.                
    129.             }
    130.            
    131.         }
    132.            
    133.             // Kommando "/SimpleArmor"
    134.             if(cmd.getName().equalsIgnoreCase("SimpleArmor")){
    135.                 if(args.length == 0){
    136.                    
    137.                    
    138.                     p.sendMessage(ChatColor.AQUA + "----------" + ChatColor.RED + "SimpleArmor Kommandoliste" + ChatColor.AQUA + "----------");
    139.                     String hArmor = this.getConfig().getString("Config.help.Armor");
    140.                     p.sendMessage(ChatColor.RED + "/armor" + ChatColor.AQUA + "  " + hArmor);
    141.                     String hSimpleArmor = this.getConfig().getString("Config.help.SimpleArmor");
    142.                     p.sendMessage(ChatColor.RED + "/Simplearmor" + ChatColor.AQUA + "  " + hSimpleArmor);
    143.                    
    144.                     return true;
    145.                    
    146.                 }
    147.                 else {
    148.                    
    149.                     return false;
    150.                
    151.                 }
    152.            
    153.             }
    154.        
    155.         return false;
    156.     }
    157.    
    158.     private void GiveArmor(Player play ,int ihelm ,int ichest,int ileg,int iboot,int iSword){
    159.        
    160.         // Diaruessi
    161.         play.getInventory().setHelmet(new ItemStack(ihelm));
    162.         play.getInventory().setChestplate(new ItemStack(ichest));
    163.         play.getInventory().setLeggings(new ItemStack(ileg));
    164.         play.getInventory().setBoots(new ItemStack(iboot));
    165.         // Diaschwert
    166.         play.getInventory().addItem(new ItemStack(iSword, 1));
    167.     }
    168.    
    169.     private void loadConfig(){
    170.        
    171.         String path1 = "Config.messages.Armor";
    172.         this.getConfig().addDefault(path1, "Du hast Rüstung und ein Schwert bekommen");
    173.         String path2 = "Config.messages.Error";
    174.         this.getConfig().addDefault(path2, "Es liegt ein Fehler in der Kommando Syntax vor.");
    175.        
    176.         String path10 = "Config.help.Armor";
    177.         this.getConfig().addDefault(path10, "Gibt dir eine Diamantenrüstung und ein Diamantenschwert. (Leather, Chain, Iron, Gold, Diamond)");
    178.         String path11 = "Config.help.SimpleArmor";
    179.         this.getConfig().addDefault(path11, "Zeigt alle Befehle an.");
    180.    
    181.         this.getConfig().options().copyDefaults(true);
    182.         this.saveConfig();
    183.        
    184.     }
    185.    
    186.    
    187. }

    EDIT: Farbig geht nicht in Codes...
     
    #10
  11. Benni1000
    Offline

    Benni1000 Ehem. Teammitglied

    Registriert seit:
    4. Mai 2012
    Beiträge:
    1.408
    Du sollst in Java String auf keinen Fall mit "==" vergleichen sondern mit String.equals oder mit equalsIgnoreCase.
    Probiers damit: http://pastebin.com/8pjyPeQY
     
    #11
  12. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Danke ich bin in Java noch nicht so gewohnt, dachte nur das es mit C++ ähnlich wäre...
     
    #12
  13. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    ich kenne die alten Array Methoden, aber im neuen vergleicht man Int sowie String mit dem gleichen Operator das meinte ich...
     
    #13
  14. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    So ich frage euch gerade einfach noch mal wenn das in Ordnung ist ;)

    1. Ich will einen Countdown erstellen, dazu brauch ich 1 Sekündige Pausierungen. Darf ich das normal wie in jedem Java Programm machen? Oder nur mit einem bestimmten Befehl?
    2. Kann ich innerhalb des Plugins pro Befehl mithilfe eines Integer-Wertes hochzählen, auf welche aber jeder Spieler zugreifen kann?

    Danke im Vorraus!
     
    #14
  15. Let's Mine
    Offline

    Let's Mine Ehem. Teammitglied

    Registriert seit:
    1. Dezember 2011
    Beiträge:
    421
    Ort:
    Let's Mine
    Minecraft:
    LetsMine
    Den main Bukkit Thread solltest du natürlich nicht pausieren.

    Und mach einfach eine public Variable, die im Ram bleibt, z.B. in der Main Plugin class oder wie du das lösen willst.
     
    #15
  16. Benni1000
    Offline

    Benni1000 Ehem. Teammitglied

    Registriert seit:
    4. Mai 2012
    Beiträge:
    1.408
    Du kannst entweder einen Thread erstellen, oder du benutzt den bukkit scheduler.
     
    #16
  17. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    @Benni Ok also thread.pause darf ich machen, hatte nur befürchtet, das es eventuell irgendwie auf den ganzen Server schlägt ;)
    @Lets Mine Also in der Main Class des Plugins?
     
    #17
  18. Scrayos
    Offline

    Scrayos Verifiziert

    Registriert seit:
    11. Februar 2012
    Beiträge:
    276
    Ort:
    Köln
    Minecraft:
    Scrayos
    Der Heartbeat den der Bukkit-Scheduler vorgibt, ist meiner Meinung nach viel empfehlenswerter.
     
    #18
  19. Hier mal Beispiele:

    zu 1)
    Einfach z.B.
    Code (Text):
    1. public MeinPlugin extends JavaPlugin{
    2. private static int zahl = 0;
    3.  
    4. //....
    Dann einfach zahl++;

    zu 2) Das müsste in deine Plugin Main Klasse
    Code (Text):
    1. this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
    2.    @Override
    3.    public void run() {
    4.        //deine Methode
    5.    }
    6. }, (long) ZEIT*20);
    Zur zeit sei gesagt es wird in Ticks angegeben. 20 Ticks~ 1 Sekunde

    Mehr zum Sheduler findest du hier:
    http://wiki.bukkit.org/Scheduler_Programming
     
    #19
  20. Nils070697
    Offline

    Nils070697

    Registriert seit:
    2. Juni 2012
    Beiträge:
    347
    Du hast die zahlen gerade vertauscht aber danke :)
     
    #20
Status des Themas:
Es sind keine weiteren Antworten möglich.