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}
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();
+ }
+
+}