From a7ce1319176fe4ca3ed86a643a6975dfb8e6e4fb Mon Sep 17 00:00:00 2001 From: Ian Tapply Date: Fri, 7 Jun 2024 17:13:28 -0400 Subject: [PATCH] Create Custom Balloon Events (#19) --- .../jeqo/bloons/balloon/SingleBalloon.java | 24 +++++++++++---- .../jeqo/bloons/commands/CommandEquip.java | 9 ++++-- .../bloons/commands/CommandForceEquip.java | 6 ++++ .../bloons/commands/CommandForceUnequip.java | 13 ++++++-- .../jeqo/bloons/commands/CommandReload.java | 8 +++-- .../jeqo/bloons/commands/CommandUnequip.java | 6 ++++ .../balloon/SingleBalloonEquipEvent.java | 17 +++++++++++ .../balloon/SingleBalloonForceEquipEvent.java | 17 +++++++++++ .../SingleBalloonForceUnequipEvent.java | 18 +++++++++++ .../balloon/SingleBalloonStoreEvent.java | 18 +++++++++++ .../balloon/SingleBalloonUnequipEvent.java | 18 +++++++++++ .../general/BloonsConfigReloadEvent.java | 6 ++++ .../bloons/listeners/MenuClickListener.java | 1 + .../jeqo/bloons/listeners/PlayerListener.java | 30 +++++++++++++++++++ .../jeqo/bloons/utils/BalloonManagement.java | 25 +++++++++++++--- 15 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonEquipEvent.java create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceEquipEvent.java create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceUnequipEvent.java create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonStoreEvent.java create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonUnequipEvent.java create mode 100644 src/main/java/net/jeqo/bloons/events/balloon/general/BloonsConfigReloadEvent.java diff --git a/src/main/java/net/jeqo/bloons/balloon/SingleBalloon.java b/src/main/java/net/jeqo/bloons/balloon/SingleBalloon.java index bbcc399e..0e577abf 100644 --- a/src/main/java/net/jeqo/bloons/balloon/SingleBalloon.java +++ b/src/main/java/net/jeqo/bloons/balloon/SingleBalloon.java @@ -4,6 +4,9 @@ import lombok.Setter; import net.jeqo.bloons.Bloons; import net.jeqo.bloons.configuration.BalloonConfiguration; +import net.jeqo.bloons.events.balloon.SingleBalloonEquipEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonForceUnequipEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonUnequipEvent; import net.jeqo.bloons.logger.Logger; import net.jeqo.bloons.utils.BalloonManagement; import net.jeqo.bloons.utils.ColorManagement; @@ -205,13 +208,24 @@ public void initializeBalloonChicken() { public static void checkBalloonRemovalOrAdd(final Player player, final String balloonID) { new BukkitRunnable() { public void run() { - SingleBalloon owner = Bloons.playerBalloons.get(player.getUniqueId()); - if (owner != null) return; + SingleBalloon initialBalloon = Bloons.playerBalloons.get(player.getUniqueId()); + if (initialBalloon != null) return; + + SingleBalloonForceUnequipEvent unequipEvent = new SingleBalloonForceUnequipEvent(player, null); + unequipEvent.callEvent(); + + if (unequipEvent.isCancelled()) return; BalloonManagement.removeBalloon(player, null); - SingleBalloon balloonOwner = new SingleBalloon(player, balloonID); - balloonOwner.runTaskTimer(Bloons.getInstance(), 0L, 1L); - Bloons.playerBalloons.put(player.getUniqueId(), balloonOwner); + + SingleBalloonEquipEvent equipEvent = new SingleBalloonEquipEvent(player, balloonID); + equipEvent.callEvent(); + + if (equipEvent.isCancelled()) return; + + SingleBalloon balloon = new SingleBalloon(player, balloonID); + balloon.runTaskTimer(Bloons.getInstance(), 0L, 1L); + Bloons.playerBalloons.put(player.getUniqueId(), balloon); Bloons.playerBalloonID.put(player.getUniqueId(), balloonID); } diff --git a/src/main/java/net/jeqo/bloons/commands/CommandEquip.java b/src/main/java/net/jeqo/bloons/commands/CommandEquip.java index fcbc3954..0f645df7 100644 --- a/src/main/java/net/jeqo/bloons/commands/CommandEquip.java +++ b/src/main/java/net/jeqo/bloons/commands/CommandEquip.java @@ -4,11 +4,10 @@ import net.jeqo.bloons.balloon.SingleBalloon; import net.jeqo.bloons.commands.manager.Command; import net.jeqo.bloons.commands.manager.enums.CommandPermission; +import net.jeqo.bloons.events.balloon.SingleBalloonEquipEvent; import net.jeqo.bloons.utils.BalloonManagement; import net.jeqo.bloons.utils.MessageTranslations; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -49,6 +48,12 @@ public boolean execute(CommandSender sender, String[] args) { return false; } + // Call the equip event and check if it's cancelled, if it is, don't spawn the balloon or do anything + SingleBalloonEquipEvent singleBalloonEquipEvent = new SingleBalloonEquipEvent(player, balloonID); + singleBalloonEquipEvent.callEvent(); + + if (singleBalloonEquipEvent.isCancelled()) return false; + BalloonManagement.removeBalloon(player, Bloons.playerBalloons.get(player.getUniqueId())); SingleBalloon.checkBalloonRemovalOrAdd(player, balloonID); player.playSound(player.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); diff --git a/src/main/java/net/jeqo/bloons/commands/CommandForceEquip.java b/src/main/java/net/jeqo/bloons/commands/CommandForceEquip.java index d83ecbd9..680a3c7f 100644 --- a/src/main/java/net/jeqo/bloons/commands/CommandForceEquip.java +++ b/src/main/java/net/jeqo/bloons/commands/CommandForceEquip.java @@ -3,6 +3,7 @@ import net.jeqo.bloons.balloon.SingleBalloon; import net.jeqo.bloons.commands.manager.Command; import net.jeqo.bloons.commands.manager.enums.CommandPermission; +import net.jeqo.bloons.events.balloon.SingleBalloonForceEquipEvent; import net.jeqo.bloons.utils.MessageTranslations; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -44,6 +45,11 @@ public boolean execute(CommandSender sender, String[] args) { return false; } + SingleBalloonForceEquipEvent singleBalloonForceEquipEvent = new SingleBalloonForceEquipEvent(player, balloonID); + singleBalloonForceEquipEvent.callEvent(); + + if (singleBalloonForceEquipEvent.isCancelled()) return false; + SingleBalloon.checkBalloonRemovalOrAdd(player.getPlayer(), balloonID); String balloonName = messageTranslations.getString("balloons." + balloonID + ".name"); Component equippedMessage = messageTranslations.getSerializedString(messageTranslations.getMessage("prefix"), messageTranslations.getMessage("equipped", balloonName)); diff --git a/src/main/java/net/jeqo/bloons/commands/CommandForceUnequip.java b/src/main/java/net/jeqo/bloons/commands/CommandForceUnequip.java index 4075562a..aef4069d 100644 --- a/src/main/java/net/jeqo/bloons/commands/CommandForceUnequip.java +++ b/src/main/java/net/jeqo/bloons/commands/CommandForceUnequip.java @@ -4,6 +4,7 @@ import net.jeqo.bloons.balloon.SingleBalloon; import net.jeqo.bloons.commands.manager.Command; import net.jeqo.bloons.commands.manager.enums.CommandPermission; +import net.jeqo.bloons.events.balloon.SingleBalloonForceUnequipEvent; import net.jeqo.bloons.utils.BalloonManagement; import net.jeqo.bloons.utils.MessageTranslations; import net.kyori.adventure.text.Component; @@ -33,14 +34,20 @@ public boolean execute(CommandSender sender, String[] args) { return false; } - SingleBalloon owner = Bloons.playerBalloons.get(player.getUniqueId()); - if (owner == null) { + SingleBalloon balloon = Bloons.playerBalloons.get(player.getUniqueId()); + if (balloon == null) { player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_DIDGERIDOO, 1, 1); Component notEquippedMessage = messageTranslations.getSerializedString(messageTranslations.getMessage("prefix"), messageTranslations.getMessage("not-equipped")); sender.sendMessage(notEquippedMessage); return false; } - BalloonManagement.removeBalloon(player, owner); + + SingleBalloonForceUnequipEvent singleBalloonForceEquipEvent = new SingleBalloonForceUnequipEvent(player, balloon); + singleBalloonForceEquipEvent.callEvent(); + + if (singleBalloonForceEquipEvent.isCancelled()) return false; + + BalloonManagement.removeBalloon(player, balloon); Component unequipSuccessfulMessage = messageTranslations.getSerializedString(messageTranslations.getMessage("prefix"), messageTranslations.getMessage("unequipped")); sender.sendMessage(unequipSuccessfulMessage); return false; diff --git a/src/main/java/net/jeqo/bloons/commands/CommandReload.java b/src/main/java/net/jeqo/bloons/commands/CommandReload.java index 23b5bfbe..bbcc1597 100644 --- a/src/main/java/net/jeqo/bloons/commands/CommandReload.java +++ b/src/main/java/net/jeqo/bloons/commands/CommandReload.java @@ -3,10 +3,9 @@ import net.jeqo.bloons.Bloons; import net.jeqo.bloons.commands.manager.Command; import net.jeqo.bloons.commands.manager.enums.CommandPermission; +import net.jeqo.bloons.events.balloon.general.BloonsConfigReloadEvent; import net.jeqo.bloons.utils.MessageTranslations; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; @@ -25,6 +24,11 @@ public CommandReload(JavaPlugin plugin) { public boolean execute(CommandSender sender, String[] args) { MessageTranslations messageTranslations = new MessageTranslations(this.plugin); + BloonsConfigReloadEvent bloonsConfigReloadEvent = new BloonsConfigReloadEvent(); + bloonsConfigReloadEvent.callEvent(); + + if (bloonsConfigReloadEvent.isCancelled()) return false; + Bloons.getInstance().reloadConfig(); Component configReloadedMessage = messageTranslations.getSerializedString(messageTranslations.getMessage("prefix"), messageTranslations.getMessage("config-reloaded")); sender.sendMessage(configReloadedMessage); diff --git a/src/main/java/net/jeqo/bloons/commands/CommandUnequip.java b/src/main/java/net/jeqo/bloons/commands/CommandUnequip.java index df8929fc..88647ecc 100644 --- a/src/main/java/net/jeqo/bloons/commands/CommandUnequip.java +++ b/src/main/java/net/jeqo/bloons/commands/CommandUnequip.java @@ -4,6 +4,7 @@ import net.jeqo.bloons.balloon.SingleBalloon; import net.jeqo.bloons.commands.manager.Command; import net.jeqo.bloons.commands.manager.enums.CommandPermission; +import net.jeqo.bloons.events.balloon.SingleBalloonUnequipEvent; import net.jeqo.bloons.utils.BalloonManagement; import net.jeqo.bloons.utils.MessageTranslations; import net.kyori.adventure.text.Component; @@ -36,6 +37,11 @@ public boolean execute(CommandSender sender, String[] args) { return false; } + SingleBalloonUnequipEvent singleBalloonUnequipEvent = new SingleBalloonUnequipEvent(player, singleBalloon); + singleBalloonUnequipEvent.callEvent(); + + if (singleBalloonUnequipEvent.isCancelled()) return false; + BalloonManagement.removeBalloon(player, singleBalloon); Component unequipSuccessfulMessage = messageTranslations.getSerializedString(messageTranslations.getMessage("prefix"), messageTranslations.getMessage("unequipped")); player.sendMessage(unequipSuccessfulMessage); diff --git a/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonEquipEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonEquipEvent.java new file mode 100644 index 00000000..bb292c1a --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonEquipEvent.java @@ -0,0 +1,17 @@ +package net.jeqo.bloons.events.balloon; + +import lombok.Getter; +import lombok.Setter; +import net.jeqo.bloons.events.BloonsEvent; +import org.bukkit.entity.Player; + +@Getter @Setter +public class SingleBalloonEquipEvent extends BloonsEvent { + private Player player; + private String balloonID; + + public SingleBalloonEquipEvent(Player player, String balloonID) { + this.player = player; + this.balloonID = balloonID; + } +} diff --git a/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceEquipEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceEquipEvent.java new file mode 100644 index 00000000..2206d2ff --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceEquipEvent.java @@ -0,0 +1,17 @@ +package net.jeqo.bloons.events.balloon; + +import lombok.Getter; +import lombok.Setter; +import net.jeqo.bloons.events.BloonsEvent; +import org.bukkit.entity.Player; + +@Getter @Setter +public class SingleBalloonForceEquipEvent extends BloonsEvent { + private Player player; + private String balloonID; + + public SingleBalloonForceEquipEvent(Player player, String balloonID) { + this.player = player; + this.balloonID = balloonID; + } +} diff --git a/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceUnequipEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceUnequipEvent.java new file mode 100644 index 00000000..877b21fd --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonForceUnequipEvent.java @@ -0,0 +1,18 @@ +package net.jeqo.bloons.events.balloon; + +import lombok.Getter; +import lombok.Setter; +import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.BloonsEvent; +import org.bukkit.entity.Player; + +@Getter @Setter +public class SingleBalloonForceUnequipEvent extends BloonsEvent { + private Player player; + private SingleBalloon balloon; + + public SingleBalloonForceUnequipEvent(Player player, SingleBalloon balloon) { + this.player = player; + this.balloon = balloon; + } +} diff --git a/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonStoreEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonStoreEvent.java new file mode 100644 index 00000000..42963c82 --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonStoreEvent.java @@ -0,0 +1,18 @@ +package net.jeqo.bloons.events.balloon; + +import lombok.Getter; +import lombok.Setter; +import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.BloonsEvent; +import org.bukkit.entity.Player; + +@Getter @Setter +public class SingleBalloonStoreEvent extends BloonsEvent { + private Player player; + private SingleBalloon balloon; + + public SingleBalloonStoreEvent(Player player, SingleBalloon balloon) { + this.player = player; + this.balloon = balloon; + } +} diff --git a/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonUnequipEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonUnequipEvent.java new file mode 100644 index 00000000..ec09717d --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/SingleBalloonUnequipEvent.java @@ -0,0 +1,18 @@ +package net.jeqo.bloons.events.balloon; + +import lombok.Getter; +import lombok.Setter; +import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.BloonsEvent; +import org.bukkit.entity.Player; + +@Getter @Setter +public class SingleBalloonUnequipEvent extends BloonsEvent { + private Player player; + private SingleBalloon balloon; + + public SingleBalloonUnequipEvent(Player player, SingleBalloon balloon) { + this.player = player; + this.balloon = balloon; + } +} diff --git a/src/main/java/net/jeqo/bloons/events/balloon/general/BloonsConfigReloadEvent.java b/src/main/java/net/jeqo/bloons/events/balloon/general/BloonsConfigReloadEvent.java new file mode 100644 index 00000000..d795d74e --- /dev/null +++ b/src/main/java/net/jeqo/bloons/events/balloon/general/BloonsConfigReloadEvent.java @@ -0,0 +1,6 @@ +package net.jeqo.bloons.events.balloon.general; + +import net.jeqo.bloons.events.BloonsEvent; + +public class BloonsConfigReloadEvent extends BloonsEvent { +} diff --git a/src/main/java/net/jeqo/bloons/listeners/MenuClickListener.java b/src/main/java/net/jeqo/bloons/listeners/MenuClickListener.java index 2246da63..ba60cbcd 100644 --- a/src/main/java/net/jeqo/bloons/listeners/MenuClickListener.java +++ b/src/main/java/net/jeqo/bloons/listeners/MenuClickListener.java @@ -2,6 +2,7 @@ import net.jeqo.bloons.Bloons; import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.balloon.SingleBalloonUnequipEvent; import net.jeqo.bloons.gui.menus.BalloonMenu; import net.jeqo.bloons.utils.BalloonManagement; import net.jeqo.bloons.utils.ColorCodeConverter; diff --git a/src/main/java/net/jeqo/bloons/listeners/PlayerListener.java b/src/main/java/net/jeqo/bloons/listeners/PlayerListener.java index d2fab73c..0633e2f1 100644 --- a/src/main/java/net/jeqo/bloons/listeners/PlayerListener.java +++ b/src/main/java/net/jeqo/bloons/listeners/PlayerListener.java @@ -2,6 +2,10 @@ import net.jeqo.bloons.Bloons; import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.balloon.SingleBalloonEquipEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonForceUnequipEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonStoreEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonUnequipEvent; import net.jeqo.bloons.utils.UpdateChecker; import net.jeqo.bloons.logger.Logger; import net.jeqo.bloons.utils.BalloonManagement; @@ -24,6 +28,10 @@ public class PlayerListener implements Listener { @EventHandler public void onQuit(PlayerQuitEvent e) { SingleBalloon owner = Bloons.playerBalloons.get(e.getPlayer().getUniqueId()); + + SingleBalloonStoreEvent event = new SingleBalloonStoreEvent(e.getPlayer(), owner); + event.callEvent(); + BalloonManagement.storeBalloon(owner); } @@ -37,7 +45,13 @@ public void onJoin(PlayerJoinEvent event) { // If they have a balloon active, remove it and add it back to reduce issues if (balloonID != null) { + SingleBalloonForceUnequipEvent unequipEvent = new SingleBalloonForceUnequipEvent(player, Bloons.playerBalloons.get(player.getUniqueId())); + unequipEvent.callEvent(); + + if (!unequipEvent.isCancelled()) return; + BalloonManagement.removeBalloon(event.getPlayer(), Bloons.playerBalloons.get(event.getPlayer().getUniqueId())); + SingleBalloon.checkBalloonRemovalOrAdd(event.getPlayer(), balloonID); } @@ -57,6 +71,10 @@ public void onJoin(PlayerJoinEvent event) { @EventHandler public void onDeath(PlayerDeathEvent event) { SingleBalloon balloonOwner = Bloons.playerBalloons.get(Objects.requireNonNull(event.getEntity().getPlayer()).getUniqueId()); + + SingleBalloonForceUnequipEvent unequipEvent = new SingleBalloonForceUnequipEvent(event.getEntity().getPlayer(), balloonOwner); + unequipEvent.callEvent(); + BalloonManagement.removeBalloon(event.getEntity().getPlayer(), balloonOwner); } @@ -79,10 +97,22 @@ public void onRespawn(PlayerRespawnEvent event) { public void onWorldChange(PlayerChangedWorldEvent event) { SingleBalloon balloonOwner = Bloons.playerBalloons.get(event.getPlayer().getUniqueId()); String balloonID = Bloons.playerBalloonID.get(event.getPlayer().getUniqueId()); + + SingleBalloonStoreEvent storeEvent = new SingleBalloonStoreEvent(event.getPlayer(), balloonOwner); + storeEvent.callEvent(); + + if (storeEvent.isCancelled()) return; + BalloonManagement.storeBalloon(balloonOwner); if (balloonID != null) { + SingleBalloonForceUnequipEvent unequipEvent = new SingleBalloonForceUnequipEvent(event.getPlayer(), Bloons.playerBalloons.get(event.getPlayer().getUniqueId())); + unequipEvent.callEvent(); + + if (unequipEvent.isCancelled()) return; + BalloonManagement.removeBalloon(event.getPlayer(), Bloons.playerBalloons.get(event.getPlayer().getUniqueId())); + SingleBalloon.checkBalloonRemovalOrAdd(event.getPlayer(), balloonID); } } diff --git a/src/main/java/net/jeqo/bloons/utils/BalloonManagement.java b/src/main/java/net/jeqo/bloons/utils/BalloonManagement.java index dee534de..72fc0c49 100644 --- a/src/main/java/net/jeqo/bloons/utils/BalloonManagement.java +++ b/src/main/java/net/jeqo/bloons/utils/BalloonManagement.java @@ -2,6 +2,8 @@ import net.jeqo.bloons.Bloons; import net.jeqo.bloons.balloon.SingleBalloon; +import net.jeqo.bloons.events.balloon.SingleBalloonStoreEvent; +import net.jeqo.bloons.events.balloon.SingleBalloonUnequipEvent; import org.bukkit.entity.Player; public class BalloonManagement { @@ -13,6 +15,11 @@ public class BalloonManagement { */ public static void removeBalloon(Player player, SingleBalloon owner) { if (owner != null) { + SingleBalloonUnequipEvent event = new SingleBalloonUnequipEvent(player, owner); + event.callEvent(); + + if (event.isCancelled()) return; + owner.spawnRemoveParticle(); owner.cancel(); Bloons.playerBalloons.remove(player.getUniqueId()); @@ -27,6 +34,11 @@ public static void removeBalloon(Player player, SingleBalloon owner) { */ public static void quickRemoveBalloon(Player player, SingleBalloon owner) { if (owner != null) { + SingleBalloonUnequipEvent event = new SingleBalloonUnequipEvent(player, owner); + event.callEvent(); + + if (event.isCancelled()) return; + owner.cancel(); Bloons.playerBalloons.remove(player.getUniqueId()); Bloons.playerBalloonID.remove(player.getUniqueId()); @@ -35,11 +47,16 @@ public static void quickRemoveBalloon(Player player, SingleBalloon owner) { /** * Store the balloon in storage and just cancel the runnable - * @param owner The balloon + * @param balloon The balloon */ - public static void storeBalloon(SingleBalloon owner) { - if (owner != null) { - owner.cancel(); + public static void storeBalloon(SingleBalloon balloon) { + if (balloon != null) { + SingleBalloonStoreEvent event = new SingleBalloonStoreEvent(balloon.getPlayer(), balloon); + event.callEvent(); + + if (event.isCancelled()) return; + + balloon.cancel(); } } }