UltimateStacker/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java

151 lines
6.6 KiB
Java
Raw Normal View History

2018-11-06 04:33:10 +01:00
package com.songoda.ultimatestacker.tasks;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.utils.Methods;
import com.songoda.ultimatestacker.utils.settings.Setting;
2018-11-06 04:33:10 +01:00
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
2018-11-06 04:33:10 +01:00
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
2019-01-15 05:45:25 +01:00
import java.util.Collections;
2018-11-06 04:33:10 +01:00
import java.util.List;
import java.util.UUID;
2018-11-06 04:33:10 +01:00
public class StackingTask extends BukkitRunnable {
private final UltimateStacker instance;
public StackingTask(UltimateStacker instance) {
this.instance = instance;
2019-03-21 04:36:58 +01:00
// Start stacking task.
runTaskTimer(instance, 0, Setting.STACK_SEARCH_TICK_SPEED.getInt());
2018-11-06 04:33:10 +01:00
}
@Override
public void run() {
int maxEntityStackSizeGlobal = Setting.MAX_STACK_ENTITIES.getInt();
int minEntityStackAmount = Setting.MIN_STACK_ENTITIES.getInt();
2019-04-11 08:54:59 +02:00
List<String> disabledWorlds = Setting.DISABLED_WORLDS.getStringList();
2018-11-06 04:33:10 +01:00
EntityStackManager stackManager = instance.getEntityStackManager();
for (World world : Bukkit.getWorlds()) {
2019-04-11 08:54:59 +02:00
if (disabledWorlds.stream().anyMatch(worldStr -> world.getName().equalsIgnoreCase(worldStr))) continue;
2018-11-06 04:33:10 +01:00
2019-01-15 05:45:25 +01:00
List<Entity> entities = world.getEntities();
Collections.reverse(entities);
List<UUID> removed = new ArrayList<>();
2018-11-06 04:33:10 +01:00
nextEntity:
2019-01-15 05:45:25 +01:00
for (Entity entityO : entities) {
2019-06-04 09:17:25 +02:00
if (entityO == null
|| entityO instanceof Player
|| !entityO.isValid()
|| !(entityO instanceof LivingEntity)
|| !Setting.STACK_ENTITIES.getBoolean())
2018-11-06 04:33:10 +01:00
continue;
LivingEntity initialEntity = (LivingEntity) entityO;
2018-11-06 04:33:10 +01:00
if (initialEntity.isDead()
|| !initialEntity.isValid()
|| initialEntity instanceof ArmorStand
|| initialEntity.hasMetadata("inLove")
|| Setting.ONLY_STACK_FROM_SPAWNERS.getBoolean()
&& !(initialEntity.hasMetadata("US_REASON")
&& initialEntity.getMetadata("US_REASON").get(0).asString().equals("SPAWNER"))
|| Setting.ONLY_STACK_ON_SURFACE.getBoolean()
&& !Methods.canFly(initialEntity)
&& (!initialEntity.isOnGround() && !initialEntity.getLocation().getBlock().isLiquid()))
continue;
EntityStack initialStack = stackManager.getStack(initialEntity);
if (initialStack == null && initialEntity.getCustomName() != null) continue;
int amtToStack = initialStack != null ? initialStack.getAmount() : 1;
2018-11-06 04:33:10 +01:00
ConfigurationSection configurationSection = UltimateStacker.getInstance().getMobFile().getConfig();
if (!configurationSection.getBoolean("Mobs." + initialEntity.getType().name() + ".Enabled"))
2018-11-06 04:33:10 +01:00
continue;
2019-04-27 21:11:29 +02:00
int maxEntityStackSize = maxEntityStackSizeGlobal;
if (configurationSection.getInt("Mobs." + initialEntity.getType().name() + ".Max Stack Size") != -1)
maxEntityStackSize = configurationSection.getInt("Mobs." + initialEntity.getType().name() + ".Max Stack Size");
2018-11-06 04:33:10 +01:00
List<LivingEntity> entityList = Methods.getSimilarEntitiesAroundEntity(initialEntity);
entityList.removeIf(entity -> entity.hasMetadata("inLove")
|| entity.hasMetadata("breedCooldown")
|| Setting.ONLY_STACK_FROM_SPAWNERS.getBoolean()
&& !(initialEntity.hasMetadata("US_REASON")
&& initialEntity.getMetadata("US_REASON").get(0).asString().equals("SPAWNER")));
2018-11-06 04:33:10 +01:00
for (LivingEntity entity : new ArrayList<>(entityList)) {
2019-03-07 22:00:57 +01:00
if (removed.contains(entity.getUniqueId())) continue;
2018-11-06 04:33:10 +01:00
EntityStack stack = stackManager.getStack(entity);
2019-03-07 22:00:57 +01:00
if (stack == null && entity.getCustomName() != null) {
entityList.remove(entity);
continue;
}
2018-11-06 04:33:10 +01:00
//If a stack was found add 1 to this stack.
2019-03-07 22:00:57 +01:00
if (stack != null && (stack.getAmount() + amtToStack) <= maxEntityStackSize) {
stack.addAmount(amtToStack);
2018-11-06 04:33:10 +01:00
stack.updateStack();
removed.add(initialEntity.getUniqueId());
initialEntity.remove();
continue nextEntity;
} else if (stack == null
&& initialStack != null
&& (initialStack.getAmount() + 1) <= maxEntityStackSize
&& Methods.canFly(entity)
&& Setting.ONLY_STACK_FLYING_DOWN.getBoolean()
&& initialEntity.getLocation().getY() > entity.getLocation().getY()) {
stackManager.addStack(entity, initialStack.getAmount() + 1);
removed.add(initialEntity.getUniqueId());
initialEntity.remove();
2018-11-06 04:33:10 +01:00
continue nextEntity;
}
}
if (initialStack != null) continue;
2018-11-06 04:33:10 +01:00
entityList.removeIf(stackManager::isStacked);
if (entityList.size() < minEntityStackAmount - 1
|| minEntityStackAmount > maxEntityStackSize
|| minEntityStackAmount == 1 && entityList.size() == 0) continue;
2018-11-06 04:33:10 +01:00
//If stack was never found make a new one.
EntityStack stack = stackManager.addStack(new EntityStack(initialEntity, (entityList.size() + 1) >
maxEntityStackSize ? maxEntityStackSize : entityList.size() + 1));
2018-11-06 04:33:10 +01:00
2019-03-21 04:36:58 +01:00
entityList.stream().filter(entity -> !stackManager.isStacked(entity)
&& !removed.contains(entity.getUniqueId())).limit(maxEntityStackSize).forEach(entity -> {
removed.add(entity.getUniqueId());
2018-11-06 04:33:10 +01:00
entity.remove();
2019-03-21 04:36:58 +01:00
});
2018-11-06 04:33:10 +01:00
stack.updateStack();
}
2019-01-15 05:45:25 +01:00
entities.clear();
removed.clear();
2018-11-06 04:33:10 +01:00
}
}
2019-06-23 02:10:22 +02:00
2018-11-06 04:33:10 +01:00
}