77 lines
2.7 KiB
Java
77 lines
2.7 KiB
Java
package me.xginko.villageroptimizer.modules;
|
|
|
|
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
|
|
import me.xginko.villageroptimizer.VillagerOptimizer;
|
|
import me.xginko.villageroptimizer.cache.VillagerManager;
|
|
import org.bukkit.entity.Entity;
|
|
import org.bukkit.entity.EntityType;
|
|
import org.bukkit.entity.Mob;
|
|
import org.bukkit.entity.Villager;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.HandlerList;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
|
|
|
public class PreventVillagerTargetting implements VillagerOptimizerModule, Listener {
|
|
|
|
private final VillagerManager villagerManager;
|
|
|
|
protected PreventVillagerTargetting() {
|
|
this.villagerManager = VillagerOptimizer.getVillagerManager();
|
|
}
|
|
|
|
@Override
|
|
public void enable() {
|
|
VillagerOptimizer plugin = VillagerOptimizer.getInstance();
|
|
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
|
}
|
|
|
|
@Override
|
|
public void disable() {
|
|
HandlerList.unregisterAll(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldEnable() {
|
|
return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.optimized-villagers-dont-get-targeted", true);
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
private void onTarget(EntityTargetLivingEntityEvent event) {
|
|
// Yes, instanceof checks would look way more beautiful here but checking type is much faster
|
|
Entity target = event.getTarget();
|
|
if (
|
|
target != null
|
|
&& target.getType().equals(EntityType.VILLAGER)
|
|
&& villagerManager.getOrAdd((Villager) target).isOptimized()
|
|
) {
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
private void onEntityTargetVillager(EntityPathfindEvent event) {
|
|
Entity target = event.getTargetEntity();
|
|
if (
|
|
target != null
|
|
&& target.getType().equals(EntityType.VILLAGER)
|
|
&& villagerManager.getOrAdd((Villager) target).isOptimized()
|
|
) {
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
private void onEntityAttackVillager(EntityDamageByEntityEvent event) {
|
|
if (
|
|
event.getEntityType().equals(EntityType.VILLAGER)
|
|
&& event.getDamager() instanceof Mob attacker
|
|
&& villagerManager.getOrAdd((Villager) event.getEntity()).isOptimized()
|
|
) {
|
|
attacker.setTarget(null);
|
|
}
|
|
}
|
|
}
|