diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreUnloadEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreUnloadEvent.java
new file mode 100644
index 00000000..e15e3e4e
--- /dev/null
+++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreUnloadEvent.java
@@ -0,0 +1,44 @@
+package com.hibiscusmc.hmccosmetics.api.events;
+
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+
+/**
+ * Called before a player's data is un-loaded from the plugin.
+ *
+ *
+ * If this event is cancelled, the player's data will not be un-loaded,
+ * and will be kept in memory.
+ *
+ */
+public class PlayerPreUnloadEvent extends PlayerEvent implements Cancellable {
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private boolean cancelled = false;
+
+ public PlayerPreUnloadEvent(@NotNull UUID id) {
+ super(id);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ public static @NotNull HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java
index ced6dbde..79a5c2ee 100644
--- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java
+++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java
@@ -3,6 +3,7 @@ package com.hibiscusmc.hmccosmetics.listener;
import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin;
import com.hibiscusmc.hmccosmetics.api.events.PlayerLoadEvent;
import com.hibiscusmc.hmccosmetics.api.events.PlayerPreLoadEvent;
+import com.hibiscusmc.hmccosmetics.api.events.PlayerPreUnloadEvent;
import com.hibiscusmc.hmccosmetics.api.events.PlayerUnloadEvent;
import com.hibiscusmc.hmccosmetics.config.DatabaseSettings;
import com.hibiscusmc.hmccosmetics.database.Database;
@@ -11,6 +12,7 @@ import com.hibiscusmc.hmccosmetics.user.CosmeticUser;
import com.hibiscusmc.hmccosmetics.user.CosmeticUsers;
import com.hibiscusmc.hmccosmetics.util.MessagesUtil;
import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -21,69 +23,59 @@ import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class PlayerConnectionListener implements Listener {
-
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(@NotNull PlayerJoinEvent event) {
- if (event.getPlayer().isOp() || event.getPlayer().hasPermission("hmccosmetics.notifyupdate")) {
- if (!HMCCosmeticsPlugin.getInstance().getLatestVersion().equalsIgnoreCase(HMCCosmeticsPlugin.getInstance().getDescription().getVersion()) && HMCCosmeticsPlugin.getInstance().getLatestVersion().isEmpty())
- MessagesUtil.sendMessageNoKey(
- event.getPlayer(),
- "
" +
- "There is a new version of HMCCosmetics available!
" +
- "Current version: " + HMCCosmeticsPlugin.getInstance().getDescription().getVersion() + " | Latest version: " + HMCCosmeticsPlugin.getInstance().getLatestVersion() + "
" +
- "Download it on Spigot or Polymart!" +
- "
"
- );
- }
-
- // This literally makes me want to end it all but I can't do that so I'll just cry instead
- Runnable run = () -> {
- if (!event.getPlayer().isOnline()) return; // If a player is no longer online, don't run this.
- UUID uuid = event.getPlayer().getUniqueId();
-
- PlayerPreLoadEvent preLoadEvent = new PlayerPreLoadEvent(uuid);
- Bukkit.getPluginManager().callEvent(preLoadEvent);
- if (preLoadEvent.isCancelled()) return;
-
- Database.get(uuid).thenAccept(userData -> {
- if (userData == null) {
- return;
- }
-
- Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> {
- CosmeticUser cosmeticUser = CosmeticUsers.getProvider()
- .createCosmeticUser(uuid)
- .initialize(userData);
- cosmeticUser.startTicking();
-
- CosmeticUsers.addUser(cosmeticUser);
- MessagesUtil.sendDebugMessages("Run User Join for " + uuid);
-
- PlayerLoadEvent playerLoadEvent = new PlayerLoadEvent(cosmeticUser);
- Bukkit.getPluginManager().callEvent(playerLoadEvent);
-
- // And finally, launch an update for the cosmetics they have.
- Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> {
- if (cosmeticUser.getPlayer() == null) return;
- cosmeticUser.updateCosmetic();
- }, 4);
- });
- }).exceptionally(ex -> {
- MessagesUtil.sendDebugMessages("Unable to load Cosmetic User " + uuid + ". Exception: " + ex.getMessage());
- return null;
- });
- };
-
if (DatabaseSettings.isEnabledDelay()) {
MessagesUtil.sendDebugMessages("Delay Enabled with " + DatabaseSettings.getDelayLength() + " ticks");
- Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), run, DatabaseSettings.getDelayLength());
+ Bukkit.getScheduler().runTaskLater(
+ HMCCosmeticsPlugin.getInstance(),
+ () -> this.loadUserData(event.getPlayer()),
+ DatabaseSettings.getDelayLength()
+ );
} else {
- run.run();
+ this.loadUserData(event.getPlayer());
}
}
+ private void loadUserData(final Player player) {
+ if(!player.isOnline()) return;
+ final UUID playerId = player.getUniqueId();
+
+ PlayerPreLoadEvent preLoadEvent = new PlayerPreLoadEvent(playerId);
+ Bukkit.getPluginManager().callEvent(preLoadEvent);
+ if (preLoadEvent.isCancelled()) return;
+
+ Database.get(playerId).thenAccept(userData -> {
+ Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> {
+ CosmeticUser cosmeticUser = CosmeticUsers.getProvider()
+ .createCosmeticUser(playerId)
+ .initialize(userData);
+ cosmeticUser.startTicking();
+
+ CosmeticUsers.addUser(cosmeticUser);
+ MessagesUtil.sendDebugMessages("Run User Join for " + playerId);
+
+ PlayerLoadEvent playerLoadEvent = new PlayerLoadEvent(cosmeticUser);
+ Bukkit.getPluginManager().callEvent(playerLoadEvent);
+
+ // And finally, launch an update for the cosmetics they have.
+ Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> {
+ if (cosmeticUser.getPlayer() == null) return;
+ cosmeticUser.updateCosmetic();
+ }, 4);
+ });
+ }).exceptionally(ex -> {
+ MessagesUtil.sendDebugMessages("Unable to load Cosmetic User " + playerId + ". Exception: " + ex.getMessage());
+ return null;
+ });
+ }
+
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(@NotNull PlayerQuitEvent event) {
+ PlayerPreUnloadEvent preUnloadEvent = new PlayerPreUnloadEvent(event.getPlayer().getUniqueId());
+ Bukkit.getPluginManager().callEvent(preUnloadEvent);
+ if (preUnloadEvent.isCancelled()) return;
+
CosmeticUser user = CosmeticUsers.getUser(event.getPlayer());
if (user == null) return; // Player never initialized, don't do anything
@@ -99,4 +91,19 @@ public class PlayerConnectionListener implements Listener {
user.destroy();
CosmeticUsers.removeUser(user.getUniqueId());
}
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void notifyAdminUpdate(final PlayerJoinEvent event) {
+ if (event.getPlayer().isOp() || event.getPlayer().hasPermission("hmccosmetics.notifyupdate")) {
+ if (!HMCCosmeticsPlugin.getInstance().getLatestVersion().equalsIgnoreCase(HMCCosmeticsPlugin.getInstance().getDescription().getVersion()) && HMCCosmeticsPlugin.getInstance().getLatestVersion().isEmpty())
+ MessagesUtil.sendMessageNoKey(
+ event.getPlayer(),
+ "
" +
+ "There is a new version of HMCCosmetics available!
" +
+ "Current version: " + HMCCosmeticsPlugin.getInstance().getDescription().getVersion() + " | Latest version: " + HMCCosmeticsPlugin.getInstance().getLatestVersion() + "
" +
+ "Download it on Spigot or Polymart!" +
+ "
"
+ );
+ }
+ }
}
\ No newline at end of file