package me.lethunderhawk.custom.item.abstraction.runtime; import me.lethunderhawk.custom.item.abstraction.ability.AbilityContext; import me.lethunderhawk.custom.item.abstraction.ability.AbilityDefinition; import me.lethunderhawk.custom.item.abstraction.ability.AbilityTrigger; import me.lethunderhawk.custom.item.abstraction.definition.ItemDefinition; import me.lethunderhawk.custom.item.abstraction.handling.AbilityHandler; import me.lethunderhawk.custom.item.abstraction.handling.ResolvedParams; import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance; import me.lethunderhawk.custom.item.abstraction.instance.ItemInstanceReader; import me.lethunderhawk.custom.item.abstraction.registry.AbilityRegistry; import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.inventory.ItemStack; import java.util.HashMap; import java.util.Map; public final class AbilityDispatchService { private final CustomItemRegistry itemRegistry; private final AbilityRegistry abilityRegistry; private final Map cooldowns = new HashMap<>(); public AbilityDispatchService(CustomItemRegistry itemRegistry, AbilityRegistry abilityRegistry) { this.itemRegistry = itemRegistry; this.abilityRegistry = abilityRegistry; } public void dispatch( Player player, ItemStack stack, AbilityTrigger trigger, Event event ) { ItemInstance instance = ItemInstanceReader.read(stack); if (instance == null) return; ItemDefinition def = itemRegistry.get(instance.itemId()); for (AbilityDefinition ability : def.abilities()) { if (ability.matchesTrigger(trigger)) { String cooldownKey = player.getUniqueId() + ":" + ability.handlerId(); long lastUsed = cooldowns.getOrDefault(cooldownKey, 0L); long cooldown = ability.getCooldownMillis(); long now = System.currentTimeMillis(); if (cooldown > 0 && (now - lastUsed) < cooldown) { long remaining = (cooldown - (now - lastUsed)) / 1000; player.sendMessage("§cAbility is on cooldown! Please wait " + (remaining + 1) + " seconds."); continue; } AbilityHandler handler = abilityRegistry.get(ability.handlerId()); handler.execute( new AbilityContext(player, instance, event, trigger), ResolvedParams.resolve(ability, def, instance) ); if (cooldown > 0) { cooldowns.put(cooldownKey, now); } } } } }