UltimateStacker/src/main/java/com/songoda/ultimatestacker/listeners/SpawnerListeners.java

133 lines
5.4 KiB
Java
Raw Normal View History

package com.songoda.ultimatestacker.listeners;
2019-09-03 22:38:00 +02:00
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.nms.NmsManager;
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;
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;
import org.bukkit.entity.LivingEntity;
2019-08-10 19:10:58 +02:00
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.entity.SpawnerSpawnEvent;
import org.bukkit.event.player.PlayerInteractEvent;
2019-08-10 19:10:58 +02:00
import org.bukkit.material.SpawnEgg;
public class SpawnerListeners implements Listener {
private final UltimateStacker plugin;
public SpawnerListeners(UltimateStacker plugin) {
this.plugin = plugin;
}
@EventHandler
public void onSpawn(SpawnerSpawnEvent event) {
2019-09-07 23:55:16 +02:00
if (!Settings.STACK_ENTITIES.getBoolean()
|| !plugin.spawnersEnabled()
|| plugin.getStackingTask().isWorldDisabled(event.getLocation().getWorld())) return;
SpawnerStackManager spawnerStackManager = plugin.getSpawnerStackManager();
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();
plugin.getStackingTask().attemptSplit(stack, (LivingEntity) event.getEntity());
}
@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 19:10:58 +02:00
Material itemType = event.getItem().getType();
Block block = event.getClickedBlock();
2019-08-10 19:10:58 +02:00
Player player = event.getPlayer();
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"))
return;
event.setCancelled(true);
2019-09-07 23:55:16 +02:00
if (!Settings.EGGS_CONVERT_SPAWNERS.getBoolean()
|| (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))
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())) {
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) {
Methods.takeItem(player, stackSize);
}
}
}