diff --git a/src/main/java/craftersland/bridge/inventory/BackgroundTask.java b/src/main/java/craftersland/bridge/inventory/BackgroundTask.java deleted file mode 100644 index 0468c74..0000000 --- a/src/main/java/craftersland/bridge/inventory/BackgroundTask.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.craftersland.bridge.inventory; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -public class BackgroundTask { - - private Inv m; - - public BackgroundTask(Inv m) { - this.m = m; - runTask(); - } - - private void runTask() { - if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled") == true) { - Inv.log.info("Data save task is enabled."); - Bukkit.getScheduler().runTaskTimerAsynchronously(m, new Runnable() { - - @Override - public void run() { - runSaveData(); - } - - }, m.getConfigHandler().getInteger("General.saveDataTask.interval") * 60 * 20L, m.getConfigHandler().getInteger("General.saveDataTask.interval") * 60 * 20L); - } else { - Inv.log.info("Data save task is disabled."); - } - } - - private void runSaveData() { - if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled") == true) { - if (Bukkit.getOnlinePlayers().isEmpty() == false) { - List onlinePlayers = new ArrayList(Bukkit.getOnlinePlayers()); - if (m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages") == false) { - Inv.log.info("Saving online players data..."); - } - for (Player p : onlinePlayers) { - if (p.isOnline() == true) { - m.getInventoryDataHandler().onDataSaveFunction(p, false, "false", null, null); - } - } - if (m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages") == false) { - Inv.log.info("Data save complete for " + onlinePlayers.size() + " players."); - } - onlinePlayers.clear(); - } - } - } - - public void onShutDownDataSave() { - Inv.log.info("Saving online players data..."); - List onlinePlayers = new ArrayList(Bukkit.getOnlinePlayers()); - - for (Player p : onlinePlayers) { - if (p.isOnline() == true) { - m.getInventoryDataHandler().onDataSaveFunction(p, false, "true", null, null); - } - } - Inv.log.info("Data save complete for " + onlinePlayers.size() + " players."); - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/ConfigHandler.java b/src/main/java/craftersland/bridge/inventory/ConfigHandler.java deleted file mode 100644 index 84cf463..0000000 --- a/src/main/java/craftersland/bridge/inventory/ConfigHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.craftersland.bridge.inventory; - -import java.io.File; - -public class ConfigHandler { - - private Inv inv; - - public ConfigHandler(Inv inv) { - this.inv = inv; - loadConfig(); - } - - public void loadConfig() { - File pluginFolder = new File(inv.getDataFolder().getAbsolutePath()); - if (!pluginFolder.exists()) { - pluginFolder.mkdir(); - } - File configFile = new File(inv.getDataFolder() + System.getProperty("file.separator") + "config.yml"); - if (!configFile.exists()) { - Inv.log.info("No config file found! Creating new one..."); - inv.saveDefaultConfig(); - } - try { - Inv.log.info("Loading the config file..."); - inv.getConfig().load(configFile); - } catch (Exception e) { - Inv.log.severe("Could not load the config file! You need to regenerate the config! Error: " + e.getMessage()); - e.printStackTrace(); - } - } - - public String getString(String key) { - if (!inv.getConfig().contains(key)) { - inv.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Inv.pluginName + " folder! (Try generating a new one by deleting the current)"); - return "errorCouldNotLocateInConfigYml:" + key; - } else { - return inv.getConfig().getString(key); - } - } - - public String getStringWithColor(String key) { - if (!inv.getConfig().contains(key)) { - inv.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Inv.pluginName + " folder! (Try generating a new one by deleting the current)"); - return "errorCouldNotLocateInConfigYml:" + key; - } else { - return inv.getConfig().getString(key).replaceAll("&", "§"); - } - } - - public Integer getInteger(String key) { - if (!inv.getConfig().contains(key)) { - inv.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Inv.pluginName + " folder! (Try generating a new one by deleting the current)"); - return null; - } else { - return inv.getConfig().getInt(key); - } - } - - public Boolean getBoolean(String key) { - if (!inv.getConfig().contains(key)) { - inv.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Inv.pluginName + " folder! (Try generating a new one by deleting the current)"); - return null; - } else { - return inv.getConfig().getBoolean(key); - } - } -} diff --git a/src/main/java/craftersland/bridge/inventory/Inv.java b/src/main/java/craftersland/bridge/inventory/Inv.java deleted file mode 100644 index 321184d..0000000 --- a/src/main/java/craftersland/bridge/inventory/Inv.java +++ /dev/null @@ -1,118 +0,0 @@ -package net.craftersland.bridge.inventory; - -import java.util.logging.Logger; - -import net.craftersland.bridge.inventory.database.InvMysqlInterface; -import net.craftersland.bridge.inventory.database.MysqlSetup; -import net.craftersland.bridge.inventory.events.DropItem; -import net.craftersland.bridge.inventory.events.InventoryClick; -import net.craftersland.bridge.inventory.events.PlayerJoin; -import net.craftersland.bridge.inventory.events.PlayerQuit; - -import org.bukkit.Bukkit; -import org.bukkit.event.HandlerList; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; - -public class Inv extends JavaPlugin { - - public static Logger log; - public boolean useProtocolLib = false; - public static String pluginName = "MysqlInventoryBridge"; - //public Set playersSync = new HashSet(); - public static boolean is19Server = true; - public static boolean is13Server = false; - public static boolean isDisabling = false; - - private static ConfigHandler configHandler; - private static SoundHandler sH; - private static MysqlSetup databaseManager; - private static InvMysqlInterface invMysqlInterface; - private static InventoryDataHandler idH; - private static BackgroundTask bt; - - @Override - public void onEnable() { - log = getLogger(); - getMcVersion(); - configHandler = new ConfigHandler(this); - sH = new SoundHandler(this); - checkDependency(); - bt = new BackgroundTask(this); - databaseManager = new MysqlSetup(this); - invMysqlInterface = new InvMysqlInterface(this); - idH = new InventoryDataHandler(this); - //Register Listeners - PluginManager pm = getServer().getPluginManager(); - pm.registerEvents(new PlayerJoin(this), this); - pm.registerEvents(new PlayerQuit(this), this); - pm.registerEvents(new DropItem(this), this); - pm.registerEvents(new InventoryClick(this), this); - log.info(pluginName + " loaded successfully!"); - } - - @Override - public void onDisable() { - isDisabling = true; - Bukkit.getScheduler().cancelTasks(this); - HandlerList.unregisterAll(this); - if (databaseManager.getConnection() != null) { - bt.onShutDownDataSave(); - databaseManager.closeConnection(); - } - log.info(pluginName + " is disabled!"); - } - - public ConfigHandler getConfigHandler() { - return configHandler; - } - public MysqlSetup getDatabaseManager() { - return databaseManager; - } - public InvMysqlInterface getInvMysqlInterface() { - return invMysqlInterface; - } - public SoundHandler getSoundHandler() { - return sH; - } - public BackgroundTask getBackgroundTask() { - return bt; - } - public InventoryDataHandler getInventoryDataHandler() { - return idH; - } - - private boolean getMcVersion() { - String[] serverVersion = Bukkit.getBukkitVersion().split("-"); - String version = serverVersion[0]; - - if (version.matches("1.7.10") || version.matches("1.7.9") || version.matches("1.7.5") || version.matches("1.7.2") || version.matches("1.8.8") || version.matches("1.8.3") || version.matches("1.8.4") || version.matches("1.8")) { - is19Server = false; - return true; - } else if (version.matches("1.13") || version.matches("1.13.1") || version.matches("1.13.2")) { - is13Server = true; - return true; - } else if (version.matches("1.14") || version.matches("1.14.1") || version.matches("1.14.2") || version.matches("1.14.3") || version.matches("1.14.4")) { - is13Server = true; - return true; - } else if (version.matches("1.15") || version.matches("1.15.1") || version.matches("1.15.2")) { - is13Server = true; - return true; - } else if (version.matches("1.16") || version.matches("1.16.1") || version.matches("1.16.2") || version.matches("1.16.3")) { - is13Server = true; - return true; - } - return false; - } - - private void checkDependency() { - //Check dependency - if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) { - useProtocolLib = true; - log.info("ProtocolLib dependency found."); - } else { - useProtocolLib = false; - log.warning("ProtocolLib dependency not found. No support for modded items NBT data!"); - } - } -} diff --git a/src/main/java/craftersland/bridge/inventory/InventoryDataHandler.java b/src/main/java/craftersland/bridge/inventory/InventoryDataHandler.java deleted file mode 100644 index 9efb2e6..0000000 --- a/src/main/java/craftersland/bridge/inventory/InventoryDataHandler.java +++ /dev/null @@ -1,279 +0,0 @@ -package net.craftersland.bridge.inventory; - -import java.util.HashSet; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import net.craftersland.bridge.inventory.objects.DatabaseInventoryData; -import net.craftersland.bridge.inventory.objects.InventorySyncData; -import net.craftersland.bridge.inventory.objects.InventorySyncTask; - -public class InventoryDataHandler { - - private Inv pd; - private Set playersInSync = new HashSet(); - private Set playersDisconnectSave = new HashSet(); - - public InventoryDataHandler(Inv pd) { - this.pd = pd; - } - - public boolean isSyncComplete(Player p) { - if (playersInSync.contains(p) == true) { - return true; - } else { - return false; - } - } - - private void dataCleanup(Player p) { - playersInSync.remove(p); - playersDisconnectSave.remove(p); - } - - public void setPlayerData(final Player p, DatabaseInventoryData data, InventorySyncData syncData, boolean cancelTask) { - if (playersInSync.contains(p) == false) { - //Inventory and Armor sync for lower mc versions then 1.9 - if (Inv.is19Server == false) { - setInventory(p, data, syncData); - if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == true) { - setArmor(p, data, syncData); - } - } else { - //Inventory and Armor sync for 1.9 and up. - if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == true) { - setInventory(p, data, syncData); - } else if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == false) { - //TODO fix - setInventoryNew(p, data, syncData); - } - } - pd.getInvMysqlInterface().setSyncStatus(p, "false"); - Bukkit.getScheduler().runTaskLaterAsynchronously(pd, new Runnable() { - - @Override - public void run() { - playersInSync.add(p); - } - - }, 2L); - data = null; - } - } - - public void onDataSaveFunction(Player p, Boolean datacleanup, String syncStatus, ItemStack[] inventoryDisconnect, ItemStack[] armorDisconnect) { - if (playersDisconnectSave.contains(p) == true) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Save Data - Canceled - " + p.getName()); - } - return; - } - if (datacleanup == true) { - playersDisconnectSave.add(p); - } - boolean isPlayerInSync = playersInSync.contains(p); - if (isPlayerInSync == true) { - String inv = "none"; - String armor = "none"; - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Save Data - Start - " + p.getName()); - } - try { - if (inventoryDisconnect != null) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Saving disconnect inventory - " + p.getName()); - } - inv = encodeItems(inventoryDisconnect); - } else { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Saving inventory - " + p.getName()); - } - inv = encodeItems(p.getInventory().getContents()); - } - } catch (Exception e) { - e.printStackTrace(); - } - if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == true) { - try { - if (inventoryDisconnect != null) { - armor = encodeItems(armorDisconnect); - } else { - armor = encodeItems(p.getInventory().getArmorContents()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - pd.getInvMysqlInterface().setData(p, inv, armor, syncStatus); - } - if (datacleanup == true) { - dataCleanup(p); - } - } - - public void onJoinFunction(final Player p) { - if (Inv.isDisabling == false) { - if (playersInSync.contains(p) == false) { - if (pd.getInvMysqlInterface().hasAccount(p) == true) { - final InventorySyncData syncData = new InventorySyncData(); - backupAndReset(p, syncData); - DatabaseInventoryData data = pd.getInvMysqlInterface().getData(p); - if (data.getSyncStatus().matches("true")) { - setPlayerData(p, data, syncData, false); - } else { - new InventorySyncTask(pd, System.currentTimeMillis(), p, syncData).runTaskTimerAsynchronously(pd, 10L, 10L); - } - } else { - playersInSync.add(p); - onDataSaveFunction(p, false, "false", null, null); - } - } - } - } - - private void backupAndReset(Player p, InventorySyncData syncData) { - syncData.setBackupInventory(p.getInventory().getContents()); - syncData.setBackupArmor(p.getInventory().getArmorContents()); - p.setItemOnCursor(null); - p.getInventory().clear(); - p.updateInventory(); - if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == true) { - syncData.setBackupArmor(p.getInventory().getArmorContents()); - p.getInventory().setHelmet(null); - p.getInventory().setChestplate(null); - p.getInventory().setLeggings(null); - p.getInventory().setBoots(null); - p.updateInventory(); - } - } - - public ItemStack[] getInventory(Player p) { - return p.getInventory().getContents(); - } - - public ItemStack[] getArmor(Player p) { - if (pd.getConfigHandler().getBoolean("General.syncArmorEnabled") == true) { - return p.getInventory().getArmorContents(); - } else { - return null; - } - } - - private void setInventory(final Player p, DatabaseInventoryData data, InventorySyncData syncData) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Start- " + p.getName()); - } - if (data.getRawInventory().matches("none") == false) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Loading inventory - " + p.getName()); - } - try { - p.getInventory().setContents(decodeItems(data.getRawInventory())); - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Inventory set - " + p.getName()); - } - } catch (Exception e) { - e.printStackTrace(); - if (syncData.getBackupInventory() != null) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Loading backup inventory - " + p.getName()); - } - p.getInventory().setContents(syncData.getBackupInventory()); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.inventorySyncError")); - pd.getSoundHandler().sendPlingSound(p); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.inventorySyncBackup")); - } else { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - No backup inventory found! - " + p.getName()); - } - } - } - } else { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Restoring local inventory - " + p.getName()); - } - p.getInventory().setContents(syncData.getBackupInventory()); - } - p.updateInventory(); - } - - private void setInventoryNew(final Player p, DatabaseInventoryData data, InventorySyncData syncData) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Start- " + p.getName()); - } - if (data.getRawInventory().matches("none") == false) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Loading inventory - " + p.getName()); - } - try { - p.getInventory().setContents(decodeItems(data.getRawInventory())); - p.getInventory().setArmorContents(syncData.getBackupArmor()); - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Inventory set - " + p.getName()); - } - } catch (Exception e) { - e.printStackTrace(); - if (syncData.getBackupInventory() != null) { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Loading backup inventory - " + p.getName()); - } - p.getInventory().setContents(syncData.getBackupInventory()); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.inventorySyncError")); - pd.getSoundHandler().sendPlingSound(p); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.inventorySyncBackup")); - } else { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - No backup inventory found! - " + p.getName()); - } - } - } - } else { - if (pd.getConfigHandler().getBoolean("Debug.InventorySync") == true) { - Inv.log.info("Inventory Debug - Set Data - Restoring local inventory - " + p.getName()); - } - p.getInventory().setContents(syncData.getBackupInventory()); - } - p.updateInventory(); - } - - private void setArmor(final Player p, DatabaseInventoryData data, InventorySyncData syncData) { - if (data.getRawArmor().matches("none") == false) { - try { - p.getInventory().setArmorContents(decodeItems(data.getRawArmor())); - } catch (Exception e) { - e.printStackTrace(); - p.getInventory().setArmorContents(syncData.getBackupArmor()); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.armorSyncError")); - pd.getSoundHandler().sendPlingSound(p); - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessage.armorSyncBackup")); - } - } else { - p.getInventory().setArmorContents(syncData.getBackupArmor()); - } - p.updateInventory(); - } - - public String encodeItems(ItemStack[] items) { - if (pd.useProtocolLib == true && pd.getConfigHandler().getBoolean("General.enableModdedItemsSupport") == true) { - return InventoryUtils.saveModdedStacksData(items); - } else { - return InventoryUtils.itemStackArrayToBase64(items); - } - } - - public ItemStack[] decodeItems(String data) throws Exception { - if (pd.useProtocolLib == true && pd.getConfigHandler().getBoolean("General.enableModdedItemsSupport") == true) { - ItemStack[] it = InventoryUtils.restoreModdedStacks(data); - if (it == null) { - it = InventoryUtils.itemStackArrayFromBase64(data); - } - return it; - } else { - return InventoryUtils.itemStackArrayFromBase64(data); - } - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/InventoryUtils.java b/src/main/java/craftersland/bridge/inventory/InventoryUtils.java deleted file mode 100644 index 881a735..0000000 --- a/src/main/java/craftersland/bridge/inventory/InventoryUtils.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.craftersland.bridge.inventory; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.io.BukkitObjectInputStream; -import org.bukkit.util.io.BukkitObjectOutputStream; -import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; - -import com.comphenix.protocol.utility.StreamSerializer; - -public class InventoryUtils { - - public static String toBase64(Inventory inventory) { - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); - - dataOutput.writeInt(inventory.getSize()); - - for (int i = 0; i < inventory.getSize(); i++) { - dataOutput.writeObject(inventory.getItem(i)); - } - - dataOutput.close(); - return Base64Coder.encodeLines(outputStream.toByteArray()); - } catch (Exception e) { - throw new IllegalStateException("Unable to save item stacks.", e); - } - } - - public static Inventory fromBase64(String data) throws IOException { - try { - ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); - BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); - Inventory inventory = Bukkit.getServer().createInventory(null, dataInput.readInt()); - - for (int i = 0; i < inventory.getSize(); i++) { - inventory.setItem(i, (ItemStack) dataInput.readObject()); - } - - dataInput.close(); - return inventory; - } catch (ClassNotFoundException e) { - throw new IOException("Unable to decode class type.", e); - } - } - - public static String itemStackArrayToBase64(ItemStack[] items) { - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); - - dataOutput.writeInt(items.length); - - for (int i = 0; i < items.length; i++) { - dataOutput.writeObject(items[i]); - } - - dataOutput.close(); - return Base64Coder.encodeLines(outputStream.toByteArray()); - } catch (Exception e) { - throw new IllegalStateException("Unable to save item stacks.", e); - } - } - - public static ItemStack[] itemStackArrayFromBase64(String data) throws IOException { - try { - ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); - BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); - ItemStack[] items = new ItemStack[dataInput.readInt()]; - - for (int i = 0; i < items.length; i++) { - items[i] = (ItemStack) dataInput.readObject(); - } - - dataInput.close(); - return items; - } catch (ClassNotFoundException e) { - throw new IOException("Unable to decode class type.", e); - } - } - - public static String saveModdedStacksData(ItemStack[] itemStacks) { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < itemStacks.length; i++) { - if (i > 0) { - stringBuilder.append(";"); - } - if (itemStacks[i] != null && itemStacks[i].getType() != Material.AIR) { - try { - stringBuilder.append(StreamSerializer.getDefault().serializeItemStack(itemStacks[i])); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return stringBuilder.toString(); - } - - public static ItemStack[] restoreModdedStacks(String string) { - String[] strings = string.split(";"); - ItemStack[] itemStacks = new ItemStack[strings.length]; - for (int i = 0; i < strings.length; i++) { - if (!strings[i].isEmpty()) { - try { - itemStacks[i] = StreamSerializer.getDefault().deserializeItemStack(strings[i]); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return itemStacks; - } -} diff --git a/src/main/java/craftersland/bridge/inventory/SoundHandler.java b/src/main/java/craftersland/bridge/inventory/SoundHandler.java deleted file mode 100644 index 6046359..0000000 --- a/src/main/java/craftersland/bridge/inventory/SoundHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.craftersland.bridge.inventory; - -import org.bukkit.Sound; -import org.bukkit.entity.Player; - -public class SoundHandler { - - private Inv pd; - - public SoundHandler(Inv pd) { - this.pd = pd; - } - - public void sendPlingSound(Player p) { - if (pd.getConfigHandler().getBoolean("General.disableSounds") == false) { - if (Inv.is13Server == true) { - p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 3F, 3F); - } else if (Inv.is19Server == true) { - p.playSound(p.getLocation(), Sound.valueOf("BLOCK_NOTE_PLING"), 3F, 3F); - } else { - p.playSound(p.getLocation(), Sound.valueOf("NOTE_PLING"), 3F, 3F); - } - } - } - - public void sendLevelUpSound(Player p) { - if (pd.getConfigHandler().getBoolean("General.disableSounds") == false) { - if (Inv.is19Server == true) { - p.playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1F, 1F); - } else { - p.playSound(p.getLocation(), Sound.valueOf("LEVEL_UP"), 1F, 1F); - } - } - } - - public void sendArrowHit(Player p) { - if (pd.getConfigHandler().getBoolean("General.disableSounds") == false) { - if (Inv.is19Server == true) { - p.playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 3F, 3F); - } else { - p.playSound(p.getLocation(), Sound.valueOf("SUCCESSFUL_HIT"), 3F, 3F); - } - } - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/database/InvMysqlInterface.java b/src/main/java/craftersland/bridge/inventory/database/InvMysqlInterface.java deleted file mode 100644 index fc93c42..0000000 --- a/src/main/java/craftersland/bridge/inventory/database/InvMysqlInterface.java +++ /dev/null @@ -1,186 +0,0 @@ -package net.craftersland.bridge.inventory.database; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -import org.bukkit.entity.Player; - -import net.craftersland.bridge.inventory.Inv; -import net.craftersland.bridge.inventory.objects.DatabaseInventoryData; - -public class InvMysqlInterface { - - private Inv inv; - - public InvMysqlInterface(Inv inv) { - this.inv = inv; - } - - public boolean hasAccount(Player player) { - PreparedStatement preparedUpdateStatement = null; - ResultSet result = null; - Connection conn = inv.getDatabaseManager().getConnection(); - if (conn != null) { - try { - String sql = "SELECT `player_uuid` FROM `" + inv.getConfigHandler().getString("database.mysql.tableName") + "` WHERE `player_uuid` = ? LIMIT 1"; - preparedUpdateStatement = conn.prepareStatement(sql); - preparedUpdateStatement.setString(1, player.getUniqueId().toString()); - - result = preparedUpdateStatement.executeQuery(); - while (result.next()) { - return true; - } - } catch (SQLException e) { - Inv.log.warning("Error: " + e.getMessage()); - e.printStackTrace(); - } finally { - try { - if (result != null) { - result.close(); - } - if (preparedUpdateStatement != null) { - preparedUpdateStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return false; - } - - public boolean createAccount(Player player) { - PreparedStatement preparedStatement = null; - Connection conn = inv.getDatabaseManager().getConnection(); - if (conn != null) { - try { - String sql = "INSERT INTO `" + inv.getConfigHandler().getString("database.mysql.tableName") + "`(`player_uuid`, `player_name`, `inventory`, `armor`, `sync_complete`, `last_seen`) " + "VALUES(?, ?, ?, ?, ?, ?)"; - preparedStatement = conn.prepareStatement(sql); - preparedStatement.setString(1, player.getUniqueId().toString()); - preparedStatement.setString(2, player.getName()); - preparedStatement.setString(3, "none"); - preparedStatement.setString(4, "none"); - preparedStatement.setString(5, "true"); - preparedStatement.setString(6, String.valueOf(System.currentTimeMillis())); - - preparedStatement.executeUpdate(); - return true; - } catch (SQLException e) { - Inv.log.warning("Error: " + e.getMessage()); - e.printStackTrace(); - } finally { - try { - if (preparedStatement != null) { - preparedStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return false; - } - - public boolean setData(Player player, String inventory, String armor, String syncComplete) { - if (!hasAccount(player)) { - createAccount(player); - } - PreparedStatement preparedUpdateStatement = null; - Connection conn = inv.getDatabaseManager().getConnection(); - if (conn != null) { - try { - String data = "UPDATE `" + inv.getConfigHandler().getString("database.mysql.tableName") + "` " + "SET `player_name` = ?" + ", `inventory` = ?" + ", `armor` = ?" + ", `sync_complete` = ?" + ", `last_seen` = ?" + " WHERE `player_uuid` = ?"; - preparedUpdateStatement = conn.prepareStatement(data); - preparedUpdateStatement.setString(1, player.getName()); - preparedUpdateStatement.setString(2, inventory); - preparedUpdateStatement.setString(3, armor); - preparedUpdateStatement.setString(4, syncComplete); - preparedUpdateStatement.setString(5, String.valueOf(System.currentTimeMillis())); - preparedUpdateStatement.setString(6, player.getUniqueId().toString()); - - preparedUpdateStatement.executeUpdate(); - return true; - } catch (SQLException e) { - Inv.log.warning("Error: " + e.getMessage()); - e.printStackTrace(); - } finally { - try { - if (preparedUpdateStatement != null) { - preparedUpdateStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return false; - } - - public boolean setSyncStatus(Player player, String syncStatus) { - PreparedStatement preparedUpdateStatement = null; - Connection conn = inv.getDatabaseManager().getConnection(); - if (conn != null) { - try { - String data = "UPDATE `" + inv.getConfigHandler().getString("database.mysql.tableName") + "` " + "SET `sync_complete` = ?" + ", `last_seen` = ?" + " WHERE `player_uuid` = ?"; - preparedUpdateStatement = conn.prepareStatement(data); - preparedUpdateStatement.setString(1, syncStatus); - preparedUpdateStatement.setString(2, String.valueOf(System.currentTimeMillis())); - preparedUpdateStatement.setString(3, player.getUniqueId().toString()); - - preparedUpdateStatement.executeUpdate(); - return true; - } catch (SQLException e) { - Inv.log.warning("Error: " + e.getMessage()); - e.printStackTrace(); - } finally { - try { - if (preparedUpdateStatement != null) { - preparedUpdateStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return false; - } - - public DatabaseInventoryData getData(Player player) { - if (!hasAccount(player)) { - createAccount(player); - } - PreparedStatement preparedUpdateStatement = null; - ResultSet result = null; - Connection conn = inv.getDatabaseManager().getConnection(); - if (conn != null) { - try { - String sql = "SELECT * FROM `" + inv.getConfigHandler().getString("database.mysql.tableName") + "` WHERE `player_uuid` = ? LIMIT 1"; - preparedUpdateStatement = conn.prepareStatement(sql); - preparedUpdateStatement.setString(1, player.getUniqueId().toString()); - - result = preparedUpdateStatement.executeQuery(); - while (result.next()) { - return new DatabaseInventoryData(result.getString("inventory"), result.getString("armor"), result.getString("sync_complete"), result.getString("last_seen")); - } - } catch (SQLException e) { - Inv.log.warning("Error: " + e.getMessage()); - e.printStackTrace(); - } finally { - try { - if (result != null) { - result.close(); - } - if (preparedUpdateStatement != null) { - preparedUpdateStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return null; - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/database/MysqlSetup.java b/src/main/java/craftersland/bridge/inventory/database/MysqlSetup.java deleted file mode 100644 index e6bb5fe..0000000 --- a/src/main/java/craftersland/bridge/inventory/database/MysqlSetup.java +++ /dev/null @@ -1,238 +0,0 @@ -package net.craftersland.bridge.inventory.database; - -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Properties; - -import net.craftersland.bridge.inventory.Inv; - -import org.bukkit.Bukkit; - -public class MysqlSetup { - - private Connection conn = null; - private Inv eco; - - public MysqlSetup(Inv eco) { - this.eco = eco; - connectToDatabase(); - setupDatabase(); - updateTables(); - databaseMaintenanceTask(); - } - - public void connectToDatabase() { - Inv.log.info("Connecting to the database..."); - try { - //Load Drivers - Class.forName("com.mysql.jdbc.Driver"); - Properties properties = new Properties(); - properties.setProperty("user", eco.getConfigHandler().getString("database.mysql.user")); - properties.setProperty("password", eco.getConfigHandler().getString("database.mysql.password")); - properties.setProperty("autoReconnect", "true"); - properties.setProperty("verifyServerCertificate", "false"); - properties.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled")); - properties.setProperty("requireSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled")); - //Connect to database - conn = DriverManager.getConnection("jdbc:mysql://" + eco.getConfigHandler().getString("database.mysql.host") + ":" + eco.getConfigHandler().getString("database.mysql.port") + "/" + eco.getConfigHandler().getString("database.mysql.databaseName"), properties); - - } catch (ClassNotFoundException e) { - Inv.log.severe("Could not locate drivers for mysql! Error: " + e.getMessage()); - return; - } catch (SQLException e) { - Inv.log.severe("Could not connect to mysql database! Error: " + e.getMessage()); - return; - } - Inv.log.info("Database connection successful!"); - } - - public void setupDatabase() { - if (conn != null) { - PreparedStatement query = null; - try { - String data = "CREATE TABLE IF NOT EXISTS `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` (id int(10) AUTO_INCREMENT, player_uuid char(36) NOT NULL UNIQUE, player_name varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, inventory LONGTEXT NOT NULL, armor LONGTEXT NOT NULL, sync_complete varchar(5) NOT NULL, last_seen char(13) NOT NULL, PRIMARY KEY(id));"; - query = conn.prepareStatement(data); - query.execute(); - } catch (SQLException e) { - e.printStackTrace(); - Inv.log.severe("Error creating tables! Error: " + e.getMessage()); - } finally { - try { - if (query != null) { - query.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - public Connection getConnection() { - checkConnection(); - return conn; - } - - public void checkConnection() { - try { - if (conn == null) { - Inv.log.warning("Connection failed. Reconnecting..."); - reConnect(); - } - if (!conn.isValid(3)) { - Inv.log.warning("Connection is idle or terminated. Reconnecting..."); - reConnect(); - } - if (conn.isClosed() == true) { - Inv.log.warning("Connection is closed. Reconnecting..."); - reConnect(); - } - } catch (Exception e) { - Inv.log.severe("Could not reconnect to Database! Error: " + e.getMessage()); - } - } - - public boolean reConnect() { - try { - long start = 0; - long end = 0; - - start = System.currentTimeMillis(); - Inv.log.info("Attempting to establish a connection to the MySQL server!"); - Class.forName("com.mysql.jdbc.Driver"); - Properties properties = new Properties(); - properties.setProperty("user", eco.getConfigHandler().getString("database.mysql.user")); - properties.setProperty("password", eco.getConfigHandler().getString("database.mysql.password")); - properties.setProperty("autoReconnect", "true"); - properties.setProperty("verifyServerCertificate", "false"); - properties.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled")); - properties.setProperty("requireSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled")); - //properties.setProperty("useUnicode", "true"); - //properties.setProperty("characterEncoding", "utf8"); - //properties.setProperty("characterSetResults", "utf8"); - //properties.setProperty("connectionCollation", "utf8mb4_unicode_ci"); - conn = DriverManager.getConnection("jdbc:mysql://" + eco.getConfigHandler().getString("database.mysql.host") + ":" + eco.getConfigHandler().getString("database.mysql.port") + "/" + eco.getConfigHandler().getString("database.mysql.databaseName"), properties); - end = System.currentTimeMillis(); - Inv.log.info("Connection to MySQL server established!"); - Inv.log.info("Connection took " + ((end - start)) + "ms!"); - return true; - } catch (Exception e) { - Inv.log.severe("Error re-connecting to the database! Error: " + e.getMessage()); - return false; - } - } - - public void closeConnection() { - try { - Inv.log.info("Closing database connection..."); - conn.close(); - conn = null; - } catch (SQLException e) { - e.printStackTrace(); - } - } - - private void updateTables() { - if (conn != null) { - DatabaseMetaData md = null; - ResultSet rs1 = null; - ResultSet rs2 = null; - ResultSet rs3 = null; - PreparedStatement query1 = null; - PreparedStatement query2 = null; - PreparedStatement query3 = null; - try { - md = conn.getMetaData(); - rs1 = md.getColumns(null, null, eco.getConfigHandler().getString("database.mysql.tableName"), "inventory"); - if (rs1.next()) { - if (rs1.getString("TYPE_NAME").matches("VARCHAR")) { - String data = "ALTER TABLE `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` MODIFY inventory LONGTEXT NOT NULL;"; - query1 = conn.prepareStatement(data); - query1.execute(); - } - } else { - - } - rs2 = md.getColumns(null, null, eco.getConfigHandler().getString("database.mysql.tableName"), "armor"); - if (rs2.next()) { - if (rs2.getString("TYPE_NAME").matches("VARCHAR")) { - String data = "ALTER TABLE `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` MODIFY armor LONGTEXT NOT NULL;"; - query2 = conn.prepareStatement(data); - query2.execute(); - } - } else { - - } - rs3 = md.getColumns(null, null, eco.getConfigHandler().getString("database.mysql.tableName"), "sync_complete"); - if (rs3.next()) { - - } else { - String data = "ALTER TABLE `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` ADD sync_complete varchar(5) NOT NULL DEFAULT 'true';"; - query3 = conn.prepareStatement(data); - query3.execute(); - } - } catch (Exception e) { - Inv.log.severe("Error updating table! Error: " + e.getMessage()); - } finally { - try { - if (query1 != null) { - query1.close(); - } - if (rs1 != null) { - rs1.close(); - } - if (query2 != null) { - query2.close(); - } - if (rs2 != null) { - rs2.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - private void databaseMaintenanceTask() { - if (eco.getConfigHandler().getBoolean("database.maintenance.enabled") == true) { - Bukkit.getScheduler().runTaskLaterAsynchronously(eco, new Runnable() { - - @Override - public void run() { - if (conn != null) { - long inactivityDays = Long.parseLong(eco.getConfigHandler().getString("database.maintenance.inactivity")); - long inactivityMils = inactivityDays * 24 * 60 * 60 * 1000; - long curentTime = System.currentTimeMillis(); - long inactiveTime = curentTime - inactivityMils; - Inv.log.info("Database maintenance task started..."); - PreparedStatement preparedStatement = null; - try { - String sql = "DELETE FROM `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` WHERE `last_seen` < ?"; - preparedStatement = conn.prepareStatement(sql); - preparedStatement.setString(1, String.valueOf(inactiveTime)); - preparedStatement.execute(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (preparedStatement != null) { - preparedStatement.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - Inv.log.info("Database maintenance complete!"); - } - } - - }, 100 * 20L); - } - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/events/PlayerJoin.java b/src/main/java/craftersland/bridge/inventory/events/PlayerJoin.java deleted file mode 100644 index 3633e55..0000000 --- a/src/main/java/craftersland/bridge/inventory/events/PlayerJoin.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.craftersland.bridge.inventory.events; - -import net.craftersland.bridge.inventory.Inv; -import net.craftersland.bridge.inventory.objects.SyncCompleteTask; - -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; - -public class PlayerJoin implements Listener { - - private Inv inv; - - public PlayerJoin(Inv inv) { - this.inv = inv; - } - - @EventHandler - public void onLogin(final PlayerJoinEvent event) { - if (Inv.isDisabling == false) { - final Player p = event.getPlayer(); - Bukkit.getScheduler().runTaskLaterAsynchronously(inv, new Runnable() { - - @Override - public void run() { - if (p != null) { - if (p.isOnline() == true) { - inv.getInventoryDataHandler().onJoinFunction(p); - new SyncCompleteTask(inv, System.currentTimeMillis(), p).runTaskTimerAsynchronously(inv, 5L, 20L); - } - } - } - - }, 5L); - } - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/events/PlayerQuit.java b/src/main/java/craftersland/bridge/inventory/events/PlayerQuit.java deleted file mode 100644 index bb61175..0000000 --- a/src/main/java/craftersland/bridge/inventory/events/PlayerQuit.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.craftersland.bridge.inventory.events; - -import net.craftersland.bridge.inventory.Inv; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemStack; - -public class PlayerQuit implements Listener { - - private Inv inv; - - public PlayerQuit(Inv inv) { - this.inv = inv; - } - - @EventHandler - public void onDisconnect(final PlayerQuitEvent event) { - if (Inv.isDisabling == false) { - Bukkit.getScheduler().runTaskLaterAsynchronously(inv, new Runnable() { - - @Override - public void run() { - if (event.getPlayer() != null) { - Player p = event.getPlayer(); - ItemStack[] inventory = inv.getInventoryDataHandler().getInventory(p); - ItemStack[] armor = inv.getInventoryDataHandler().getArmor(p); - inv.getInventoryDataHandler().onDataSaveFunction(p, true, "true", inventory, armor); - } - } - - }, 2L); - } - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/objects/DatabaseInventoryData.java b/src/main/java/craftersland/bridge/inventory/objects/DatabaseInventoryData.java deleted file mode 100644 index 0fa60a4..0000000 --- a/src/main/java/craftersland/bridge/inventory/objects/DatabaseInventoryData.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.craftersland.bridge.inventory.objects; - -public class DatabaseInventoryData { - - private String rawInv; - private String rawAr; - private String syncComplete; - private String lastSee; - - public DatabaseInventoryData(String rawInventory, String rawArmor, String syncStatus, String lastSeen) { - this.rawInv = rawInventory; - this.rawAr = rawArmor; - this.syncComplete = syncStatus; - this.lastSee = lastSeen; - } - - public String getLastSeen() { - return lastSee; - } - - public String getSyncStatus() { - return syncComplete; - } - - public String getRawArmor() { - return rawAr; - } - - public String getRawInventory() { - return rawInv; - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/objects/InventorySyncData.java b/src/main/java/craftersland/bridge/inventory/objects/InventorySyncData.java deleted file mode 100644 index 364c885..0000000 --- a/src/main/java/craftersland/bridge/inventory/objects/InventorySyncData.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.craftersland.bridge.inventory.objects; - -import org.bukkit.inventory.ItemStack; - -public class InventorySyncData { - - private ItemStack[] backupInv; - private ItemStack[] backupAr; - private Boolean syncComplete; - - public InventorySyncData() { - this.backupInv = null; - this.backupAr = null; - this.syncComplete = false; - } - - public void setSyncStatus(boolean syncStatus) { - syncComplete = syncStatus; - } - - public Boolean getSyncStatus() { - return syncComplete; - } - - public ItemStack[] getBackupArmor() { - return backupAr; - } - - public ItemStack[] getBackupInventory() { - return backupInv; - } - - public void setBackupInventory(ItemStack[] backupInventory) { - backupInv = backupInventory; - } - - public void setBackupArmor(ItemStack[] backupArmor) { - backupAr = backupArmor; - } - -} diff --git a/src/main/java/craftersland/bridge/inventory/objects/InventorySyncTask.java b/src/main/java/craftersland/bridge/inventory/objects/InventorySyncTask.java deleted file mode 100644 index 661a804..0000000 --- a/src/main/java/craftersland/bridge/inventory/objects/InventorySyncTask.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.craftersland.bridge.inventory.objects; - -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import net.craftersland.bridge.inventory.Inv; - -public class InventorySyncTask extends BukkitRunnable { - - private Inv pd; - private long startTime; - private Player p; - private boolean inProgress = false; - private InventorySyncData syncD; - - public InventorySyncTask(Inv pd, long start, Player player, InventorySyncData syncData) { - this.pd = pd; - this.startTime = start; - this.p = player; - this.syncD = syncData; - } - - @Override - public void run() { - if (inProgress == false) { - if (p != null) { - if (p.isOnline() == true) { - inProgress = true; - DatabaseInventoryData data = pd.getInvMysqlInterface().getData(p); - if (data.getSyncStatus().matches("true")) { - pd.getInventoryDataHandler().setPlayerData(p, data, syncD, true); - inProgress = false; - this.cancel(); - } else if (System.currentTimeMillis() - Long.parseLong(data.getLastSeen()) >= 600 * 1000) { - pd.getInventoryDataHandler().setPlayerData(p, data, syncD, true); - inProgress = false; - this.cancel(); - } else if (System.currentTimeMillis() - startTime >= 22 * 1000) { - pd.getInventoryDataHandler().setPlayerData(p, data, syncD, true); - inProgress = false; - this.cancel(); - } - inProgress = false; - } else { - //inProgress = false; - this.cancel(); - } - } else { - //inProgress = false; - this.cancel(); - } - } - } - - - -} diff --git a/src/main/java/craftersland/bridge/inventory/objects/SyncCompleteTask.java b/src/main/java/craftersland/bridge/inventory/objects/SyncCompleteTask.java deleted file mode 100644 index 46c3e30..0000000 --- a/src/main/java/craftersland/bridge/inventory/objects/SyncCompleteTask.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.craftersland.bridge.inventory.objects; - -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import net.craftersland.bridge.inventory.Inv; - -public class SyncCompleteTask extends BukkitRunnable { - - private Inv pd; - private long startTime; - private Player p; - private boolean inProgress = false; - - public SyncCompleteTask(Inv pd, long start, Player player) { - this.pd = pd; - this.startTime = start; - this.p = player; - } - - @Override - public void run() { - if (inProgress == false) { - if (p != null) { - if (p.isOnline() == true) { - inProgress = true; - if (pd.getInventoryDataHandler().isSyncComplete(p) == true) { - if (pd.getConfigHandler().getString("ChatMessages.syncComplete").matches("") == false) { - p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessages.syncComplete")); - } - pd.getSoundHandler().sendLevelUpSound(p); - this.cancel(); - } else { - if (System.currentTimeMillis() - startTime >= 20 * 1000) { - //Set sync to true in database to force sync data after 20 sec - pd.getInvMysqlInterface().setSyncStatus(p, "true"); - } else if (System.currentTimeMillis() - startTime >= 40 * 1000) { - //Stop task after 40 sec - this.cancel(); - } - - } - } else { - //inProgress = false; - this.cancel(); - } - } else { - //inProgress = false; - this.cancel(); - } - } - } - - - -} diff --git a/src/main/java/mviper/bridge/inventory/BackgroundTask.java b/src/main/java/mviper/bridge/inventory/BackgroundTask.java new file mode 100644 index 0000000..1f8d5a5 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/BackgroundTask.java @@ -0,0 +1,68 @@ +package net.mviper.bridge.inventory; + +import java.util.ArrayList; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class BackgroundTask { + + private Inv m; + + public BackgroundTask(Inv m) { + this.m = m; + runTask(); + } + + private void runTask() { + if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled")) { + Inv.log.info("Data save task is enabled."); + long interval = m.getConfigHandler().getInteger("General.saveDataTask.interval") * 60 * 20L; + Bukkit.getScheduler().runTaskTimerAsynchronously(m, new Runnable() { + @Override + public void run() { + runSaveData(); + } + }, interval, interval); + } else { + Inv.log.info("Data save task is disabled."); + } + } + + private void runSaveData() { + if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled")) { + // Get players on main thread to avoid ConcurrentModificationException + Bukkit.getScheduler().runTask(m, () -> { + if (!Bukkit.getOnlinePlayers().isEmpty()) { + List onlinePlayers = new ArrayList<>(Bukkit.getOnlinePlayers()); + + if (!m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages")) { + Inv.log.info("Saving online players data..."); + } + + // Save each player asynchronously + for (Player p : onlinePlayers) { + if (p.isOnline()) { + Bukkit.getScheduler().runTaskAsynchronously(m, () -> { + m.getInventoryDataHandler().onDataSaveFunction(p, false, "false", null, null); + }); + } + } + + if (!m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages")) { + Inv.log.info("Data save scheduled for " + onlinePlayers.size() + " players."); + } + } + }); + } + } + + public void onShutDownDataSave() { + Inv.log.info("Saving online players data..."); + if (!Bukkit.getOnlinePlayers().isEmpty()) { + for (Player p : Bukkit.getOnlinePlayers()) { + m.getInventoryDataHandler().onDataSaveFunction(p, true, "true", null, null); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/ConfigHandler.java b/src/main/java/mviper/bridge/inventory/ConfigHandler.java new file mode 100644 index 0000000..2924775 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/ConfigHandler.java @@ -0,0 +1,54 @@ +package net.mviper.bridge.inventory; + +import java.io.File; + +public class ConfigHandler { + + private Inv inv; + + public ConfigHandler(Inv inv) { + this.inv = inv; + loadConfig(); + } + + public void loadConfig() { + if (!inv.getDataFolder().exists()) { + inv.getDataFolder().mkdir(); + } + File configFile = new File(inv.getDataFolder(), "config.yml"); + if (!configFile.exists()) { + Inv.log.info("No config file found! Creating new one..."); + inv.saveDefaultConfig(); + } + inv.reloadConfig(); + } + + public String getString(String key) { + if (!inv.getConfig().contains(key)) { + inv.getLogger().severe("Could not locate " + key + " in the config.yml! (Try deleting the current config)"); + return "error:" + key; + } + return inv.getConfig().getString(key); + } + + public String getStringWithColor(String key) { + String s = getString(key); + return s.replace("&", "§"); + } + + public Integer getInteger(String key) { + if (!inv.getConfig().contains(key)) { + inv.getLogger().severe("Could not locate " + key + " in the config.yml!"); + return 0; + } + return inv.getConfig().getInt(key); + } + + public Boolean getBoolean(String key) { + if (!inv.getConfig().contains(key)) { + inv.getLogger().severe("Could not locate " + key + " in the config.yml!"); + return false; + } + return inv.getConfig().getBoolean(key); + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/Inv.java b/src/main/java/mviper/bridge/inventory/Inv.java new file mode 100644 index 0000000..f41ba40 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/Inv.java @@ -0,0 +1,84 @@ +package net.mviper.bridge.inventory; + +import java.util.logging.Logger; +import net.mviper.bridge.inventory.database.InvMysqlInterface; +import net.mviper.bridge.inventory.database.MysqlSetup; +import net.mviper.bridge.inventory.events.DropItem; +import net.mviper.bridge.inventory.events.InventoryClick; +import net.mviper.bridge.inventory.events.PlayerJoin; +import net.mviper.bridge.inventory.events.PlayerQuit; +import org.bukkit.Bukkit; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + +public class Inv extends JavaPlugin { + + public static Logger log; + public boolean useProtocolLib = false; + public static String pluginName = "MysqlInventoryBridge"; + public static boolean is19Server = true; + public static boolean is13Server = false; + public static boolean isDisabling = false; + + private static ConfigHandler configHandler; + private static SoundHandler sH; + private static MysqlSetup databaseManager; + private static InvMysqlInterface invMysqlInterface; + private static InventoryDataHandler idH; + private static BackgroundTask bt; + + @Override + public void onEnable() { + log = getLogger(); + isDisabling = false; + configHandler = new ConfigHandler(this); + sH = new SoundHandler(this); + checkVersion(); + databaseManager = new MysqlSetup(this); + invMysqlInterface = new InvMysqlInterface(this); + idH = new InventoryDataHandler(this); + + PluginManager pm = getServer().getPluginManager(); + pm.registerEvents(new PlayerJoin(this), this); + pm.registerEvents(new PlayerQuit(this), this); + pm.registerEvents(new InventoryClick(this), this); + pm.registerEvents(new DropItem(this), this); + + bt = new BackgroundTask(this); + log.info(pluginName + " has been enabled!"); + } + + @Override + public void onDisable() { + isDisabling = true; + if (bt != null) { + bt.onShutDownDataSave(); + } + HandlerList.unregisterAll(this); + if (databaseManager != null) { + databaseManager.closeConnection(); + } + log.info(pluginName + " has been disabled!"); + } + + private boolean checkVersion() { + String[] serverVersion = Bukkit.getBukkitVersion().split("-"); + String version = serverVersion[0]; + + if (version.matches("1.7.10|1.7.9|1.7.5|1.7.2|1.8.8|1.8.3|1.8.4|1.8")) { + is19Server = false; + return true; + } else if (version.startsWith("1.13") || version.startsWith("1.14") || version.startsWith("1.15") || version.startsWith("1.16") || version.startsWith("1.17") || version.startsWith("1.18") || version.startsWith("1.19") || version.startsWith("1.20")) { + is13Server = true; + return true; + } + return true; + } + + public ConfigHandler getConfigHandler() { return configHandler; } + public SoundHandler getSoundHandler() { return sH; } + public MysqlSetup getDatabaseManager() { return databaseManager; } + public InvMysqlInterface getInvMysqlInterface() { return invMysqlInterface; } + public InventoryDataHandler getInventoryDataHandler() { return idH; } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/InventoryDataHandler.java b/src/main/java/mviper/bridge/inventory/InventoryDataHandler.java new file mode 100644 index 0000000..55463b9 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/InventoryDataHandler.java @@ -0,0 +1,84 @@ +package net.mviper.bridge.inventory; + +import java.util.HashSet; +import java.util.Set; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import net.mviper.bridge.inventory.objects.DatabaseInventoryData; +import net.mviper.bridge.inventory.objects.InventorySyncData; +import net.mviper.bridge.inventory.objects.InventorySyncTask; + +public class InventoryDataHandler { + + private Inv pd; + private Set playersInSync = new HashSet<>(); + + public InventoryDataHandler(Inv pd) { + this.pd = pd; + } + + public boolean isSyncComplete(Player p) { + return playersInSync.contains(p); + } + + public void onJoinFunction(Player p) { + InventorySyncData syncData = new InventorySyncData(); + syncData.setBackupInventory(p.getInventory().getContents()); + syncData.setBackupArmor(p.getInventory().getArmorContents()); + + p.getInventory().clear(); + p.getInventory().setArmorContents(new ItemStack[4]); + + new InventorySyncTask(pd, System.currentTimeMillis(), p, syncData).runTaskTimerAsynchronously(pd, 10L, 20L); + } + + public void setPlayerData(final Player p, DatabaseInventoryData data, InventorySyncData syncData, boolean cancelTask) { + // MUST run on main thread + Bukkit.getScheduler().runTask(pd, () -> { + if (!playersInSync.contains(p)) { + if (data.getRawInventory().equals("none")) { + p.getInventory().setContents(syncData.getBackupInventory()); + p.getInventory().setArmorContents(syncData.getBackupArmor()); + } else { + try { + p.getInventory().setContents(decodeItems(data.getRawInventory())); + p.getInventory().setArmorContents(decodeItems(data.getRawArmor())); + } catch (Exception e) { + e.printStackTrace(); + p.getInventory().setContents(syncData.getBackupInventory()); + p.getInventory().setArmorContents(syncData.getBackupArmor()); + } + } + p.updateInventory(); + playersInSync.add(p); + pd.getInvMysqlInterface().setSyncStatus(p, "false"); + } + }); + } + + public void onDataSaveFunction(Player p, boolean disconnect, String syncStatus, ItemStack[] inv, ItemStack[] armor) { + ItemStack[] currentInv = (inv != null) ? inv : p.getInventory().getContents(); + ItemStack[] currentArmor = (armor != null) ? armor : p.getInventory().getArmorContents(); + + String encodedInv = encodeItems(currentInv); + String encodedArmor = encodeItems(currentArmor); + + pd.getInvMysqlInterface().saveData(p, encodedInv, encodedArmor, syncStatus); + + if (disconnect) { + playersInSync.remove(p); + } + } + + public String encodeItems(ItemStack[] items) { + return InventoryUtils.itemStackArrayToBase64(items); + } + + public ItemStack[] decodeItems(String data) throws Exception { + return InventoryUtils.itemStackArrayFromBase64(data); + } + + public ItemStack[] getInventory(Player p) { return p.getInventory().getContents(); } + public ItemStack[] getArmor(Player p) { return p.getInventory().getArmorContents(); } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/InventoryUtils.java b/src/main/java/mviper/bridge/inventory/InventoryUtils.java new file mode 100644 index 0000000..caa4fc3 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/InventoryUtils.java @@ -0,0 +1,44 @@ +package net.mviper.bridge.inventory; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.util.io.BukkitObjectOutputStream; +import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; + +public class InventoryUtils { + + public static String itemStackArrayToBase64(ItemStack[] items) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); + dataOutput.writeInt(items.length); + for (ItemStack item : items) { + dataOutput.writeObject(item); + } + dataOutput.close(); + return Base64Coder.encodeLines(outputStream.toByteArray()); + } catch (Exception e) { + throw new IllegalStateException("Unable to save item stacks.", e); + } + } + + public static ItemStack[] itemStackArrayFromBase64(String data) throws IOException { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); + BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); + ItemStack[] items = new ItemStack[dataInput.readInt()]; + + for (int i = 0; i < items.length; i++) { + items[i] = (ItemStack) dataInput.readObject(); + } + + dataInput.close(); + return items; + } catch (ClassNotFoundException e) { + throw new IOException("Unable to decode class type.", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/SoundHandler.java b/src/main/java/mviper/bridge/inventory/SoundHandler.java new file mode 100644 index 0000000..2f05dbd --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/SoundHandler.java @@ -0,0 +1,36 @@ +package net.mviper.bridge.inventory; + +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +public class SoundHandler { + + private Inv pd; + + public SoundHandler(Inv pd) { + this.pd = pd; + } + + public void sendPlingSound(Player p) { + if (!pd.getConfigHandler().getBoolean("General.disableSounds")) { + Sound sound; + if (Inv.is13Server) { + sound = Sound.BLOCK_NOTE_BLOCK_PLING; + } else { + try { + sound = Sound.valueOf("NOTE_PLING"); + } catch (Exception e) { + sound = Sound.valueOf("BLOCK_NOTE_PLING"); + } + } + p.playSound(p.getLocation(), sound, 3F, 3F); + } + } + + public void sendLevelUpSound(Player p) { + if (!pd.getConfigHandler().getBoolean("General.disableSounds")) { + Sound sound = Inv.is19Server ? Sound.ENTITY_PLAYER_LEVELUP : Sound.valueOf("LEVEL_UP"); + p.playSound(p.getLocation(), sound, 1F, 1F); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/database/InvMysqlInterface.java b/src/main/java/mviper/bridge/inventory/database/InvMysqlInterface.java new file mode 100644 index 0000000..eddb5fc --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/database/InvMysqlInterface.java @@ -0,0 +1,61 @@ +package net.mviper.bridge.inventory.database; + +import java.sql.*; +import org.bukkit.entity.Player; +import net.mviper.bridge.inventory.Inv; +import net.mviper.bridge.inventory.objects.DatabaseInventoryData; + +public class InvMysqlInterface { + + private Inv inv; + + public InvMysqlInterface(Inv inv) { + this.inv = inv; + } + + public void saveData(Player p, String invData, String armorData, String sync) { + String table = inv.getConfigHandler().getString("database.mysql.tableName"); + String sql = "INSERT INTO `" + table + "` (player_uuid, inventory, armor, sync_complete, last_seen) VALUES (?,?,?,?,?) " + + "ON DUPLICATE KEY UPDATE inventory=?, armor=?, sync_complete=?, last_seen=?"; + + try (PreparedStatement ps = inv.getDatabaseManager().getConnection().prepareStatement(sql)) { + ps.setString(1, p.getUniqueId().toString()); + ps.setString(2, invData); + ps.setString(3, armorData); + ps.setString(4, sync); + ps.setString(5, String.valueOf(System.currentTimeMillis())); + ps.setString(6, invData); + ps.setString(7, armorData); + ps.setString(8, sync); + ps.setString(9, String.valueOf(System.currentTimeMillis())); + ps.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public DatabaseInventoryData getData(Player p) { + String table = inv.getConfigHandler().getString("database.mysql.tableName"); + try (PreparedStatement ps = inv.getDatabaseManager().getConnection().prepareStatement("SELECT * FROM `" + table + "` WHERE player_uuid=?")) { + ps.setString(1, p.getUniqueId().toString()); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + return new DatabaseInventoryData(rs.getString("inventory"), rs.getString("armor"), rs.getString("sync_complete"), rs.getString("last_seen")); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return new DatabaseInventoryData("none", "none", "true", "0"); + } + + public void setSyncStatus(Player p, String status) { + String table = inv.getConfigHandler().getString("database.mysql.tableName"); + try (PreparedStatement ps = inv.getDatabaseManager().getConnection().prepareStatement("UPDATE `" + table + "` SET sync_complete=? WHERE player_uuid=?")) { + ps.setString(1, status); + ps.setString(2, p.getUniqueId().toString()); + ps.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/database/MysqlSetup.java b/src/main/java/mviper/bridge/inventory/database/MysqlSetup.java new file mode 100644 index 0000000..6e65e45 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/database/MysqlSetup.java @@ -0,0 +1,90 @@ +package net.mviper.bridge.inventory.database; + +import java.sql.*; +import java.util.Properties; +import net.mviper.bridge.inventory.Inv; +import org.bukkit.Bukkit; + +public class MysqlSetup { + + private Connection conn = null; + private Inv eco; + + public MysqlSetup(Inv eco) { + this.eco = eco; + connectToDatabase(); + setupDatabase(); + databaseMaintenanceTask(); + } + + public void connectToDatabase() { + Inv.log.info("Connecting to the database..."); + try { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + Class.forName("com.mysql.jdbc.Driver"); + } + + Properties properties = new Properties(); + properties.setProperty("user", eco.getConfigHandler().getString("database.mysql.user")); + properties.setProperty("password", eco.getConfigHandler().getString("database.mysql.password")); + properties.setProperty("autoReconnect", "true"); + properties.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled")); + + String host = eco.getConfigHandler().getString("database.mysql.host"); + String port = eco.getConfigHandler().getString("database.mysql.port"); + String db = eco.getConfigHandler().getString("database.mysql.databaseName"); + + conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + db, properties); + Inv.log.info("Database connection successful!"); + } catch (Exception e) { + Inv.log.severe("Could not connect to database! Error: " + e.getMessage()); + } + } + + public void setupDatabase() { + if (conn == null) return; + String table = eco.getConfigHandler().getString("database.mysql.tableName"); + try (Statement s = conn.createStatement()) { + s.executeUpdate("CREATE TABLE IF NOT EXISTS `" + table + "` (" + + "`player_uuid` VARCHAR(45) NOT NULL, " + + "`inventory` LONGTEXT, " + + "`armor` LONGTEXT, " + + "`sync_complete` VARCHAR(10), " + + "`last_seen` VARCHAR(45), " + + "PRIMARY KEY (`player_uuid`))"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public Connection getConnection() { + try { + if (conn == null || conn.isClosed()) connectToDatabase(); + } catch (SQLException e) { connectToDatabase(); } + return conn; + } + + public void closeConnection() { + try { + if (conn != null && !conn.isClosed()) conn.close(); + } catch (SQLException e) { e.printStackTrace(); } + } + + private void databaseMaintenanceTask() { + if (eco.getConfigHandler().getBoolean("database.maintenance.enabled")) { + Bukkit.getScheduler().runTaskLaterAsynchronously(eco, () -> { + if (conn != null) { + long inactivityDays = eco.getConfigHandler().getInteger("database.maintenance.inactivity"); + long inactiveTime = System.currentTimeMillis() - (inactivityDays * 24 * 60 * 60 * 1000); + Inv.log.info("Database maintenance task started..."); + try (PreparedStatement ps = conn.prepareStatement("DELETE FROM `" + eco.getConfigHandler().getString("database.mysql.tableName") + "` WHERE `last_seen` < ?")) { + ps.setString(1, String.valueOf(inactiveTime)); + ps.execute(); + } catch (SQLException e) { e.printStackTrace(); } + } + }, 100L); + } + } +} \ No newline at end of file diff --git a/src/main/java/craftersland/bridge/inventory/events/DropItem.java b/src/main/java/mviper/bridge/inventory/events/DropItem.java similarity index 53% rename from src/main/java/craftersland/bridge/inventory/events/DropItem.java rename to src/main/java/mviper/bridge/inventory/events/DropItem.java index 987ec6c..0ef806f 100644 --- a/src/main/java/craftersland/bridge/inventory/events/DropItem.java +++ b/src/main/java/mviper/bridge/inventory/events/DropItem.java @@ -1,24 +1,18 @@ -package net.craftersland.bridge.inventory.events; - -import net.craftersland.bridge.inventory.Inv; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerDropItemEvent; - -public class DropItem implements Listener { - - private Inv pd; - - public DropItem(Inv pd) { - this.pd = pd; - } - - @EventHandler - public void onItemDrop(final PlayerDropItemEvent event) { - if (pd.getInventoryDataHandler().isSyncComplete(event.getPlayer()) == false) { - event.setCancelled(true); - } - } - -} +package net.mviper.bridge.inventory.events; + +import net.mviper.bridge.inventory.Inv; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerDropItemEvent; + +public class DropItem implements Listener { + private Inv pd; + public DropItem(Inv pd) { this.pd = pd; } + + @EventHandler + public void onItemDrop(final PlayerDropItemEvent event) { + if (!pd.getInventoryDataHandler().isSyncComplete(event.getPlayer())) { + event.setCancelled(true); + } + } +} \ No newline at end of file diff --git a/src/main/java/craftersland/bridge/inventory/events/InventoryClick.java b/src/main/java/mviper/bridge/inventory/events/InventoryClick.java similarity index 53% rename from src/main/java/craftersland/bridge/inventory/events/InventoryClick.java rename to src/main/java/mviper/bridge/inventory/events/InventoryClick.java index fa5f29a..1a22903 100644 --- a/src/main/java/craftersland/bridge/inventory/events/InventoryClick.java +++ b/src/main/java/mviper/bridge/inventory/events/InventoryClick.java @@ -1,26 +1,19 @@ -package net.craftersland.bridge.inventory.events; - -import net.craftersland.bridge.inventory.Inv; - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; - -public class InventoryClick implements Listener { - - private Inv pd; - - public InventoryClick(Inv pd) { - this.pd = pd; - } - - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - Player p = (Player) event.getWhoClicked(); - if (pd.getInventoryDataHandler().isSyncComplete(p) == false) { - event.setCancelled(true); - } - } - -} +package net.mviper.bridge.inventory.events; + +import net.mviper.bridge.inventory.Inv; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class InventoryClick implements Listener { + private Inv pd; + public InventoryClick(Inv pd) { this.pd = pd; } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + if (!pd.getInventoryDataHandler().isSyncComplete((Player) event.getWhoClicked())) { + event.setCancelled(true); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/events/PlayerJoin.java b/src/main/java/mviper/bridge/inventory/events/PlayerJoin.java new file mode 100644 index 0000000..3224848 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/events/PlayerJoin.java @@ -0,0 +1,27 @@ +package net.mviper.bridge.inventory.events; + +import net.mviper.bridge.inventory.Inv; +import net.mviper.bridge.inventory.objects.SyncCompleteTask; +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; + +public class PlayerJoin implements Listener { + private Inv inv; + public PlayerJoin(Inv inv) { this.inv = inv; } + + @EventHandler + public void onLogin(final PlayerJoinEvent event) { + if (!Inv.isDisabling) { + final Player p = event.getPlayer(); + Bukkit.getScheduler().runTaskLaterAsynchronously(inv, () -> { + if (p.isOnline()) { + inv.getInventoryDataHandler().onJoinFunction(p); + new SyncCompleteTask(inv, System.currentTimeMillis(), p).runTaskTimerAsynchronously(inv, 5L, 20L); + } + }, 5L); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/events/PlayerQuit.java b/src/main/java/mviper/bridge/inventory/events/PlayerQuit.java new file mode 100644 index 0000000..78e8aed --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/events/PlayerQuit.java @@ -0,0 +1,20 @@ +package net.mviper.bridge.inventory.events; + +import net.mviper.bridge.inventory.Inv; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerQuit implements Listener { + private Inv inv; + public PlayerQuit(Inv inv) { this.inv = inv; } + + @EventHandler + public void onDisconnect(final PlayerQuitEvent event) { + if (!Inv.isDisabling) { + Player p = event.getPlayer(); + inv.getInventoryDataHandler().onDataSaveFunction(p, true, "true", null, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/objects/DatabaseInventoryData.java b/src/main/java/mviper/bridge/inventory/objects/DatabaseInventoryData.java new file mode 100644 index 0000000..e893c7e --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/objects/DatabaseInventoryData.java @@ -0,0 +1,17 @@ +package net.mviper.bridge.inventory.objects; + +public class DatabaseInventoryData { + private String rawInv, rawAr, syncComplete, lastSee; + + public DatabaseInventoryData(String rawInventory, String rawArmor, String syncStatus, String lastSeen) { + this.rawInv = rawInventory; + this.rawAr = rawArmor; + this.syncComplete = syncStatus; + this.lastSee = lastSeen; + } + + public String getRawInventory() { return rawInv; } + public String getRawArmor() { return rawAr; } + public String getSyncStatus() { return syncComplete; } + public String getLastSeen() { return lastSee; } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/objects/InventorySyncData.java b/src/main/java/mviper/bridge/inventory/objects/InventorySyncData.java new file mode 100644 index 0000000..fc7dfb7 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/objects/InventorySyncData.java @@ -0,0 +1,15 @@ +package net.mviper.bridge.inventory.objects; + +import org.bukkit.inventory.ItemStack; + +public class InventorySyncData { + private ItemStack[] backupInv, backupAr; + private Boolean syncComplete = false; + + public void setSyncStatus(boolean syncStatus) { this.syncComplete = syncStatus; } + public Boolean getSyncStatus() { return syncComplete; } + public ItemStack[] getBackupArmor() { return backupAr; } + public ItemStack[] getBackupInventory() { return backupInv; } + public void setBackupInventory(ItemStack[] backupInventory) { this.backupInv = backupInventory; } + public void setBackupArmor(ItemStack[] backupArmor) { this.backupAr = backupArmor; } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/objects/InventorySyncTask.java b/src/main/java/mviper/bridge/inventory/objects/InventorySyncTask.java new file mode 100644 index 0000000..12768ab --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/objects/InventorySyncTask.java @@ -0,0 +1,37 @@ +package net.mviper.bridge.inventory.objects; // KORREKT + +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import net.mviper.bridge.inventory.Inv; // KORREKT + +public class InventorySyncTask extends BukkitRunnable { + private Inv pd; + private long startTime; + private Player p; + private InventorySyncData syncD; + + public InventorySyncTask(Inv pd, long start, Player player, InventorySyncData syncData) { + this.pd = pd; + this.startTime = start; + this.p = player; + this.syncD = syncData; + } + + @Override + public void run() { + if (p == null || !p.isOnline()) { + this.cancel(); + return; + } + + DatabaseInventoryData data = pd.getInvMysqlInterface().getData(p); + + if (data.getSyncStatus().equals("true") || (System.currentTimeMillis() - Long.parseLong(data.getLastSeen()) >= 600000)) { + pd.getInventoryDataHandler().setPlayerData(p, data, syncD, true); + this.cancel(); + } else if (System.currentTimeMillis() - startTime >= 15000) { + pd.getInventoryDataHandler().setPlayerData(p, data, syncD, true); + this.cancel(); + } + } +} \ No newline at end of file diff --git a/src/main/java/mviper/bridge/inventory/objects/SyncCompleteTask.java b/src/main/java/mviper/bridge/inventory/objects/SyncCompleteTask.java new file mode 100644 index 0000000..331d142 --- /dev/null +++ b/src/main/java/mviper/bridge/inventory/objects/SyncCompleteTask.java @@ -0,0 +1,31 @@ +package net.mviper.bridge.inventory.objects; + +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import net.mviper.bridge.inventory.Inv; + +public class SyncCompleteTask extends BukkitRunnable { + private Inv pd; + private long startTime; + private Player p; + + public SyncCompleteTask(Inv pd, long start, Player player) { + this.pd = pd; this.startTime = start; this.p = player; + } + + @Override + public void run() { + if (p == null || !p.isOnline()) { this.cancel(); return; } + + if (pd.getInventoryDataHandler().isSyncComplete(p)) { + String msg = pd.getConfigHandler().getString("ChatMessages.syncComplete"); + if (!msg.isEmpty()) { + p.sendMessage(pd.getConfigHandler().getStringWithColor("ChatMessages.syncComplete")); + } + pd.getSoundHandler().sendLevelUpSound(p); + this.cancel(); + } else if (System.currentTimeMillis() - startTime >= 20000) { + pd.getInvMysqlInterface().setSyncStatus(p, "true"); + } + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 992f2d7..b06c424 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,64 +1,72 @@ -# Standard config.yml für MysqlInventoryBridge -# Config Version 2.5 +# ====================================================== +# InventoryBridge Configuration +# Version: 3.0 | Author: M_Viper +# ====================================================== + +# ------------------------------------------------------ +# DATABASE SETTINGS +# ------------------------------------------------------ +# Hinweis: Die Datenbank muss manuell erstellt werden. +# Das Plugin generiert die Tabellen automatisch beim ersten Start. -# MySQL Datenbank Details database: - mysql: - # MySQL Server Adresse - host: 127.0.0.1 - # MySQL Server Port (Standard 3306) - port: 3306 - # Datenbank Name (HINWEIS! Du musst die Datenbank erstellen, dann erstellt das Plugin die Tabellen.) - databaseName: 'mydatabase' - # Tabellenname (das Plugin erstellt sie automatisch) - tableName: 'meb_inventory' - # Benutzername - user: 'admin' - # Benutzer Passwort - password: 'cheesecake' - # SSL Verbindung - sslEnabled: false - # Entferne inaktive Benutzer aus der Datenbank. Diese Wartungsaufgabe startet bei jedem Serverstart mit 2 Minuten Verzögerung. - maintenance: - # Datenbank-Wartung aktivieren oder deaktivieren. | (true oder false) - enabled: false - # Inaktivität in Tagen. Standard 60 Tage. - inactivity: 60 + mysql: + host: '127.0.0.1' # MySQL Server Adresse + port: 3306 # Standard Port: 3306 + databaseName: 'mydatabase' # Name der existierenden Datenbank + tableName: 'meb_inventory' # Name der Tabelle (wird erstellt) + user: 'admin' # Datenbank-Benutzer + password: 'cheesecake' # Passwort des Benutzers + sslEnabled: false # SSL-Verschlüsselung nutzen? (true/false) + # Automatische Datenbereinigung + # Startet bei jedem Serverstart mit einer Verzögerung von 2 Minuten. + maintenance: + enabled: false # Datenbank-Wartung aktivieren? (true/false) + inactivity: 60 # Lösche User, die X Tage inaktiv waren (Standard: 60) + +# ------------------------------------------------------ +# GENERAL PLUGIN SETTINGS +# ------------------------------------------------------ -# Weitere konfigurierbare Optionen General: - # Speichere Online-Spieler-Datenbankkonten Aufgabe. Deaktiviere diese Aufgabe und die Daten werden nur beim Verbindungsabbruch gespeichert. - # Um Datenverlust bei Serverabstürzen zu begrenzen, aktiviere diese Speicheraufgabe. Sie läuft asynchron, daher gibt es keine Verzögerung. - saveDataTask: - # Aktiviere oder deaktiviere die Speicheraufgabe. | (true oder false) - enabled: true - # Zeit zwischen Speichervorgängen in Minuten. | Standard 3 Min. - interval: 3 - # Verstecke Protokollmeldungen der Speicheraufgabe. - hideLogMessages: false - # Verbindungs-Ökonomie Sync-Verzögerung in Millisekunden (Standard 1000 ms = 1 Sekunde) - # Diese Verzögerung ist bei Bungeecord Setups nötig, da Quit und Login nahezu gleichzeitig stattfinden. - loginSyncDelay: 1000 - # Setze auf false, um das Synchronisieren der Spieler-Rüstung zu deaktivieren. | (true oder false) - syncArmorEnabled: true - # Aktiviere Unterstützung für modifizierte Items. Benötigt die ProtocolLib-Abhängigkeit! | (true oder false) - # Nötig, falls du Item-Datenverlust bei Mods erlebst, die NBT-Daten speichern. - # WARNUNG! Alle Server im Sync müssen diese Option gleich eingestellt haben, sonst gehen Items verloren. - enableModdedItemsSupport: false - # Deaktiviere Sounds, die vom Plugin erzeugt werden, z.B. Bestätigungssound bei Sync. | (true oder false) - disableSounds: false + # Intervall-Speicherung für Online-Spieler + # Verhindert Datenverlust bei unerwarteten Serverabstürzen. + saveDataTask: + enabled: true # Automatische Speicherung aktivieren? (true/false) + interval: 3 # Intervall in Minuten (Standard: 3) + hideLogMessages: false # Speicher-Bestätigung in der Konsole verstecken? + # Synchronisations-Optionen + # loginSyncDelay: Wichtig bei BungeeCord/Velocity (Standard: 1000ms = 1 Sekunde) + loginSyncDelay: 1000 + syncArmorEnabled: true # Sollen Rüstungs-Slots synchronisiert werden? + disableSounds: false # Deaktiviere akustische Signale (z.B. bei Sync-Abschluss) + + # Modifizierte Items & NBT-Daten + # Benötigt ProtocolLib! + # WICHTIG: Muss auf ALLEN Servern im Netzwerk identisch eingestellt sein! + enableModdedItemsSupport: false + +# ------------------------------------------------------ +# DEBUG & LOGGING +# ------------------------------------------------------ -# Debug-Konsolennachrichten Debug: - # Debugnachrichten zum Inventory Sync - InventorySync: false + InventorySync: false # Erweiterte Log-Ausgabe für Inventar-Vorgänge +# ------------------------------------------------------ +# LOCALIZATION & MESSAGES +# ------------------------------------------------------ +# Unterstützt Minecraft Farbcodes (z.B. &a für Hellgrün). +# Um eine Nachricht zu deaktivieren, setze sie auf '' -# Chat-Nachrichten mit vollem Farb- und Formatcode-Support. Deaktiviere eine Nachricht, indem du sie auf '' setzt | Beispiel: syncComplete: '' -# Minecraft Farb- und Formatcodes: [http://minecraft.gamepedia.com/Formatting_codes](http://minecraft.gamepedia.com/Formatting_codes) ChatMessages: - syncComplete: '&2[MIB] &aDaten-Sync abgeschlossen!' - inventorySyncError: '&4[WARNUNG] &cFehler beim Laden deines Inventars! Kontaktiere das Team.' - inventorySyncBackup: '&6[!] &eLokales Inventar wiederhergestellt! Lass keine Items im Inventar, wenn du dich trennst!' + # Erfolgsmeldung nach dem Login + syncComplete: '&2[MIB] &aDaten-Sync erfolgreich abgeschlossen!' + + # Fehlermeldung, wenn der MySQL-Abruf fehlschlägt + inventorySyncError: '&4[WARNUNG] &cFehler beim Laden deines Inventars! Bitte Team kontaktieren.' + + # Meldung bei Nutzung des lokalen Backups (wenn MySQL nicht erreichbar war) + inventorySyncBackup: '&6[!] &eLokales Backup geladen! Achtung: Daten könnten veraltet sein.' \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9b9e799..fd82562 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ -name: MysqlInventoryBridge-Reborn -main: net.craftersland.bridge.inventory.Inv +name: InventoryBridge +main: net.mviper.bridge.inventory.Inv version: 2.5 author: M_Viper website: www.m-viper.de