diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java index e78da98..3d26038 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java @@ -165,16 +165,18 @@ public void onEnable() { Bukkit.getPluginCommand("balancetop").setExecutor(new CommandBalanceTop(plugin)); Bukkit.getPluginCommand("fakequit").setExecutor(new CommandFakeQuit(plugin)); //Timer - //This async task is here to prevent lags from occuring when data is being saved, - //and to ensure TPS doesn't affect the timing of saving. + //This async task is so TPS doesn't affect the timing of saving. This probably actually isn't needed TBH. Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, () -> { - int autoSavePeriod = getFundamentalConfig().getConfigInteger("settings.auto-save-time"); - if (lastAutoSaveTime + autoSavePeriod < getUnix()) { - lastAutoSaveTime = getUnix(); - debugLogger(Level.INFO, "Automatically saving data.", 2); - saveData(); - } - getPlayerMap().runTimerTasks(); + //Change back to main thread for all logic. + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + int autoSavePeriod = FundamentalsConfig.getInstance(plugin).getConfigInteger("settings.auto-save-time"); + if (lastAutoSaveTime + autoSavePeriod < getUnix()) { + lastAutoSaveTime = getUnix(); + debugLogger(Level.INFO, "Automatically saving data.", 2); + saveData(); + } + FundamentalsPlayerMap.getInstance(plugin).runTimerTasks(); + }); }, 20, 20 * 10); long endTimeUnix = System.currentTimeMillis() / 1000L; @@ -295,10 +297,9 @@ public UUID getPlayerUUID(String playerName) { } public void saveData() { - getPlayerMap().saveData(); - economyCache.saveData(); -// uuidCache.saveData(); - playerCache.saveData(); + FundamentalsPlayerMap.getInstance().saveData(); // Save player data files that have been modified. + + // Save Fundamentals Banks FundamentalsBank[] banks = new FundamentalsBank[this.banks.size()]; int i = 0; for (String bankName : this.banks.keySet()) { @@ -322,6 +323,10 @@ public void onDisable() { //Save Player Data saveData(); + + // Save caches + playerCache.saveData(); + economyCache.saveData(); } public void logger(Level level, String message) { diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/FundamentalsPlayerMap.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/FundamentalsPlayerMap.java index dc0b4d4..5416e5a 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/FundamentalsPlayerMap.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/FundamentalsPlayerMap.java @@ -7,15 +7,15 @@ import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.regex.Pattern; public class FundamentalsPlayerMap { private static FundamentalsPlayerMap singleton; private Fundamentals plugin; - private ConcurrentHashMap playerMap = new ConcurrentHashMap<>(); + private HashMap playerMap = new HashMap(); private ArrayList knownPlayers = new ArrayList(); private boolean cacheAllPlayers = false; private int playersLoaded = 0; @@ -98,7 +98,7 @@ public void removePlayerFromMap(UUID uuid) { public void runTimerTasks() { - long currentUnix = System.currentTimeMillis() / 1000L; + Long currentUnix = System.currentTimeMillis() / 1000L; playerMap.keySet().removeIf(key -> { FundamentalsPlayer player = playerMap.get(key); if (!player.isPlayerOnline()) {