| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 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<String, Long> 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);
- }
- }
- }
- }
- }
|