From 728fd6ff24f7255790473c0e1ad974979105d2cd Mon Sep 17 00:00:00 2001 From: LexManos Date: Tue, 23 Sep 2025 13:37:53 -0700 Subject: [PATCH] Optimize ConcatenatedListView's Iterator and fix hidden CreativeTabs taking up page space. --- .../CreativeModeInventoryScreen.java.patch | 3 +- .../common/util/ConcatenatedListView.java | 86 +++++++++++-------- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch index a19c4873ed..775cc3a71f 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch @@ -18,7 +18,7 @@ this.refreshSearchResults(); } else { this.menu.items.addAll(p_261591_); -@@ -329,6 +_,35 @@ +@@ -329,6 +_,36 @@ protected void init() { if (this.minecraft.player.hasInfiniteMaterials()) { super.init(); @@ -26,6 +26,7 @@ + int tabIndex = 0; + List currentPage = new java.util.ArrayList<>(); + for (CreativeModeTab sortedCreativeModeTab : net.minecraftforge.common.CreativeModeTabRegistry.getSortedCreativeModeTabs()) { ++ if (!sortedCreativeModeTab.shouldDisplay()) continue; + currentPage.add(sortedCreativeModeTab); + tabIndex++; + if (tabIndex == 10) { diff --git a/src/main/java/net/minecraftforge/common/util/ConcatenatedListView.java b/src/main/java/net/minecraftforge/common/util/ConcatenatedListView.java index 82ce32dc4f..b9e1dc3626 100644 --- a/src/main/java/net/minecraftforge/common/util/ConcatenatedListView.java +++ b/src/main/java/net/minecraftforge/common/util/ConcatenatedListView.java @@ -5,11 +5,17 @@ package net.minecraftforge.common.util; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; import java.util.function.Supplier; /** @@ -18,16 +24,13 @@ import java.util.function.Supplier; * for each of your collections.

* This list does not support modification operations, but the underlying lists may be mutated safely externally. */ -public class ConcatenatedListView implements List -{ +public class ConcatenatedListView implements List { @SafeVarargs - public static ConcatenatedListView of(List... lists) - { + public static ConcatenatedListView of(List... lists) { return new ConcatenatedListView<>(List.of(lists)); } - public static List of(List> members) - { + public static List of(List> members) { return switch (members.size()) { case 0 -> List.of(); case 1 -> Collections.unmodifiableList(members.getFirst()); @@ -37,14 +40,12 @@ public class ConcatenatedListView implements List private final List> lists; - private ConcatenatedListView(List> lists) - { + private ConcatenatedListView(List> lists) { this.lists = lists; } @Override - public int size() - { + public int size() { int size = 0; for (var list : lists) size += list.size(); @@ -52,8 +53,7 @@ public class ConcatenatedListView implements List } @Override - public boolean isEmpty() - { + public boolean isEmpty() { for (List list : lists) if (!list.isEmpty()) return false; @@ -61,8 +61,7 @@ public class ConcatenatedListView implements List } @Override - public boolean contains(Object o) - { + public boolean contains(Object o) { for (var list : lists) if (list.contains(o)) return true; @@ -70,10 +69,8 @@ public class ConcatenatedListView implements List } @Override - public T get(int index) - { - for (var list : lists) - { + public T get(int index) { + for (var list : lists) { int size = list.size(); if (index < size) return list.get(index); @@ -83,11 +80,9 @@ public class ConcatenatedListView implements List } @Override - public int indexOf(Object o) - { + public int indexOf(Object o) { int offset = 0; - for (var list : lists) - { + for (var list : lists) { int foundIndex = list.indexOf(o); if (foundIndex >= 0) return offset + foundIndex; @@ -97,11 +92,9 @@ public class ConcatenatedListView implements List } @Override - public int lastIndexOf(Object o) - { + public int lastIndexOf(Object o) { int offset = 0; - for (var list : Lists.reverse(lists)) - { + for (var list : Lists.reverse(lists)) { int foundIndex = list.lastIndexOf(o); if (foundIndex >= 0) return offset + foundIndex; @@ -112,25 +105,42 @@ public class ConcatenatedListView implements List @NotNull @Override - public Iterator iterator() - { - return Iterables.unmodifiableIterable(Iterables.concat(lists)).iterator(); - } + public Iterator iterator() { + return new Iterator() { + private Iterator> listItr = lists.iterator(); + private Iterator current; - @Override - public Spliterator spliterator() - { - return Iterables.unmodifiableIterable(Iterables.concat(lists)).spliterator(); + @Override + public boolean hasNext() { + while ((current == null || !current.hasNext()) && listItr.hasNext()) { + var nextList = listItr.next(); + if (nextList != null) + current = nextList.iterator(); + } + return current != null; + } + + @Override + public T next() { + if (!hasNext()) + throw new NoSuchElementException(); + T next = current.next(); + if (!current.hasNext()) + current = null; + return next; + } + + }; } // Delegate to a concatenated collection - private > C concatenate(Supplier collectionFactory) - { + private > C concatenate(Supplier collectionFactory) { var concat = collectionFactory.get(); for (var list : lists) concat.addAll(list); return concat; } + @NotNull @Override public Object[] toArray() { return concatenate(ArrayList::new).toArray(); } @NotNull @Override public T1[] toArray(@NotNull T1[] a) { return concatenate(ArrayList::new).toArray(a); } @Override public boolean containsAll(@NotNull Collection c) { return concatenate(HashSet::new).containsAll(c); }