diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java index 971ccf4..9203976 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java @@ -41,7 +41,7 @@ public interface IStorageManager { * Removes an account from the storage cache and saves its data. * @param uuid player's UUID */ - void removeCachedAccount(UUID uuid); + CompletableFuture removeCachedAccount(UUID uuid); /** * Gets a UUID safe to use in databases. diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java index c87d0d2..ab63ed7 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -46,6 +46,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutionException; public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, LanguagyPluginHook { @@ -91,15 +92,20 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang } else { // Save all player data (quit event not called for shutdown) Bukkit.getOnlinePlayers().forEach(player -> { - if (managers.getStorageManager().getCachedAccounts().containsKey(player.getUniqueId())) - this.getManagers().getStorageManager().removeCachedAccount(player.getUniqueId()); + if (managers.getStorageManager().getCachedAccounts().containsKey(player.getUniqueId())) { + try { + this.getManagers().getStorageManager().removeCachedAccount(player.getUniqueId()).get(); + } catch (InterruptedException | ExecutionException e) { + Thread.currentThread().interrupt(); + } + } }); // Save all region configs managers.getRegionsCache().getConfiguredRegions().forEach((id, region) -> region.save(this)); } - // Close database connection + RPGRegionsAPI.setAPI(null); DB.close(); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java index 1518ffc..a3cea18 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java @@ -97,9 +97,9 @@ public abstract class SQLCommonStorage implements IStorageManager { } @Override - public void removeCachedAccount(UUID uuid) { + public CompletableFuture removeCachedAccount(UUID uuid) { RPGRegionsAccount account = cachedAccounts.get(uuid); - DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { + return DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { List current = new ArrayList<>(); for (DbRow row : results) { current.add(row.getString("region")); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java index 5b7358f..2d44804 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java @@ -134,7 +134,7 @@ public class YamlStorage implements IStorageManager { } @Override - public void removeCachedAccount(UUID uuid) { + public CompletableFuture removeCachedAccount(UUID uuid) { RPGRegionsAccount account = cachedAccounts.get(uuid); File file = new File(plugin.getDataFolder() + "/accounts/" + uuid.toString() + ".yml"); FileConfiguration config = YamlConfiguration.loadConfiguration(file); @@ -151,5 +151,6 @@ public class YamlStorage implements IStorageManager { e.printStackTrace(); } cachedAccounts.remove(uuid); + return CompletableFuture.completedFuture(null); } }