Solved plugin datafolder is null?

Discussion in 'Plugin Development' started by kmccmk9, Jun 29, 2013.

Thread Status:
Not open for further replies.
  1. Offline

    kmccmk9

    Hello, I am trying to initialize my plugin to use in my join event listener. This is my listener so far, but I have narrowed down that plugin itself is not null, but, plugin.getDataFolder is null. Why is this null and how can I fix it?

    Code:
    package com.kmccmk9.HDSkinner;
     
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.logging.Logger;
     
    import lib.PatPeter.SQLibrary.Database;
    import lib.PatPeter.SQLibrary.SQLite;
     
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.getspout.spoutapi.SpoutManager;
    import org.getspout.spoutapi.player.SpoutPlayer;
     
    public class playerListener implements Listener {
        @EventHandler public void onPlayerJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
            SpoutPlayer splayer = SpoutManager.getPlayer(player);
            String playername = "\"" + player.getDisplayName() + "\"";
            HDSkinner plugin = new HDSkinner();
            if (plugin.getDataFolder() == null)
                System.out.println("plugin is null");
            else
                System.out.println("plugin is not null");
            Database sql2 = new SQLite(Logger.getLogger("Minecraft"), "[HDSkinner] ", plugin.getDataFolder().getAbsolutePath(), "HDSkinner", ".sqlite");
            sql2.open();
            try {
                System.out.println("playername is " + playername);
                if (sql2 == null)
                    System.out.println("sql is null");
                ResultSet results = sql2.query("SELECT skin FROM userdata WHERE user=" + playername);
                if (!results.isBeforeFirst() ) {   
                    splayer.sendMessage("Sorry you have no skin/cape data on file");
                }
                else {
                    System.out.println("There is data");
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
     
  2. Offline

    caseif

    You haven't created the folder. :)
     
  3. Offline

    kmccmk9

    Okay well that is in my playerListener so it was created by my main class. How do I access that?
     
  4. Offline

    caseif

    What do you mean? The data folder is just the folder with your plugin's name in the plugins folder in the server's root directory. The only real cause for it to be null would be if it hasn't yet been created.
     
  5. Offline

    Dpasi314

    //ninja'd by AngryNerd =P
    Is your player listener initialized properly? If you created the file in your player listener and your player listener is null, then your data folder is null.
     
  6. Offline

    kmccmk9

    But it has, that's where my db file is that I'm trying to access.
    Yes it is, because without the code above it does return true and I can print something out from within my listener. Here is my main class if it helps:

    Code:java
    1. package com.kmccmk9.HDSkinner;
    2.  
    3. import java.sql.ResultSet;
    4. import java.sql.SQLException;
    5. import java.util.logging.Logger;
    6.  
    7. import lib.PatPeter.SQLibrary.Database;
    8.  
    9. import org.bukkit.Bukkit;
    10. import org.bukkit.ChatColor;
    11. import org.bukkit.Server;
    12. import org.bukkit.command.Command;
    13. import org.bukkit.command.CommandSender;
    14. import org.bukkit.entity.Player;
    15. import org.bukkit.plugin.java.JavaPlugin;
    16. import org.getspout.spoutapi.SpoutManager;
    17. import org.getspout.spoutapi.player.SpoutPlayer;
    18.  
    19. import lib.PatPeter.SQLibrary.*;
    20. import lib.PatPeter.SQLibrary.Builders.MySQL.Table;
    21.  
    22. public class HDSkinner extends JavaPlugin {
    23. //Variables
    24. Server server;
    25. Database sql;
    26. Table skins;
    27.  
    28. public void onDisable()
    29. {
    30. System.out.print("HDSkinner is disabled");
    31. }
    32.  
    33. public void onEnable()
    34. {
    35. sql = new SQLite(Logger.getLogger("Minecraft"), "[HDSkinner] ", this.getDataFolder().getAbsolutePath(), "HDSkinner", ".sqlite");
    36. openDatabase();
    37. System.out.print("HDSkinner is enabled");
    38. server = this.getServer();
    39. playerListener pListener = new playerListener();
    40. Bukkit.getServer().getPluginManager().registerEvents(pListener , this);
    41. }
    42.  
    43. public boolean onCommand(CommandSender sender,Command command, String commandLabel,String args[])
    44. {
    45.  
    46. if (sender instanceof Player)
    47. {
    48. Player player = (Player) sender;
    49. SpoutPlayer splayer = SpoutManager.getPlayer(player);
    50. if(commandLabel.equalsIgnoreCase("skin"))
    51. {
    52. if (args.length == 1)
    53. {
    54. if (args[0].equalsIgnoreCase("help"))
    55. {
    56. player.sendMessage(ChatColor.BLUE + "Type the command skin followed by the url to change your skin to that url.");
    57. }
    58. else
    59. {
    60. try {
    61. String playername = "\"" + player.getDisplayName() + "\"";
    62. String link = "\"" + args[0] + "\"";
    63. ResultSet results = sql.query("SELECT user FROM userdata WHERE user=" + playername);
    64. if (!results.isBeforeFirst() ) {
    65. String query = "INSERT INTO userdata (user,skin) VALUES (" + playername + "," + link + ")";
    66. sql.query(query);
    67. }
    68. else {
    69. String query = "UPDATE userdata SET skin=" + link + " WHERE user=" + playername;
    70. sql.query(query);
    71. }
    72. } catch (SQLException e) {
    73. // TODO Auto-generated catch block
    74. e.printStackTrace();
    75. }
    76. splayer.setSkin(args[0]);
    77. }
    78. }
    79. else
    80. {
    81. player.sendMessage(ChatColor.DARK_RED + "Arguments mismatch. Type the skin command followed by help.");
    82. }
    83. }
    84. if(commandLabel.equalsIgnoreCase("cape"))
    85. {
    86. if (args.length == 1)
    87. {
    88. if (args[0].equalsIgnoreCase("help"))
    89. {
    90. player.sendMessage(ChatColor.BLUE + "Type the command cape followed by the url to change your cape to that url.");
    91. }
    92. else
    93. {
    94. try {
    95. String playername;
    96. String link;
    97. playername = "\"" + player.getDisplayName() + "\"";
    98. link = "\"" + args[0] + "\"";
    99. ResultSet results = sql.query("SELECT user FROM userdata WHERE user=" + playername);
    100. if (!results.isBeforeFirst() ) {
    101. String query = "INSERT INTO userdata (user,cape) VALUES (" + playername + "," + link + ")";
    102. sql.query(query);
    103. }
    104. else {
    105. String query = "UPDATE userdata SET cape=" + link + " WHERE user=" + playername;
    106. sql.query(query);
    107. }
    108. } catch (SQLException e) {
    109. // TODO Auto-generated catch block
    110. e.printStackTrace();
    111. }
    112. splayer.setCape(args[0]);
    113. }
    114. }
    115. else
    116. {
    117. player.sendMessage(ChatColor.DARK_RED + "Arguments mismatch. Type the cape command followed by help.");
    118. }
    119. }
    120. }
    121. return true;
    122. }
    123.  
    124. public void openDatabase() {
    125. if (!sql.open())
    126. sql.open();
    127. try {
    128. sql.query("CREATE TABLE if not exists userdata(user TEXT, skin TEXT, cape TEXT)");
    129. } catch (SQLException e) {
    130. // TODO Auto-generated catch block
    131. e.printStackTrace();
    132. }
    133. }
    134.  
    135. public void closeDatabase() {
    136. if (sql.open())
    137. sql.close();
    138. }
    139.  
    140. public void setPlayer() {
    141.  
    142. }
    143.  
    144. }
    145.  
     
  7. Offline

    Dpasi314

    So yeah, you haven't created the data folder yet, put something like this on the onEnable()
    Code:
    File fileinfo = new File(getDataFolder(),"something.yml");
     
            if(!getDataFolder().exists()) getDataFolder().mkdir(); 
                    if(!fileinfo.exists()) { 
                        try {
                            fileinfo.createNewFile();
                            getConfig().options().copyDefaults(true);
                            getConfig().save(fileinfo);
                            getConfig().options().copyDefaults(false);
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            System.out.println("Uh-Oh, Something happened!");
                        }
                    }
    This will create a folder with the name of your plugin, and a file in it called "something.yml"
     
  8. Offline

    kmccmk9

    Thanks for replying, although I have a question. If I don't have any code that makes the folder, then why on first run does it create the folder and put the database file in it?
     
  9. Offline

    Dpasi314

    Then somewhere in your code you're creating the file, but not making it accessible to the other classes. Therefor, it's being created but it's null to the plugin because the plugin can't read / write to it. That's my only guess.
     
  10. Offline

    kmccmk9

    Okay I added these lines to my onEnable() but again its still null in the playerlistener.


    Code:java
    1. if(!getDataFolder().exists())
    2. getDataFolder().mkdir();
     
  11. saw this inside your listener:
    HDSkinner plugin = new HDSkinner();
    if (plugin.getDataFolder() == null)
    NEVER create an instance of your main class somewhere, always let bukkit create it, and pass it around in onenable, so your class know how it needs to acces its datafolder
     
  12. Offline

    kmccmk9

    Okay so how would I do that then?
     
  13. pass the main instance to your listener when you construct your listener
     
  14. Offline

    kmccmk9

    Okay so I changed my listener to this:
    Code:java
    1. public class playerListener implements Listener {
    2. //Global Vars
    3. Database sql2;
    4.  
    5. public void playerListener(Database sql) {
    6. sql2 = sql;
    7. }
    8. @EventHandler public void onPlayerJoin(PlayerJoinEvent event) {
    9. Player player = event.getPlayer();
    10. SpoutPlayer splayer = SpoutManager.getPlayer(player);
    11. String playername = "\"" + player.getDisplayName() + "\"";
    12. try {
    13. System.out.println("playername is " + playername);
    14. if (sql2 == null)
    15. System.out.println("sql is null");
    16. ResultSet results = sql2.query("SELECT skin FROM userdata WHERE user=" + playername);
    17. if (!results.isBeforeFirst() ) {
    18. splayer.sendMessage("Sorry you have no skin/cape data on file");
    19. }
    20. else {
    21. System.out.println("There is data");
    22. }
    23. } catch (SQLException e) {
    24. // TODO Auto-generated catch block
    25. e.printStackTrace();
    26. }
    27. }
    28. }


    So how would I change this?
    Code:java
    1. playerListener pListener = new playerListener();
    2.  
    3. I tried doing
    4. playerListener pListener = new playerListener(sql);
     
Thread Status:
Not open for further replies.

Share This Page