diff --git a/lib/MMOLib.jar b/lib/MMOLib.jar index 9dabc968..e4a4face 100644 Binary files a/lib/MMOLib.jar and b/lib/MMOLib.jar differ diff --git a/pom.xml b/pom.xml index 5a37e790..1d8ff33a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.Indyuce MMOCore - 1.4.7 + 1.4.8 MMOCore Offer your players a brand new RPG experience. diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java index 96cf93c4..ce8a7131 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java @@ -1,54 +1,23 @@ package net.Indyuce.mmocore.manager.data.mysql; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.logging.Level; - -import org.bukkit.configuration.ConfigurationSection; - -import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.manager.data.DataProvider; import net.Indyuce.mmocore.manager.data.GuildDataManager; import net.Indyuce.mmocore.manager.data.PlayerDataManager; import net.Indyuce.mmocore.manager.data.yaml.YAMLGuildDataManager; -import net.mmogroup.mmolib.sql.QueryResult; -import net.mmogroup.mmolib.sql.ResultSet; -import net.mmogroup.mmolib.sql.mysql.MySQLConnection; -import net.mmogroup.mmolib.sql.mysql.MySQLConnectionBuilder; -import net.mmogroup.mmolib.sql.pool.ConnectionPool; +import net.mmogroup.mmolib.sql.MMODataSource; -public class MySQLDataProvider implements DataProvider { +public class MySQLDataProvider extends MMODataSource implements DataProvider { private final MySQLPlayerDataManager playerManager = new MySQLPlayerDataManager(this); private final YAMLGuildDataManager guildManager = new YAMLGuildDataManager(); - private final MySQLConfig config; - private ConnectionPool connection; - - public MySQLDataProvider() { - config = new MySQLConfig(MMOCore.plugin.getConfig().getConfigurationSection("mysql")); - connection = MySQLConnectionBuilder.createConnectionPool(config.getConnectionString()); - - executeUpdate("CREATE TABLE IF NOT EXISTS mmocore_playerdata (uuid VARCHAR(36),class_points INT(11) DEFAULT 0,skill_points INT(11) DEFAULT 0,attribute_points INT(11) DEFAULT 0,attribute_realloc_points INT(11) DEFAULT 0,level INT(11) DEFAULT 1,experience INT(11) DEFAULT 0,class VARCHAR(20),guild VARCHAR(20),last_login LONG,attributes JSON,professions JSON,quests JSON,waypoints JSON,friends JSON,skills JSON,bound_skills JSON,class_info JSON,PRIMARY KEY (uuid));"); - } - - public ResultSet getResult(String sql) { - try { - CompletableFuture future = connection.sendPreparedStatement(sql); - return future.get().getRows(); - } catch (InterruptedException | ExecutionException e) { - MMOCore.log(Level.SEVERE, "MySQL Operation Failed!"); - e.printStackTrace(); - return null; - } - } - - public void executeUpdate(String sql) { - try { - connection.sendPreparedStatement(sql).get(); - } catch (InterruptedException | ExecutionException e) { - MMOCore.log(Level.SEVERE, "MySQL Operation Failed!"); - e.printStackTrace(); - } + @Override + public void load() { + executeUpdateAsync("CREATE TABLE IF NOT EXISTS mmocore_playerdata" + + "(uuid VARCHAR(36),class_points INT(11) DEFAULT 0,skill_points INT(11)" + + "DEFAULT 0,attribute_points INT(11) DEFAULT 0,attribute_realloc_points INT(11)" + + "DEFAULT 0,level INT(11) DEFAULT 1,experience INT(11) DEFAULT 0,class VARCHAR(20)," + + "guild VARCHAR(20),last_login LONG,attributes JSON,professions JSON,quests JSON,waypoints" + + "JSON,friends JSON,skills JSON,bound_skills JSON,class_info JSON,PRIMARY KEY (uuid));"); } @Override @@ -60,24 +29,4 @@ public class MySQLDataProvider implements DataProvider { public GuildDataManager getGuildManager() { return guildManager; } - - public class MySQLConfig { - private final String db, host, user, pass; - private final int port; - - public MySQLConfig(ConfigurationSection config) { - db = config.getString("database", "minecraft"); - host = config.getString("host", "localhost"); - port = config.getInt("port", 3306); - user = config.getString("user", "mmolover"); - pass = config.getString("pass", "ILoveAria"); - } - - public String getConnectionString() { - StringBuilder sb = new StringBuilder("jdbc:mysql://"); - sb.append(host).append(":").append(port).append("/").append(db) - .append("?user=").append(user).append("&password=").append(pass); - return sb.toString(); - } - } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 20ea10e6..24c9120f 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -1,10 +1,13 @@ package net.Indyuce.mmocore.manager.data.mysql; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.UUID; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.stream.Collectors; @@ -22,8 +25,6 @@ import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.manager.data.PlayerDataManager; import net.Indyuce.mmocore.manager.data.mysql.MySQLTableEditor.Table; import net.mmogroup.mmolib.MMOLib; -import net.mmogroup.mmolib.sql.ResultSet; -import net.mmogroup.mmolib.sql.RowData; public class MySQLPlayerDataManager extends PlayerDataManager { private final MySQLDataProvider provider; @@ -34,70 +35,70 @@ public class MySQLPlayerDataManager extends PlayerDataManager { @Override public void loadData(PlayerData data) { - ResultSet result = provider.getResult("SELECT * FROM mmocore_playerdata WHERE uuid = '" + data.getUniqueId() + "';"); + try { + ResultSet result = provider.getResultAsync("SELECT * FROM mmocore_playerdata WHERE uuid = '" + data.getUniqueId() + "';").get(); + if (!result.first()) { + data.setLevel(getDefaultData().getLevel()); + data.setClassPoints(getDefaultData().getClassPoints()); + data.setSkillPoints(getDefaultData().getSkillPoints()); + data.setAttributePoints(getDefaultData().getAttributePoints()); + data.setAttributeReallocationPoints(getDefaultData().getAttributeReallocationPoints()); + data.setExperience(0); + data.setMana(data.getStats().getStat(StatType.MAX_MANA)); + data.setStamina(data.getStats().getStat(StatType.MAX_STAMINA)); + data.setStellium(data.getStats().getStat(StatType.MAX_STELLIUM)); + data.getQuestData().updateBossBar(); - // player data not initialized yet - if (result.size() < 1) { - data.setLevel(getDefaultData().getLevel()); - data.setClassPoints(getDefaultData().getClassPoints()); - data.setSkillPoints(getDefaultData().getSkillPoints()); - data.setAttributePoints(getDefaultData().getAttributePoints()); - data.setAttributeReallocationPoints(getDefaultData().getAttributeReallocationPoints()); - data.setExperience(0); + return; + } + + data.setClassPoints(result.getInt("class_points")); + data.setSkillPoints(result.getInt("skill_points")); + data.setAttributePoints(result.getInt("attribute_points")); + data.setAttributeReallocationPoints(result.getInt("attribute_realloc_points")); + data.setLevel(result.getInt("level")); + data.setExperience(result.getInt("experience")); + if (!isEmpty(result.getString("class"))) + data.setClass(MMOCore.plugin.classManager.get(result.getString("class"))); data.setMana(data.getStats().getStat(StatType.MAX_MANA)); data.setStamina(data.getStats().getStat(StatType.MAX_STAMINA)); data.setStellium(data.getStats().getStat(StatType.MAX_STELLIUM)); + if (!isEmpty(result.getString("guild"))) + data.setGuild(MMOCore.plugin.dataProvider.getGuildManager().stillInGuild(data.getUniqueId(), result.getString("guild"))); + if (!isEmpty(result.getString("attributes"))) + data.getAttributes().load(result.getString("attributes")); + if (!isEmpty(result.getString("professions"))) + data.getCollectionSkills().load(result.getString("professions")); + if (!isEmpty(result.getString("quests"))) + data.getQuestData().load(result.getString("quests")); data.getQuestData().updateBossBar(); - - return; - } - - RowData row = result.get(0); - - data.setClassPoints(row.getInt("class_points")); - data.setSkillPoints(row.getInt("skill_points")); - data.setAttributePoints(row.getInt("attribute_points")); - data.setAttributeReallocationPoints(row.getInt("attribute_realloc_points")); - data.setLevel(row.getInt("level")); - data.setExperience(row.getInt("experience")); - if (!isEmpty(row.getString("class"))) - data.setClass(MMOCore.plugin.classManager.get(row.getString("class"))); - data.setMana(data.getStats().getStat(StatType.MAX_MANA)); - data.setStamina(data.getStats().getStat(StatType.MAX_STAMINA)); - data.setStellium(data.getStats().getStat(StatType.MAX_STELLIUM)); - if (!isEmpty(row.getString("guild"))) - data.setGuild(MMOCore.plugin.dataProvider.getGuildManager().stillInGuild(data.getUniqueId(), row.getString("guild"))); - if (!isEmpty(row.getString("attributes"))) - data.getAttributes().load(row.getString("attributes")); - if (!isEmpty(row.getString("professions"))) - data.getCollectionSkills().load(row.getString("professions")); - if (!isEmpty(row.getString("quests"))) - data.getQuestData().load(row.getString("quests")); - data.getQuestData().updateBossBar(); - if (!isEmpty(row.getString("waypoints"))) - data.getWaypoints().addAll(getJSONArray(row.getString("waypoints"))); - if (!isEmpty(row.getString("friends"))) - getJSONArray(row.getString("friends")).forEach(str -> data.getFriends().add(UUID.fromString(str))); - if (!isEmpty(row.getString("skills"))) { - JsonObject object = MMOLib.plugin.getJson().parse(row.getString("skills"), JsonObject.class); - for (Entry entry : object.entrySet()) - data.setSkillLevel(entry.getKey(), entry.getValue().getAsInt()); - } - if (!isEmpty(row.getString("bound_skills"))) - for (String skill : getJSONArray(row.getString("bound_skills"))) - if (data.getProfess().hasSkill(skill)) - data.getBoundSkills().add(data.getProfess().getSkill(skill)); - if (!isEmpty(row.getString("class_info"))) { - JsonObject object = MMOLib.plugin.getJson().parse(row.getString("class_info"), JsonObject.class); - for (Entry entry : object.entrySet()) { - try { - PlayerClass profess = MMOCore.plugin.classManager.get(entry.getKey()); - Validate.notNull(profess, "Could not find class '" + entry.getKey() + "'"); - data.applyClassInfo(profess, new SavedClassInformation(entry.getValue().getAsJsonObject())); - } catch (IllegalArgumentException exception) { - MMOCore.log(Level.WARNING, "Could not load class info '" + entry.getKey() + "': " + exception.getMessage()); + if (!isEmpty(result.getString("waypoints"))) + data.getWaypoints().addAll(getJSONArray(result.getString("waypoints"))); + if (!isEmpty(result.getString("friends"))) + getJSONArray(result.getString("friends")).forEach(str -> data.getFriends().add(UUID.fromString(str))); + if (!isEmpty(result.getString("skills"))) { + JsonObject object = MMOLib.plugin.getJson().parse(result.getString("skills"), JsonObject.class); + for (Entry entry : object.entrySet()) + data.setSkillLevel(entry.getKey(), entry.getValue().getAsInt()); + } + if (!isEmpty(result.getString("bound_skills"))) + for (String skill : getJSONArray(result.getString("bound_skills"))) + if (data.getProfess().hasSkill(skill)) + data.getBoundSkills().add(data.getProfess().getSkill(skill)); + if (!isEmpty(result.getString("class_info"))) { + JsonObject object = MMOLib.plugin.getJson().parse(result.getString("class_info"), JsonObject.class); + for (Entry entry : object.entrySet()) { + try { + PlayerClass profess = MMOCore.plugin.classManager.get(entry.getKey()); + Validate.notNull(profess, "Could not find class '" + entry.getKey() + "'"); + data.applyClassInfo(profess, new SavedClassInformation(entry.getValue().getAsJsonObject())); + } catch (IllegalArgumentException exception) { + MMOCore.log(Level.WARNING, "Could not load class info '" + entry.getKey() + "': " + exception.getMessage()); + } } } + } catch (SQLException | InterruptedException | ExecutionException e) { + e.printStackTrace(); } } @@ -180,23 +181,25 @@ public class MySQLPlayerDataManager extends PlayerDataManager { public MySQLOfflinePlayerData(UUID uuid) { super(uuid); - ResultSet result = provider.getResult("SELECT * FROM mmocore_playerdata WHERE uuid = '" + uuid + "';"); - if (result.size() < 1) { - level = 0; - lastLogin = 0; - profess = MMOCore.plugin.classManager.getDefaultClass(); - friends = new ArrayList(); - } else { - RowData row = result.get(0); - - level = row.getInt("level"); - lastLogin = row.getLong("last_login"); - profess = isEmpty(row.getString("class")) ? MMOCore.plugin.classManager.getDefaultClass() - : MMOCore.plugin.classManager.get(row.getString("class")); - if (!isEmpty(row.getString("friends"))) - getJSONArray(row.getString("friends")).forEach(str -> friends.add(UUID.fromString(str))); - else + try { + ResultSet result = provider.getResultAsync("SELECT * FROM mmocore_playerdata WHERE uuid = '" + uuid + "';").get(); + if (!result.first()) { + level = 0; + lastLogin = 0; + profess = MMOCore.plugin.classManager.getDefaultClass(); friends = new ArrayList(); + } else { + level = result.getInt("level"); + lastLogin = result.getLong("last_login"); + profess = isEmpty(result.getString("class")) ? MMOCore.plugin.classManager.getDefaultClass() + : MMOCore.plugin.classManager.get(result.getString("class")); + if (!isEmpty(result.getString("friends"))) + getJSONArray(result.getString("friends")).forEach(str -> friends.add(UUID.fromString(str))); + else + friends = new ArrayList(); + } + } catch (SQLException | InterruptedException | ExecutionException e) { + e.printStackTrace(); } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java index 8bfab75b..2c8b87f6 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ExecutionException; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -20,7 +21,12 @@ public class MySQLTableEditor { } public void updateData(String key, Object value) { - ((MySQLDataProvider) MMOCore.plugin.dataProvider).executeUpdate("INSERT INTO " + table + "(uuid, " + key + ") VALUES('" + uuid + "', '" + value + "') ON DUPLICATE KEY UPDATE " + key + "='" + value + "';"); + try { + ((MySQLDataProvider) MMOCore.plugin.dataProvider).executeUpdateAsync("INSERT INTO " + table + "(uuid, " + key + + ") VALUES('" + uuid + "', '" + value + "') ON DUPLICATE KEY UPDATE " + key + "='" + value + "';").get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } } public void updateJSONArray(String key, Collection collection) { @@ -38,8 +44,7 @@ public class MySQLTableEditor { } public enum Table { - PLAYERDATA("mmocore_playerdata"), - GUILDDATA("mmocore_guilddata"); + PLAYERDATA("mmocore_playerdata"), GUILDDATA("mmocore_guilddata"); final String tableName; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 75e1a39c..d7c3a323 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,11 +8,15 @@ auto-save: # MySQL Support mysql: enabled: false - database: minecraft host: localhost port: 3306 + database: minecraft user: mmolover pass: ILoveAria + properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 # The default values for all playerdata # All new players will start with these values