diff --git a/src/main/java/think/rpgitems/event/RPGPowerTriggerPreEvent.java b/src/main/java/think/rpgitems/event/RPGPowerTriggerPreEvent.java new file mode 100644 index 0000000..28037d8 --- /dev/null +++ b/src/main/java/think/rpgitems/event/RPGPowerTriggerPreEvent.java @@ -0,0 +1,47 @@ +package think.rpgitems.event; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import think.rpgitems.item.RPGItem; +import think.rpgitems.power.Pimpl; +import think.rpgitems.power.PowerResult; +import think.rpgitems.power.trigger.Trigger; + +import java.util.Map; +import java.util.TreeMap; + +@Getter @Setter +public class RPGPowerTriggerPreEvent extends PlayerEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + @Override @NotNull + public HandlerList getHandlers() { + return handlers; + } + public static HandlerList getHandlerList() { + return handlers; + } + + private boolean cancelled = false; + private final RPGItem rpg; + private final ItemStack item; + private final Event event; + private final Trigger trigger; + private final Object context; + private final Map> skippingPowersById = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + public RPGPowerTriggerPreEvent(@NotNull Player player, RPGItem rpg, ItemStack item, Event event, Trigger trigger, Object context) { + super(player); + this.rpg = rpg; + this.item = item; + this.event = event; + this.trigger = trigger; + this.context = context; + } +} diff --git a/src/main/java/think/rpgitems/item/RPGItem.java b/src/main/java/think/rpgitems/item/RPGItem.java index 2713cc1..1b3bd32 100644 --- a/src/main/java/think/rpgitems/item/RPGItem.java +++ b/src/main/java/think/rpgitems/item/RPGItem.java @@ -1334,6 +1334,11 @@ public Pair, List>> getAllPowersAndConditions(ItemStack } public TReturn power(Player player, ItemStack i, TEvent event, Trigger trigger, Object context) { + RPGPowerTriggerPreEvent e = new RPGPowerTriggerPreEvent<>(player, this, i, event, trigger, context); + Bukkit.getPluginManager().callEvent(e); + if (e.isCancelled()) { + return trigger.def(player, i, event); + } powerCustomTrigger(player, i, event, trigger, context); Pair, List>> pair = getAllPowersAndConditions(i); @@ -1354,7 +1359,11 @@ public TReturn po boolean flag = true; if (power.getPower() instanceof BasePower) { BasePower base = (BasePower) power.getPower(); - if (!plugin.magic.costMagic(player, base.getCostMagic())) { + PowerResult skipping = e.getSkippingPowersById().get(base.getPowerId()); + if (skipping != null) { + result = skipping; + flag = false; + } else if (!plugin.magic.costMagic(player, base.getCostMagic())) { result = PowerResult.cost(); flag = false; magicFlag += base.getCostMagic();