UltimateStacker/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/SpawnerListeners.java

169 lines
6.7 KiB
Java
Raw Normal View History

2023-05-25 19:20:03 +02:00
package com.craftaro.ultimatestacker.listeners;
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;
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;
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;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
2019-08-10 19:52:50 +02:00
import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.Entity;
2019-08-10 19:10:58 +02:00
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
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;
2021-05-27 22:57:41 +02:00
import org.bukkit.metadata.FixedMetadataValue;
public class SpawnerListeners implements Listener {
private final UltimateStacker plugin;
2021-05-27 22:57:41 +02:00
private static final boolean mcmmo = Bukkit.getPluginManager().isPluginEnabled("mcMMO");
public SpawnerListeners(UltimateStacker plugin) {
this.plugin = plugin;
}
@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
if (!plugin.spawnersEnabled()
|| plugin.getStackingTask().isWorldDisabled(event.getLocation().getWorld())) return;
SpawnerStackManager spawnerStackManager = UltimateStackerApi.getSpawnerStackManager();
if (!spawnerStackManager.isSpawner(event.getSpawner().getLocation())) return;
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();
}
}
}
Location location = event.getSpawner().getLocation();
2020-08-05 23:05:57 +02:00
SpawnerStack spawnerStack = spawnerStackManager.getSpawner(location);
int amountToSpawn = Settings.STACK_ENTITIES.getBoolean() ? spawnerStack.calculateSpawnCount(entity.getType(), false) : 1;
if (amountToSpawn <= 0) return;
2023-05-05 10:57:07 +02:00
entity.remove();
spawnerStack.spawn(amountToSpawn, "EXPLOSION_NORMAL", null, (e) -> {
if (Settings.NO_AI.getBoolean()) {
EntityUtils.setUnaware(e);
}
2021-05-27 22:57:41 +02:00
if (mcmmo) {
2021-05-27 22:57:41 +02:00
entity.setMetadata("mcMMO: Spawned Entity", new FixedMetadataValue(plugin, true));
}
2023-05-25 19:20:03 +02:00
UltimateStacker.getInstance().getEntityStackManager().createStackedEntity(e, amountToSpawn);
return true;
}, event.getEntityType());
}
@EventHandler
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()
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
}
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))
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())) {
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();
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);
}
}