diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Items.java b/src/main/java/dev/zxq5/fantasysmp/items/Items.java index 295be29..5191bfa 100644 --- a/src/main/java/dev/zxq5/fantasysmp/items/Items.java +++ b/src/main/java/dev/zxq5/fantasysmp/items/Items.java @@ -59,6 +59,7 @@ public class Items implements CommandExecutor { new Ender(); new StevensWrath(); new LightningSword(); + new Crown(); AppleJuice appleJuice = new AppleJuice(); appleJuice.registerEvents(Fantasysmp.getPlugin()); diff --git a/src/main/java/dev/zxq5/fantasysmp/items/gear/Crown.java b/src/main/java/dev/zxq5/fantasysmp/items/gear/Crown.java new file mode 100644 index 0000000..43419b2 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/gear/Crown.java @@ -0,0 +1,83 @@ +package dev.zxq5.fantasysmp.items.gear; + +import dev.zxq5.fantasysmp.Fantasysmp; +import dev.zxq5.fantasysmp.items.presets.*; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; + +public class Crown extends CustomSet { + public static Crown instance; + public static int tier = 5; + + public Crown() { + super(tier); + instance = this; + + this.helmetId = "Crown"; + this.helmetName = "&eCrown"; + this.helmetLore = List.of("Harness the power of a &eking.", "Gain permanent &cregeneration" + ChatColor.RESET + " and &fspeed" + ChatColor.RESET + " as your health decreases."); + this.helmetModel = 14338; + + this.equipmentModel = "crown"; + registerItems(); + registerRecipes(); + registerHandler(); + } + + public static Crown getInstance() { + if (instance == null) { + instance = new Crown(); + } + return instance; + } + + @Override + public void registerRecipes() {} + + @Override + public void handleLeftClick(Player player, ItemStack itemStack, PlayerInteractEvent event) {} + + @Override + public void handleRightClick(Player player, ItemStack itemStack, PlayerInteractEvent event) {} + + @Override + public void onHit(Player player, ItemStack itemStack, EntityDamageByEntityEvent event) {} + + @Override + public void onArmourChange(Player player, ItemStack item, boolean active) { + if(active) { + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 0)); + onHealthChange(player); + }else { + player.removePotionEffect(PotionEffectType.REGENERATION); + player.setWalkSpeed(0.2f); + } + } + + @Override + public void onDamage(EntityDamageEvent event) { + Player player = (Player) event.getEntity(); + + onHealthChange(player); + } + + public void onHealthChange(Player player) { + player.setWalkSpeed((float) (0.2f * (1 + (Math.min(20 - player.getHealth(), 16.0) / 16)))); + } + + @Override + public void onEffect(EntityPotionEffectEvent event) {} + + private static void registerItems() { + Fantasysmp.registerItems(new CustomHelmet(instance, getInstance().helmetId)); + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/items/gear/Dragon.java b/src/main/java/dev/zxq5/fantasysmp/items/gear/Dragon.java index f008fd0..7f974e9 100644 --- a/src/main/java/dev/zxq5/fantasysmp/items/gear/Dragon.java +++ b/src/main/java/dev/zxq5/fantasysmp/items/gear/Dragon.java @@ -4,6 +4,8 @@ import dev.zxq5.fantasysmp.Fantasysmp; import dev.zxq5.fantasysmp.items.presets.*; import org.bukkit.*; import org.bukkit.damage.DamageType; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; @@ -160,9 +162,36 @@ public class Dragon extends CustomSet { @Override public void onDamage(EntityDamageEvent event) { - if (!(event.getDamageSource().getDamageType() == DamageType.FLY_INTO_WALL)) return; + if (!(event.getDamageSource().getDamageType() == DamageType.FLY_INTO_WALL || event.getDamageSource().getDamageType() == DamageType.FALL)) return; - event.setCancelled(true); + event.setDamage(event.getDamage() * 0.5); + + Player player = (Player) event.getEntity(); + + double radius = 5.0; + double damage = 8.0; + double kb = 0.5; + + if (event.getDamageSource().getDamageType() == DamageType.FLY_INTO_WALL) { + event.setDamage(event.getDamage() * 0.4); + radius = 3.0; + damage = 5.0; + kb = 0.3; + } + + for (Entity entity : player.getNearbyEntities(radius, radius, radius)) { + if (entity instanceof LivingEntity target && entity != player) { + target.damage(damage, player); + + Vector knockback = target.getLocation().toVector().subtract(player.getLocation().toVector()).normalize(); + knockback.multiply(kb); + knockback.setY(0.5); + target.setVelocity(knockback); + } + } + + player.getWorld().playSound(player.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1f, 1f); + player.getWorld().spawnParticle(Particle.EXPLOSION, player.getLocation(), 30, 1, 1, 1, 0.1); } @Override diff --git a/src/main/java/dev/zxq5/fantasysmp/items/presets/CustomItemHandler.java b/src/main/java/dev/zxq5/fantasysmp/items/presets/CustomItemHandler.java index c23d401..d701412 100644 --- a/src/main/java/dev/zxq5/fantasysmp/items/presets/CustomItemHandler.java +++ b/src/main/java/dev/zxq5/fantasysmp/items/presets/CustomItemHandler.java @@ -1,6 +1,7 @@ package dev.zxq5.fantasysmp.items.presets; import dev.zxq5.fantasysmp.Fantasysmp; +import dev.zxq5.fantasysmp.items.gear.Crown; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.*; @@ -8,10 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; @@ -94,6 +92,12 @@ public class CustomItemHandler implements Listener { public void onArmourChange(Player player) { + if (getItemId(player.getInventory().getHelmet()).equals("Crown")) { + Crown.getInstance().onArmourChange(player, null, true); + } else { + Crown.getInstance().onArmourChange(player, null, false); + } + CustomSet customSet = getSet(player); if(customSet == null && active != null) { @@ -123,13 +127,13 @@ public class CustomItemHandler implements Listener { customSet.onDamage(event); } } - } else { - CustomSet customSet = getSet(player); - - if (customSet == null) return; - - customSet.onDamage(event); } + + CustomSet customSet = getSet(player); + + if (customSet == null) return; + + customSet.onDamage(event); } @EventHandler @@ -143,6 +147,16 @@ public class CustomItemHandler implements Listener { customSet.onEffect(event); } + @EventHandler + public void onPlayerHeal(EntityRegainHealthEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + if (getItemId(player.getInventory().getHelmet()).equals("Crown")) { + Crown.getInstance().onHealthChange(player); + } + } + + @EventHandler public void onDeath(EntityDeathEvent event) { if (event.getEntity() instanceof Mob mob) { @@ -161,6 +175,9 @@ public class CustomItemHandler implements Listener { } private static String getItemId(ItemStack itemStack) { + if(itemStack == null || !itemStack.hasItemMeta()){ + return ""; + } return itemStack.getItemMeta().getPersistentDataContainer().get(Fantasysmp.customItemKey, PersistentDataType.STRING); } @@ -179,6 +196,10 @@ public class CustomItemHandler implements Listener { if ((customHelmet instanceof CustomHelmet custHelmet) && (customChestplate instanceof CustomChestplate custChestplate) && (customLeggings instanceof CustomLeggings custLeggings) && (customBoots instanceof CustomBoots custBoots)) { CustomSet customSet = custHelmet.getSet(); + if (getItemId(helmet).equals("Crown")) { + customSet = custChestplate.getSet(); + } + if(customSet.equals(custChestplate.getSet()) && customSet.equals(custLeggings.getSet()) && customSet.equals(custBoots.getSet())) { return customSet; }