package com.alttd.easter.npc; import com.alttd.easter.config.Config; import com.alttd.easter.config.Messages; import com.alttd.easter.data.DataManager; import com.alttd.easter.egg.EggType; import com.alttd.easter.gui.TurnInGuiManager; import com.alttd.easter.util.ItemUtils; import com.alttd.easter.util.Keys; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @SuppressWarnings("ClassCanBeRecord") public class RabbitNpcManager implements Listener { private final org.bukkit.plugin.Plugin plugin; private final com.alttd.easter.gui.TurnInGuiManager turnInGuiManager; private final DataManager dataManager; public RabbitNpcManager(Plugin plugin, TurnInGuiManager turnInGuiManager, DataManager dataManager) { this.plugin = plugin; this.turnInGuiManager = turnInGuiManager; this.dataManager = dataManager; spawnOrFindRabbit(); } public void reload() { spawnOrFindRabbit(); } private void spawnOrFindRabbit() { // Find existing rabbit with tag, else spawn new at config location for (World world : Bukkit.getWorlds()) { for (Entity entity : world.getEntitiesByClass(Rabbit.class)) { if (entity.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { return; } } } var loc = Config.RABBIT.getLocation(plugin.getServer()); if (loc == null) { return; } Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT); rabbit.setCustomNameVisible(true); rabbit.setInvulnerable(true); rabbit.setSilent(true); rabbit.setGlowing(true); rabbit.setGravity(false); rabbit.setAI(false); rabbit.customName(Component.text("Easter Bunny")); rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1); } @EventHandler public void onInteract(PlayerInteractAtEntityEvent event) { if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof LivingEntity livingEntity && livingEntity.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) { return; } event.setCancelled(true); Player player = event.getPlayer(); // Right click -> open GUI openTurnIn(player); } @EventHandler public void onLeftClick(EntityDamageByEntityEvent event) { if (!(event.getEntity() instanceof org.bukkit.entity.LivingEntity le)) { return; } if (!le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { return; } if (!(event.getDamager() instanceof Player player)) { return; } event.setCancelled(true); player.sendRichMessage(Messages.RABBIT.LEFT_CLICK_INTRO, Placeholder.parsed("player", player.getName()) ); var eggs = dataManager.getPlayerEggs(player.getUniqueId()); if (eggs.isEmpty()) { player.sendRichMessage(Messages.RABBIT.TURNED_IN_NONE); return; } List sorted = eggs.stream() .sorted(Comparator.comparingInt(Enum::ordinal)) .toList(); String names = sorted.stream() .map(e -> ItemUtils.prettify(e.name())) .collect(Collectors.joining(", ")); player.sendRichMessage(Messages.RABBIT.TURNED_IN_LIST, Placeholder.parsed("eggs", names)); } private void openTurnIn(Player player) { turnInGuiManager.open(player); } }