2020-09-09 16:12:32 +02:00
|
|
|
package com.songoda.ultimatestacker.listeners.entity;
|
2018-11-25 22:28:58 +01:00
|
|
|
|
2019-09-09 18:08:04 +02:00
|
|
|
import com.songoda.core.compatibility.CompatibleMaterial;
|
2018-11-25 22:28:58 +01:00
|
|
|
import com.songoda.ultimatestacker.UltimateStacker;
|
2019-09-07 23:55:16 +02:00
|
|
|
import com.songoda.ultimatestacker.settings.Settings;
|
2020-08-25 01:01:11 +02:00
|
|
|
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
|
|
|
|
import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
|
|
|
|
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
|
2018-12-03 03:14:40 +01:00
|
|
|
import com.songoda.ultimatestacker.utils.Methods;
|
2019-06-17 23:48:34 +02:00
|
|
|
import org.bukkit.Bukkit;
|
2018-12-03 03:14:40 +01:00
|
|
|
import org.bukkit.Location;
|
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.block.CreatureSpawner;
|
2019-12-15 00:46:57 +01:00
|
|
|
import org.bukkit.enchantments.Enchantment;
|
2020-09-01 20:44:39 +02:00
|
|
|
import org.bukkit.entity.Creeper;
|
|
|
|
import org.bukkit.entity.Entity;
|
|
|
|
import org.bukkit.entity.EntityType;
|
|
|
|
import org.bukkit.entity.LivingEntity;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.entity.TNTPrimed;
|
2018-11-25 22:28:58 +01:00
|
|
|
import org.bukkit.event.EventHandler;
|
2018-12-03 03:14:40 +01:00
|
|
|
import org.bukkit.event.EventPriority;
|
2018-11-25 22:28:58 +01:00
|
|
|
import org.bukkit.event.Listener;
|
2021-01-02 13:03:04 +01:00
|
|
|
import org.bukkit.event.entity.*;
|
2018-11-25 22:28:58 +01:00
|
|
|
import org.bukkit.inventory.ItemStack;
|
2021-01-02 13:03:04 +01:00
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
2019-12-15 00:46:57 +01:00
|
|
|
import org.bukkit.util.Vector;
|
2018-11-25 22:28:58 +01:00
|
|
|
|
2019-10-20 17:56:29 +02:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
|
2018-11-25 22:28:58 +01:00
|
|
|
public class EntityListeners implements Listener {
|
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
private final UltimateStacker plugin;
|
2018-11-25 22:28:58 +01:00
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
public EntityListeners(UltimateStacker plugin) {
|
|
|
|
this.plugin = plugin;
|
2018-11-25 22:28:58 +01:00
|
|
|
}
|
|
|
|
|
2019-06-22 11:15:24 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
2019-03-07 20:44:28 +01:00
|
|
|
public void onEgg(ItemSpawnEvent event) {
|
2019-10-24 19:15:04 +02:00
|
|
|
Material material = event.getEntity().getItemStack().getType();
|
|
|
|
if (material != Material.EGG
|
|
|
|
&& !material.name().equalsIgnoreCase("SCUTE")) return;
|
2019-03-07 20:44:28 +01:00
|
|
|
|
|
|
|
Location location = event.getLocation();
|
|
|
|
|
2019-10-24 19:15:04 +02:00
|
|
|
List<Entity> entities = new ArrayList<>(location.getWorld().getNearbyEntities(location, .1, 1, .1));
|
2019-03-07 20:44:28 +01:00
|
|
|
|
|
|
|
if (entities.isEmpty()) return;
|
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
Entity nonLivingEntity = entities.get(0);
|
|
|
|
|
|
|
|
if (!(nonLivingEntity instanceof LivingEntity)) return;
|
|
|
|
|
|
|
|
LivingEntity entity = (LivingEntity) nonLivingEntity;
|
2019-03-07 20:44:28 +01:00
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
EntityStackManager stackManager = plugin.getEntityStackManager();
|
2019-03-07 20:44:28 +01:00
|
|
|
|
2023-02-04 14:48:13 +01:00
|
|
|
if (!stackManager.isStackedEntity(entity)) return;
|
2019-03-07 20:44:28 +01:00
|
|
|
|
|
|
|
EntityStack stack = stackManager.getStack(entity);
|
|
|
|
|
|
|
|
ItemStack item = event.getEntity().getItemStack();
|
2019-10-17 00:42:16 +02:00
|
|
|
int amount = (stack.getAmount() - 1) + item.getAmount();
|
2020-08-26 15:24:18 +02:00
|
|
|
if (amount < 1) return;
|
|
|
|
item.setAmount(Math.min(amount, item.getMaxStackSize()));
|
2019-10-17 00:42:16 +02:00
|
|
|
if (amount > item.getMaxStackSize())
|
|
|
|
UltimateStacker.updateItemAmount(event.getEntity(), amount);
|
2019-03-07 20:44:28 +01:00
|
|
|
event.getEntity().setItemStack(item);
|
|
|
|
}
|
|
|
|
|
2019-12-15 00:46:57 +01:00
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
|
|
public void onHurt(EntityDamageByEntityEvent event) {
|
|
|
|
if (!Settings.STACK_ENTITIES.getBoolean() || !(event.getDamager() instanceof Player)) return;
|
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
Entity entity = event.getEntity();
|
|
|
|
|
2023-02-22 09:59:28 +01:00
|
|
|
if (!(entity instanceof LivingEntity)) return;
|
|
|
|
if (event.getDamager() instanceof Player) {
|
|
|
|
plugin.getEntityStackManager().setLastPlayerDamage(entity, (Player) event.getDamager());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (plugin.getEntityStackManager().isStackedEntity(entity)
|
2019-12-15 00:46:57 +01:00
|
|
|
&& Settings.DISABLE_KNOCKBACK.getBoolean()
|
|
|
|
&& ((Player) event.getDamager()).getItemInHand().getEnchantmentLevel(Enchantment.KNOCKBACK) == 0) {
|
|
|
|
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> {
|
|
|
|
event.getEntity().setVelocity(new Vector());
|
|
|
|
}, 0L);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-02 13:03:04 +01:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
|
|
public void onSpawn(CreatureSpawnEvent event) {
|
|
|
|
event.getEntity().setMetadata("US_REASON", new FixedMetadataValue(plugin, event.getSpawnReason().name()));
|
|
|
|
}
|
|
|
|
|
2019-06-07 19:48:17 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
|
|
public void onBlow(EntityExplodeEvent event) {
|
2019-08-02 15:59:10 +02:00
|
|
|
if (!plugin.spawnersEnabled()) return;
|
2019-08-02 13:01:51 +02:00
|
|
|
|
2019-06-07 19:48:17 +02:00
|
|
|
List<Block> destroyed = event.blockList();
|
|
|
|
Iterator<Block> it = destroyed.iterator();
|
|
|
|
List<Block> toCancel = new ArrayList<>();
|
|
|
|
while (it.hasNext()) {
|
|
|
|
Block block = it.next();
|
2019-09-09 18:08:04 +02:00
|
|
|
if (block.getType() != CompatibleMaterial.SPAWNER.getMaterial())
|
2019-06-07 19:48:17 +02:00
|
|
|
continue;
|
|
|
|
|
|
|
|
Location spawnLocation = block.getLocation();
|
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
SpawnerStack spawner = plugin.getSpawnerStackManager().getSpawner(block);
|
2019-06-07 19:48:17 +02:00
|
|
|
|
2019-09-07 23:55:16 +02:00
|
|
|
if (Settings.SPAWNERS_DONT_EXPLODE.getBoolean())
|
2019-06-07 19:48:17 +02:00
|
|
|
toCancel.add(block);
|
|
|
|
else {
|
|
|
|
String chance = "";
|
|
|
|
if (event.getEntity() instanceof Creeper)
|
2019-09-07 23:55:16 +02:00
|
|
|
chance = Settings.EXPLOSION_DROP_CHANCE_TNT.getString();
|
2019-06-07 19:48:17 +02:00
|
|
|
else if (event.getEntity() instanceof TNTPrimed)
|
2019-09-07 23:55:16 +02:00
|
|
|
chance = Settings.EXPLOSION_DROP_CHANCE_CREEPER.getString();
|
2019-06-07 19:48:17 +02:00
|
|
|
int ch = Integer.parseInt(chance.replace("%", ""));
|
|
|
|
double rand = Math.random() * 100;
|
|
|
|
if (rand - ch < 0 || ch == 100) {
|
|
|
|
CreatureSpawner cs = (CreatureSpawner) block.getState();
|
|
|
|
EntityType blockType = cs.getSpawnedType();
|
|
|
|
ItemStack item = Methods.getSpawnerItem(blockType, spawner.getAmount());
|
|
|
|
spawnLocation.getWorld().dropItemNaturally(spawnLocation.clone().add(.5, 0, .5), item);
|
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
SpawnerStack spawnerStack = plugin.getSpawnerStackManager().removeSpawner(spawnLocation);
|
|
|
|
plugin.getDataManager().deleteSpawner(spawnerStack);
|
2020-08-25 01:01:11 +02:00
|
|
|
plugin.removeHologram(spawnerStack);
|
2019-06-07 19:48:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Location nloc = spawnLocation.clone();
|
|
|
|
nloc.add(.5, -.4, .5);
|
|
|
|
List<Entity> near = (List<Entity>) nloc.getWorld().getNearbyEntities(nloc, 8, 8, 8);
|
|
|
|
for (Entity ee : near) {
|
|
|
|
if (ee.getLocation().getX() == nloc.getX() && ee.getLocation().getY() == nloc.getY() && ee.getLocation().getZ() == nloc.getZ()) {
|
|
|
|
ee.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (Block block : toCancel) {
|
|
|
|
event.blockList().remove(block);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-25 22:28:58 +01:00
|
|
|
}
|