package com.alttd.easter.npc; import com.alttd.easter.config.Config; import com.alttd.easter.config.Messages; import com.alttd.easter.gui.TurnInGuiManager; import com.alttd.easter.util.Keys; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Rabbit; 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.UUID; @SuppressWarnings("ClassCanBeRecord") public class RabbitNpcManager implements Listener { private final org.bukkit.plugin.Plugin plugin; private final com.alttd.easter.gui.TurnInGuiManager turnInGuiManager; public RabbitNpcManager(Plugin plugin, TurnInGuiManager turnInGuiManager) { this.plugin = plugin; this.turnInGuiManager = turnInGuiManager; spawnOrFindRabbit(); } public void reload() { spawnOrFindRabbit(); } private void spawnOrFindRabbit() { // Find existing rabbit with tag, else spawn new at config location UUID rabbitId; for (org.bukkit.World world : Bukkit.getWorlds()) { for (org.bukkit.entity.Entity e : world.getEntitiesByClass(Rabbit.class)) { if (e.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { rabbitId = e.getUniqueId(); 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.customName(net.kyori.adventure.text.Component.text("Easter Bunny")); rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1); rabbitId = rabbit.getUniqueId(); } @EventHandler public void onInteract(PlayerInteractAtEntityEvent event) { if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof org.bukkit.entity.LivingEntity le && le.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()) ); } private void openTurnIn(Player player) { // Delegate to TurnInGuiManager which controls the inventory and submission flow turnInGuiManager.open(player); } }