From 11dab1eba74f6f92c780ba715ab136ab9989da27 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Sat, 23 Apr 2022 18:18:46 +0200 Subject: [PATCH] Fixed background not working for nested GUIs --- .../de/studiocode/invui/gui/SlotElement.java | 16 ++++++++++++++++ .../studiocode/invui/window/impl/BaseWindow.java | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/SlotElement.java b/InvUI/src/main/java/de/studiocode/invui/gui/SlotElement.java index 29c6515..c0845ef 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/SlotElement.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/SlotElement.java @@ -5,6 +5,8 @@ import de.studiocode.invui.item.ItemProvider; import de.studiocode.invui.virtualinventory.VirtualInventory; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; public interface SlotElement { @@ -119,6 +121,20 @@ public interface SlotElement { } } + public List getGuiList() { + ArrayList guis = new ArrayList<>(); + LinkedSlotElement element = this; + while (true) { + guis.add(element.getGui()); + SlotElement below = element.getGui().getSlotElement(element.getSlotIndex()); + if (below instanceof LinkedSlotElement) + element = (LinkedSlotElement) below; + else break; + } + + return guis; + } + @Override public ItemStack getItemStack(UUID viewerUUID) { SlotElement holdingElement = getHoldingElement(); diff --git a/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java b/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java index 31375c2..13b3217 100644 --- a/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java +++ b/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java @@ -5,6 +5,7 @@ import de.studiocode.invui.InvUI; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement.ItemSlotElement; +import de.studiocode.invui.gui.SlotElement.LinkedSlotElement; import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.item.Item; import de.studiocode.invui.item.ItemProvider; @@ -73,6 +74,18 @@ public abstract class BaseWindow implements Window { } } else if (element == null || (element instanceof VISlotElement && element.getItemStack(viewerUUID) == null)) { ItemProvider background = getGuiAt(index).getFirst().getBackground(); + itemStack = background == null ? null : background.getFor(viewerUUID); + } else if (element instanceof LinkedSlotElement && element.getHoldingElement() == null) { + ItemProvider background = null; + + List guis = ((LinkedSlotElement) element).getGuiList(); + guis.add(0, getGuiAt(index).getFirst()); + + for (int i = guis.size() - 1; i >= 0; i--) { + background = guis.get(i).getBackground(); + if (background != null) break; + } + itemStack = background == null ? null : background.getFor(viewerUUID); } else itemStack = element.getItemStack(viewerUUID); setInvItem(index, itemStack);