diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index f996d96..bf306d0 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -23,6 +23,7 @@ import me.ryanhamshire.GriefPrevention.events.ProtectDeathDropsEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.World.Environment; @@ -40,11 +41,14 @@ import org.bukkit.entity.Item; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Llama; +import org.bukkit.entity.Mob; import org.bukkit.entity.Monster; import org.bukkit.entity.Mule; +import org.bukkit.entity.Panda; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Rabbit; +import org.bukkit.entity.Slime; import org.bukkit.entity.Tameable; import org.bukkit.entity.ThrownPotion; import org.bukkit.entity.Vehicle; @@ -70,6 +74,7 @@ import org.bukkit.event.entity.EntityInteractEvent; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.bukkit.event.entity.EntityPortalExitEvent; import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.ExpBottleEvent; import org.bukkit.event.entity.ItemMergeEvent; import org.bukkit.event.entity.ItemSpawnEvent; @@ -83,6 +88,7 @@ import org.bukkit.event.weather.LightningStrikeEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; +import org.bukkit.persistence.PersistentDataType; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; @@ -102,11 +108,13 @@ public class EntityEventHandler implements Listener //convenience reference for the singleton datastore private DataStore dataStore; GriefPrevention instance; + private final NamespacedKey luredByPlayer; public EntityEventHandler(DataStore dataStore, GriefPrevention plugin) { this.dataStore = dataStore; instance = plugin; + luredByPlayer = new NamespacedKey(plugin, "lured_by_player"); } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) @@ -657,18 +665,41 @@ public class EntityEventHandler implements Listener if (entity instanceof Monster) return true; EntityType type = entity.getType(); - if (type == EntityType.GHAST || type == EntityType.MAGMA_CUBE || type == EntityType.SHULKER || type == EntityType.POLAR_BEAR) + if (type == EntityType.GHAST || type == EntityType.MAGMA_CUBE || type == EntityType.SHULKER) return true; + if (type == EntityType.SLIME) + return ((Slime) entity).getSize() > 0; + if (type == EntityType.RABBIT) - { - Rabbit rabbit = (Rabbit) entity; - if (rabbit.getRabbitType() == Rabbit.Type.THE_KILLER_BUNNY) return true; - } + return ((Rabbit) entity).getRabbitType() == Rabbit.Type.THE_KILLER_BUNNY; + + if (type == EntityType.PANDA) + return ((Panda) entity).getMainGene() == Panda.Gene.AGGRESSIVE; + + if (type == EntityType.HOGLIN || type == EntityType.POLAR_BEAR) + return !entity.getPersistentDataContainer().has(luredByPlayer, PersistentDataType.BYTE) && ((Mob) entity).getTarget() != null; return false; } + // Tag passive animals that can become aggressive so we can tell whether or not they are hostile later + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onEntityTarget(EntityTargetEvent event) + { + if (!GriefPrevention.instance.claimsEnabledForWorld(event.getEntity().getWorld())) return; + + EntityType entityType = event.getEntityType(); + if (entityType != EntityType.HOGLIN && entityType != EntityType.POLAR_BEAR) + return; + + if (event.getReason() == EntityTargetEvent.TargetReason.TEMPT) + event.getEntity().getPersistentDataContainer().set(luredByPlayer, PersistentDataType.BYTE, (byte) 1); + else + event.getEntity().getPersistentDataContainer().remove(luredByPlayer); + + } + //when an entity is damaged @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onEntityDamage(EntityDamageEvent event)