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);