2026-04-03 23:08:30 +00:00
|
|
|
package com.alttd.easter.gui;
|
|
|
|
|
|
|
|
|
|
import com.alttd.easter.config.Messages;
|
|
|
|
|
import com.alttd.easter.data.DataManager;
|
|
|
|
|
import com.alttd.easter.egg.EggType;
|
|
|
|
|
import com.alttd.easter.util.ItemUtils;
|
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
|
|
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
|
|
|
|
import org.bukkit.inventory.Inventory;
|
|
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
public class TurnInGuiManager implements Listener {
|
|
|
|
|
|
|
|
|
|
private final DataManager dataManager;
|
|
|
|
|
private final Map<UUID, Inventory> openInventories = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
public TurnInGuiManager(DataManager dataManager) {
|
|
|
|
|
this.dataManager = dataManager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String title() {
|
|
|
|
|
// crude strip of minimessage tags for inventory title
|
|
|
|
|
String mm = Messages.RABBIT.GUI_TITLE;
|
|
|
|
|
String plain = mm.replaceAll("<[^>]+>", "");
|
2026-04-03 23:09:18 +00:00
|
|
|
if (plain.isBlank()) {
|
|
|
|
|
plain = "Turn in Eggs";
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
return plain;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void open(Player player) {
|
|
|
|
|
Inventory inv = Bukkit.createInventory(player, 27, title());
|
|
|
|
|
openInventories.put(player.getUniqueId(), inv);
|
|
|
|
|
player.openInventory(inv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
|
public void onClick(InventoryClickEvent event) {
|
2026-04-03 23:09:18 +00:00
|
|
|
if (!(event.getWhoClicked() instanceof Player player)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
Inventory top = openInventories.get(player.getUniqueId());
|
2026-04-03 23:09:18 +00:00
|
|
|
if (top == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!event.getView().getTopInventory().equals(top)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
|
|
|
|
|
// If clicking in player inventory with shift-click, prevent moving non-egg items into GUI
|
|
|
|
|
if (event.isShiftClick() && event.getClickedInventory() != null && event.getClickedInventory().equals(player.getInventory())) {
|
|
|
|
|
ItemStack stack = event.getCurrentItem();
|
|
|
|
|
if (stack != null && !stack.getType().isAir() && !ItemUtils.isEggItem(stack)) {
|
|
|
|
|
event.setCancelled(true);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If placing an item into the GUI (cursor over top inventory), only allow egg items
|
|
|
|
|
boolean inTop = event.getRawSlot() < top.getSize() && event.getRawSlot() >= 0;
|
|
|
|
|
if (inTop) {
|
|
|
|
|
ItemStack cursor = event.getCursor();
|
|
|
|
|
if (!cursor.getType().isAir() && !ItemUtils.isEggItem(cursor)) {
|
|
|
|
|
event.setCancelled(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
|
public void onClose(InventoryCloseEvent event) {
|
|
|
|
|
Player player = (Player) event.getPlayer();
|
|
|
|
|
Inventory top = openInventories.remove(player.getUniqueId());
|
2026-04-03 23:09:18 +00:00
|
|
|
if (top == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!event.getInventory().equals(top)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
// collect egg items and clear them from the GUI so they don't drop
|
|
|
|
|
Set<EggType> submitted = new HashSet<>();
|
|
|
|
|
for (ItemStack item : top.getContents()) {
|
|
|
|
|
if (ItemUtils.isEggItem(item)) {
|
|
|
|
|
EggType type = ItemUtils.getEggType(item);
|
2026-04-03 23:09:18 +00:00
|
|
|
if (type != null) {
|
|
|
|
|
submitted.add(type);
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
top.clear();
|
|
|
|
|
if (submitted.isEmpty()) {
|
|
|
|
|
player.sendRichMessage(Messages.RABBIT.NO_EGGS);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int before = dataManager.getPlayerEggs(player.getUniqueId()).size();
|
|
|
|
|
int added = dataManager.addEggs(player.getUniqueId(), submitted);
|
|
|
|
|
dataManager.save();
|
|
|
|
|
// Dialog formatting for submission summary
|
|
|
|
|
List<String> colors = submitted.stream().map(ItemUtils::colorName).toList();
|
|
|
|
|
if (colors.size() == 1) {
|
|
|
|
|
player.sendRichMessage(Messages.RABBIT.ONE_EGG,
|
2026-04-03 23:09:18 +00:00
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
|
|
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", colors.getFirst())
|
|
|
|
|
);
|
2026-04-03 23:08:30 +00:00
|
|
|
} else {
|
|
|
|
|
String c1 = !colors.isEmpty() ? colors.get(0) : "";
|
|
|
|
|
String c2 = colors.size() > 1 ? colors.get(1) : "";
|
|
|
|
|
String c3 = colors.size() > 2 ? colors.get(2) : "";
|
|
|
|
|
player.sendRichMessage(Messages.RABBIT.MULTI_EGGS,
|
2026-04-03 23:09:18 +00:00
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
|
|
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", c1),
|
|
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg2", c2),
|
|
|
|
|
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg3", c3)
|
|
|
|
|
);
|
2026-04-03 23:08:30 +00:00
|
|
|
}
|
|
|
|
|
int total = dataManager.getPlayerEggs(player.getUniqueId()).size();
|
|
|
|
|
if (total % 4 == 0) {
|
|
|
|
|
var prize = com.alttd.easter.config.Config.PRIZES.getRandomPrize();
|
2026-04-03 23:09:18 +00:00
|
|
|
if (prize != null) {
|
|
|
|
|
player.getInventory().addItem(prize);
|
|
|
|
|
}
|
2026-04-03 23:08:30 +00:00
|
|
|
player.sendRichMessage(Messages.RABBIT.REWARD);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|