From e622d7e155ea4a30ceca37be7af558e7f2aec029 Mon Sep 17 00:00:00 2001 From: Joseph Hale Date: Fri, 4 Jun 2021 22:05:20 -0700 Subject: [PATCH] Add Net Arrows Net Arrows spawn a bunch of cobweb around their impact site. Great for drastically slowing down opponents! Also, since Net Arrows require so much cobweb to craft, I also added in a new recipe that allows for the crafting of cobwebs. --- build.gradle | 2 +- .../jhale1805/PowerProjectilePlugin.java | 15 ++++- .../github/jhale1805/powerarrow/NetArrow.java | 56 +++++++++++++++++++ .../jhale1805/powerarrow/PowerArrow.java | 4 +- .../powerarrow/PowerArrowRegistry.java | 1 + .../github/jhale1805/powerrecipe/Cobweb.java | 56 +++++++++++++++++++ .../jhale1805/powerrecipe/PowerRecipe.java | 44 +++++++++++++++ .../powerrecipe/PowerRecipeRegistry.java | 15 +++++ .../io/github/jhale1805/util/Utilities.java | 4 +- src/main/resources/plugin.yml | 2 +- 10 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 src/main/java/io/github/jhale1805/powerarrow/NetArrow.java create mode 100644 src/main/java/io/github/jhale1805/powerrecipe/Cobweb.java create mode 100644 src/main/java/io/github/jhale1805/powerrecipe/PowerRecipe.java create mode 100644 src/main/java/io/github/jhale1805/powerrecipe/PowerRecipeRegistry.java diff --git a/build.gradle b/build.gradle index fe9c177..9d16a41 100644 --- a/build.gradle +++ b/build.gradle @@ -39,5 +39,5 @@ dependencies { } jar { - archiveVersion = '1.3.1' + archiveVersion = '1.4.0' } \ No newline at end of file diff --git a/src/main/java/io/github/jhale1805/PowerProjectilePlugin.java b/src/main/java/io/github/jhale1805/PowerProjectilePlugin.java index 457852a..21368ba 100644 --- a/src/main/java/io/github/jhale1805/PowerProjectilePlugin.java +++ b/src/main/java/io/github/jhale1805/PowerProjectilePlugin.java @@ -7,6 +7,7 @@ import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; import io.github.jhale1805.powerarrow.*; +import io.github.jhale1805.powerrecipe.*; public class PowerProjectilePlugin extends JavaPlugin { @@ -37,11 +38,23 @@ public class PowerProjectilePlugin extends JavaPlugin { getLogger().info("Copyright 2021 by Joseph Hale (jhale1805). All Rights Reserved."); getLogger().info("Report issues to https://github.com/jhale1805/power-projectiles"); getLogger().info("Loading all Power Projectiles."); + registerPowerArrows(); + registerPowerRecipes(); + getLogger().info("Ready!"); + } + + private void registerPowerArrows() { for (PowerArrow powerArrow : PowerArrowRegistry.getPowerArrows()) { getServer().getPluginManager().registerEvents(powerArrow, this); Bukkit.addRecipe(powerArrow.getRecipe()); } - getLogger().info("Ready!"); + } + + private void registerPowerRecipes() { + for (PowerRecipe powerRecipe : PowerRecipeRegistry.getPowerRecipes()) { + getServer().getPluginManager().registerEvents(powerRecipe, this); + Bukkit.addRecipe(powerRecipe.getRecipe()); + } } @Override diff --git a/src/main/java/io/github/jhale1805/powerarrow/NetArrow.java b/src/main/java/io/github/jhale1805/powerarrow/NetArrow.java new file mode 100644 index 0000000..5d33e3d --- /dev/null +++ b/src/main/java/io/github/jhale1805/powerarrow/NetArrow.java @@ -0,0 +1,56 @@ +package io.github.jhale1805.powerarrow; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.inventory.ShapedRecipe; + +import io.github.jhale1805.util.Utilities; + +public class NetArrow extends PowerArrow { + + public NetArrow() { + super(); + } + + public NetArrow(int count) { + super(count); + } + + @Override + public String getName() { + return "net_arrow"; + } + + @Override + public String[] getUsageInstructions() { + return new String[]{"Sprays cobwebs", "where it lands."}; + } + + @Override + public ShapedRecipe getRecipe() { + ShapedRecipe recipe = new ShapedRecipe( + this.getRecipeKey(), + new NetArrow() + ); + recipe.shape("CCC", "CAC", "CCC"); + recipe.setIngredient('C', Material.COBWEB); + recipe.setIngredient('A', Material.ARROW); + return recipe; + } + + @Override + public Particle getTrailParticle() { + return Particle.SPIT; + } + + @Override + protected void onThisProjectileHit(ProjectileHitEvent event) { + Location impactLocation = Utilities.getImpactLocation(event); + if (impactLocation != null) { + Utilities.replaceAirWith(Material.COBWEB, impactLocation, 0.5); + } + } + +} diff --git a/src/main/java/io/github/jhale1805/powerarrow/PowerArrow.java b/src/main/java/io/github/jhale1805/powerarrow/PowerArrow.java index c9726d7..b266ed2 100644 --- a/src/main/java/io/github/jhale1805/powerarrow/PowerArrow.java +++ b/src/main/java/io/github/jhale1805/powerarrow/PowerArrow.java @@ -147,7 +147,7 @@ public abstract class PowerArrow extends ItemStack implements Listener { @EventHandler public void onPlayerAdvancementDone(PlayerAdvancementDoneEvent event) { - // Show the Torch Arrow in the recipe book upon completing the Enchanter advancement. + // Show the Power Arrow in the recipe book upon completing the Enchanter advancement. Advancement enchanter = Bukkit.getAdvancement(NamespacedKey.minecraft("story/enchant_item")); if (event.getAdvancement().equals(enchanter)) { event.getPlayer().discoverRecipe(this.getRecipeKey()); @@ -156,7 +156,7 @@ public abstract class PowerArrow extends ItemStack implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - // Show the Torch Arrow in the recipe book to those that have completed the Enchanter advancement. + // Show the Power Arrow in the recipe book to those that have completed the Enchanter advancement. Advancement enchanter = Bukkit.getAdvancement(NamespacedKey.minecraft("story/enchant_item")); if (event.getPlayer().getAdvancementProgress(enchanter).isDone()) { event.getPlayer().discoverRecipe(this.getRecipeKey()); diff --git a/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java b/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java index f91f441..229d03e 100644 --- a/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java +++ b/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java @@ -7,6 +7,7 @@ public class PowerArrowRegistry { private static PowerArrow[] powerArrows = { new ExplosiveArrow(), new ForestFireArrow(), + new NetArrow(), new TorchArrow(), }; diff --git a/src/main/java/io/github/jhale1805/powerrecipe/Cobweb.java b/src/main/java/io/github/jhale1805/powerrecipe/Cobweb.java new file mode 100644 index 0000000..b6a13cf --- /dev/null +++ b/src/main/java/io/github/jhale1805/powerrecipe/Cobweb.java @@ -0,0 +1,56 @@ +package io.github.jhale1805.powerrecipe; + +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerAdvancementDoneEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerRecipeDiscoverEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; + + +public class Cobweb extends PowerRecipe { + + + @Override + public String getName() { + return "cobweb"; + } + + public ShapedRecipe getRecipe() { + ShapedRecipe recipe = new ShapedRecipe( + this.getRecipeKey(), + new ItemStack(Material.COBWEB, 1) + ); + recipe.shape("SSS", "SBS", "SSS"); + recipe.setIngredient('S', Material.STRING); + recipe.setIngredient('B', Material.SLIME_BALL); + return recipe; + } + + @EventHandler + public void onPlayerDiscoverRecipe(PlayerRecipeDiscoverEvent event) { + // Show Cobweb in the recipe book upon discovering the slimeball. + if (event.getRecipe().equals(NamespacedKey.minecraft("slime_block"))) { + event.getPlayer().discoverRecipe(this.getRecipeKey()); + } + } + + @Override + @EventHandler + public void onPlayerAdvancementDone(PlayerAdvancementDoneEvent event) { + // Recipe discovery handled through a recipe discover event + // instead of an advancement completion. + } + + @Override + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + // Show Cobweb in the recipe book to those that have discovered the slimeball. + if (event.getPlayer().hasDiscoveredRecipe(NamespacedKey.minecraft("slime_block"))) { + event.getPlayer().discoverRecipe(this.getRecipeKey()); + } + } + +} diff --git a/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipe.java b/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipe.java new file mode 100644 index 0000000..2309fdc --- /dev/null +++ b/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipe.java @@ -0,0 +1,44 @@ +package io.github.jhale1805.powerrecipe; + +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.advancement.Advancement; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerAdvancementDoneEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ShapedRecipe; + +import io.github.jhale1805.PowerProjectilePlugin; + +public abstract class PowerRecipe implements Listener { + + public abstract String getName(); + + public abstract ShapedRecipe getRecipe(); + + public NamespacedKey getRecipeKey() { + return new NamespacedKey( + PowerProjectilePlugin.instance, + "recipe/" + this.getName() + ); + } + + @EventHandler + public void onPlayerAdvancementDone(PlayerAdvancementDoneEvent event) { + // Show the Power Recipe in the recipe book upon completing the Enchanter advancement. + Advancement enchanter = Bukkit.getAdvancement(NamespacedKey.minecraft("story/enchant_item")); + if (event.getAdvancement().equals(enchanter)) { + event.getPlayer().discoverRecipe(this.getRecipeKey()); + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + // Show the Power Recipe in the recipe book to those that have completed the Enchanter advancement. + Advancement enchanter = Bukkit.getAdvancement(NamespacedKey.minecraft("story/enchant_item")); + if (event.getPlayer().getAdvancementProgress(enchanter).isDone()) { + event.getPlayer().discoverRecipe(this.getRecipeKey()); + } + } +} diff --git a/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipeRegistry.java b/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipeRegistry.java new file mode 100644 index 0000000..283e90d --- /dev/null +++ b/src/main/java/io/github/jhale1805/powerrecipe/PowerRecipeRegistry.java @@ -0,0 +1,15 @@ +package io.github.jhale1805.powerrecipe; + +import java.util.Arrays; + +public class PowerRecipeRegistry { + + private static PowerRecipe[] powerRecipes = { + new Cobweb(), + }; + + public static PowerRecipe[] getPowerRecipes() { + return Arrays.copyOf(powerRecipes, powerRecipes.length); + } + +} diff --git a/src/main/java/io/github/jhale1805/util/Utilities.java b/src/main/java/io/github/jhale1805/util/Utilities.java index af3e47d..ef0dfd4 100644 --- a/src/main/java/io/github/jhale1805/util/Utilities.java +++ b/src/main/java/io/github/jhale1805/util/Utilities.java @@ -40,7 +40,7 @@ public class Utilities { public static Location getImpactLocation(ProjectileHitEvent event) { Location loc = null; if (event.getHitBlock() != null) { - loc = event.getHitBlock().getLocation(); + loc = event.getHitBlock().getRelative(event.getHitBlockFace()).getLocation(); } else if (event.getHitEntity() != null) { loc = event.getHitEntity().getLocation(); } @@ -70,7 +70,7 @@ public class Utilities { // Replace the blocks for (double dx = -radius; dx <= radius; dx++) { - for (double dy = 0; dy <= radius * 2 ; dy++) { + for (double dy = -radius; dy <= radius ; dy++) { for (double dz = -radius; dz <= radius; dz++) { Location toCheck = new Location( centerPoint.getWorld(), diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ffde158..a9c1b72 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,4 +1,4 @@ name: PowerProjectile main: io.github.jhale1805.PowerProjectilePlugin -version: 1.3.1 +version: 1.4.0 api-version: 1.16 \ No newline at end of file -- 2.51.2