diff --git a/src/main/java/net/momirealms/customfishing/api/event/FishingFailure.java b/src/main/java/net/momirealms/customfishing/api/event/FishingFailure.java new file mode 100644 index 00000000..e9d03fba --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/api/event/FishingFailure.java @@ -0,0 +1,25 @@ +package net.momirealms.customfishing.api.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class FishingFailure extends Event { + + private static final HandlerList handlers = new HandlerList(); + private Player player; + + public FishingFailure(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/net/momirealms/customfishing/api/event/FishingSuccess.java b/src/main/java/net/momirealms/customfishing/api/event/FishingSuccess.java new file mode 100644 index 00000000..42cc78dd --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/api/event/FishingSuccess.java @@ -0,0 +1,59 @@ +package net.momirealms.customfishing.api.event; + +import net.momirealms.customfishing.object.loot.Loot; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class FishingSuccess extends Event implements Cancellable { + private boolean cancelled; + private Player player; + private Loot loot; + + private static final HandlerList handlers = new HandlerList(); + + private boolean loseDurability; + + public FishingSuccess(Player player, Loot loot, Boolean loseDurability) { + this.player = player; + this.loot = loot; + this.loseDurability = loseDurability; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } + + public Player getPlayer() { + return player; + } + + public Loot getLoot() { + return loot; + } + + public void setLoot(Loot loot) { + this.loot = loot; + } + + public boolean isLoseDurability() { + return loseDurability; + } + + public void setLoseDurability(boolean loseDurability) { + this.loseDurability = loseDurability; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/net/momirealms/customfishing/listener/FishListener.java b/src/main/java/net/momirealms/customfishing/listener/FishListener.java index 154084e2..8933553a 100644 --- a/src/main/java/net/momirealms/customfishing/listener/FishListener.java +++ b/src/main/java/net/momirealms/customfishing/listener/FishListener.java @@ -22,6 +22,8 @@ import de.tr7zw.changeme.nbtapi.NBTItem; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.momirealms.customfishing.api.event.FishingFailure; +import net.momirealms.customfishing.api.event.FishingSuccess; import net.momirealms.customfishing.competition.CompetitionSchedule; import net.momirealms.customfishing.competition.bossbar.BossBarManager; import net.momirealms.customfishing.hook.*; @@ -480,26 +482,34 @@ public class FishListener implements Listener { } if (Math.random() < layout.getSuccessRate()[last]){ - if (ConfigReader.Config.loseDurability) - loseDurability(player); - Location location = event.getHook().getLocation(); - if (loot instanceof Mob mob){ - summonMob(player, loot, location, mob); - } - else if (loot instanceof DroppedItem droppedItem){ - if (vanillaLoot != null) { - dropVanillaLoot(player, vanillaLoot, location); + + FishingSuccess successEvent = new FishingSuccess(player, loot, ConfigReader.Config.loseDurability); + Bukkit.getServer().getPluginManager().callEvent(successEvent); + if(!successEvent.isCancelled()) { + if (successEvent.isLoseDurability()) + loseDurability(player); + Location location = event.getHook().getLocation(); + if (loot instanceof Mob mob){ + summonMob(player, loot, location, mob); } - else if (ConfigReader.Config.mcMMOLoot && Math.random() < ConfigReader.Config.mcMMOLootChance){ - if(dropMcMMOLoot(player, location)){ + else if (loot instanceof DroppedItem droppedItem){ + if (vanillaLoot != null) { + dropVanillaLoot(player, vanillaLoot, location); + } + else if (ConfigReader.Config.mcMMOLoot && Math.random() < ConfigReader.Config.mcMMOLootChance){ + if(dropMcMMOLoot(player, location)){ + dropMyLoot(player, loot, location, droppedItem); + } + } + else { dropMyLoot(player, loot, location, droppedItem); } + }else if (loot == null && vanillaLoot != null){ + dropVanillaLoot(player, vanillaLoot, location); } - else { - dropMyLoot(player, loot, location, droppedItem); - } - }else if (loot == null && vanillaLoot != null){ - dropVanillaLoot(player, vanillaLoot, location); + } + else { + fail(player, loot, vanillaLoot != null); } } else { @@ -920,6 +930,8 @@ public class FishListener implements Listener { } private void fail(Player player, Loot loot, boolean isVanilla) { + //钓鱼失败不具有可取消性质 + Bukkit.getServer().getPluginManager().callEvent(new FishingFailure(player)); fishingPlayers.remove(player); if (!isVanilla && loot != null){ for (ActionB action : loot.getFailureActions())