diff --git a/src/main/java/us/mytheria/bloblib/bungee/ProxiedSharedSerializableManager.java b/src/main/java/us/mytheria/bloblib/bungee/ProxiedSharedSerializableManager.java index 66b86cf1..84853c11 100644 --- a/src/main/java/us/mytheria/bloblib/bungee/ProxiedSharedSerializableManager.java +++ b/src/main/java/us/mytheria/bloblib/bungee/ProxiedSharedSerializableManager.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.HashMap; +import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -28,7 +29,7 @@ public class ProxiedSharedSerializableManager> extends Manager implements Listener, PluginMessageListener { - protected final HashMap cache; + protected final Map cache; protected BlobCrudManager crudManager; private final BlobPlugin plugin; private final String tag; diff --git a/src/main/java/us/mytheria/bloblib/entities/BlobSerializableManager.java b/src/main/java/us/mytheria/bloblib/entities/BlobSerializableManager.java index 67f3e32f..f047818b 100644 --- a/src/main/java/us/mytheria/bloblib/entities/BlobSerializableManager.java +++ b/src/main/java/us/mytheria/bloblib/entities/BlobSerializableManager.java @@ -9,6 +9,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import us.mytheria.bloblib.managers.BlobPlugin; @@ -25,8 +27,9 @@ import java.util.function.Function; public class BlobSerializableManager extends Manager implements BlobSerializableHandler { - protected final HashMap serializables; - private final HashSet saving; + protected final Map serializables; + private final Map autoSave; + private final Set saving; protected BlobCrudManager crudManager; private final BlobPlugin plugin; private final Function generator; @@ -56,6 +59,7 @@ protected BlobSerializableManager(ManagerDirector managerDirector, Function(); + autoSave = new HashMap<>(); this.generator = generator; this.joinEvent = joinEvent; this.quitEvent = quitEvent; @@ -91,10 +95,26 @@ public void onJoin(PlayerJoinEvent e) { if (player == null || !player.isOnline()) return; T applied = generator.apply(crudable); + BlobCrudable serialized = applied.serializeAllAttributes(); + Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), + () -> crudManager.update(serialized)); serializables.put(uuid, applied); if (joinEvent == null) return; Bukkit.getPluginManager().callEvent(joinEvent.apply(applied)); + autoSave.put(uuid, new BukkitRunnable() { + @Override + public void run() { + if (player == null || !player.isOnline()) { + cancel(); + return; + } + BlobCrudable serialized = applied.serializeAllAttributes(); + Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), + () -> crudManager.update(serialized)); + } + }.runTaskTimer(getPlugin(), 20 * 60 * 5, + 20 * 60 * 5)); }); }); } @@ -109,6 +129,7 @@ public void onQuit(PlayerQuitEvent e) { if (quitEvent != null) Bukkit.getPluginManager().callEvent(quitEvent.apply(serializable)); saving.add(uuid); + autoSave.remove(uuid); BlobCrudable crudable = serializable.serializeAllAttributes(); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { crudManager.update(crudable); diff --git a/src/main/java/us/mytheria/bloblib/entities/currency/WalletOwnerManager.java b/src/main/java/us/mytheria/bloblib/entities/currency/WalletOwnerManager.java index ddc9289d..436be6a9 100644 --- a/src/main/java/us/mytheria/bloblib/entities/currency/WalletOwnerManager.java +++ b/src/main/java/us/mytheria/bloblib/entities/currency/WalletOwnerManager.java @@ -10,6 +10,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import us.mytheria.bloblib.entities.BlobCrudable; @@ -30,8 +32,9 @@ import java.util.stream.Collectors; public class WalletOwnerManager extends Manager implements BlobSerializableHandler { - protected final HashMap walletOwners; - private final HashSet saving; + protected final Map walletOwners; + private final Map autoSave; + private final Set saving; protected BlobCrudManager crudManager; private final BlobPlugin plugin; private final Function generator; @@ -42,7 +45,7 @@ public class WalletOwnerManager extends Manager implement protected ObjectDirector currencyDirector; @Nullable private EconomyPHExpansion economyPHExpansion; - private HashMap implementations; + private Map implementations; protected WalletOwnerManager(ManagerDirector managerDirector, Function newBorn, Function generator, @@ -67,6 +70,7 @@ protected WalletOwnerManager(ManagerDirector managerDirector, Function(); + autoSave = new HashMap<>(); this.generator = generator; this.joinEvent = joinEvent; this.quitEvent = quitEvent; @@ -109,10 +113,26 @@ public void onJoin(PlayerJoinEvent e) { if (player == null || !player.isOnline()) return; T applied = generator.apply(crudable); + BlobCrudable serialized = applied.serializeAllAttributes(); + Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), + () -> crudManager.update(serialized)); walletOwners.put(uuid, applied); if (joinEvent == null) return; Bukkit.getPluginManager().callEvent(joinEvent.apply(applied)); + autoSave.put(uuid, new BukkitRunnable() { + @Override + public void run() { + if (player == null || !player.isOnline()) { + cancel(); + return; + } + BlobCrudable serialized = applied.serializeAllAttributes(); + Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), + () -> crudManager.update(serialized)); + } + }.runTaskTimer(getPlugin(), 20 * 60 * 5, + 20 * 60 * 5)); }); } @@ -126,6 +146,7 @@ public void onQuit(PlayerQuitEvent e) { if (quitEvent != null) Bukkit.getPluginManager().callEvent(quitEvent.apply(walletOwner)); saving.add(uuid); + autoSave.remove(uuid); BlobCrudable crudable = walletOwner.serializeAllAttributes(); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { crudManager.update(crudable);