diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java index b591c44e..34201898 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java @@ -91,7 +91,7 @@ public class ExportDataTreeNode extends CommandTreeNode { MMOCore.plugin.dataProvider.getDataManager().loadData(offlinePlayerData); // Player data is loaded, now it gets saved through SQL - sqlProvider.getDataManager().saveData(offlinePlayerData); + sqlProvider.getDataManager().saveData(offlinePlayerData, true); } catch (RuntimeException exception) { errorCount++; exception.printStackTrace(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java index d4c9f815..eb28ae71 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java @@ -46,7 +46,7 @@ public abstract class PlayerDataManager { // Save data async if required if (playerData.isFullyLoaded()) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> saveData(playerData)); + Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> saveData(playerData, true)); // Close and unregister data instantly if no error occured playerData.close(); @@ -122,9 +122,10 @@ public abstract class PlayerDataManager { * This method should always be called sync because it DOES register * an async task in case MySQL storage is used. * - * @param data Player data to save + * @param data Player data to save + * @param logout When logging out, is_saved is switched back to 1. This parameter + * must be turned off when auto-saving because the player doesn't + * actually leave the server. */ - public abstract void saveData(PlayerData data); - - + public abstract void saveData(PlayerData data, boolean logout); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index ff5dc0ea..365f9369 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -137,12 +137,10 @@ public class MySQLPlayerDataManager extends PlayerDataManager { } //We now change the saved status to false because the data on SQL won't be the same as in the RAM - MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(), provider); + new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(), provider).updateData("is_saved", 0); - //We set the saved status to false - sql.updateData("is_saved", 0); - this.cancel(); data.setFullyLoaded(); + this.cancel(); MMOCore.sqlDebug("Loaded saved data for: '" + data.getUniqueId() + "'!"); MMOCore.sqlDebug(String.format("{ class: %s, level: %d }", data.getProfess().getId(), data.getLevel())); return; @@ -160,6 +158,9 @@ public class MySQLPlayerDataManager extends PlayerDataManager { data.setExperience(0); data.getQuestData().updateBossBar(); + //We now change the saved status to false because the data on SQL won't be the same as in the RAM + new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(), provider).updateData("is_saved", 0); + data.setFullyLoaded(); this.cancel(); MMOCore.sqlDebug("Loaded DEFAULT data for: '" + data.getUniqueId() + "' as no saved data was found."); @@ -177,7 +178,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { } @Override - public void saveData(PlayerData data) { + public void saveData(PlayerData data, boolean logout) { MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(), provider); MMOCore.sqlDebug("Saving data for: '" + data.getUniqueId() + "'..."); @@ -211,7 +212,8 @@ public class MySQLPlayerDataManager extends PlayerDataManager { request.addData("professions", data.getCollectionSkills().toJsonString()); request.addData("quests", data.getQuestData().toJsonString()); request.addData("class_info", createClassInfoData(data).toString()); - request.addData("is_saved", 1); + if (logout) + request.addData("is_saved", 1); sql.updateData(request); MMOCore.sqlDebug("Saved data for: " + data.getUniqueId()); MMOCore.sqlDebug(String.format("{ class: %s, level: %d }", data.getProfess().getId(), data.getLevel())); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index 4f1fed6f..fb3cde48 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -121,7 +121,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { } @Override - public void saveData(PlayerData data) { + public void saveData(PlayerData data, boolean logout) { ConfigFile file = new ConfigFile(data.getUniqueId()); FileConfiguration config = file.getConfig();