Help | Rewards giving to players at the same time.

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

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

    VinexAx789

    The title is terrible at explaining this. Anyway, I've ran into a issue this issue is quite a big deal. So when a player logs in at the same time as another player the second player that joined gets the first players rewards. I'm using MySQL for this too by the way.

    The code:

    Event:
    Code:
    @EventHandler
        public void onLogin(PlayerLoginEvent event) {
            Player p = event.getPlayer();
    
            new BukkitRunnable() {
    
                @Override
                public void run() {
                    if (plugin.MySQL.userExistDatabase(p)) {
                        EconomyManager.getBalanceMap().put(p.getName(), plugin.MySQL.coins);
                    } else {
                        EconomyManager.setBalance(p.getName(), 0);
                        plugin.MySQL.insertNewUserData(p);
                    }
                }
            }.runTaskAsynchronously(plugin);
    
            boolean whitelist = Bukkit.hasWhitelist();
            if (!(plugin.gstate == GameState.INGAME))
    
            {
                if (whitelist == false) {
                    event.setResult(Result.ALLOWED);
                } else if (whitelist = true && p.isOp() && p.isWhitelisted()) {
                    event.setResult(Result.ALLOWED);
                } else if (!p.isWhitelisted()) {
                    event.setResult(Result.KICK_OTHER);
                    Bukkit.broadcastMessage(C.green + p.getName() + C.yellow + " has tried to join the server!");
                    event.setKickMessage(C.green + "You're not on the whitelist!" + C.yellow
                            + " The server must be under maintenance, check back soon!");
                }
                if (!(plugin.players.size() < plugin.maxplayers)) {
                    // TODO Make it so donators can join full games.
                    event.setResult(Result.KICK_OTHER);
                    event.setKickMessage("ยง4Game is full");
                }
            } else
    
            {
                if (!(event.getPlayer().isWhitelisted())) {
                    event.setResult(Result.ALLOWED);
                    plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                        @SuppressWarnings("deprecation")
                        public void run() {
                            p.teleport(plugin.maplobby);
                            TabUtils.sendFullTitle(p, 10, 10, 10, ChatColor.BLUE + "" + ChatColor.BOLD + "LATE JOINER",
                                    ChatColor.YELLOW + "You are now a spectator");
                            p.sendMessage(ChatColor.YELLOW + "You are now a " + ChatColor.BLUE + "Spectator");
                            DTP.defenders.remove(p.getPlayer().getName());
                            plugin.attackers.remove(p.getPlayer().getName());
                            plugin.players.remove(p.getName());
                            p.getPlayer().setGameMode(GameMode.ADVENTURE);
                            p.setHealth(20);
                            p.getInventory().clear();
                            p.updateInventory();
                            // p.setScoreboard(plugin.board);
                            plugin.gameBoard.send(p);
                            for (Player player : Bukkit.getOnlinePlayers()) {
                                player.hidePlayer(p);
                            }
                            plugin.spectatorGUI.spectators.add(p.getName());
                            if (p.getAllowFlight() == false) {
                                p.setAllowFlight(true);
                            }
                            p.setFlying(true);
                            ItemStack spectateGUI = new ItemStack(Material.BLAZE_ROD, 1);
                            ItemMeta spectateMeta = spectateGUI.getItemMeta();
                            spectateMeta.setDisplayName(C.green + "Spectator Teleporter");
                            spectateGUI.setItemMeta(spectateMeta);
                            p.getInventory().setItem(0, spectateGUI);
                            p.getInventory().setItem(8, plugin.JoinNQuit.backToHub);
                        }
                    }, 20 * 2L);
                    new BukkitRunnable() {
    
                        @Override
                        public void run() {
                            p.getPlayer().setGameMode(GameMode.ADVENTURE);
                            if (p.getAllowFlight() == false) {
                                p.setAllowFlight(true);
                            }
                            p.setFlying(true);
                        }
                    }.runTaskTimer(plugin, 20L, 20L);
                }
            }
    
        }
    
    Here's my SQL class:
    Code:
    package com.venomsurge.dtp.mysql;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import org.bukkit.entity.Player;
    
    import com.venomsurge.dtp.DTP;
    import com.venomsurge.economy.EconomyManager;
    
    public class SQL {
    
        public String kit;
        public double coins;
    
        DTP plugin;
    
        private static Connection connection;
    
        public SQL(String ip, String userName, String password, String db, DTP 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` (user_uuid, user_rank, user_coins)\nvalues ('" + p.getUniqueId() + "', '"
                                + plugin.permPlug.getGroup(p) + "', '" + EconomyManager.getBalance(p.getName()) + "');");
                sql.executeUpdate();
                sql.close();
    
                System.out.println("Inserted new user data.");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /*
         * 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();
         *
         * // boolean containsPlayer = res.next();
         *
         * while (res.next()) { coins = res.getDouble("user_coins"); rank =
         * res.getString("user_rank"); }
         *
         * sql.close(); res.close();
         *
         * System.out.println("Retrieving user data."); // return containsPlayer;
         *
         * } catch (Exception e) { e.printStackTrace(); // return false; } }
         */
    
        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.getGroup(player).toString());
                sql.setDouble(3, EconomyManager.getBalance(player.getName()));
                sql.setString(4, player.getUniqueId().toString());
                sql.executeUpdate();
                sql.close();
    
                System.out.println("Updating user data.");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public boolean userExistDatabase(Player p) {
            try {
                PreparedStatement sql = connection.prepareStatement("SELECT * FROM `users` WHERE user_uuid=?;");
                sql.setString(1, p.getUniqueId().toString());
                ResultSet res = sql.executeQuery();
    
                System.out.println("Recieved user data.");
    
                if (res.next()) {
                    coins = res.getDouble("user_coins");
                    return true;
                } else {
                    return false;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    }
    If you can please help me solve this, that'd be much appreciated.
     
  2. Offline

    ArsenArsen

    Make a queue of queries to do and a runnable that is going to be the callback, then when you read one end run the runnable, or a custom interface, start the other one. There are better explanations ;P
     
  3. Offline

    VinexAx789

    @ArsenArsen

    Thanks for the reply, sadly I'm a bit confused. I'm fairly new to MySQL, would you mind showing me an example of what you mean or explain a bit more in depth o know you said there's better explanations but I believe in you ;)
     
    Last edited: Jul 19, 2016
  4. Offline

    ArsenArsen

    Well its actually java. Every time you make a QUERY(Sorry for caps, its just how SQL gets written) put it in a queue, then have a dispatch(needs better spelling) task every few ticks, and if previous QUERY is done remove it from the queue and then dispatch the next one. You will need callbacks for that. Good luck ^^
     
  5. Offline

    VinexAx789

Thread Status:
Not open for further replies.

Share This Page