/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.arkhamnetwork.playersync.listeners; import java.sql.SQLException; import java.util.UUID; import org.arkhamnetwork.playersync.PlayerSync; import org.arkhamnetwork.playersync.managers.SQLManager; import org.arkhamnetwork.playersync.struct.PlayerSyncUser; import org.arkhamnetwork.playersync.utils.PlayerUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; /** * * @author devan_000 */ public class PlayerListener implements Listener { private final PlayerSync plugin = PlayerSync.get(); @EventHandler(priority = EventPriority.MONITOR) public void onAsyncJoin(final AsyncPlayerPreLoginEvent event) { if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { return; } if (event.getUniqueId() == null) { return; } try { String value = SQLManager.DB.getString("is_online", event.getUniqueId().toString()); if (value != null && value.toLowerCase().equals("true")) { event.setKickMessage(ChatColor.RED + "Your playerdata is still syncing, please wait and try logging in again soon."); event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); return; } } catch (SQLException ex) { ex.printStackTrace(); } if (plugin.users.containsKey(event.getUniqueId())) { event.setKickMessage(ChatColor.RED + "Your playerdata is still syncing, please wait."); event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); return; } PlayerUtils.deletePlayerdataASync(event.getUniqueId(), event.getName()); //This will hold the join thread hostage until they have joined. plugin.users.put(event.getUniqueId(), new PlayerSyncUser(event.getUniqueId(), event.getName())); } //Handle cases where the user gets kicked, as say the server is full? @EventHandler(priority = EventPriority.MONITOR) public void onLogin(final PlayerLoginEvent event) { final Player player = event.getPlayer(); //Return if the user was allowed to join. if (event.getResult() == PlayerLoginEvent.Result.ALLOWED) { return; } //Saveguards player.removeMetadata("no_save", plugin); if (Bukkit.getPluginManager().isPluginEnabled("BukkitPlotCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPlotCommands")); } if (Bukkit.getPluginManager().isPluginEnabled("BukkitPrisonCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPrisonCommands")); } //Huh? The user was allowed to join? final PlayerSyncUser user = plugin.users.get(event.getPlayer().getUniqueId()); if (user == null) { return; } final UUID uuid = event.getPlayer().getUniqueId(); plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { public void run() { //We need to set there online data to false. user.saveSimple(uuid); PlayerUtils.deletePlayerdataASync(event.getPlayer().getUniqueId(), event.getPlayer().getName()); //Cleanup, do it main thread to avoid concurrency. plugin.getServer().getScheduler().runTask(plugin, new Runnable() { public void run() { plugin.users.remove(event.getPlayer().getUniqueId()); } }); } }); return; } @EventHandler(priority = EventPriority.MONITOR) public void onJoin(PlayerJoinEvent event) { final Player player = event.getPlayer(); //Saveguards player.removeMetadata("no_save", plugin); if (Bukkit.getPluginManager().isPluginEnabled("BukkitPlotCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPlotCommands")); } if (Bukkit.getPluginManager().isPluginEnabled("BukkitPrisonCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPrisonCommands")); } PlayerSyncUser user = plugin.users.get(event.getPlayer().getUniqueId()); if (user != null) { user.setPlayerDataSync(event.getPlayer()); } } // Dont use monitoras bags uses it. @EventHandler(priority = EventPriority.LOWEST) public void onQuit(final PlayerQuitEvent event) { final Player player = event.getPlayer(); final UUID uuid = event.getPlayer().getUniqueId(); final PlayerSyncUser user = plugin.users.get(uuid); if (!player.hasMetadata("no_save")) { //This method will cleanup the user from the users map at the end. if (player.getOpenInventory() != null) { player.getOpenInventory().close(); } if (user != null) { user.save(player.getName(), player.getUniqueId(), player.getInventory().getContents().clone(), player.getInventory().getArmorContents().clone(), player.getEnderChest().getContents().clone(), player.getActivePotionEffects(), player.getExp(), player.getHealth(), player.getMaxHealth(), player.getFoodLevel(), player.getLocation().clone(), true); } } else { //Saveguards player.removeMetadata("no_save", plugin); if (Bukkit.getPluginManager().isPluginEnabled("BukkitPlotCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPlotCommands")); } if (Bukkit.getPluginManager().isPluginEnabled("BukkitPrisonCommands")) { player.removeMetadata("no_save", Bukkit.getPluginManager().getPlugin("BukkitPrisonCommands")); } if (user != null) { plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { public void run() { //We need to set there online data to false. user.saveSimple(uuid); PlayerUtils.deletePlayerdataASync(event.getPlayer().getUniqueId(), event.getPlayer().getName()); //Cleanup, do it main thread to avoid concurrency. plugin.getServer().getScheduler().runTask(plugin, new Runnable() { public void run() { plugin.users.remove(event.getPlayer().getUniqueId()); } }); } }); } } } }