Solved Help with Economy | MySQL Plugin

Discussion in 'Plugin Development' started by VinexAx789, Jul 14, 2016.

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

    VinexAx789

    So I've been trying to code a MySQL Economy plugin that I can use for my network. I've ran into a few problems. When I set the balance for a player it will update their balance in the database but how ever when they leave it will leave an Null Pointer Exception Error this only happens when I set their balance. Now the thing is when I set the balance in per say the Hub server it will update in the database and in the command /bal but when I leave and join another server on the network it will not update it will just give them 0 coins. Then the same thing is happening when I set a players balance in the other server and when that player leaves it will not update for any of the other servers it'll just set the bal to 0. I believe this is caused by me using an HashMap because I think they only save in per server ram. Anyway below will be my code and the Error log.

    Error Log:
    Code:
    15.07 02:01:00 [Server] WARN java.lang.NullPointerException
    15.07 02:01:00 [Server] WARN at com.venomsurge.economy.mysql.SQL.updateUserData(SQL.java:70)
    15.07 02:01:00 [Server] WARN at com.venomsurge.economy.EconomyEvent$3.run(EconomyEvent.java:63)
    15.07 02:01:00 [Server] WARN at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftTask.run(CraftTask.java:71)
    15.07 02:01:00 [Server] WARN at org.bukkit.craftbukkit.v1_10_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
    15.07 02:01:00 [Server] WARN at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    15.07 02:01:00 [Server] WARN at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    15.07 02:01:00 [Server] WARN at java.lang.Thread.run(Thread.java:745)
    15.07 02:01:00 [Server] INFO Updating user balance.
    Line 70 in SQL:
    Code:
    sql.setDouble(3, EconomyManager.getBalance(player.getName()));
    Line 63 in EconomyEvent:
    Code:
    plugin.MySQL.updateUserData(p);
    Economy Get Balance Method:
    Code:
        public static Double getBalance(String player) {
            return balance.get(player);
        }
    MySQL Class:
    Code:
    public double coins;
    
        public VSEcon plugin;
    
        private static Connection connection;
    
        public SQL(String ip, String userName, String password, String db, VSEcon plugin) {
            this.plugin = plugin;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager
                        .getConnection("jdbc:mysql://" + ip + "/" + db + "?user=" + userName + "&password=" + password);
                System.out.println("DATABASE CONNECTED!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void insertNewUserData(Player p) {
            try {
                PreparedStatement sql = connection.prepareStatement("INSERT INTO `users` VALUES (user_uuid=?, user_rank=?, user_coins=?);");
                sql.setString(1, p.getUniqueId().toString());
                sql.setString(2, plugin.permPlug.getRank(p).toString());
                sql.setDouble(3, EconomyManager.getBalance(p.getName()));
                sql.executeUpdate();
                sql.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Inserted new user data.");
            }
        }
    
        public void retrieveUserData(Player p) {
            try {
                PreparedStatement sql = connection.prepareStatement("SELECT * FROM `users` WHERE user_uuid=?;");
                sql.setString(1, p.getUniqueId().toString());
                ResultSet res = sql.executeQuery();
                while (res.next()) {
                    coins = res.getDouble("user_coins");
                }
    
                sql.close();
                res.close();
    
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Retrieving user data.");
            }
        }
    
        public void updateUserData(Player player) {
            try {
                PreparedStatement sql = connection.prepareStatement("UPDATE `users` SET user_uuid=?, user_rank=?, user_coins=? WHERE user_uuid=?;");
                sql.setString(1, player.getUniqueId().toString());
                sql.setString(2, plugin.permPlug.getRank(player).toString());
                sql.setDouble(3, EconomyManager.getBalance(player.getName()));
                sql.setString(4, player.getUniqueId().toString());
                sql.executeUpdate();
                sql.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Updating user balance.");
            }
        }
    EconomyEvent Class:
    Code:
    package com.venomsurge.economy;
    
    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.bukkit.event.player.PlayerKickEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class EconomyEvent implements Listener {
    
        public VSEcon plugin;
    
        public EconomyEvent(VSEcon plugin) {
            this.plugin = plugin;
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            Player p = event.getPlayer();
            if (!EconomyManager.hasAccount(p.getName())) {
                EconomyManager.setBalance(p.getName(), 0);
            }
            new BukkitRunnable() {
    
                @Override
                public void run() {
                    plugin.MySQL.retrieveUserData(p);
                    Bukkit.broadcastMessage("Data Retrieved.");
    
                }
            }.runTaskAsynchronously(plugin);
            EconomyManager.setBalance(p.getName(), plugin.MySQL.coins);
            Bukkit.broadcastMessage("Balance set to " + plugin.MySQL.coins + " coins!");
            EconomyManager.getBalanceMap().put(p.getName(), EconomyManager.getBalance(p.getName()));
            Bukkit.broadcastMessage("Is it null? " + EconomyManager.getBalanceMap().get(p.getName()));
        }
    
        @EventHandler
        public void onPlayerKick(PlayerKickEvent event) {
            Player p = event.getPlayer();
    
            new BukkitRunnable() {
    
                @Override
                public void run() {
                    plugin.MySQL.updateUserData(p);
                }
            }.runTaskAsynchronously(plugin);
            EconomyManager.getBalanceMap().remove(p.getName());
        }
    
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            Player p = event.getPlayer();
    
            new BukkitRunnable() {
    
                @Override
                public void run() {
                    plugin.MySQL.updateUserData(p);
                }
            }.runTaskAsynchronously(plugin);
            EconomyManager.getBalanceMap().remove(p.getName());
        }
    
    }
    
    EconomyManager Class:
    Code:
    package com.venomsurge.economy;
    
    import java.util.HashMap;
    
    public class EconomyManager {
    
        public static HashMap<String, Double> balance = new HashMap<String, Double>();
    
        public static void setBalance(String player, double amount) {
            balance.put(player, amount);
        }
    
        public static Double getBalance(String player) {
            return balance.get(player);
        }
    
        public static Boolean hasAccount(String player) {
            return balance.containsKey(player);
        }
    
        public static HashMap<String, Double> getBalanceMap() {
            return balance;
        }
    
    }
    
    VSEcon Class:
    Code:
    package com.venomsurge.economy;
    
    import org.bukkit.Bukkit;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import com.venomsurge.economy.commands.BalExecutor;
    import com.venomsurge.economy.commands.EconomyExecutor;
    import com.venomsurge.economy.mysql.SQL;
    import com.venomsurge.economy.ranks.Perms;
    import com.venomsurge.economy.utils.C;
    
    public class VSEcon extends JavaPlugin {
    
        public String prefix = C.green + C.bold + "Venom" + C.white + C.bold + "Surge" + C.dgray + " ⎜ " + C.gray + "";
    
        public SQL MySQL;
        public Perms permPlug = new Perms(this);
    
        public void onEnable() {
            Bukkit.getPluginManager().registerEvents(new EconomyEvent(this), this);
            MySQL = new SQL("Removed for security", "Removed for security", "Removed for security", "Removed for security", this);
            getCommand("bal").setExecutor(new BalExecutor(this));
            getCommand("vsecon").setExecutor(new EconomyExecutor(this));
        }
    
        public void onDisable() {
           
        }
    
    }
    
     
  2. Offline

    bennie3211

    It's because you access the bukkit api in a async thread. Parse the parameters before you call the function.
     
  3. Offline

    VinexAx789

    Code:
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            Player p = event.getPlayer();
    
            new BukkitRunnable() {
    
                @Override
                public void run() {
                    plugin.MySQL.updateUserData(p);
                    new BukkitRunnable() {
    
                        @Override
                        public void run() {
                            EconomyManager.getBalanceMap().remove(p.getName());
                        }
                    }.runTask(plugin);
                }
            }.runTaskAsynchronously(plugin);
        }
    Something like that I am using this currently now it fixed my null pointer but balance is still getting set to zero I believe it's because of the Join Event
     
  4. Offline

    bennie3211

    Delay the event 1 tick, maybe that will work?
     
    VinexAx789 likes this.
Thread Status:
Not open for further replies.

Share This Page