diff --git a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java index 5f524024..1262d20a 100644 --- a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java +++ b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java @@ -110,7 +110,8 @@ private static Set buildCustomEnchantments(HoloItemsRevamp pl new Memento(plugin), new TideRider(plugin), new Backdash(plugin), - new Plow(plugin) + new Plow(plugin), + new SSKSword(plugin) ); } } diff --git a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentAbility.java b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentAbility.java index fcc8beb5..658ee417 100644 --- a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentAbility.java +++ b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentAbility.java @@ -3,6 +3,7 @@ import org.bukkit.Keyed; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -17,6 +18,9 @@ default void onBlockBreak(BlockBreakEvent event, ItemStack itemStack) { default void onBlockPlace(BlockPlaceEvent event, ItemStack itemStack) { } + default void onEntityDamageByEntity(EntityDamageByEntityEvent event, ItemStack itemStack) { + } + default void onPlayerDeath(PlayerDeathEvent event, ItemStack itemStack) { } @@ -24,7 +28,7 @@ default void onProjectileLaunch(ProjectileLaunchEvent event, ItemStack itemStack } default void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { - } + } default void onPlayerToggleSneak(PlayerToggleSneakEvent event, ItemStack itemStack) { } diff --git a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentListener.java b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentListener.java index 5e662b18..58770b8d 100644 --- a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentListener.java +++ b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantmentListener.java @@ -3,11 +3,13 @@ import java.util.function.Consumer; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.entity.ThrowableProjectile; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -37,6 +39,15 @@ public void onBlockPlace(BlockPlaceEvent event) { forEachEnchantment(itemStack, ability -> ability.onBlockPlace(event, itemStack)); } + @EventHandler(ignoreCancelled = true) + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player player)) { + return; + } + final var itemStack = player.getInventory().getItemInMainHand(); + forEachEnchantment(itemStack, ability -> ability.onEntityDamageByEntity(event, itemStack)); + } + @EventHandler(ignoreCancelled = true) public void onPlayerDeath(PlayerDeathEvent event) { final var storageContents = event.getPlayer().getInventory().getStorageContents(); diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java index 5640e035..02f5aba5 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java @@ -1741,7 +1741,7 @@ public List getLore() { } private static Idol buildTemma(HoloItemsRevamp plugin) { - return new Idol() { + return new Idol(new SSKSwordItem(plugin)) { @Override public @NotNull String getSkinUrl() { diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/SSKSword.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/SSKSword.java new file mode 100644 index 00000000..fc1ed9c2 --- /dev/null +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/SSKSword.java @@ -0,0 +1,98 @@ +package xyz.holocons.mc.holoitemsrevamp.enchantment; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.attribute.Attribute; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityCategory; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; + +import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; +import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; + +public class SSKSword extends CustomEnchantment implements EnchantmentAbility { + + private static final int ticksPerLevel = 80; + + public SSKSword(HoloItemsRevamp plugin) { + super(plugin, "ssk_sword"); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public boolean conflictsWith(@NotNull Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(@NotNull ItemStack itemStack) { + return itemStack.getType() == Material.DIAMOND_SWORD; + } + + @Override + public @NotNull Component displayName(int level) { + return Component.text() + .color(NamedTextColor.GRAY) + .decoration(TextDecoration.ITALIC, false) + .append(Component.text("SSK Sword")) + .build(); + } + + @Override + public int getCostMultiplier() { + return 12; + } + + @Override + public void onEntityDamageByEntity(EntityDamageByEntityEvent event, ItemStack itemStack) { + if (isMissingHealth(event.getDamager())) { + return; + } + + final var rawDamage = event.getDamage(); + if (rawDamage <= 0d || !(event.getEntity() instanceof LivingEntity target)) { + return; + } + + event.setDamage(0); + + final var targetIsUndead = target.getCategory() == EntityCategory.UNDEAD; + final var effectType = targetIsUndead ? PotionEffectType.HARM : PotionEffectType.HEAL; + target.addPotionEffect(new PotionEffect(effectType, 1, 1)); + + final var fireAspectLevel = itemStack.getEnchantmentLevel(FIRE_ASPECT); + if (fireAspectLevel > 0) { + target.addPotionEffects(List.of( + new PotionEffect(PotionEffectType.FIRE_RESISTANCE, ticksPerLevel * fireAspectLevel, 1), + new PotionEffect(PotionEffectType.SPEED, ticksPerLevel * fireAspectLevel, 1))); + } + + final var location = target.getLocation().add(0, target.getHeight() / 2, 0); + final var world = location.getWorld(); + world.spawnParticle(Particle.HEART, location, 3, 0.5, 0.5, 0.5); + world.playSound(location, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 0.1f, 1f); + } + + private static boolean isMissingHealth(final Entity entity) { + return entity instanceof LivingEntity livingEntity + && livingEntity.getHealth() < livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); + } +} diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/SSKSwordItem.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/SSKSwordItem.java new file mode 100644 index 00000000..bc7ce797 --- /dev/null +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/SSKSwordItem.java @@ -0,0 +1,66 @@ +package xyz.holocons.mc.holoitemsrevamp.item; + +import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; +import com.strangeone101.holoitemsapi.enchantment.EnchantManager; +import com.strangeone101.holoitemsapi.enchantment.Enchantable; +import com.strangeone101.holoitemsapi.item.CustomItem; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.ShapedRecipe; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; + +import java.util.List; + +public class SSKSwordItem extends CustomItem implements Enchantable { + + private static final String name = "ssk_sword"; + private static final Material material = Material.DIAMOND_SWORD; + private static final Component displayName = Component.text("SSK Sword", NamedTextColor.RED); + private static final List lore = List.of( + Component.text("Heal-on-hit when at full health!", NamedTextColor.DARK_PURPLE) + ); + + private final EnchantManager enchantManager; + + public SSKSwordItem(HoloItemsRevamp plugin) { + super(plugin, name, material, displayName, lore); + this.enchantManager = plugin.getEnchantManager(); + this.register(); + } + + @Override + protected Recipe getRecipe() { + final var recipe = new ShapedRecipe(getKey(), buildStack(null)); + recipe.shape("*&#","*&#","*/#"); + recipe.setIngredient('*', Material.BLAZE_POWDER); + recipe.setIngredient('&', Material.GHAST_TEAR); + recipe.setIngredient('#', Material.SUGAR); + recipe.setIngredient('/', Material.NETHER_STAR); + return recipe; + } + + @Override + public Enchantment getEnchantment() { + return CustomEnchantment.getByKey(getKey()); + } + + @Override + public ItemStack applyEnchantment(ItemStack itemStack) { + var enchantedStack = itemStack.clone(); + var enchantedMeta = enchantedStack.hasItemMeta() ? enchantedStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(enchantedStack.getType()); + + if (enchantedMeta.addEnchant(getEnchantment(), 1, false)) { + enchantedStack.setItemMeta(enchantedMeta); + enchantManager.removeCustomEnchantmentLore(enchantedStack); + enchantManager.applyCustomEnchantmentLore(enchantedStack); + return enchantedStack; + } else { + return null; + } + } +}