Easter/src/main/java/com/alttd/easter/npc/RabbitNpcManager.java

115 lines
4.2 KiB
Java

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<EggType> 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);
}
}