2023-05-25 19:20:03 +02:00
|
|
|
package com.craftaro.ultimatestacker.listeners;
|
2019-07-17 14:56:50 +02:00
|
|
|
|
2023-06-30 22:28:37 +02:00
|
|
|
import com.craftaro.core.compatibility.CompatibleHand;
|
|
|
|
import com.craftaro.core.compatibility.ServerVersion;
|
2024-04-06 13:13:03 +02:00
|
|
|
import com.craftaro.core.nms.Nms;
|
|
|
|
import com.craftaro.core.third_party.de.tr7zw.nbtapi.NBTCompound;
|
|
|
|
import com.craftaro.core.third_party.de.tr7zw.nbtapi.NBTEntity;
|
2023-06-30 22:28:37 +02:00
|
|
|
import com.craftaro.core.third_party.de.tr7zw.nbtapi.NBTItem;
|
|
|
|
import com.craftaro.core.utils.EntityUtils;
|
2023-05-30 11:21:46 +02:00
|
|
|
import com.craftaro.ultimatestacker.UltimateStacker;
|
2023-06-30 22:27:08 +02:00
|
|
|
import com.craftaro.ultimatestacker.api.UltimateStackerApi;
|
2023-05-25 19:20:03 +02:00
|
|
|
import com.craftaro.ultimatestacker.api.stack.spawner.SpawnerStack;
|
|
|
|
import com.craftaro.ultimatestacker.api.stack.spawner.SpawnerStackManager;
|
2023-05-30 11:21:46 +02:00
|
|
|
import com.craftaro.ultimatestacker.settings.Settings;
|
|
|
|
import com.craftaro.ultimatestacker.stackable.spawner.SpawnerStackImpl;
|
2021-05-27 22:57:41 +02:00
|
|
|
import org.bukkit.Bukkit;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.GameMode;
|
2021-05-27 21:21:57 +02:00
|
|
|
import org.bukkit.Location;
|
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;
|
2021-05-27 21:21:57 +02:00
|
|
|
import org.bukkit.entity.Entity;
|
2019-08-10 19:10:58 +02:00
|
|
|
import org.bukkit.entity.EntityType;
|
|
|
|
import org.bukkit.entity.Player;
|
2019-07-17 14:56:50 +02:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
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;
|
2021-05-27 22:57:41 +02:00
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
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
|
|
|
|
2021-05-27 22:57:41 +02:00
|
|
|
private static final boolean mcmmo = Bukkit.getPluginManager().isPluginEnabled("mcMMO");
|
|
|
|
|
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) {
|
2023-04-07 21:43:39 +02:00
|
|
|
if (plugin.getStackingTask() == null) return; //Don't spam error when reloading the plugin
|
2023-05-06 12:34:13 +02:00
|
|
|
if (!plugin.spawnersEnabled()
|
2019-07-31 21:47:01 +02:00
|
|
|
|| plugin.getStackingTask().isWorldDisabled(event.getLocation().getWorld())) return;
|
2021-05-27 21:21:57 +02:00
|
|
|
|
2023-06-30 22:27:08 +02:00
|
|
|
SpawnerStackManager spawnerStackManager = UltimateStackerApi.getSpawnerStackManager();
|
2019-07-17 14:56:50 +02:00
|
|
|
if (!spawnerStackManager.isSpawner(event.getSpawner().getLocation())) return;
|
|
|
|
|
2021-05-27 21:21:57 +02:00
|
|
|
Entity entity = event.getEntity();
|
|
|
|
if (entity.getType() == EntityType.FIREWORK) return;
|
|
|
|
if (entity.getVehicle() != null) {
|
|
|
|
entity.getVehicle().remove();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11)) {
|
|
|
|
if (entity.getPassengers().size() != 0) {
|
|
|
|
for (Entity e : entity.getPassengers()) {
|
|
|
|
e.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-07-17 14:56:50 +02:00
|
|
|
|
2021-05-27 21:21:57 +02:00
|
|
|
Location location = event.getSpawner().getLocation();
|
2020-08-05 23:05:57 +02:00
|
|
|
|
2021-05-27 21:21:57 +02:00
|
|
|
SpawnerStack spawnerStack = spawnerStackManager.getSpawner(location);
|
2019-07-17 14:56:50 +02:00
|
|
|
|
2023-07-08 11:23:20 +02:00
|
|
|
int amountToSpawn = Settings.STACK_ENTITIES.getBoolean() ? spawnerStack.calculateSpawnCount(entity.getType(), false) : 1;
|
2023-05-06 12:34:13 +02:00
|
|
|
if (amountToSpawn <= 0) return;
|
2023-05-05 10:57:07 +02:00
|
|
|
entity.remove();
|
2023-02-04 14:48:13 +01:00
|
|
|
|
|
|
|
spawnerStack.spawn(amountToSpawn, "EXPLOSION_NORMAL", null, (e) -> {
|
2023-05-06 12:34:13 +02:00
|
|
|
if (Settings.NO_AI.getBoolean()) {
|
2021-05-27 21:21:57 +02:00
|
|
|
EntityUtils.setUnaware(e);
|
2023-05-06 12:34:13 +02:00
|
|
|
}
|
2021-05-27 22:57:41 +02:00
|
|
|
|
2023-05-06 12:34:13 +02:00
|
|
|
if (mcmmo) {
|
2021-05-27 22:57:41 +02:00
|
|
|
entity.setMetadata("mcMMO: Spawned Entity", new FixedMetadataValue(plugin, true));
|
2023-05-06 12:34:13 +02:00
|
|
|
}
|
2023-02-04 14:48:13 +01:00
|
|
|
|
2023-05-25 19:20:03 +02:00
|
|
|
UltimateStacker.getInstance().getEntityStackManager().createStackedEntity(e, amountToSpawn);
|
2021-05-27 21:21:57 +02:00
|
|
|
return true;
|
|
|
|
}, event.getEntityType());
|
2019-07-17 14:56:50 +02:00
|
|
|
}
|
2019-08-10 16:03:40 +02:00
|
|
|
|
2023-05-06 12:34:13 +02:00
|
|
|
@EventHandler
|
2019-08-10 16:03:40 +02:00
|
|
|
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()
|
2022-03-18 21:38:26 +01:00
|
|
|
&& !new NBTItem(event.getItem()).hasKey("UC"))) {
|
2019-08-10 19:52:50 +02:00
|
|
|
return;
|
2019-08-10 19:10:58 +02:00
|
|
|
}
|
|
|
|
|
2023-06-30 22:27:08 +02:00
|
|
|
SpawnerStackManager manager = UltimateStackerApi.getSpawnerStackManager();
|
2019-08-10 19:10:58 +02:00
|
|
|
|
|
|
|
SpawnerStack spawner = manager.isSpawner(block.getLocation())
|
2023-05-25 19:20:03 +02:00
|
|
|
? manager.getSpawner(block) : manager.addSpawner(new SpawnerStackImpl(block.getLocation(), 1));
|
2019-08-10 19:10:58 +02:00
|
|
|
|
|
|
|
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)) {
|
2024-04-06 13:13:03 +02:00
|
|
|
Nms.getImplementations().getNbt().of(event.getItem()).toString();
|
|
|
|
NBTCompound entityTag = new NBTItem(event.getItem()).getCompound("EntityTag");
|
|
|
|
if (entityTag != null) {
|
|
|
|
entityType = EntityType.fromName(entityTag.getString("id"));
|
|
|
|
} else {
|
|
|
|
entityType = EntityType.fromName(event.getItem().getItemMeta().getDisplayName().replace(" Spawn Egg", ""));
|
|
|
|
}
|
|
|
|
} else {
|
2019-08-10 19:10:58 +02:00
|
|
|
entityType = ((SpawnEgg) event.getItem().getData()).getSpawnedType();
|
2024-04-06 13:13:03 +02:00
|
|
|
}
|
2019-08-10 19:10:58 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
2021-05-27 21:21:57 +02:00
|
|
|
CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState();
|
2019-08-10 19:52:50 +02:00
|
|
|
|
|
|
|
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);
|
2021-05-21 22:52:33 +02:00
|
|
|
if (player.getGameMode() != GameMode.CREATIVE)
|
|
|
|
CompatibleHand.getHand(event).takeItem(player, stackSize);
|
2019-08-10 16:03:40 +02:00
|
|
|
}
|
2019-07-17 14:56:50 +02:00
|
|
|
}
|