package me.sashegdev.blackknife; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; public class ParryHandler implements Listener { private final BlackKnifePlugin plugin; public ParryHandler(BlackKnifePlugin plugin) { this.plugin = plugin; } @EventHandler(priority = EventPriority.HIGH) public void onDamage(EntityDamageByEntityEvent e) { if (!(e.getEntity() instanceof Player victim)) return; if (e.isCancelled()) return; if (BlackKnifeItem.is(victim.getInventory().getItemInMainHand()) || BlackKnifeItem.is(victim.getInventory().getItemInOffHand())) { TensionManager tm = plugin.getTension(); if (tm.getTP(victim) < 37.5f) return; double original = e.getDamage(); double reduced = original * 0.4; e.setDamage(reduced); tm.setTP(victim, tm.getTP(victim) - 37.5f); victim.getWorld().spawnParticle(Particle.CRIT, victim.getLocation().add(0, 1, 0), 12, 0.3, 0.4, 0.3, 0.1); victim.getWorld().spawnParticle(Particle.SMOKE, victim.getLocation().add(0, 1, 0), 8, 0.2, 0.3, 0.2, 0.02); victim.getWorld().playSound(victim.getLocation(), Sound.ITEM_SHIELD_BLOCK, 1f, 1.1f); victim.sendActionBar(Component.text(String.format("PARRY -60%% (%.0f→%.0f) -15%% TP", original, reduced)).color(NamedTextColor.AQUA)); if (e.getDamager() instanceof Player attacker) attacker.sendActionBar(Component.text("PARRIED!").color(NamedTextColor.GRAY)); return; } var magicListener = plugin.getMagicListener(); if (magicListener != null && magicListener.isShielded(victim)) { double reduced = magicListener.reduceShieldDamage(victim, e.getDamage()); e.setDamage(reduced); } } }