Add several hostile non-monsters (#927)

* Add a couple of new/missed hostile cases

* "Zoo" friendliness

* Prevent food attack vector for neutral animals
This commit is contained in:
Adam 2020-09-07 08:09:14 -04:00 committed by GitHub
parent 81cfc8f2d9
commit 766b34a970
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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