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

207 lines
8.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.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;
private EntityStackManager stackManager;
private List<UUID> removed = new ArrayList<>();
2018-11-06 04:33:10 +01:00
public StackingTask(UltimateStacker instance) {
this.instance = instance;
this.stackManager = instance.getEntityStackManager();
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() {
List<String> disabledWorlds = Setting.DISABLED_WORLDS.getStringList();
2018-11-06 04:33:10 +01:00
nextEntity:
2018-11-06 04:33:10 +01:00
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);
for (Entity entityO : entities) {
if (!(entityO instanceof LivingEntity)
2019-06-04 09:17:25 +02:00
|| entityO instanceof Player
|| !entityO.isValid()
|| !Setting.STACK_ENTITIES.getBoolean())
continue nextEntity;
2018-11-06 04:33:10 +01:00
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 nextEntity;
EntityStack initialStack = stackManager.getStack(initialEntity);
if (initialStack == null && initialEntity.getCustomName() != null) continue nextEntity;
2018-11-06 04:33:10 +01:00
attemptAddToStack(initialEntity, initialStack);
}
entities.clear();
removed.clear();
}
}
2018-11-06 04:33:10 +01:00
public boolean attemptAddToStack(LivingEntity initialEntity, EntityStack initialStack) {
ConfigurationSection configurationSection = UltimateStacker.getInstance().getMobFile().getConfig();
2019-06-28 05:14:40 +02:00
if (!configurationSection.getBoolean("Mobs." + initialEntity.getType().name() + ".Enabled"))
return false;
int minEntityStackAmount = Setting.MIN_STACK_ENTITIES.getInt();
int amtToStack = initialStack != null ? initialStack.getAmount() : 1;
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")));
int maxEntityStackSize = Setting.MAX_STACK_ENTITIES.getInt();
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
for (LivingEntity entity : new ArrayList<>(entityList)) {
if (removed.contains(entity.getUniqueId())) continue;
EntityStack stack = stackManager.getStack(entity);
if (stack == null && entity.getCustomName() != null) {
entityList.remove(entity);
continue;
}
//If a stack was found add 1 to this stack.
if (stack != null && (stack.getAmount() + amtToStack) <= maxEntityStackSize) {
stack.addAmount(amtToStack);
2018-11-06 04:33:10 +01:00
stack.updateStack();
if (initialStack == null)
2019-06-30 02:16:01 +02:00
stack.addHealth(entity.getHealth());
else
stack.mergeHealth(initialStack);
removed.add(initialEntity.getUniqueId());
fixHealth(entity, initialEntity);
2019-06-30 02:16:01 +02:00
if (Setting.STACK_ENTITY_HEALTH.getBoolean())
2019-07-08 18:48:26 +02:00
entity.setHealth(entity.getMaxHealth() < initialEntity.getHealth()
? entity.getMaxHealth() : initialEntity.getHealth());
initialEntity.remove();
return true;
} 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()) {
EntityStack newStack = stackManager.addStack(entity, initialStack.getAmount() + 1);
2019-06-30 02:16:01 +02:00
newStack.mergeHealth(initialStack);
newStack.addHealth(initialEntity.getHealth());
removed.add(initialEntity.getUniqueId());
fixHealth(initialEntity, entity);
2019-06-30 02:16:01 +02:00
if (Setting.STACK_ENTITY_HEALTH.getBoolean())
entity.setHealth(entity.getHealth());
stackManager.removeStack(initialEntity);
initialEntity.remove();
return true;
2018-11-06 04:33:10 +01:00
}
}
if (initialStack != null) return false;
entityList.removeIf(stackManager::isStacked);
if (entityList.size() < minEntityStackAmount - 1
|| minEntityStackAmount > maxEntityStackSize
|| minEntityStackAmount == 1 && entityList.size() == 0) return false;
//If stack was never found make a new one.
EntityStack stack = stackManager.addStack(new EntityStack(initialEntity, (entityList.size() + 1) >
maxEntityStackSize ? maxEntityStackSize : entityList.size() + 1));
entityList.stream().filter(entity -> !stackManager.isStacked(entity)
&& !removed.contains(entity.getUniqueId())).limit(maxEntityStackSize).forEach(entity -> {
fixHealth(initialEntity, entity);
stack.addHealth(entity.getHealth());
removed.add(entity.getUniqueId());
entity.remove();
});
updateHealth(stack);
stack.updateStack();
return false;
2018-11-06 04:33:10 +01:00
}
2019-06-23 02:10:22 +02:00
public void attemptSplit(EntityStack stack, LivingEntity entity) {
int stackSize = stack.getAmount();
int maxEntityStackAmount = Setting.MAX_STACK_ENTITIES.getInt();
if (stackSize <= maxEntityStackAmount) return;
for (int i = stackSize; i > 0; i -= maxEntityStackAmount) {
instance.getEntityStackManager().addStack(Methods.newEntity(entity), i > 25 ? 25 : i);
}
entity.remove();
}
private void fixHealth(LivingEntity entity, LivingEntity initialEntity) {
if (!Setting.STACK_ENTITY_HEALTH.getBoolean() && Setting.CARRY_OVER_LOWEST_HEALTH.getBoolean() && initialEntity.getHealth() < entity.getHealth())
entity.setHealth(initialEntity.getHealth());
}
private void updateHealth(EntityStack stack) {
if (Setting.STACK_ENTITY_HEALTH.getBoolean())
stack.updateHealth(stack.getEntity());
}
2018-11-06 04:33:10 +01:00
}