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:37:07 +00:00
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2026-04-05 14:14:12 +00:00
|
|
|
import net.kyori.adventure.text.Component;
|
|
|
|
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
2026-04-04 02:18:05 +00:00
|
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
2026-04-03 23:08:30 +00:00
|
|
|
import org.bukkit.Bukkit;
|
2026-04-05 14:37:07 +00:00
|
|
|
import org.bukkit.entity.Item;
|
2026-04-03 23:08:30 +00:00
|
|
|
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.*;
|
|
|
|
|
|
2026-04-05 14:37:07 +00:00
|
|
|
@Slf4j
|
2026-04-03 23:08:30 +00:00
|
|
|
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();
|
2026-04-05 14:37:07 +00:00
|
|
|
Inventory top = openInventories.get(player.getUniqueId());
|
2026-04-03 23:09:18 +00:00
|
|
|
if (top == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-05 14:37:07 +00:00
|
|
|
if (!event.getView().getTopInventory().equals(top)) {
|
2026-04-03 23:09:18 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2026-04-05 14:37:07 +00:00
|
|
|
|
|
|
|
|
openInventories.remove(player.getUniqueId());
|
|
|
|
|
|
|
|
|
|
// collect egg items for submission and then clear GUI so eggs don't drop
|
2026-04-03 23:08:30 +00:00
|
|
|
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,
|
2026-04-04 02:18:05 +00:00
|
|
|
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,
|
2026-04-04 02:18:05 +00:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|