AbilityDispatchService.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package me.lethunderhawk.custom.item.abstraction.runtime;
  2. import me.lethunderhawk.custom.item.abstraction.ability.AbilityContext;
  3. import me.lethunderhawk.custom.item.abstraction.ability.AbilityDefinition;
  4. import me.lethunderhawk.custom.item.abstraction.ability.AbilityTrigger;
  5. import me.lethunderhawk.custom.item.abstraction.definition.ItemDefinition;
  6. import me.lethunderhawk.custom.item.abstraction.handling.AbilityHandler;
  7. import me.lethunderhawk.custom.item.abstraction.handling.ResolvedParams;
  8. import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance;
  9. import me.lethunderhawk.custom.item.abstraction.instance.ItemInstanceReader;
  10. import me.lethunderhawk.custom.item.abstraction.registry.AbilityRegistry;
  11. import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.event.Event;
  14. import org.bukkit.inventory.ItemStack;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. public final class AbilityDispatchService {
  18. private final CustomItemRegistry itemRegistry;
  19. private final AbilityRegistry abilityRegistry;
  20. private final Map<String, Long> cooldowns = new HashMap<>();
  21. public AbilityDispatchService(CustomItemRegistry itemRegistry, AbilityRegistry abilityRegistry) {
  22. this.itemRegistry = itemRegistry;
  23. this.abilityRegistry = abilityRegistry;
  24. }
  25. public void dispatch(
  26. Player player,
  27. ItemStack stack,
  28. AbilityTrigger trigger,
  29. Event event
  30. ) {
  31. ItemInstance instance = ItemInstanceReader.read(stack);
  32. if (instance == null) return;
  33. ItemDefinition def = itemRegistry.get(instance.itemId());
  34. for (AbilityDefinition ability : def.abilities()) {
  35. if (ability.matchesTrigger(trigger)) {
  36. String cooldownKey = player.getUniqueId() + ":" + ability.handlerId();
  37. long lastUsed = cooldowns.getOrDefault(cooldownKey, 0L);
  38. long cooldown = ability.getCooldownMillis();
  39. long now = System.currentTimeMillis();
  40. if (cooldown > 0 && (now - lastUsed) < cooldown) {
  41. long remaining = (cooldown - (now - lastUsed)) / 1000;
  42. player.sendMessage("§cAbility is on cooldown! Please wait " + (remaining + 1) + " seconds.");
  43. continue;
  44. }
  45. AbilityHandler handler = abilityRegistry.get(ability.handlerId());
  46. handler.execute(
  47. new AbilityContext(player, instance, event, trigger),
  48. ResolvedParams.resolve(ability, def, instance)
  49. );
  50. if (cooldown > 0) {
  51. cooldowns.put(cooldownKey, now);
  52. }
  53. }
  54. }
  55. }
  56. }