2019-07-17 14:56:50 +02:00
|
|
|
package com.songoda.ultimatestacker.listeners;
|
|
|
|
|
2019-09-03 22:38:00 +02:00
|
|
|
import com.songoda.core.compatibility.ServerVersion;
|
2020-04-23 12:09:54 +02:00
|
|
|
import com.songoda.core.nms.NmsManager;
|
2019-07-17 14:56:50 +02:00
|
|
|
import com.songoda.ultimatestacker.UltimateStacker;
|
2019-09-07 23:55:16 +02:00
|
|
|
import com.songoda.ultimatestacker.settings.Settings;
|
2020-09-01 20:13:53 +02:00
|
|
|
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
|
2020-08-25 01:01:11 +02:00
|
|
|
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
|
|
|
|
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStackManager;
|
2019-08-10 19:10:58 +02:00
|
|
|
import com.songoda.ultimatestacker.utils.Methods;
|
2020-09-01 20:54:43 +02:00
|
|
|
import com.songoda.ultimatestacker.utils.ReflectionUtil;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.GameMode;
|
2019-08-10 16:03:40 +02:00
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.block.Block;
|
2019-08-10 19:52:50 +02:00
|
|
|
import org.bukkit.block.CreatureSpawner;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.entity.EntityType;
|
2019-07-17 14:56:50 +02:00
|
|
|
import org.bukkit.entity.LivingEntity;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.entity.Player;
|
2019-07-17 14:56:50 +02:00
|
|
|
import org.bukkit.event.EventHandler;
|
2019-08-10 16:03:40 +02:00
|
|
|
import org.bukkit.event.EventPriority;
|
2019-07-17 14:56:50 +02:00
|
|
|
import org.bukkit.event.Listener;
|
2019-08-10 16:03:40 +02:00
|
|
|
import org.bukkit.event.block.Action;
|
2019-07-17 14:56:50 +02:00
|
|
|
import org.bukkit.event.entity.SpawnerSpawnEvent;
|
2019-08-10 16:03:40 +02:00
|
|
|
import org.bukkit.event.player.PlayerInteractEvent;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.material.SpawnEgg;
|
2019-07-17 14:56:50 +02:00
|
|
|
|
|
|
|
public class SpawnerListeners implements Listener {
|
|
|
|
|
2019-07-31 21:47:01 +02:00
|
|
|
private final UltimateStacker plugin;
|
2019-07-17 14:56:50 +02:00
|
|
|
|
2019-07-31 21:47:01 +02:00
|
|
|
public SpawnerListeners(UltimateStacker plugin) {
|
|
|
|
this.plugin = plugin;
|
2019-07-17 14:56:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onSpawn(SpawnerSpawnEvent event) {
|
2019-09-07 23:55:16 +02:00
|
|
|
if (!Settings.STACK_ENTITIES.getBoolean()
|
2019-07-31 21:47:01 +02:00
|
|
|
|| !plugin.spawnersEnabled()
|
|
|
|
|| plugin.getStackingTask().isWorldDisabled(event.getLocation().getWorld())) return;
|
|
|
|
SpawnerStackManager spawnerStackManager = plugin.getSpawnerStackManager();
|
2019-07-17 14:56:50 +02:00
|
|
|
if (!spawnerStackManager.isSpawner(event.getSpawner().getLocation())) return;
|
|
|
|
|
|
|
|
SpawnerStack spawnerStack = spawnerStackManager.getSpawner(event.getSpawner().getLocation());
|
|
|
|
|
2020-08-05 23:05:57 +02:00
|
|
|
spawnerStack.initialize();
|
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
EntityStack stack = plugin.getEntityStackManager().addStack((LivingEntity)event.getEntity());
|
|
|
|
stack.createDuplicates(spawnerStack.calculateSpawnCount());
|
|
|
|
stack.updateStack();
|
2019-07-17 14:56:50 +02:00
|
|
|
|
2019-07-31 21:47:01 +02:00
|
|
|
plugin.getStackingTask().attemptSplit(stack, (LivingEntity) event.getEntity());
|
2019-07-17 14:56:50 +02:00
|
|
|
}
|
2019-08-10 16:03:40 +02:00
|
|
|
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
|
|
public void PlayerInteractEventEgg(PlayerInteractEvent event) {
|
|
|
|
if (!plugin.spawnersEnabled()
|
|
|
|
|| !event.getAction().equals(Action.RIGHT_CLICK_BLOCK))
|
|
|
|
return;
|
|
|
|
|
2019-08-11 19:35:06 +02:00
|
|
|
if (event.getItem() == null)
|
2019-08-10 19:52:50 +02:00
|
|
|
return;
|
2019-08-10 16:03:40 +02:00
|
|
|
|
2019-08-10 19:10:58 +02:00
|
|
|
Material itemType = event.getItem().getType();
|
2019-08-10 16:03:40 +02:00
|
|
|
Block block = event.getClickedBlock();
|
2019-08-10 19:10:58 +02:00
|
|
|
Player player = event.getPlayer();
|
2019-08-10 16:03:40 +02:00
|
|
|
|
2019-08-10 19:10:58 +02:00
|
|
|
if (block == null || itemType == Material.AIR) return;
|
|
|
|
|
2019-09-03 22:38:00 +02:00
|
|
|
if (block.getType() != (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))
|
|
|
|
|| !itemType.toString().contains(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13) ? "SPAWN_EGG" : "MONSTER_EGG"))
|
2019-08-10 16:03:40 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
event.setCancelled(true);
|
|
|
|
|
2019-09-07 23:55:16 +02:00
|
|
|
if (!Settings.EGGS_CONVERT_SPAWNERS.getBoolean()
|
2020-04-23 12:09:54 +02:00
|
|
|
|| (event.getItem().hasItemMeta() && event.getItem().getItemMeta().hasDisplayName()
|
|
|
|
&& !NmsManager.getNbt().of(event.getItem()).has("UC"))) {
|
2019-08-10 19:52:50 +02:00
|
|
|
return;
|
2019-08-10 19:10:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
SpawnerStackManager manager = plugin.getSpawnerStackManager();
|
|
|
|
|
|
|
|
SpawnerStack spawner = manager.isSpawner(block.getLocation())
|
|
|
|
? manager.getSpawner(block) : manager.addSpawner(new SpawnerStack(block.getLocation(), 1));
|
|
|
|
|
|
|
|
int stackSize = spawner.getAmount();
|
|
|
|
int amt = player.getInventory().getItemInHand().getAmount();
|
|
|
|
|
2019-08-10 19:52:50 +02:00
|
|
|
EntityType entityType;
|
2019-09-03 22:38:00 +02:00
|
|
|
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13))
|
2019-10-20 17:54:17 +02:00
|
|
|
entityType = EntityType.valueOf(itemType.name().replace("_SPAWN_EGG", "")
|
|
|
|
.replace("MOOSHROOM", "MUSHROOM_COW")
|
|
|
|
.replace("ZOMBIE_PIGMAN", "PIG_ZOMBIE"));
|
2019-09-03 22:38:00 +02:00
|
|
|
else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_12)) {
|
2020-09-01 20:54:43 +02:00
|
|
|
String str = ReflectionUtil.getNBTTagCompound(ReflectionUtil.getNMSItemStack(event.getItem())).toString();
|
2019-08-10 19:10:58 +02:00
|
|
|
if (str.contains("minecraft:"))
|
|
|
|
entityType = EntityType.fromName(str.substring(str.indexOf("minecraft:") + 10, str.indexOf("\"}")));
|
|
|
|
else
|
|
|
|
entityType = EntityType.fromName(str.substring(str.indexOf("EntityTag:{id:") + 15, str.indexOf("\"}")));
|
|
|
|
} else
|
|
|
|
entityType = ((SpawnEgg) event.getItem().getData()).getSpawnedType();
|
|
|
|
|
|
|
|
if (!player.hasPermission("ultimatestacker.egg." + entityType.name())) {
|
2019-08-10 16:03:40 +02:00
|
|
|
event.setCancelled(true);
|
2019-08-10 19:10:58 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (amt < stackSize) {
|
|
|
|
plugin.getLocale().getMessage("event.egg.needmore")
|
|
|
|
.processPlaceholder("amount", stackSize).sendPrefixedMessage(player);
|
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-10 19:52:50 +02:00
|
|
|
|
|
|
|
CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState();
|
|
|
|
|
|
|
|
if (entityType == creatureSpawner.getSpawnedType()) {
|
2019-08-10 19:10:58 +02:00
|
|
|
plugin.getLocale().getMessage("event.egg.sametype")
|
|
|
|
.processPlaceholder("type", entityType.name()).sendPrefixedMessage(player);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-10 19:52:50 +02:00
|
|
|
creatureSpawner.setSpawnedType(entityType);
|
|
|
|
creatureSpawner.update();
|
2019-08-10 19:10:58 +02:00
|
|
|
|
2019-09-03 22:38:00 +02:00
|
|
|
plugin.updateHologram(spawner);
|
2019-08-10 19:10:58 +02:00
|
|
|
if (player.getGameMode() != GameMode.CREATIVE) {
|
2019-09-24 18:13:13 +02:00
|
|
|
Methods.takeItem(player, stackSize);
|
2019-08-10 16:03:40 +02:00
|
|
|
}
|
|
|
|
}
|
2019-07-17 14:56:50 +02:00
|
|
|
}
|