Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ private static Set<CustomEnchantment> buildCustomEnchantments(HoloItemsRevamp pl
new Memento(plugin),
new TideRider(plugin),
new Backdash(plugin),
new Plow(plugin)
new Plow(plugin),
new SSKSword(plugin)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -17,14 +18,17 @@ 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) {
}

default void onProjectileLaunch(ProjectileLaunchEvent event, ItemStack itemStack) {
}

default void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) {
}
}

default void onPlayerToggleSneak(PlayerToggleSneakEvent event, ItemStack itemStack) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1741,7 +1741,7 @@ public List<Component> getLore() {
}

private static Idol buildTemma(HoloItemsRevamp plugin) {
return new Idol() {
return new Idol(new SSKSwordItem(plugin)) {

@Override
public @NotNull String getSkinUrl() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
Comment thread
cpaca marked this conversation as resolved.

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();
}
}
Original file line number Diff line number Diff line change
@@ -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<Component> 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;
}
}
}