From e4ede61a2fb063f48ccaba766eeba29438234b1e Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 1 Feb 2024 19:16:23 -0800 Subject: [PATCH] Release 1.13 (#14) * Update pom.xml * Update to Minecraft 1.18 biome changes * Update pom.xml 1.13.0 * Update to latest Minecraft API * Added test class * Add distribution management section to POM --------- Co-authored-by: BONNe --- pom.xml | 162 +++++++++++++----- .../listeners/MobsSpawnListener.java | 27 +-- .../listeners/MobsSpawnListenerTest.java | 159 +++++++++++++++++ 3 files changed, 289 insertions(+), 59 deletions(-) create mode 100644 src/test/java/world/bentobox/extramobs/listeners/MobsSpawnListenerTest.java diff --git a/pom.xml b/pom.xml index 0b65d51..9d261cf 100644 --- a/pom.xml +++ b/pom.xml @@ -28,15 +28,26 @@ GitHub https://github.com/BentoBoxWorld/ExtraMobs/issues + + + + codemc-snapshots + https://repo.codemc.org/repository/maven-snapshots + + + codemc-releases + https://repo.codemc.org/repository/maven-releases + + UTF-8 UTF-8 - 1.8 - 1.7.4 + 17 + 2.0.9 - 1.18.1-R0.1-SNAPSHOT - 1.11.0 + 1.20.4-R0.1-SNAPSHOT + 2.0.0-SNAPSHOT ${build.version}-SNAPSHOT @@ -45,12 +56,16 @@ X.Y.Z -> BentoBox core version .M -> Addon development iteration. --> - 1.12 + 1.13 -LOCAL + + + ci @@ -60,10 +75,17 @@ -b${env.BUILD_NUMBER} - + + + + master @@ -74,28 +96,21 @@ ${build.version} - + - - - codemc-snapshots - https://repo.codemc.org/repository/maven-snapshots - - - codemc-releases - https://repo.codemc.org/repository/maven-releases - - - spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots + + codemc + https://repo.codemc.org/repository/maven-snapshots/ + codemc-repo https://repo.codemc.org/repository/maven-public/ @@ -103,16 +118,18 @@ + org.spigotmc spigot-api ${spigot.version} provided + org.mockito - mockito-all - 1.10.19 + mockito-core + 3.11.1 test @@ -123,7 +140,7 @@ org.powermock - powermock-api-mockito + powermock-api-mockito2 ${powermock.version} test @@ -136,9 +153,18 @@ + + + + + + ${project.name}-${revision}${build.number} clean package + src/main/resources @@ -152,6 +178,15 @@ *.yml + + src/main/resources/blueprints + ./blueprints + false + + *.blu + *.json + + @@ -163,20 +198,57 @@ org.apache.maven.plugins maven-resources-plugin 3.1.0 + + + blu + + org.apache.maven.plugins maven-compiler-plugin - 3.7.0 + 3.8.1 - ${java.version} - ${java.version} + ${java.version} org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + 3.1.2 + + + + ${argLine} + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.math=ALL-UNNAMED + --add-opens java.base/java.io=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens + java.base/java.util.stream=ALL-UNNAMED + --add-opens java.base/java.text=ALL-UNNAMED + --add-opens + java.base/java.util.regex=ALL-UNNAMED + --add-opens + java.base/java.nio.channels.spi=ALL-UNNAMED + --add-opens java.base/sun.nio.ch=ALL-UNNAMED + --add-opens java.base/java.net=ALL-UNNAMED + --add-opens + java.base/java.util.concurrent=ALL-UNNAMED + --add-opens java.base/sun.nio.fs=ALL-UNNAMED + --add-opens java.base/sun.nio.cs=ALL-UNNAMED + --add-opens java.base/java.nio.file=ALL-UNNAMED + --add-opens + java.base/java.nio.charset=ALL-UNNAMED + --add-opens + java.base/java.lang.reflect=ALL-UNNAMED + --add-opens + java.logging/java.util.logging=ALL-UNNAMED + --add-opens java.base/java.lang.ref=ALL-UNNAMED + --add-opens java.base/java.util.jar=ALL-UNNAMED + --add-opens java.base/java.util.zip=ALL-UNNAMED + + org.apache.maven.plugins @@ -186,15 +258,17 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.3.0 - public false -Xdoclint:none + + ${java.home}/bin/javadoc attach-javadocs + install jar @@ -214,22 +288,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - 3.1.1 - - true - - - - package - - shade - - - - org.apache.maven.plugins maven-install-plugin @@ -243,22 +301,34 @@ org.jacoco jacoco-maven-plugin - 0.8.1 + 0.8.10 true + + + **/*Names* + + org/bukkit/Material* + - pre-unit-test + prepare-agent prepare-agent - post-unit-test + report report + + + XML + + diff --git a/src/main/java/world/bentobox/extramobs/listeners/MobsSpawnListener.java b/src/main/java/world/bentobox/extramobs/listeners/MobsSpawnListener.java index 9e0deca..04e22d5 100644 --- a/src/main/java/world/bentobox/extramobs/listeners/MobsSpawnListener.java +++ b/src/main/java/world/bentobox/extramobs/listeners/MobsSpawnListener.java @@ -1,6 +1,9 @@ package world.bentobox.extramobs.listeners; +import java.util.Optional; +import java.util.Random; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -8,15 +11,13 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fish; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; import org.eclipse.jdt.annotation.NonNull; -import java.util.Optional; -import java.util.Random; - import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.extramobs.ExtraMobsAddon; @@ -59,23 +60,25 @@ public void onEntitySpawn(CreatureSpawnEvent event) this.addon.getPlugin().getIWM().getAddon(world); if (!optionalAddon.isPresent() || - !this.addon.getSettings().getDisabledGameModes().isEmpty() && + (!this.addon.getSettings().getDisabledGameModes().isEmpty() + && this.addon.getSettings().getDisabledGameModes().contains( - optionalAddon.get().getDescription().getName())) + optionalAddon.get().getDescription().getName()))) { // GameMode addon is not in enable list. return; } - - if ((event.getEntityType().name().equals("PIG_ZOMBIE") || - event.getEntityType().name().equals("ZOMBIFIED_PIGLIN")) && - this.addon.getPlugin().getIWM().isIslandNether(world)) + if ((event.getEntityType().equals(EntityType.ZOMBIFIED_PIGLIN) + || event.getEntityType().equals(EntityType.PIGLIN)) + && this.addon.getPlugin().getIWM().isIslandNether(world)) { + // replace pigmen with blaze or wither if (this.isSuitableNetherLocation(event.getLocation())) { + if (this.spawningRandom.nextDouble() < this.addon.getSettings().getWitherSkeletonChance()) { // oOo wither skeleton got lucky. @@ -104,11 +107,9 @@ else if (event.getEntityType() == EntityType.ENDERMAN && } } } - else if (world.getEnvironment() == World.Environment.NORMAL && - (event.getEntityType() == EntityType.COD || - event.getEntityType() == EntityType.SALMON || - event.getEntityType() == EntityType.TROPICAL_FISH)) + else if (world.getEnvironment() == World.Environment.NORMAL && event.getEntity() instanceof Fish) { + // Check biome Biome biome = world.getBiome( event.getLocation().getBlockX(), diff --git a/src/test/java/world/bentobox/extramobs/listeners/MobsSpawnListenerTest.java b/src/test/java/world/bentobox/extramobs/listeners/MobsSpawnListenerTest.java new file mode 100644 index 0000000..d5de2d3 --- /dev/null +++ b/src/test/java/world/bentobox/extramobs/listeners/MobsSpawnListenerTest.java @@ -0,0 +1,159 @@ +package world.bentobox.extramobs.listeners; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Optional; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fish; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.eclipse.jdt.annotation.NonNull; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.modules.junit4.PowerMockRunner; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.AddonDescription; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.extramobs.ExtraMobsAddon; +import world.bentobox.extramobs.config.Settings; + +@RunWith(PowerMockRunner.class) +public class MobsSpawnListenerTest { + + @Mock + private ExtraMobsAddon addon; + + @Mock + private CreatureSpawnEvent event; + + @Mock + private World world; + + private MobsSpawnListener listener; + + private Settings settings; + + @Mock + private BentoBox plugin; + + @Mock + private IslandWorldManager iwm; + + @Mock + private GameModeAddon gma; + + @Mock + private Location location; + + @Mock + private Block block; + + @Before + public void setUp() { + settings = new Settings(); + when(addon.getSettings()).thenReturn(settings); + + when(addon.getPlugin()).thenReturn(plugin); + + when(plugin.getIWM()).thenReturn(iwm); + + when(iwm.getAddon(world)).thenReturn(Optional.of(gma)); + + when(iwm.isIslandEnd(world)).thenReturn(true); + when(iwm.isIslandNether(world)).thenReturn(true); + + @NonNull + AddonDescription desc = new AddonDescription.Builder("main", "bskyblock", "1.0.0").build(); + + when(gma.getDescription()).thenReturn(desc); + + // Location + when(location.getBlock()).thenReturn(block); + when(location.getWorld()).thenReturn(world); + + when(block.getRelative(any())).thenReturn(block); + + when(block.getType()).thenReturn(Material.STONE); + + // Initialize mocks and the class to test + listener = new MobsSpawnListener(addon); + } + + // Test case for natural spawning of Zombified Piglin in the Nether + @Test + public void testNaturalSpawnZombifiedPiglinNether() { + when(event.getEntityType()).thenReturn(EntityType.ZOMBIFIED_PIGLIN); + when(event.getSpawnReason()).thenReturn(CreatureSpawnEvent.SpawnReason.NATURAL); + when(event.getLocation()).thenReturn(location); + when(world.getEnvironment()).thenReturn(World.Environment.NETHER); + when(addon.getPlugin().getIWM().isIslandNether(world)).thenReturn(true); + settings.setWitherSkeletonChance(1.1); // Set so that it will always spawn + when(block.getType()).thenReturn(Material.NETHER_BRICKS); + + listener.onEntitySpawn(event); + + verify(event).setCancelled(true); + // Additional verifications can be added to check if the correct entity was spawned + } + + // Test case for natural spawning of Enderman in the End + @Test + public void testNaturalSpawnEndermanEnd() { + when(event.getEntityType()).thenReturn(EntityType.ENDERMAN); + when(event.getSpawnReason()).thenReturn(CreatureSpawnEvent.SpawnReason.NATURAL); + when(event.getLocation()).thenReturn(location); + when(world.getEnvironment()).thenReturn(World.Environment.THE_END); + when(addon.getPlugin().getIWM().isIslandEnd(world)).thenReturn(true); + settings.setShulkerChance(1.1); // Set so that it will always spawn + when(block.getType()).thenReturn(Material.PURPUR_BLOCK); + + listener.onEntitySpawn(event); + + verify(event).setCancelled(true); + // Additional verifications can be added to check if the correct entity was spawned + } + + // Test case for spawning of Fish in Deep Ocean biome + @Test + public void testFishSpawnDeepOcean() { + Fish fish = mock(Fish.class); + when(event.getEntity()).thenReturn(fish); + when(event.getEntityType()).thenReturn(EntityType.TROPICAL_FISH); + when(event.getSpawnReason()).thenReturn(CreatureSpawnEvent.SpawnReason.NATURAL); + when(event.getLocation()).thenReturn(location); + when(world.getEnvironment()).thenReturn(World.Environment.NORMAL); + when(world.getBiome(anyInt(), anyInt(), anyInt())).thenReturn(Biome.DEEP_OCEAN); + settings.setGuardianChance(1.1); // Set so that it will always spawn + when(block.getType()).thenReturn(Material.WATER, Material.WATER, Material.WATER, Material.PRISMARINE); + + listener.onEntitySpawn(event); + + verify(event).setCancelled(true); + // Additional verifications for guardian spawning + } + + // Test case for non-natural spawning + @Test + public void testNonNaturalSpawn() { + when(event.getSpawnReason()).thenReturn(CreatureSpawnEvent.SpawnReason.SPAWNER); + + listener.onEntitySpawn(event); + + verify(event, never()).isCancelled(); + } + +}