aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-04-14 11:15:25 +0800
committershedaniel <daniel@shedaniel.me>2022-04-14 11:15:25 +0800
commit1fc0a945d287f2e782a511d1a92a494a4633776a (patch)
tree30b8504b0436af6ef030548b8b98c0effb481a69
parent6236ed33c3ae70cf99219222c2e13e467fa1c8e0 (diff)
parentd16d89a165632d7babbb37168ace0c49f32286e7 (diff)
downloadRoughlyEnoughItems-1fc0a945d287f2e782a511d1a92a494a4633776a.tar.gz
RoughlyEnoughItems-1fc0a945d287f2e782a511d1a92a494a4633776a.tar.bz2
RoughlyEnoughItems-1fc0a945d287f2e782a511d1a92a494a4633776a.zip
Merge remote-tracking branch 'origin/8.x-1.18.2' into 9.x-1.19
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java3
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java5
-rw-r--r--fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java9
-rw-r--r--forge/build.gradle6
-rw-r--r--forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java9
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java54
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java11
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java44
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java12
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java30
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java34
-rwxr-xr-xruntime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json1
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json2
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json4
-rw-r--r--runtime/src/main/resources/roughlyenoughitems.changes.json2
-rw-r--r--runtime/src/main/resources/roughlyenoughitems/2022.1/changelog.md4
22 files changed, 177 insertions, 73 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java
index dfd8f08f6..b38e409b5 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java
@@ -150,6 +150,9 @@ public interface ConfigObject {
boolean isUsingCompactTabs();
+ @ApiStatus.Experimental
+ boolean isUsingCompactTabButtons();
+
boolean isLowerConfigButton();
@ApiStatus.Experimental
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java
index 632879b0d..979713683 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java
@@ -86,7 +86,8 @@ public final class EntryStacks {
if (leftType == rightType) {
return left.getDefinition().equals(left.getValue(), right.castValue(), context);
}
- for (EntryTypeBridge<A, B> bridge : EntryTypeRegistry.getInstance().getBridgesFor(leftType, rightType)) {
+ EntryTypeRegistry instance = EntryTypeRegistry.getInstance();
+ for (EntryTypeBridge<A, B> bridge : instance.getBridgesFor(leftType, rightType)) {
CompoundEventResult<Stream<EntryStack<B>>> holder = bridge.bridge(left);
if (holder.isTrue()) {
Iterator<EntryStack<B>> iterator = holder.object().iterator();
@@ -98,7 +99,7 @@ public final class EntryStacks {
}
}
}
- for (EntryTypeBridge<B, A> bridge : EntryTypeRegistry.getInstance().getBridgesFor(rightType, leftType)) {
+ for (EntryTypeBridge<B, A> bridge : instance.getBridgesFor(rightType, leftType)) {
CompoundEventResult<Stream<EntryStack<A>>> holder = bridge.bridge(right);
if (holder.isTrue()) {
Iterator<EntryStack<A>> iterator = holder.object().iterator();
diff --git a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
index 86c21c5a4..caf42161f 100644
--- a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
+++ b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
@@ -23,7 +23,6 @@
package me.shedaniel.rei.impl.client.gui.fabric;
-import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.impl.ClientInternals;
@@ -49,6 +48,8 @@ public class ScreenOverlayImplImpl {
Stream<FormattedCharSequence> sequenceStream = texts.isEmpty() ? Stream.of(component.getAsText().getVisualOrderText())
: texts.stream().map(Language.getInstance()::getVisualOrder);
return sequenceStream.map(ClientTooltipComponent::create);
+ } else if (!component.isTooltipComponent()) {
+ return Stream.of(component.getAsComponent());
} else {
return Stream.empty();
}
@@ -72,14 +73,8 @@ public class ScreenOverlayImplImpl {
if (lines.isEmpty()) {
return;
}
- PoseStack modelViewStack = RenderSystem.getModelViewStack();
- modelViewStack.pushPose();
- modelViewStack.translate(0, 0, 500);
- RenderSystem.applyModelViewMatrix();
matrices.pushPose();
Minecraft.getInstance().screen.renderTooltipInternal(matrices, lines, mouseX, mouseY);
matrices.popPose();
- modelViewStack.popPose();
- RenderSystem.applyModelViewMatrix();
}
}
diff --git a/forge/build.gradle b/forge/build.gradle
index af5ddc41f..59fd522f4 100644
--- a/forge/build.gradle
+++ b/forge/build.gradle
@@ -85,8 +85,10 @@ dependencies {
// modRuntime("curse.maven:chiselsbits-231095:3492889")
// modRuntime("curse.maven:jumbofurnace-390880:3120970")
// modRuntime("curse.maven:cyclic-239286:3221427")
- // modRuntime("curse.maven:mekanism-268560:3206392")
- // modRuntime("curse.maven:mekanism-tools-268567:3206396")
+ modRuntime("curse.maven:mekanism-268560:3743835")
+ modRuntime("curse.maven:mekanism-tools-268567:3743838")
+ modRuntime("curse.maven:mekanism-generators-268566:3743837")
+ modRuntime("curse.maven:immersive-engineering-231951:3721708")
// modRuntime("curse.maven:autoreglib-250363:3326041")
// modRuntime("curse.maven:ars-nouveau-401955:3619899")
// modRuntime("curse.maven:patchouli-306770:3594394")
diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
index c9b9e73b2..6a50e8d71 100644
--- a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
+++ b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
@@ -23,7 +23,6 @@
package me.shedaniel.rei.impl.client.gui.forge;
-import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.common.entry.EntryStack;
@@ -35,19 +34,17 @@ import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.ForgeHooksClient;
+import java.util.ArrayList;
import java.util.List;
public class ScreenOverlayImplImpl {
public static void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY) {
- PoseStack modelViewStack = RenderSystem.getModelViewStack();
- modelViewStack.pushPose();
-// modelViewStack.translate(0, 0, 500);
- RenderSystem.applyModelViewMatrix();
matrices.pushPose();
EntryStack<?> stack = tooltip.getContextStack();
ItemStack itemStack = stack.getType() == VanillaEntryTypes.ITEM ? stack.castValue() : ItemStack.EMPTY;
List<Component> texts = CollectionUtils.filterAndMap(tooltip.entries(), Tooltip.Entry::isText, Tooltip.Entry::getAsText);
List<ClientTooltipComponent> components = ForgeHooksClient.gatherTooltipComponents(itemStack, texts, mouseX, screen.width, screen.height, null, screen.getMinecraft().font);
+ components = new ArrayList<>(components);
for (Tooltip.Entry entry : tooltip.entries()) {
if (!entry.isText()) {
components.add(1, entry.getAsComponent());
@@ -57,7 +54,5 @@ public class ScreenOverlayImplImpl {
screen.renderTooltipInternal(matrices, components, mouseX, mouseY);
screen.tooltipStack = ItemStack.EMPTY;
matrices.popPose();
- modelViewStack.popPose();
- RenderSystem.applyModelViewMatrix();
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java
index f3b18ba39..09d43c2a1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java
@@ -27,8 +27,9 @@ import com.google.common.base.Suppliers;
import dev.architectury.networking.NetworkManager;
import dev.architectury.platform.Platform;
import io.netty.buffer.Unpooled;
-import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
-import it.unimi.dsi.fastutil.longs.LongSet;
+import it.unimi.dsi.fastutil.longs.Long2LongMap;
+import it.unimi.dsi.fastutil.longs.Long2LongMaps;
+import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
import me.shedaniel.rei.RoughlyEnoughItemsNetwork;
import me.shedaniel.rei.api.client.ClientHelper;
import me.shedaniel.rei.api.client.config.ConfigManager;
@@ -40,6 +41,8 @@ import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.client.view.ViewSearchBuilder;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryStack;
+import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext;
+import me.shedaniel.rei.api.common.entry.type.EntryDefinition;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.api.common.util.FormattingUtils;
@@ -54,12 +57,14 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen;
+import net.minecraft.core.NonNullList;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.LazyLoadedValue;
import net.minecraft.util.Mth;
import net.minecraft.world.inventory.AbstractContainerMenu;
+import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
@@ -221,17 +226,46 @@ public class ClientHelperImpl implements ClientHelper {
}
@ApiStatus.Internal
- public LongSet _getInventoryItemsTypes() {
+ public Long2LongMap _getInventoryItemsTypes() {
+ EntryDefinition<ItemStack> definition;
try {
- VanillaEntryTypes.ITEM.getDefinition();
+ definition = VanillaEntryTypes.ITEM.getDefinition();
} catch (NullPointerException e) {
- return new LongOpenHashSet();
+ return Long2LongMaps.EMPTY_MAP;
+ }
+ Long2LongOpenHashMap map = new Long2LongOpenHashMap();
+ for (NonNullList<ItemStack> compartment : Minecraft.getInstance().player.getInventory().compartments) {
+ for (ItemStack stack : compartment) {
+ long hash = definition.hash(null, stack, ComparisonContext.FUZZY);
+ long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount());
+ map.put(hash, newCount);
+ }
+ }
+ return map;
+ }
+
+ @ApiStatus.Internal
+ public Long2LongMap _getContainerItemsTypes() {
+ EntryDefinition<ItemStack> definition;
+ try {
+ definition = VanillaEntryTypes.ITEM.getDefinition();
+ } catch (NullPointerException e) {
+ return Long2LongMaps.EMPTY_MAP;
+ }
+ Long2LongOpenHashMap map = new Long2LongOpenHashMap();
+ AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu;
+ if (menu != null) {
+ for (Slot slot : menu.slots) {
+ ItemStack stack = slot.getItem();
+
+ if (!stack.isEmpty()) {
+ long hash = definition.hash(null, stack, ComparisonContext.FUZZY);
+ long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount());
+ map.put(hash, newCount);
+ }
+ }
}
- return Minecraft.getInstance().player.getInventory().compartments.stream()
- .flatMap(Collection::stream)
- .map(EntryStacks::of)
- .mapToLong(EntryStacks::hashFuzzy)
- .collect(LongOpenHashSet::new, LongOpenHashSet::add, LongOpenHashSet::addAll);
+ return map;
}
@ApiStatus.Internal
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
index 078f46344..2d82a28c8 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java
@@ -293,7 +293,7 @@ public class ConfigManagerImpl implements ConfigManager {
@Override
public boolean isCraftableOnlyEnabled() {
- return craftableOnly;
+ return craftableOnly && getConfig().isCraftableFilterEnabled();
}
@Override
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java
index 76c7e269c..0f273b7e8 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java
@@ -357,6 +357,11 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
}
@Override
+ public boolean isUsingCompactTabButtons() {
+ return advanced.accessibility.useCompactTabButtons;
+ }
+
+ @Override
public boolean isLowerConfigButton() {
return appearance.layout.configButtonLocation == ConfigButtonPosition.LOWER;
}
@@ -521,7 +526,8 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
public static class Basics {
@ConfigEntry.Gui.Excluded public List<FavoriteEntry> favorites = new ArrayList<>();
- @Comment("Declares whether cheating mode is on.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private CheatingMode cheating = CheatingMode.OFF;
+ @Comment("Declares whether cheating mode is on.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON)
+ private CheatingMode cheating = CheatingMode.OFF;
private boolean favoritesEnabled = true;
@ConfigEntry.Gui.CollapsibleObject(startExpanded = true)
private KeyBindings keyBindings = new KeyBindings();
@@ -564,7 +570,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
private SearchFieldLocation searchFieldLocation = SearchFieldLocation.CENTER;
@Comment("Declares the position of the config button.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON)
private ConfigButtonPosition configButtonLocation = ConfigButtonPosition.LOWER;
- @Comment("Declares whether the craftable filter button is enabled.") private boolean enableCraftableOnlyButton = false;
+ @Comment("Declares whether the craftable filter button is enabled.") private boolean enableCraftableOnlyButton = true;
}
@UsePercentage(min = 0.1, max = 1.0, prefix = "Limit: ") private double horizontalEntriesBoundaries = 1.0;
@@ -631,6 +637,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
@Comment("Declares how the scrollbar in composite screen should act.") private boolean compositeScrollBarPermanent = false;
private boolean toastDisplayedOnCopyIdentifier = true;
@Comment("Declares whether REI should use compact tabs for categories.") private boolean useCompactTabs = true;
+ @Comment("Declares whether REI should use compact tab buttons for categories.") private boolean useCompactTabButtons = true;
}
public static class Search {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java
index a34423cb0..74c010f83 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java
@@ -138,7 +138,7 @@ public class ScreenOverlayImpl extends ScreenOverlay {
public void tick() {
if (REIRuntimeImpl.getSearchField() != null) {
REIRuntimeImpl.getSearchField().tick();
- if (Minecraft.getInstance().player != null && !PluginManager.areAnyReloading()) {
+ if (Minecraft.getInstance().player != null && !PluginManager.areAnyReloading() && Minecraft.getInstance().player.tickCount % 5 == 0) {
CraftableFilter.INSTANCE.tick();
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java
index 59c23cca0..1996dc5ef 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java
@@ -23,20 +23,16 @@
package me.shedaniel.rei.impl.client.gui.craftable;
-import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
-import it.unimi.dsi.fastutil.longs.LongSet;
-import it.unimi.dsi.fastutil.longs.LongSets;
-import me.shedaniel.rei.api.common.entry.EntryStack;
-import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
-import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor;
-import me.shedaniel.rei.api.common.util.EntryStacks;
+import it.unimi.dsi.fastutil.longs.Long2LongMap;
+import it.unimi.dsi.fastutil.longs.Long2LongMaps;
+import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
import me.shedaniel.rei.impl.client.ClientHelperImpl;
-import net.minecraft.client.Minecraft;
public class CraftableFilter {
public static final CraftableFilter INSTANCE = new CraftableFilter();
private boolean dirty = false;
- private LongSet invStacks = new LongOpenHashSet();
+ private Long2LongMap invStacks = new Long2LongOpenHashMap();
+ private Long2LongMap containerStacks = new Long2LongOpenHashMap();
public void markDirty() {
dirty = true;
@@ -53,28 +49,32 @@ public class CraftableFilter {
public void tick() {
if (dirty) return;
- LongSet currentStacks;
+ Long2LongMap currentStacks;
try {
currentStacks = ClientHelperImpl.getInstance()._getInventoryItemsTypes();
} catch (Throwable throwable) {
throwable.printStackTrace();
- currentStacks = LongSets.EMPTY_SET;
+ currentStacks = Long2LongMaps.EMPTY_MAP;
}
if (!currentStacks.equals(this.invStacks)) {
- invStacks = new LongOpenHashSet(currentStacks);
+ invStacks = currentStacks;
markDirty();
}
- }
+ if (dirty) return;
- public boolean matches(EntryStack<?> stack, Iterable<SlotAccessor> inputSlots) {
- if (invStacks.contains(EntryStacks.hashFuzzy(stack))) return true;
- if (stack.getType() != VanillaEntryTypes.ITEM) return false;
- for (SlotAccessor slot : inputSlots) {
- EntryStack<?> itemStack = EntryStacks.of(slot.getItemStack());
- if (!itemStack.isEmpty() && EntryStacks.equalsFuzzy(itemStack, stack)) {
- return true;
- }
+ try {
+ currentStacks = ClientHelperImpl.getInstance()._getContainerItemsTypes();
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ currentStacks = Long2LongMaps.EMPTY_MAP;
}
- return false;
+ if (!currentStacks.equals(this.containerStacks)) {
+ containerStacks = currentStacks;
+ markDirty();
+ }
+ }
+
+ public Long2LongMap getInvStacks() {
+ return invStacks;
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java
index b1f131197..1613d7f18 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java
@@ -108,6 +108,8 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen
public void init() {
super.init();
boolean isCompactTabs = ConfigObject.getInstance().isUsingCompactTabs();
+ boolean isCompactTabButtons = ConfigObject.getInstance().isUsingCompactTabButtons();
+ int tabButtonsSize = isCompactTabButtons ? 10 : 16;
int tabSize = isCompactTabs ? 24 : 28;
this.children().clear();
this.widgets.clear();
@@ -120,7 +122,7 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen
DisplaySpec display = categoryMap.get(category).get(selectedRecipeIndex);
int guiWidth = Mth.clamp(category.getDisplayWidth(display.provideInternalDisplay()) + 30, 0, largestWidth) + 100;
int guiHeight = Mth.clamp(category.getDisplayHeight() + 40, 166, largestHeight);
- this.tabsPerPage = Math.max(5, Mth.floor((guiWidth - 20d) / tabSize));
+ this.tabsPerPage = Math.max(5, Mth.floor((guiWidth - tabButtonsSize * 2d) / tabSize));
if (this.tabsPage == -1) {
this.tabsPage = selectedCategoryIndex / tabsPerPage;
}
@@ -207,21 +209,23 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen
tab.setRenderer(tabCategory, tabCategory.getIcon(), tabCategory.getTitle(), j == selectedCategoryIndex);
}
}
- this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + 2, bounds.y - 16, 10, 10), new TranslatableComponent("text.rei.left_arrow"))
+ this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + 2, bounds.y - (isCompactTabButtons ? 16 : 20), tabButtonsSize, tabButtonsSize), new TranslatableComponent("text.rei.left_arrow"))
.onClick(button -> {
tabsPage--;
if (tabsPage < 0)
tabsPage = Mth.ceil(categories.size() / (float) tabsPerPage) - 1;
CompositeDisplayViewingScreen.this.init();
})
+ .tooltipLine(new TranslatableComponent("text.rei.previous_page"))
.enabled(categories.size() > tabsPerPage));
- this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + bounds.width - 12, bounds.y - 16, 10, 10), new TranslatableComponent("text.rei.right_arrow"))
+ this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + bounds.width - (isCompactTabButtons ? tabButtonsSize + 2 : tabButtonsSize + 3), bounds.y - (isCompactTabButtons ? 16 : 20), tabButtonsSize, tabButtonsSize), new TranslatableComponent("text.rei.right_arrow"))
.onClick(button -> {
tabsPage++;
if (tabsPage > Mth.ceil(categories.size() / (float) tabsPerPage) - 1)
tabsPage = 0;
CompositeDisplayViewingScreen.this.init();
})
+ .tooltipLine(new TranslatableComponent("text.rei.next_page"))
.enabled(categories.size() > tabsPerPage));
this.widgets.add(Widgets.createClickableLabel(new Point(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6), categories.get(selectedCategoryIndex).getTitle(), label -> {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java
index 47f914e5d..a5ea0a957 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java
@@ -162,28 +162,32 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen {
}
boolean isCompactTabs = ConfigObject.getInstance().isUsingCompactTabs();
+ boolean isCompactTabButtons = ConfigObject.getInstance().isUsingCompactTabButtons();
+ int tabButtonsSize = isCompactTabButtons ? 10 : 16;
int tabSize = isCompactTabs ? 24 : 28;
- this.tabsPerPage = Math.max(5, Mth.floor((guiWidth - 20d) / tabSize));
+ this.tabsPerPage = Math.max(5, Mth.floor((guiWidth - tabButtonsSize * 2d) / tabSize));
if (this.categoryPages == -1) {
this.categoryPages = Math.max(0, selectedCategoryIndex / tabsPerPage);
}
this.page = Mth.clamp(page, 0, getCurrentTotalPages() - 1);
- this.widgets.add(Widgets.createButton(new Rectangle(bounds.x, bounds.y - 16, 10, 10), new TranslatableComponent("text.rei.left_arrow"))
+ this.widgets.add(Widgets.createButton(new Rectangle(bounds.x, bounds.y - (isCompactTabButtons ? 16 : 20), tabButtonsSize, tabButtonsSize), new TranslatableComponent("text.rei.left_arrow"))
.onClick(button -> {
categoryPages--;
if (categoryPages < 0)
categoryPages = Mth.ceil(categories.size() / (float) tabsPerPage) - 1;
DefaultDisplayViewingScreen.this.init();
})
+ .tooltipLine(new TranslatableComponent("text.rei.previous_page"))
.enabled(categories.size() > tabsPerPage));
- this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + bounds.width - 10, bounds.y - 16, 10, 10), new TranslatableComponent("text.rei.right_arrow"))
+ this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + bounds.width - tabButtonsSize - (isCompactTabButtons ? 0 : 1), bounds.y - (isCompactTabButtons ? 16 : 20), tabButtonsSize, tabButtonsSize), new TranslatableComponent("text.rei.right_arrow"))
.onClick(button -> {
categoryPages++;
if (categoryPages > Mth.ceil(categories.size() / (float) tabsPerPage) - 1)
categoryPages = 0;
DefaultDisplayViewingScreen.this.init();
})
+ .tooltipLine(new TranslatableComponent("text.rei.next_page"))
.enabled(categories.size() > tabsPerPage));
this.widgets.add(categoryBack = Widgets.createButton(new Rectangle(bounds.getX() + 5, bounds.getY() + 5, 12, 12), new TranslatableComponent("text.rei.left_arrow"))
.onClick(button -> previousCategory()).tooltipLine(new TranslatableComponent("text.rei.previous_category")));
@@ -354,7 +358,7 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen {
}
PanelWidget.render(matrices, bounds, -1, delta);
fill(matrices, bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, darkStripesColor.value().getColor());
- fill(matrices, bounds.x + 17, bounds.y + 19, bounds.x + bounds.width - 17, bounds.y + 30, darkStripesColor.value().getColor());
+ fill(matrices, bounds.x + 17, bounds.y + 19, bounds.x + bounds.width - 17, bounds.y + 31, darkStripesColor.value().getColor());
for (TabWidget tab : tabs) {
if (!tab.isSelected()) {
tab.render(matrices, mouseX, mouseY, delta);
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java
index 28f6e2ca5..cde2ece23 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java
@@ -71,14 +71,17 @@ import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl;
import me.shedaniel.rei.impl.client.search.AsyncSearchManager;
import me.shedaniel.rei.impl.client.view.ViewsImpl;
import net.minecraft.ChatFormatting;
+import net.minecraft.Util;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.CreativeModeTab;
@@ -601,6 +604,7 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg
}
private class EntryListEntry extends EntryListEntryWidget {
+ private long lastCheckTime = -1;
private Display display;
private EntryStack<?> our;
private NumberAnimator<Double> size = null;
@@ -654,6 +658,29 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg
return null;
}
+ if (display != null) {
+ if (ViewsImpl.isRecipesFor(getEntries(), display)) {
+ AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null);
+ if (result.successful) {
+ return result.successfulHandler;
+ }
+ }
+
+ display = null;
+ lastCheckTime = -1;
+ }
+
+ if (lastCheckTime != -1 && Util.getMillis() - lastCheckTime < 2000) {
+ return null;
+ }
+
+ return _getTransferHandler();
+ }
+
+ @Nullable
+ private TransferHandler _getTransferHandler() {
+ lastCheckTime = Util.getMillis();