items not required in panels

This commit is contained in:
rockyhawk64 2025-10-06 00:06:35 +11:00
parent 0e54612746
commit 00c67b84c5
6 changed files with 19 additions and 36 deletions

View File

@ -2,7 +2,6 @@ package me.rockyhawk.commandpanels.builder.inventory;
import me.rockyhawk.commandpanels.Context;
import me.rockyhawk.commandpanels.builder.PanelBuilder;
import me.rockyhawk.commandpanels.formatter.language.Message;
import me.rockyhawk.commandpanels.session.Panel;
import me.rockyhawk.commandpanels.session.SessionManager;
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
@ -24,10 +23,6 @@ public class InventoryPanelBuilder extends PanelBuilder {
throw new IllegalArgumentException("Expected InventoryPanel, got " + panel.getClass());
}
Inventory panelInv = panelFactory.createInventory((InventoryPanel) panel, this.getPlayer());
if(panelInv.isEmpty()) {
ctx.text.sendError(this.getPlayer(), Message.PANEL_NO_ITEMS);
return;
}
this.getPlayer().openInventory(panelInv);
ctx.session.updateSession(this.getPlayer(), panel, openType);
}

View File

@ -16,6 +16,7 @@ import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType;
@ -38,13 +39,13 @@ public class PanelFactory {
if (rows.matches("\\d+")) {
int rowsNum = Integer.parseInt(rows);
if(rowsNum > 6) rowsNum = 6;
inv = Bukkit.createInventory(p, rowsNum * 9, title);
inv = Bukkit.createInventory(panel, rowsNum * 9, title);
} else {
try {
inv = Bukkit.createInventory(p, InventoryType.valueOf(rows.toUpperCase()), title);
inv = Bukkit.createInventory(panel, InventoryType.valueOf(rows.toUpperCase()), title);
} catch (IllegalArgumentException e) {
ctx.text.sendError(p, Message.PANEL_INVALID_TYPE);
inv = Bukkit.createInventory(p, 9, title); // fallback to 1 row
inv = Bukkit.createInventory(panel, 9, title); // fallback to 1 row
}
}

View File

@ -21,7 +21,6 @@ public enum Message {
// PanelBuilder / PanelFactory / OpenCommand
PANEL_LAYOUT_NUMBER_MISSING("Panel layout is missing/skipping a number."),
PANEL_NO_ITEMS("Panel must contain at least one item."),
PANEL_INVALID_TYPE("Invalid inventory type."),
PANEL_NOT_FOUND("Panel not found."),
PANEL_OPEN_TRIGGERED("Panel open triggered for player."),

View File

@ -11,13 +11,15 @@ import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.geysermc.floodgate.api.FloodgateApi;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InventoryPanel extends Panel {
public class InventoryPanel extends Panel implements InventoryHolder {
private final String rows;
private final Map<String, PanelItem> items = new HashMap<>();
private final Map<String, List<String>> slots = new HashMap<>();
@ -89,4 +91,10 @@ public class InventoryPanel extends Panel {
public String getUpdateDelay() {
return updateDelay;
}
// For InventoryHolder implementation
@Override
public Inventory getInventory() {
return null;
}
}

View File

@ -35,10 +35,7 @@ public class ClickEvents implements Listener {
public void onInventoryClick(InventoryClickEvent e) {
if (!(e.getWhoClicked() instanceof Player player)) return;
if (e.getClickedInventory() == null) return;
// Only block top inventory interactions
Inventory topInventory = e.getView().getTopInventory();
if (!e.getClickedInventory().equals(topInventory)) return;
if (!(e.getClickedInventory().getHolder() instanceof InventoryPanel)) return;
ItemStack item = e.getCurrentItem();
if (item == null || !item.hasItemMeta()) return;
@ -79,12 +76,11 @@ public class ClickEvents implements Listener {
@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
if (!(event.getWhoClicked() instanceof Player)) return;
Inventory topInventory = event.getView().getTopInventory();
int topSize = topInventory.getSize();
if(!(topInventory.getHolder() instanceof InventoryPanel)) return;
// Only care about drag targets in the top inventory
int topSize = topInventory.getSize();
boolean draggingOverPanelItem = event.getRawSlots().stream()
.filter(slot -> slot < topSize) // only slots in the top inventory
.anyMatch(slot -> {

View File

@ -2,6 +2,7 @@ package me.rockyhawk.commandpanels.session.inventory.listeners;
import me.rockyhawk.commandpanels.Context;
import me.rockyhawk.commandpanels.session.PanelSession;
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -34,7 +35,7 @@ public class InventoryEvents implements Listener {
// Only remove the session if the player has one
PanelSession session = ctx.session.getPlayerSession(player);
if (isPanelInventory(event.getInventory())) {
if (event.getInventory().getHolder() instanceof InventoryPanel) {
itemSanitiser(player.getInventory());
itemDropper(player, event.getInventory());
if(session != null) session.removeUpdateTask();
@ -58,29 +59,12 @@ public class InventoryEvents implements Listener {
private void closePanels(Player p){
if (p.getOpenInventory() != null) { // Player has an open inventory
if (isPanelInventory(p.getOpenInventory().getTopInventory())) {
if (p.getOpenInventory().getTopInventory().getHolder() instanceof InventoryPanel) {
p.closeInventory();
}
}
}
private boolean isPanelInventory(Inventory inv) {
NamespacedKey itemIdKey = new NamespacedKey(ctx.plugin, "item_id");
for (ItemStack item : inv) {
if (item == null) continue;
ItemMeta meta = item.getItemMeta();
if (meta == null) continue;
if (meta.getPersistentDataContainer().has(itemIdKey, PersistentDataType.STRING)) {
String val = meta.getPersistentDataContainer().get(itemIdKey, PersistentDataType.STRING);
if (val != null) {
return true;
}
}
}
return false;
}
private void itemSanitiser(PlayerInventory inv) {
if (inv == null) return;