diff --git a/.gitignore b/.gitignore index 3a271ad..98976f4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ bin .classpath .project .settings +.idea # Ignore plugin build tools spigot diff --git a/build.gradle b/build.gradle index bfa921a..abb2427 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ dependencies { } jar { - archiveVersion = '1.6.1' + archiveVersion = '1.7.0' } ////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java b/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java index 97ff394..1ae8a95 100644 --- a/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java +++ b/src/main/java/io/github/jhale1805/powerarrow/PowerArrowRegistry.java @@ -9,6 +9,7 @@ public class PowerArrowRegistry { new ForestFireArrow(), new NetArrow(), new SniperArrow(), + new SwapArrow(), new TeleportArrow(), new TorchArrow(), }; diff --git a/src/main/java/io/github/jhale1805/powerarrow/SwapArrow.java b/src/main/java/io/github/jhale1805/powerarrow/SwapArrow.java new file mode 100644 index 0000000..407a6cc --- /dev/null +++ b/src/main/java/io/github/jhale1805/powerarrow/SwapArrow.java @@ -0,0 +1,66 @@ +package io.github.jhale1805.powerarrow; + +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.ShapelessRecipe; + +import io.github.jhale1805.util.Utilities; + +public class SwapArrow extends PowerArrow { + + public static final int TELEPORT_DAMAGE = 5; // Standard Ender Pearl damage + + public SwapArrow() { + super(); + } + + public SwapArrow(int count) { + super(count); + } + + @Override + public String getName() { + return "swap_arrow"; + } + + @Override + public String[] getUsageInstructions() { + return new String[] {"Swaps your location", "with the hit target"}; + } + + @Override + public Recipe getRecipe() { + ShapelessRecipe recipe = new ShapelessRecipe( + this.getRecipeKey(), + new SwapArrow() + ); + recipe.addIngredient(2, Material.ENDER_PEARL) + .addIngredient(Material.ARROW); + return recipe; + } + + @Override + public Particle getTrailParticle() { + return Particle.PORTAL; + } + + @Override + protected void onThisProjectileHit(ProjectileHitEvent event) { + Entity hitEntity = event.getHitEntity(); + Player shooter = (Player) event.getEntity().getShooter(); + + if (hitEntity != null && hitEntity instanceof LivingEntity + && shooter != null) { + Utilities.swapEntityLocations(shooter, hitEntity); + shooter.damage(TELEPORT_DAMAGE); + ((LivingEntity) hitEntity).damage(TELEPORT_DAMAGE); + } + + } + +} diff --git a/src/main/java/io/github/jhale1805/powerarrow/TeleportArrow.java b/src/main/java/io/github/jhale1805/powerarrow/TeleportArrow.java index 047c704..5a6e5c8 100644 --- a/src/main/java/io/github/jhale1805/powerarrow/TeleportArrow.java +++ b/src/main/java/io/github/jhale1805/powerarrow/TeleportArrow.java @@ -3,14 +3,14 @@ package io.github.jhale1805.powerarrow; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapelessRecipe; public class TeleportArrow extends PowerArrow { + public static final int TELEPORT_DAMAGE = 5; // Standard Ender Pearl damage + public TeleportArrow() { super(); } @@ -55,9 +55,7 @@ public class TeleportArrow extends PowerArrow { 100 ); - // Calculate how much damage the player would receive from an Ender Pearl - EntityDamageEvent e = new EntityDamageEvent(shooter, DamageCause.FALL, 5); - shooter.damage(e.getFinalDamage()); + shooter.damage(TELEPORT_DAMAGE); } } diff --git a/src/main/java/io/github/jhale1805/util/Utilities.java b/src/main/java/io/github/jhale1805/util/Utilities.java index ef0dfd4..cfebfd6 100644 --- a/src/main/java/io/github/jhale1805/util/Utilities.java +++ b/src/main/java/io/github/jhale1805/util/Utilities.java @@ -4,6 +4,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; +import org.bukkit.entity.Entity; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.util.Vector; @@ -86,5 +87,20 @@ public class Utilities { } } } + + /** + * Swaps the location of the two given entities. + * + * @param e1 The entity to teleport to the position of e2. + * @param e2 The entity to teleport to the position of e1. + */ + public static void swapEntityLocations(Entity e1, Entity e2) { + if (e1 != null || e2 != null) { + Location loc1 = e1.getLocation(); + Location loc2 = e2.getLocation(); + e1.teleport(loc2); + e2.teleport(loc1); + } + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6aa7a51..743bcb0 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.6.1 +version: 1.7.0 api-version: 1.16 \ No newline at end of file diff --git a/src/test/java/io/github/jhale1805/powerarrow/SwapArrowTest.java b/src/test/java/io/github/jhale1805/powerarrow/SwapArrowTest.java new file mode 100644 index 0000000..7e80a04 --- /dev/null +++ b/src/test/java/io/github/jhale1805/powerarrow/SwapArrowTest.java @@ -0,0 +1,83 @@ +package io.github.jhale1805.powerarrow; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; +import io.github.jhale1805.PowerProjectilePlugin; +import io.github.jhale1805.util.Utilities; + +import org.junit.*; +import org.mockito.MockedStatic; + +import static org.mockito.Mockito.*; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.ProjectileHitEvent; + +public class SwapArrowTest { + + private static ServerMock mockServer; + + @BeforeClass + public static void setUpClass() { + mockServer = spy(new ServerMock()); // Fill in ServerMock's missing methods. + MockBukkit.mock(mockServer); + MockBukkit.load(PowerProjectilePlugin.class); + } + + @Before + public void setUp() { + + } + + @After + public void tearDown() { + + } + + @AfterClass + public static void tearDownClass() { + MockBukkit.unmock(); + } + + @Test + public void test_onThisProjectileHit_hitLivingEntity() { + // Setup mocks + ProjectileHitEvent mockEvent = mock(ProjectileHitEvent.class, RETURNS_DEEP_STUBS); + Player mockPlayer = mock(Player.class); + LivingEntity mockHitEntity = mock(LivingEntity.class); + when(mockEvent.getEntity().getShooter()).thenReturn(mockPlayer); + when(mockEvent.getHitEntity()).thenReturn(mockHitEntity); + try (MockedStatic mockUtils = mockStatic(Utilities.class)) { + // Execute test + new SwapArrow().onThisProjectileHit(mockEvent); + // Verify results + mockUtils.verify(() -> Utilities.swapEntityLocations(mockPlayer, mockHitEntity)); + } + verify(mockPlayer).damage(anyDouble()); + verify(mockHitEntity).damage(anyDouble()); + } + + @Test + public void test_onThisProjectileHit_hitNonLivingEntity() { + // Setup mocks + ProjectileHitEvent mockEvent = mock(ProjectileHitEvent.class, RETURNS_DEEP_STUBS); + Player mockPlayer = mock(Player.class); + Entity mockHitEntity = mock(Entity.class); + when(mockEvent.getHitEntity()).thenReturn(mockHitEntity); + when(mockEvent.getEntity().getShooter()).thenReturn(mockPlayer); + try (MockedStatic mockUtils = mockStatic(Utilities.class)) { + // Execute test + new SwapArrow().onThisProjectileHit(mockEvent); + // Verify results + mockUtils.verify(() -> + Utilities.swapEntityLocations( + any(Entity.class), + any(Entity.class) + ), never()); + } + verify(mockPlayer, never()).damage(anyDouble()); + } + +} \ No newline at end of file diff --git a/src/test/java/io/github/jhale1805/powerarrow/TeleportArrowTest.java b/src/test/java/io/github/jhale1805/powerarrow/TeleportArrowTest.java index def6989..bdd3a27 100644 --- a/src/test/java/io/github/jhale1805/powerarrow/TeleportArrowTest.java +++ b/src/test/java/io/github/jhale1805/powerarrow/TeleportArrowTest.java @@ -1,4 +1,3 @@ - package io.github.jhale1805.powerarrow; import be.seeseemelk.mockbukkit.MockBukkit;