diff options
| author | shedaniel <daniel@shedaniel.me> | 2024-04-16 01:42:49 +0900 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2024-04-16 01:42:49 +0900 |
| commit | 9bdb9cb7c0a03accb6f86bcedff4b22f38f1346f (patch) | |
| tree | bc7557eeebd32609fc8b26db28f613e5fd576366 /runtime/src/main/java/me/shedaniel/rei/impl/common | |
| parent | f59653ff2a7c3641624928478a3622e6ffd32889 (diff) | |
| parent | 8981a2f730942e169ba5efa2f25ad3066dc0f797 (diff) | |
| download | RoughlyEnoughItems-9bdb9cb7c0a03accb6f86bcedff4b22f38f1346f.tar.gz RoughlyEnoughItems-9bdb9cb7c0a03accb6f86bcedff4b22f38f1346f.tar.bz2 RoughlyEnoughItems-9bdb9cb7c0a03accb6f86bcedff4b22f38f1346f.zip | |
Merge branch 'feature/12.1' into feature/13.1
# Conflicts:
# gradle.properties
# runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/ChangelogLoader.java
# runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java
# runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
# runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/OverflowWidget.java
Diffstat (limited to 'runtime/src/main/java/me/shedaniel/rei/impl/common')
6 files changed, 123 insertions, 11 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java index cdf3d911b..56576d276 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java @@ -24,10 +24,13 @@ package me.shedaniel.rei.impl.common.entry; import com.google.common.collect.Iterators; +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.settings.EntryIngredientSetting; import me.shedaniel.rei.impl.Internals; import net.minecraft.nbt.ListTag; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Consumer; @@ -240,9 +243,37 @@ public enum EntryIngredientImpl implements Internals.EntryIngredientProvider { public EntryIngredient map(UnaryOperator<EntryStack<?>> transformer) { return this; } + + @Nullable + @Override + public <T> T getSetting(EntryIngredientSetting<T> setting) { + return null; + } + + @Override + public <T> EntryIngredient setting(EntryIngredientSetting<T> setting, T value) { + return this; + } } - private static class SingletonEntryIngredient extends AbstractList<EntryStack<?>> implements EntryIngredient, RandomAccess { + private static abstract class AbstractEntryIngredient extends AbstractList<EntryStack<?>> implements EntryIngredient { + private Map<EntryIngredientSetting<?>, Object> settings = null; + + @Override + @Nullable + public <T> T getSetting(EntryIngredientSetting<T> setting) { + return SettingsHandler.get(this.settings, setting); + } + + @Override + public <T> EntryIngredient setting(EntryIngredientSetting<T> setting, T value) { + if (value == null) this.settings = SettingsHandler.remove(this.settings, setting); + else this.settings = SettingsHandler.set(this.settings, setting, value); + return this; + } + } + + private static class SingletonEntryIngredient extends AbstractEntryIngredient implements EntryIngredient, RandomAccess { private EntryStack<?> stack; public SingletonEntryIngredient(EntryStack<?> stack) { @@ -366,7 +397,7 @@ public enum EntryIngredientImpl implements Internals.EntryIngredientProvider { } } - private static class ArrayIngredient extends AbstractList<EntryStack<?>> implements EntryIngredient, RandomAccess { + private static class ArrayIngredient extends AbstractEntryIngredient implements EntryIngredient, RandomAccess { private static final long serialVersionUID = -2764017481108945198L; private final EntryStack<?>[] array; @@ -473,4 +504,36 @@ public enum EntryIngredientImpl implements Internals.EntryIngredientProvider { return new ArrayIngredient(out); } } + + private static class SettingsHandler { + private static Map<EntryIngredientSetting<?>, Object> set(Map<EntryIngredientSetting<?>, Object> map, EntryIngredientSetting<?> setting, Object value) { + if (map == null) { + map = new Reference2ObjectOpenHashMap<>(); + } + + map.put(setting, value); + return map; + } + + private static <T> T get(Map<EntryIngredientSetting<?>, Object> map, EntryIngredientSetting<T> setting) { + if (map == null) { + return null; + } + + Object o = map.get(setting); + return o == null ? null : (T) o; + } + + private static Map<EntryIngredientSetting<?>, Object> remove(Map<EntryIngredientSetting<?>, Object> map, EntryIngredientSetting<?> setting) { + if (map == null) { + return null; + } + + map.remove(setting); + if (map.isEmpty()) { + return null; + } + return map; + } + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java index 6e463d728..8f27534a4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java @@ -115,11 +115,15 @@ public class EntryRegistryImpl implements EntryRegistry { @Override public List<EntryStack<?>> getPreFilteredList() { - return Collections.unmodifiableList(filteredList.getList()); + return Collections.unmodifiableList(filteredList.getUnwrappedList()); + } + + public FilteredEntryList getFilteredList() { + return filteredList; } public List<HNEntryStackWrapper> getPreFilteredComplexList() { - return Collections.unmodifiableList(filteredList.getComplexList()); + return Collections.unmodifiableList(filteredList.getList()); } public List<HNEntryStackWrapper> getComplexList() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/FilteredEntryList.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/FilteredEntryList.java index efe289659..b44c64f26 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/FilteredEntryList.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/FilteredEntryList.java @@ -38,9 +38,9 @@ public interface FilteredEntryList extends EntryRegistryListener { void refreshFilteringFor(boolean log, @Nullable Set<FilteringRule<?>> refilterRules, Collection<EntryStack<?>> stacks, @Nullable LongCollection hashes); - List<EntryStack<?>> getList(); + List<HNEntryStackWrapper> getList(); - List<HNEntryStackWrapper> getComplexList(); + List<EntryStack<?>> getUnwrappedList(); boolean isFiltered(EntryStack<?> stack, long hashExact); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java index 3133afb20..78376daa2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java @@ -212,13 +212,13 @@ public class PreFilteredEntryList implements FilteredEntryList { } @Override - public List<EntryStack<?>> getList() { - return simpleListView; + public List<HNEntryStackWrapper> getList() { + return listView; } @Override - public List<HNEntryStackWrapper> getComplexList() { - return listView; + public List<EntryStack<?>> getUnwrappedList() { + return simpleListView; } private class InternalListView extends AbstractList<HNEntryStackWrapper> { @@ -291,7 +291,18 @@ public class PreFilteredEntryList implements FilteredEntryList { @Override public Iterator<EntryStack<?>> iterator() { - return Iterators.transform(list.iterator(), HNEntryStackWrapper::unwrap); + Iterator<HNEntryStackWrapper> iterator = list.iterator(); + return new Iterator<>() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public EntryStack<?> next() { + return iterator.next().unwrap(); + } + }; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java index 50f57d3bc..8256b7c6c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java @@ -23,10 +23,12 @@ package me.shedaniel.rei.impl.common.entry.type.collapsed; +import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.collapsible.CollapsibleConfigManager; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper; import net.minecraft.network.chat.Component; @@ -38,6 +40,7 @@ import java.util.stream.Collectors; public class CollapsibleEntryRegistryImpl implements CollapsibleEntryRegistry { private final Map<ResourceLocation, Entry> entries = new LinkedHashMap<>(); + private final List<Entry> customEntries = new ArrayList<>(); @Override public <T> void group(ResourceLocation id, Component name, List<? extends EntryStack<? extends T>> stacks) { @@ -70,6 +73,7 @@ public class CollapsibleEntryRegistryImpl implements CollapsibleEntryRegistry { @Override public void endReload() { + this.recollectCustomEntries(); InternalLogger.getInstance().debug("Registered %d collapsible entry groups: %s", entries.values().size(), entries.values().stream().map(entry -> entry.getName().getString()).collect(Collectors.joining(", "))); } @@ -79,10 +83,28 @@ public class CollapsibleEntryRegistryImpl implements CollapsibleEntryRegistry { plugin.registerCollapsibleEntries(this); } + public void recollectCustomEntries() { + InternalLogger.getInstance().debug("Recollecting custom collapsible entry groups"); + this.customEntries.clear(); + for (CollapsibleConfigManager.CustomGroup customEntry : CollapsibleConfigManager.getInstance().getConfig().customGroups) { + List<HashedEntryStackWrapper> stacks = CollectionUtils.filterAndMap(customEntry.stacks, EntryStackProvider::isValid, provider -> new HashedEntryStackWrapper(provider.provide())); + Entry entry = new Entry(customEntry.id, Component.literal(customEntry.name), + new ListMatcher(stacks), false); + this.customEntries.add(entry); + InternalLogger.getInstance().debug("Added custom collapsible entry group [%s] %s with %d entries", entry.getId(), entry.getName().getString(), stacks.size()); + } + InternalLogger.getInstance().debug("Registered %d custom collapsible entry groups: ", customEntries.size(), + customEntries.stream().map(entry -> entry.getName().getString()).collect(Collectors.joining(", "))); + } + public Collection<Entry> getEntries() { return entries.values(); } + public List<Entry> getCustomEntries() { + return customEntries; + } + public static class Entry { private final ResourceLocation id; private final Component name; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java index 8918ad32d..1e54c1129 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java @@ -29,6 +29,18 @@ import java.util.Comparator; import java.util.stream.Stream; public class RectangleUtils { + public static Rectangle inset(Rectangle rectangle, int inset) { + return inset(rectangle, inset, inset); + } + + public static Rectangle inset(Rectangle rectangle, int insetX, int insetY) { + return inset(rectangle, insetX, insetY, insetX, insetY); + } + + public static Rectangle inset(Rectangle rectangle, int insetLeft, int insetTop, int insetRight, int insetBottom) { + return new Rectangle(rectangle.x + insetLeft, rectangle.y + insetTop, rectangle.width - insetLeft - insetRight, rectangle.height - insetTop - insetBottom); + } + public static Rectangle excludeZones(Rectangle rectangle, Stream<Rectangle> exclusionZones) { return exclusionZones .filter(rect -> rect.intersects(rectangle)) |
