Easter/src/main/java/com/alttd/easter/gui/TurnInGuiManager.java

133 lines
5.2 KiB
Java
Raw Normal View History

2026-04-03 23:08:30 +00:00
package com.alttd.easter.gui;
2026-04-05 14:14:12 +00:00
import com.alttd.easter.config.Config;
2026-04-03 23:08:30 +00:00
import com.alttd.easter.config.Messages;
import com.alttd.easter.data.DataManager;
import com.alttd.easter.egg.EggType;
import com.alttd.easter.util.ItemUtils;
2026-04-05 14:14:12 +00:00
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
2026-04-03 23:08:30 +00:00
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;
}
2026-04-05 14:14:12 +00:00
private Component title() {
return MiniMessage.miniMessage().deserialize(Messages.RABBIT.GUI_TITLE);
2026-04-03 23:08:30 +00:00
}
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;
}
2026-04-05 14:14:12 +00:00
// determine how many new unique egg types were added so we can award correct number of prizes
int prevTotal = dataManager.getPlayerEggs(player.getUniqueId()).size();
int newlyAdded = dataManager.addEggs(player.getUniqueId(), submitted);
2026-04-03 23:08:30 +00:00
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,
Placeholder.parsed("player", player.getName()),
Placeholder.parsed("egg1", colors.getFirst())
2026-04-03 23:09:18 +00:00
);
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,
Placeholder.parsed("player", player.getName()),
Placeholder.parsed("egg1", c1),
Placeholder.parsed("egg2", c2),
Placeholder.parsed("egg3", c3)
2026-04-03 23:09:18 +00:00
);
2026-04-03 23:08:30 +00:00
}
2026-04-05 14:14:12 +00:00
int newTotal = prevTotal + newlyAdded;
int prevMilestones = prevTotal / 4;
int newMilestones = newTotal / 4;
int prizesToGive = Math.max(0, newMilestones - prevMilestones);
for (int i = 0; i < prizesToGive; i++) {
var prize = 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);
}
}
}