package me.loganb1max.minions.manager; import lombok.Getter; import me.loganb1max.minions.MinionsPlugin; import me.loganb1max.minions.menu.MinionMenu; import me.loganb1max.minions.model.Minion; import me.loganb1max.minions.util.Text; import org.bukkit.Bukkit; import org.bukkit.entity.ArmorStand; 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.EntityDamageEvent; import org.bukkit.event.player.PlayerArmorStandManipulateEvent; import org.bukkit.scheduler.BukkitTask; import java.util.HashSet; import java.util.Objects; import java.util.Set; public class MinionManager implements Listener { private final MinionsPlugin plugin; private BukkitTask animationTask; @Getter private Set minions = new HashSet<>(); public MinionManager(final MinionsPlugin plugin) { this.plugin = plugin; this.animationTask = Bukkit.getScheduler().runTaskTimer(this.plugin, () -> this.minions.forEach(Minion::tick), 10, 10); Bukkit.getPluginManager().registerEvents(this, this.plugin); } public void close() { this.animationTask.cancel(); HandlerList.unregisterAll(this); } @EventHandler(priority = EventPriority.HIGHEST) public void onDamage(final EntityDamageEvent e) { if (!(e.getEntity() instanceof ArmorStand)) return; if (this.minions.stream().map(Minion::getId).filter(Objects::nonNull).anyMatch(uuid -> uuid.equals(e.getEntity().getUniqueId()))) { e.setCancelled(true); } } @EventHandler(priority = EventPriority.HIGHEST) public void onRightClick(final PlayerArmorStandManipulateEvent e) { this.minions.stream().filter(minion -> minion.getId().equals(e.getRightClicked().getUniqueId())).findFirst().ifPresent(minion -> { e.setCancelled(true); if (!minion.getOwner().equals(e.getPlayer().getUniqueId())) { e.getPlayer().sendMessage(Text.color("&cOnly the owner of the minion can interact with it.")); return; } if (e.getPlayer().isSneaking()) { minion.pickup(e.getPlayer()); return; } new MinionMenu(minion, e.getPlayer()); }); } }