diff --git a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java index 2f80d8e..f8e060b 100644 --- a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java +++ b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java @@ -2,11 +2,10 @@ package dev.zxq5.fantasysmp; import dev.zxq5.fantasysmp.events.HereticWarner; import dev.zxq5.fantasysmp.events.StevenKillCheck; -import dev.zxq5.fantasysmp.items.GenericGearSet; -import dev.zxq5.fantasysmp.items.Items; -import dev.zxq5.fantasysmp.items.Witherite; +import dev.zxq5.fantasysmp.items.*; import dev.zxq5.fantasysmp.warps.Warp; import dev.zxq5.fantasysmp.warps.Warper; +import org.bukkit.entity.Panda; import org.bukkit.plugin.java.JavaPlugin; public final class Fantasysmp extends JavaPlugin { @@ -37,6 +36,12 @@ public final class Fantasysmp extends JavaPlugin { GenericGearSet witherite = new Witherite(); witherite.registerRecipes(); + Lightning lightning = new Lightning(); + lightning.registerRecipes(); + + StevensWrath stevensWrath = new StevensWrath(); + stevensWrath.registerRecipes(); + getServer().getPluginManager().registerEvents(new StevenKillCheck(), this); HereticWarner hereticWarner = new HereticWarner(); diff --git a/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java b/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java index 4f3ec41..2688c36 100644 --- a/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java +++ b/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java @@ -61,7 +61,7 @@ public class StevenKillCheck implements Listener { public void destroyHeretic(Player heretic) { Location coords = heretic.getLocation(); - World world = getServer().getWorlds().getFirst(); + World world = coords.getWorld(); Plugin plugin = getPluginManager().getPlugin("fantasysmp"); broadcastMessage(ChatColor.DARK_RED + "HERESY!!!!"); diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Items.java b/src/main/java/dev/zxq5/fantasysmp/items/Items.java index c936015..0066e7d 100644 --- a/src/main/java/dev/zxq5/fantasysmp/items/Items.java +++ b/src/main/java/dev/zxq5/fantasysmp/items/Items.java @@ -1,6 +1,7 @@ package dev.zxq5.fantasysmp.items; import org.bukkit.Bukkit; +import org.bukkit.block.data.type.Light; import org.bukkit.command.CommandExecutor; import org.bukkit.entity.Player; import org.bukkit.entity.Wither; @@ -46,7 +47,9 @@ public class Items implements CommandExecutor { public Items(JavaPlugin plugin) { Witherite.init(); + Lightning.init(); getServer().getPluginManager().registerEvents(new Witherite(), plugin); - + getServer().getPluginManager().registerEvents(new Lightning(), plugin); + getServer().getPluginManager().registerEvents(new StevensWrath(), plugin); } } diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Lightning.java b/src/main/java/dev/zxq5/fantasysmp/items/Lightning.java new file mode 100644 index 0000000..a1c5d3f --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/Lightning.java @@ -0,0 +1,112 @@ +package dev.zxq5.fantasysmp.items; + +import dev.zxq5.fantasysmp.util.LoreChecker; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.List; + +import static org.bukkit.Bukkit.broadcastMessage; +import static org.bukkit.Bukkit.getServer; + +public class Lightning extends GenericGearSet implements Listener, CommandExecutor { + + @Override + public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + if (!(args[0].equals("lightning"))) { + return false; + } + + Player player = (Player) sender; + + player.getInventory().addItem(new Lightning().getSword()); + return true; + } + + @Override + public void registerRecipes() { + ItemStack sword = this.getSword(); + NamespacedKey swordKey = new NamespacedKey("fantasysmp.items", "lightning_sword"); + ShapedRecipe swordRecipe = new ShapedRecipe(swordKey, sword); + swordRecipe.shape(" N ", " N ", " R "); + swordRecipe.setIngredient('N', Material.NETHER_STAR); + swordRecipe.setIngredient('R', Material.LIGHTNING_ROD); + getServer().addRecipe(swordRecipe); + } + + @EventHandler + public void onEntityDamageByEntity(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + // checks that it is a player that is performing the attack. + if (!(event.getDamager() instanceof org.bukkit.entity.Player player)) { + return; + } + + if (!( LoreChecker.itemLoreContains(player.getInventory().getItemInMainHand(), this.swordLore) )) return; + + if ( + player.isOnGround() + || player.getVelocity().getY() >= 0 + || player.isClimbing() + || player.isInWater() + || player.isInsideVehicle() + || player.hasPotionEffect(PotionEffectType.BLINDNESS) + ) return; + + + Location location = event.getEntity().getLocation(); + World world = location.getWorld(); + + if (world == null) return; + + world.strikeLightning(location); + } + + @EventHandler + public void onEntityDamage(org.bukkit.event.entity.EntityDamageEvent event) { + if (event.getEntity() instanceof Player player) { + + if (!(event + .getDamageSource() + .getDamageType() + .getKey() + .toString() + .equals("minecraft:lightning_bolt") + )) return; + + if (LoreChecker.itemLoreContains(player.getInventory().getItemInMainHand(), this.swordLore)) { + event.setCancelled(true); + } + } + } + + @Override + public ItemStack getSword() { + ItemStack item = super.getSword(); + ItemMeta meta = item.getItemMeta(); + meta.setItemModel(NamespacedKey.fromString("fantasysmp:lightning_sword")); + item.setItemMeta(meta); + return item; + } + + + public static void init() {} + + public Lightning() { + this.setTier5(); + this.swordName = "Lightning Sword"; + this.swordLore = "All who oppose shall be smitten."; + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/items/StevensWrath.java b/src/main/java/dev/zxq5/fantasysmp/items/StevensWrath.java new file mode 100644 index 0000000..649aefd --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/StevensWrath.java @@ -0,0 +1,104 @@ +package dev.zxq5.fantasysmp.items; + +import dev.zxq5.fantasysmp.util.LoreChecker; +import org.bukkit.*; +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.SmithingTransformRecipe; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; + +import java.util.List; + +import static org.bukkit.Bukkit.broadcastMessage; +import static org.bukkit.Bukkit.getServer; + +public class StevensWrath extends GenericGearSet implements Listener, CommandExecutor { + + @Override + public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + if (!(args[0].equals("wrath"))) { + return false; + } + + Player player = (Player) sender; + + player.getInventory().addItem(new StevensWrath().getSword()); + return true; + } + + @EventHandler + public void onCraft(org.bukkit.event.inventory.PrepareItemCraftEvent event) { + if (!event.getInventory().contains(Material.NETHERITE_BLOCK)) return; + if (!event.getInventory().contains(new Lightning().getSword())) return; + event.getInventory().setResult(new StevensWrath().getSword()); + } + + @Override + public void registerRecipes() {} + + @EventHandler + public void onEntityDamageByEntity(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + + // checks that it is a player that is performing the attack. + if (!(event.getDamager() instanceof org.bukkit.entity.Player player)) { + return; + } + + if (!( + LoreChecker.itemLoreContains(player.getInventory().getItemInMainHand(), this.swordLore) + || LoreChecker.itemLoreContains(player.getInventory().getItemInOffHand(), this.swordLore) + )) return; + + Location location = event.getEntity().getLocation(); + World world = location.getWorld(); + + if (world == null) return; + + world.strikeLightning(location); + } + + @EventHandler + public void onEntityDamage(org.bukkit.event.entity.EntityDamageEvent event) { + if (event.getEntity() instanceof Player player) { + + if (!(event + .getDamageSource() + .getDamageType() + .getKey() + .toString() + .equals("minecraft:lightning_bolt") + )) return; + + if (LoreChecker.itemLoreContains(player.getInventory().getItemInMainHand(), this.swordLore) || + LoreChecker.itemLoreContains(player.getInventory().getItemInOffHand(), this.swordLore)) { + event.setCancelled(true); + } + } + } + + @Override + public ItemStack getSword() { + ItemStack item = super.getSword(); + ItemMeta meta = item.getItemMeta(); + meta.setItemModel(NamespacedKey.fromString("fantasysmp:stevens_wrath")); + item.setItemMeta(meta); + return item; + } + + + public static void init() {} + + public StevensWrath() { + this.setTier6(); + this.swordName = ChatColor.LIGHT_PURPLE + "Stevens Wrath" + ChatColor.RESET; + this.swordLore = ChatColor.LIGHT_PURPLE + "All who oppose the mighty Steven shall face his wrath of lightning."; + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java b/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java index f9f57a4..ed7e3b6 100644 --- a/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java +++ b/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java @@ -1,5 +1,6 @@ package dev.zxq5.fantasysmp.items; +import dev.zxq5.fantasysmp.util.LoreChecker; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.command.CommandExecutor; @@ -77,12 +78,7 @@ public class Witherite extends GenericGearSet implements Listener, CommandExecut return; } - try { - if (!player.getInventory().getItemInMainHand().getItemMeta().getLore().toString().contains(this.swordLore)) { - return; - } - } catch (Exception e) { - e.printStackTrace(); + if (!LoreChecker.itemLoreContains(player.getInventory().getItemInMainHand(), this.swordLore)) { return; } @@ -98,15 +94,18 @@ public class Witherite extends GenericGearSet implements Listener, CommandExecut @EventHandler public void onEntityPotionEffectEvent(org.bukkit.event.entity.EntityPotionEffectEvent event) { if (event.getEntity() instanceof Player player) { + if (event.getNewEffect() == null) return; + if (event.getNewEffect().getType() != org.bukkit.potion.PotionEffectType.WITHER) { return; } try { - if (player.getInventory().getHelmet().getItemMeta().getLore().toString().contains(this.helmetLore) - && player.getInventory().getChestplate().getItemMeta().getLore().toString().contains(this.chestplateLore) - && player.getInventory().getLeggings().getItemMeta().getLore().toString().contains(this.leggingsLore) - && player.getInventory().getBoots().getItemMeta().getLore().toString().contains(this.bootsLore)) { + if (LoreChecker.itemLoreContains(player.getInventory().getHelmet(), this.helmetLore) + && LoreChecker.itemLoreContains(player.getInventory().getChestplate(), this.chestplateLore) + && LoreChecker.itemLoreContains(player.getInventory().getLeggings(), this.leggingsLore) + && LoreChecker.itemLoreContains(player.getInventory().getBoots(), this.bootsLore) + ) { event.setCancelled(true); } } catch (Exception e) { diff --git a/src/main/java/dev/zxq5/fantasysmp/util/LoreChecker.java b/src/main/java/dev/zxq5/fantasysmp/util/LoreChecker.java new file mode 100644 index 0000000..70aa9c1 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/util/LoreChecker.java @@ -0,0 +1,20 @@ +package dev.zxq5.fantasysmp.util; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.List; + +public class LoreChecker { + public static boolean itemLoreContains(ItemStack item, String content) { + if (item == null) return false; + + ItemMeta meta = item.getItemMeta(); + if (meta == null) return false; + + List lore = meta.getLore(); + if (lore == null) return false; + + return lore.toString().contains(content); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0ad9d85..2d73bfc 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -9,7 +9,7 @@ website: https://zxq5.dev commands: items: description: create custom items from plugin - usage: /items + usage: /items permission: fantasysmp.admin home: