add listener events

This commit is contained in:
alexcrea 2025-07-06 02:50:36 +02:00
parent 6930867e74
commit 12d37e1f59
Signed by: alexcrea
GPG key ID: E346CD16413450E3
7 changed files with 249 additions and 30 deletions

View file

@ -0,0 +1,45 @@
package xyz.alexcrea.cuanvil.api.event.listener;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.jetbrains.annotations.NotNull;
public class CAClickResultBypass extends Event implements Cancellable {
private static final HandlerList HANDLERS = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
private boolean cancelled = false;
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@NotNull
private final InventoryClickEvent event;
@NotNull
public InventoryClickEvent getEvent() {
return event;
}
public CAClickResultBypass(@NotNull InventoryClickEvent event) {
this.event = event;
}
}

View file

@ -0,0 +1,24 @@
package xyz.alexcrea.cuanvil.api.event.listener;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.jetbrains.annotations.NotNull;
public class CAEarlyPreAnvilBypass extends CAPreAnvilBypass {
private static final HandlerList HANDLERS = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
public CAEarlyPreAnvilBypass(@NotNull PrepareAnvilEvent event) {
super(event);
}
}

View file

@ -0,0 +1,46 @@
package xyz.alexcrea.cuanvil.api.event.listener;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.jetbrains.annotations.NotNull;
public class CAPreAnvilBypass extends Event implements Cancellable {
private static final HandlerList HANDLERS = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
private boolean cancelled = false;
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@NotNull
private final PrepareAnvilEvent event;
@NotNull
public PrepareAnvilEvent getEvent() {
return event;
}
public CAPreAnvilBypass(@NotNull PrepareAnvilEvent event) {
this.event = event;
}
}

View file

@ -0,0 +1,66 @@
package xyz.alexcrea.cuanvil.api.event.listener;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.util.AnvilUseType;
public class CATreatAnvilResult extends Event {
private static final HandlerList HANDLERS = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
@NotNull
private final PrepareAnvilEvent event;
private final AnvilUseType useType;
@Nullable
private ItemStack result;
private int levelCost;
public CATreatAnvilResult(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, int levelCost) {
this.event = event;
this.useType = useType;
this.result = result;
this.levelCost = levelCost;
}
public @NotNull PrepareAnvilEvent getEvent() {
return event;
}
public AnvilUseType getUseType() {
return useType;
}
public @Nullable ItemStack getResult() {
return result;
}
public void setResult(@Nullable ItemStack result) {
this.result = result;
}
public int getLevelCost() {
return levelCost;
}
public void setLevelCost(int levelCost) {
this.levelCost = levelCost;
}
}

View file

@ -8,6 +8,10 @@ import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.api.event.listener.CAClickResultBypass
import xyz.alexcrea.cuanvil.api.event.listener.CAEarlyPreAnvilBypass
import xyz.alexcrea.cuanvil.api.event.listener.CAPreAnvilBypass
import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult
import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
@ -19,6 +23,7 @@ import xyz.alexcrea.cuanvil.dependency.scheduler.BukkitScheduler
import xyz.alexcrea.cuanvil.dependency.scheduler.FoliaScheduler import xyz.alexcrea.cuanvil.dependency.scheduler.FoliaScheduler
import xyz.alexcrea.cuanvil.dependency.scheduler.TaskScheduler import xyz.alexcrea.cuanvil.dependency.scheduler.TaskScheduler
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT
import xyz.alexcrea.cuanvil.util.AnvilUseType
import java.util.logging.Level import java.util.logging.Level
object DependencyManager { object DependencyManager {
@ -139,10 +144,14 @@ object DependencyManager {
} }
private fun earlyUnsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean { private fun earlyUnsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
var bypass = false // Run the event
val bypassEvent = CAEarlyPreAnvilBypass(event)
Bukkit.getPluginManager().callEvent(bypassEvent)
var bypass = bypassEvent.isCancelled
// Test if the inventory is a gui(version specific) // Test if the inventory is a gui(version specific)
if (externGuiTester?.testIfGui(event.view) == true) bypass = true if (!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true
return bypass return bypass
} }
@ -171,10 +180,14 @@ object DependencyManager {
} }
private fun unsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean { private fun unsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
var bypass = false // Run the event
val bypassEvent = CAPreAnvilBypass(event)
Bukkit.getPluginManager().callEvent(bypassEvent)
var bypass = bypassEvent.isCancelled
// Test if disenchantment used prepare anvil // Test if disenchantment used prepare anvil
if (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true) bypass = true if (!bypass && (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true
// Test heaven bags used prepare anvil // Test heaven bags used prepare anvil
if (!bypass && (havenBagsCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true if (!bypass && (havenBagsCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true
@ -189,11 +202,12 @@ object DependencyManager {
return bypass return bypass
} }
// Return true only if error occurred (and so should bypass rest) // Return null if there was an issue
fun tryTreatAnvilResult(event: PrepareAnvilEvent, result: ItemStack): Boolean { fun tryTreatAnvilResult(event: PrepareAnvilEvent, result: ItemStack, useType: AnvilUseType, cost: Int): CATreatAnvilResult? {
val treatEvent = CATreatAnvilResult(event, useType, result, cost)
try { try {
unsafeTryTreatAnvilResult(event, result) unsafeTryTreatAnvilResult(treatEvent)
return false return treatEvent;
} catch (e: Exception) { } catch (e: Exception) {
CustomAnvil.instance.logger.log( CustomAnvil.instance.logger.log(
Level.SEVERE, Level.SEVERE,
@ -209,12 +223,14 @@ object DependencyManager {
"[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " + "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
ChatColor.RED.toString() + "Error while handling the anvil." ChatColor.RED.toString() + "Error while handling the anvil."
) )
return true return null
} }
} }
private fun unsafeTryTreatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) { private fun unsafeTryTreatAnvilResult(event: CATreatAnvilResult) {
excellentEnchantsCompatibility?.treatAnvilResult(event, result) Bukkit.getPluginManager().callEvent(event)
excellentEnchantsCompatibility?.treatAnvilResult(event)
} }
// Return true if should bypass (either by a dependency or error) // Return true if should bypass (either by a dependency or error)
@ -241,10 +257,14 @@ object DependencyManager {
} }
private fun unsafeTryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean { private fun unsafeTryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
var bypass = false // Run the event
val bypassEvent = CAClickResultBypass(event)
Bukkit.getPluginManager().callEvent(bypassEvent)
var bypass = bypassEvent.isCancelled
// Test if disenchantment used event click // Test if disenchantment used event click
if (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true if (!bypass && (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
// Test if haven bag used event click // Test if haven bag used event click
if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true

View file

@ -8,6 +8,7 @@ import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.RegisteredListener import org.bukkit.plugin.RegisteredListener
import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.api.EnchantmentApi
import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult
import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment
import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment
import xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment
@ -188,9 +189,12 @@ class ExcellentEnchantsDependency {
return handleRechargeMethod.invoke(this.usedAnvilListener, event, first, second) as Boolean return handleRechargeMethod.invoke(this.usedAnvilListener, event, first, second) as Boolean
} }
fun treatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) { fun treatAnvilResult(event: CATreatAnvilResult) {
val first: ItemStack = treatInput(event.inventory.getItem(0)) val result = event.result
val second: ItemStack = treatInput(event.inventory.getItem(1)) if(result == null) return
val first: ItemStack = treatInput(event.event.inventory.getItem(0))
val second: ItemStack = treatInput(event.event.inventory.getItem(1))
handleCombineMethod.invoke(this.usedAnvilListener, event, first, second, result) handleCombineMethod.invoke(this.usedAnvilListener, event, first, second, result)
} }

View file

@ -133,16 +133,20 @@ class PrepareAnvilListener : Listener {
val resultItem: ItemStack = recipe.resultItem!!.clone() val resultItem: ItemStack = recipe.resultItem!!.clone()
resultItem.amount *= amount resultItem.amount *= amount
event.result = resultItem // Maybe add an option on custom craft to ignore/not ignore penalty ??
if (DependencyManager.tryTreatAnvilResult(event, resultItem)) return true
val xpCost = recipe.determineCost(amount, first, resultItem) val xpCost = recipe.determineCost(amount, first, resultItem)
val levelCost = val levelCost =
if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost) if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost)
else AnvilXpUtil.calculateLevelForXp(xpCost) else AnvilXpUtil.calculateLevelForXp(xpCost)
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, levelCost, true) val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.CUSTOM_CRAFT, levelCost)
if (finalResult == null) return false
event.result = finalResult.result
if (finalResult.result == null) return false
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost, true)
return true return true
} }
@ -160,12 +164,15 @@ class PrepareAnvilListener : Listener {
return return
} }
event.result = resultItem
if (DependencyManager.tryTreatAnvilResult(event, resultItem)) return
anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY) anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY)
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, anvilCost) val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.RENAME_ONLY, anvilCost)
if (finalResult == null) return
event.result = finalResult.result
if (finalResult.result == null) return
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
} }
private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int { private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int {
@ -241,10 +248,13 @@ class PrepareAnvilListener : Listener {
anvilCost += handleRename(resultItem, inventory, player) anvilCost += handleRename(resultItem, inventory, player)
// Finally, we set result // Finally, we set result
event.result = resultItem val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost)
if (DependencyManager.tryTreatAnvilResult(event, resultItem)) return if (finalResult == null) return
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, anvilCost) event.result = finalResult.result
if (finalResult.result == null) return
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
} }
// return true if there is a valid unit repair with these ingredients // return true if there is a valid unit repair with these ingredients
@ -270,10 +280,14 @@ class PrepareAnvilListener : Listener {
event.result = null event.result = null
return true return true
} }
event.result = resultItem
if (DependencyManager.tryTreatAnvilResult(event, resultItem)) return true
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, anvilCost) val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.UNIT_REPAIR, anvilCost)
if (finalResult == null) return false
event.result = finalResult.result
if (finalResult.result == null) return false
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
return true return true
} }