UltimateStacker/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/ShearListeners.java

107 lines
4.3 KiB
Java
Raw Normal View History

2023-05-25 19:20:03 +02:00
package com.craftaro.ultimatestacker.listeners;
2018-11-06 04:33:10 +01:00
import com.craftaro.core.compatibility.ServerVersion;
2024-01-07 12:16:27 +01:00
import com.craftaro.third_party.com.cryptomorin.xseries.XMaterial;
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;
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;
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
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();
if (!stackManager.isStackedEntity(entity)) return;
2018-11-06 04:33:10 +01: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)
|| 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))
return;
2018-11-06 04:33:10 +01:00
2023-05-25 19:20:03 +02:00
EntityStack stack = stackManager.getStackedEntity(entity);
2020-08-25 01:01:11 +02: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();
}
private ItemStack getDrop(Entity entity) {
ItemStack itemStack = null;
switch (entity.getType()) {
case SHEEP:
2023-06-29 11:18:18 +02:00
itemStack = new ItemStack(XMaterial.WHITE_WOOL.parseMaterial());
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:
2023-06-29 11:18:18 +02:00
itemStack = new ItemStack(XMaterial.RED_MUSHROOM.parseMaterial(), 5);
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)
&& ((MushroomCow) entity).getVariant() == MushroomCow.Variant.BROWN)
2023-06-29 11:18:18 +02:00
itemStack.setType(XMaterial.BROWN_MUSHROOM.parseMaterial());
break;
}
return itemStack;
2018-11-06 04:33:10 +01:00
}
}