mirror of
https://github.com/rockyhawk64/CommandPanels.git
synced 2025-11-18 07:14:17 +01:00
items not required in panels
This commit is contained in:
parent
0e54612746
commit
00c67b84c5
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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."),
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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 -> {
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user