aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/src/main/java/me')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java18
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java35
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java80
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java82
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java26
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java22
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java22
8 files changed, 238 insertions, 54 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
index 0fef1e488..80d868c28 100644
--- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
+++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
@@ -47,6 +47,7 @@ import java.util.Collections;
public class RoughlyEnoughItemsNetwork {
public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item");
public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item");
+ public static final ResourceLocation CREATE_ITEMS_HOTBAR_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_hotbar");
public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab");
public static final ResourceLocation CREATE_ITEMS_MESSAGE_PACKET = new ResourceLocation("roughlyenoughitems", "ci_msg");
public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items");
@@ -97,6 +98,23 @@ public class RoughlyEnoughItemsNetwork {
menu.broadcastChanges();
NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767));
});
+ NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_HOTBAR_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> {
+ ServerPlayer player = (ServerPlayer) context.getPlayer();
+ if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) {
+ player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false);
+ return;
+ }
+ ItemStack stack = buf.readItem();
+ int hotbarSlotId = buf.readVarInt();
+ if (hotbarSlotId >= 0 && hotbarSlotId < 9) {
+ AbstractContainerMenu menu = player.containerMenu;
+ player.getInventory().items.set(hotbarSlotId, stack.copy());
+ menu.broadcastChanges();
+ NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767));
+ } else {
+ player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false);
+ }
+ });
NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> {
ServerPlayer player = (ServerPlayer) context.getPlayer();
CategoryIdentifier<Display> category = CategoryIdentifier.of(packetByteBuf.readResourceLocation());
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 6070fc06a..be826d6c9 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
@@ -122,6 +122,10 @@ public class ClientHelperImpl implements ClientHelper {
return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET);
}
+ public boolean canUseHotbarPackets() {
+ return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET);
+ }
+
public boolean canDeleteItems() {
return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems();
}
@@ -225,6 +229,37 @@ public class ClientHelperImpl implements ClientHelper {
}
}
+ @Override
+ public boolean tryCheatingEntryTo(EntryStack<?> e, int hotbarSlotId) {
+ if (e.getType() != VanillaEntryTypes.ITEM)
+ return false;
+ EntryStack<ItemStack> entry = (EntryStack<ItemStack>) e;
+ if (Minecraft.getInstance().player == null) return false;
+ if (Minecraft.getInstance().player.getInventory() == null) return false;
+ if (Minecraft.getInstance().gameMode != null && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) {
+ AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu;
+ EntryStack<ItemStack> stack = entry.copy();
+ if (menu.getCarried().isEmpty()) {
+ Minecraft.getInstance().player.getInventory().setItem(hotbarSlotId, stack.getValue().copy());
+ Minecraft.getInstance().player.inventoryMenu.broadcastChanges();
+ return true;
+ }
+ }
+ if (ClientHelperImpl.getInstance().canUseHotbarPackets()) {
+ AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu;
+ EntryStack<ItemStack> stack = entry.copy();
+ if (!menu.getCarried().isEmpty()) {
+ return false;
+ }
+ try {
+ NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId));
+ return true;
+ } catch (Exception exception) {
+ return false;
+ }
+ } else return false;
+ }
+
@ApiStatus.Internal
public Long2LongMap _getInventoryItemsTypes() {
EntryDefinition<ItemStack> definition;
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 e4b22622b..6f9e01570 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
@@ -302,58 +302,56 @@ public class ScreenOverlayImpl extends ScreenOverlay {
final Rectangle configButtonArea = getConfigButtonArea();
UUID configButtonUuid = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f");
widgets.add(configButton = InternalWidgets.wrapLateRenderable(
- Widgets.withTranslate(
- InternalWidgets.concatWidgets(
- Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE)
- .onClick(button -> {
- if (Screen.hasShiftDown() || Screen.hasControlDown()) {
- ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating());
- return;
- }
- ConfigManager.getInstance().openConfigScreen(REIRuntime.getInstance().getPreviousScreen());
- })
- .onRender((matrices, button) -> {
- if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && ClientHelperImpl.getInstance().hasOperatorPermission()) {
- button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063);
+
+ InternalWidgets.concatWidgets(
+ Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE)
+ .onClick(button -> {
+ if (Screen.hasShiftDown() || Screen.hasControlDown()) {
+ ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating());
+ return;
+ }
+ ConfigManager.getInstance().openConfigScreen(REIRuntime.getInstance().getPreviousScreen());
+ })
+ .onRender((matrices, button) -> {
+ if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && ClientHelperImpl.getInstance().hasOperatorPermission()) {
+ button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063);
+ } else {
+ button.removeTint();
+ }
+
+ boolean isOpened = isMenuOpened(configButtonUuid);
+ if (isOpened || !isAnyMenuOpened()) {
+ boolean inBounds = (isNotInExclusionZones(PointHelper.getMouseFloatingX(), PointHelper.getMouseFloatingY()) && button.containsMouse(PointHelper.ofMouse())) || isMenuInBounds(configButtonUuid);
+ if (isOpened != inBounds) {
+ if (inBounds) {
+ Menu menu = new Menu(button.getBounds(), provideConfigButtonMenu(), false);
+ openMenu(configButtonUuid, menu, button::containsMouse, point -> true);
} else {
- button.removeTint();
- }
-
- boolean isOpened = isMenuOpened(configButtonUuid);
- if (isOpened || !isAnyMenuOpened()) {
- boolean inBounds = (isNotInExclusionZones(PointHelper.getMouseFloatingX(), PointHelper.getMouseFloatingY()) && button.containsMouse(PointHelper.ofMouse())) || isMenuInBounds(configButtonUuid);
- if (isOpened != inBounds) {
- if (inBounds) {
- Menu menu = new Menu(button.getBounds(), provideConfigButtonMenu(), false);
- openMenu(configButtonUuid, menu, button::containsMouse, point -> true);
- } else {
- closeOverlayMenu();
- }
- }
+ closeOverlayMenu();
}
- })
- .focusable(false)
- .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)),
- Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> {
- helper.setBlitOffset(helper.getBlitOffset() + 1);
- RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE);
- helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14);
- helper.setBlitOffset(helper.getBlitOffset() - 1);
+ }
+ }
})
- ),
- 0, 0, 600
+ .focusable(false)
+ .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)),
+ Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> {
+ helper.setBlitOffset(helper.getBlitOffset() + 1);
+ RenderSystem.setShaderTexture(0, CHEST_GUI_TEXTURE);
+ helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14);
+ helper.setBlitOffset(helper.getBlitOffset() - 1);
+ })
)
));
Rectangle subsetsButtonBounds = getSubsetsButtonBounds();
if (ConfigObject.getInstance().isSubsetsEnabled()) {
- widgets.add(InternalWidgets.wrapLateRenderable(Widgets.withTranslate(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets"))
+ widgets.add(InternalWidgets.wrapLateRenderable(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets"))
.onClick(button -> {
proceedOpenMenuOrElse(Menu.SUBSETS, () -> {
openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(subsetsButtonBounds), point -> true, point -> true);
}, menu -> {
closeOverlayMenu();
});
- }), 0, 0, 600)));
+ })));
}
if (!ConfigObject.getInstance().isEntryListWidgetScrolled()) {
widgets.add(Widgets.createClickableLabel(new Point(bounds.x + ((bounds.width - 18) / 2), bounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), NarratorChatListener.NO_TITLE, label -> {
@@ -375,7 +373,7 @@ public class ScreenOverlayImpl extends ScreenOverlay {
Rectangle area = getCraftableToggleArea();
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE);
- this.widgets.add(Widgets.withTranslate(InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets(
+ this.widgets.add(InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets(
Widgets.createButton(area, NarratorChatListener.NO_TITLE)
.focusable(false)
.onClick(button -> {
@@ -392,7 +390,7 @@ public class ScreenOverlayImpl extends ScreenOverlay {
itemRenderer.renderGuiItem(icon, (int) vector.x(), (int) vector.y());
itemRenderer.blitOffset = 0.0F;
}))
- ), 0, 0, 600));
+ ));
}
widgets.add(draggingStack);
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java
new file mode 100644
index 000000000..7afa419ed
--- /dev/null
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java
@@ -0,0 +1,82 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.impl.client.gui.widget;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.client.gui.widgets.Widget;
+import me.shedaniel.rei.api.client.gui.widgets.Widgets;
+import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
+import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
+import me.shedaniel.rei.api.common.category.CategoryIdentifier;
+import me.shedaniel.rei.api.common.display.Display;
+import me.shedaniel.rei.impl.display.DisplaySpec;
+import net.minecraft.client.gui.Font;
+import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
+import net.minecraft.client.renderer.entity.ItemRenderer;
+import net.minecraft.world.inventory.tooltip.TooltipComponent;
+
+import java.util.List;
+
+public class DisplayTooltipComponent implements TooltipComponent, ClientTooltipComponent {
+ private final Widget widget;
+ private final DisplaySpec display;
+ private final Rectangle bounds;
+
+ public DisplayTooltipComponent(DisplaySpec display) {
+ Display internalDisplay = display.provideInternalDisplay();
+ CategoryRegistry.CategoryConfiguration<Display> configuration = CategoryRegistry.getInstance().get((CategoryIdentifier<Display>) internalDisplay.getCategoryIdentifier());
+ DisplayCategory<Display> category = configuration.getCategory();
+ this.bounds = new Rectangle(0, 0, category.getDisplayWidth(internalDisplay), category.getDisplayHeight());
+ List<Widget> widgets = configuration.getView(internalDisplay).setupDisplay(internalDisplay, bounds);
+
+ this.display = display;
+ this.widget = Widgets.concat(widgets);
+ }
+
+ public DisplayTooltipComponent(DisplaySpec display, List<Widget> widgets, Rectangle bounds) {
+ this.widget = Widgets.concat(widgets);
+ this.display = display;
+ this.bounds = bounds;
+ }
+
+ @Override
+ public int getHeight() {
+ return bounds.height + 4;
+ }
+
+ @Override
+ public int getWidth(Font font) {
+ return bounds.width + 4;
+ }
+
+ @Override
+ public void renderImage(Font font, int x, int y, PoseStack matrices, ItemRenderer itemRenderer, int z) {
+ matrices.pushPose();
+ matrices.translate(x + 2, y + 2, z);
+ matrices.translate(-this.bounds.getX(), -this.bounds.getY(), 0);
+ widget.render(matrices, -1000, -1000, 0);
+ matrices.popPose();
+ }
+}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java
index bd15c0da5..cf7f2f5b7 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java
@@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.gui.screen.DisplayScreen;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.EntryStacks;
+import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.item.ItemStack;
@@ -100,4 +101,29 @@ public abstract class DisplayedEntryWidget extends EntryWidget {
}
return super.cancelDeleteItems(stack);
}
+
+ @Override
+ public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) {
+ if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) {
+ EntryStack<?> entry = getCurrentEntry().copy();
+ if (!entry.isEmpty()) {
+ if (entry.getType() != VanillaEntryTypes.ITEM) {
+ EntryStack<ItemStack> cheatsAs = entry.cheatsAs();
+ entry = cheatsAs.isEmpty() ? entry : cheatsAs;
+ }
+ if (entry.getValueType() == ItemStack.class) {
+ entry.<ItemStack>castValue().setCount(entry.<ItemStack>castValue().getMaxStackSize());
+
+ KeyMapping[] keyHotbarSlots = Minecraft.getInstance().options.keyHotbarSlots;
+ for (int i = 0; i < keyHotbarSlots.length; i++) {
+ if (keyHotbarSlots[i].matches(keyCode, scanCode)) {
+ return ClientHelper.getInstance().tryCheatingEntryTo(entry, i);
+ }
+ }
+ }
+ }
+ }
+
+ return super.keyPressedIgnoreContains(keyCode, scanCode, modifiers);
+ }
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
index e4d8acd40..68c914dd4 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java
@@ -23,6 +23,7 @@
package me.shedaniel.rei.impl.client.gui.widget;
+import com.google.common.base.Suppliers;
import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
@@ -62,6 +63,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
+import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.TextComponent;
@@ -73,6 +75,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -100,6 +103,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
private long lastCheckTime = -1;
private Display display;
+ private Supplier<DisplayTooltipComponent> displayTooltipComponent;
public EntryWidget(Point point) {
this(new Rectangle(point.x - 1, point.y - 1, 18, 18));
@@ -310,6 +314,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null);
if (result.successful) {
this.display = display;
+ this.displayTooltipComponent = Suppliers.memoize(() -> new DisplayTooltipComponent(display));
return result.successfulHandler;
}
}
@@ -333,6 +338,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
}
display = null;
+ displayTooltipComponent = null;
lastCheckTime = -1;
}
@@ -411,6 +417,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
if (tooltip != null && getTransferHandler() != null
&& !(Minecraft.getInstance().screen instanceof DisplayScreen)) {
tooltip.add(new TranslatableComponent("text.auto_craft.move_items.tooltip").withStyle(ChatFormatting.YELLOW));
+ tooltip.add((ClientTooltipComponent) displayTooltipComponent.get());
}
if (tooltip != null) {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java
index ff338307b..e52ca1cb8 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java
@@ -486,8 +486,26 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg
if (containsChecked(mouseX, mouseY, false)) {
LocalPlayer player = minecraft.player;
if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && ClientHelperImpl.getInstance().canDeleteItems()) {
- ClientHelper.getInstance().sendDeletePacket();
- return true;
+ EntryStack<?> stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy());
+ if (stack.getType() != VanillaEntryTypes.ITEM) {
+ EntryStack<ItemStack> cheatsAs = stack.cheatsAs();
+ stack = cheatsAs.isEmpty() ? stack : cheatsAs;
+ }
+ boolean canDelete = true;
+
+ for (Widget child : children()) {
+ if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget widget) {
+ if (widget.cancelDeleteItems(stack)) {
+ canDelete = false;
+ break;
+ }
+ }
+ }
+
+ if (canDelete) {
+ ClientHelper.getInstance().sendDeletePacket();
+ return true;
+ }
}
for (Widget widget : children())
if (widget.mouseReleased(mouseX, mouseY, button))
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java
index b7540c87a..38072c498 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java
@@ -164,18 +164,18 @@ public class DisplayEntry extends WidgetWithBounds {
if (plusButton.containsMouse(Math.round(mouse.x()), Math.round(mouse.y()))) {
result.tooltipRenderer.accept(new Point(mouseX, mouseY), Tooltip::queue);
-
- if (result.renderer != null) {
- poses.pushPose();
- if (!stable || !target.equals(bounds)) {
- poses.translate(0, 0, 600);
- }
- poses.translate(xOffset(), yOffset(), 0);
- poses.scale(xScale(), yScale(), 1.0F);
-
- result.renderer.render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display);
- poses.popPose();
+ }
+
+ if (result.renderer != null) {
+ poses.pushPose();
+ if (!stable || !target.equals(bounds)) {
+ poses.translate(0, 0, 600);
}
+ poses.translate(xOffset(), yOffset(), 0);
+ poses.scale(xScale(), yScale(), 1.0F);
+
+ result.renderer.render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display);
+ poses.popPose();
}
} else {
poses.popPose();