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

189 lines
7.8 KiB
Java
Raw Normal View History

2023-05-25 19:20:03 +02:00
package com.craftaro.ultimatestacker.listeners.entity;
import com.craftaro.core.configuration.Config;
2024-01-07 12:16:27 +01:00
import com.craftaro.third_party.com.cryptomorin.xseries.XMaterial;
2023-05-25 19:20:03 +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.entity.EntityStack;
import com.craftaro.ultimatestacker.api.stack.entity.EntityStackManager;
2023-05-30 11:20:31 +02:00
import com.craftaro.ultimatestacker.api.stack.item.StackedItem;
2023-05-25 19:20:03 +02:00
import com.craftaro.ultimatestacker.api.stack.spawner.SpawnerStack;
import com.craftaro.ultimatestacker.settings.Settings;
import com.craftaro.ultimatestacker.tasks.StackingTask;
2023-05-25 19:20:03 +02:00
import com.craftaro.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;
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;
import org.bukkit.event.Listener;
2023-05-05 10:57:17 +02:00
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
2018-11-25 22:28:58 +01:00
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
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;
private int searchRadius = Settings.SEARCH_RADIUS.getInt() * 16; //SEARCH_RADIUS is in chunks, so multiply by 16 to get blocks
private Config mobsConfig;
2018-11-25 22:28:58 +01:00
2019-08-02 15:59:10 +02:00
public EntityListeners(UltimateStacker plugin) {
this.plugin = plugin;
mobsConfig = plugin.getMobFile();
2018-11-25 22:28:58 +01:00
}
2023-05-05 10:57:17 +02:00
@EventHandler
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
if (!stackManager.isStackedEntity(entity)) return;
2019-03-07 20:44:28 +01:00
2023-05-25 19:20:03 +02:00
EntityStack stack = stackManager.getStackedEntity(entity);
2019-03-07 20:44:28 +01:00
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()));
2023-05-30 11:20:31 +02:00
if (amount > item.getMaxStackSize()) {
StackedItem stackedItem = UltimateStackerApi.getStackedItemManager().getStackedItem(event.getEntity());
stackedItem.setAmount(amount - item.getMaxStackSize());
2023-05-30 11:20:31 +02:00
}
2019-03-07 20:44:28 +01:00
event.getEntity().setItemStack(item);
}
@EventHandler
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();
if (!(entity instanceof LivingEntity)) return;
if (event.getDamager() instanceof Player) {
plugin.getEntityStackManager().setLastPlayerDamage(entity, (Player) event.getDamager());
}
if (plugin.getEntityStackManager().isStackedEntity(entity)
&& Settings.DISABLE_KNOCKBACK.getBoolean()
&& ((Player) event.getDamager()).getItemInHand().getEnchantmentLevel(Enchantment.KNOCKBACK) == 0) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> {
event.getEntity().setVelocity(new Vector());
}, 0L);
}
}
2023-05-05 10:57:17 +02:00
@EventHandler
public void onSpawn(CreatureSpawnEvent event) {
String spawnReason = event.getSpawnReason().name();
if (plugin.isInstantStacking()) {
LivingEntity spawningEntity = event.getEntity();
EntityStackManager stackManager = plugin.getEntityStackManager();
if (stackManager.isStackedEntity(spawningEntity)) return; //We don't want to stack split entities or respawned stacks
List<LivingEntity> stackableFriends = plugin.getStackingTask().getSimilarEntitiesAroundEntity(spawningEntity, spawningEntity.getLocation());
if (stackableFriends.isEmpty()) {
event.getEntity().setMetadata("US_REASON", new FixedMetadataValue(plugin, spawnReason));
return;
}
LivingEntity friendStack = stackableFriends.get(0);
if (stackManager.isStackedEntity(friendStack)) {
EntityStack stack = stackManager.getStackedEntity(friendStack);
//getSimilarEntitiesAroundEntity check for max stack size, we don't need to check again
stack.add(1);
event.setCancelled(true);
} else {
stackManager.createStackedEntity(friendStack, 2);
}
return;
}
event.getEntity().setMetadata("US_REASON", new FixedMetadataValue(plugin, spawnReason));
}
@EventHandler
public void onBlow(EntityExplodeEvent event) {
2019-08-02 15:59:10 +02:00
if (!plugin.spawnersEnabled()) return;
List<Block> destroyed = event.blockList();
Iterator<Block> it = destroyed.iterator();
List<Block> toCancel = new ArrayList<>();
while (it.hasNext()) {
Block block = it.next();
2023-06-29 11:18:18 +02:00
if (block.getType() != XMaterial.SPAWNER.parseMaterial())
continue;
Location spawnLocation = block.getLocation();
SpawnerStack spawner = UltimateStackerApi.getSpawnerStackManager().getSpawner(block);
2019-09-07 23:55:16 +02:00
if (Settings.SPAWNERS_DONT_EXPLODE.getBoolean())
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();
else if (event.getEntity() instanceof TNTPrimed)
2019-09-07 23:55:16 +02:00
chance = Settings.EXPLOSION_DROP_CHANCE_CREEPER.getString();
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);
SpawnerStack spawnerStack = UltimateStackerApi.getSpawnerStackManager().removeSpawner(spawnLocation);
plugin.getPluginDataManager().delete(spawnerStack);
2020-08-25 01:01:11 +02:00
plugin.removeHologram(spawnerStack);
}
}
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
}