Removed ItemStackHolder

This commit is contained in:
NichtStudioCode 2021-02-11 22:34:05 +01:00
parent 459f19d7b3
commit 8d3f4e3690
9 changed files with 80 additions and 106 deletions

@ -1,7 +1,6 @@
package de.studiocode.invui.gui; package de.studiocode.invui.gui;
import de.studiocode.invui.animation.Animation; 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.builder.GUIBuilder;
import de.studiocode.invui.gui.impl.*; import de.studiocode.invui.gui.impl.*;
import de.studiocode.invui.gui.structure.Structure; import de.studiocode.invui.gui.structure.Structure;
@ -164,23 +163,6 @@ public interface GUI extends GUIParent {
*/ */
void addItems(@NotNull Item... items); 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. * Removes an {@link Item} by its coordinates.
* *
@ -260,9 +242,9 @@ public interface GUI extends GUIParent {
* Plays an {@link Animation}. * Plays an {@link Animation}.
* *
* @param animation The {@link Animation} to play. * @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<ItemStackHolder> filter); void playAnimation(@NotNull Animation animation, @Nullable Predicate<SlotElement> filter);
/** /**
* Cancels the running {@link Animation} if there is one. * Cancels the running {@link Animation} if there is one.

@ -8,18 +8,14 @@ import java.util.UUID;
public interface SlotElement { public interface SlotElement {
ItemStackHolder getItemStackHolder();
interface ItemStackHolder {
ItemStack getItemStack(UUID viewerUUID); ItemStack getItemStack(UUID viewerUUID);
} SlotElement getHoldingElement();
/** /**
* Contains an Item * Contains an Item
*/ */
class ItemSlotElement implements SlotElement, ItemStackHolder { class ItemSlotElement implements SlotElement {
private final Item item; private final Item item;
@ -37,7 +33,7 @@ public interface SlotElement {
} }
@Override @Override
public ItemStackHolder getItemStackHolder() { public SlotElement getHoldingElement() {
return this; return this;
} }
@ -46,7 +42,7 @@ public interface SlotElement {
/** /**
* Links to a slot in a virtual inventory * Links to a slot in a virtual inventory
*/ */
class VISlotElement implements SlotElement, ItemStackHolder { class VISlotElement implements SlotElement {
private final VirtualInventory virtualInventory; private final VirtualInventory virtualInventory;
private final int index; private final int index;
@ -74,7 +70,7 @@ public interface SlotElement {
} }
@Override @Override
public ItemStackHolder getItemStackHolder() { public SlotElement getHoldingElement() {
return this; return this;
} }
@ -102,15 +98,21 @@ public interface SlotElement {
return slot; return slot;
} }
public ItemStackHolder getItemStackHolder() { @Override
public SlotElement getHoldingElement() {
LinkedSlotElement element = this; LinkedSlotElement element = this;
while (true) { while (true) {
SlotElement below = element.getGui().getSlotElement(element.getSlotIndex()); SlotElement below = element.getGui().getSlotElement(element.getSlotIndex());
if (below instanceof LinkedSlotElement) element = (LinkedSlotElement) below; if (below instanceof LinkedSlotElement) element = (LinkedSlotElement) below;
else return (ItemStackHolder) below; else return below;
} }
} }
@Override
public ItemStack getItemStack(UUID viewerUUID) {
return getHoldingElement().getItemStack(viewerUUID);
}
} }
} }

@ -2,7 +2,6 @@ package de.studiocode.invui.gui.impl;
import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.gui.SlotElement; 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.LinkedSlotElement;
import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.gui.SlotElement.VISlotElement;
import de.studiocode.invui.item.Item; import de.studiocode.invui.item.Item;
@ -43,11 +42,6 @@ public abstract class BaseGUI extends IndexedGUI {
return hasSlotElement(convToIndex(x, y)); return hasSlotElement(convToIndex(x, y));
} }
@Override
public ItemStackHolder getItemStackHolder(int x, int y) {
return getItemStackHolder(convToIndex(x, y));
}
@Override @Override
public void setItem(int x, int y, Item item) { public void setItem(int x, int y, Item item) {
setItem(convToIndex(x, y), item); setItem(convToIndex(x, y), item);

@ -5,7 +5,6 @@ import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.gui.GUIParent; import de.studiocode.invui.gui.GUIParent;
import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement;
import de.studiocode.invui.gui.SlotElement.ItemSlotElement; 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.LinkedSlotElement;
import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.gui.SlotElement.VISlotElement;
import de.studiocode.invui.gui.structure.Structure; import de.studiocode.invui.gui.structure.Structure;
@ -187,9 +186,9 @@ abstract class IndexedGUI implements GUI {
List<VirtualInventory> virtualInventories = new ArrayList<>(); List<VirtualInventory> virtualInventories = new ArrayList<>();
Arrays.stream(slotElements) Arrays.stream(slotElements)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(SlotElement::getItemStackHolder) .map(SlotElement::getHoldingElement)
.filter(holder -> holder instanceof VISlotElement) .filter(element -> element instanceof VISlotElement)
.map(holder -> ((VISlotElement) holder).getVirtualInventory()) .map(element -> ((VISlotElement) element).getVirtualInventory())
.filter(vi -> Arrays.stream(ignored).noneMatch(vi::equals)) .filter(vi -> Arrays.stream(ignored).noneMatch(vi::equals))
.forEach(vi -> { .forEach(vi -> {
if (!virtualInventories.contains(vi)) virtualInventories.add(vi); if (!virtualInventories.contains(vi)) virtualInventories.add(vi);
@ -252,7 +251,7 @@ abstract class IndexedGUI implements GUI {
} }
@Override @Override
public void playAnimation(@NotNull Animation animation, @Nullable Predicate<ItemStackHolder> filter) { public void playAnimation(@NotNull Animation animation, @Nullable Predicate<SlotElement> filter) {
if (animation != null) cancelAnimation(); if (animation != null) cancelAnimation();
this.animation = animation; this.animation = animation;
@ -260,8 +259,8 @@ abstract class IndexedGUI implements GUI {
List<Integer> slots = new ArrayList<>(); List<Integer> slots = new ArrayList<>();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
ItemStackHolder holder = getItemStackHolder(i); SlotElement element = getSlotElement(i);
if (holder != null && (filter == null || filter.test(holder))) { if (element != null && (filter == null || filter.test(element))) {
slots.add(i); slots.add(i);
setSlotElement(i, null); setSlotElement(i, null);
} }
@ -357,20 +356,16 @@ abstract class IndexedGUI implements GUI {
public Item getItem(int index) { public Item getItem(int index) {
SlotElement slotElement = slotElements[index]; SlotElement slotElement = slotElements[index];
if (slotElement != null) { if (slotElement instanceof ItemSlotElement) {
ItemStackHolder holder = slotElement.getItemStackHolder(); return ((ItemSlotElement) slotElement).getItem();
if (holder instanceof ItemSlotElement) return ((ItemSlotElement) holder).getItem(); } else if (slotElement instanceof LinkedSlotElement) {
SlotElement holdingElement = slotElement.getHoldingElement();
if (holdingElement instanceof ItemSlotElement) return ((ItemSlotElement) holdingElement).getItem();
} }
return null; return null;
} }
@Override
public ItemStackHolder getItemStackHolder(int index) {
SlotElement slotElement = slotElements[index];
return slotElement == null ? null : slotElement.getItemStackHolder();
}
@Override @Override
public void remove(int index) { public void remove(int index) {
setSlotElement(index, null); setSlotElement(index, null);

@ -2,8 +2,8 @@ package de.studiocode.invui.window.impl;
import de.studiocode.inventoryaccess.api.version.InventoryAccess; import de.studiocode.inventoryaccess.api.version.InventoryAccess;
import de.studiocode.invui.InvUI; import de.studiocode.invui.InvUI;
import de.studiocode.invui.gui.SlotElement;
import de.studiocode.invui.gui.SlotElement.ItemSlotElement; 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.gui.SlotElement.VISlotElement;
import de.studiocode.invui.item.Item; import de.studiocode.invui.item.Item;
import de.studiocode.invui.util.ArrayUtils; import de.studiocode.invui.util.ArrayUtils;
@ -22,7 +22,7 @@ public abstract class BaseWindow implements Window {
private final UUID viewerUUID; private final UUID viewerUUID;
private final boolean closeOnEvent; private final boolean closeOnEvent;
private final ItemStackHolder[] itemsDisplayed; private final SlotElement[] elementsDisplayed;
private boolean closeable; private boolean closeable;
private boolean closed; private boolean closed;
@ -31,45 +31,45 @@ public abstract class BaseWindow implements Window {
this.viewerUUID = viewerUUID; this.viewerUUID = viewerUUID;
this.closeable = closeable; this.closeable = closeable;
this.closeOnEvent = closeOnEvent; this.closeOnEvent = closeOnEvent;
this.itemsDisplayed = new ItemStackHolder[size]; this.elementsDisplayed = new SlotElement[size];
WindowManager.getInstance().addWindow(this); 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 // put ItemStack in inventory
ItemStack itemStack = holder == null ? null : holder.getItemStack(viewerUUID); ItemStack itemStack = element == null ? null : element.getItemStack(viewerUUID);
setInvItem(index, itemStack); setInvItem(index, itemStack);
if (setItem) { if (setItem) {
// tell the previous item (if there is one) that this is no longer its window // tell the previous item (if there is one) that this is no longer its window
ItemStackHolder previousHolder = itemsDisplayed[index]; SlotElement previousElement = elementsDisplayed[index];
if (previousHolder instanceof ItemSlotElement) { if (previousElement instanceof ItemSlotElement) {
ItemSlotElement element = (ItemSlotElement) previousHolder; ItemSlotElement itemSlotElement = (ItemSlotElement) previousElement;
Item item = element.getItem(); Item item = itemSlotElement.getItem();
// check if the Item isn't still present on another index // check if the Item isn't still present on another index
if (getItemSlotElements(item).size() == 1) { if (getItemSlotElements(item).size() == 1) {
// only if not, remove Window from list in Item // only if not, remove Window from list in Item
item.removeWindow(this); item.removeWindow(this);
} }
} else if (previousHolder instanceof VISlotElement) { } else if (previousElement instanceof VISlotElement) {
VISlotElement element = (VISlotElement) previousHolder; VISlotElement viSlotElement = (VISlotElement) previousElement;
VirtualInventory virtualInventory = element.getVirtualInventory(); VirtualInventory virtualInventory = viSlotElement.getVirtualInventory();
// check if the VirtualInventory isn't still present on another index // 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 // only if not, remove Window from list in VirtualInventory
virtualInventory.removeWindow(this); virtualInventory.removeWindow(this);
} }
} }
// tell the Item or VirtualInventory that it is being displayed in this Window // tell the Item or VirtualInventory that it is being displayed in this Window
if (holder instanceof ItemSlotElement) { if (element instanceof ItemSlotElement) {
((ItemSlotElement) holder).getItem().addWindow(this); ((ItemSlotElement) element).getItem().addWindow(this);
} else if (holder instanceof VISlotElement) { } else if (element instanceof VISlotElement) {
((VISlotElement) holder).getVirtualInventory().addWindow(this); ((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)); redrawItem(index, slotElement, false));
} }
protected Map<Integer, ItemStackHolder> getItemSlotElements(Item item) { protected Map<Integer, SlotElement> getItemSlotElements(Item item) {
return ArrayUtils.findAllOccurrences(itemsDisplayed, holder -> holder instanceof ItemSlotElement return ArrayUtils.findAllOccurrences(elementsDisplayed, element -> element instanceof ItemSlotElement
&& ((ItemSlotElement) holder).getItem() == item); && ((ItemSlotElement) element).getItem() == item);
} }
protected Map<Integer, ItemStackHolder> getVISlotElements(VirtualInventory virtualInventory) { protected Map<Integer, SlotElement> getVISlotElements(VirtualInventory virtualInventory) {
return ArrayUtils.findAllOccurrences(itemsDisplayed, holder -> holder instanceof VISlotElement return ArrayUtils.findAllOccurrences(elementsDisplayed, element -> element instanceof VISlotElement
&& ((VISlotElement) holder).getVirtualInventory() == virtualInventory); && ((VISlotElement) element).getVirtualInventory() == virtualInventory);
} }
@Override @Override
@ -119,10 +119,11 @@ public abstract class BaseWindow implements Window {
WindowManager.getInstance().removeWindow(this); WindowManager.getInstance().removeWindow(this);
Arrays.stream(itemsDisplayed) Arrays.stream(elementsDisplayed)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(holder -> holder instanceof ItemSlotElement) .map(SlotElement::getHoldingElement)
.map(holder -> ((ItemSlotElement) holder).getItem()) .filter(element -> element instanceof ItemSlotElement)
.map(element -> ((ItemSlotElement) element).getItem())
.forEach(item -> item.removeWindow(this)); .forEach(item -> item.removeWindow(this));
Arrays.stream(getGuis()) Arrays.stream(getGuis())

@ -1,7 +1,7 @@
package de.studiocode.invui.window.impl.merged; package de.studiocode.invui.window.impl.merged;
import de.studiocode.invui.gui.GUI; 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.Pair;
import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.util.SlotUtils;
import de.studiocode.invui.window.Window; import de.studiocode.invui.window.Window;
@ -34,15 +34,15 @@ public abstract class MergedWindow extends BaseWindow {
protected void initUpperItems() { protected void initUpperItems() {
for (int i = 0; i < upperInventory.getSize(); i++) { for (int i = 0; i < upperInventory.getSize(); i++) {
ItemStackHolder holder = getItemStackHolder(i); SlotElement element = getSlotElement(i);
if (holder != null) redrawItem(i, holder, true); if (element != null) redrawItem(i, element, true);
} }
} }
private void initPlayerItems() { private void initPlayerItems() {
for (int i = upperInventory.getSize(); i < upperInventory.getSize() + 36; i++) { for (int i = upperInventory.getSize(); i < upperInventory.getSize() + 36; i++) {
ItemStackHolder holder = getItemStackHolder(i); SlotElement element = getSlotElement(i);
if (holder != null) redrawItem(i, holder, true); if (element != null) redrawItem(i, element, true);
} }
} }
@ -62,8 +62,8 @@ public abstract class MergedWindow extends BaseWindow {
} }
@Override @Override
protected void redrawItem(int index, ItemStackHolder holder, boolean setItem) { protected void redrawItem(int index, SlotElement element, boolean setItem) {
super.redrawItem(index, holder, setItem); super.redrawItem(index, element, setItem);
if (getViewer() != null) if (getViewer() != null)
getViewer().updateInventory(); // fixes a bug where some items wouldn't be displayed correctly 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; return playerInventory;
} }
protected abstract ItemStackHolder getItemStackHolder(int index); protected abstract SlotElement getSlotElement(int index);
protected abstract Pair<GUI, Integer> getWhereClicked(InventoryClickEvent event); protected abstract Pair<GUI, Integer> getWhereClicked(InventoryClickEvent event);

@ -1,7 +1,7 @@
package de.studiocode.invui.window.impl.merged.combined; package de.studiocode.invui.window.impl.merged.combined;
import de.studiocode.invui.gui.GUI; 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.Pair;
import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.util.SlotUtils;
import de.studiocode.invui.window.Window; import de.studiocode.invui.window.Window;
@ -27,12 +27,12 @@ public abstract class CombinedWindow extends MergedWindow {
@Override @Override
public void handleSlotElementUpdate(GUI child, int slotIndex) { public void handleSlotElementUpdate(GUI child, int slotIndex) {
redrawItem(slotIndex, gui.getItemStackHolder(slotIndex), true); redrawItem(slotIndex, gui.getSlotElement(slotIndex), true);
} }
@Override @Override
protected ItemStackHolder getItemStackHolder(int index) { protected SlotElement getSlotElement(int index) {
return gui.getItemStackHolder(index); return gui.getSlotElement(index);
} }
@Override @Override

@ -1,7 +1,7 @@
package de.studiocode.invui.window.impl.merged.split; package de.studiocode.invui.window.impl.merged.split;
import de.studiocode.invui.gui.GUI; 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.Pair;
import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.util.SlotUtils;
import de.studiocode.invui.window.Window; import de.studiocode.invui.window.Window;
@ -31,13 +31,13 @@ public abstract class SplitWindow extends MergedWindow {
@Override @Override
public void handleSlotElementUpdate(GUI child, int slotIndex) { public void handleSlotElementUpdate(GUI child, int slotIndex) {
redrawItem(child == upperGui ? slotIndex : upperGui.getSize() + slotIndex, redrawItem(child == upperGui ? slotIndex : upperGui.getSize() + slotIndex,
child.getItemStackHolder(slotIndex), true); child.getSlotElement(slotIndex), true);
} }
@Override @Override
public ItemStackHolder getItemStackHolder(int index) { public SlotElement getSlotElement(int index) {
if (index >= upperGui.getSize()) return lowerGui.getItemStackHolder(index - upperGui.getSize()); if (index >= upperGui.getSize()) return lowerGui.getSlotElement(index - upperGui.getSize());
else return upperGui.getItemStackHolder(index); else return upperGui.getSlotElement(index);
} }
@Override @Override

@ -1,7 +1,7 @@
package de.studiocode.invui.window.impl.single; package de.studiocode.invui.window.impl.single;
import de.studiocode.invui.gui.GUI; 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.Window;
import de.studiocode.invui.window.impl.BaseWindow; import de.studiocode.invui.window.impl.BaseWindow;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -33,8 +33,8 @@ public abstract class SingleWindow extends BaseWindow {
protected void initItems() { protected void initItems() {
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
ItemStackHolder holder = gui.getItemStackHolder(i); SlotElement element = gui.getSlotElement(i);
if (holder != null) redrawItem(i, holder, true); if (element != null) redrawItem(i, element, true);
} }
} }
@ -55,7 +55,7 @@ public abstract class SingleWindow extends BaseWindow {
@Override @Override
public void handleSlotElementUpdate(GUI child, int slotIndex) { public void handleSlotElementUpdate(GUI child, int slotIndex) {
redrawItem(slotIndex, gui.getItemStackHolder(slotIndex), true); redrawItem(slotIndex, gui.getSlotElement(slotIndex), true);
} }
@Override @Override