From e87ef108e6864fc3cae9278f3c5596d85536b3b1 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Wed, 3 Feb 2021 20:03:59 +0100 Subject: [PATCH] Different inventory types Dropper, Hopper, Anvil --- pom.xml | 18 +++++--- .../studiocode/invui/util/InventoryUtils.java | 22 ++++++++++ .../invui/window/impl/BaseWindow.java | 6 +-- .../impl/combined/BaseCombinedWindow.java | 15 +++++-- .../splitgui/AnvilSplitGUIWindow.java | 44 +++++++++++++++++++ .../splitgui/SimpleSplitGUIWindow.java | 12 +---- .../combined/splitgui/SplitGUIWindow.java | 4 +- .../invui/window/impl/single/AnvilWindow.java | 41 +++++++++++++++++ .../window/impl/single/SimpleWindow.java | 10 +---- .../window/impl/single/SingleWindow.java | 8 ++-- 10 files changed, 145 insertions(+), 35 deletions(-) create mode 100644 src/main/java/de/studiocode/invui/util/InventoryUtils.java create mode 100644 src/main/java/de/studiocode/invui/window/impl/combined/splitgui/AnvilSplitGUIWindow.java create mode 100644 src/main/java/de/studiocode/invui/window/impl/single/AnvilWindow.java diff --git a/pom.xml b/pom.xml index 043363d..33697d9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,6 @@ - spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -30,9 +29,19 @@ minecraft-repo https://libraries.minecraft.net/ + + jitpack.io + https://jitpack.io + + + org.jetbrains + annotations-java5 + RELEASE + compile + org.spigotmc spigot-api @@ -52,10 +61,9 @@ - org.jetbrains - annotations-java5 - RELEASE - compile + com.github.NichtStudioCode + InventoryAccess + v0.1 diff --git a/src/main/java/de/studiocode/invui/util/InventoryUtils.java b/src/main/java/de/studiocode/invui/util/InventoryUtils.java new file mode 100644 index 0000000..5e64990 --- /dev/null +++ b/src/main/java/de/studiocode/invui/util/InventoryUtils.java @@ -0,0 +1,22 @@ +package de.studiocode.invui.util; + +import de.studiocode.invui.gui.GUI; +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; + +public class InventoryUtils { + + public static Inventory createMatchingInventory(GUI gui, String title) { + InventoryType type; + + if (gui.getWidth() == 9) type = null; + else if (gui.getWidth() == 3 && gui.getHeight() == 3) type = InventoryType.DROPPER; + else if (gui.getWidth() == 5 && gui.getHeight() == 1) type = InventoryType.HOPPER; + else throw new UnsupportedOperationException("Invalid bounds of GUI"); + + if (type == null) return Bukkit.createInventory(null, gui.getSize(), title); + else return Bukkit.createInventory(null, type, title); + } + +} 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 e593137..5f8552a 100644 --- a/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java @@ -1,5 +1,6 @@ package de.studiocode.invui.window.impl; +import de.studiocode.inventoryacess.api.version.InventoryAccess; import de.studiocode.invui.InvUI; import de.studiocode.invui.gui.SlotElement.ItemSlotElement; import de.studiocode.invui.gui.SlotElement.ItemStackHolder; @@ -86,8 +87,7 @@ public abstract class BaseWindow implements Window { handleClosed(); } else { if (player.equals(getViewer())) - Bukkit.getScheduler().runTaskLater(InvUI.getInstance().getPlugin(), - () -> player.openInventory(getInventories()[0]), 0); + Bukkit.getScheduler().runTaskLater(InvUI.getInstance().getPlugin(), this::show, 0); } } @@ -146,7 +146,7 @@ public abstract class BaseWindow implements Window { Player viewer = getViewer(); if (viewer == null) throw new IllegalStateException("The player is not online."); - viewer.openInventory(getInventories()[0]); + InventoryAccess.getInventoryUtils().openCustomInventory(viewer, getInventories()[0]); } @Override diff --git a/src/main/java/de/studiocode/invui/window/impl/combined/BaseCombinedWindow.java b/src/main/java/de/studiocode/invui/window/impl/combined/BaseCombinedWindow.java index 7be35d3..e3fdd09 100644 --- a/src/main/java/de/studiocode/invui/window/impl/combined/BaseCombinedWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/combined/BaseCombinedWindow.java @@ -17,8 +17,8 @@ import java.util.Objects; public abstract class BaseCombinedWindow extends BaseWindow { - private final Inventory upperInventory; private final Inventory playerInventory; + protected Inventory upperInventory; private final ItemStack[] playerItems = new ItemStack[36]; private boolean isCurrentlyOpened; @@ -64,6 +64,7 @@ public abstract class BaseCombinedWindow extends BaseWindow { throw new IllegalArgumentException("VirtualInventories are not allowed in CombinedWindows"); super.redrawItem(index, holder, setItem); + if (getViewer() != null) getViewer().updateInventory(); // fixes a bug where some items wouldn't be displayed correctly } @Override @@ -71,9 +72,17 @@ public abstract class BaseCombinedWindow extends BaseWindow { if (slot >= upperInventory.getSize()) { if (isCurrentlyOpened) { int invSlot = SlotUtils.translateGuiToPlayerInv(slot - upperInventory.getSize()); - playerInventory.setItem(invSlot, itemStack); + setPlayerInvItem(invSlot, itemStack); } - } else upperInventory.setItem(slot, itemStack); + } else setUpperInvItem(slot, itemStack); + } + + protected void setUpperInvItem(int slot, ItemStack itemStack) { + upperInventory.setItem(slot, itemStack); + } + + protected void setPlayerInvItem(int slot, ItemStack itemStack) { + playerInventory.setItem(slot, itemStack); } @Override diff --git a/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/AnvilSplitGUIWindow.java b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/AnvilSplitGUIWindow.java new file mode 100644 index 0000000..a2ed4a0 --- /dev/null +++ b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/AnvilSplitGUIWindow.java @@ -0,0 +1,44 @@ +package de.studiocode.invui.window.impl.combined.splitgui; + +import de.studiocode.inventoryacess.api.abstraction.inventory.AnvilInventory; +import de.studiocode.inventoryacess.api.version.InventoryAccess; +import de.studiocode.invui.gui.GUI; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.function.Consumer; + +public class AnvilSplitGUIWindow extends SplitGUIWindow { + + private final AnvilInventory anvilInventory; + + public AnvilSplitGUIWindow(Player player, String title, GUI upperGui, GUI lowerGui, + boolean closeable, Consumer renameHandler) { + + super(player, upperGui, lowerGui, null, false, closeable, true); + + anvilInventory = InventoryAccess.createAnvilInventory(player, title, renameHandler); + upperInventory = anvilInventory.getBukkitInventory(); + + initUpperItems(); + } + + @Override + protected void setUpperInvItem(int slot, ItemStack itemStack) { + anvilInventory.setItem(slot, itemStack); + } + + @Override + public void show() { + if (isClosed()) throw new IllegalStateException("The Window has already been closed."); + + Player viewer = getViewer(); + if (viewer == null) throw new IllegalStateException("The player is not online."); + anvilInventory.open(); + } + + public String getRenameText() { + return anvilInventory.getRenameText(); + } + +} diff --git a/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SimpleSplitGUIWindow.java b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SimpleSplitGUIWindow.java index a7feeb5..db30211 100644 --- a/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SimpleSplitGUIWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SimpleSplitGUIWindow.java @@ -1,21 +1,13 @@ package de.studiocode.invui.window.impl.combined.splitgui; import de.studiocode.invui.gui.GUI; -import org.bukkit.Bukkit; +import de.studiocode.invui.util.InventoryUtils; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; public class SimpleSplitGUIWindow extends SplitGUIWindow { public SimpleSplitGUIWindow(Player player, String title, GUI upperGui, GUI lowerGui, boolean closeable, boolean closeOnEvent) { - super(player, upperGui, lowerGui, createInventory(upperGui, title), closeable, closeOnEvent); - } - - private static Inventory createInventory(GUI gui, String title) { - if (gui.getWidth() != 9) - throw new IllegalArgumentException("GUI width has to be 9"); - - return Bukkit.createInventory(null, gui.getSize(), title); + super(player, upperGui, lowerGui, InventoryUtils.createMatchingInventory(upperGui, title), true, closeable, closeOnEvent); } } diff --git a/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SplitGUIWindow.java b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SplitGUIWindow.java index dff012c..afa143c 100644 --- a/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SplitGUIWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/combined/splitgui/SplitGUIWindow.java @@ -13,14 +13,14 @@ public abstract class SplitGUIWindow extends BaseCombinedWindow { private final GUI upperGui; private final GUI lowerGui; - public SplitGUIWindow(Player player, GUI upperGui, GUI lowerGui, Inventory upperInventory, boolean closeable, boolean closeOnEvent) { + public SplitGUIWindow(Player player, GUI upperGui, GUI lowerGui, Inventory upperInventory, boolean initItems, boolean closeable, boolean closeOnEvent) { super(player, upperGui.getSize() + lowerGui.getSize(), upperInventory, closeable, closeOnEvent); this.upperGui = upperGui; this.lowerGui = lowerGui; upperGui.addParent(this); lowerGui.addParent(this); - initUpperItems(); + if (initItems) initUpperItems(); } @Override diff --git a/src/main/java/de/studiocode/invui/window/impl/single/AnvilWindow.java b/src/main/java/de/studiocode/invui/window/impl/single/AnvilWindow.java new file mode 100644 index 0000000..1647fff --- /dev/null +++ b/src/main/java/de/studiocode/invui/window/impl/single/AnvilWindow.java @@ -0,0 +1,41 @@ +package de.studiocode.invui.window.impl.single; + +import de.studiocode.inventoryacess.api.abstraction.inventory.AnvilInventory; +import de.studiocode.inventoryacess.api.version.InventoryAccess; +import de.studiocode.invui.gui.GUI; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.function.Consumer; + +public class AnvilWindow extends SingleWindow { + + private final AnvilInventory anvilInventory; + + public AnvilWindow(Player player, String title, GUI gui, boolean closeable, Consumer renameHandler) { + super(player.getUniqueId(), gui, null, false, closeable, true); + anvilInventory = InventoryAccess.createAnvilInventory(player, title, renameHandler); + inventory = anvilInventory.getBukkitInventory(); + + initItems(); + } + + @Override + protected void setInvItem(int slot, ItemStack itemStack) { + anvilInventory.setItem(slot, itemStack); + } + + @Override + public void show() { + if (isClosed()) throw new IllegalStateException("The Window has already been closed."); + + Player viewer = getViewer(); + if (viewer == null) throw new IllegalStateException("The player is not online."); + anvilInventory.open(); + } + + public String getRenameText() { + return anvilInventory.getRenameText(); + } + +} diff --git a/src/main/java/de/studiocode/invui/window/impl/single/SimpleWindow.java b/src/main/java/de/studiocode/invui/window/impl/single/SimpleWindow.java index b7831c0..0a44537 100644 --- a/src/main/java/de/studiocode/invui/window/impl/single/SimpleWindow.java +++ b/src/main/java/de/studiocode/invui/window/impl/single/SimpleWindow.java @@ -1,25 +1,19 @@ package de.studiocode.invui.window.impl.single; import de.studiocode.invui.gui.GUI; -import org.bukkit.Bukkit; +import de.studiocode.invui.util.InventoryUtils; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; import java.util.UUID; public final class SimpleWindow extends SingleWindow { public SimpleWindow(UUID viewerUUID, String title, GUI gui, boolean closeable, boolean closeOnEvent) { - super(viewerUUID, gui, createInventory(gui, title), closeable, closeOnEvent); + super(viewerUUID, gui, InventoryUtils.createMatchingInventory(gui, title), true, closeable, closeOnEvent); } public SimpleWindow(Player player, String title, GUI gui, boolean closeable, boolean closeOnEvent) { this(player.getUniqueId(), title, gui, closeable, closeOnEvent); } - private static Inventory createInventory(GUI gui, String title) { - if (gui.getWidth() != 9) throw new IllegalArgumentException("GUI width has to be 9."); - return Bukkit.createInventory(null, gui.getSize(), title); - } - } 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 48595d0..328435c 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 @@ -15,19 +15,19 @@ public abstract class SingleWindow extends BaseWindow { private final GUI gui; private final int size; - private final Inventory inventory; + protected Inventory inventory; - public SingleWindow(UUID viewerUUID, GUI gui, Inventory inventory, boolean closeable, boolean closeOnEvent) { + public SingleWindow(UUID viewerUUID, GUI gui, Inventory inventory, boolean initItems, boolean closeable, boolean closeOnEvent) { super(viewerUUID, gui.getSize(), closeable, closeOnEvent); this.gui = gui; this.size = gui.getSize(); this.inventory = inventory; gui.addParent(this); - initItems(); + if (initItems) initItems(); } - private void initItems() { + protected void initItems() { for (int i = 0; i < size; i++) { ItemStackHolder holder = gui.getItemStackHolder(i); if (holder != null) redrawItem(i, holder, true);