ServerPlugin Problem mit Vault PlayerSetGroup

Dieses Thema im Forum "Programmierung" wurde erstellt von Ivory1988, 30. Dezember 2013.

  1. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    Hey Leute ich hab nen kleines Problem bei mir im Plugin und find einfach den sch... Fehler nicht. irgendwo hab ich laut der Log ne NullPointerException.
    Vll findet ihr ja den Fehler.

    hier ma der Code:
    Code (Text):
    1. @EventHandler
    2.     public void Event(PlayerJoinEvent event){
    3.         String name = this.getDescription().getName();
    4.         String prefix = ChatColor.DARK_RED + "[" + name + "] " + ChatColor.AQUA;
    5.        
    6.         Player p = event.getPlayer();
    7.         String pname = p.getName();
    8.         if(mysql.ResultPlayer(pname) == true){
    9.             try{
    10.                 ResultSet rs = mysql.Query(pname);
    11.                
    12.             while (rs.next()){
    13.                 if (rs.getInt("Typ") == 1){
    14.                     String amount = rs.getString("Amount");
    15.                     double am = Double.parseDouble(amount);
    16.                     econ.depositPlayer(p.getName(), am);
    17.                     p.sendMessage(prefix + "Dir wurden " + am + " Dollar gutgeschrieben.");
    18.                     mysql.Delete(rs.getString("ID"));
    19.                    
    20.                 }else{
    21.                     double time = System.currentTimeMillis();
    22.                     double timevip = Double.parseDouble(rs.getString("Date"));
    23.                    
    24.                     if (time >= timevip){
    25.                         us.playerAddGroup(p, "Vip");
    26.                         event.setJoinMessage(prefix + "Willkommen zurück " + ChatColor.GOLD + "[VIP]" + p.getDisplayName());                      
    27.                     }else{
    28.                         us.playerAddGroup(p, "Spieler");
    29.                         p.sendMessage(prefix + "Deine VIP Zeit ist nun vorbei.");
    30.                         mysql.Delete(rs.getString("ID"));
    31.                        
    32.                     }
    33.                 }
    34.                
    35.             }
    36.             }catch(SQLException e){
    37.                 System.err.println(e);
    38.                
    39.             }          
    40.         }
    41.        
    42.     }
    und hier ma der Serverlog dazu:
    Code (Text):
    1. 2013-12-30 01:52:10 [SEVERE] Could not pass event PlayerJoinEvent to Deathrunner v0.1
    2. org.bukkit.event.EventException
    3.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:351)
    4.     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    5.     at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:31)
    6.     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:479)
    7.     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:464)
    8.     at net.minecraft.server.management.ServerConfigurationManager.func_72377_c(ServerConfigurationManager.java:319)
    9.     at net.minecraft.server.management.ServerConfigurationManager.func_72355_a(ServerConfigurationManager.java:180)
    10.     at net.minecraft.network.NetLoginHandler.completeConnection(NetLoginHandler.java:218)
    11.     at cpw.mods.fml.common.network.FMLNetworkHandler.handleClientConnection(FMLNetworkHandler.java:167)
    12.     at cpw.mods.fml.common.network.FMLNetworkHandler.onConnectionReceivedFromClient(FMLNetworkHandler.java:120)
    13.     at net.minecraft.network.NetLoginHandler.func_72529_d(NetLoginHandler.java:194)
    14.     at net.minecraft.network.NetLoginHandler.func_72532_c(NetLoginHandler.java:81)
    15.     at net.minecraft.server.ServerListenThread.func_71766_a(ServerListenThread.java:57)
    16.     at net.minecraft.server.dedicated.DedicatedServerListenThread.func_71747_b(SourceFile:29)
    17.     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:865)
    18.     at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:320)
    19.     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:732)
    20.     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:614)
    21.     at net.minecraft.server.ThreadMinecraftServer.run(SourceFile:573)
    22. Caused by: java.lang.NullPointerException
    23.     at me.ivory.deathrunner.Deathrunner.Event(Deathrunner.java:93)
    24.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    25.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    26.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    27.     at java.lang.reflect.Method.invoke(Method.java:606)
    28.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:349)
    29.     ... 18 more
    Die Zeile die im Log angesprochen wird ist diese hier:
    us.playerAddGroup(p, "Vip");
    Hoffe ihr findet da den Fehler.
     
    #1
  2. games6471
    Online

    games6471

    Könntest du uns auch zeigen, wo die Variable "us" deklariert und initialisiert wird?
     
    #2
  3. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    na klar:
    Code (Text):
    1.  
    2. .....
    3. import net.milkbowl.vault.permission.Permission;
    4. .....
    5.  
    6. public class Deathrunner extends JavaPlugin implements Listener{
    7.  
    8.     public static Economy econ = null;
    9.     public static Permission us = null;
    10. ......
    11. ......
    12. ......
    13.                 @EventHandler
    14.         public void Event(PlayerJoinEvent event){
    15. ........
    16.  
    dazwischen ist nur noch onEnable und Disable.
    Da ist nur die Mysql benutzerabfrage.

    Was mich nur wundert ist, dass die classe Player p funktioniert. Sonst würde ja darüber der Teil mit Amount nicht klappen.

    Das PlayeraddGroup bezieht sich auf dieses hier:
    Code (Text):
    1. public boolean playerAddGroup(Player player,
    2.                      String group)
    3.  
    4. Add player to a group. This will add a player to the group on the current World. This may return odd results if the permission system being used on the server does not support world-specific groups, or if the group being added to is a global group.
    5.  
    6. Parameters:
    7.     player - Player Object
    8.     group - Group name
    9. Returns:
    10.     Success or Failure
    Das ist hier zu finden.
     
    #3
  4. games6471
    Online

    games6471

    Also entweder wurde die Variable "us" noch gar nicht beschrieben oder sie wurde aus irgendeinem Grund nochmals mit "null" beschrieben. Denn wenn deine Angaben mit der Zeile stimmen, muss die Variable "us" null sein. Mögliche Gründe für eine NullPointerException (kurz: NPE) sind nämlich:

    Ich referenziere mal hier auf den Javadoc-Eintrag:
    • Calling the instance method of a null object.
    • Accessing or modifying the field of a null object.
    • Taking the length of null as if it were an array.
    • Accessing or modifying the slots of null as if it were an array.
    • Throwing null as if it were a Throwable value.

    Am besten schaust du dir mal deinen Code an, ob eventuell irgendwo "us" mit "null" beschrieben wurde oder die Variable noch gar nicht beschrieben wurde.

    EDIT: Also hat der Fehler nichts Vault zu tun.
     
    #4
  5. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    Es kommt ja nur oben in der initialiesierung vor und dann der Aufruf.
    also:

    public static Permission us = null;
    und:
    us.playerAddGroup(p, "Vip");

    habs auch ma grad umbenannt und es wird sonst wirklich nirgends aufgerufen.
    hier ma der gesammte code:
    Code (Text):
    1. package me.ivory.deathrunner;
    2.  
    3.  
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.logging.Logger;
    7.  
    8. import net.milkbowl.vault.economy.Economy;
    9. import net.milkbowl.vault.permission.Permission;
    10.  
    11. import org.bukkit.ChatColor;
    12. import org.bukkit.command.Command;
    13. import org.bukkit.command.CommandSender;
    14. import org.bukkit.entity.Player;
    15. import org.bukkit.event.EventHandler;
    16. import org.bukkit.event.Listener;
    17. import org.bukkit.event.player.PlayerJoinEvent;
    18. import org.bukkit.inventory.ItemStack;
    19. import org.bukkit.plugin.RegisteredServiceProvider;
    20. import org.bukkit.plugin.java.JavaPlugin;
    21.  
    22.  
    23.  
    24. public class Deathrunner extends JavaPlugin implements Listener{
    25.    
    26.     public Logger log = Logger.getLogger("Minecraft");
    27.     public static Economy econ = null;
    28.     public static Permission spieler = null;
    29.    
    30.    
    31.    
    32.     public Deathrunner(){
    33.        
    34.     }  
    35.    
    36.    
    37.     public void onEnable(){
    38.         if (!testEconomy()) {
    39.               log.info("Disabled because Vault is unavailable or no economy service is installed.");
    40.               getServer().getPluginManager().disablePlugin(this);
    41.             }
    42.         loadConfig();  
    43.        getServer().getPluginManager().registerEvents(this, this);
    44.        mysql.db = this.getConfig().getString("database.database");
    45.        mysql.ip = this.getConfig().getString("database.ip");
    46.        mysql.user = this.getConfig().getString("database.user");
    47.        mysql.pw = this.getConfig().getString("database.password");
    48.        mysql.Connect();
    49.        
    50.      }
    51.        
    52.    
    53.     public void onDisable(){
    54.         mysql.close();
    55.     }
    56.    
    57.    
    58.    
    59.         @EventHandler
    60.         public void Event(PlayerJoinEvent event){
    61.             String name = this.getDescription().getName();
    62.             String prefix = ChatColor.DARK_RED + "[" + name + "] " + ChatColor.AQUA;
    63.            
    64.             Player p = event.getPlayer();
    65.             String pname = p.getName();
    66.             if(mysql.ResultPlayer(pname) == true){
    67.                 try{
    68.                     ResultSet rs = mysql.Query(pname);
    69.                    
    70.                 while (rs.next()){
    71.                     if (rs.getInt("Typ") == 1){
    72.                         String amount = rs.getString("Amount");
    73.                         double am = Double.parseDouble(amount);
    74.                         econ.depositPlayer(p.getName(), am);
    75.                         p.sendMessage(prefix + "Dir wurden " + am + " Dollar gutgeschrieben.");
    76.                         mysql.Delete(rs.getString("ID"));
    77.                        
    78.                     }else{
    79.                         double time = System.currentTimeMillis();
    80.                         double timevip = Double.parseDouble(rs.getString("Date"));
    81.                        
    82.                         if (time >= timevip){
    83.                             spieler.playerAddGroup(p, "Vip");
    84.                             event.setJoinMessage(prefix + "Willkommen zurück " + ChatColor.GOLD + "[VIP]" + p.getDisplayName());                      
    85.                         }else{
    86.                             spieler.playerAddGroup(p, "Spieler");
    87.                             p.sendMessage(prefix + "Deine VIP Zeit ist nun vorbei.");
    88.                             mysql.Delete(rs.getString("ID"));
    89.                            
    90.                         }
    91.                     }
    92.                    
    93.                 }
    94.                 }catch(SQLException e){
    95.                     System.err.println(e);
    96.                    
    97.                 }          
    98.             }
    99.                
    100.         }
    101.  
    102.     @Override
    103.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    104.         String name = this.getDescription().getName();
    105.         String prefix = ChatColor.DARK_RED + "[" + name + "] " + ChatColor.AQUA;
    106.         Player p = null;
    107.         if(sender instanceof Player){
    108.             p = (Player) sender;
    109.         }
    110.        
    111.        
    112.         //Komando repair
    113.        
    114.        
    115.         if(cmd.getName().equalsIgnoreCase("repair")){
    116.             if (p != null){
    117.                 if (p.hasPermission("deathrunner.repair")){
    118.                     ItemStack item = p.getItemInHand();
    119.                     short max = item.getType().getMaxDurability();
    120.                     p.getItemInHand().setDurability(max);
    121.                     p.sendMessage(prefix + " Dein Item wurde repariert. Viel Spaß damit.");
    122.                     return true;   
    123.                 }else{
    124.                     p.sendMessage(prefix + " Du musst Vip sein um diesen Befehl nutzen zu können.");
    125.                     return true;
    126.                 }
    127.             }else{
    128.                 System.out.println("This command can only use by a player");
    129.                 return true;
    130.             }
    131.        
    132.            
    133.             //DRC Info Kommando
    134.            
    135.         }
    136.        
    137.         if(cmd.getName().equalsIgnoreCase("drc")){
    138.             if(p != null){
    139.                
    140.                 p.sendMessage(prefix + ":");
    141.                 p.sendMessage(ChatColor.AQUA + "Willkommen bei der Deathrunner Community");
    142.                 p.sendMessage(ChatColor.AQUA + "########################################");
    143.                 p.sendMessage(ChatColor.AQUA + "Tutorials über den Server findest du hier:");
    144.                 p.sendMessage(ChatColor.AQUA + "http://tinyurl.com/n2sffs5");
    145.                 p.sendMessage(ChatColor.AQUA + "Du willst Vip werden? Dann gehe auf:");
    146.                 p.sendMessage(ChatColor.AQUA + "http://deathrunner.de/index.php?page=shop");
    147.                
    148.                
    149.                
    150.             }else{
    151.                 System.out.println("This command can only use by a player");
    152.                 return true;
    153.             }
    154.            
    155.         }
    156.        
    157.        
    158.        
    159.        
    160.         return false;
    161.        
    162.     }
    163.  
    164.  
    165.  
    166.  
    167.     void loadConfig(){
    168.         this.getConfig();
    169.         this.getConfig().options().copyDefaults(true);
    170.         this.saveConfig();
    171.     }
    172.    
    173.     private boolean testEconomy() {
    174.         if (getServer().getPluginManager().getPlugin("Vault") == null) { return false; }
    175.         RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    176.         return (econ = rsp.getProvider()) != null;
    177.       }
    178.    
    179. }
    180.  
    und die mysql.java:
    Code (Text):
    1. package me.ivory.deathrunner;
    2.  
    3. import java.sql.Connection;
    4. import java.sql.DriverManager;
    5. import java.sql.ResultSet;
    6. import java.sql.SQLException;
    7.  
    8. public class mysql {
    9.  
    10.    
    11.    
    12.     static String ip = "";
    13.     static String user = "";
    14.     static String pw = "";
    15.     static String db = "";
    16.     static java.sql.Statement stmt;
    17.     public static Connection con;
    18.    
    19.    
    20.     public static void Connect(){
    21.        
    22.         try{
    23.            
    24.             con = DriverManager.getConnection("jdbc:mysql://" + ip + "/" + db, user, pw);
    25.             System.out.println("Mysql connectet");
    26.            
    27.         }catch(SQLException ex){
    28.             System.err.println(ex);
    29.         }
    30.        
    31.     }
    32.    
    33.     public static void close(){
    34.        
    35.         try{
    36.            
    37.             if(con != null){
    38.                 con.close();
    39.                
    40.             }
    41.            
    42.         }catch(Exception ex){
    43.             System.err.println(ex);
    44.            
    45.         }
    46.        
    47.     }
    48.    
    49.     public static void Update(String qry){
    50.         try{
    51.                 stmt = con.createStatement();
    52.                 stmt.executeQuery(qry);
    53.                
    54.         }catch(Exception e){
    55.                 System.err.println(e);
    56.         }
    57.     }
    58.    
    59.     public static ResultSet Query(String qry){
    60.         ResultSet rs = null;
    61.        
    62.         try{
    63.             stmt = con.createStatement();
    64.            
    65.             rs = stmt.executeQuery("SELECT * FROM `p1_minecraft` where Name = '" + qry + "';");
    66.            
    67.         }catch(Exception e){
    68.                 System.err.println(e);
    69.         }
    70.        
    71.         return rs;
    72.     }
    73.  
    74.  
    75.     public static boolean ResultPlayer(String qry){
    76.        
    77.         boolean rs = false ;
    78.        
    79.         try{
    80.             stmt = con.createStatement();
    81.             rs = stmt.execute("SELECT * FROM `p1_minecraft` where Name = '" + qry + "';");
    82.            
    83.         }catch(Exception e){
    84.                 System.err.println(e);
    85.         }
    86.        
    87.         return rs;
    88.     }
    89.    
    90.     public static void Delete(String string){
    91.         try{
    92.                 stmt = con.createStatement();
    93.                 stmt.execute("DELETE FROM `p1_minecraft` WHERE (`ID`='" + string + "');");
    94.                
    95.         }catch(Exception e){
    96.                 System.err.println(e);
    97.         }
    98.     }
    99. }
    100.  
    und noch die plugin.yml
    Code (Text):
    1. name: Deathrunner
    2. main: me.ivory.deathrunner.Deathrunner
    3. version: 0.1
    4. commands:
    5.   repair:
    6.     usage: /repair
    7.     permissions: deathrunner.repair
    8.   drc:
    9.     usage: /drc
    vll hilft das ja noch weiter... weil ich bin mit meinem Latein echt am Ende.
     
    #5
  6. games6471
    Online

    games6471

    Du musst auch die Variable "us" beschreiben, um sie nutzen zu können. Du kannst sie nicht einfach "null" lassen.
     
    #6
  7. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    das mache ich doch hiermit oder nicht:
    us.playerAddGroup(p, "Vip");
    oder will muss ich die sonst beschreiben oO.
     
    #7
  8. games6471
    Online

    games6471

    Type name = wert

    Code (Text):
    1.     private boolean setupEconomy()
    2.     {
    3.         RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
    4.         if (economyProvider != null) {
    5.             economy = economyProvider.getProvider();
    6.         }
    7.  
    8.         return (economy != null);
    9.     }
    Mit "us.playerAddGroup(p, "Vip");" wird die Methode "playerAddGroup" mit den Paramatern p vom Typ Player und dem String "Vip" auf der Variablen "us" aufgerufen.
     
    #8
  9. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    Sei mir nich bös aber ich versteh das grad nich so ganz xDD
     
    #9
  10. games6471
    Online

    games6471

    Die Variable "us" hat keinen Wert (null, also zeigt auf nichts). Somit kannst du sie auch nicht benutzen (--> NullPointerException | Zugriff auf eine Variable, die auf nichts zeigt). Also musst du der Variable erst mal etwas zuweisen mit:

    Variablenname = Wert
    oder falls die Variable noch nicht existiert:
    Typ Variablenname = Wert

    Beispiel:

    username = "games647";
    String username = "games647";

    Das Plugin Vault gibt bereits auf der devBukkit-Seite ein Beispiel, das selbe wie im vorherigen Post. Nun müsste der Code nur noch für die Permission angepasst werden und du könntest mit diesen Snippet der Variablen "us" den passenden Wert zuweisen.

    Beispiel:
    Dafür musst du dann nur noch die Methode aufrufen
    Code (Text):
    1.     private boolean setupPermissions()
    2.     {
    3.         RegisteredServiceProvider<Permission> permissionProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class);
    4.         if (permissionProvider != null) {
    5.             [COLOR="#FF0000"]us [/COLOR]= permissionProvider.getProvider();
    6.         }
    7.         return (permission != null);
    8.     }
     
    #10
  11. Ivory1988
    Offline

    Ivory1988

    Registriert seit:
    1. April 2013
    Beiträge:
    6
    Achsoooo ok. Jetzt hab ich es auch ma verstanden. Danke für die Hilfe
     
    #11