2023-05-25 19:20:03 +02:00
|
|
|
package com.craftaro.ultimatestacker.listeners;
|
2018-11-06 04:33:10 +01:00
|
|
|
|
2023-05-30 11:21:46 +02:00
|
|
|
import com.craftaro.ultimatestacker.UltimateStacker;
|
2023-05-25 19:20:03 +02:00
|
|
|
import com.craftaro.ultimatestacker.api.stack.entity.EntityStack;
|
|
|
|
import com.craftaro.ultimatestacker.api.stack.entity.EntityStackManager;
|
|
|
|
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;
|
2020-02-02 17:11:50 +01:00
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.World;
|
2020-09-01 20:44:39 +02:00
|
|
|
import org.bukkit.entity.Entity;
|
|
|
|
import org.bukkit.entity.EntityType;
|
|
|
|
import org.bukkit.entity.LivingEntity;
|
|
|
|
import org.bukkit.entity.MushroomCow;
|
|
|
|
import org.bukkit.entity.Sheep;
|
2018-11-06 04:33:10 +01:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.event.player.PlayerShearEntityEvent;
|
2020-02-02 17:11:50 +01:00
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
|
|
|
|
import java.util.Random;
|
2018-11-06 04:33:10 +01:00
|
|
|
|
|
|
|
public class ShearListeners implements Listener {
|
|
|
|
|
2020-09-01 20:54:43 +02:00
|
|
|
private final UltimateStacker plugin;
|
2018-11-06 04:33:10 +01:00
|
|
|
|
2019-07-31 06:29:10 +02:00
|
|
|
public ShearListeners(UltimateStacker plugin) {
|
|
|
|
this.plugin = plugin;
|
2018-11-06 04:33:10 +01:00
|
|
|
}
|
|
|
|
|
2023-05-05 10:57:17 +02:00
|
|
|
@EventHandler
|
2019-06-06 06:43:38 +02:00
|
|
|
public void onShear(PlayerShearEntityEvent event) {
|
2020-08-25 01:01:11 +02:00
|
|
|
LivingEntity entity = (LivingEntity)event.getEntity();
|
2018-11-06 04:33:10 +01:00
|
|
|
|
2019-09-22 22:17:19 +02:00
|
|
|
if (entity.getType() != EntityType.SHEEP
|
|
|
|
&& entity.getType() != EntityType.MUSHROOM_COW
|
|
|
|
&& entity.getType() != EntityType.SNOWMAN) return;
|
2019-07-31 06:29:10 +02:00
|
|
|
EntityStackManager stackManager = plugin.getEntityStackManager();
|
2023-02-04 14:48:13 +01:00
|
|
|
if (!stackManager.isStackedEntity(entity)) return;
|
2018-11-06 04:33:10 +01:00
|
|
|
|
2019-06-06 06:43:38 +02:00
|
|
|
if (event.getEntity().getType() == EntityType.SHEEP
|
2019-09-07 23:55:16 +02:00
|
|
|
&& Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.SHEEP_SHEAR)
|
2019-06-06 06:43:38 +02:00
|
|
|
|| event.getEntity().getType() == EntityType.MUSHROOM_COW
|
2019-09-22 22:17:19 +02:00
|
|
|
&& Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.MUSHROOM_SHEAR)
|
|
|
|
|| event.getEntity().getType() == EntityType.SNOWMAN
|
|
|
|
&& Settings.SPLIT_CHECKS.getStringList().stream().noneMatch(line -> Split.valueOf(line) == Split.SNOWMAN_DERP))
|
2019-06-06 06:43:38 +02:00
|
|
|
return;
|
2018-11-06 04:33:10 +01:00
|
|
|
|
2020-02-02 17:11:50 +01:00
|
|
|
|
2023-05-25 19:20:03 +02:00
|
|
|
EntityStack stack = stackManager.getStackedEntity(entity);
|
2020-08-25 01:01:11 +02:00
|
|
|
|
2020-02-02 17:11:50 +01:00
|
|
|
if (Settings.SHEAR_IN_ONE_CLICK.getBoolean()) {
|
|
|
|
World world = entity.getLocation().getWorld();
|
|
|
|
int amount = stack.getAmount() - 1;
|
|
|
|
ItemStack item = getDrop(entity);
|
|
|
|
if (item == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int amountToDrop = 0;
|
|
|
|
|
|
|
|
if (entity.getType() == EntityType.SHEEP) {
|
|
|
|
for (int i = 0; i < amount; i++) {
|
|
|
|
amountToDrop += new Random().nextInt(2) + 1;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
amountToDrop = item.getAmount() * amount;
|
|
|
|
|
|
|
|
int fullStacks = (int) Math.floor(amountToDrop / 64);
|
|
|
|
int nonStack = amountToDrop - (fullStacks * 64);
|
|
|
|
|
|
|
|
for (int i = 0; i < fullStacks; i++) {
|
|
|
|
ItemStack clone = item.clone();
|
|
|
|
clone.setAmount(64);
|
|
|
|
world.dropItemNaturally(entity.getLocation(), clone);
|
|
|
|
}
|
|
|
|
if (nonStack != 0) {
|
|
|
|
ItemStack clone = item.clone();
|
|
|
|
clone.setAmount(nonStack);
|
|
|
|
world.dropItemNaturally(entity.getLocation(), clone);
|
|
|
|
}
|
|
|
|
} else
|
2020-08-25 01:01:11 +02:00
|
|
|
stack.releaseHost();
|
2020-02-02 17:11:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private ItemStack getDrop(Entity entity) {
|
|
|
|
ItemStack itemStack = null;
|
|
|
|
|
|
|
|
switch (entity.getType()) {
|
|
|
|
case SHEEP:
|
|
|
|
itemStack = new ItemStack(CompatibleMaterial.WHITE_WOOL.getMaterial());
|
|
|
|
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13))
|
|
|
|
itemStack.setType(Material.valueOf(((Sheep) entity).getColor() + "_WOOL"));
|
|
|
|
else
|
|
|
|
itemStack.setDurability((short) ((Sheep) entity).getColor().getWoolData());
|
|
|
|
break;
|
|
|
|
case MUSHROOM_COW:
|
|
|
|
itemStack = new ItemStack(CompatibleMaterial.RED_MUSHROOM.getMaterial(), 5);
|
|
|
|
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)
|
|
|
|
&& ((MushroomCow) entity).getVariant() == MushroomCow.Variant.BROWN)
|
|
|
|
itemStack.setType(CompatibleMaterial.BROWN_MUSHROOM.getMaterial());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return itemStack;
|
2018-11-06 04:33:10 +01:00
|
|
|
}
|
|
|
|
}
|