EpicBosses/plugin-modules/Core/src/com/songoda/epicbosses/targeting/TargetHandler.java

95 lines
3.0 KiB
Java
Raw Normal View History

package com.songoda.epicbosses.targeting;
2020-02-02 03:56:11 +01:00
import com.songoda.core.compatibility.ServerVersion;
2019-10-08 03:56:52 +02:00
import com.songoda.epicbosses.EpicBosses;
import com.songoda.epicbosses.holder.IActiveHolder;
import com.songoda.epicbosses.managers.BossTargetManager;
import com.songoda.epicbosses.utils.ServerUtils;
2019-10-08 03:56:52 +02:00
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
2020-02-01 13:13:51 +01:00
import org.bukkit.entity.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 30-Oct-18
*/
public abstract class TargetHandler<Holder extends IActiveHolder> implements ITarget {
protected final BossTargetManager bossTargetManager;
protected final Holder holder;
public TargetHandler(Holder holder, BossTargetManager bossTargetManager) {
this.holder = holder;
this.bossTargetManager = bossTargetManager;
}
public void runTargetCycle() {
ServerUtils.get().runLaterAsync(10L, () -> {
updateTarget();
2019-10-08 00:34:11 +02:00
if (!getHolder().isDead()) runTargetCycle();
});
}
protected LivingEntity getBossEntity() {
2019-10-08 00:34:11 +02:00
for (UUID uuid : getHolder().getLivingEntityMap().values()) {
LivingEntity livingEntity = (LivingEntity) ServerUtils.get().getEntity(uuid);
2019-10-08 00:34:11 +02:00
if (livingEntity != null && !livingEntity.isDead()) return livingEntity;
}
return null;
}
private void updateTarget() {
2019-10-08 03:56:52 +02:00
Bukkit.getScheduler().runTask(EpicBosses.getInstance(), () -> {
LivingEntity boss = getBossEntity();
double radius = this.bossTargetManager.getTargetRadius();
2019-10-08 03:56:52 +02:00
if (boss == null) return;
2019-10-08 03:56:52 +02:00
List<LivingEntity> nearbyEntities = new ArrayList<>();
List<Entity> nearbyBossEntities = boss.getNearbyEntities(radius, radius, radius);
2019-10-08 03:56:52 +02:00
for (Entity entity : nearbyBossEntities) {
if (!(entity instanceof Player)) continue;
2019-10-08 03:56:52 +02:00
LivingEntity livingEntity = (LivingEntity) entity;
Player player = (Player) livingEntity;
2019-10-08 00:34:11 +02:00
if (player.getGameMode() == GameMode.SPECTATOR || player.getGameMode() == GameMode.CREATIVE) continue;
2019-10-08 03:56:52 +02:00
nearbyEntities.add(livingEntity);
}
2019-10-08 03:56:52 +02:00
updateBoss(selectTarget(nearbyEntities));
});
}
private void updateBoss(LivingEntity newTarget) {
getHolder().getLivingEntityMap().values().forEach(uuid -> {
LivingEntity livingEntity = (LivingEntity) ServerUtils.get().getEntity(uuid);
2019-10-08 00:34:11 +02:00
if (livingEntity != null && !livingEntity.isDead()) {
2020-03-11 15:26:58 +01:00
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13) && livingEntity instanceof Mob)
2020-02-01 13:13:51 +01:00
((Mob) livingEntity).setTarget(newTarget);
2020-02-02 03:56:11 +01:00
else if (livingEntity instanceof Creature)
2020-02-01 13:13:51 +01:00
((Creature) livingEntity).setTarget(newTarget);
}
});
}
public BossTargetManager getBossTargetManager() {
return this.bossTargetManager;
}
public Holder getHolder() {
return this.holder;
}
}