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

162 lines
6.5 KiB
Java
Raw Normal View History

2018-11-06 04:33:10 +01:00
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();
2018-11-06 05:41:58 +01:00
ItemStack item = event.getPlayer().getInventory().getItemInHand();
2018-11-06 04:33:10 +01:00
2018-11-06 05:41:58 +01:00
if (block == null || item == null || block.getType() != Material.MOB_SPAWNER || item.getType() != Material.MOB_SPAWNER || event.getAction() == Action.LEFT_CLICK_BLOCK) return;
2018-11-06 04:33:10 +01:00
if (!instance.spawnersEnabled()) return;
2018-11-06 04:33:10 +01:00
BlockStateMeta bsm = (BlockStateMeta) item.getItemMeta();
CreatureSpawner cs = (CreatureSpawner) bsm.getBlockState();
EntityType itemType = cs.getSpawnedType();
int itemAmount = getSpawnerAmount(item);
2018-11-06 05:53:27 +01:00
int specific = instance.getSpawnerFile().getConfig().getInt("Spawners." + cs.getSpawnedType().name() + ".Max Stack Size");
2018-11-06 04:33:10 +01:00
int maxStackSize = specific == -1 ? instance.getConfig().getInt("Spawners.Max Stack Size") : specific;
2018-11-06 06:09:40 +01:00
cs = (CreatureSpawner) block.getState();
2018-11-06 04:33:10 +01:00
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);
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
instance.getHologram().update(stack);
2018-11-06 05:53:27 +01:00
Methods.takeItem(player, itemAmount);
2018-11-06 04:33:10 +01:00
}
}
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(instance, () -> instance.getHologram().processChange(block), 10L);
2018-11-06 04:33:10 +01:00
}
@EventHandler
public void onSpawnerPlace(BlockPlaceEvent event) {
Block block = event.getBlock();
2019-01-01 00:41:02 +01:00
if (!event.isCancelled()) {
if (block == null
|| block.getType() != Material.MOB_SPAWNER
|| !instance.spawnersEnabled())
return;
2018-11-06 04:33:10 +01:00
2019-01-01 00:41:02 +01:00
SpawnerStack stack = instance.getSpawnerStackManager().addSpawner(new SpawnerStack(block.getLocation(), getSpawnerAmount(event.getItemInHand())));
CreatureSpawner cs = (CreatureSpawner) block.getState();
CreatureSpawner cs2 = (CreatureSpawner) ((BlockStateMeta) event.getItemInHand().getItemMeta()).getBlockState();
cs.setSpawnedType(cs2.getSpawnedType());
cs.update();
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
instance.getHologram().add(stack);
2019-01-01 00:41:02 +01:00
}
2018-11-06 04:33:10 +01:00
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(instance, () -> instance.getHologram().processChange(block), 1L);
2018-11-06 04:33:10 +01:00
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
2018-11-06 05:41:58 +01:00
if (block.getType() != Material.MOB_SPAWNER) return;
2018-11-06 04:33:10 +01:00
if (!instance.spawnersEnabled()) return;
2018-11-06 04:33:10 +01:00
2018-11-06 06:09:40 +01:00
CreatureSpawner cs = (CreatureSpawner) block.getState();
2018-11-06 04:33:10 +01:00
EntityType blockType = cs.getSpawnedType();
Player player = event.getPlayer();
2018-11-06 05:41:58 +01:00
ItemStack item = player.getInventory().getItemInHand();
2018-11-06 04:33:10 +01:00
SpawnerStack stack = instance.getSpawnerStackManager().getSpawner(block);
event.setCancelled(true);
int amt = 1;
if (player.isSneaking()) {
event.setCancelled(false);
amt = stack.getAmount();
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
instance.getHologram().remove(stack);
2018-11-06 04:33:10 +01:00
instance.getSpawnerStackManager().removeSpawner(block.getLocation());
} else {
if (stack.getAmount() <= 1) {
event.setCancelled(false);
instance.getSpawnerStackManager().removeSpawner(block.getLocation());
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
instance.getHologram().remove(stack);
2018-11-06 04:33:10 +01:00
} else {
stack.setAmount(stack.getAmount() - 1);
2019-01-23 19:01:31 +01:00
if (instance.getHologram() != null)
instance.getHologram().update(stack);
2018-11-06 04:33:10 +01:00
}
}
2018-12-29 18:14:50 +01:00
if (player.hasPermission("ultimatestacker.spawner.nosilkdrop") || item != null && item.getEnchantments().containsKey(Enchantment.SILK_TOUCH) && player.hasPermission("ultimatestacker.spawner.silktouch"))
2018-11-06 04:33:10 +01:00
block.getWorld().dropItemNaturally(block.getLocation(), Methods.getSpawnerItem(blockType, amt));
}
2018-11-06 05:53:27 +01:00
private int getSpawnerAmount(ItemStack item) {
2018-11-06 04:33:10 +01:00
if (!item.hasItemMeta() || !item.getItemMeta().hasDisplayName()) return 1;
if (item.getItemMeta().getDisplayName().contains(":")) {
2018-11-06 05:53:27 +01:00
int amt = NumberUtils.toInt(item.getItemMeta().getDisplayName().replace("\u00A7", "").split(":")[0], 1);
return amt == 0 ? 1 : amt;
2018-11-06 04:33:10 +01:00
}
return 1;
}
}