Solved More Config help :)

Discussion in 'Plugin Development' started by ZodiacTheories, Jul 19, 2014.

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

    ZodiacTheories

    Hi, so I am creating a plugin so if a Player has more than or equal to 100 points, they get leveled up. The only thought I had to check if the player had more than 100 points was to check every time a Player moved. Any ideas on how to check if the player has more than 100 points without having to check every time?

    Back on topic, I get an NPE on line 13 of the Update class

    Here is my code:

    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.entity.Player;
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.player.PlayerMoveEvent;
    7.  
    8. public class Update implements Listener {
    9.  
    10. @EventHandler
    11. public void onMove(PlayerMoveEvent e) {
    12. Player p = e.getPlayer();
    13. if(Core.getInstance().getConfig().getInt("players." + p.getName() + ".points") >= 100) {
    14. LevelMethods.levelup(p);
    15. }
    16. }
    17.  
    18. }


    JoinEvent:

    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.entity.Player;
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.player.PlayerJoinEvent;
    7.  
    8. public class JoinEvent implements Listener {
    9.  
    10. @EventHandler
    11. public void onJoin(PlayerJoinEvent e) {
    12. Player p = e.getPlayer();
    13. LevelMethods.setLevel(p, 0);
    14. LevelMethods.setPoints(p, 0);
    15. Core.getInstance().getConfig().set("players." + p.getName(), ".level" + LevelMethods.getLevel(p));
    16. Core.getInstance().getConfig().set("players..level.points", LevelMethods.getPoints(p));
    17. }
    18. }


    Thanks
     
  2. Offline

    hankered

    Or, you can schedule an event that goes every minute and checks.

    edit: You're getting an NPE because you didn't check if the player is even in the config.
     
  3. Offline

    rohan576

    Try checking if such a field exists in the config before trying to access it.

    Code:java
    1. if (!Core.getInstance().contains("players." + p.getName() + ".points")) {
    2. Core.getInstance().getConfig().createSection("players." + p.getName() + ".points");
    3. }
    4.  
    5. // continue code as normal
     
  4. Offline

    Gater12

    ZodiacTheories
    Check when they receive the points the total amount is 100 or more than level up (If they aren't already)
     
  5. Offline

    rohan576

    Gater12
    Just as a note, you don't need to tahg people on their own threads. They automatically are watched unless explicitly un-watched.
     
  6. Offline

    ZodiacTheories

  7. Offline

    hankered

  8. Offline

    ZodiacTheories

    rohan576 Gater12 hankered

    Still getting an NPE on line 13 of Update

    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.entity.Player;
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.player.PlayerMoveEvent;
    7.  
    8. public class Update implements Listener {
    9.  
    10. @EventHandler
    11. public void onMove(PlayerMoveEvent e) {
    12. Player p = e.getPlayer();
    13. if (!Core.getInstance().getConfig().contains("players." + p.getName() + ".points")) {
    14. Core.getInstance().getConfig().createSection("players." + p.getName() + ".points");
    15. }
    16. if(Core.getInstance().getConfig().getInt("players." + p.getName() + ".points") >= 100) {
    17. LevelMethods.levelup(p);
    18. }
    19. }
    20.  
    21. }


    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.entity.Player;
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.player.PlayerJoinEvent;
    7.  
    8. public class JoinEvent implements Listener {
    9.  
    10. @EventHandler
    11. public void onJoin(PlayerJoinEvent e) {
    12. Player p = e.getPlayer();
    13. LevelMethods.setLevel(p, 0);
    14. LevelMethods.setPoints(p, 0);
    15. if (!Core.getInstance().getConfig().contains("players." + p.getName() + ".points")) {
    16. Core.getInstance().getConfig().createSection("players." + p.getName() + ".points");
    17. }
    18. Core.getInstance().getConfig().set("players." + p.getName(), ".level" + LevelMethods.getLevel(p));
    19. Core.getInstance().getConfig().set("players..level.points", LevelMethods.getPoints(p));
    20. }
    21. }
    22.  


    hankered

    Well not for me then, I didn't get an alert when either of you posted, and I haven't explicitly unwatched all my threads

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  9. Offline

    hankered

    You really shouldn't be storing players as an object.

    Use their names.
     
  10. Offline

    Traks

    Either Core#getInstance() or Core#getConfig() return null. What is the source code of the Core class? Also, please pass an instance of your Core class to a custom constructor (in Update and JoinEvent), which requires a Core object, instead of invoking static methods.
     
  11. Offline

    hankered

    What's your setLevel method? I think I know why.
     
  12. Offline

    ZodiacTheories

    Traks hankered

    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.entity.Player;
    4.  
    5. public class LevelMethods {
    6.  
    7. public static int getLevel(Player p) {
    8. return Core.getInstance().getConfig().getInt("players." + p.getName() + ".level");
    9. }
    10.  
    11. public static void setLevel(Player p, int level) {
    12. Core.getInstance().getConfig().set("players." + p.getName(), ".level" + level);
    13. return;
    14. }
    15.  
    16. public static int getPoints(Player p) {
    17. return Core.getInstance().getConfig().getInt("players." + p.getName() + ".points");
    18. }
    19.  
    20. public static void setPoints(Player p, int points) {
    21. Core.getInstance().getConfig().set("players." + p.getName(), ".points" + points);
    22. return;
    23. }
    24.  
    25. public static void levelup(Player p) {
    26. setLevel(p, getLevel(p) + 1);
    27. return;
    28. }
    29. }


    Core class:

    Code:java
    1. package org.zodiactheories.pandorm;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.plugin.java.JavaPlugin;
    5.  
    6. public class Core extends JavaPlugin {
    7.  
    8. public final String PREFIX = ChatColor.GOLD + "" + ChatColor.BOLD + "[Pandorm]";
    9.  
    10. private static Core instance;
    11.  
    12. public static Core getInstance() {
    13. return instance;
    14. }
    15.  
    16. @Override
    17. public void onEnable() {
    18. getConfig().options().copyDefaults(true);
    19. saveConfig();
    20. getServer().getPluginManager().registerEvents(new JoinEvent(), this);
    21. getServer().getPluginManager().registerEvents(new King(), this);
    22. getServer().getPluginManager().registerEvents(new Update(), this);
    23. getCommand("king").setExecutor(new King());
    24. getCommand("level").setExecutor(new King());
    25. }
    26. }
     
  13. Offline

    Necrodoom

    When in doubt, null check everything.
    You know you are doing methods on something that is null on that line, why not do some debug?
     
  14. Offline

    Gater12

    ZodiacTheories
    You never assigned instance variable to any reference thus it is null.
     
    ZodiacTheories likes this.
  15. Offline

    ZodiacTheories

    Gater12

    Ah, I ALWAYS forget that :eek:

    Gater12

    Thanks a lot!

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  16. Offline

    rohan576

    Yeah, in your setLevel method, you concatenate their level to the path name, eg:
    players.rohan576.level1337

    Therefore, as you figured out, you should get players.player.level and use setInt(int).
     
Thread Status:
Not open for further replies.

Share This Page