UltimateStacker/src/main/java/com/songoda/ultimatestacker/events/BlockListeners.java

147 lines
5.9 KiB
Java

package com.songoda.ultimatestacker.events;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
import com.songoda.ultimatestacker.utils.Methods;
import org.apache.commons.lang.math.NumberUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
public class BlockListeners implements Listener {
private final UltimateStacker instance;
public BlockListeners(UltimateStacker instance) {
this.instance = instance;
}
@EventHandler
public void onSpawnerInteract(PlayerInteractEvent event) {
Block block = event.getClickedBlock();
Player player = event.getPlayer();
ItemStack item = event.getPlayer().getInventory().getItemInHand();
if (block == null || item == null || block.getType() != Material.MOB_SPAWNER || item.getType() != Material.MOB_SPAWNER || event.getAction() == Action.LEFT_CLICK_BLOCK) return;
if (!instance.getConfig().getBoolean("Main.Stack Spawners")) return;
BlockStateMeta bsm = (BlockStateMeta) item.getItemMeta();
CreatureSpawner cs = (CreatureSpawner) bsm.getBlockState();
EntityType itemType = cs.getSpawnedType();
int itemAmount = getSpawnerAmount(item);
int specific = instance.getSpawnerFile().getConfig().getInt("Spawners." + cs.getSpawnedType().name() + ".Max Stack Size");
int maxStackSize = specific == -1 ? instance.getConfig().getInt("Spawners.Max Stack Size") : specific;
cs = (CreatureSpawner)block.getState();
EntityType blockType = cs.getSpawnedType();
event.setCancelled(true);
if (itemType == blockType) {
SpawnerStack stack = instance.getSpawnerStackManager().getSpawner(block);
if (player.isSneaking()) return;
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (stack.getAmount() == maxStackSize) return;
if ((stack.getAmount() + itemAmount) > maxStackSize) {
ItemStack newItem = Methods.getSpawnerItem(blockType, (stack.getAmount() + itemAmount) - maxStackSize);
if (player.getInventory().firstEmpty() == -1)
block.getLocation().getWorld().dropItemNaturally(block.getLocation().add(.5, 0, .5), newItem);
else
player.getInventory().addItem(newItem);
itemAmount = maxStackSize - stack.getAmount();
}
stack.setAmount(stack.getAmount() + itemAmount);
instance.getHologramHandler().updateHologram(stack);
Methods.takeItem(player, itemAmount);
}
}
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(instance, () -> instance.getHologramHandler().processChange(block), 10L);
}
@EventHandler
public void onSpawnerPlace(BlockPlaceEvent event) {
Block block = event.getBlock();
if (block == null || block.getType() != Material.MOB_SPAWNER) return;
if (!instance.getConfig().getBoolean("Main.Stack Spawners")) return;
SpawnerStack stack = instance.getSpawnerStackManager().addSpawner(new SpawnerStack(block.getLocation(), getSpawnerAmount(event.getItemInHand())));
instance.getHologramHandler().updateHologram(stack);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(instance, () -> instance.getHologramHandler().processChange(block), 1L);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (block.getType() != Material.MOB_SPAWNER) return;
if (!instance.getConfig().getBoolean("Main.Stack Spawners")) return;
CreatureSpawner cs = (CreatureSpawner)block.getState();
EntityType blockType = cs.getSpawnedType();
Player player = event.getPlayer();
ItemStack item = player.getInventory().getItemInHand();
SpawnerStack stack = instance.getSpawnerStackManager().getSpawner(block);
event.setCancelled(true);
int amt = 1;
if (player.isSneaking()) {
event.setCancelled(false);
amt = stack.getAmount();
instance.getHologramHandler().despawn(block);
instance.getSpawnerStackManager().removeSpawner(block.getLocation());
} else {
if (stack.getAmount() <= 1) {
event.setCancelled(false);
instance.getHologramHandler().despawn(block);
instance.getSpawnerStackManager().removeSpawner(block.getLocation());
} else {
stack.setAmount(stack.getAmount() - 1);
instance.getHologramHandler().updateHologram(stack);
}
}
if (item != null && (item.getEnchantments().containsKey(Enchantment.SILK_TOUCH) && player.hasPermission("ultimatestacker.spawner.silktouch") || player.hasPermission("ultimatestacker.spawner.nosilkdrop")))
block.getWorld().dropItemNaturally(block.getLocation(), Methods.getSpawnerItem(blockType, amt));
}
private int getSpawnerAmount(ItemStack item) {
if (!item.hasItemMeta() || !item.getItemMeta().hasDisplayName()) return 1;
if (item.getItemMeta().getDisplayName().contains(":")) {
int amt = NumberUtils.toInt(item.getItemMeta().getDisplayName().replace("\u00A7", "").split(":")[0], 1);
return amt == 0 ? 1 : amt;
}
return 1;
}
}