diff --git a/src/main/java/de/studiocode/invui/gui/GUI.java b/src/main/java/de/studiocode/invui/gui/GUI.java index 699b567..689c57d 100644 --- a/src/main/java/de/studiocode/invui/gui/GUI.java +++ b/src/main/java/de/studiocode/invui/gui/GUI.java @@ -1,7 +1,6 @@ package de.studiocode.invui.gui; import de.studiocode.invui.animation.Animation; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; import de.studiocode.invui.gui.builder.GUIBuilder; import de.studiocode.invui.gui.impl.*; import de.studiocode.invui.gui.structure.Structure; @@ -164,23 +163,6 @@ public interface GUI extends GUIParent { */ void addItems(@NotNull Item... items); - /** - * Gets the {@link ItemStackHolder} on these coordinates. - * - * @param x The x coordinate - * @param y The y coordinate - * @return The {@link ItemStackHolder} which is placed on that slot or null if there isn't one - */ - ItemStackHolder getItemStackHolder(int x, int y); - - /** - * Gets the {@link ItemStackHolder} placed on that slot. - * - * @param index The slot index - * @return The {@link ItemStackHolder} which is placed on that slot or null if there isn't one - */ - ItemStackHolder getItemStackHolder(int index); - /** * Removes an {@link Item} by its coordinates. * @@ -260,9 +242,9 @@ public interface GUI extends GUIParent { * Plays an {@link Animation}. * * @param animation The {@link Animation} to play. - * @param filter The filter that selects which {@link ItemStackHolder}s should be animated. + * @param filter The filter that selects which {@link SlotElement}s should be animated. */ - void playAnimation(@NotNull Animation animation, @Nullable Predicate filter); + void playAnimation(@NotNull Animation animation, @Nullable Predicate filter); /** * Cancels the running {@link Animation} if there is one. diff --git a/src/main/java/de/studiocode/invui/gui/SlotElement.java b/src/main/java/de/studiocode/invui/gui/SlotElement.java index 0fc475b..06938ba 100644 --- a/src/main/java/de/studiocode/invui/gui/SlotElement.java +++ b/src/main/java/de/studiocode/invui/gui/SlotElement.java @@ -8,18 +8,14 @@ import java.util.UUID; public interface SlotElement { - ItemStackHolder getItemStackHolder(); + ItemStack getItemStack(UUID viewerUUID); - interface ItemStackHolder { - - ItemStack getItemStack(UUID viewerUUID); - - } + SlotElement getHoldingElement(); /** * Contains an Item */ - class ItemSlotElement implements SlotElement, ItemStackHolder { + class ItemSlotElement implements SlotElement { private final Item item; @@ -35,9 +31,9 @@ public interface SlotElement { public ItemStack getItemStack(UUID viewerUUID) { return item.getItemBuilder().buildFor(viewerUUID); } - + @Override - public ItemStackHolder getItemStackHolder() { + public SlotElement getHoldingElement() { return this; } @@ -46,7 +42,7 @@ public interface SlotElement { /** * Links to a slot in a virtual inventory */ - class VISlotElement implements SlotElement, ItemStackHolder { + class VISlotElement implements SlotElement { private final VirtualInventory virtualInventory; private final int index; @@ -72,9 +68,9 @@ public interface SlotElement { public ItemStack getItemStack(UUID viewerUUID) { return getItemStack(); } - + @Override - public ItemStackHolder getItemStackHolder() { + public SlotElement getHoldingElement() { return this; } @@ -102,14 +98,20 @@ public interface SlotElement { return slot; } - public ItemStackHolder getItemStackHolder() { + @Override + public SlotElement getHoldingElement() { LinkedSlotElement element = this; while (true) { SlotElement below = element.getGui().getSlotElement(element.getSlotIndex()); if (below instanceof LinkedSlotElement) element = (LinkedSlotElement) below; - else return (ItemStackHolder) below; + else return below; } } + + @Override + public ItemStack getItemStack(UUID viewerUUID) { + return getHoldingElement().getItemStack(viewerUUID); + } } diff --git a/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java b/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java index c7480ee..63ac714 100644 --- a/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java +++ b/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java @@ -2,7 +2,6 @@ package de.studiocode.invui.gui.impl; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; import de.studiocode.invui.gui.SlotElement.LinkedSlotElement; import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.item.Item; @@ -43,11 +42,6 @@ public abstract class BaseGUI extends IndexedGUI { return hasSlotElement(convToIndex(x, y)); } - @Override - public ItemStackHolder getItemStackHolder(int x, int y) { - return getItemStackHolder(convToIndex(x, y)); - } - @Override public void setItem(int x, int y, Item item) { setItem(convToIndex(x, y), item); diff --git a/src/main/java/de/studiocode/invui/gui/impl/IndexedGUI.java b/src/main/java/de/studiocode/invui/gui/impl/IndexedGUI.java index af9bb95..facb144 100644 --- a/src/main/java/de/studiocode/invui/gui/impl/IndexedGUI.java +++ b/src/main/java/de/studiocode/invui/gui/impl/IndexedGUI.java @@ -5,7 +5,6 @@ import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUIParent; import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement.ItemSlotElement; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; import de.studiocode.invui.gui.SlotElement.LinkedSlotElement; import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.gui.structure.Structure; @@ -123,7 +122,7 @@ abstract class IndexedGUI implements GUI { int leftOverAmount; if (window instanceof SplitWindow) { SplitWindow splitWindow = (SplitWindow) window; - GUI[] guis = splitWindow.getGuis(); + GUI[] guis = splitWindow.getGuis(); GUI otherGui = guis[0] == this ? guis[1] : guis[0]; leftOverAmount = ((IndexedGUI) otherGui).putIntoVirtualInventories(player, invStack, virtualInventory); @@ -173,7 +172,7 @@ abstract class IndexedGUI implements GUI { ItemStack toAdd = itemStack.clone(); toAdd.setAmount(amountLeft); amountLeft = virtualInventory.addItem(player, toAdd); - + if (amountLeft == 0) break; } @@ -187,9 +186,9 @@ abstract class IndexedGUI implements GUI { List virtualInventories = new ArrayList<>(); Arrays.stream(slotElements) .filter(Objects::nonNull) - .map(SlotElement::getItemStackHolder) - .filter(holder -> holder instanceof VISlotElement) - .map(holder -> ((VISlotElement) holder).getVirtualInventory()) + .map(SlotElement::getHoldingElement) + .filter(element -> element instanceof VISlotElement) + .map(element -> ((VISlotElement) element).getVirtualInventory()) .filter(vi -> Arrays.stream(ignored).noneMatch(vi::equals)) .forEach(vi -> { if (!virtualInventories.contains(vi)) virtualInventories.add(vi); @@ -252,7 +251,7 @@ abstract class IndexedGUI implements GUI { } @Override - public void playAnimation(@NotNull Animation animation, @Nullable Predicate filter) { + public void playAnimation(@NotNull Animation animation, @Nullable Predicate filter) { if (animation != null) cancelAnimation(); this.animation = animation; @@ -260,8 +259,8 @@ abstract class IndexedGUI implements GUI { List slots = new ArrayList<>(); for (int i = 0; i < size; i++) { - ItemStackHolder holder = getItemStackHolder(i); - if (holder != null && (filter == null || filter.test(holder))) { + SlotElement element = getSlotElement(i); + if (element != null && (filter == null || filter.test(element))) { slots.add(i); setSlotElement(i, null); } @@ -357,20 +356,16 @@ abstract class IndexedGUI implements GUI { public Item getItem(int index) { SlotElement slotElement = slotElements[index]; - if (slotElement != null) { - ItemStackHolder holder = slotElement.getItemStackHolder(); - if (holder instanceof ItemSlotElement) return ((ItemSlotElement) holder).getItem(); + if (slotElement instanceof ItemSlotElement) { + return ((ItemSlotElement) slotElement).getItem(); + } else if (slotElement instanceof LinkedSlotElement) { + SlotElement holdingElement = slotElement.getHoldingElement(); + if (holdingElement instanceof ItemSlotElement) return ((ItemSlotElement) holdingElement).getItem(); } return null; } - @Override - public ItemStackHolder getItemStackHolder(int index) { - SlotElement slotElement = slotElements[index]; - return slotElement == null ? null : slotElement.getItemStackHolder(); - } - @Override public void remove(int index) { setSlotElement(index, null); diff --git a/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java b/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java index 9a9b877..8097f78 100644 --- a/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java @@ -2,8 +2,8 @@ package de.studiocode.invui.window.impl; import de.studiocode.inventoryaccess.api.version.InventoryAccess; import de.studiocode.invui.InvUI; +import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement.ItemSlotElement; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.item.Item; import de.studiocode.invui.util.ArrayUtils; @@ -22,7 +22,7 @@ public abstract class BaseWindow implements Window { private final UUID viewerUUID; private final boolean closeOnEvent; - private final ItemStackHolder[] itemsDisplayed; + private final SlotElement[] elementsDisplayed; private boolean closeable; private boolean closed; @@ -31,45 +31,45 @@ public abstract class BaseWindow implements Window { this.viewerUUID = viewerUUID; this.closeable = closeable; this.closeOnEvent = closeOnEvent; - this.itemsDisplayed = new ItemStackHolder[size]; + this.elementsDisplayed = new SlotElement[size]; WindowManager.getInstance().addWindow(this); } - protected void redrawItem(int index, ItemStackHolder holder, boolean setItem) { + protected void redrawItem(int index, SlotElement element, boolean setItem) { // put ItemStack in inventory - ItemStack itemStack = holder == null ? null : holder.getItemStack(viewerUUID); + ItemStack itemStack = element == null ? null : element.getItemStack(viewerUUID); setInvItem(index, itemStack); if (setItem) { // tell the previous item (if there is one) that this is no longer its window - ItemStackHolder previousHolder = itemsDisplayed[index]; - if (previousHolder instanceof ItemSlotElement) { - ItemSlotElement element = (ItemSlotElement) previousHolder; - Item item = element.getItem(); + SlotElement previousElement = elementsDisplayed[index]; + if (previousElement instanceof ItemSlotElement) { + ItemSlotElement itemSlotElement = (ItemSlotElement) previousElement; + Item item = itemSlotElement.getItem(); // check if the Item isn't still present on another index if (getItemSlotElements(item).size() == 1) { // only if not, remove Window from list in Item item.removeWindow(this); } - } else if (previousHolder instanceof VISlotElement) { - VISlotElement element = (VISlotElement) previousHolder; - VirtualInventory virtualInventory = element.getVirtualInventory(); + } else if (previousElement instanceof VISlotElement) { + VISlotElement viSlotElement = (VISlotElement) previousElement; + VirtualInventory virtualInventory = viSlotElement.getVirtualInventory(); // check if the VirtualInventory isn't still present on another index - if (getVISlotElements(element.getVirtualInventory()).size() == 1) { + if (getVISlotElements(viSlotElement.getVirtualInventory()).size() == 1) { // only if not, remove Window from list in VirtualInventory virtualInventory.removeWindow(this); } } // tell the Item or VirtualInventory that it is being displayed in this Window - if (holder instanceof ItemSlotElement) { - ((ItemSlotElement) holder).getItem().addWindow(this); - } else if (holder instanceof VISlotElement) { - ((VISlotElement) holder).getVirtualInventory().addWindow(this); + if (element instanceof ItemSlotElement) { + ((ItemSlotElement) element).getItem().addWindow(this); + } else if (element instanceof VISlotElement) { + ((VISlotElement) element).getVirtualInventory().addWindow(this); } - itemsDisplayed[index] = holder; + elementsDisplayed[index] = element; } } @@ -103,14 +103,14 @@ public abstract class BaseWindow implements Window { redrawItem(index, slotElement, false)); } - protected Map getItemSlotElements(Item item) { - return ArrayUtils.findAllOccurrences(itemsDisplayed, holder -> holder instanceof ItemSlotElement - && ((ItemSlotElement) holder).getItem() == item); + protected Map getItemSlotElements(Item item) { + return ArrayUtils.findAllOccurrences(elementsDisplayed, element -> element instanceof ItemSlotElement + && ((ItemSlotElement) element).getItem() == item); } - protected Map getVISlotElements(VirtualInventory virtualInventory) { - return ArrayUtils.findAllOccurrences(itemsDisplayed, holder -> holder instanceof VISlotElement - && ((VISlotElement) holder).getVirtualInventory() == virtualInventory); + protected Map getVISlotElements(VirtualInventory virtualInventory) { + return ArrayUtils.findAllOccurrences(elementsDisplayed, element -> element instanceof VISlotElement + && ((VISlotElement) element).getVirtualInventory() == virtualInventory); } @Override @@ -119,10 +119,11 @@ public abstract class BaseWindow implements Window { WindowManager.getInstance().removeWindow(this); - Arrays.stream(itemsDisplayed) + Arrays.stream(elementsDisplayed) .filter(Objects::nonNull) - .filter(holder -> holder instanceof ItemSlotElement) - .map(holder -> ((ItemSlotElement) holder).getItem()) + .map(SlotElement::getHoldingElement) + .filter(element -> element instanceof ItemSlotElement) + .map(element -> ((ItemSlotElement) element).getItem()) .forEach(item -> item.removeWindow(this)); Arrays.stream(getGuis()) diff --git a/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java b/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java index 1159fb3..686741a 100644 --- a/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java @@ -1,7 +1,7 @@ package de.studiocode.invui.window.impl.merged; import de.studiocode.invui.gui.GUI; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; +import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.util.Pair; import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.window.Window; @@ -34,15 +34,15 @@ public abstract class MergedWindow extends BaseWindow { protected void initUpperItems() { for (int i = 0; i < upperInventory.getSize(); i++) { - ItemStackHolder holder = getItemStackHolder(i); - if (holder != null) redrawItem(i, holder, true); + SlotElement element = getSlotElement(i); + if (element != null) redrawItem(i, element, true); } } private void initPlayerItems() { for (int i = upperInventory.getSize(); i < upperInventory.getSize() + 36; i++) { - ItemStackHolder holder = getItemStackHolder(i); - if (holder != null) redrawItem(i, holder, true); + SlotElement element = getSlotElement(i); + if (element != null) redrawItem(i, element, true); } } @@ -62,8 +62,8 @@ public abstract class MergedWindow extends BaseWindow { } @Override - protected void redrawItem(int index, ItemStackHolder holder, boolean setItem) { - super.redrawItem(index, holder, setItem); + protected void redrawItem(int index, SlotElement element, boolean setItem) { + super.redrawItem(index, element, setItem); if (getViewer() != null) getViewer().updateInventory(); // fixes a bug where some items wouldn't be displayed correctly } @@ -136,7 +136,7 @@ public abstract class MergedWindow extends BaseWindow { return playerInventory; } - protected abstract ItemStackHolder getItemStackHolder(int index); + protected abstract SlotElement getSlotElement(int index); protected abstract Pair getWhereClicked(InventoryClickEvent event); diff --git a/src/main/java/de/studiocode/invui/window/impl/merged/combined/CombinedWindow.java b/src/main/java/de/studiocode/invui/window/impl/merged/combined/CombinedWindow.java index 11f07e0..7896699 100644 --- a/src/main/java/de/studiocode/invui/window/impl/merged/combined/CombinedWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/merged/combined/CombinedWindow.java @@ -1,7 +1,7 @@ package de.studiocode.invui.window.impl.merged.combined; import de.studiocode.invui.gui.GUI; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; +import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.util.Pair; import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.window.Window; @@ -27,12 +27,12 @@ public abstract class CombinedWindow extends MergedWindow { @Override public void handleSlotElementUpdate(GUI child, int slotIndex) { - redrawItem(slotIndex, gui.getItemStackHolder(slotIndex), true); + redrawItem(slotIndex, gui.getSlotElement(slotIndex), true); } @Override - protected ItemStackHolder getItemStackHolder(int index) { - return gui.getItemStackHolder(index); + protected SlotElement getSlotElement(int index) { + return gui.getSlotElement(index); } @Override diff --git a/src/main/java/de/studiocode/invui/window/impl/merged/split/SplitWindow.java b/src/main/java/de/studiocode/invui/window/impl/merged/split/SplitWindow.java index 857df45..a18b21c 100644 --- a/src/main/java/de/studiocode/invui/window/impl/merged/split/SplitWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/merged/split/SplitWindow.java @@ -1,7 +1,7 @@ package de.studiocode.invui.window.impl.merged.split; import de.studiocode.invui.gui.GUI; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; +import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.util.Pair; import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.window.Window; @@ -31,13 +31,13 @@ public abstract class SplitWindow extends MergedWindow { @Override public void handleSlotElementUpdate(GUI child, int slotIndex) { redrawItem(child == upperGui ? slotIndex : upperGui.getSize() + slotIndex, - child.getItemStackHolder(slotIndex), true); + child.getSlotElement(slotIndex), true); } @Override - public ItemStackHolder getItemStackHolder(int index) { - if (index >= upperGui.getSize()) return lowerGui.getItemStackHolder(index - upperGui.getSize()); - else return upperGui.getItemStackHolder(index); + public SlotElement getSlotElement(int index) { + if (index >= upperGui.getSize()) return lowerGui.getSlotElement(index - upperGui.getSize()); + else return upperGui.getSlotElement(index); } @Override diff --git a/src/main/java/de/studiocode/invui/window/impl/single/SingleWindow.java b/src/main/java/de/studiocode/invui/window/impl/single/SingleWindow.java index dc8d0d9..7e1ddaf 100644 --- a/src/main/java/de/studiocode/invui/window/impl/single/SingleWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/single/SingleWindow.java @@ -1,7 +1,7 @@ package de.studiocode.invui.window.impl.single; import de.studiocode.invui.gui.GUI; -import de.studiocode.invui.gui.SlotElement.ItemStackHolder; +import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.window.Window; import de.studiocode.invui.window.impl.BaseWindow; import org.bukkit.entity.Player; @@ -33,8 +33,8 @@ public abstract class SingleWindow extends BaseWindow { protected void initItems() { for (int i = 0; i < size; i++) { - ItemStackHolder holder = gui.getItemStackHolder(i); - if (holder != null) redrawItem(i, holder, true); + SlotElement element = gui.getSlotElement(i); + if (element != null) redrawItem(i, element, true); } } @@ -55,7 +55,7 @@ public abstract class SingleWindow extends BaseWindow { @Override public void handleSlotElementUpdate(GUI child, int slotIndex) { - redrawItem(slotIndex, gui.getItemStackHolder(slotIndex), true); + redrawItem(slotIndex, gui.getSlotElement(slotIndex), true); } @Override