Update from Git Manager GUI
This commit is contained in:
@@ -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<Player> onlinePlayers = new ArrayList<Player>(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<Player> onlinePlayers = new ArrayList<Player>(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.");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<String> playersSync = new HashSet<String>();
|
|
||||||
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!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<Player> playersInSync = new HashSet<Player>();
|
|
||||||
private Set<Player> playersDisconnectSave = new HashSet<Player>();
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
68
src/main/java/mviper/bridge/inventory/BackgroundTask.java
Normal file
68
src/main/java/mviper/bridge/inventory/BackgroundTask.java
Normal file
@@ -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<Player> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/main/java/mviper/bridge/inventory/ConfigHandler.java
Normal file
54
src/main/java/mviper/bridge/inventory/ConfigHandler.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
84
src/main/java/mviper/bridge/inventory/Inv.java
Normal file
84
src/main/java/mviper/bridge/inventory/Inv.java
Normal file
@@ -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; }
|
||||||
|
}
|
||||||
@@ -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<Player> 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(); }
|
||||||
|
}
|
||||||
44
src/main/java/mviper/bridge/inventory/InventoryUtils.java
Normal file
44
src/main/java/mviper/bridge/inventory/InventoryUtils.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/main/java/mviper/bridge/inventory/SoundHandler.java
Normal file
36
src/main/java/mviper/bridge/inventory/SoundHandler.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,24 +1,18 @@
|
|||||||
package net.craftersland.bridge.inventory.events;
|
package net.mviper.bridge.inventory.events;
|
||||||
|
|
||||||
import net.craftersland.bridge.inventory.Inv;
|
|
||||||
|
|
||||||
|
import net.mviper.bridge.inventory.Inv;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
|
||||||
public class DropItem implements Listener {
|
public class DropItem implements Listener {
|
||||||
|
|
||||||
private Inv pd;
|
private Inv pd;
|
||||||
|
public DropItem(Inv pd) { this.pd = pd; }
|
||||||
public DropItem(Inv pd) {
|
|
||||||
this.pd = pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onItemDrop(final PlayerDropItemEvent event) {
|
public void onItemDrop(final PlayerDropItemEvent event) {
|
||||||
if (pd.getInventoryDataHandler().isSyncComplete(event.getPlayer()) == false) {
|
if (!pd.getInventoryDataHandler().isSyncComplete(event.getPlayer())) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,19 @@
|
|||||||
package net.craftersland.bridge.inventory.events;
|
package net.mviper.bridge.inventory.events;
|
||||||
|
|
||||||
import net.craftersland.bridge.inventory.Inv;
|
|
||||||
|
|
||||||
|
import net.mviper.bridge.inventory.Inv;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
|
||||||
public class InventoryClick implements Listener {
|
public class InventoryClick implements Listener {
|
||||||
|
|
||||||
private Inv pd;
|
private Inv pd;
|
||||||
|
public InventoryClick(Inv pd) { this.pd = pd; }
|
||||||
public InventoryClick(Inv pd) {
|
|
||||||
this.pd = pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
Player p = (Player) event.getWhoClicked();
|
if (!pd.getInventoryDataHandler().isSyncComplete((Player) event.getWhoClicked())) {
|
||||||
if (pd.getInventoryDataHandler().isSyncComplete(p) == false) {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
27
src/main/java/mviper/bridge/inventory/events/PlayerJoin.java
Normal file
27
src/main/java/mviper/bridge/inventory/events/PlayerJoin.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/mviper/bridge/inventory/events/PlayerQuit.java
Normal file
20
src/main/java/mviper/bridge/inventory/events/PlayerQuit.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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:
|
database:
|
||||||
mysql:
|
mysql:
|
||||||
# MySQL Server Adresse
|
host: '127.0.0.1' # MySQL Server Adresse
|
||||||
host: 127.0.0.1
|
port: 3306 # Standard Port: 3306
|
||||||
# MySQL Server Port (Standard 3306)
|
databaseName: 'mydatabase' # Name der existierenden Datenbank
|
||||||
port: 3306
|
tableName: 'meb_inventory' # Name der Tabelle (wird erstellt)
|
||||||
# Datenbank Name (HINWEIS! Du musst die Datenbank erstellen, dann erstellt das Plugin die Tabellen.)
|
user: 'admin' # Datenbank-Benutzer
|
||||||
databaseName: 'mydatabase'
|
password: 'cheesecake' # Passwort des Benutzers
|
||||||
# Tabellenname (das Plugin erstellt sie automatisch)
|
sslEnabled: false # SSL-Verschlüsselung nutzen? (true/false)
|
||||||
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
|
|
||||||
|
|
||||||
|
# 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:
|
General:
|
||||||
# Speichere Online-Spieler-Datenbankkonten Aufgabe. Deaktiviere diese Aufgabe und die Daten werden nur beim Verbindungsabbruch gespeichert.
|
# Intervall-Speicherung für Online-Spieler
|
||||||
# Um Datenverlust bei Serverabstürzen zu begrenzen, aktiviere diese Speicheraufgabe. Sie läuft asynchron, daher gibt es keine Verzögerung.
|
# Verhindert Datenverlust bei unerwarteten Serverabstürzen.
|
||||||
saveDataTask:
|
saveDataTask:
|
||||||
# Aktiviere oder deaktiviere die Speicheraufgabe. | (true oder false)
|
enabled: true # Automatische Speicherung aktivieren? (true/false)
|
||||||
enabled: true
|
interval: 3 # Intervall in Minuten (Standard: 3)
|
||||||
# Zeit zwischen Speichervorgängen in Minuten. | Standard 3 Min.
|
hideLogMessages: false # Speicher-Bestätigung in der Konsole verstecken?
|
||||||
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
|
|
||||||
|
|
||||||
|
# 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:
|
Debug:
|
||||||
# Debugnachrichten zum Inventory Sync
|
InventorySync: false # Erweiterte Log-Ausgabe für Inventar-Vorgänge
|
||||||
InventorySync: false
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------
|
||||||
|
# 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:
|
ChatMessages:
|
||||||
syncComplete: '&2[MIB] &aDaten-Sync abgeschlossen!'
|
# Erfolgsmeldung nach dem Login
|
||||||
inventorySyncError: '&4[WARNUNG] &cFehler beim Laden deines Inventars! Kontaktiere das Team.'
|
syncComplete: '&2[MIB] &aDaten-Sync erfolgreich abgeschlossen!'
|
||||||
inventorySyncBackup: '&6[!] &eLokales Inventar wiederhergestellt! Lass keine Items im Inventar, wenn du dich trennst!'
|
|
||||||
|
# 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.'
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
name: MysqlInventoryBridge-Reborn
|
name: InventoryBridge
|
||||||
main: net.craftersland.bridge.inventory.Inv
|
main: net.mviper.bridge.inventory.Inv
|
||||||
version: 2.5
|
version: 2.5
|
||||||
author: M_Viper
|
author: M_Viper
|
||||||
website: www.m-viper.de
|
website: www.m-viper.de
|
||||||
|
|||||||
Reference in New Issue
Block a user