Improve Paged- and ScrollGui

- PagedGui pages and ScrollGui content is now saved as List<SlotElement> to improve performance
- Added PagedGui#bake and ScrollGui#bake to recreate those slot element lists if needed
- PagedInventoriesGuiImpl now lets oversized inventories overflow to the next page
- Added resize handler to VirtualInventory that is called whenever the inventory is resized
- PagedInventoriesGuiImpl and ScrollInventoriesGuiImpl automatically register a resize handler to virtual inventories that they display
This commit is contained in:
NichtStudioCode 2023-09-30 17:45:21 +02:00
parent bc1345da59
commit 42c2c56937
11 changed files with 237 additions and 130 deletions

@ -21,6 +21,8 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
private int currentPage; private int currentPage;
private List<BiConsumer<Integer, Integer>> pageChangeHandlers; private List<BiConsumer<Integer, Integer>> pageChangeHandlers;
protected List<C> content;
protected List<List<SlotElement>> pages;
public AbstractPagedGui(int width, int height, boolean infinitePages, int... contentListSlots) { public AbstractPagedGui(int width, int height, boolean infinitePages, int... contentListSlots) {
super(width, height); super(width, height);
@ -93,7 +95,7 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
} }
private void updatePageContent() { private void updatePageContent() {
List<SlotElement> slotElements = getPageElements(currentPage); List<SlotElement> slotElements = (pages != null && !pages.isEmpty()) ? pages.get(currentPage) : List.of();
for (int i = 0; i < contentListSlots.length; i++) { for (int i = 0; i < contentListSlots.length; i++) {
if (slotElements.size() > i) setSlotElement(contentListSlots[i], slotElements.get(i)); if (slotElements.size() > i) setSlotElement(contentListSlots[i], slotElements.get(i));
@ -101,6 +103,23 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
} }
} }
@Override
public void setContent(@Nullable List<C> content) {
if (content == null || content.isEmpty()) {
this.content = List.of();
this.pages = List.of();
update();
} else {
this.content = content;
bake(); // calls update()
}
}
@Override
public int getPageAmount() {
return pages != null ? pages.size() : 0;
}
@Override @Override
public int getCurrentPage() { public int getCurrentPage() {
return currentPage; return currentPage;
@ -142,8 +161,6 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
return pageChangeHandlers; return pageChangeHandlers;
} }
protected abstract List<SlotElement> getPageElements(int page);
public static abstract class AbstractBuilder<C> public static abstract class AbstractBuilder<C>
extends AbstractGui.AbstractBuilder<PagedGui<C>, PagedGui.Builder<C>> extends AbstractGui.AbstractBuilder<PagedGui<C>, PagedGui.Builder<C>>
implements PagedGui.Builder<C> implements PagedGui.Builder<C>

@ -1,6 +1,7 @@
package xyz.xenondevs.invui.gui; package xyz.xenondevs.invui.gui;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.invui.gui.structure.Structure; import xyz.xenondevs.invui.gui.structure.Structure;
import xyz.xenondevs.invui.util.SlotUtils; import xyz.xenondevs.invui.util.SlotUtils;
@ -24,6 +25,8 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
private int offset; private int offset;
private List<BiConsumer<Integer, Integer>> scrollHandlers; private List<BiConsumer<Integer, Integer>> scrollHandlers;
protected List<C> content;
protected List<SlotElement> elements;
public AbstractScrollGui(int width, int height, boolean infiniteLines, int... contentListSlots) { public AbstractScrollGui(int width, int height, boolean infiniteLines, int... contentListSlots) {
super(width, height); super(width, height);
@ -109,6 +112,24 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
} }
} }
@Override
public int getMaxLine() {
if (elements == null) return 0;
return (int) Math.ceil((double) elements.size() / (double) getLineLength()) - 1;
}
@Override
public void setContent(@Nullable List<C> content) {
if (content == null || content.isEmpty()) {
this.content = List.of();
this.elements = List.of();
update();
} else {
this.content = content;
bake(); // calls update()
}
}
protected void update() { protected void update() {
correctCurrentLine(); correctCurrentLine();
updateControlItems(); updateControlItems();
@ -116,7 +137,7 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
} }
private void updateContent() { private void updateContent() {
List<? extends SlotElement> slotElements = getElements(offset, contentListSlots.length + offset); List<SlotElement> slotElements = getElements(offset, contentListSlots.length + offset);
for (int i = 0; i < contentListSlots.length; i++) { for (int i = 0; i < contentListSlots.length; i++) {
if (slotElements.size() > i) setSlotElement(contentListSlots[i], slotElements.get(i)); if (slotElements.size() > i) setSlotElement(contentListSlots[i], slotElements.get(i));
@ -124,6 +145,10 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
} }
} }
protected List<SlotElement> getElements(int from, int to) {
return elements.subList(from, Math.min(elements.size(), to));
}
@Override @Override
public void setScrollHandlers(@NotNull List<@NotNull BiConsumer<Integer, Integer>> scrollHandlers) { public void setScrollHandlers(@NotNull List<@NotNull BiConsumer<Integer, Integer>> scrollHandlers) {
this.scrollHandlers = scrollHandlers; this.scrollHandlers = scrollHandlers;
@ -143,8 +168,6 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
scrollHandlers.remove(scrollHandler); scrollHandlers.remove(scrollHandler);
} }
protected abstract List<? extends SlotElement> getElements(int from, int to);
public abstract static class AbstractBuilder<C> public abstract static class AbstractBuilder<C>
extends AbstractGui.AbstractBuilder<ScrollGui<C>, ScrollGui.Builder<C>> extends AbstractGui.AbstractBuilder<ScrollGui<C>, ScrollGui.Builder<C>>
implements ScrollGui.Builder<C> implements ScrollGui.Builder<C>

@ -219,6 +219,14 @@ public interface PagedGui<C> extends Gui {
*/ */
void setContent(@Nullable List<@NotNull C> content); void setContent(@Nullable List<@NotNull C> content);
/**
* Bakes and updates the pages of this {@link PagedGui} based on the current content.
* <p>
* This method does not need to be called when using {@link #setContent(List)},
* but is required when the size of the content itself changes.
*/
void bake();
/** /**
* Gets the registered page change handlers. * Gets the registered page change handlers.
* *

@ -4,11 +4,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.invui.gui.structure.Structure; import xyz.xenondevs.invui.gui.structure.Structure;
import xyz.xenondevs.invui.inventory.Inventory; import xyz.xenondevs.invui.inventory.Inventory;
import xyz.xenondevs.invui.inventory.VirtualInventory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.function.BiConsumer;
import java.util.stream.IntStream;
/** /**
* An {@link AbstractPagedGui} where every page is its own {@link Inventory}. * An {@link AbstractPagedGui} where every page is its own {@link Inventory}.
@ -18,7 +18,7 @@ import java.util.stream.IntStream;
*/ */
final class PagedInventoriesGuiImpl extends AbstractPagedGui<Inventory> { final class PagedInventoriesGuiImpl extends AbstractPagedGui<Inventory> {
private List<Inventory> inventories; private final @NotNull BiConsumer<@NotNull Integer, @NotNull Integer> resizeHandler = (from, to) -> bake();
/** /**
* Creates a new {@link PagedInventoriesGuiImpl}. * Creates a new {@link PagedInventoriesGuiImpl}.
@ -44,29 +44,57 @@ final class PagedInventoriesGuiImpl extends AbstractPagedGui<Inventory> {
setContent(inventories); setContent(inventories);
} }
@SuppressWarnings("DuplicatedCode")
@Override @Override
public int getPageAmount() { public void setContent(@Nullable List<Inventory> content) {
return inventories.size(); // remove resize handlers from previous inventories
if (this.content != null) {
for (Inventory inventory : this.content) {
if (inventory instanceof VirtualInventory) {
((VirtualInventory) inventory).removeResizeHandler(resizeHandler);
}
}
}
// set content, bake pages, update
super.setContent(content);
// add resize handlers to new inventories
if (this.content != null) {
for (Inventory inventory : this.content) {
if (inventory instanceof VirtualInventory) {
((VirtualInventory) inventory).addResizeHandler(resizeHandler);
}
}
}
} }
@Override @Override
public void setContent(@Nullable List<@NotNull Inventory> inventories) { public void bake() {
this.inventories = inventories == null ? new ArrayList<>() : inventories; int contentSize = getContentListSlots().length;
List<List<SlotElement>> pages = new ArrayList<>();
List<SlotElement> page = new ArrayList<>(contentSize);
for (Inventory inventory : content) {
for (int slot = 0; slot < inventory.getSize(); slot++) {
page.add(new SlotElement.InventorySlotElement(inventory, slot));
if (page.size() >= contentSize) {
pages.add(page);
page = new ArrayList<>(contentSize);
}
}
}
if (!page.isEmpty()) {
pages.add(page);
}
this.pages = pages;
update(); update();
} }
@Override
protected List<SlotElement> getPageElements(int page) {
if (inventories.size() <= page) return new ArrayList<>();
Inventory inventory = inventories.get(page);
int size = inventory.getSize();
return IntStream.range(0, size)
.mapToObj(i -> new SlotElement.InventorySlotElement(inventory, i))
.collect(Collectors.toList());
}
public static final class Builder extends AbstractBuilder<Inventory> { public static final class Builder extends AbstractBuilder<Inventory> {
@Override @Override

@ -7,8 +7,6 @@ import xyz.xenondevs.invui.item.Item;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
/** /**
* An {@link AbstractPagedGui} that is filled with {@link Item Items}. * An {@link AbstractPagedGui} that is filled with {@link Item Items}.
@ -18,9 +16,6 @@ import java.util.stream.Collectors;
*/ */
final class PagedItemsGuiImpl extends AbstractPagedGui<Item> { final class PagedItemsGuiImpl extends AbstractPagedGui<Item> {
private List<Item> items;
private List<BiConsumer<Integer, Integer>> pageChangeHandlers;
/** /**
* Creates a new {@link PagedItemsGuiImpl}. * Creates a new {@link PagedItemsGuiImpl}.
* *
@ -46,25 +41,27 @@ final class PagedItemsGuiImpl extends AbstractPagedGui<Item> {
} }
@Override @Override
public int getPageAmount() { public void bake() {
return (int) Math.ceil((double) items.size() / (double) getContentListSlots().length); List<Item> items = content;
} int contentSize = getContentListSlots().length;
List<List<SlotElement>> pages = new ArrayList<>();
@Override int pageAmount = items.size() / contentSize;
public void setContent(@Nullable List<@NotNull Item> items) { for (int pageIdx = 0; pageIdx < pageAmount; pageIdx++) {
this.items = items != null ? items : new ArrayList<>(); int from = pageIdx * contentSize;
int to = Math.min(from + contentSize, items.size());
ArrayList<SlotElement> page = new ArrayList<>(contentSize);
for (int i = from; i < to; i++) {
page.add(new SlotElement.ItemSlotElement(items.get(i)));
}
pages.add(page);
}
this.pages = pages;
update(); update();
} }
@Override
protected List<SlotElement> getPageElements(int page) {
int length = getContentListSlots().length;
int from = page * length;
int to = Math.min(from + length, items.size());
return items.subList(from, to).stream().map(SlotElement.ItemSlotElement::new).collect(Collectors.toList());
}
public static final class Builder extends AbstractBuilder<Item> { public static final class Builder extends AbstractBuilder<Item> {
@Override @Override

@ -6,8 +6,6 @@ import xyz.xenondevs.invui.gui.structure.Structure;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/** /**
* An {@link AbstractPagedGui} where every page is its own {@link Gui}. * An {@link AbstractPagedGui} where every page is its own {@link Gui}.
@ -17,8 +15,6 @@ import java.util.stream.IntStream;
*/ */
final class PagedNestedGuiImpl extends AbstractPagedGui<Gui> { final class PagedNestedGuiImpl extends AbstractPagedGui<Gui> {
private List<Gui> guis;
/** /**
* Creates a new {@link PagedNestedGuiImpl}. * Creates a new {@link PagedNestedGuiImpl}.
* *
@ -44,28 +40,21 @@ final class PagedNestedGuiImpl extends AbstractPagedGui<Gui> {
} }
@Override @Override
public int getPageAmount() { public void bake() {
return guis.size(); List<List<SlotElement>> pages = new ArrayList<>();
} for (Gui gui : content) {
List<SlotElement> page = new ArrayList<>(gui.getSize());
for (int slot = 0; slot < gui.getSize(); slot++) {
page.add(new SlotElement.LinkedSlotElement(gui, slot));
}
@Override pages.add(page);
public void setContent(@Nullable List<@NotNull Gui> guis) { }
this.guis = guis == null ? new ArrayList<>() : guis;
this.pages = pages;
update(); update();
} }
@Override
protected List<SlotElement> getPageElements(int page) {
if (guis.size() <= page) return new ArrayList<>();
Gui gui = guis.get(page);
int size = gui.getSize();
return IntStream.range(0, size)
.mapToObj(i -> new SlotElement.LinkedSlotElement(gui, i))
.collect(Collectors.toList());
}
public static final class Builder extends AbstractBuilder<Gui> { public static final class Builder extends AbstractBuilder<Gui> {
@Override @Override

@ -193,6 +193,14 @@ public interface ScrollGui<C> extends Gui {
*/ */
void setContent(@Nullable List<@NotNull C> content); void setContent(@Nullable List<@NotNull C> content);
/**
* Bakes the elements of this {@link PagedGui} based on the current content.
* <p>
* This method does not need to be called when using {@link #setContent(List)},
* but is required when the size of the content itself changes.
*/
void bake();
/** /**
* Replaces the currently registered scroll handlers with the specified ones. * Replaces the currently registered scroll handlers with the specified ones.
* *

@ -4,9 +4,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.invui.gui.structure.Structure; import xyz.xenondevs.invui.gui.structure.Structure;
import xyz.xenondevs.invui.inventory.Inventory; import xyz.xenondevs.invui.inventory.Inventory;
import xyz.xenondevs.invui.inventory.VirtualInventory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer;
/** /**
* A {@link AbstractScrollGui} that uses {@link Inventory VirtualInventories} as content. * A {@link AbstractScrollGui} that uses {@link Inventory VirtualInventories} as content.
@ -16,8 +18,7 @@ import java.util.List;
*/ */
final class ScrollInventoryGuiImpl extends AbstractScrollGui<Inventory> { final class ScrollInventoryGuiImpl extends AbstractScrollGui<Inventory> {
private List<Inventory> inventories; private final @NotNull BiConsumer<@NotNull Integer, @NotNull Integer> resizeHandler = (from, to) -> bake();
private List<SlotElement.InventorySlotElement> elements;
/** /**
* Creates a new {@link ScrollInventoryGuiImpl}. * Creates a new {@link ScrollInventoryGuiImpl}.
@ -43,31 +44,42 @@ final class ScrollInventoryGuiImpl extends AbstractScrollGui<Inventory> {
setContent(inventories); setContent(inventories);
} }
@SuppressWarnings("DuplicatedCode")
@Override @Override
public void setContent(@Nullable List<@NotNull Inventory> inventories) { public void setContent(@Nullable List<Inventory> content) {
this.inventories = inventories != null ? inventories : new ArrayList<>(); // remove resize handlers from previous inventories
updateElements(); if (this.content != null) {
update(); for (Inventory inventory : this.content) {
} if (inventory instanceof VirtualInventory) {
((VirtualInventory) inventory).removeResizeHandler(resizeHandler);
}
}
}
private void updateElements() { // set content, bake pages, update
elements = new ArrayList<>(); super.setContent(content);
for (Inventory inventory : inventories) {
for (int i = 0; i < inventory.getSize(); i++) { // add resize handlers to new inventories
elements.add(new SlotElement.InventorySlotElement(inventory, i)); if (this.content != null) {
for (Inventory inventory : this.content) {
if (inventory instanceof VirtualInventory) {
((VirtualInventory) inventory).addResizeHandler(resizeHandler);
}
} }
} }
} }
@Override @Override
protected List<SlotElement.InventorySlotElement> getElements(int from, int to) { public void bake() {
return elements.subList(from, Math.min(elements.size(), to)); List<SlotElement> elements = new ArrayList<>();
} for (Inventory inventory : content) {
for (int i = 0; i < inventory.getSize(); i++) {
elements.add(new SlotElement.InventorySlotElement(inventory, i));
}
}
@Override this.elements = elements;
public int getMaxLine() { update();
if (elements == null) return 0;
return (int) Math.ceil((double) elements.size() / (double) getLineLength()) - 1;
} }
public static final class Builder extends AbstractBuilder<Inventory> { public static final class Builder extends AbstractBuilder<Inventory> {

@ -7,7 +7,6 @@ import xyz.xenondevs.invui.item.Item;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* A {@link AbstractScrollGui} that uses {@link Item Items} as content. * A {@link AbstractScrollGui} that uses {@link Item Items} as content.
@ -17,8 +16,6 @@ import java.util.stream.Collectors;
*/ */
final class ScrollItemsGuiImpl extends AbstractScrollGui<Item> { final class ScrollItemsGuiImpl extends AbstractScrollGui<Item> {
private List<Item> items;
/** /**
* Creates a new {@link ScrollItemsGuiImpl}. * Creates a new {@link ScrollItemsGuiImpl}.
* *
@ -44,23 +41,16 @@ final class ScrollItemsGuiImpl extends AbstractScrollGui<Item> {
} }
@Override @Override
public void setContent(@Nullable List<@NotNull Item> items) { public void bake() {
this.items = items != null ? items : new ArrayList<>(); ArrayList<SlotElement> elements = new ArrayList<>(content.size());
for (Item item : content) {
elements.add(new SlotElement.ItemSlotElement(item));
}
this.elements = elements;
update(); update();
} }
@Override
protected List<SlotElement> getElements(int from, int to) {
return items.subList(from, Math.min(items.size(), to)).stream()
.map(SlotElement.ItemSlotElement::new)
.collect(Collectors.toList());
}
@Override
public int getMaxLine() {
return (int) Math.ceil((double) items.size() / (double) getLineLength()) - 1;
}
public static final class Builder extends AbstractBuilder<Item> { public static final class Builder extends AbstractBuilder<Item> {
@Override @Override

@ -15,9 +15,6 @@ import java.util.List;
*/ */
final class ScrollNestedGuiImpl extends AbstractScrollGui<Gui> { final class ScrollNestedGuiImpl extends AbstractScrollGui<Gui> {
private List<Gui> guis;
private List<SlotElement.LinkedSlotElement> elements;
/** /**
* Creates a new {@link ScrollNestedGuiImpl}. * Creates a new {@link ScrollNestedGuiImpl}.
* *
@ -43,30 +40,16 @@ final class ScrollNestedGuiImpl extends AbstractScrollGui<Gui> {
} }
@Override @Override
public void setContent(@Nullable List<@NotNull Gui> guis) { public void bake() {
this.guis = guis != null ? guis : new ArrayList<>(); ArrayList<SlotElement> elements = new ArrayList<>();
updateElements(); for (Gui gui : content) {
update();
}
private void updateElements() {
elements = new ArrayList<>();
for (Gui gui : guis) {
for (int i = 0; i < gui.getSize(); i++) { for (int i = 0; i < gui.getSize(); i++) {
elements.add(new SlotElement.LinkedSlotElement(gui, i)); elements.add(new SlotElement.LinkedSlotElement(gui, i));
} }
} }
}
@Override this.elements = elements;
protected List<SlotElement.LinkedSlotElement> getElements(int from, int to) { update();
return elements.subList(from, Math.min(elements.size(), to));
}
@Override
public int getMaxLine() {
if (elements == null) return 0;
return (int) Math.ceil((double) elements.size() / (double) getLineLength()) - 1;
} }
public static final class Builder extends AbstractBuilder<Gui> { public static final class Builder extends AbstractBuilder<Gui> {

@ -8,8 +8,11 @@ import xyz.xenondevs.invui.util.DataUtils;
import xyz.xenondevs.invui.util.ItemUtils; import xyz.xenondevs.invui.util.ItemUtils;
import java.io.*; import java.io.*;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.function.BiConsumer;
/** /**
* A serializable {@link Inventory} implementation that is identified by a {@link UUID} and backed by a simple {@link ItemStack} array. * A serializable {@link Inventory} implementation that is identified by a {@link UUID} and backed by a simple {@link ItemStack} array.
@ -22,6 +25,7 @@ public class VirtualInventory extends Inventory {
private int size; private int size;
private @Nullable ItemStack @NotNull [] items; private @Nullable ItemStack @NotNull [] items;
private int @NotNull [] maxStackSizes; private int @NotNull [] maxStackSizes;
private @Nullable List<@NotNull BiConsumer<@NotNull Integer, @NotNull Integer>> resizeHandlers;
/** /**
* Constructs a new {@link VirtualInventory} * Constructs a new {@link VirtualInventory}
@ -149,6 +153,7 @@ public class VirtualInventory extends Inventory {
setGuiPriority(inventory.getGuiPriority()); setGuiPriority(inventory.getGuiPriority());
setPreUpdateHandler(inventory.getPreUpdateHandler()); setPreUpdateHandler(inventory.getPreUpdateHandler());
setPostUpdateHandler(inventory.getPostUpdateHandler()); setPostUpdateHandler(inventory.getPostUpdateHandler());
setResizeHandlers(inventory.getResizeHandlers());
} }
/** /**
@ -236,6 +241,46 @@ public class VirtualInventory extends Inventory {
} }
} }
/**
* Sets the handlers that are called every time this {@link VirtualInventory} is resized.
*
* @param resizeHandlers The handlers to set.
*/
public void setResizeHandlers(@Nullable List<@NotNull BiConsumer<@NotNull Integer, @NotNull Integer>> resizeHandlers) {
this.resizeHandlers = resizeHandlers;
}
/**
* Gets the handlers that are called every time this {@link VirtualInventory} is resized.
*
* @return The handlers.
*/
public @Nullable List<@NotNull BiConsumer<@NotNull Integer, @NotNull Integer>> getResizeHandlers() {
return resizeHandlers;
}
/**
* Adds a handler that is called every time this {@link VirtualInventory} is resized.
*
* @param resizeHandler The handler to add.
*/
public void addResizeHandler(@NotNull BiConsumer<@NotNull Integer, @NotNull Integer> resizeHandler) {
if (resizeHandlers == null)
resizeHandlers = new ArrayList<>();
resizeHandlers.add(resizeHandler);
}
/**
* Removes a handler that is called every time this {@link VirtualInventory} is resized.
*
* @param resizeHandler The handler to remove.
*/
public void removeResizeHandler(@NotNull BiConsumer<@NotNull Integer, @NotNull Integer> resizeHandler) {
if (resizeHandlers != null)
resizeHandlers.remove(resizeHandler);
}
/** /**
* Changes the size of the {@link VirtualInventory}. * Changes the size of the {@link VirtualInventory}.
* <p> * <p>
@ -259,6 +304,13 @@ public class VirtualInventory extends Inventory {
int stackSize = previousSize != 0 ? maxStackSizes[previousSize - 1] : 64; int stackSize = previousSize != 0 ? maxStackSizes[previousSize - 1] : 64;
Arrays.fill(maxStackSizes, previousSize, maxStackSizes.length, stackSize); Arrays.fill(maxStackSizes, previousSize, maxStackSizes.length, stackSize);
} }
// call resize handlers if present
if (resizeHandlers != null) {
for (BiConsumer<Integer, Integer> resizeHandler : resizeHandlers) {
resizeHandler.accept(previousSize, size);
}
}
} }
/** /**