2023-05-25 19:20:03 +02:00
|
|
|
package com.craftaro.ultimatestacker.listeners;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2023-05-25 19:20:03 +02:00
|
|
|
import com.craftaro.ultimatestacker.UltimateStacker;
|
|
|
|
import com.craftaro.ultimatestacker.api.stack.entity.EntityStack;
|
|
|
|
import com.craftaro.ultimatestacker.settings.Settings;
|
|
|
|
import com.craftaro.ultimatestacker.stackable.entity.Split;
|
2023-06-11 13:14:56 +02:00
|
|
|
import com.craftaro.core.compatibility.CompatibleMaterial;
|
|
|
|
import com.craftaro.core.compatibility.ServerVersion;
|
2018-11-08 04:26:38 +01:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Material;
|
2020-09-01 20:44:39 +02:00
|
|
|
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;
|
2018-11-08 04:26:38 +01:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
|
|
|
import org.bukkit.inventory.ItemStack;
|
2018-12-17 19:32:57 +01:00
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
|
|
|
public class InteractListeners implements Listener {
|
|
|
|
|
2019-07-31 06:29:10 +02:00
|
|
|
private final UltimateStacker plugin;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2019-07-31 06:29:10 +02:00
|
|
|
public InteractListeners(UltimateStacker plugin) {
|
|
|
|
this.plugin = plugin;
|
2018-11-08 04:26:38 +01:00
|
|
|
}
|
|
|
|
|
2023-05-05 10:57:17 +02:00
|
|
|
@EventHandler
|
2018-11-08 04:26:38 +01:00
|
|
|
public void onInteract(PlayerInteractAtEntityEvent event) {
|
2019-06-06 05:26:16 +02:00
|
|
|
if (!(event.getRightClicked() instanceof LivingEntity)) return;
|
2018-11-08 04:26:38 +01:00
|
|
|
Player player = event.getPlayer();
|
2019-06-06 05:26:16 +02:00
|
|
|
LivingEntity entity = (LivingEntity)event.getRightClicked();
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2018-11-30 02:09:59 +01:00
|
|
|
ItemStack item = player.getInventory().getItemInHand();
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2023-02-04 14:48:13 +01:00
|
|
|
if (!plugin.getEntityStackManager().isStackedEntity(entity)) return;
|
2018-12-17 19:32:57 +01:00
|
|
|
|
|
|
|
if (item.getType() != Material.NAME_TAG && !correctFood(item, entity)) return;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2023-05-25 19:20:03 +02:00
|
|
|
EntityStack stack = plugin.getEntityStackManager().getStackedEntity(entity);
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2019-06-06 06:43:38 +02:00
|
|
|
if (stack.getAmount() <= 1
|
|
|
|
|| item.getType() == Material.NAME_TAG
|
2019-09-07 23:55:16 +02:00
|
|
|
&& Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.NAME_TAG)
|
2019-06-06 06:43:38 +02:00
|
|
|
|| item.getType() != Material.NAME_TAG
|
2019-09-07 23:55:16 +02:00
|
|
|
&& Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.ENTITY_BREED))
|
2019-06-06 06:43:38 +02:00
|
|
|
return;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2018-12-17 19:32:57 +01:00
|
|
|
if (item.getType() == Material.NAME_TAG)
|
|
|
|
event.setCancelled(true);
|
2019-05-09 23:46:24 +02:00
|
|
|
else if (entity instanceof Ageable && !((Ageable) entity).isAdult())
|
|
|
|
return;
|
2018-11-08 04:26:38 +01:00
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
stack.releaseHost();
|
2018-12-17 19:32:57 +01:00
|
|
|
|
|
|
|
if (item.getType() == Material.NAME_TAG) {
|
|
|
|
entity.setCustomName(item.getItemMeta().getDisplayName());
|
|
|
|
} else {
|
2019-05-09 23:46:24 +02:00
|
|
|
if (entity instanceof Ageable
|
|
|
|
&& !((Ageable) entity).isAdult()) {
|
|
|
|
return;
|
|
|
|
}
|
2019-07-31 06:29:10 +02:00
|
|
|
entity.setMetadata("inLove", new FixedMetadataValue(plugin, true));
|
2018-12-17 19:32:57 +01:00
|
|
|
|
2019-07-31 06:29:10 +02:00
|
|
|
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> {
|
2018-12-17 19:32:57 +01:00
|
|
|
if (entity.isDead()) return;
|
2019-07-31 06:29:10 +02:00
|
|
|
entity.removeMetadata("inLove", plugin);
|
2018-12-17 19:32:57 +01:00
|
|
|
}, 20 * 20);
|
|
|
|
}
|
2018-11-08 04:26:38 +01:00
|
|
|
}
|
2018-12-17 19:32:57 +01:00
|
|
|
|
|
|
|
private boolean correctFood(ItemStack is, Entity entity) {
|
|
|
|
Material type = is.getType();
|
2019-05-23 22:15:04 +02:00
|
|
|
switch (entity.getType().name()) {
|
|
|
|
case "COW":
|
2019-10-22 18:43:21 +02:00
|
|
|
case "MUSHROOM_COW":
|
2019-05-23 22:15:04 +02:00
|
|
|
case "SHEEP":
|
2018-12-17 19:32:57 +01:00
|
|
|
return type == Material.WHEAT;
|
2019-05-23 22:15:04 +02:00
|
|
|
case "PIG":
|
2019-09-03 22:38:00 +02:00
|
|
|
return type == Material.CARROT || (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9) && type == Material.BEETROOT) || type == Material.POTATO;
|
2019-05-23 22:15:04 +02:00
|
|
|
case "CHICKEN":
|
2019-09-09 18:08:04 +02:00
|
|
|
return type == CompatibleMaterial.WHEAT_SEEDS.getMaterial()
|
2018-12-17 19:32:57 +01:00
|
|
|
|| type == Material.MELON_SEEDS
|
2019-09-10 23:01:55 +02:00
|
|
|
|| type == Material.PUMPKIN_SEEDS
|
|
|
|
|| type == CompatibleMaterial.BEETROOT_SEEDS.getMaterial();
|
2019-05-23 22:15:04 +02:00
|
|
|
case "HORSE":
|
2018-12-17 20:20:22 +01:00
|
|
|
return (type == Material.GOLDEN_APPLE || type == Material.GOLDEN_CARROT) && ((Horse)entity).isTamed();
|
2019-05-23 22:15:04 +02:00
|
|
|
case "WOLF":
|
2019-09-09 18:08:04 +02:00
|
|
|
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)
|
2018-12-17 20:20:22 +01:00
|
|
|
&& ((Wolf) entity).isTamed();
|
2019-05-23 22:15:04 +02:00
|
|
|
case "OCELOT":
|
2019-09-03 22:38:00 +02:00
|
|
|
return (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)
|
|
|
|
? type == Material.SALMON
|
2019-05-23 22:15:04 +02:00
|
|
|
|| type == Material.COD
|
|
|
|
|| type == Material.PUFFERFISH
|
|
|
|
|| type == Material.TROPICAL_FISH
|
2019-09-09 18:08:04 +02:00
|
|
|
: type == CompatibleMaterial.COD.getMaterial()); // Now broken in 1.13 ((Ocelot) entity).isTamed()
|
2019-05-23 22:15:04 +02:00
|
|
|
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":
|
2018-12-17 19:32:57 +01:00
|
|
|
return type == Material.HAY_BLOCK;
|
2019-05-23 22:15:04 +02:00
|
|
|
case "TURTLE":
|
|
|
|
return type == Material.SEAGRASS;
|
2020-09-01 20:54:43 +02:00
|
|
|
default:
|
|
|
|
return false;
|
2018-12-17 19:32:57 +01:00
|
|
|
}
|
|
|
|
}
|
2019-05-23 22:15:04 +02:00
|
|
|
|
2018-11-08 04:26:38 +01:00
|
|
|
}
|