diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerCosmeticEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerCosmeticEvent.java index f4db7e58..e8dea6f4 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerCosmeticEvent.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerCosmeticEvent.java @@ -7,10 +7,11 @@ import org.jetbrains.annotations.NotNull; /** * Represents a cosmetic user related event */ -public abstract class PlayerCosmeticEvent extends Event { +public abstract class PlayerCosmeticEvent extends PlayerEvent { protected CosmeticUser user; public PlayerCosmeticEvent(@NotNull final CosmeticUser who) { + super(who.getUniqueId()); user = who; } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerEvent.java new file mode 100644 index 00000000..311486b0 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerEvent.java @@ -0,0 +1,24 @@ +package com.hibiscusmc.hmccosmetics.api.events; + +import org.bukkit.event.Event; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public abstract class PlayerEvent extends Event { + + protected UUID player; + + public PlayerEvent(@NotNull final UUID uuid) { + this.player = uuid; + } + + /** + * Returns the UUID of the player involved in this event + * @return User who is involved in this event + */ + @NotNull + public final UUID getUniqueId() { + return player; + } +} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerLoadEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerLoadEvent.java new file mode 100644 index 00000000..3c3e51a0 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerLoadEvent.java @@ -0,0 +1,25 @@ +package com.hibiscusmc.hmccosmetics.api.events; + +import com.hibiscusmc.hmccosmetics.user.CosmeticUser; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class PlayerLoadEvent extends PlayerCosmeticEvent { + + private static final HandlerList handlers = new HandlerList(); + + public PlayerLoadEvent(@NotNull CosmeticUser who) { + super(who); + } + + @Override + @NotNull + public HandlerList getHandlers() { + return handlers; + } + + @NotNull + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreLoadEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreLoadEvent.java new file mode 100644 index 00000000..929ace76 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerPreLoadEvent.java @@ -0,0 +1,43 @@ +package com.hibiscusmc.hmccosmetics.api.events; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Called before a player is loaded into the plugin (including before the plugin gets their data). + * This event is cancellable, and if cancelled, the player will not be loaded into the plugin. + */ +public class PlayerPreLoadEvent extends PlayerEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled = false; + + public PlayerPreLoadEvent(@NotNull UUID id) { + super(id); + } + + @Override + @NotNull + public HandlerList getHandlers() { + return handlers; + } + + @NotNull + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerUnloadEvent.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerUnloadEvent.java new file mode 100644 index 00000000..17b25792 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/events/PlayerUnloadEvent.java @@ -0,0 +1,26 @@ +package com.hibiscusmc.hmccosmetics.api.events; + +import com.hibiscusmc.hmccosmetics.user.CosmeticUser; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class PlayerUnloadEvent extends PlayerCosmeticEvent { + + private static final HandlerList handlers = new HandlerList(); + + public PlayerUnloadEvent(@NotNull CosmeticUser who) { + super(who); + } + + @Override + @NotNull + public HandlerList getHandlers() { + return handlers; + } + + @NotNull + public static HandlerList getHandlerList() { + return handlers; + } + +} 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 ff5b4051..c0288c8c 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java @@ -1,6 +1,9 @@ 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.PlayerUnloadEvent; import com.hibiscusmc.hmccosmetics.config.DatabaseSettings; import com.hibiscusmc.hmccosmetics.config.Settings; import com.hibiscusmc.hmccosmetics.database.Database; @@ -40,6 +43,11 @@ public class PlayerConnectionListener implements Listener { 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(data -> { if (data == null) return; Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> { @@ -47,6 +55,9 @@ public class PlayerConnectionListener implements Listener { 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; @@ -68,6 +79,10 @@ public class PlayerConnectionListener implements Listener { public void onPlayerQuit(@NotNull PlayerQuitEvent event) { CosmeticUser user = CosmeticUsers.getUser(event.getPlayer()); if (user == null) return; // Player never initialized, don't do anything + + PlayerUnloadEvent playerUnloadEvent = new PlayerUnloadEvent(user); + Bukkit.getPluginManager().callEvent(playerUnloadEvent); + if (user.isInWardrobe()) { user.leaveWardrobe(true); user.getPlayer().setInvisible(false);