package com.songoda.ultimatestacker.listeners; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.ServerVersion; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.settings.Settings; import com.songoda.ultimatestacker.stackable.entity.EntityStack; import com.songoda.ultimatestacker.stackable.entity.Split; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Ageable; import org.bukkit.entity.Cat; import org.bukkit.entity.Entity; import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; public class InteractListeners implements Listener { private final UltimateStacker plugin; public InteractListeners(UltimateStacker plugin) { this.plugin = plugin; } @EventHandler public void onInteract(PlayerInteractAtEntityEvent event) { if (!(event.getRightClicked() instanceof LivingEntity)) return; Player player = event.getPlayer(); LivingEntity entity = (LivingEntity)event.getRightClicked(); ItemStack item = player.getInventory().getItemInHand(); if (!plugin.getEntityStackManager().isStackedEntity(entity)) return; if (item.getType() != Material.NAME_TAG && !correctFood(item, entity)) return; EntityStack stack = plugin.getEntityStackManager().getStack(entity); if (stack.getAmount() <= 1 || item.getType() == Material.NAME_TAG && Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.NAME_TAG) || item.getType() != Material.NAME_TAG && Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.ENTITY_BREED)) return; if (item.getType() == Material.NAME_TAG) event.setCancelled(true); else if (entity instanceof Ageable && !((Ageable) entity).isAdult()) return; stack.releaseHost(); if (item.getType() == Material.NAME_TAG) { entity.setCustomName(item.getItemMeta().getDisplayName()); } else { if (entity instanceof Ageable && !((Ageable) entity).isAdult()) { return; } entity.setMetadata("inLove", new FixedMetadataValue(plugin, true)); Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> { if (entity.isDead()) return; entity.removeMetadata("inLove", plugin); }, 20 * 20); } } private boolean correctFood(ItemStack is, Entity entity) { Material type = is.getType(); switch (entity.getType().name()) { case "COW": case "MUSHROOM_COW": case "SHEEP": return type == Material.WHEAT; case "PIG": return type == Material.CARROT || (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9) && type == Material.BEETROOT) || type == Material.POTATO; case "CHICKEN": return type == CompatibleMaterial.WHEAT_SEEDS.getMaterial() || type == Material.MELON_SEEDS || type == Material.PUMPKIN_SEEDS || type == CompatibleMaterial.BEETROOT_SEEDS.getMaterial(); case "HORSE": return (type == Material.GOLDEN_APPLE || type == Material.GOLDEN_CARROT) && ((Horse)entity).isTamed(); case "WOLF": return type == CompatibleMaterial.BEEF.getMaterial() || type == CompatibleMaterial.CHICKEN.getMaterial() || type == CompatibleMaterial.COD.getMaterial() || type == CompatibleMaterial.MUTTON.getMaterial() || type == CompatibleMaterial.PORKCHOP.getMaterial() || type == CompatibleMaterial.RABBIT.getMaterial() || CompatibleMaterial.SALMON.matches(is) || type == CompatibleMaterial.COOKED_BEEF.getMaterial() || type == CompatibleMaterial.COOKED_CHICKEN.getMaterial() || type == CompatibleMaterial.COOKED_COD.getMaterial() || type == CompatibleMaterial.COOKED_MUTTON.getMaterial() || type == CompatibleMaterial.COOKED_PORKCHOP.getMaterial() || type == CompatibleMaterial.COOKED_RABBIT.getMaterial() || CompatibleMaterial.COOKED_SALMON.matches(is) && ((Wolf) entity).isTamed(); case "OCELOT": return (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13) ? type == Material.SALMON || type == Material.COD || type == Material.PUFFERFISH || type == Material.TROPICAL_FISH : type == CompatibleMaterial.COD.getMaterial()); // Now broken in 1.13 ((Ocelot) entity).isTamed() case "PANDA": return (type == Material.BAMBOO); case "FOX": return type == Material.SWEET_BERRIES; case "CAT": return (type == Material.COD || type == Material.SALMON) && ((Cat) entity).isTamed(); case "RABBIT": return type == Material.CARROT || type == Material.GOLDEN_CARROT || type == Material.DANDELION; case "LLAMA": return type == Material.HAY_BLOCK; case "TURTLE": return type == Material.SEAGRASS; default: return false; } } }