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