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

122 lines
5.1 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.*;
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 initalEntity = (LivingEntity) entityO;
if (initalEntity.isDead()
|| !initalEntity.isValid()
2018-12-17 19:32:57 +01:00
|| initalEntity instanceof ArmorStand
|| initalEntity.hasMetadata("inLove")) continue;
EntityStack initialStack = stackManager.getStack(initalEntity);
if (initialStack == null && initalEntity.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." + initalEntity.getType().name() + ".Enabled"))
continue;
2019-04-27 21:11:29 +02:00
int maxEntityStackSize = maxEntityStackSizeGlobal;
2018-11-06 04:33:10 +01:00
if (configurationSection.getInt("Mobs." + initalEntity.getType().name() + ".Max Stack Size") != -1)
maxEntityStackSize = configurationSection.getInt("Mobs." + initalEntity.getType().name() + ".Max Stack Size");
2019-06-06 22:42:12 +02:00
List<LivingEntity> entityList = Methods.getSimilarEntitiesAroundEntity(initalEntity);
entityList.removeIf(entity -> entity.hasMetadata("inLove") || entity.hasMetadata("breedCooldown"));
2018-11-06 04:33:10 +01:00
2019-03-07 22:00:57 +01:00
for (Entity entity : new ArrayList<>(entityList)) {
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(initalEntity.getUniqueId());
2018-11-06 04:33:10 +01:00
initalEntity.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(initalEntity, (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
}
}
}