diff --git a/pom.xml b/pom.xml
index 3faadd738..e57c79c43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -75,7 +75,7 @@
-LOCAL
- 3.9.1
+ 3.9.2
bentobox-world
https://sonarcloud.io
${project.basedir}/lib
diff --git a/src/main/java/world/bentobox/bentobox/nms/AbstractMetaData.java b/src/main/java/world/bentobox/bentobox/nms/AbstractMetaData.java
index 6152e206f..4c1da7dad 100644
--- a/src/main/java/world/bentobox/bentobox/nms/AbstractMetaData.java
+++ b/src/main/java/world/bentobox/bentobox/nms/AbstractMetaData.java
@@ -8,6 +8,7 @@
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.protocol.game.PacketPlayOutTileEntityData;
import net.minecraft.world.level.block.entity.TileEntity;
+import world.bentobox.bentobox.BentoBox;
public abstract class AbstractMetaData {
@@ -33,7 +34,7 @@ protected String getData(TileEntity te, String method, String field) {
// object.getClass().getCanonicalName() + " is not a PacketPlayOutTileEntityData");
//}
} catch (Exception e) {
- System.out.println("The method '" + method + "' does not exist in the TileEntity class.");
+ BentoBox.getInstance().logError("The method '" + method + "' does not exist in the TileEntity class.");
e.printStackTrace();
}
return "";
diff --git a/src/main/java/world/bentobox/bentobox/util/Util.java b/src/main/java/world/bentobox/bentobox/util/Util.java
index 9a3e45c16..795334366 100644
--- a/src/main/java/world/bentobox/bentobox/util/Util.java
+++ b/src/main/java/world/bentobox/bentobox/util/Util.java
@@ -34,6 +34,7 @@
import org.bukkit.entity.CopperGolem;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
import org.bukkit.entity.Flying;
import org.bukkit.entity.IronGolem;
import org.bukkit.entity.Monster;
@@ -361,19 +362,25 @@ public static boolean isHostileEntity(Entity entity) {
* @since 1.4.0
*/
public static boolean isPassiveEntity(Entity entity) {
- // IronGolem and Snowman extends Golem, but Shulker also extends Golem
- // Fishes, Dolphin and Squid extends WaterMob | Excludes PufferFish
- // Bat extends Mob
- // Most of passive mobs extends Animals
- boolean copperGolem = false;
- try {
- copperGolem = entity instanceof CopperGolem;
- } catch (Exception ex) {
- copperGolem = false;
+ if (entity == null || entity.getType() == null) {
+ return true;
}
- return entity instanceof Animals || entity instanceof IronGolem || entity instanceof Snowman ||
- entity instanceof WaterMob && !(entity instanceof PufferFish) || entity instanceof Bat ||
- entity instanceof Allay || copperGolem;
+ // Check built-in class hierarchy for common passive mobs
+ boolean isPassiveByClass = entity instanceof Animals
+ || entity instanceof IronGolem
+ || entity instanceof Snowman
+ || entity instanceof Bat
+ || entity instanceof Allay;
+
+ // Check WaterMob hierarchy, excluding PufferFish (hostile)
+ boolean isPassiveWaterMob = entity instanceof WaterMob && !(entity instanceof PufferFish);
+
+ // Check for newer entity types by their enum name (String comparison is safe across versions)
+ boolean isCopperGolem = entity.getType().name().equals("COPPER_GOLEM");
+ // And the sniffer
+ boolean isSniffer = entity.getType().name().equals("SNIFFER");
+
+ return isPassiveByClass || isPassiveWaterMob || isCopperGolem || isSniffer;
}
public static boolean isTamableEntity(Entity entity) {
diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/protection/HurtingListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/protection/HurtingListenerTest.java
index cca7a3f69..216407506 100644
--- a/src/test/java/world/bentobox/bentobox/listeners/flags/protection/HurtingListenerTest.java
+++ b/src/test/java/world/bentobox/bentobox/listeners/flags/protection/HurtingListenerTest.java
@@ -26,6 +26,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@@ -68,6 +69,7 @@ public void setUp() throws Exception {
// Utils
when(Util.isPassiveEntity(any())).thenCallRealMethod();
when(Util.isHostileEntity(any())).thenCallRealMethod();
+ when(Util.isTamableEntity(any())).thenCallRealMethod();
// User & player
user = User.getInstance(mockPlayer);
@@ -93,6 +95,7 @@ public void testOnEntityDamagePlayeronMonster() {
HurtingListener hl = new HurtingListener();
hl.onEntityDamage(e);
assertTrue(e.isCancelled());
+
verify(notifier).notify(user, "protection.protected");
}
@@ -121,7 +124,7 @@ public void testOnFishingDisallowArmorStandCatching() {
HurtingListener hl = new HurtingListener();
hl.onFishing(e);
// Verify
- verify(notifier).notify(user, "protection.protected");
+ verify(notifier, Mockito.atLeastOnce()).notify(user, "protection.protected");
}
/**
@@ -185,7 +188,7 @@ public void testOnFishingDisallowMonsterCatching() {
HurtingListener hl = new HurtingListener();
hl.onFishing(e);
// Verify
- verify(notifier).notify(user, "protection.protected");
+ verify(notifier, Mockito.atLeastOnce()).notify(user, "protection.protected");
}
/**
diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java
index 44ffba2fd..f808b90cb 100644
--- a/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java
+++ b/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java
@@ -149,15 +149,6 @@ public void tearDown() {
Mockito.framework().clearInlineMocks();
}
- @Test
- public void testNotLoaded() {
- when(plugin.isLoaded()).thenReturn(false);
- CreatureSpawnEvent e = new CreatureSpawnEvent(livingEntity, SpawnReason.NATURAL);
- MobSpawnListener l = new MobSpawnListener();
- l.onMobSpawn(e);
- assertFalse(e.isCancelled());
- }
-
@Test
public void testNotInWorld() {
when(iwm.inWorld(any(Location.class))).thenReturn(false);