mirror of
https://github.com/SimplexDevelopment/FreedomNetworkSuite.git
synced 2024-11-14 13:13:32 +00:00
Start implementing GUI API
This commit is contained in:
parent
73d9f1e91d
commit
b95a06fa7c
442
Patchwork/src/main/java/me/totalfreedom/display/Displayable.java
Normal file
442
Patchwork/src/main/java/me/totalfreedom/display/Displayable.java
Normal file
@ -0,0 +1,442 @@
|
|||||||
|
package me.totalfreedom.display;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
public abstract class Displayable implements Inventory, InventoryHolder
|
||||||
|
{
|
||||||
|
|
||||||
|
private final int size;
|
||||||
|
private final ItemStack[] contents;
|
||||||
|
|
||||||
|
protected Displayable(final int size)
|
||||||
|
{
|
||||||
|
if (size < 1 || size > 54)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Invalid size for Displayable inventory");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.size = (size % 9 == 0)
|
||||||
|
? size
|
||||||
|
: size + (9 - size % 9);
|
||||||
|
|
||||||
|
this.contents = new ItemStack[size];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize()
|
||||||
|
{
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxStackSize()
|
||||||
|
{
|
||||||
|
return 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param size The new maximum stack size for items in this inventory.
|
||||||
|
* @deprecated This method is not supported by Displayable inventories.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated(since = "1.19.4")
|
||||||
|
public void setMaxStackSize(final int size)
|
||||||
|
{
|
||||||
|
// No implementation required
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable ItemStack getItem(final int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= size)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return contents[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setItem(final int index, final @Nullable ItemStack item)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= size)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
contents[index] = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull HashMap<Integer, ItemStack> addItem(final @NotNull ItemStack... items) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
final HashMap<Integer, ItemStack> remainingItems = new HashMap<>();
|
||||||
|
|
||||||
|
for (final ItemStack item : items)
|
||||||
|
{
|
||||||
|
int remainingAmount = item.getAmount();
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack current = contents[i];
|
||||||
|
|
||||||
|
if (current == null)
|
||||||
|
{
|
||||||
|
final int maxStackSize = item.getMaxStackSize();
|
||||||
|
final int amountToAdd = Math.min(remainingAmount, maxStackSize);
|
||||||
|
final ItemStack clone = item.clone();
|
||||||
|
clone.setAmount(amountToAdd);
|
||||||
|
contents[i] = clone;
|
||||||
|
remainingAmount -= amountToAdd;
|
||||||
|
|
||||||
|
if (remainingAmount == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remainingAmount > 0)
|
||||||
|
{
|
||||||
|
remainingItems.put(remainingItems.size(), new ItemStack(item.getType(), remainingAmount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return remainingItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull HashMap<Integer, ItemStack> removeItem(final @NotNull ItemStack... items) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
final HashMap<Integer, ItemStack> removedItems = new HashMap<>();
|
||||||
|
|
||||||
|
for (final ItemStack item : items)
|
||||||
|
{
|
||||||
|
int remainingAmount = item.getAmount();
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack current = contents[i];
|
||||||
|
|
||||||
|
if (current != null && current.isSimilar(item))
|
||||||
|
{
|
||||||
|
final int amountToRemove = Math.min(remainingAmount, current.getAmount());
|
||||||
|
current.setAmount(current.getAmount() - amountToRemove);
|
||||||
|
remainingAmount -= amountToRemove;
|
||||||
|
|
||||||
|
if (current.getAmount() <= 0)
|
||||||
|
{
|
||||||
|
contents[i] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remainingAmount == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remainingAmount < item.getAmount())
|
||||||
|
{
|
||||||
|
removedItems.put(removedItems.size(), new ItemStack(item.getType(), item.getAmount() - remainingAmount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return removedItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable ItemStack @NotNull [] getContents()
|
||||||
|
{
|
||||||
|
return contents.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContents(final @Nullable ItemStack @NotNull [] items) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
if (items == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Items cannot be null");
|
||||||
|
}
|
||||||
|
if (items.length != size)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Invalid size of items array");
|
||||||
|
}
|
||||||
|
System.arraycopy(items, 0, contents, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ListIterator<ItemStack> iterator()
|
||||||
|
{
|
||||||
|
return iterator(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ListIterator<ItemStack> iterator(final int index)
|
||||||
|
{
|
||||||
|
return List.of(contents).listIterator(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull InventoryType getType()
|
||||||
|
{
|
||||||
|
return InventoryType.CHEST;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable InventoryHolder getHolder()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable InventoryHolder getHolder(final boolean useSnapshot)
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<HumanEntity> getViewers()
|
||||||
|
{
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(final @NotNull Material material) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
for (final ItemStack item : contents)
|
||||||
|
{
|
||||||
|
if (item != null && item.getType() == material)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(final @Nullable ItemStack item)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (final ItemStack content : contents)
|
||||||
|
{
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(final @NotNull Material material, final int amount) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
int totalAmount = 0;
|
||||||
|
for (final ItemStack item : contents)
|
||||||
|
{
|
||||||
|
if (item != null && item.getType() == material)
|
||||||
|
{
|
||||||
|
totalAmount += item.getAmount();
|
||||||
|
if (totalAmount >= amount)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(final @Nullable ItemStack item, final int amount)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int totalAmount = 0;
|
||||||
|
for (final ItemStack content : contents)
|
||||||
|
{
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
totalAmount += content.getAmount();
|
||||||
|
if (totalAmount >= amount)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsAtLeast(final @Nullable ItemStack item, final int amount)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int totalAmount = 0;
|
||||||
|
for (final ItemStack content : contents)
|
||||||
|
{
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
totalAmount += content.getAmount();
|
||||||
|
if (totalAmount >= amount)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull HashMap<Integer, ? extends ItemStack> all(final @NotNull Material material) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
final HashMap<Integer, ItemStack> matchingItems = new HashMap<>();
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack item = contents[i];
|
||||||
|
if (item != null && item.getType() == material)
|
||||||
|
{
|
||||||
|
matchingItems.put(i, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull HashMap<Integer, ? extends ItemStack> all(final @Nullable ItemStack item)
|
||||||
|
{
|
||||||
|
final HashMap<Integer, ItemStack> matchingItems = new HashMap<>();
|
||||||
|
if (item != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack content = contents[i];
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
matchingItems.put(i, content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int first(final @NotNull Material material) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack item = contents[i];
|
||||||
|
if (item != null && item.getType() == material)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int first(final @NotNull ItemStack item)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack content = contents[i];
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int firstEmpty()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (contents[i] == null)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty()
|
||||||
|
{
|
||||||
|
for (final ItemStack content : contents)
|
||||||
|
{
|
||||||
|
if (content != null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(final @NotNull Material material) throws IllegalArgumentException
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack item = contents[i];
|
||||||
|
if (item != null && item.getType() == material)
|
||||||
|
{
|
||||||
|
contents[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(final @NotNull ItemStack item)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
final ItemStack content = contents[i];
|
||||||
|
if (content != null && content.isSimilar(item))
|
||||||
|
{
|
||||||
|
contents[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear(final int index)
|
||||||
|
{
|
||||||
|
if (index >= 0 && index < size)
|
||||||
|
{
|
||||||
|
contents[index] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
contents[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int close()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package me.totalfreedom.display;
|
||||||
|
|
||||||
|
import me.totalfreedom.utils.FreedomAdventure;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryView;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class DisplayableView extends InventoryView
|
||||||
|
{
|
||||||
|
private final Displayable top;
|
||||||
|
private final Displayable bottom;
|
||||||
|
private final Player player;
|
||||||
|
private final InventoryType type;
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
public DisplayableView(final Player player, final Displayable top, final Displayable bottom) {
|
||||||
|
this.player = player;
|
||||||
|
this.top = top;
|
||||||
|
this.bottom = bottom;
|
||||||
|
this.type = InventoryType.CHEST;
|
||||||
|
this.title = FreedomAdventure.toPlainText(type.defaultTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Inventory getTopInventory()
|
||||||
|
{
|
||||||
|
return top;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Inventory getBottomInventory()
|
||||||
|
{
|
||||||
|
return bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull HumanEntity getPlayer()
|
||||||
|
{
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull InventoryType getType()
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getTitle()
|
||||||
|
{
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getOriginalTitle()
|
||||||
|
{
|
||||||
|
return FreedomAdventure.toPlainText(type.defaultTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTitle(final @NotNull String title)
|
||||||
|
{
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user