2026-04-03 23:08:30 +00:00
|
|
|
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;
|
|
|
|
|
|
2026-04-03 23:09:18 +00:00
|
|
|
import java.util.UUID;
|
2026-04-03 23:08:30 +00:00
|
|
|
|
|
|
|
|
@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());
|
2026-04-03 23:09:18 +00:00
|
|
|
if (loc == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT);
|
|
|
|
|
rabbit.setCustomNameVisible(true);
|
|
|
|
|
rabbit.customName(net.kyori.adventure.text.Component.text("Easter Bunny"));
|
2026-04-03 23:09:18 +00:00
|
|
|
rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1);
|
2026-04-03 23:08:30 +00:00
|
|
|
rabbitId = rabbit.getUniqueId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
|
public void onInteract(PlayerInteractAtEntityEvent event) {
|
2026-04-03 23:09:18 +00:00
|
|
|
if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof org.bukkit.entity.LivingEntity le && le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
event.setCancelled(true);
|
|
|
|
|
Player player = event.getPlayer();
|
|
|
|
|
// Right click -> open GUI
|
|
|
|
|
openTurnIn(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
|
public void onLeftClick(EntityDamageByEntityEvent event) {
|
2026-04-03 23:09:18 +00:00
|
|
|
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;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
event.setCancelled(true);
|
|
|
|
|
player.sendRichMessage(Messages.RABBIT.LEFT_CLICK_INTRO,
|
2026-04-03 23:09:18 +00:00
|
|
|
Placeholder.parsed("player", player.getName())
|
|
|
|
|
);
|
2026-04-03 23:08:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void openTurnIn(Player player) {
|
|
|
|
|
// Delegate to TurnInGuiManager which controls the inventory and submission flow
|
|
|
|
|
turnInGuiManager.open(player);
|
|
|
|
|
}
|
|
|
|
|
}
|