Different inventory types

Dropper, Hopper, Anvil
This commit is contained in:
NichtStudioCode 2021-02-03 20:03:59 +01:00
parent 287e08dce4
commit e87ef108e6
10 changed files with 145 additions and 35 deletions

18
pom.xml

@ -21,7 +21,6 @@
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
@ -30,9 +29,19 @@
<id>minecraft-repo</id>
<url>https://libraries.minecraft.net/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations-java5</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
@ -52,10 +61,9 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations-java5</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
<groupId>com.github.NichtStudioCode</groupId>
<artifactId>InventoryAccess</artifactId>
<version>v0.1</version>
</dependency>
</dependencies>

@ -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);
}
}

@ -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

@ -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

@ -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<String> 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();
}
}

@ -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);
}
}

@ -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

@ -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<String> 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();
}
}

@ -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);
}
}

@ -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);